PDA

View Full Version : Orders Downloader Trouble - Please Help!



frijj2k
08-04-2004, 03:11 AM
Hi

I have installed the Orders Downloader module and made a slight alteration to the code so that the orders are placed in one CSV file after each order is made.

The headings are inserted correctly if the file does not exist and not if the file does exist.
The problem is that the actual order records never appear.

I have looked through the code I cannot work out why... I do know that the loop where it gets the orders never gets entered because the code..

while ($row)
{
...
}

always evaluates to false so the problem seems to lie somewhere in the lines...

$result = tep_db_query($filelayout_sql);
$row = tep_db_fetch_array($result);

But this is where my understanding is a bit vague. Could somebody please help me in identifying the problem.

I have attached a copy of the checkout_process.php file complete with my mods...

Thank you in advance.

Dave :lol:


=============== CHECKOUT_PROCESS.PHP ===============


<?php
/*
$Id: checkout_process.php,v 1.128 2003/05/28 18:00:29 hpdl Exp $

osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com

Copyright © 2003 osCommerce

Released under the GNU General Public License
*/

include('includes/application_top.php');

// if the customer is not logged on, redirect them to the login page
if (!tep_session_is_registered('customer_id')) {
$navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
}

if (!tep_session_is_registered('sendto')) {
tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYME NT, '', 'SSL'));
}

if ( (tep_not_null(MODULE_PAYMENT_INSTALLED)) && (!tep_session_is_registered('payment')) ) {
tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYME NT, '', 'SSL'));
}

// avoid hack attempts during the checkout procedure by checking the internal cartID
if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
if ($cart->cartID != $cartID) {
tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPP ING, '', 'SSL'));
}
}

include(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_PROCESS);

// load selected payment module
require(DIR_WS_CLASSES . 'payment.php');
$payment_modules = new payment($payment);

// load the selected shipping module
require(DIR_WS_CLASSES . 'shipping.php');
$shipping_modules = new shipping($shipping);

require(DIR_WS_CLASSES . 'order.php');
$order = new order;

// load the before_process function from the payment modules
$payment_modules->before_process();

require(DIR_WS_CLASSES . 'order_total.php');
$order_total_modules = new order_total;

$order_totals = $order_total_modules->process();

$sql_data_array = array('customers_id' => $customer_id,
'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
'customers_company' => $order->customer['company'],
'customers_street_address' => $order->customer['street_address'],
'customers_suburb' => $order->customer['suburb'],
'customers_city' => $order->customer['city'],
'customers_postcode' => $order->customer['postcode'],
'customers_state' => $order->customer['state'],
'customers_country' => $order->customer['country']['title'],
'customers_telephone' => $order->customer['telephone'],
'customers_email_address' => $order->customer['email_address'],
'customers_address_format_id' => $order->customer['format_id'],
'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
'delivery_company' => $order->delivery['company'],
'delivery_street_address' => $order->delivery['street_address'],
'delivery_suburb' => $order->delivery['suburb'],
'delivery_city' => $order->delivery['city'],
'delivery_postcode' => $order->delivery['postcode'],
'delivery_state' => $order->delivery['state'],
'delivery_country' => $order->delivery['country']['title'],
'delivery_address_format_id' => $order->delivery['format_id'],
'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
'billing_company' => $order->billing['company'],
'billing_street_address' => $order->billing['street_address'],
'billing_suburb' => $order->billing['suburb'],
'billing_city' => $order->billing['city'],
'billing_postcode' => $order->billing['postcode'],
'billing_state' => $order->billing['state'],
'billing_country' => $order->billing['country']['title'],
'billing_address_format_id' => $order->billing['format_id'],
'payment_method' => $order->info['payment_method'],
'cc_type' => $order->info['cc_type'],
'cc_owner' => $order->info['cc_owner'],
'cc_number' => $order->info['cc_number'],
'cc_expires' => $order->info['cc_expires'],
'date_purchased' => 'now()',
'orders_status' => $order->info['order_status'],
'currency' => $order->info['currency'],
'currency_value' => $order->info['currency_value']);
tep_db_perform(TABLE_ORDERS, $sql_data_array);
$insert_id = tep_db_insert_id();
for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
$sql_data_array = array('orders_id' => $insert_id,
'title' => $order_totals[$i]['title'],
'text' => $order_totals[$i]['text'],
'value' => $order_totals[$i]['value'],
'class' => $order_totals[$i]['code'],
'sort_order' => $order_totals[$i]['sort_order']);
tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
}

$customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';
$sql_data_array = array('orders_id' => $insert_id,
'orders_status_id' => $order->info['order_status'],
'date_added' => 'now()',
'customer_notified' => $customer_notification,
'comments' => $order->info['comments']);
tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

// initialized for the email confirmation
$products_ordered = '';
$subtotal = 0;
$total_tax = 0;

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
// Stock Update - Joao Correia
if (STOCK_LIMITED == 'true') {
if (DOWNLOAD_ENABLED == 'true') {
$stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
FROM " . TABLE_PRODUCTS . " p
LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
ON p.products_id=pa.products_id
LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
ON pa.products_attributes_id=pad.products_attributes_ id
WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
// Will work with only one option for downloadable products
// otherwise, we have to build the query dynamically with a loop
$products_attributes = $order->products[$i]['attributes'];
if (is_array($products_attributes)) {
$stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
}
$stock_query = tep_db_query($stock_query_raw);
} else {
$stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
}
if (tep_db_num_rows($stock_query) > 0) {
$stock_values = tep_db_fetch_array($stock_query);
// do not decrement quantities if products_attributes_filename exists
if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
$stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
} else {
$stock_left = $stock_values['products_quantity'];
}
tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
}
}
}

// Update products_ordered (for bestsellers list)
tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

$sql_data_array = array('orders_id' => $insert_id,
'products_id' => tep_get_prid($order->products[$i]['id']),
'products_model' => $order->products[$i]['model'],
'products_name' => $order->products[$i]['name'],
'products_price' => $order->products[$i]['price'],
'final_price' => $order->products[$i]['final_price'],
'products_tax' => $order->products[$i]['tax'],
'products_quantity' => $order->products[$i]['qty']);
tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
$order_products_id = tep_db_insert_id();

//------insert customer choosen option to order--------
$attributes_exist = '0';
$products_ordered_attributes = '';
if (isset($order->products[$i]['attributes'])) {
$attributes_exist = '1';
for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
if (DOWNLOAD_ENABLED == 'true') {
$attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
on pa.products_attributes_id=pad.products_attributes_ id
where pa.products_id = '" . $order->products[$i]['id'] . "'
and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
and pa.options_id = popt.products_options_id
and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
and pa.options_values_id = poval.products_options_values_id
and popt.language_id = '" . $languages_id . "'
and poval.language_id = '" . $languages_id . "'";
$attributes = tep_db_query($attributes_query);
} else {
$attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
}
$attributes_values = tep_db_fetch_array($attributes);

$sql_data_array = array('orders_id' => $insert_id,
'orders_products_id' => $order_products_id,
'products_options' => $attributes_values['products_options_name'],
'products_options_values' => $attributes_values['products_options_values_name'],
'options_values_price' => $attributes_values['options_values_price'],
'price_prefix' => $attributes_values['price_prefix']);
tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);

if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
$sql_data_array = array('orders_id' => $insert_id,
'orders_products_id' => $order_products_id,
'orders_products_filename' => $attributes_values['products_attributes_filename'],
'download_maxdays' => $attributes_values['products_attributes_maxdays'],
'download_count' => $attributes_values['products_attributes_maxcount']);
tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
}
$products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
}
}
//------insert customer choosen option eof ----
$total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
$total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
$total_cost += $total_products_price;

$products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";
}

// lets start with the email confirmation
$email_order = STORE_NAME . "\n" .
EMAIL_SEPARATOR . "\n" .
EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . "\n" .
EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $insert_id, 'SSL', false) . "\n" .
EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
if ($order->info['comments']) {
$email_order .= tep_db_output($order->info['comments']) . "\n\n";
}
$email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
EMAIL_SEPARATOR . "\n" .
$products_ordered .
EMAIL_SEPARATOR . "\n";

