Ankündigung

Einklappen
Keine Ankündigung bisher.

Lagerbestand aktualisieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Lagerbestand aktualisieren

    Servus,

    habe lange Zeit nichts mehr am Shop gemacht....Heute ist mir aufgefallen, dass sich der Lagerbestand für Artikel mit Attributen nicht aktualisiert. Konkret: Habe in meinem Shop Blusen in unterschiedlichen Größen. Wenn jemand z.B. eine Größe 38 kauft, ändert sich der Lagerbestand für diese Größe nicht. Bestellung von Lagerbestand abziehen steht auf "true". Die Gesamtmenge ändert sich, aber sobald ich auf "Mengen abgleichen" gehe, steht wieder der alte Bestand drin....
    Wo ist mein Fehler versteckt?

    Grüße und Danke

    Zengy
    Zuletzt geändert von zengy; 19.11.2010, 22:00.

    #2
    Welche Stock by Attributes Version verwendest Du genau?

    Kommentar


      #3
      Die 4.7ajax

      Grüße
      Zengy

      Kommentar


        #4
        Poste bitte den kompletten Inhalt Deiner includes/classes/order.php als Code.

        Kommentar


          #5
          PHP-Code:
          <?php
          /**
           * File contains the order-processing class ("order")
           *
           * @package classes
           * @copyright Copyright 2003-2007 Zen Cart Development Team
           * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
           * @version $Id: order.php 443 2008-12-16 13:55:51Z hugo13 $
           */
          /**
           * order class
           *
           * Handles all order-processing functions
           *
           * @package classes
           */
          if (!defined('IS_ADMIN_FLAG')) {
            die(
          'Illegal Access');
          }
          class 
          order extends base {
            var 
          $info$totals$products$customer$delivery$content_type$email_low_stock$products_ordered_attributes,
            
          $products_ordered$products_ordered_email$attachArray;

            function 
          order($order_id '') {
              
          $this->info = array();
              
          $this->totals = array();
              
          $this->products = array();
              
          $this->customer = array();
              
          $this->delivery = array();

              if (
          zen_not_null($order_id)) {
                
          $this->query($order_id);
              } else {
                
          $this->cart();
              }
            }

            function 
          query($order_id) {
              global 
          $db;

              
          $order_id zen_db_prepare_input($order_id);

              
          $order_query "select customers_id, customers_name, customers_company,
                                   customers_street_address, customers_suburb, customers_city,
                                   customers_postcode, customers_state, customers_country,
                                   customers_telephone, customers_email_address, customers_address_format_id,
                                   delivery_name, delivery_company, delivery_street_address, delivery_suburb,
                                   delivery_city, delivery_postcode, delivery_state, delivery_country,
                                   delivery_address_format_id, billing_name, billing_company,
                                   billing_street_address, billing_suburb, billing_city, billing_postcode,
                                   billing_state, billing_country, billing_address_format_id,
                                   payment_method, payment_module_code, shipping_method, shipping_module_code,
                                   coupon_code, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value,
                                   date_purchased, orders_status, last_modified, order_total, order_tax, ip_address
                                  from " 
          TABLE_ORDERS "
                                  where orders_id = '" 
          . (int)$order_id "'";

              
          $order $db->Execute($order_query);

              
          $totals_query "select title, text, class
                                   from " 
          TABLE_ORDERS_TOTAL "
                                   where orders_id = '" 
          . (int)$order_id "'
                                   order by sort_order"
          ;

              
          $totals $db->Execute($totals_query);

              while (!
          $totals->EOF) {


                if (
          $totals->fields['class'] == 'ot_coupon') {
                  
          $coupon_link_query "SELECT coupon_id
                          from " 
          TABLE_COUPONS "
                          where coupon_code ='" 
          $order->fields['coupon_code'] . "'";
                  
          $coupon_link $db->Execute($coupon_link_query);
                  
          $zc_coupon_link '<a href="javascript:couponpopupWindow(\'' zen_href_link(FILENAME_POPUP_COUPON_HELP'cID=' $coupon_link->fields['coupon_id']) . '\')">';
                }
                
          $this->totals[] = array('title' => ($totals->fields['class'] == 'ot_coupon' $zc_coupon_link $totals->fields['title'] . '</a>' $totals->fields['title']),
                                        
          'text' => $totals->fields['text'],
                                        
          'class' => $totals->fields['class']);
                
          $totals->MoveNext();
              }

              
          $order_total_query "select text, value
                                       from " 
          TABLE_ORDERS_TOTAL "
                                       where orders_id = '" 
          . (int)$order_id "'
                                       and class = 'ot_total'"
          ;


              
          $order_total $db->Execute($order_total_query);


              
          $shipping_method_query "select title, value
                                          from " 
          TABLE_ORDERS_TOTAL "
                                          where orders_id = '" 
          . (int)$order_id "'
                                          and class = 'ot_shipping'"
          ;


              
          $shipping_method $db->Execute($shipping_method_query);

              
          $order_status_query "select orders_status_name
                                       from " 
          TABLE_ORDERS_STATUS "
                                       where orders_status_id = '" 
          $order->fields['orders_status'] . "'
                                       and language_id = '" 
          . (int)$_SESSION['languages_id'] . "'";

              
          $order_status $db->Execute($order_status_query);

              
          $this->info = array('currency' => $order->fields['currency'],
                                  
          'currency_value' => $order->fields['currency_value'],
                                  
          'payment_method' => $order->fields['payment_method'],
                                  
          'payment_module_code' => $order->fields['payment_module_code'],
                                  
          'shipping_method' => $order->fields['shipping_method'],
                                  
          'shipping_module_code' => $order->fields['shipping_module_code'],
                                  
          'coupon_code' => $order->fields['coupon_code'],
                                  
          'cc_type' => $order->fields['cc_type'],
                                  
          'cc_owner' => $order->fields['cc_owner'],
                                  
          'cc_number' => $order->fields['cc_number'],
                                  
          'cc_expires' => $order->fields['cc_expires'],
                                  
          'date_purchased' => $order->fields['date_purchased'],
                                  
          'orders_status' => $order_status->fields['orders_status_name'],
                                  
          'last_modified' => $order->fields['last_modified'],
                                  
          'total' => $order->fields['order_total'],
                                  
          'tax' => $order->fields['order_tax'],
                                  
          'ip_address' => $order->fields['ip_address']
                                  );

              
          $this->customer = array('id' => $order->fields['customers_id'],
                                      
          'name' => $order->fields['customers_name'],
                                      
          'company' => $order->fields['customers_company'],
                                      
          'street_address' => $order->fields['customers_street_address'],
                                      
          'suburb' => $order->fields['customers_suburb'],
                                      
          'city' => $order->fields['customers_city'],
                                      
          'postcode' => $order->fields['customers_postcode'],
                                      
          'state' => $order->fields['customers_state'],
                                      
          'country' => $order->fields['customers_country'],
                                      
          'format_id' => $order->fields['customers_address_format_id'],
                                      
          'telephone' => $order->fields['customers_telephone'],
                                      
          'email_address' => $order->fields['customers_email_address']);

              
          $this->delivery = array('name' => $order->fields['delivery_name'],
                                      
          'company' => $order->fields['delivery_company'],
                                      
          'street_address' => $order->fields['delivery_street_address'],
                                      
          'suburb' => $order->fields['delivery_suburb'],
                                      
          'city' => $order->fields['delivery_city'],
                                      
          'postcode' => $order->fields['delivery_postcode'],
                                      
          'state' => $order->fields['delivery_state'],
                                      
          'country' => $order->fields['delivery_country'],
                                      
          'format_id' => $order->fields['delivery_address_format_id']);

              if (empty(
          $this->delivery['name']) && empty($this->delivery['street_address'])) {
                
          $this->delivery false;
              }

              
          $this->billing = array('name' => $order->fields['billing_name'],
                                     
          'company' => $order->fields['billing_company'],
                                     
          'street_address' => $order->fields['billing_street_address'],
                                     
          'suburb' => $order->fields['billing_suburb'],
                                     
          'city' => $order->fields['billing_city'],
                                     
          'postcode' => $order->fields['billing_postcode'],
                                     
          'state' => $order->fields['billing_state'],
                                     
          'country' => $order->fields['billing_country'],
                                     
          'format_id' => $order->fields['billing_address_format_id']);

              
          $index 0;
              
          $orders_products_query "select orders_products_id, products_id, products_name,
                                           products_model, products_price, products_tax,
                                           products_quantity, final_price,
                                           onetime_charges,
                                           products_priced_by_attribute, product_is_free, products_discount_type,
                                           products_discount_type_from
                                            from " 
          TABLE_ORDERS_PRODUCTS "
                                            where orders_id = '" 
          . (int)$order_id "'
                                            order by orders_products_id"
          ;

              
          $orders_products $db->Execute($orders_products_query);

              while (!
          $orders_products->EOF) {
                
          // convert quantity to proper decimals - account history
                
          if (QUANTITY_DECIMALS != 0) {
                  
          $fix_qty $orders_products->fields['products_quantity'];
                  switch (
          true) {
                    case (!
          strstr($fix_qty'.')):
                    
          $new_qty $fix_qty;
                    break;
                    default:
                    
          $new_qty preg_replace('/[0]+$/'''$orders_products->fields['products_quantity']);
                    break;
                  }
                } else {
                  
          $new_qty $orders_products->fields['products_quantity'];
                }

                
          $new_qty round($new_qtyQUANTITY_DECIMALS);

                if (
          $new_qty == (int)$new_qty) {
                  
          $new_qty = (int)$new_qty;
                }

                
          $this->products[$index] = array('qty' => $new_qty,
                                                
          'id' => $orders_products->fields['products_id'],
                                                
          'name' => $orders_products->fields['products_name'],
                                                
          'model' => $orders_products->fields['products_model'],
                                                
          'tax' => $orders_products->fields['products_tax'],
                                                
          'price' => $orders_products->fields['products_price'],
                                                
          'final_price' => $orders_products->fields['final_price'],
                                                
          'onetime_charges' => $orders_products->fields['onetime_charges'],
                                                
          'products_priced_by_attribute' => $orders_products->fields['products_priced_by_attribute'],
                                                
          'product_is_free' => $orders_products->fields['product_is_free'],
                                                
          'products_discount_type' => $orders_products->fields['products_discount_type'],
                                                
          'products_discount_type_from' => $orders_products->fields['products_discount_type_from']);

                
          $subindex 0;
                
          $attributes_query "select products_options_id, products_options_values_id, products_options, products_options_values,
                                        options_values_price, price_prefix from " 
          TABLE_ORDERS_PRODUCTS_ATTRIBUTES "
                                         where orders_id = '" 
          . (int)$order_id "'
                                         and orders_products_id = '" 
          . (int)$orders_products->fields['orders_products_id'] . "'";

                
          $attributes $db->Execute($attributes_query);
                if (
          $attributes->RecordCount()) {
                  while (!
          $attributes->EOF) {
                    
          $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options'],
                                                                             
          'value' => $attributes->fields['products_options_values'],
                                                                             
          'prefix' => $attributes->fields['price_prefix'],
                                                                             
          'price' => $attributes->fields['options_values_price']);

                    
          $subindex++;
                    
          $attributes->MoveNext();
                  }
                }

                
          $this->info['tax_groups']["{$this->products[$index]['tax']}"] = '1';

                
          $index++;
                
          $orders_products->MoveNext();
              }
            }

            function 
          cart() {
              global 
          $db$currencies;

              
          $this->content_type $_SESSION['cart']->get_content_type();

              
          $customer_address_query "select c.customers_firstname, c.customers_lastname, c.customers_telephone,
                                              c.customers_email_address, ab.entry_company, ab.entry_street_address,
                                              ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id,
                                              z.zone_name, co.countries_id, co.countries_name,
                                              co.countries_iso_code_2, co.countries_iso_code_3,
                                              co.address_format_id, ab.entry_state
                                             from (" 
          TABLE_CUSTOMERS " c, " TABLE_ADDRESS_BOOK " ab )
                                             left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                             left join " 
          TABLE_COUNTRIES " co on (ab.entry_country_id = co.countries_id)
                                             where c.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                             and ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                             and c.customers_default_address_id = ab.address_book_id"
          ;

              
          $customer_address $db->Execute($customer_address_query);

              
          $shipping_address_query "select ab.entry_firstname, ab.entry_lastname, ab.entry_company,
                                              ab.entry_street_address, ab.entry_suburb, ab.entry_postcode,
                                              ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id,
                                              c.countries_id, c.countries_name, c.countries_iso_code_2,
                                              c.countries_iso_code_3, c.address_format_id, ab.entry_state
                                             from " 
          TABLE_ADDRESS_BOOK " ab
                                             left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                             left join " 
          TABLE_COUNTRIES " c on (ab.entry_country_id = c.countries_id)
                                             where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                             and ab.address_book_id = '" 
          . (int)$_SESSION['sendto'] . "'";

              
          $shipping_address $db->Execute($shipping_address_query);

              
          $billing_address_query "select ab.entry_firstname, ab.entry_lastname, ab.entry_company,
                                             ab.entry_street_address, ab.entry_suburb, ab.entry_postcode,
                                             ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id,
                                             c.countries_id, c.countries_name, c.countries_iso_code_2,
                                             c.countries_iso_code_3, c.address_format_id, ab.entry_state
                                            from " 
          TABLE_ADDRESS_BOOK " ab
                                            left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                            left join " 
          TABLE_COUNTRIES " c on (ab.entry_country_id = c.countries_id)
                                            where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                            and ab.address_book_id = '" 
          . (int)$_SESSION['billto'] . "'";

              
          $billing_address $db->Execute($billing_address_query);
              
          //STORE_PRODUCT_TAX_BASIS

              
          switch (STORE_PRODUCT_TAX_BASIS) {
                case 
          'Shipping':

                
          $tax_address_query "select ab.entry_country_id, ab.entry_zone_id
                                        from " 
          TABLE_ADDRESS_BOOK " ab
                                        left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                        where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                        and ab.address_book_id = '" 
          . (int)($this->content_type == 'virtual' $_SESSION['billto'] : $_SESSION['sendto']) . "'";
                
          $tax_address $db->Execute($tax_address_query);
                break;
                case 
          'Billing':

                
          $tax_address_query "select ab.entry_country_id, ab.entry_zone_id
                                        from " 
          TABLE_ADDRESS_BOOK " ab
                                        left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                        where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                        and ab.address_book_id = '" 
          . (int)$_SESSION['billto'] . "'";
                
          $tax_address $db->Execute($tax_address_query);
                break;
                case 
          'Store':
                if (
          $billing_address->fields['entry_zone_id'] == STORE_ZONE) {

                  
          $tax_address_query "select ab.entry_country_id, ab.entry_zone_id
                                          from " 
          TABLE_ADDRESS_BOOK " ab
                                          left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                          where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                          and ab.address_book_id = '" 
          . (int)$_SESSION['billto'] . "'";
                } else {
                  
          $tax_address_query "select ab.entry_country_id, ab.entry_zone_id
                                          from " 
          TABLE_ADDRESS_BOOK " ab
                                          left join " 
          TABLE_ZONES " z on (ab.entry_zone_id = z.zone_id)
                                          where ab.customers_id = '" 
          . (int)$_SESSION['customer_id'] . "'
                                          and ab.address_book_id = '" 
          . (int)($this->content_type == 'virtual' $_SESSION['billto'] : $_SESSION['sendto']) . "'";
                }
                
          $tax_address $db->Execute($tax_address_query);
              }


              
          $class =& $_SESSION['payment'];

              if (isset(
          $_SESSION['cc_id'])) {
                
          $coupon_code_query "select coupon_code
                                        from " 
          TABLE_COUPONS "
                                        where coupon_id = '" 
          . (int)$_SESSION['cc_id'] . "'";

                
          $coupon_code $db->Execute($coupon_code_query);


              }

              
          $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,
                                  
          'currency' => $_SESSION['currency'],
                                  
          'currency_value' => $currencies->currencies[$_SESSION['currency']]['value'],
                                  
          'payment_method' => $GLOBALS[$class]->title,
                                  
          'payment_module_code' => $GLOBALS[$class]->code,
                                  
          'coupon_code' => $coupon_code->fields['coupon_code'],
              
          //                          'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''),
              //                          'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''),
              //                          'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''),
              //                          'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''),
              //                          'cc_cvv' => (isset($GLOBALS['cc_cvv']) ? $GLOBALS['cc_cvv'] : ''),
                                  
          'shipping_method' => $_SESSION['shipping']['title'],
                                  
          'shipping_module_code' => $_SESSION['shipping']['id'],
                                  
          'shipping_cost' => $_SESSION['shipping']['cost'],
                                  
          'subtotal' => 0,
                                  
          'tax' => 0,
                                  
          'total' => 0,
                                  
          'tax_groups' => array(),
                                  
          'comments' => (isset($_SESSION['comments']) ? $_SESSION['comments'] : ''),
                                  
          'ip_address' => $_SESSION['customers_ip_address'] . ' - ' $_SERVER['REMOTE_ADDR']
                                  );

              
          //print_r($GLOBALS[$class]);
              //echo $class;
              //print_r($GLOBALS);
              //echo $_SESSION['payment'];
              /*
              // this is set above to the module filename it should be set to the module title like Checks/Money Order rather than moneyorder
              if (isset($$_SESSION['payment']) && is_object($$_SESSION['payment'])) {
              $this->info['payment_method'] = $$_SESSION['payment']->title;
              }
              */

          /*
          // bof: move below calculations
              if ($this->info['total'] == 0) {
                if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                  $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                } else {
                  $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                }
              }
              if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
                if ( isset($GLOBALS[$class]->order_status) && is_numeric($GLOBALS[$class]->order_status) && ($GLOBALS[$class]->order_status > 0) ) {
                  $this->info['order_status'] = $GLOBALS[$class]->order_status;
                }
              }
          // eof: move below calculations
          */
              
          $this->customer = array('firstname' => $customer_address->fields['customers_firstname'],
                                      
          'lastname' => $customer_address->fields['customers_lastname'],
                                      
          'company' => $customer_address->fields['entry_company'],
                                      
          'street_address' => $customer_address->fields['entry_street_address'],
                                      
          'suburb' => $customer_address->fields['entry_suburb'],
                                      
          'city' => $customer_address->fields['entry_city'],
                                      
          'postcode' => $customer_address->fields['entry_postcode'],
                                      
          'state' => ((zen_not_null($customer_address->fields['entry_state'])) ? $customer_address->fields['entry_state'] : $customer_address->fields['zone_name']),
                                      
          'zone_id' => $customer_address->fields['entry_zone_id'],
                                      
          'country' => array('id' => $customer_address->fields['countries_id'], 'title' => $customer_address->fields['countries_name'], 'iso_code_2' => $customer_address->fields['countries_iso_code_2'], 'iso_code_3' => $customer_address->fields['countries_iso_code_3']),
                                      
          'format_id' => (int)$customer_address->fields['address_format_id'],
                                      
          'telephone' => $customer_address->fields['customers_telephone'],
                                      
          'email_address' => $customer_address->fields['customers_email_address']);

              
          $this->delivery = array('firstname' => $shipping_address->fields['entry_firstname'],
                                      
          'lastname' => $shipping_address->fields['entry_lastname'],
                                      
          'company' => $shipping_address->fields['entry_company'],
                                      
          'street_address' => $shipping_address->fields['entry_street_address'],
                                      
          'suburb' => $shipping_address->fields['entry_suburb'],
                                      
          'city' => $shipping_address->fields['entry_city'],
                                      
          'postcode' => $shipping_address->fields['entry_postcode'],
                                      
          'state' => ((zen_not_null($shipping_address->fields['entry_state'])) ? $shipping_address->fields['entry_state'] : $shipping_address->fields['zone_name']),
                                      
          'zone_id' => $shipping_address->fields['entry_zone_id'],
                                      
          'country' => array('id' => $shipping_address->fields['countries_id'], 'title' => $shipping_address->fields['countries_name'], 'iso_code_2' => $shipping_address->fields['countries_iso_code_2'], 'iso_code_3' => $shipping_address->fields['countries_iso_code_3']),
                                      
          'country_id' => $shipping_address->fields['entry_country_id'],
                                      
          'format_id' => (int)$shipping_address->fields['address_format_id']);

              
          $this->billing = array('firstname' => $billing_address->fields['entry_firstname'],
                                     
          'lastname' => $billing_address->fields['entry_lastname'],
                                     
          'company' => $billing_address->fields['entry_company'],
                                     
          'street_address' => $billing_address->fields['entry_street_address'],
                                     
          'suburb' => $billing_address->fields['entry_suburb'],
                                     
          'city' => $billing_address->fields['entry_city'],
                                     
          'postcode' => $billing_address->fields['entry_postcode'],
                                     
          'state' => ((zen_not_null($billing_address->fields['entry_state'])) ? $billing_address->fields['entry_state'] : $billing_address->fields['zone_name']),
                                     
          'zone_id' => $billing_address->fields['entry_zone_id'],
                                     
          'country' => array('id' => $billing_address->fields['countries_id'], 'title' => $billing_address->fields['countries_name'], 'iso_code_2' => $billing_address->fields['countries_iso_code_2'], 'iso_code_3' => $billing_address->fields['countries_iso_code_3']),
                                     
          'country_id' => $billing_address->fields['entry_country_id'],
                                     
          'format_id' => (int)$billing_address->fields['address_format_id']);

              
          $index 0;
              
          $products $_SESSION['cart']->get_products();
              for (
          $i=0$n=sizeof($products); $i<$n$i++) {
                if ((
          $i/2) == floor($i/2)) {
                  
          $rowClass="rowEven";
                } else {
                  
          $rowClass="rowOdd";
                }
                
          $this->products[$index] = array('qty' => $products[$i]['quantity'],
                                                
          'name' => $products[$i]['name'],
                                                
          'model' => $products[$i]['model'],
                                                
          'tax' => zen_get_tax_rate($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']),
                                                
          'tax_description' => zen_get_tax_description($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']),
                                                
          'price' => $products[$i]['price'],
                                                
          'final_price' => $products[$i]['price'] + $_SESSION['cart']->attributes_price($products[$i]['id']),
                                                
          'onetime_charges' => $_SESSION['cart']->attributes_price_onetime_charges($products[$i]['id'], $products[$i]['quantity']),
                                                
          'weight' => $products[$i]['weight'],
                                                
          'products_priced_by_attribute' => $products[$i]['products_priced_by_attribute'],
                                                
          'product_is_free' => $products[$i]['product_is_free'],
                                                
          'products_discount_type' => $products[$i]['products_discount_type'],
                                                
          'products_discount_type_from' => $products[$i]['products_discount_type_from'],
                                                
          'id' => $products[$i]['id'],
                                                
          'rowClass' => $rowClass);

                if (
          $products[$i]['attributes']) {
                  
          $subindex 0;
                  
          reset($products[$i]['attributes']);
                  while (list(
          $option$value) = each($products[$i]['attributes'])) {
                    
          /*
                    //clr 030714 Determine if attribute is a text attribute and change products array if it is.
                    if ($value == PRODUCTS_OPTIONS_VALUES_TEXT_ID){
                    $attr_value = $products[$i]['attributes_values'][$option];
                    } else {
                    $attr_value = $attributes->fields['products_options_values_name'];
                    }
                    */

                    
          $attributes_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 = '" 
          . (int)$products[$i]['id'] . "'
                                             and pa.options_id = '" 
          . (int)$option "'
                                             and pa.options_id = popt.products_options_id
                                             and pa.options_values_id = '" 
          . (int)$value "'
                                             and pa.options_values_id = poval.products_options_values_id
                                             and popt.language_id = '" 
          . (int)$_SESSION['languages_id'] . "'
                                             and poval.language_id = '" 
          . (int)$_SESSION['languages_id'] . "'";

                    
          $attributes $db->Execute($attributes_query);

                    
          //clr 030714 Determine if attribute is a text attribute and change products array if it is.
                    
          if ($value == PRODUCTS_OPTIONS_VALUES_TEXT_ID){
                      
          $attr_value $products[$i]['attributes_values'][$option];
                    } else {
                      
          $attr_value $attributes->fields['products_options_values_name'];
                    }

                    
          $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options_name'],
                                                                             
          'value' => $attr_value,
                                                                             
          'option_id' => $option,
                                                                             
          'value_id' => $value,
                                                                             
          'prefix' => $attributes->fields['price_prefix'],
                                                                             
          'price' => $attributes->fields['options_values_price']);

                    
          $subindex++;
                  }
                }

                
          // add onetime charges here
                //$_SESSION['cart']->attributes_price_onetime_charges($products[$i]['id'], $products[$i]['quantity'])

                /*********************************************
                 * Calculate taxes for this product
                 *********************************************/
                
          $shown_price = (zen_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty'])
                + 
          zen_add_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']);
                
          $this->info['subtotal'] += $shown_price;

                
          // find product's tax rate and description
                
          $products_tax $this->products[$index]['tax'];
                
          $products_tax_description $this->products[$index]['tax_description'];

                if (
          DISPLAY_PRICE_WITH_TAX == 'true') {
                  
          // calculate the amount of tax "inc"luded in price (used if tax-in pricing is enabled)
                  
          $tax_add $shown_price - ($shown_price / (($products_tax 10) ? "1.0" str_replace('.'''$products_tax) : "1." str_replace('.'''$products_tax)));
                } else {
                  
          // calculate the amount of tax for this product (assuming tax is NOT included in the price)
                  
          $tax_add zen_round(($products_tax 100) * $shown_price$currencies->currencies[$this->info['currency']]['decimal_places']);
                }
                
          $this->info['tax'] += $tax_add;
                if (isset(
          $this->info['tax_groups'][$products_tax_description])) {
                  
          $this->info['tax_groups'][$products_tax_description] += $tax_add;
                } else {
                  
          $this->info['tax_groups'][$products_tax_description] = $tax_add;
                }
                
          /*********************************************
                 * END: Calculate taxes for this product
                 *********************************************/
                
          $index++;
              }

              
          // Update the final total to include tax if not already tax-inc
              
          if (DISPLAY_PRICE_WITH_TAX == 'true') {
                
          $this->info['total'] = $this->info['subtotal'] + $this->info['shipping_cost'];
              } else {
                
          $this->info['total'] = $this->info['subtotal'] + $this->info['tax'] + $this->info['shipping_cost'];
              }

          /*
          // moved to function create
              if ($this->info['total'] == 0) {
                if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                  $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                } else {
                  $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                }
              }
          */
              
          if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
                if ( isset(
          $GLOBALS[$class]->order_status) && is_numeric($GLOBALS[$class]->order_status) && ($GLOBALS[$class]->order_status 0) ) {
                  
          $this->info['order_status'] = $GLOBALS[$class]->order_status;
                }
              }

            }

            function 
          create($zf_ot_modules$zf_mode 2) {
              global 
          $db$zco_notifier;

              if (
          $this->info['total'] == 0) {
                if (
          DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                  
          $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                } else {
                  if (
          $_SESSION['payment'] != 'freecharger') {
                    
          $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                  }
                }
              }

              if (
          $_SESSION['shipping'] == 'free_free') {
                
          $this->info['shipping_module_code'] = $_SESSION['shipping'];
              }

              
          $sql_data_array = array('customers_id' => $_SESSION['customer_id'],
                                      
          'customers_name' => $this->customer['firstname'] . ' ' $this->customer['lastname'],
                                      
          'customers_company' => $this->customer['company'],
                                      
          'customers_street_address' => $this->customer['street_address'],
                                      
          'customers_suburb' => $this->customer['suburb'],
                                      
          'customers_city' => $this->customer['city'],
                                      
          'customers_postcode' => $this->customer['postcode'],
                                      
          'customers_state' => $this->customer['state'],
                                      
          'customers_country' => $this->customer['country']['title'],
                                      
          'customers_telephone' => $this->customer['telephone'],
                                      
          'customers_email_address' => $this->customer['email_address'],
                                      
          'customers_address_format_id' => $this->customer['format_id'],
                                      
          'delivery_name' => $this->delivery['firstname'] . ' ' $this->delivery['lastname'],
                                      
          'delivery_company' => $this->delivery['company'],
                                      
          'delivery_street_address' => $this->delivery['street_address'],
                                      
          'delivery_suburb' => $this->delivery['suburb'],
                                      
          'delivery_city' => $this->delivery['city'],
                                      
          'delivery_postcode' => $this->delivery['postcode'],
                                      
          'delivery_state' => $this->delivery['state'],
                                      
          'delivery_country' => $this->delivery['country']['title'],
                                      
          'delivery_address_format_id' => $this->delivery['format_id'],
                                      
          'billing_name' => $this->billing['firstname'] . ' ' $this->billing['lastname'],
                                      
          'billing_company' => $this->billing['company'],
                                      
          'billing_street_address' => $this->billing['street_address'],
                                      
          'billing_suburb' => $this->billing['suburb'],
                                      
          'billing_city' => $this->billing['city'],
                                      
          'billing_postcode' => $this->billing['postcode'],
                                      
          'billing_state' => $this->billing['state'],
                                      
          'billing_country' => $this->billing['country']['title'],
                                      
          'billing_address_format_id' => $this->billing['format_id'],
                                      
          'payment_method' => (($this->info['payment_module_code'] == '' and $this->info['payment_method'] == '') ? PAYMENT_METHOD_GV $this->info['payment_method']),
                                      
          'payment_module_code' => (($this->info['payment_module_code'] == '' and $this->info['payment_method'] == '') ? PAYMENT_MODULE_GV $this->info['payment_module_code']),
                                      
          'shipping_method' => $this->info['shipping_method'],
                                      
          'shipping_module_code' => (strpos($this->info['shipping_module_code'], '_') > substr($this->info['shipping_module_code'], 0strpos($this->info['shipping_module_code'], '_')) : $this->info['shipping_module_code']),
                                      
          'coupon_code' => $this->info['coupon_code'],
                                      
          'cc_type' => $this->info['cc_type'],
                                      
          'cc_owner' => $this->info['cc_owner'],
                                      
          'cc_number' => $this->info['cc_number'],
                                      
          'cc_expires' => $this->info['cc_expires'],
                                      
          'date_purchased' => 'now()',
                                      
          'orders_status' => $this->info['order_status'],
                                      
          'order_total' => $this->info['total'],
                                      
          'order_tax' => $this->info['tax'],
                                      
          'currency' => $this->info['currency'],
                                      
          'currency_value' => $this->info['currency_value'],
                                      
          'ip_address' => $_SESSION['customers_ip_address'] . ' - ' $_SERVER['REMOTE_ADDR']
                                      );

          if (
          $_SESSION['COWOA'])
                
          $sql_data_array[COWOA_order] = 1;


              
          zen_db_perform(TABLE_ORDERS$sql_data_array);

              
          $insert_id $db->Insert_ID();

              
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDER_HEADER'array_merge(array('orders_id' => $insert_id'shipping_weight' => $_SESSION['cart']->weight), $sql_data_array));

              for (
          $i=0$n=sizeof($zf_ot_modules); $i<$n$i++) {
                
          $sql_data_array = array('orders_id' => $insert_id,
                                        
          'title' => $zf_ot_modules[$i]['title'],
                                        
          'text' => $zf_ot_modules[$i]['text'],
                                        
          'value' => $zf_ot_modules[$i]['value'],
                                        
          'class' => $zf_ot_modules[$i]['code'],
                                        
          'sort_order' => $zf_ot_modules[$i]['sort_order']);

                
          zen_db_perform(TABLE_ORDERS_TOTAL$sql_data_array);

                
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDERTOTAL_LINE_ITEM'$sql_data_array);
              }

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

              
          zen_db_perform(TABLE_ORDERS_STATUS_HISTORY$sql_data_array);

              
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDER_COMMENT'$sql_data_array);

              return(
          $insert_id);

            }


            function  
          create_add_products($zf_insert_id$zf_mode false) {
              global 
          $db$currencies$order_total_modules$order_totals$zco_notifier;

              
          // initialized for the email confirmation

              
          $this->products_ordered '';
              
          $this->products_ordered_html '';
              
          $this->subtotal 0;
              
          $this->total_tax 0;

              
          // lowstock email report
              
          $this->email_low_stock='';

              for (
          $i=0$n=sizeof($this->products); $i<$n$i++) {
                
          $custom_insertable_text '';
                
          // Stock Update - Joao Correia
                
          if (STOCK_LIMITED == 'true') {
                  if (
          DOWNLOAD_ENABLED == 'true') {
                    
          $stock_query_raw "select p.products_quantity, pad.products_attributes_filename, p.product_is_always_free_shipping
                                        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 = '" 
          zen_get_prid($this->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 $this->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_values $db->Execute($stock_query_raw);
                  } else {
                    
          $stock_values $db->Execute("select * from " TABLE_PRODUCTS " where products_id = '" zen_get_prid($this->products[$i]['id']) . "'");
                  }

                  
          $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN');

                  if (
          $stock_values->RecordCount() > 0) {
                    
          // do not decrement quantities if products_attributes_filename exists
                    
          if ((DOWNLOAD_ENABLED != 'true') || $stock_values->fields['product_is_always_free_shipping'] == || (!$stock_values->fields['products_attributes_filename']) ) {
                      
          $stock_left $stock_values->fields['products_quantity'] - $this->products[$i]['qty'];
                      
          $this->products[$i]['stock_reduce'] = $this->products[$i]['qty'];
                    } else {
                      
          $stock_left $stock_values->fields['products_quantity'];
                    }

                    
          //            $this->products[$i]['stock_value'] = $stock_values->fields['products_quantity'];

                    
          $db->Execute("update " TABLE_PRODUCTS " set products_quantity = '" $stock_left "' where products_id = '" zen_get_prid($this->products[$i]['id']) . "'");
                    
          //        if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
                    
          if ($stock_left <= 0) {
                      
          // only set status to off when not displaying sold out
                      
          if (SHOW_PRODUCTS_SOLD_OUT == '0') {
                        
          $db->Execute("update " TABLE_PRODUCTS " set products_status = 0 where products_id = '" zen_get_prid($this->products[$i]['id']) . "'");
                      }
                    }

                    
          // for low stock email
                    
          if ( $stock_left <= STOCK_REORDER_LEVEL ) {
                      
          // WebMakers.com Added: add to low stock email
                      
          $this->email_low_stock .=  'ID# ' zen_get_prid($this->products[$i]['id']) . "\t\t" $this->products[$i]['model'] . "\t\t" $this->products[$i]['name'] . "\t\t" ' Qty Left: ' $stock_left "\n";
                    }
                  }
                }

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

                
          $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END');

                
          $sql_data_array = array('orders_id' => $zf_insert_id,
                                        
          'products_id' => zen_get_prid($this->products[$i]['id']),
                                        
          'products_model' => $this->products[$i]['model'],
                                        
          'products_name' => $this->products[$i]['name'],
                                        
          'products_price' => $this->products[$i]['price'],
                                        
          'final_price' => $this->products[$i]['final_price'],
                                        
          'onetime_charges' => $this->products[$i]['onetime_charges'],
                                        
          'products_tax' => $this->products[$i]['tax'],
                                        
          'products_quantity' => $this->products[$i]['qty'],
                                        
          'products_priced_by_attribute' => $this->products[$i]['products_priced_by_attribute'],
                                        
          'product_is_free' => $this->products[$i]['product_is_free'],
                                        
          'products_discount_type' => $this->products[$i]['products_discount_type'],
                                        
          'products_discount_type_from' => $this->products[$i]['products_discount_type_from'],
                                        
          'products_prid' => $this->products[$i]['id']);
                
          zen_db_perform(TABLE_ORDERS_PRODUCTS$sql_data_array);

                
          $order_products_id $db->Insert_ID();

                
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_PRODUCT_LINE_ITEM'array_merge(array('orders_products_id' => $order_products_id), $sql_data_array));

                
          $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_CREDIT_ACCOUNT_UPDATE_BEGIN');
                
          $order_total_modules->update_credit_account($i);//ICW ADDED FOR CREDIT CLASS SYSTEM

                
          $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_ATTRIBUTES_BEGIN');

                
          //------ bof: insert customer-chosen options to order--------
                
          $attributes_exist '0';
                
          $this->products_ordered_attributes '';
                if (isset(
          $this->products[$i]['attributes'])) {
                  
          $attributes_exist '1';
                  for (
          $j=0$n2=sizeof($this->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,
                                           pa.product_attribute_is_free, pa.products_attributes_weight, pa.products_attributes_weight_prefix,
                                           pa.attributes_discounted, pa.attributes_price_base_included, pa.attributes_price_onetime,
                                           pa.attributes_price_factor, pa.attributes_price_factor_offset,
                                           pa.attributes_price_factor_onetime, pa.attributes_price_factor_onetime_offset,
                                           pa.attributes_qty_prices, pa.attributes_qty_prices_onetime,
                                           pa.attributes_price_words, pa.attributes_price_words_free,
                                           pa.attributes_price_letters, pa.attributes_price_letters_free,
                                           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 = '" 
          zen_db_input($this->products[$i]['id']) . "'
                                            and pa.options_id = '" 
          $this->products[$i]['attributes'][$j]['option_id'] . "'
                                            and pa.options_id = popt.products_options_id
                                            and pa.options_values_id = '" 
          $this->products[$i]['attributes'][$j]['value_id'] . "'
                                            and pa.options_values_id = poval.products_options_values_id
                                            and popt.language_id = '" 
          $_SESSION['languages_id'] . "'
                                            and poval.language_id = '" 
          $_SESSION['languages_id'] . "'";

                      
          $attributes_values $db->Execute($attributes_query);
                    } else {
                      
          $attributes_values $db->Execute("select popt.products_options_name, poval.products_options_values_name,
                                           pa.options_values_price, pa.price_prefix,
                                           pa.product_attribute_is_free, pa.products_attributes_weight, pa.products_attributes_weight_prefix,
                                           pa.attributes_discounted, pa.attributes_price_base_included, pa.attributes_price_onetime,
                                           pa.attributes_price_factor, pa.attributes_price_factor_offset,
                                           pa.attributes_price_factor_onetime, pa.attributes_price_factor_onetime_offset,
                                           pa.attributes_qty_prices, pa.attributes_qty_prices_onetime,
                                           pa.attributes_price_words, pa.attributes_price_words_free,
                                           pa.attributes_price_letters, pa.attributes_price_letters_free
                                           from " 
          TABLE_PRODUCTS_OPTIONS " popt, " TABLE_PRODUCTS_OPTIONS_VALUES " poval, " TABLE_PRODUCTS_ATTRIBUTES " pa
                                           where pa.products_id = '" 
          $this->products[$i]['id'] . "' and pa.options_id = '" . (int)$this->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . (int)$this->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" $_SESSION['languages_id'] . "' and poval.language_id = '" $_SESSION['languages_id'] . "'");
                    }

                    
          //clr 030714 update insert query.  changing to use values form $order->products for products_options_values.
                    
          $sql_data_array = array('orders_id' => $zf_insert_id,
                                            
          'orders_products_id' => $order_products_id,
                                            
          'products_options' => $attributes_values->fields['products_options_name'],

                    
          //                                 'products_options_values' => $attributes_values->fields['products_options_values_name'],
                                            
          'products_options_values' => $this->products[$i]['attributes'][$j]['value'],
                                            
          'options_values_price' => $attributes_values->fields['options_values_price'],
                                            
          'price_prefix' => $attributes_values->fields['price_prefix'],
                                            
          'product_attribute_is_free' => $attributes_values->fields['product_attribute_is_free'],
                                            
          'products_attributes_weight' => $attributes_values->fields['products_attributes_weight'],
                                            
          'products_attributes_weight_prefix' => $attributes_values->fields['products_attributes_weight_prefix'],
                                            
          'attributes_discounted' => $attributes_values->fields['attributes_discounted'],
                                            
          'attributes_price_base_included' => $attributes_values->fields['attributes_price_base_included'],
                                            
          'attributes_price_onetime' => $attributes_values->fields['attributes_price_onetime'],
                                            
          'attributes_price_factor' => $attributes_values->fields['attributes_price_factor'],
                                            
          'attributes_price_factor_offset' => $attributes_values->fields['attributes_price_factor_offset'],
                                            
          'attributes_price_factor_onetime' => $attributes_values->fields['attributes_price_factor_onetime'],
                                            
          'attributes_price_factor_onetime_offset' => $attributes_values->fields['attributes_price_factor_onetime_offset'],
                                            
          'attributes_qty_prices' => $attributes_values->fields['attributes_qty_prices'],
                                            
          'attributes_qty_prices_onetime' => $attributes_values->fields['attributes_qty_prices_onetime'],
                                            
          'attributes_price_words' => $attributes_values->fields['attributes_price_words'],
                                            
          'attributes_price_words_free' => $attributes_values->fields['attributes_price_words_free'],
                                            
          'attributes_price_letters' => $attributes_values->fields['attributes_price_letters'],
                                            
          'attributes_price_letters_free' => $attributes_values->fields['attributes_price_letters_free'],
                                            
          'products_options_id' => (int)$this->products[$i]['attributes'][$j]['option_id'],
                                            
          'products_options_values_id' => (int)$this->products[$i]['attributes'][$j]['value_id'],
                                            
          'products_prid' => $this->products[$i]['id']
                                            );


                    
          zen_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES$sql_data_array);

                    
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ATTRIBUTE_LINE_ITEM'$sql_data_array);

                    if ((
          DOWNLOAD_ENABLED == 'true') && isset($attributes_values->fields['products_attributes_filename']) && zen_not_null($attributes_values->fields['products_attributes_filename'])) {
                      
          $sql_data_array = array('orders_id' => $zf_insert_id,
                                              
          'orders_products_id' => $order_products_id,
                                              
          'orders_products_filename' => $attributes_values->fields['products_attributes_filename'],
                                              
          'download_maxdays' => $attributes_values->fields['products_attributes_maxdays'],
                                              
          'download_count' => $attributes_values->fields['products_attributes_maxcount'],
                                              
          'products_prid' => $this->products[$i]['id']
                                              );

                      
          zen_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD$sql_data_array);

                      
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ATTRIBUTE_DOWNLOAD_LINE_ITEM'$sql_data_array);
                    }
                    
          //clr 030714 changing to use values from $orders->products and adding call to zen_decode_specialchars()
                    //        $this->products_ordered_attributes .= "\n\t" . $attributes_values->fields['products_options_name'] . ' ' . $attributes_values->fields['products_options_values_name'];
                    
          $this->products_ordered_attributes .= "\n\t" $attributes_values->fields['products_options_name'] . ' ' zen_decode_specialchars($this->products[$i]['attributes'][$j]['value']);
                  }
                }
                
          //------eof: insert customer-chosen options ----

              
          $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADD_PRODUCTS'$custom_insertable_text);

          /* START: ADD MY CUSTOM DETAILS
           * 1. calculate/prepare custom information to be added to this product entry in order-confirmation.
           * 2. Add that data to the $this->products_ordered_attributes variable, using this sort of format:
           *      $this->products_ordered_attributes .=  {INSERT CUSTOM INFORMATION HERE};
           */

              
          $this->products_ordered_attributes .= ''// $custom_insertable_text;

          /* END: ADD MY CUSTOM DETAILS */

                // update totals counters
                
          $this->total_weight += ($this->products[$i]['qty'] * $this->products[$i]['weight']);
                
          $this->total_tax += zen_calculate_tax($total_products_price$products_tax) * $this->products[$i]['qty'];
                
          $this->total_cost += $total_products_price;

                
          $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_ONE_TIME_CHARGES_BEGIN');

                
          // build output for email notification
                
          $this->products_ordered .=  $this->products[$i]['qty'] . ' x ' $this->products[$i]['name'] . ($this->products[$i]['model'] != '' ' (' $this->products[$i]['model'] . ') ' '') . ' = ' .
                
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
                (
          $this->products[$i]['onetime_charges'] !="\n" TEXT_ONETIME_CHARGES_EMAIL $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
                
          $this->products_ordered_attributes "\n";
                
          $this->products_ordered_html .=
                
          '<tr>' "\n" .
                
          '<td class="product-details" align="right" valign="top" width="30">' $this->products[$i]['qty'] . '&nbsp;x</td>' "\n" .
                
          '<td class="product-details" valign="top">' nl2br($this->products[$i]['name']) . ($this->products[$i]['model'] != '' ' (' nl2br($this->products[$i]['model']) . ') ' '') . "\n" .
                
          '<nobr><small><em> 'nl2br($this->products_ordered_attributes) .'</em></small></nobr></td>' "\n" .
                
          '<td class="product-details-num" valign="top" align="right">' .
                
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
                (
          $this->products[$i]['onetime_charges'] !=?
                
          '</td></tr>' "\n" '<tr><td class="product-details">' nl2br(TEXT_ONETIME_CHARGES_EMAIL) . '</td>' "\n" .
                
          '<td>' $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
                
          '</td></tr>' "\n";
              }

              
          $order_total_modules->apply_credit();//ICW ADDED FOR CREDIT CLASS SYSTEM
              
          $zco_notifier->notify('NOTIFY_ORDER_AFTER_ORDER_CREATE_ADD_PRODUCTS');
            }


            function 
          send_order_email($zf_insert_id$zf_mode) {
              global 
          $currencies$order_totals$zco_notifier;

              
          //      print_r($this);
              //      die();
              
          if ($this->email_low_stock != '' and SEND_LOWSTOCK_EMAIL=='1') {
                
          // send an email
                
          $email_low_stock SEND_EXTRA_LOW_STOCK_EMAIL_TITLE "\n\n" $this->email_low_stock;
                
          zen_mail(''SEND_EXTRA_LOW_STOCK_EMAILS_TOEMAIL_TEXT_SUBJECT_LOWSTOCK$email_low_stockSTORE_OWNEREMAIL_FROM, array('EMAIL_MESSAGE_HTML' => nl2br($email_low_stock)),'low_stock');
              }

              
          // lets start with the email confirmation
              // make an array to store the html version
              
          $html_msg=array();

             
          // COWOA Conditional
              
          if ($_SESSION['COWOA'])
              {
              
          $invoiceInfo="";
              
          $htmlInvoiceURL="";
              
          $htmlInvoiceValue="";
              }
              else
              



              
          //intro area
              
          $email_order EMAIL_TEXT_HEADER EMAIL_TEXT_FROM STORE_NAME "\n\n" .
              
          $this->customer['firstname'] . ' ' $this->customer['lastname'] . "\n\n" .
              
          EMAIL_THANKS_FOR_SHOPPING "\n" EMAIL_DETAILS_FOLLOW "\n" .
              
          EMAIL_SEPARATOR "\n" .
              
          EMAIL_TEXT_ORDER_NUMBER ' ' $zf_insert_id "\n" .
              
          EMAIL_TEXT_DATE_ORDERED ' ' strftime(DATE_FORMAT_LONG) . "\n" $invoiceInfo;
              
          $html_msg['EMAIL_TEXT_HEADER']     = EMAIL_TEXT_HEADER;
              
          $html_msg['EMAIL_TEXT_FROM']       = EMAIL_TEXT_FROM;
              
          $html_msg['INTRO_STORE_NAME']      = STORE_NAME;
              
          $html_msg['EMAIL_THANKS_FOR_SHOPPING'] = EMAIL_THANKS_FOR_SHOPPING;
              
          $html_msg['EMAIL_DETAILS_FOLLOW']  = EMAIL_DETAILS_FOLLOW;
              
          $html_msg['INTRO_ORDER_NUM_TITLE'] = EMAIL_TEXT_ORDER_NUMBER;
              
          $html_msg['INTRO_ORDER_NUMBER']    = $zf_insert_id;
              
          $html_msg['INTRO_DATE_TITLE']      = EMAIL_TEXT_DATE_ORDERED;
              
          $html_msg['INTRO_DATE_ORDERED']    = strftime(DATE_FORMAT_LONG);
              
          $html_msg['INTRO_URL_TEXT']        = $htmlInvoiceURL;
              
          $html_msg['INTRO_URL_VALUE']       = $htmlInvoiceValue;


              
          //comments area
              
          if ($this->info['comments']) {
                
          $email_order .= zen_db_output($this->info['comments']) . "\n\n";
                
          $html_msg['ORDER_COMMENTS'] = nl2br(zen_db_output($this->info['comments']));
              } else {
                
          $html_msg['ORDER_COMMENTS'] = '';
              }

              
          //products area
              
          $email_order .= EMAIL_TEXT_PRODUCTS "\n" .
              
          EMAIL_SEPARATOR "\n" .
              
          $this->products_ordered .
              
          EMAIL_SEPARATOR "\n";
              
          $html_msg['PRODUCTS_TITLE'] = EMAIL_TEXT_PRODUCTS;
              
          $html_msg['PRODUCTS_DETAIL']='<table class="product-details" border="0" width="100%" cellspacing="0" cellpadding="2">' $this->products_ordered_html '</table>';

              
          //order totals area
              
          $html_ot .= '<td class="order-totals-text" align="right" width="100%">' '&nbsp;' '</td> ' "\n" '<td class="order-totals-num" align="right" nowrap="nowrap">' '---------' .'</td> </tr>' "\n" '<tr>';
              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";
                
          $html_ot .= '<td class="order-totals-text" align="right" width="100%">' $order_totals[$i]['title'] . '</td> ' "\n" '<td class="order-totals-num" align="right" nowrap="nowrap">' .($order_totals[$i]['text']) .'</td> </tr>' "\n" '<tr>';
              }
              
          $html_msg['ORDER_TOTALS'] = '<table border="0" width="100%" cellspacing="0" cellpadding="2"> ' $html_ot ' </table>';

              
          //addresses area: Delivery
              
          $html_msg['HEADING_ADDRESS_INFORMATION']= HEADING_ADDRESS_INFORMATION;
              
          $html_msg['ADDRESS_DELIVERY_TITLE']     = EMAIL_TEXT_DELIVERY_ADDRESS;
              
          $html_msg['ADDRESS_DELIVERY_DETAIL']    = ($this->content_type != 'virtual') ? zen_address_label($_SESSION['customer_id'], $_SESSION['sendto'], true''"<br />") : 'n/a';
              
          $html_msg['SHIPPING_METHOD_TITLE']      = HEADING_SHIPPING_METHOD;
              
          $html_msg['SHIPPING_METHOD_DETAIL']     = (zen_not_null($this->info['shipping_method'])) ? $this->info['shipping_method'] : 'n/a';

              if (
          $this->content_type != 'virtual') {
                
          $email_order .= "\n" EMAIL_TEXT_DELIVERY_ADDRESS "\n" .
                
          EMAIL_SEPARATOR "\n" .
                
          zen_address_label($_SESSION['customer_id'], $_SESSION['sendto'], 0''"\n") . "\n";
              }

              
          //addresses area: Billing
              
          $email_order .= "\n" EMAIL_TEXT_BILLING_ADDRESS "\n" .
              
          EMAIL_SEPARATOR "\n" .
              
          zen_address_label($_SESSION['customer_id'], $_SESSION['billto'], 0''"\n") . "\n\n";
              
          $html_msg['ADDRESS_BILLING_TITLE']   = EMAIL_TEXT_BILLING_ADDRESS;
              
          $html_msg['ADDRESS_BILLING_DETAIL']  = zen_address_label($_SESSION['customer_id'], $_SESSION['billto'], true''"<br />");

              if (
          is_object($GLOBALS[$_SESSION['payment']])) {
                
          $cc_num_display = (isset($this->info['cc_number']) && $this->info['cc_number'] != '') ? substr($this->info['cc_number'], 04) . str_repeat('X', (strlen($this->info['cc_number']) - 8)) . substr($this->info['cc_number'], -4) . "\n\n" '';
                
          $email_order .= EMAIL_TEXT_PAYMENT_METHOD "\n" .
                
          EMAIL_SEPARATOR "\n";
                
          $payment_class $_SESSION['payment'];
                
          $email_order .= $GLOBALS[$payment_class]->title "\n\n";
                
          $email_order .= (isset($this->info['cc_type']) && $this->info['cc_type'] != '') ? $this->info['cc_type'] . ' ' $cc_num_display "\n\n" '';
                
          $email_order .= ($GLOBALS[$payment_class]->email_footer) ? $GLOBALS[$payment_class]->email_footer "\n\n" '';
              } else {
                
          $email_order .= EMAIL_TEXT_PAYMENT_METHOD "\n" .
                
          EMAIL_SEPARATOR "\n";
                
          $email_order .= PAYMENT_METHOD_GV "\n\n";
              }
              
          $html_msg['PAYMENT_METHOD_TITLE']  = EMAIL_TEXT_PAYMENT_METHOD;
              
          $html_msg['PAYMENT_METHOD_DETAIL'] = (is_object($GLOBALS[$_SESSION['payment']]) ? $GLOBALS[$payment_class]->title PAYMENT_METHOD_GV );
              
          $html_msg['PAYMENT_METHOD_FOOTER'] = (is_object($GLOBALS[$_SESSION['payment']]) && $GLOBALS[$payment_class]->email_footer != '') ? nl2br($GLOBALS[$payment_class]->email_footer) : (isset($this->info['cc_type']) && $this->info['cc_type'] != '' $this->info['cc_type'] . ' ' $cc_num_display "\n\n" '');

              
          // include disclaimer
              
          $email_order .= "\n-----\n" sprintf(EMAIL_DISCLAIMERSTORE_OWNER_EMAIL_ADDRESS) . "\n\n";
              
          // include copyright
              
          $email_order .= "\n-----\n" EMAIL_FOOTER_COPYRIGHT "\n\n";

              while (
          strstr($email_order'&nbsp;')) $email_order str_replace('&nbsp;'' '$email_order);

              
          $html_msg['EMAIL_FIRST_NAME'] = $this->customer['firstname'];
              
          $html_msg['EMAIL_LAST_NAME'] = $this->customer['lastname'];
              
          //  $html_msg['EMAIL_TEXT_HEADER'] = EMAIL_TEXT_HEADER;
              
          $html_msg['EXTRA_INFO'] = '';
              
          $zco_notifier->notify('NOTIFY_ORDER_INVOICE_CONTENT_READY_TO_SEND', array('zf_insert_id' => $zf_insert_id'text_email' => $email_order'html_email' => $html_msg));

              
          // BOF rl_invoice3
              
          $this->attachArray = array();
              if(
          RL_INVOICE3_SEND_PDF=='1'){
                  if(!(
          0==$this->info['total'] && RL_INVOICE3_NOT_NULL_INVOICE==0)){     
                      if( (
          defined('RL_INVOICE3_ORDERSTATUS')) && ($this->info['order_status'] >= RL_INVOICE3_ORDERSTATUS)) {
                          require_once(
          DIR_WS_INCLUDES 'classes/class.rl_invoice3.php');
                          
                          
          $pdfT = new rl_invoice3($zf_insert_id$paper['orientation'], $paper['unit'], $paper['format']);
                          
          $pdfT -> createPdfFile(true);
                          
          $this->attachArray $pdfT->getPDFAttachments();
                          
          #$this->attachArray[] = array('file'=>$x, 'mime_type'=>'pdf');
                      
          }
                  }
              }
              
          zen_mail($this->customer['firstname'] . ' ' $this->customer['lastname'], $this->customer['email_address'], EMAIL_TEXT_SUBJECT EMAIL_ORDER_NUMBER_SUBJECT $zf_insert_id$email_orderSTORE_NAMEEMAIL_FROM$html_msg'checkout'$this->attachArray);
              
          // EOF rl_invoice3
              
              // send additional emails
              
          if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
                
          $extra_info=email_collect_extra_info('',''$this->customer['firstname'] . ' ' $this->customer['lastname'], $this->customer['email_address'], $this->customer['telephone']);
                
          $html_msg['EXTRA_INFO'] = $extra_info['HTML'];

                if (
          $GLOBALS[$_SESSION['payment']]->auth_code || $GLOBALS[$_SESSION['payment']]->transaction_id) {
                  
          $pmt_details 'AuthCode: ' $GLOBALS[$_SESSION['payment']]->auth_code '  TransID: ' $GLOBALS[$_SESSION['payment']]->transaction_id "\n\n";
                  
          $email_order $pmt_details $email_order;
                  
          $html_msg['EMAIL_TEXT_HEADER'] = nl2br($pmt_details) . $html_msg['EMAIL_TEXT_HEADER'];
                }

                if(
          method_exists($pdfT"getPDFAttachments")){
                  
          $this->attachArray $pdfT->getPDFAttachments('NO');
                }
                
          zen_mail(''SEND_EXTRA_ORDER_EMAILS_TOSEND_EXTRA_NEW_ORDERS_EMAILS_TO_SUBJECT ' ' EMAIL_TEXT_SUBJECT EMAIL_ORDER_NUMBER_SUBJECT $zf_insert_id,
                
          $email_order $extra_info['TEXT'], STORE_NAMEEMAIL_FROM$html_msg'checkout_extra'$this->attachArray);
              }
              
          $zco_notifier->notify('NOTIFY_ORDER_AFTER_SEND_ORDER_EMAIL');
            }

          }

          Kommentar


            #6
            Du hast zusätzlich Checkout without Account und pdf Rechnung 3 installiert, die beide ebenfalls die includes/classes/order.php verändern. Dabei sind die nötigen Einträge für Stock by Attributes nicht gemerged, sondern entfernt worden.
            Probiere es mit dieser order.php hier und poste bitte, ob es mit der passt:

            Code:
            <?php
            /**
             * File contains the order-processing class ("order")
             *
             * @package classes
             * @copyright Copyright 2003-2010 Zen Cart Development Team
             * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
             * @version $Id: order.php for stock by attributes, cowoa and rl_invoice 2010-11-20 13:39:51Z webchills $
             */
            /**
             * order class
             *
             * Handles all order-processing functions
             *
             * @package classes
             */
            if (!defined('IS_ADMIN_FLAG')) {
              die('Illegal Access');
            }
            class order extends base {
              var $info, $totals, $products, $customer, $delivery, $content_type, $email_low_stock, $products_ordered_attributes,
              $products_ordered, $products_ordered_email, $attachArray;
            
              function order($order_id = '') {
                $this->info = array();
                $this->totals = array();
                $this->products = array();
                $this->customer = array();
                $this->delivery = array();
            
                if (zen_not_null($order_id)) {
                  $this->query($order_id);
                } else {
                  $this->cart();
                }
              }
            
              function query($order_id) {
                global $db;
            
                $order_id = zen_db_prepare_input($order_id);
            
                $order_query = "select customers_id, customers_name, customers_company,
                                     customers_street_address, customers_suburb, customers_city,
                                     customers_postcode, customers_state, customers_country,
                                     customers_telephone, customers_email_address, customers_address_format_id,
                                     delivery_name, delivery_company, delivery_street_address, delivery_suburb,
                                     delivery_city, delivery_postcode, delivery_state, delivery_country,
                                     delivery_address_format_id, billing_name, billing_company,
                                     billing_street_address, billing_suburb, billing_city, billing_postcode,
                                     billing_state, billing_country, billing_address_format_id,
                                     payment_method, payment_module_code, shipping_method, shipping_module_code,
                                     coupon_code, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value,
                                     date_purchased, orders_status, last_modified, order_total, order_tax, ip_address
                                    from " . TABLE_ORDERS . "
                                    where orders_id = '" . (int)$order_id . "'";
            
                $order = $db->Execute($order_query);
            
                $totals_query = "select title, text, class
                                     from " . TABLE_ORDERS_TOTAL . "
                                     where orders_id = '" . (int)$order_id . "'
                                     order by sort_order";
            
                $totals = $db->Execute($totals_query);
            
                while (!$totals->EOF) {
            
            
                  if ($totals->fields['class'] == 'ot_coupon') {
                    $coupon_link_query = "SELECT coupon_id
                            from " . TABLE_COUPONS . "
                            where coupon_code ='" . $order->fields['coupon_code'] . "'";
                    $coupon_link = $db->Execute($coupon_link_query);
                    $zc_coupon_link = '<a href="javascript:couponpopupWindow(\'' . zen_href_link(FILENAME_POPUP_COUPON_HELP, 'cID=' . $coupon_link->fields['coupon_id']) . '\')">';
                  }
                  $this->totals[] = array('title' => ($totals->fields['class'] == 'ot_coupon' ? $zc_coupon_link . $totals->fields['title'] . '</a>' : $totals->fields['title']),
                                          'text' => $totals->fields['text'],
                                          'class' => $totals->fields['class']);
                  $totals->MoveNext();
                }
            
                $order_total_query = "select text, value
                                         from " . TABLE_ORDERS_TOTAL . "
                                         where orders_id = '" . (int)$order_id . "'
                                         and class = 'ot_total'";
            
            
                $order_total = $db->Execute($order_total_query);
            
            
                $shipping_method_query = "select title, value
                                            from " . TABLE_ORDERS_TOTAL . "
                                            where orders_id = '" . (int)$order_id . "'
                                            and class = 'ot_shipping'";
            
            
                $shipping_method = $db->Execute($shipping_method_query);
            
                $order_status_query = "select orders_status_name
                                         from " . TABLE_ORDERS_STATUS . "
                                         where orders_status_id = '" . $order->fields['orders_status'] . "'
                                         and language_id = '" . (int)$_SESSION['languages_id'] . "'";
            
                $order_status = $db->Execute($order_status_query);
            
                $this->info = array('currency' => $order->fields['currency'],
                                    'currency_value' => $order->fields['currency_value'],
                                    'payment_method' => $order->fields['payment_method'],
                                    'payment_module_code' => $order->fields['payment_module_code'],
                                    'shipping_method' => $order->fields['shipping_method'],
                                    'shipping_module_code' => $order->fields['shipping_module_code'],
                                    'coupon_code' => $order->fields['coupon_code'],
                                    'cc_type' => $order->fields['cc_type'],
                                    'cc_owner' => $order->fields['cc_owner'],
                                    'cc_number' => $order->fields['cc_number'],
                                    'cc_expires' => $order->fields['cc_expires'],
                                    'date_purchased' => $order->fields['date_purchased'],
                                    'orders_status' => $order_status->fields['orders_status_name'],
                                    'last_modified' => $order->fields['last_modified'],
                                    'total' => $order->fields['order_total'],
                                    'tax' => $order->fields['order_tax'],
                                    'ip_address' => $order->fields['ip_address']
                                    );
            
                $this->customer = array('id' => $order->fields['customers_id'],
                                        'name' => $order->fields['customers_name'],
                                        'company' => $order->fields['customers_company'],
                                        'street_address' => $order->fields['customers_street_address'],
                                        'suburb' => $order->fields['customers_suburb'],
                                        'city' => $order->fields['customers_city'],
                                        'postcode' => $order->fields['customers_postcode'],
                                        'state' => $order->fields['customers_state'],
                                        'country' => $order->fields['customers_country'],
                                        'format_id' => $order->fields['customers_address_format_id'],
                                        'telephone' => $order->fields['customers_telephone'],
                                        'email_address' => $order->fields['customers_email_address']);
            
                $this->delivery = array('name' => $order->fields['delivery_name'],
                                        'company' => $order->fields['delivery_company'],
                                        'street_address' => $order->fields['delivery_street_address'],
                                        'suburb' => $order->fields['delivery_suburb'],
                                        'city' => $order->fields['delivery_city'],
                                        'postcode' => $order->fields['delivery_postcode'],
                                        'state' => $order->fields['delivery_state'],
                                        'country' => $order->fields['delivery_country'],
                                        'format_id' => $order->fields['delivery_address_format_id']);
            
                if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {
                  $this->delivery = false;
                }
            
                $this->billing = array('name' => $order->fields['billing_name'],
                                       'company' => $order->fields['billing_company'],
                                       'street_address' => $order->fields['billing_street_address'],
                                       'suburb' => $order->fields['billing_suburb'],
                                       'city' => $order->fields['billing_city'],
                                       'postcode' => $order->fields['billing_postcode'],
                                       'state' => $order->fields['billing_state'],
                                       'country' => $order->fields['billing_country'],
                                       'format_id' => $order->fields['billing_address_format_id']);
            
                $index = 0;
                $orders_products_query = "select orders_products_id, products_id, products_name,
                                             products_model, products_price, products_tax,
                                             products_quantity, final_price,
                                             onetime_charges,
                                             products_priced_by_attribute, product_is_free, products_discount_type,
                                             products_discount_type_from
                                              from " . TABLE_ORDERS_PRODUCTS . "
                                              where orders_id = '" . (int)$order_id . "'
                                              order by orders_products_id";
            
                $orders_products = $db->Execute($orders_products_query);
            
                while (!$orders_products->EOF) {
                  // convert quantity to proper decimals - account history
                  if (QUANTITY_DECIMALS != 0) {
                    $fix_qty = $orders_products->fields['products_quantity'];
                    switch (true) {
                      case (!strstr($fix_qty, '.')):
                      $new_qty = $fix_qty;
                      break;
                      default:
                      $new_qty = preg_replace('/[0]+$/', '', $orders_products->fields['products_quantity']);
                      break;
                    }
                  } else {
                    $new_qty = $orders_products->fields['products_quantity'];
                  }
            
                  $new_qty = round($new_qty, QUANTITY_DECIMALS);
            
                  if ($new_qty == (int)$new_qty) {
                    $new_qty = (int)$new_qty;
                  }
            
                  $this->products[$index] = array('qty' => $new_qty,
                                                  'id' => $orders_products->fields['products_id'],
                                                  'name' => $orders_products->fields['products_name'],
                                                  'model' => $orders_products->fields['products_model'],
                                                  'tax' => $orders_products->fields['products_tax'],
                                                  'price' => $orders_products->fields['products_price'],
                                                  'final_price' => $orders_products->fields['final_price'],
                                                  'onetime_charges' => $orders_products->fields['onetime_charges'],
                                                  'products_priced_by_attribute' => $orders_products->fields['products_priced_by_attribute'],
                                                  'product_is_free' => $orders_products->fields['product_is_free'],
                                                  'products_discount_type' => $orders_products->fields['products_discount_type'],
                                                  'products_discount_type_from' => $orders_products->fields['products_discount_type_from']);
            
                  $subindex = 0;
                  $attributes_query = "select products_options_id, products_options_values_id, products_options, products_options_values,
                                          options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . "
                                           where orders_id = '" . (int)$order_id . "'
                                           and orders_products_id = '" . (int)$orders_products->fields['orders_products_id'] . "'";
            
                  $attributes = $db->Execute($attributes_query);
                  if ($attributes->RecordCount()) {
                    while (!$attributes->EOF) {
                      $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options'],
                                                                               'value' => $attributes->fields['products_options_values'],
                                                                               'prefix' => $attributes->fields['price_prefix'],
                                                                               'price' => $attributes->fields['options_values_price']);
            
                      $subindex++;
                      $attributes->MoveNext();
                    }
                  }
            
                  $this->info['tax_groups']["{$this->products[$index]['tax']}"] = '1';
            
                  $index++;
                  $orders_products->MoveNext();
                }
              }
            
              function cart() {
                global $db, $currencies;
            
                $this->content_type = $_SESSION['cart']->get_content_type();
            
                $customer_address_query = "select c.customers_firstname, c.customers_lastname, c.customers_telephone,
                                                c.customers_email_address, ab.entry_company, ab.entry_street_address,
                                                ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id,
                                                z.zone_name, co.countries_id, co.countries_name,
                                                co.countries_iso_code_2, co.countries_iso_code_3,
                                                co.address_format_id, ab.entry_state
                                               from (" . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab )
                                               left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                               left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id)
                                               where c.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                               and ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                               and c.customers_default_address_id = ab.address_book_id";
            
                $customer_address = $db->Execute($customer_address_query);
            
                $shipping_address_query = "select ab.entry_firstname, ab.entry_lastname, ab.entry_company,
                                                ab.entry_street_address, ab.entry_suburb, ab.entry_postcode,
                                                ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id,
                                                c.countries_id, c.countries_name, c.countries_iso_code_2,
                                                c.countries_iso_code_3, c.address_format_id, ab.entry_state
                                               from " . TABLE_ADDRESS_BOOK . " ab
                                               left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                               left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id)
                                               where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                               and ab.address_book_id = '" . (int)$_SESSION['sendto'] . "'";
            
                $shipping_address = $db->Execute($shipping_address_query);
            
                $billing_address_query = "select ab.entry_firstname, ab.entry_lastname, ab.entry_company,
                                               ab.entry_street_address, ab.entry_suburb, ab.entry_postcode,
                                               ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id,
                                               c.countries_id, c.countries_name, c.countries_iso_code_2,
                                               c.countries_iso_code_3, c.address_format_id, ab.entry_state
                                              from " . TABLE_ADDRESS_BOOK . " ab
                                              left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                              left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id)
                                              where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                              and ab.address_book_id = '" . (int)$_SESSION['billto'] . "'";
            
                $billing_address = $db->Execute($billing_address_query);
                //STORE_PRODUCT_TAX_BASIS
            
                switch (STORE_PRODUCT_TAX_BASIS) {
                  case 'Shipping':
            
                  $tax_address_query = "select ab.entry_country_id, ab.entry_zone_id
                                          from " . TABLE_ADDRESS_BOOK . " ab
                                          left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                          where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                          and ab.address_book_id = '" . (int)($this->content_type == 'virtual' ? $_SESSION['billto'] : $_SESSION['sendto']) . "'";
                  $tax_address = $db->Execute($tax_address_query);
                  break;
                  case 'Billing':
            
                  $tax_address_query = "select ab.entry_country_id, ab.entry_zone_id
                                          from " . TABLE_ADDRESS_BOOK . " ab
                                          left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                          where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                          and ab.address_book_id = '" . (int)$_SESSION['billto'] . "'";
                  $tax_address = $db->Execute($tax_address_query);
                  break;
                  case 'Store':
                  if ($billing_address->fields['entry_zone_id'] == STORE_ZONE) {
            
                    $tax_address_query = "select ab.entry_country_id, ab.entry_zone_id
                                            from " . TABLE_ADDRESS_BOOK . " ab
                                            left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                            where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                            and ab.address_book_id = '" . (int)$_SESSION['billto'] . "'";
                  } else {
                    $tax_address_query = "select ab.entry_country_id, ab.entry_zone_id
                                            from " . TABLE_ADDRESS_BOOK . " ab
                                            left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id)
                                            where ab.customers_id = '" . (int)$_SESSION['customer_id'] . "'
                                            and ab.address_book_id = '" . (int)($this->content_type == 'virtual' ? $_SESSION['billto'] : $_SESSION['sendto']) . "'";
                  }
                  $tax_address = $db->Execute($tax_address_query);
                }
            
            
                $class =& $_SESSION['payment'];
            
                if (isset($_SESSION['cc_id'])) {
                  $coupon_code_query = "select coupon_code
                                          from " . TABLE_COUPONS . "
                                          where coupon_id = '" . (int)$_SESSION['cc_id'] . "'";
            
                  $coupon_code = $db->Execute($coupon_code_query);
            
            
                }
            
                $this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,
                                    'currency' => $_SESSION['currency'],
                                    'currency_value' => $currencies->currencies[$_SESSION['currency']]['value'],
                                    'payment_method' => $GLOBALS[$class]->title,
                                    'payment_module_code' => $GLOBALS[$class]->code,
                                    'coupon_code' => $coupon_code->fields['coupon_code'],
                //                          'cc_type' => (isset($GLOBALS['cc_type']) ? $GLOBALS['cc_type'] : ''),
                //                          'cc_owner' => (isset($GLOBALS['cc_owner']) ? $GLOBALS['cc_owner'] : ''),
                //                          'cc_number' => (isset($GLOBALS['cc_number']) ? $GLOBALS['cc_number'] : ''),
                //                          'cc_expires' => (isset($GLOBALS['cc_expires']) ? $GLOBALS['cc_expires'] : ''),
                //                          'cc_cvv' => (isset($GLOBALS['cc_cvv']) ? $GLOBALS['cc_cvv'] : ''),
                                    'shipping_method' => $_SESSION['shipping']['title'],
                                    'shipping_module_code' => $_SESSION['shipping']['id'],
                                    'shipping_cost' => $_SESSION['shipping']['cost'],
                                    'subtotal' => 0,
                                    'tax' => 0,
                                    'total' => 0,
                                    'tax_groups' => array(),
                                    'comments' => (isset($_SESSION['comments']) ? $_SESSION['comments'] : ''),
                                    'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
                                    );
            
                //print_r($GLOBALS[$class]);
                //echo $class;
                //print_r($GLOBALS);
                //echo $_SESSION['payment'];
                /*
                // this is set above to the module filename it should be set to the module title like Checks/Money Order rather than moneyorder
                if (isset($$_SESSION['payment']) && is_object($$_SESSION['payment'])) {
                $this->info['payment_method'] = $$_SESSION['payment']->title;
                }
                */
            
            /*
            // bof: move below calculations
                if ($this->info['total'] == 0) {
                  if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                    $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                  } else {
                    $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                  }
                }
                if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
                  if ( isset($GLOBALS[$class]->order_status) && is_numeric($GLOBALS[$class]->order_status) && ($GLOBALS[$class]->order_status > 0) ) {
                    $this->info['order_status'] = $GLOBALS[$class]->order_status;
                  }
                }
            // eof: move below calculations
            */
                $this->customer = array('firstname' => $customer_address->fields['customers_firstname'],
                                        'lastname' => $customer_address->fields['customers_lastname'],
                                        'company' => $customer_address->fields['entry_company'],
                                        'street_address' => $customer_address->fields['entry_street_address'],
                                        'suburb' => $customer_address->fields['entry_suburb'],
                                        'city' => $customer_address->fields['entry_city'],
                                        'postcode' => $customer_address->fields['entry_postcode'],
                                        'state' => ((zen_not_null($customer_address->fields['entry_state'])) ? $customer_address->fields['entry_state'] : $customer_address->fields['zone_name']),
                                        'zone_id' => $customer_address->fields['entry_zone_id'],
                                        'country' => array('id' => $customer_address->fields['countries_id'], 'title' => $customer_address->fields['countries_name'], 'iso_code_2' => $customer_address->fields['countries_iso_code_2'], 'iso_code_3' => $customer_address->fields['countries_iso_code_3']),
                                        'format_id' => (int)$customer_address->fields['address_format_id'],
                                        'telephone' => $customer_address->fields['customers_telephone'],
                                        'email_address' => $customer_address->fields['customers_email_address']);
            
                $this->delivery = array('firstname' => $shipping_address->fields['entry_firstname'],
                                        'lastname' => $shipping_address->fields['entry_lastname'],
                                        'company' => $shipping_address->fields['entry_company'],
                                        'street_address' => $shipping_address->fields['entry_street_address'],
                                        'suburb' => $shipping_address->fields['entry_suburb'],
                                        'city' => $shipping_address->fields['entry_city'],
                                        'postcode' => $shipping_address->fields['entry_postcode'],
                                        'state' => ((zen_not_null($shipping_address->fields['entry_state'])) ? $shipping_address->fields['entry_state'] : $shipping_address->fields['zone_name']),
                                        'zone_id' => $shipping_address->fields['entry_zone_id'],
                                        'country' => array('id' => $shipping_address->fields['countries_id'], 'title' => $shipping_address->fields['countries_name'], 'iso_code_2' => $shipping_address->fields['countries_iso_code_2'], 'iso_code_3' => $shipping_address->fields['countries_iso_code_3']),
                                        'country_id' => $shipping_address->fields['entry_country_id'],
                                        'format_id' => (int)$shipping_address->fields['address_format_id']);
            
                $this->billing = array('firstname' => $billing_address->fields['entry_firstname'],
                                       'lastname' => $billing_address->fields['entry_lastname'],
                                       'company' => $billing_address->fields['entry_company'],
                                       'street_address' => $billing_address->fields['entry_street_address'],
                                       'suburb' => $billing_address->fields['entry_suburb'],
                                       'city' => $billing_address->fields['entry_city'],
                                       'postcode' => $billing_address->fields['entry_postcode'],
                                       'state' => ((zen_not_null($billing_address->fields['entry_state'])) ? $billing_address->fields['entry_state'] : $billing_address->fields['zone_name']),
                                       'zone_id' => $billing_address->fields['entry_zone_id'],
                                       'country' => array('id' => $billing_address->fields['countries_id'], 'title' => $billing_address->fields['countries_name'], 'iso_code_2' => $billing_address->fields['countries_iso_code_2'], 'iso_code_3' => $billing_address->fields['countries_iso_code_3']),
                                       'country_id' => $billing_address->fields['entry_country_id'],
                                       'format_id' => (int)$billing_address->fields['address_format_id']);
            
                $index = 0;
                $products = $_SESSION['cart']->get_products();
                for ($i=0, $n=sizeof($products); $i<$n; $i++) {
                  if (($i/2) == floor($i/2)) {
                    $rowClass="rowEven";
                  } else {
                    $rowClass="rowOdd";
                  }
                  $this->products[$index] = array('qty' => $products[$i]['quantity'],
                                                  'name' => $products[$i]['name'],
                                                  'model' => $products[$i]['model'],
                                                  'tax' => zen_get_tax_rate($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']),
                                                  'tax_description' => zen_get_tax_description($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']),
                                                  'price' => $products[$i]['price'],
                                                  'final_price' => $products[$i]['price'] + $_SESSION['cart']->attributes_price($products[$i]['id']),
                                                  'onetime_charges' => $_SESSION['cart']->attributes_price_onetime_charges($products[$i]['id'], $products[$i]['quantity']),
                                                  'weight' => $products[$i]['weight'],
                                                  'products_priced_by_attribute' => $products[$i]['products_priced_by_attribute'],
                                                  'product_is_free' => $products[$i]['product_is_free'],
                                                  'products_discount_type' => $products[$i]['products_discount_type'],
                                                  'products_discount_type_from' => $products[$i]['products_discount_type_from'],
                                                  'id' => $products[$i]['id'],
                                                  'rowClass' => $rowClass);
            
                  if ($products[$i]['attributes']) {
                    $subindex = 0;
                    reset($products[$i]['attributes']);
                    while (list($option, $value) = each($products[$i]['attributes'])) {
                      /*
                      //clr 030714 Determine if attribute is a text attribute and change products array if it is.
                      if ($value == PRODUCTS_OPTIONS_VALUES_TEXT_ID){
                      $attr_value = $products[$i]['attributes_values'][$option];
                      } else {
                      $attr_value = $attributes->fields['products_options_values_name'];
                      }
                      */
            
                      $attributes_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 = '" . (int)$products[$i]['id'] . "'
                                               and pa.options_id = '" . (int)$option . "'
                                               and pa.options_id = popt.products_options_id
                                               and pa.options_values_id = '" . (int)$value . "'
                                               and pa.options_values_id = poval.products_options_values_id
                                               and popt.language_id = '" . (int)$_SESSION['languages_id'] . "'
                                               and poval.language_id = '" . (int)$_SESSION['languages_id'] . "'";
            
                      $attributes = $db->Execute($attributes_query);
            
                      //clr 030714 Determine if attribute is a text attribute and change products array if it is.
                      if ($value == PRODUCTS_OPTIONS_VALUES_TEXT_ID){
                        $attr_value = $products[$i]['attributes_values'][$option];
                      } else {
                        $attr_value = $attributes->fields['products_options_values_name'];
                      }
            
                      $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options_name'],
                                                                               'value' => $attr_value,
                                                                               'option_id' => $option,
                                                                               'value_id' => $value,
                                                                               'prefix' => $attributes->fields['price_prefix'],
                                                                               'price' => $attributes->fields['options_values_price']);
            
                      $subindex++;
                    }
                  }
            
                  // add onetime charges here
                  //$_SESSION['cart']->attributes_price_onetime_charges($products[$i]['id'], $products[$i]['quantity'])
            
                  /*********************************************
                   * Calculate taxes for this product
                   *********************************************/
                  $shown_price = (zen_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty'])
                  + zen_add_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']);
                  $this->info['subtotal'] += $shown_price;
            
                  // find product's tax rate and description
                  $products_tax = $this->products[$index]['tax'];
                  $products_tax_description = $this->products[$index]['tax_description'];
            
                  if (DISPLAY_PRICE_WITH_TAX == 'true') {
                    // calculate the amount of tax "inc"luded in price (used if tax-in pricing is enabled)
                    $tax_add = $shown_price - ($shown_price / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));
                  } else {
                    // calculate the amount of tax for this product (assuming tax is NOT included in the price)
                    $tax_add = zen_round(($products_tax / 100) * $shown_price, $currencies->currencies[$this->info['currency']]['decimal_places']);
                  }
                  $this->info['tax'] += $tax_add;
                  if (isset($this->info['tax_groups'][$products_tax_description])) {
                    $this->info['tax_groups'][$products_tax_description] += $tax_add;
                  } else {
                    $this->info['tax_groups'][$products_tax_description] = $tax_add;
                  }
                  /*********************************************
                   * END: Calculate taxes for this product
                   *********************************************/
                  $index++;
                }
            
                // Update the final total to include tax if not already tax-inc
                if (DISPLAY_PRICE_WITH_TAX == 'true') {
                  $this->info['total'] = $this->info['subtotal'] + $this->info['shipping_cost'];
                } else {
                  $this->info['total'] = $this->info['subtotal'] + $this->info['tax'] + $this->info['shipping_cost'];
                }
            
            /*
            // moved to function create
                if ($this->info['total'] == 0) {
                  if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                    $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                  } else {
                    $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                  }
                }
            */
                if (isset($GLOBALS[$class]) && is_object($GLOBALS[$class])) {
                  if ( isset($GLOBALS[$class]->order_status) && is_numeric($GLOBALS[$class]->order_status) && ($GLOBALS[$class]->order_status > 0) ) {
                    $this->info['order_status'] = $GLOBALS[$class]->order_status;
                  }
                }
            
              }
            
              function create($zf_ot_modules, $zf_mode = 2) {
                global $db, $zco_notifier;
            
                if ($this->info['total'] == 0) {
                  if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
                    $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
                  } else {
                    if ($_SESSION['payment'] != 'freecharger') {
                      $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
                    }
                  }
                }
            
                if ($_SESSION['shipping'] == 'free_free') {
                  $this->info['shipping_module_code'] = $_SESSION['shipping'];
                }
            
                $sql_data_array = array('customers_id' => $_SESSION['customer_id'],
                                        'customers_name' => $this->customer['firstname'] . ' ' . $this->customer['lastname'],
                                        'customers_company' => $this->customer['company'],
                                        'customers_street_address' => $this->customer['street_address'],
                                        'customers_suburb' => $this->customer['suburb'],
                                        'customers_city' => $this->customer['city'],
                                        'customers_postcode' => $this->customer['postcode'],
                                        'customers_state' => $this->customer['state'],
                                        'customers_country' => $this->customer['country']['title'],
                                        'customers_telephone' => $this->customer['telephone'],
                                        'customers_email_address' => $this->customer['email_address'],
                                        'customers_address_format_id' => $this->customer['format_id'],
                                        'delivery_name' => $this->delivery['firstname'] . ' ' . $this->delivery['lastname'],
                                        'delivery_company' => $this->delivery['company'],
                                        'delivery_street_address' => $this->delivery['street_address'],
                                        'delivery_suburb' => $this->delivery['suburb'],
                                        'delivery_city' => $this->delivery['city'],
                                        'delivery_postcode' => $this->delivery['postcode'],
                                        'delivery_state' => $this->delivery['state'],
                                        'delivery_country' => $this->delivery['country']['title'],
                                        'delivery_address_format_id' => $this->delivery['format_id'],
                                        'billing_name' => $this->billing['firstname'] . ' ' . $this->billing['lastname'],
                                        'billing_company' => $this->billing['company'],
                                        'billing_street_address' => $this->billing['street_address'],
                                        'billing_suburb' => $this->billing['suburb'],
                                        'billing_city' => $this->billing['city'],
                                        'billing_postcode' => $this->billing['postcode'],
                                        'billing_state' => $this->billing['state'],
                                        'billing_country' => $this->billing['country']['title'],
                                        'billing_address_format_id' => $this->billing['format_id'],
                                        'payment_method' => (($this->info['payment_module_code'] == '' and $this->info['payment_method'] == '') ? PAYMENT_METHOD_GV : $this->info['payment_method']),
                                        'payment_module_code' => (($this->info['payment_module_code'] == '' and $this->info['payment_method'] == '') ? PAYMENT_MODULE_GV : $this->info['payment_module_code']),
                                        'shipping_method' => $this->info['shipping_method'],
                                        'shipping_module_code' => (strpos($this->info['shipping_module_code'], '_') > 0 ? substr($this->info['shipping_module_code'], 0, strpos($this->info['shipping_module_code'], '_')) : $this->info['shipping_module_code']),
                                        'coupon_code' => $this->info['coupon_code'],
                                        'cc_type' => $this->info['cc_type'],
                                        'cc_owner' => $this->info['cc_owner'],
                                        'cc_number' => $this->info['cc_number'],
                                        'cc_expires' => $this->info['cc_expires'],
                                        'date_purchased' => 'now()',
                                        'orders_status' => $this->info['order_status'],
                                        'order_total' => $this->info['total'],
                                        'order_tax' => $this->info['tax'],
                                        'currency' => $this->info['currency'],
                                        'currency_value' => $this->info['currency_value'],
                                        'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
                                        );
            
            if ($_SESSION['COWOA'])
                  $sql_data_array[COWOA_order] = 1;
            
            
                zen_db_perform(TABLE_ORDERS, $sql_data_array);
            
                $insert_id = $db->Insert_ID();
            
                $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDER_HEADER', array_merge(array('orders_id' => $insert_id, 'shipping_weight' => $_SESSION['cart']->weight), $sql_data_array));
            
                for ($i=0, $n=sizeof($zf_ot_modules); $i<$n; $i++) {
                  $sql_data_array = array('orders_id' => $insert_id,
                                          'title' => $zf_ot_modules[$i]['title'],
                                          'text' => $zf_ot_modules[$i]['text'],
                                          'value' => $zf_ot_modules[$i]['value'],
                                          'class' => $zf_ot_modules[$i]['code'],
                                          'sort_order' => $zf_ot_modules[$i]['sort_order']);
            
                  zen_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
            
                  $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDERTOTAL_LINE_ITEM', $sql_data_array);
                }
            
                $customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';
                $sql_data_array = array('orders_id' => $insert_id,
                                        'orders_status_id' => $this->info['order_status'],
                                        'date_added' => 'now()',
                                        'customer_notified' => $customer_notification,
                                        'comments' => $this->info['comments']);
            
                zen_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
            
                $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ORDER_COMMENT', $sql_data_array);
            
                return($insert_id);
            
              }
            
            
              function  create_add_products($zf_insert_id, $zf_mode = false) {
                global $db, $currencies, $order_total_modules, $order_totals, $zco_notifier;
            
                // initialized for the email confirmation
            
                $this->products_ordered = '';
                $this->products_ordered_html = '';
                $this->subtotal = 0;
                $this->total_tax = 0;
            
                // lowstock email report
                $this->email_low_stock='';
            
                for ($i=0, $n=sizeof($this->products); $i<$n; $i++) {
                  $custom_insertable_text = '';
                  // Stock Update - Joao Correia
                  if (STOCK_LIMITED == 'true') {
                    if (DOWNLOAD_ENABLED == 'true') {
                      $stock_query_raw = "select p.products_quantity, pad.products_attributes_filename, p.product_is_always_free_shipping
                                          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 = '" . zen_get_prid($this->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 = $this->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_values = $db->Execute($stock_query_raw);
                    } else {
                      $stock_values = $db->Execute("select * from " . TABLE_PRODUCTS . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
                    }
            
                    $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN');
            
                    if ($stock_values->RecordCount() > 0) {
                      // do not decrement quantities if products_attributes_filename exists
                      if ((DOWNLOAD_ENABLED != 'true') || $stock_values->fields['product_is_always_free_shipping'] == 2 || (!$stock_values->fields['products_attributes_filename']) ) {
                        $stock_left = $stock_values->fields['products_quantity'] - $this->products[$i]['qty'];
                        $this->products[$i]['stock_reduce'] = $this->products[$i]['qty'];
                      } else {
                        $stock_left = $stock_values->fields['products_quantity'];
                      }
            
                      //            $this->products[$i]['stock_value'] = $stock_values->fields['products_quantity'];
            
                      $db->Execute("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
            
                        // kuroi: Begin Stock by Attributes additions
                        // added to update quantities of products with attributes
                        $attribute_search = array();
                        $attribute_stock_left = STOCK_REORDER_LEVEL + 1;  // kuroi: prevent false low stock triggers  
            
                        if(isset($this->products[$i]['attributes']) and sizeof($this->products[$i]['attributes']) >0){
                            foreach($this->products[$i]['attributes'] as $attributes){
                                $attribute_search[] = $attributes['value_id'];
                            }
                        
                            if(sizeof($attribute_search) > 1){
                                $attribute_search = 'where options_values_id in ("'.implode('","', $attribute_search).'")';
                            } else {
                                $attribute_search = 'where options_values_id="' . $attribute_search[0].'"';
                            }
            
                            $query = 'select products_attributes_id from ' . TABLE_PRODUCTS_ATTRIBUTES . ' ' . $attribute_search .' and products_id="' . zen_get_prid($this->products[$i]['id']) . '" order by products_attributes_id';
                            $attributes = $db->Execute($query);
                            $stock_attributes_search = array();
                            while(!$attributes->EOF){
                                $stock_attributes_search[] = $attributes->fields['products_attributes_id'];    
                                $attributes->MoveNext();
                            }
                            if(sizeof($stock_attributes_search) > 1){
                                $stock_attributes_search = implode(',', $stock_attributes_search);
                            } else {
                                foreach($stock_attributes_search as $attribute_search){
                                    $stock_attributes_search1 = $attribute_search;
                                }
                                $stock_attributes_search = $stock_attributes_search1;
                            }
                            
                            $get_quantity_query = 'select quantity from ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
            
                          $attribute_stock_available = $db->Execute($get_quantity_query);    
                            $attribute_stock_left = $attribute_stock_available->fields['quantity'] - $this->products[$i]['qty'];
                
                            $attribute_update_query = 'update ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' set quantity='.$attribute_stock_left.' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
                            $db->Execute($attribute_update_query);    
                        }
                        // kuroi: End Stock by Attribute additions
            
                      //        if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
                      if ($stock_left <= 0) {
                        // only set status to off when not displaying sold out
                        if (SHOW_PRODUCTS_SOLD_OUT == '0') {
                          $db->Execute("update " . TABLE_PRODUCTS . " set products_status = 0 where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
                        }
                      }
            
                      // for low stock email
                      if ( $stock_left <= STOCK_REORDER_LEVEL ) {
                        // WebMakers.com Added: add to low stock email
                        $this->email_low_stock .=  'ID# ' . zen_get_prid($this->products[$i]['id']) . ', ' . $this->products[$i]['model'] . ', ' . $this->products[$i]['name'] . ', ' . 'Stock: ' . $stock_left . "\n\n";
                      // kuroi: trigger and details for attribute low stock email
                      } elseif ($attribute_stock_left <= STOCK_REORDER_LEVEL) {
                        $this->email_low_stock .=  'ID# ' . zen_get_prid($this->products[$i]['id']) . ', ' . $this->products[$i]['model'] . ', ' . $this->products[$i]['name'] . ', ';
                                    foreach($this->products[$i]['attributes'] as $attributes){
                                        $this->email_low_stock .= $attributes['option'] . ': ' . $attributes['value'] . ', ';
                                    }
                                    $this->email_low_stock .= 'Stock: ' . $attribute_stock_left . "\n\n";
                      }
                    }
                  }
            
                  // Update products_ordered (for bestsellers list)
                  //    $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . zen_get_prid($order->products[$i]['id']) . "'");
                  $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%f', $this->products[$i]['qty']) . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
            
                  $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END');
            
                  $sql_data_array = array('orders_id' => $zf_insert_id,
                                          'products_id' => zen_get_prid($this->products[$i]['id']),
                                          'products_model' => $this->products[$i]['model'],
                                          'products_name' => $this->products[$i]['name'],
                                          'products_price' => $this->products[$i]['price'],
                                          'final_price' => $this->products[$i]['final_price'],
                                          'onetime_charges' => $this->products[$i]['onetime_charges'],
                                          'products_tax' => $this->products[$i]['tax'],
                                          'products_quantity' => $this->products[$i]['qty'],
                                          'products_priced_by_attribute' => $this->products[$i]['products_priced_by_attribute'],
                                          'product_is_free' => $this->products[$i]['product_is_free'],
                                          'products_discount_type' => $this->products[$i]['products_discount_type'],
                                          'products_discount_type_from' => $this->products[$i]['products_discount_type_from'],
                                          'products_prid' => $this->products[$i]['id']);
                  zen_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
            
                  $order_products_id = $db->Insert_ID();
            
                  $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_PRODUCT_LINE_ITEM', array_merge(array('orders_products_id' => $order_products_id), $sql_data_array));
            
                  $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_CREDIT_ACCOUNT_UPDATE_BEGIN');
                  $order_total_modules->update_credit_account($i);//ICW ADDED FOR CREDIT CLASS SYSTEM
            
                  $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_ATTRIBUTES_BEGIN');
            
                  //------ bof: insert customer-chosen options to order--------
                  $attributes_exist = '0';
                  $this->products_ordered_attributes = '';
                  if (isset($this->products[$i]['attributes'])) {
                    $attributes_exist = '1';
                    for ($j=0, $n2=sizeof($this->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,
                                             pa.product_attribute_is_free, pa.products_attributes_weight, pa.products_attributes_weight_prefix,
                                             pa.attributes_discounted, pa.attributes_price_base_included, pa.attributes_price_onetime,
                                             pa.attributes_price_factor, pa.attributes_price_factor_offset,
                                             pa.attributes_price_factor_onetime, pa.attributes_price_factor_onetime_offset,
                                             pa.attributes_qty_prices, pa.attributes_qty_prices_onetime,
                                             pa.attributes_price_words, pa.attributes_price_words_free,
                                             pa.attributes_price_letters, pa.attributes_price_letters_free,
                                             pad.products_attributes_maxdays, pad.products_attributes_maxcount, pad.products_attributes_filename,
                                             pa.product_attribute_is_free, pa.attributes_discounted
                                             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 = '" . zen_db_input($this->products[$i]['id']) . "'
                                              and pa.options_id = '" . $this->products[$i]['attributes'][$j]['option_id'] . "'
                                              and pa.options_id = popt.products_options_id
                                              and pa.options_values_id = '" . $this->products[$i]['attributes'][$j]['value_id'] . "'
                                              and pa.options_values_id = poval.products_options_values_id
                                              and popt.language_id = '" . $_SESSION['languages_id'] . "'
                                              and poval.language_id = '" . $_SESSION['languages_id'] . "'";
            
                        $attributes_values = $db->Execute($attributes_query);
                      } else {
                        $attributes_values = $db->Execute("select popt.products_options_name, poval.products_options_values_name,
                                             pa.options_values_price, pa.price_prefix,
                                             pa.product_attribute_is_free, pa.products_attributes_weight, pa.products_attributes_weight_prefix,
                                             pa.attributes_discounted, pa.attributes_price_base_included, pa.attributes_price_onetime,
                                             pa.attributes_price_factor, pa.attributes_price_factor_offset,
                                             pa.attributes_price_factor_onetime, pa.attributes_price_factor_onetime_offset,
                                             pa.attributes_qty_prices, pa.attributes_qty_prices_onetime,
                                             pa.attributes_price_words, pa.attributes_price_words_free,
                                             pa.attributes_price_letters, pa.attributes_price_letters_free
                                             from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                                             where pa.products_id = '" . $this->products[$i]['id'] . "' and pa.options_id = '" . (int)$this->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . (int)$this->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $_SESSION['languages_id'] . "' and poval.language_id = '" . $_SESSION['languages_id'] . "'");
                      }
            
                      //clr 030714 update insert query.  changing to use values form $order->products for products_options_values.
                      $sql_data_array = array('orders_id' => $zf_insert_id,
                                              'orders_products_id' => $order_products_id,
                                              'products_options' => $attributes_values->fields['products_options_name'],
            
                      //                                 'products_options_values' => $attributes_values->fields['products_options_values_name'],
                                              'products_options_values' => $this->products[$i]['attributes'][$j]['value'],
                                              'options_values_price' => $attributes_values->fields['options_values_price'],
                                              'price_prefix' => $attributes_values->fields['price_prefix'],
                                              'product_attribute_is_free' => $attributes_values->fields['product_attribute_is_free'],
                                              'products_attributes_weight' => $attributes_values->fields['products_attributes_weight'],
                                              'products_attributes_weight_prefix' => $attributes_values->fields['products_attributes_weight_prefix'],
                                              'attributes_discounted' => $attributes_values->fields['attributes_discounted'],
                                              'attributes_price_base_included' => $attributes_values->fields['attributes_price_base_included'],
                                              'attributes_price_onetime' => $attributes_values->fields['attributes_price_onetime'],
                                              'attributes_price_factor' => $attributes_values->fields['attributes_price_factor'],
                                              'attributes_price_factor_offset' => $attributes_values->fields['attributes_price_factor_offset'],
                                              'attributes_price_factor_onetime' => $attributes_values->fields['attributes_price_factor_onetime'],
                                              'attributes_price_factor_onetime_offset' => $attributes_values->fields['attributes_price_factor_onetime_offset'],
                                              'attributes_qty_prices' => $attributes_values->fields['attributes_qty_prices'],
                                              'attributes_qty_prices_onetime' => $attributes_values->fields['attributes_qty_prices_onetime'],
                                              'attributes_price_words' => $attributes_values->fields['attributes_price_words'],
                                              'attributes_price_words_free' => $attributes_values->fields['attributes_price_words_free'],
                                              'attributes_price_letters' => $attributes_values->fields['attributes_price_letters'],
                                              'attributes_price_letters_free' => $attributes_values->fields['attributes_price_letters_free'],
                                              'products_options_id' => (int)$this->products[$i]['attributes'][$j]['option_id'],
                                              'products_options_values_id' => (int)$this->products[$i]['attributes'][$j]['value_id'],
                                              'products_prid' => $this->products[$i]['id']
                                              );
            
            
                      zen_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
            
                      $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ATTRIBUTE_LINE_ITEM', $sql_data_array);
            
                      if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values->fields['products_attributes_filename']) && zen_not_null($attributes_values->fields['products_attributes_filename'])) {
                        $sql_data_array = array('orders_id' => $zf_insert_id,
                                                'orders_products_id' => $order_products_id,
                                                'orders_products_filename' => $attributes_values->fields['products_attributes_filename'],
                                                'download_maxdays' => $attributes_values->fields['products_attributes_maxdays'],
                                                'download_count' => $attributes_values->fields['products_attributes_maxcount'],
                                                'products_prid' => $this->products[$i]['id']
                                                );
            
                        zen_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
            
                        $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ATTRIBUTE_DOWNLOAD_LINE_ITEM', $sql_data_array);
                      }
                      //clr 030714 changing to use values from $orders->products and adding call to zen_decode_specialchars()
                      //        $this->products_ordered_attributes .= "\n\t" . $attributes_values->fields['products_options_name'] . ' ' . $attributes_values->fields['products_options_values_name'];
                      $this->products_ordered_attributes .= "\n\t" . $attributes_values->fields['products_options_name'] . ' ' . zen_decode_specialchars($this->products[$i]['attributes'][$j]['value']);
                    }
                  }
                  //------eof: insert customer-chosen options ----
            
                $zco_notifier->notify('NOTIFY_ORDER_DURING_CREATE_ADD_PRODUCTS', $custom_insertable_text);
            
            /* START: ADD MY CUSTOM DETAILS
             * 1. calculate/prepare custom information to be added to this product entry in order-confirmation.
             * 2. Add that data to the $this->products_ordered_attributes variable, using this sort of format:
             *      $this->products_ordered_attributes .=  {INSERT CUSTOM INFORMATION HERE};
             */
            
                $this->products_ordered_attributes .= ''; // $custom_insertable_text;
            
            /* END: ADD MY CUSTOM DETAILS */
            
                  // update totals counters
                  $this->total_weight += ($this->products[$i]['qty'] * $this->products[$i]['weight']);
                  $this->total_tax += zen_calculate_tax($total_products_price, $products_tax) * $this->products[$i]['qty'];
                  $this->total_cost += $total_products_price;
            
                  $zco_notifier->notify('NOTIFY_ORDER_PROCESSING_ONE_TIME_CHARGES_BEGIN');
            
                  // build output for email notification
                  $this->products_ordered .=  $this->products[$i]['qty'] . ' x ' . $this->products[$i]['name'] . ($this->products[$i]['model'] != '' ? ' (' . $this->products[$i]['model'] . ') ' : '') . ' = ' .
                  $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
                  ($this->products[$i]['onetime_charges'] !=0 ? "\n" . TEXT_ONETIME_CHARGES_EMAIL . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
                  $this->products_ordered_attributes . "\n";
                  $this->products_ordered_html .=
                  '<tr>' . "\n" .
                  '<td class="product-details" align="right" valign="top" width="30">' . $this->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
                  '<td class="product-details" valign="top">' . nl2br($this->products[$i]['name']) . ($this->products[$i]['model'] != '' ? ' (' . nl2br($this->products[$i]['model']) . ') ' : '') . "\n" .
                  '<nobr><small><em> '. nl2br($this->products_ordered_attributes) .'</em></small></nobr></td>' . "\n" .
                  '<td class="product-details-num" valign="top" align="right">' .
                  $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
                  ($this->products[$i]['onetime_charges'] !=0 ?
                  '</td></tr>' . "\n" . '<tr><td class="product-details">' . nl2br(TEXT_ONETIME_CHARGES_EMAIL) . '</td>' . "\n" .
                  '<td>' . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
                  '</td></tr>' . "\n";
                }
            
                $order_total_modules->apply_credit();//ICW ADDED FOR CREDIT CLASS SYSTEM
                $zco_notifier->notify('NOTIFY_ORDER_AFTER_ORDER_CREATE_ADD_PRODUCTS');
              }
            
            
              function send_order_email($zf_insert_id, $zf_mode) {
                global $currencies, $order_totals, $zco_notifier;
            
                //      print_r($this);
                //      die();
                if ($this->email_low_stock != '' and SEND_LOWSTOCK_EMAIL=='1') {
                  // send an email
                  $email_low_stock = SEND_EXTRA_LOW_STOCK_EMAIL_TITLE . "\n\n" . $this->email_low_stock;
                  zen_mail('', SEND_EXTRA_LOW_STOCK_EMAILS_TO, EMAIL_TEXT_SUBJECT_LOWSTOCK, $email_low_stock, STORE_OWNER, EMAIL_FROM, array('EMAIL_MESSAGE_HTML' => nl2br($email_low_stock)),'low_stock');
                }
            
                // lets start with the email confirmation
                // make an array to store the html version
                $html_msg=array();
            
               // COWOA Conditional
                if ($_SESSION['COWOA'])
                {
                $invoiceInfo="";
                $htmlInvoiceURL="";
                $htmlInvoiceValue="";
                }
                else
                
            
            
            
                //intro area
                $email_order = EMAIL_TEXT_HEADER . EMAIL_TEXT_FROM . STORE_NAME . "\n\n" .
                $this->customer['firstname'] . ' ' . $this->customer['lastname'] . "\n\n" .
                EMAIL_THANKS_FOR_SHOPPING . "\n" . EMAIL_DETAILS_FOLLOW . "\n" .
                EMAIL_SEPARATOR . "\n" .
                EMAIL_TEXT_ORDER_NUMBER . ' ' . $zf_insert_id . "\n" .
                EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n" . $invoiceInfo;
                $html_msg['EMAIL_TEXT_HEADER']     = EMAIL_TEXT_HEADER;
                $html_msg['EMAIL_TEXT_FROM']       = EMAIL_TEXT_FROM;
                $html_msg['INTRO_STORE_NAME']      = STORE_NAME;
                $html_msg['EMAIL_THANKS_FOR_SHOPPING'] = EMAIL_THANKS_FOR_SHOPPING;
                $html_msg['EMAIL_DETAILS_FOLLOW']  = EMAIL_DETAILS_FOLLOW;
                $html_msg['INTRO_ORDER_NUM_TITLE'] = EMAIL_TEXT_ORDER_NUMBER;
                $html_msg['INTRO_ORDER_NUMBER']    = $zf_insert_id;
                $html_msg['INTRO_DATE_TITLE']      = EMAIL_TEXT_DATE_ORDERED;
                $html_msg['INTRO_DATE_ORDERED']    = strftime(DATE_FORMAT_LONG);
                $html_msg['INTRO_URL_TEXT']        = $htmlInvoiceURL;
                $html_msg['INTRO_URL_VALUE']       = $htmlInvoiceValue;
            
            
                //comments area
                if ($this->info['comments']) {
                  $email_order .= zen_db_output($this->info['comments']) . "\n\n";
                  $html_msg['ORDER_COMMENTS'] = nl2br(zen_db_output($this->info['comments']));
                } else {
                  $html_msg['ORDER_COMMENTS'] = '';
                }
            
                //products area
                $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
                EMAIL_SEPARATOR . "\n" .
                $this->products_ordered .
                EMAIL_SEPARATOR . "\n";
                $html_msg['PRODUCTS_TITLE'] = EMAIL_TEXT_PRODUCTS;
                $html_msg['PRODUCTS_DETAIL']='<table class="product-details" border="0" width="100%" cellspacing="0" cellpadding="2">' . $this->products_ordered_html . '</table>';
            
                //order totals area
                $html_ot .= '<td class="order-totals-text" align="right" width="100%">' . '&nbsp;' . '</td> ' . "\n" . '<td class="order-totals-num" align="right" nowrap="nowrap">' . '---------' .'</td> </tr>' . "\n" . '<tr>';
                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";
                  $html_ot .= '<td class="order-totals-text" align="right" width="100%">' . $order_totals[$i]['title'] . '</td> ' . "\n" . '<td class="order-totals-num" align="right" nowrap="nowrap">' .($order_totals[$i]['text']) .'</td> </tr>' . "\n" . '<tr>';
                }
                $html_msg['ORDER_TOTALS'] = '<table border="0" width="100%" cellspacing="0" cellpadding="2"> ' . $html_ot . ' </table>';
            
                //addresses area: Delivery
                $html_msg['HEADING_ADDRESS_INFORMATION']= HEADING_ADDRESS_INFORMATION;
                $html_msg['ADDRESS_DELIVERY_TITLE']     = EMAIL_TEXT_DELIVERY_ADDRESS;
                $html_msg['ADDRESS_DELIVERY_DETAIL']    = ($this->content_type != 'virtual') ? zen_address_label($_SESSION['customer_id'], $_SESSION['sendto'], true, '', "<br />") : 'n/a';
                $html_msg['SHIPPING_METHOD_TITLE']      = HEADING_SHIPPING_METHOD;
                $html_msg['SHIPPING_METHOD_DETAIL']     = (zen_not_null($this->info['shipping_method'])) ? $this->info['shipping_method'] : 'n/a';
            
                if ($this->content_type != 'virtual') {
                  $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
                  EMAIL_SEPARATOR . "\n" .
                  zen_address_label($_SESSION['customer_id'], $_SESSION['sendto'], 0, '', "\n") . "\n";
                }
            
                //addresses area: Billing
                $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
                EMAIL_SEPARATOR . "\n" .
                zen_address_label($_SESSION['customer_id'], $_SESSION['billto'], 0, '', "\n") . "\n\n";
                $html_msg['ADDRESS_BILLING_TITLE']   = EMAIL_TEXT_BILLING_ADDRESS;
                $html_msg['ADDRESS_BILLING_DETAIL']  = zen_address_label($_SESSION['customer_id'], $_SESSION['billto'], true, '', "<br />");
            
                if (is_object($GLOBALS[$_SESSION['payment']])) {
                  $cc_num_display = (isset($this->info['cc_number']) && $this->info['cc_number'] != '') ? substr($this->info['cc_number'], 0, 4) . str_repeat('X', (strlen($this->info['cc_number']) - 8)) . substr($this->info['cc_number'], -4) . "\n\n" : '';
                  $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
                  EMAIL_SEPARATOR . "\n";
                  $payment_class = $_SESSION['payment'];
                  $email_order .= $GLOBALS[$payment_class]->title . "\n\n";
                  $email_order .= (isset($this->info['cc_type']) && $this->info['cc_type'] != '') ? $this->info['cc_type'] . ' ' . $cc_num_display . "\n\n" : '';
                  $email_order .= ($GLOBALS[$payment_class]->email_footer) ? $GLOBALS[$payment_class]->email_footer . "\n\n" : '';
                } else {
                  $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
                  EMAIL_SEPARATOR . "\n";
                  $email_order .= PAYMENT_METHOD_GV . "\n\n";
                }
                $html_msg['PAYMENT_METHOD_TITLE']  = EMAIL_TEXT_PAYMENT_METHOD;
                $html_msg['PAYMENT_METHOD_DETAIL'] = (is_object($GLOBALS[$_SESSION['payment']]) ? $GLOBALS[$payment_class]->title : PAYMENT_METHOD_GV );
                $html_msg['PAYMENT_METHOD_FOOTER'] = (is_object($GLOBALS[$_SESSION['payment']]) && $GLOBALS[$payment_class]->email_footer != '') ? nl2br($GLOBALS[$payment_class]->email_footer) : (isset($this->info['cc_type']) && $this->info['cc_type'] != '' ? $this->info['cc_type'] . ' ' . $cc_num_display . "\n\n" : '');
            
                // include disclaimer
                $email_order .= "\n-----\n" . sprintf(EMAIL_DISCLAIMER, STORE_OWNER_EMAIL_ADDRESS) . "\n\n";
                // include copyright
                $email_order .= "\n-----\n" . EMAIL_FOOTER_COPYRIGHT . "\n\n";
            
                while (strstr($email_order, '&nbsp;')) $email_order = str_replace('&nbsp;', ' ', $email_order);
            
                $html_msg['EMAIL_FIRST_NAME'] = $this->customer['firstname'];
                $html_msg['EMAIL_LAST_NAME'] = $this->customer['lastname'];
                //  $html_msg['EMAIL_TEXT_HEADER'] = EMAIL_TEXT_HEADER;
                $html_msg['EXTRA_INFO'] = '';
                $zco_notifier->notify('NOTIFY_ORDER_INVOICE_CONTENT_READY_TO_SEND', array('zf_insert_id' => $zf_insert_id, 'text_email' => $email_order, 'html_email' => $html_msg));
            
                // BOF rl_invoice3
                $this->attachArray = array();
                if(RL_INVOICE3_SEND_PDF=='1'){
                    if(!(0==$this->info['total'] && RL_INVOICE3_NOT_NULL_INVOICE==0)){     
                        if( (defined('RL_INVOICE3_ORDERSTATUS')) && ($this->info['order_status'] >= RL_INVOICE3_ORDERSTATUS)) {
                            require_once(DIR_WS_INCLUDES . 'classes/class.rl_invoice3.php');
                            
                            $pdfT = new rl_invoice3($zf_insert_id, $paper['orientation'], $paper['unit'], $paper['format']);
                            $pdfT -> createPdfFile(true);
                            $this->attachArray = $pdfT->getPDFAttachments();
                            #$this->attachArray[] = array('file'=>$x, 'mime_type'=>'pdf');
                        }
                    }
                }
                zen_mail($this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id, $email_order, STORE_NAME, EMAIL_FROM, $html_msg, 'checkout', $this->attachArray);
                // EOF rl_invoice3
                
                // send additional emails
                if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
                  $extra_info=email_collect_extra_info('','', $this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], $this->customer['telephone']);
                  $html_msg['EXTRA_INFO'] = $extra_info['HTML'];
            
                  if ($GLOBALS[$_SESSION['payment']]->auth_code || $GLOBALS[$_SESSION['payment']]->transaction_id) {
                    $pmt_details = 'AuthCode: ' . $GLOBALS[$_SESSION['payment']]->auth_code . '  TransID: ' . $GLOBALS[$_SESSION['payment']]->transaction_id . "\n\n";
                    $email_order = $pmt_details . $email_order;
                    $html_msg['EMAIL_TEXT_HEADER'] = nl2br($pmt_details) . $html_msg['EMAIL_TEXT_HEADER'];
                  }
            
                  if(method_exists($pdfT, "getPDFAttachments")){
                    $this->attachArray = $pdfT->getPDFAttachments('NO');
                  }
                  zen_mail('', SEND_EXTRA_ORDER_EMAILS_TO, SEND_EXTRA_NEW_ORDERS_EMAILS_TO_SUBJECT . ' ' . EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id,
                  $email_order . $extra_info['TEXT'], STORE_NAME, EMAIL_FROM, $html_msg, 'checkout_extra', $this->attachArray);
                }
                $zco_notifier->notify('NOTIFY_ORDER_AFTER_SEND_ORDER_EMAIL');
              }
            
            }

            Kommentar


              #7
              gratuliere @ webchills für beitrag #3000!

              Kommentar


                #8
                Servus,

                klasse - klappt (fast) wieder. Das automatische Aktualisieren nach dem Storno einer Bestellung klappt zwar nicht mehr, aber damit kann ich gut leben!
                Bin (mal wieder) begeistert von der schellen Hilfe.

                Grüße
                Zengy

                Kommentar

                Info zu diesem Forenarchiv:
                Mit Release von 1.5.7 wurde die deutsche Zen Cart Version auf eine reine DIY-Lösung umgestellt.
                Für einen Support via Forum stehen keine personellen und zeitlichen Ressourcen mehr zur Verfügung.
                Dieses Supportforum bleibt im Nur-Lesen-Modus als Wissensarchiv noch online verfügbar.
                PM Funktionalität, Registrierung und Posten neuer Beiträge sind deaktiviert.
                Zugriff auf Anhänge in den Postings ist auch ohne Registrierung/Einloggen möglich.
                FAQ und Downloadbereich des Forums wurden in die neue umfangreiche Knowledgebase auf der zen-cart-pro.at Website übernommen.

                Das Development der deutschen Zen Cart Version geht wie bisher auf Github weiter.
                Wir werden auch weiterhin neue Versionen bereitstellen und die Onlinedokumentation/Knowledgebase aktualisieren.
                Fehler in der Software können auf Github als Issues gemeldet werden.
                Follow us
                aktuelle version
                Zen Cart 1.5.7g deutsch
                vom 12.12.2023
                [Download]
                Lädt...
                X