for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
$email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
}

if ($order->content_type != 'virtual') {
$email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
EMAIL_SEPARATOR . "\n" .
tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
}

$email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
EMAIL_SEPARATOR . "\n" .
tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
if (is_object($$payment)) {
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
EMAIL_SEPARATOR . "\n";
$payment_class = $$payment;
$email_order .= $payment_class->title . "\n\n";
if ($payment_class->email_footer) {
$email_order .= $payment_class->email_footer . "\n\n";
}
}
tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

/* Inserted for Order CSV Creation */

// C O N F I G U R A T I O N
// V A R I A B L E S

// **** Order directory - you need to create this in your Catalog/ directory ****

$orderdir = "orders/";

// **** Field Separator ****
// change this if you can't use the default of tabs
// Tab is the default, comma and semicolon are commonly supported by various progs
// Remember, if your descriptions contain this character, you will confuse EP!
global $separator;
//$separator = "\t"; // tab is default
//$separator = ";"; // semi-colon
//$separator = "~"; // tilde
//$separator = "-"; // dash
//$separator = "*"; // splat

$separator = ","; // comma for CSV file

//require('includes/application_top.php');
require('includes/database_tables.php');

// global $filelayout, $filelayout_count, $filelayout_sql, $fileheaders, $max_categories;


//elari check default language_id from configuration table DEFAULT_LANGUAGE

// get the right filelayout for this download
ep_create_filelayout($dltype, $orders_status, $cust_id);

$download='tempfile';
$cust_id=$insert_id;
$orders_status = 'full';

//*******************************
//*******************************
// E N D
// INITIALIZATION
//*******************************
//*******************************

if ( $download == 'stream' or $download == 'tempfile' ){
//*******************************
//*******************************
// DOWNLOAD FILE
//*******************************
//*******************************
$filestring = ""; // this holds the csv file we want to download

$result = tep_db_query($filelayout_sql);
$row = tep_db_fetch_array($result);

// Here we need to allow for the mapping of internal field names to external field names
// default to all headers named like the internal ones
// the field mapping array only needs to cover those fields that need to have their name changed
if ( count($fileheaders) != 0 ){
$filelayout_header = $fileheaders; // if they gave us fileheaders for the dl, then use them
} else {
$filelayout_header = $filelayout; // if no mapping was spec'd use the internal field names for header names
}
//We prepare the table heading with layout values
foreach( $filelayout_header as $key => $value ){
$fileheaderstring .= $key . $separator;
}
// now lop off the trailing tab
$fileheaderstring = substr($fileheaderstring, 0, strlen($fileheaderstring)-1);

// set the type

$endofrow = $separator . 'EOREOR' . "\n";
$fileheaderstring .= $endofrow;

$num_of_langs = count($langcode);
while ($row){

// If you have other modules that need to be available, put them here

// remove any bad things in the texts that could confuse EasyCustomer
$therow = '';
foreach( $filelayout as $key => $value ){
//echo "The field was $key<br>";

$thetext = $row[$key];
// kill the carriage returns and tabs in the descriptions, they're killing me!
$thetext = str_replace("\r",' ',$thetext);
$thetext = str_replace("\n",' ',$thetext);
$thetext = str_replace("\t",' ',$thetext);
// and put the text into the output separated by tabs
$therow .= $thetext . $separator;
}

// lop off the trailing tab, then append the end of row indicator
$therow = substr($therow,0,strlen($therow)-1) . $endofrow;

$filestring .= $therow;
// grab the next row from the db
$row = tep_db_fetch_array($result);
}
//////////////////////////////////////////////////////// $EXPORT_NAME = "ORDER" . $insert_id;
$EXPORT_NAME = "ORDERS";
// now either stream it to them or put it in the temp directory
$tmpfname = $orderdir . "$EXPORT_NAME.csv";
//unlink($tmpfname);

if (!file_exists($tmpfname)){
// File not exist so insert header values
$filestring = $fileheaderstring . $filestring;
} else {
// File exist so no need to add headers
}

$fp = fopen( $tmpfname, "a+");
fwrite($fp, $filestring);
fclose($fp);
//echo $insert_id . $orderdir . $EXPORT_NAME . ".csv";
// send emails to other people
if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
}

// load the after_process function from the payment modules

$payment_modules->after_process();
$cart->reset(true);

// unregister session variables used during checkout
tep_session_unregister('sendto');
tep_session_unregister('billto');
tep_session_unregister('shipping');
tep_session_unregister('payment');
tep_session_unregister('comments');

tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCE SS, '', 'SSL'));}
// *** END *** download section
// Everything under here is needed.
// ?>


<?php
function ep_create_filelayout($dltype, $orders_status, $cust_id){
# echo $dltype;
# echo $orders_status;

global $insert_id, $filelayout, $filelayout_count, $filelayout_sql, $fileheaders, $max_categories;

// depending on the type of the download the user wanted, create a file layout for it.
$fieldmap = array(); // default to no mapping to change internal field names to external.
// The file layout is dynamically made depending on the number of languages
$iii = 0;
$filelayout = array(
'orders_id' => $iii++,
'date_purchased' => $iii++,
'customers_name' => $iii++,
'customers_telephone' => $iii++,
'customers_email_address' => $iii++,
'billing_name' => $iii++,
'billing_street_address' => $iii++,
'billing_city' => $iii++,
'billing_postcode' => $iii++,
'billing_state' => $iii++,
'billing_country' => $iii++,
'delivery_name' => $iii++,
'delivery_street_address' => $iii++,
'delivery_city' => $iii++,
'delivery_postcode' => $iii++,
'delivery_state' => $iii++,
'delivery_country' => $iii++,
'items_ordered' => $iii++,
'products_options_values' => $iii++,
'quantity_ordered' => $iii++,
'shipping_method' => $iii++,
'order_total' => $iii++,
'cc_type' => $iii++,
'cc_owner' => $iii++,
'cc_number' => $iii++,
'cc_expires' => $iii++
);

$filelayout_sql = "SELECT
o.orders_id as orders_id,
o.date_purchased as date_purchased,
o.customers_name as customers_name,
o.customers_telephone as customers_telephone,
o.customers_email_address as customers_email_address,
o.billing_name as billing_name,
o.billing_street_address as billing_street_address,
o.billing_city as billing_city,
o.billing_postcode as billing_postcode,
o.billing_state as billing_state,
o.billing_country as billing_country,
o.delivery_name as delivery_name,
o.delivery_street_address as delivery_street_address,
o.delivery_city as delivery_city,
o.delivery_postcode as delivery_postcode,
o.delivery_state as delivery_state,
o.delivery_country as delivery_country,
op.products_model as items_ordered,
opa.products_options_values as products_options_values,
op.products_quantity as quantity_ordered,
ot.title as shipping_method,
ott.value as order_total,
o.cc_type as cc_type,
o.cc_owner as cc_owner,
o.cc_number as cc_number,
o.cc_expires as cc_expires
FROM
".TABLE_ORDERS." as o,
".TABLE_ORDERS_PRODUCTS." as op,
".TABLE_ORDERS_PRODUCTS_ATTRIBUTES." as opa,
".TABLE_ORDERS_TOTAL." as ot,
".TABLE_ORDERS_TOTAL." as ott
WHERE
o.orders_id=op.orders_id
AND
opa.orders_products_id=op.orders_products_id
AND
o.orders_id=ot.orders_id
AND
ott.orders_id = ot.orders_id
AND
ot.class = 'ot_shipping'
AND
ott.class = 'ot_total'
AND
o.orders_id = $insert_id";

$filelayout_count = count($filelayout);

}

/* End of Order CSV Creation */

require(DIR_WS_INCLUDES . 'application_bottom.php');
?>

frijj2k
08-11-2004, 02:05 AM
Please... anybody?!?!?!?!?!? :-|