Ankündigung

Einklappen
Keine Ankündigung bisher.

Lagerplatz auf Pickzettel

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

    Lagerplatz auf Pickzettel

    Hallo,

    ich würde gerne wissen wie ich den Lagerplatz eines Produkts auf dem Packzettel ausgeben lassen kann?

    Ich habe eine Tabelle angelegt (products_storage) und diese dann wie folgt in der include/classes/order.php hinterlegt:
    PHP-Code:
    <?php
    /**
     * File contains the order-processing class ("order")
     *
     * @package classes
     * @copyright Copyright 2003-2015 Zen Cart Development Team
     * @license http://www.zen-cart-pro.at/license/2_0.txt GNU Public License V2.0
     * @version $Id: order.php for SBA 1.8 2015-05-18 19:12:23Z 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 
    __construct($order_id '') {
        
    $this->info = array();
        
    $this->totals = array();
        
    $this->products = array();
        
    $this->customer = array();
        
    $this->delivery = array();

        
    $this->notify('NOTIFY_ORDER_INSTANTIATE', array(), $order_id);
        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);
        
    $this->queryReturnFlag NULL;
        
    $this->notify('NOTIFY_ORDER_BEFORE_QUERY', array(), $order_id);
        if (
    $this->queryReturnFlag === TRUE) return;

        
    $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_storage, 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'],
                                           
    'storage' => $orders_products->fields['products_storage'],
                                          
    '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'],
                                                                       
    'option_id' => $attributes->fields['products_options_id'],
                                                                       
    'value_id' => $attributes->fields['products_options_values_id'],
                                                                       
    '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();
        }
        
    $this->notify('NOTIFY_ORDER_AFTER_QUERY', array(), $order_id);
      }

      function 
    cart() {
        global 
    $db$currencies;

        
    $decimals $currencies->get_decimal_places($_SESSION['currency']);
        
        
    $this->content_type $_SESSION['cart']->get_content_type();

        
    $customer_address_query "select c.customers_gender, 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);

        
    // set default tax calculation for not-logged-in visitors
        
    $taxCountryId $taxZoneId = -1;

        
    $tax_address_query '';
        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']) . "'";
          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'] . "'";
          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']) . "'";
          }
        }
        if (
    $tax_address_query != '') {
          
    $tax_address $db->Execute($tax_address_query);
          if (
    $tax_address->recordCount() > 0) {
            
    $taxCountryId $tax_address->fields['entry_country_id'];
            
    $taxZoneId $tax_address->fields['entry_zone_id'];
          }
        }

        
    $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' => (isset($_SESSION['shipping']['title'])) ? $_SESSION['shipping']['title'] : '',
                            
    'shipping_module_code' => (isset($_SESSION['shipping']['id']) && strpos($_SESSION['shipping']['id'], '_') > $_SESSION['shipping']['id'] : $_SESSION['shipping']),
                            
    'shipping_cost' => isset($_SESSION['shipping']['cost']) ? $_SESSION['shipping']['cost'] : 0,
                            
    'subtotal' => 0,
                            
    'shipping_tax' => 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('gender' => $customer_address->fields['customers_gender'],
                                
    '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";
          }
          
    $taxRates zen_get_multiple_tax_rates($products[$i]['tax_class_id'], $taxCountryId$taxZoneId);
          
    $this->products[$index] = array('qty' => $products[$i]['quantity'],
                                          
    'name' => $products[$i]['name'],
                                          
    'merkmale' => $products[$i]['merkmale'],
                                          
    'model' => $products[$i]['model'],
                                           
    'storage' => $products[$i]['storage'],
                                          
    'image' => $products[$i]['image'], 
                                          
    'tax' => zen_get_tax_rate($products[$i]['tax_class_id'], $taxCountryId$taxZoneId),
                                          
    'tax_groups'=>$taxRates,
                                          
    'tax_description' => zen_get_tax_description($products[$i]['tax_class_id'], $taxCountryId$taxZoneId),
                                          
    '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 (
    STORE_PRODUCT_TAX_BASIS == 'Shipping' && stristr($_SESSION['shipping']['id'], 'storepickup') == TRUE
          {
            
    $taxRates zen_get_multiple_tax_rates($products[$i]['tax_class_id'], STORE_COUNTRYSTORE_ZONE);
            
    $this->products[$index]['tax'] = zen_get_tax_rate($products[$i]['tax_class_id'], STORE_COUNTRYSTORE_ZONE);
          } else 
          {
            
    $taxRates zen_get_multiple_tax_rates($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']);
            
    $this->products[$index]['tax'] = zen_get_tax_rate($products[$i]['tax_class_id'], $tax_address->fields['entry_country_id'], $tax_address->fields['entry_zone_id']);
          }
          
    $this->notify('NOTIFY_ORDER_CART_ADD_PRODUCT_LIST', array('index'=>$index'products'=>$products[$i]));
          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']);

              
    $this->notify('NOTIFY_ORDER_CART_ADD_ATTRIBUTE_LIST', array('index'=>$index'subindex'=>$subindex'products'=>$products[$i], 'attributes'=>$attributes));
              
    $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]['qty'], $this->products[$index]['tax']))
          + 
    zen_add_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']);
          
    $this->info['subtotal'] += $shown_price;
          
    $this->notify('NOTIFIY_ORDER_CART_SUBTOTAL_CALCULATE', array('shown_price'=>$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']);
            
    $tax_add = ($products_tax/100) * $shown_price;
          }
          
    $this->info['tax'] += $tax_add;
          foreach (
    $taxRates as $taxDescription=>$taxRate)
          {
            
    $taxAdd zen_calculate_tax($this->products[$index]['final_price']*$this->products[$index]['qty'], $taxRate)
                    +  
    zen_calculate_tax($this->products[$index]['onetime_charges'], $taxRate);
            if (isset(
    $this->info['tax_groups'][$taxDescription]))
            {
              
    $this->info['tax_groups'][$taxDescription] += $taxAdd;
            } else
            {
              
    $this->info['tax_groups'][$taxDescription] = $taxAdd;
            }
          }
          
    /*********************************************
           * 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;
          }
        }
        
    $this->notify('NOTIFY_ORDER_CART_FINISHED');
      }

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

        
    $this->notify('NOTIFY_ORDER_CART_EXTERNAL_TAX_DURING_ORDER_CREATE', array(), $zf_ot_modules);

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

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

        
    // Sanitize cc-num if present, using maximum 10 chars, with middle chars stripped out with XX
        
    if (strlen($this->info['cc_number']) > 10) {
          
    $cEnd substr($this->info['cc_number'], -4);
          
    $cOffset strlen($this->info['cc_number']) -4;
          
    $cStart substr($this->info['cc_number'], 0, ($cOffset : (int)$cOffset));
          
    $this->info['cc_number'] = str_pad($cStart6'X') . $cEnd;
        };

        
    $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']
                                );


        
    zen_db_perform(TABLE_ORDERS$sql_data_array);

        
    $insert_id $db->Insert_ID();

        
    $this->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' => (is_numeric($zf_ot_modules[$i]['value'])) ? $zf_ot_modules[$i]['value'] : '0',
                                  
    'class' => $zf_ot_modules[$i]['code'],
                                  
    'sort_order' => $zf_ot_modules[$i]['sort_order']);

          
    zen_db_perform(TABLE_ORDERS_TOTAL$sql_data_array);

          
    $this->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);

        
    $this->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;

        
    // 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 '';

          
    $this->doStockDecrement = (STOCK_LIMITED == 'true');
          
    $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_INIT', array(), $this->products[$i], $i);
          
    // Stock Update - Joao Correia
          
    if ($this->doStockDecrement) {
            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_rawfalsefalse0true);
            } else {
              
    $stock_values $db->Execute("select * from " TABLE_PRODUCTS " where products_id = '" zen_get_prid($this->products[$i]['id']) . "'"falsefalse0true);
            }

            
    $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN'$i$stock_values);

            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']) . "'");

                
    // Begin SBA 1.8
                // 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);    
                }
                
    // End SBA 1.8

              //        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";
              
    // SBA 1.8 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)
          
    $this->bestSellersUpdate TRUE;
          
    $this->notify('NOTIFY_ORDER_PROCESSING_BESTSELLERS_UPDATE', array(), $this->products[$i], $i);
          if (
    $this->bestSellersUpdate) {
            
    $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']) . "'");
          }

          
    $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END'$i);

          
    $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_storage' => $this->products[$i]['storage'],
                                  
    '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();

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

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

          
    $this->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);

              
    $this->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);

                
    $this->notify('NOTIFY_ORDER_DURING_CREATE_ADDED_ATTRIBUTE_DOWNLOAD_LINE_ITEM'$sql_data_array);
              }
              
    $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 ----
        
    $this->notify('NOTIFY_ORDER_PROCESSING_ATTRIBUTES_EXIST'$attributes_exist);

        
    $this->notify('NOTIFY_ORDER_DURING_CREATE_ADD_PRODUCTS'$i$custom_insertable_text);

    /* START: ADD MY CUSTOM DETAILS
     * 1. calculate/prepare custom information to be added to this product entry in order-confirmation, perhaps as a function call to custom code to build a serial number etc:
     *   Possible parameters to pass to custom functions at this point:
     *     Product ID ordered (for this line item): $this->products[$i]['id']
     *     Quantity ordered (of this line-item): $this->products[$i]['qty']
     *     Order number: $zf_insert_id
     *     Attribute Option Name ID: (int)$this->products[$i]['attributes'][$j]['option_id']
     *     Attribute Option Value ID: (int)$this->products[$i]['attributes'][$j]['value_id']
     *     Attribute Filename: $attributes_values->fields['products_attributes_filename']
     *
     * 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 $this->products[$i]['qty'], $products_tax);
          
    $this->total_cost += $total_products_price;

          
    $this->notify('NOTIFY_ORDER_PROCESSING_ONE_TIME_CHARGES_BEGIN'$i);

          
    // 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
        
    $this->notify('NOTIFY_ORDER_AFTER_ORDER_CREATE_ADD_PRODUCTS');
      }


      function 
    send_order_email($zf_insert_id$zf_mode FALSE) {
        global 
    $currencies$order_totals;
        
    $this->notify('NOTIFY_ORDER_SEND_EMAIL_INITIALIZE', array(), $zf_insert_id$order_totals$zf_mode);
        if (!
    defined('ORDER_EMAIL_DATE_FORMAT')) define('ORDER_EMAIL_DATE_FORMAT''M-d-Y h:iA');

        
    $this->send_low_stock_emails TRUE;
        
    $this->notify('NOTIFY_ORDER_SEND_LOW_STOCK_EMAILS');
        if (
    $this->send_low_stock_emails && $this->email_low_stock != ''  && SEND_LOWSTOCK_EMAIL=='1') {
          
    $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();

        
    //intro area
        
    $email_order EMAIL_TEXT_HEADER EMAIL_TEXT_FROM STORE_NAME "\n\n" ;
           if (
    $this->customer['gender'] == "m") {
          
    $email_order .= EMAIL_GREETING_MR .' ' ;
         } else {
          
    $email_order .= EMAIL_GREETING_MS .' ' ;
          }
        
    $email_order .= $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" .
        
    EMAIL_TEXT_INVOICE_URL ' ' zen_href_link(FILENAME_ACCOUNT_HISTORY_INFO'order_id=' $zf_insert_id'SSL'false) . "\n\n";
        
    $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']        = EMAIL_TEXT_INVOICE_URL_CLICK;
        
    $html_msg['INTRO_URL_VALUE']       = zen_href_link(FILENAME_ACCOUNT_HISTORY_INFO'order_id=' $zf_insert_id'SSL'false);

        
    $html_msg['EMAIL_CUSTOMER_PHONE']  = $this->customer['telephone'];
        
    $html_msg['EMAIL_ORDER_DATE']      = date(ORDER_EMAIL_DATE_FORMAT);

          
    $invoiceInfo=EMAIL_TEXT_INVOICE_URL ' ' zen_href_link(FILENAME_ACCOUNT_HISTORY_INFO'order_id=' $zf_insert_id'SSL'false) . "\n\n";
          
    $htmlInvoiceURL=EMAIL_TEXT_INVOICE_URL_CLICK;
          
    $htmlInvoiceValue=zen_href_link(FILENAME_ACCOUNT_HISTORY_INFO'order_id=' $zf_insert_id'SSL'false);
         
    $email_order EMAIL_TEXT_HEADER EMAIL_TEXT_FROM STORE_NAME "\n\n" ;
           if (
    $this->customer['gender'] == "m") {
          
    $email_order .= EMAIL_GREETING_MR .' ' ;
         } else {
          
    $email_order .= EMAIL_GREETING_MS .' ' ;
          }
        
    $email_order .= $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" .
          
    EMAIL_TEXT_INVOICE_URL ' ' zen_href_link(FILENAME_ACCOUNT_HISTORY_INFO'order_id=' $zf_insert_id'SSL'false) . "\n\n";

        
    //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 '<tr><td class="order-totals-text" align="right" width="100%">' '&nbsp;' '</td> ' "\n" '<td class="order-totals-num" align="right" nowrap="nowrap">' '---------' .'</td> </tr>' "\n";
        for (
    $i=0$n=sizeof($order_totals); $i<$n$i++) {
          
    $email_order .= strip_tags($order_totals[$i]['title']) . ' ' strip_tags($order_totals[$i]['text']) . "\n";
          
    $html_ot .= '<tr><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";
        }
        
    $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
        
    if (defined('EMAIL_DISCLAIMER') && EMAIL_DISCLAIMER != ''$email_order .= "\n-----\n" sprintf(EMAIL_DISCLAIMERSTORE_OWNER_EMAIL_ADDRESS) . "\n\n";
        
    // include copyright
        
    if (defined('EMAIL_FOOTER_COPYRIGHT')) $email_order .= "\n-----\n" EMAIL_FOOTER_COPYRIGHT "\n\n";

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

        if (
    $this->customer['gender'] == "m") {
            
    $html_msg['EMAIL_GREETING'] = EMAIL_GREETING_MR;
        } else {
            
    $html_msg['EMAIL_GREETING'] = EMAIL_GREETING_MS;
        }
        
    $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'] = '';
        
    $this->notify('NOTIFY_ORDER_INVOICE_CONTENT_READY_TO_SEND', array('zf_insert_id' => $zf_insert_id'text_email' => $email_order'html_email' => $html_msg), $email_order$html_msg);
        
    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);

        
    // 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'];

          
    // include authcode and transaction id in admin-copy of email
          
    if ($GLOBALS[$_SESSION['payment']]->auth_code || $GLOBALS[$_SESSION['payment']]->transaction_id) {
            
    $pmt_details = ($GLOBALS[$_SESSION['payment']]->auth_code != '' 'AuthCode: ' $GLOBALS[$_SESSION['payment']]->auth_code '  ' '') . ($GLOBALS[$_SESSION['payment']]->transaction_id != '' ?  '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'];
          }

          
    // Add extra heading stuff via observer class
          
    $this->extra_header_text '';
          
    $this->notify('NOTIFY_ORDER_INVOICE_CONTENT_FOR_ADDITIONAL_EMAILS', array('zf_insert_id' => $zf_insert_id'text_email' => $email_order'html_email' => $html_msg));
          
    $email_order $this->extra_header_text $email_order;
          
    $html_msg['EMAIL_TEXT_HEADER'] = nl2br($this->extra_header_text) . $html_msg['EMAIL_TEXT_HEADER'];

          
    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$this->customer['firstname'] . ' ' $this->customer['lastname'], $this->customer['email_address']);
        }
        
    $this->notify('NOTIFY_ORDER_AFTER_SEND_ORDER_EMAIL', array($zf_insert_id$email_order$extra_info$html_msg));
      }

    }
    admin/packingslip.php

    PHP-Code:
    <?php
    /**
     * @package admin
     * @copyright Copyright 2003-2010 Zen Cart Development Team
     * @copyright Portions Copyright 2003 osCommerce
     * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
     * @version $Id: packingslip.php 15788 2010-04-02 10:44:40Z drbyte $
     * 
     * Updated for Stock by Attributes 1.5.2 by POTTERYHOUSE
    */

      
    require('includes/application_top.php');

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

      
    $oID zen_db_prepare_input($_GET['oID']);
      
    $orders $db->Execute("select orders_id
                              from " 
    TABLE_ORDERS "
                              where orders_id = '" 
    . (int)$oID "'");

      include(
    DIR_WS_CLASSES 'order.php');
      
    $order = new order($oID);

      
    // prepare order-status pulldown list
      
    $orders_statuses = array();
      
    $orders_status_array = array();
      
    $orders_status $db->Execute("select orders_status_id, orders_status_name
                                     from " 
    TABLE_ORDERS_STATUS "
                                     where language_id = '" 
    . (int)$_SESSION['languages_id'] . "'");
      while (!
    $orders_status->EOF) {
        
    $orders_statuses[] = array('id' => $orders_status->fields['orders_status_id'],
                                   
    'text' => $orders_status->fields['orders_status_name'] . ' [' $orders_status->fields['orders_status_id'] . ']');
        
    $orders_status_array[$orders_status->fields['orders_status_id']] = $orders_status->fields['orders_status_name'];
        
    $orders_status->MoveNext();
      }
    ?>
    <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html <?php echo HTML_PARAMS?>>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET?>">
    <title><?php echo TITLE?></title>
    <link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
    <script language="javascript" src="includes/menu.js"></script>
    </head>
    <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
    <!-- body_text //-->
    <table border="0" width="100%" cellspacing="0" cellpadding="2">
      <tr>
        <td><table border="0" width="100%" cellspacing="0" cellpadding="0">
          <tr>
            <td class="pageHeading"><?php echo nl2br(STORE_NAME_ADDRESS); ?></td>
            <td class="pageHeading" align="right"><?php echo zen_image(DIR_WS_IMAGES HEADER_LOGO_IMAGEHEADER_ALT_TEXT); ?></td>
          </tr>
        </table></td>
      </tr>
      <tr>
        <td><table width="100%" border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td colspan="2"><?php echo zen_draw_separator(); ?></td>
          </tr>

    <?php
          $order_check 
    $db->Execute("select cc_cvv, 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, cc_type, cc_owner, cc_number, cc_expires, currency,
                                        currency_value, date_purchased, orders_status, last_modified
                                 from " 
    TABLE_ORDERS "
                                 where orders_id = '" 
    . (int)$oID "'");
      
    $show_customer 'false';
      if (
    $order_check->fields['billing_name'] != $order_check->fields['delivery_name']) {
        
    $show_customer 'true';
      }
      if (
    $order_check->fields['billing_street_address'] != $order_check->fields['delivery_street_address']) {
        
    $show_customer 'true';
      }
      if (
    $show_customer == 'true') {
    ?>
          <tr>
            <td class="main"><b><?php echo ENTRY_CUSTOMER?></b></td>
          </tr>
          <tr>
            <td class="main"><?php echo zen_address_format($order->customer['format_id'], $order->customer1'''<br>'); ?></td>
          </tr>
    <?php ?>
          <tr>
            <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
             <tr>
                <td class="main"><b><?php echo ENTRY_SOLD_TO?></b></td>
              </tr>
              <tr>
                <td class="main"><?php echo zen_address_format($order->billing['format_id'], $order->billing1'''<br>'); ?></td>
              </tr>
              <tr>
                <td><?php echo zen_draw_separator('pixel_trans.gif''1''5'); ?></td>
              </tr>
              <tr>
                <td class="main"><?php echo $order->customer['telephone']; ?></td>
              </tr>
              <tr>
                <td class="main"><?php echo '<a href="mailto:' $order->customer['email_address'] . '">' $order->customer['email_address'] . '</a>'?></td>
              </tr>
            </table></td>
            <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
              <tr>
                <td class="main"><b><?php echo ENTRY_SHIP_TO?></b></td>
              </tr>
              <tr>
                <td class="main"><?php echo zen_address_format($order->delivery['format_id'], $order->delivery1'''<br>'); ?></td>
              </tr>
            </table></td>
          </tr>
        </table></td>
      </tr>
      <tr>
        <td><?php echo zen_draw_separator('pixel_trans.gif''1''10'); ?></td>
      </tr>
      <tr>
        <td class="main"><b><?php echo ENTRY_ORDER_ID $oID?></b></td>
      </tr>
      <tr>
        <td><table border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td class="main"><strong><?php echo ENTRY_DATE_PURCHASED?></strong></td>
            <td class="main"><?php echo zen_date_long($order->info['date_purchased']); ?></td>
          </tr>
          <tr>
            <td class="main"><b><?php echo ENTRY_PAYMENT_METHOD?></b></td>
            <td class="main"><?php echo $order->info['payment_method']; ?></td>
          </tr>
        </table></td>
      </tr>
      <tr>
        <td><?php echo zen_draw_separator('pixel_trans.gif''1''10'); ?></td>
      </tr>
      <tr>
        <td><table border="0" width="100%" cellspacing="0" cellpadding="2">
          <tr class="dataTableHeadingRow">
            <td class="dataTableHeadingContent" colspan="2"><?php echo TABLE_HEADING_PRODUCTS?></td>
            <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_PRODUCTS_MODEL?></td>
        <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_STORAGE?></td>
          </tr>
    <?php

        
    // START "Stock by Attributes"
        //include language file
        
    include(DIR_WS_LANGUAGES $_SESSION['language'] . '/' 'products_with_attributes_stock.php');
        
    //new object from class
        
    require_once(DIR_WS_CLASSES 'products_with_attributes_stock.php');
        
    $stock = new products_with_attributes_stock;
        
    // END "Stock by Attributes"

        
    for ($i=0$n=sizeof($order->products); $i<$n$i++) {

          echo 
    '      <tr class="dataTableRow">' "\n" .
               
    '        <td class="dataTableContent" valign="top" align="right">' $order->products[$i]['qty'] . '&nbsp;x</td>' "\n" .
               
    '        <td class="dataTableContent" valign="top">' $order->products[$i]['name'];

          if (isset(
    $order->products[$i]['attributes']) && (sizeof($order->products[$i]['attributes']) > 0)) {
            for (
    $j=0$k=sizeof($order->products[$i]['attributes']); $j<$k$j++) {

                
    //"Stock by Attributes" add custom ID to display
                
    $customid null;
                
    //test if this is to be displayed
                
    if( STOCK_SBA_DISPLAY_CUSTOMID == 'true'){
                    
    //create array for use in zen_get_customid
                    
    $attributes[] = $order->products[$i]['attributes'][$j]['value_id'];
                    
    //get custom ID
                    
    $customid $stock->zen_get_customid($order->products[$i]['id'],$attributes);
                    
    //only display custom ID if exists
                    
    if( !empty($customid) ){
                        
    //add name prefix (this is set in the admin language file)
                        
    $customid PWA_CUSTOMID_NAME $customid;
                    }
                }
              
    //"Stock by Attributes" add custom ID to display
              
    echo '<br><nobr><small>&nbsp;<i> - ' $order->products[$i]['attributes'][$j]['option'] . ': ' nl2br(zen_output_string_protected($order->products[$i]['attributes'][$j]['value'])) . ' ' $customid ' ';
              
    // END "Stock by Attributes"
              
    echo '</i></small></nobr>';
            }
          }

          echo 
    '        </td>' "\n" .
               
    '        <td class="dataTableContent" valign="top">' $order->products[$i]['model'] . '</td>' "\n" .
               
    '            <td class="dataTableContent" valign="top">' $order->products[$i]['storage'] . '</td>' "\n" .
               
    '      </tr>' "\n";
    $summe=$summe+$order->products[$i]['qty'];
        }
    ?>
        </table></td>
      </tr>

    <?php if (ORDER_COMMENTS_PACKING_SLIP 0) { ?>
          <tr>
            <td class="main"><table border="0" cellspacing="0" cellpadding="5">
              <tr>
                <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_DATE_ADDED?></strong></td>
                <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_STATUS?></strong></td>
                <td class="smallText" align="center"><strong><?php echo TABLE_HEADING_COMMENTS?></strong></td>
              </tr>
    <?php
        $orders_history 
    $db->Execute("select orders_status_id, date_added, customer_notified, comments
                                        from " 
    TABLE_ORDERS_STATUS_HISTORY "
                                        where orders_id = '" 
    zen_db_input($oID) . "' and customer_notified >= 0
                                        order by date_added"
    );

        if (
    $orders_history->RecordCount() > 0) {
          
    $count_comments=0;
          while (!
    $orders_history->EOF) {
            
    $count_comments++;
            echo 
    '          <tr>' "\n" .
                 
    '            <td class="smallText" align="center" valign="top">' zen_datetime_short($orders_history->fields['date_added']) . '</td>' "\n";
            echo 
    '            <td class="smallText" valign="top">' $orders_status_array[$orders_history->fields['orders_status_id']] . '</td>' "\n";
            echo 
    '            <td class="smallText" valign="top">' . ($orders_history->fields['comments'] == '' TEXT_NONE nl2br(zen_db_output($orders_history->fields['comments']))) . '&nbsp;</td>' "\n" .
                 
    '          </tr>' "\n";
            
    $orders_history->MoveNext();
            if (
    ORDER_COMMENTS_PACKING_SLIP == && $count_comments >= 1) {
              break;
            }
          }
        } else {
            echo 
    '          <tr>' "\n" .
                 
    '            <td class="smallText" colspan="5">' TEXT_NO_ORDER_HISTORY '</td>' "\n" .
                 
    '          </tr>' "\n";
        }
         echo 
    '          <tr>' "\n" .
                 
    '            <td class="smallText" colspan="6"><strong>Gesamtanzahl:&nbsp;' $summe '</strong></td>' "\n" .
                 
    '          </tr>' "\n";
    $summe='';
    ?>
            </table></td>
          </tr>
    <?php // order comments ?>

    </table>
    <!-- body_text_eof //-->
    <br>
    </body>
    </html>
    <?php require(DIR_WS_INCLUDES 'application_bottom.php'); ?>
    admin/include/classes/order.php

    PHP-Code:
    <?php
    /**
     * @package admin
     * @copyright Copyright 2003-2011 Zen Cart Development Team
     * @copyright Portions Copyright 2003 osCommerce
     * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
     * @version $Id: order.php 18695 2011-05-04 05:24:19Z drbyte $
     * 
     * Stock by Attributes 1.5.2
     */

      
    class order {
        var 
    $info$totals$products$customer$delivery;

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

          
    $this->query($order_id);
        }

        function 
    query($order_id) {
          global 
    $db;
          
    $order $db->Execute("select cc_cvv, customers_name, customers_company, customers_street_address,
                                        customers_suburb, customers_city, customers_postcode, customers_id,
                                        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,
                                        coupon_code, payment_method, payment_module_code, shipping_method, shipping_module_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 "'");


          
    $totals $db->Execute("select title, text, class, value
                                  from " 
    TABLE_ORDERS_TOTAL "
                                  where orders_id = '" 
    . (int)$order_id "'
                                  order by sort_order"
    );

          while (!
    $totals->EOF) {
            if (
    $totals->fields['class'] == 'ot_coupon') {
              
    $coupon_link_query "SELECT coupon_id
                      from " 
    TABLE_COUPONS "
                      where coupon_code ='" 
    zen_db_input($order->fields['coupon_code']) . "'";
              
    $coupon_link $db->Execute($coupon_link_query);
              
    $zc_coupon_link '<a href="javascript:couponpopupWindow(\'' zen_catalog_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'],
                                    
    'value' => $totals->fields['value'],
                                    
    'class' => $totals->fields['class']);
            
    $totals->MoveNext();
          }

          
    $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_cvv' => $order->fields['cc_cvv'],
                              
    'cc_expires' => $order->fields['cc_expires'],
                              
    'date_purchased' => $order->fields['date_purchased'],
                              
    'orders_status' => $order->fields['orders_status'],
                              
    'total' => $order->fields['order_total'],
                              
    'tax' => $order->fields['order_tax'],
                              
    'last_modified' => $order->fields['last_modified'],
                              
    'ip_address' => $order->fields['ip_address']
                              );

          
    $this->customer = array('name' => $order->fields['customers_name'],
                                  
    'id' => $order->fields['customers_id'],
                                  
    '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']);

          
    $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 $db->Execute("select orders_products_id, products_id, products_name, products_model,
                                                  products_price, products_tax, products_quantity, products_storage,
                                                  final_price, onetime_charges,
                                                  product_is_free
                                           from " 
    TABLE_ORDERS_PRODUCTS "
                                           where orders_id = '" 
    . (int)$order_id "'
                                           order by orders_products_id"
    );

          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'],
                                            
    'storage' => $orders_products->fields['products_storage'],
                                            
    'tax' => $orders_products->fields['products_tax'],
                                            
    'price' => $orders_products->fields['products_price'],
                                            
    'onetime_charges' => $orders_products->fields['onetime_charges'],
                                            
    'final_price' => $orders_products->fields['final_price'],
                                            
    'product_is_free' => $orders_products->fields['product_is_free']);

            
    $subindex 0;
            
    // START "Stock by Attributes" added to array products_options_values_id and 'value_id' => $attributes->fields['products_options_values_id'],
            
    $attributes $db->Execute("select products_options, products_options_values, options_values_price,
                                               price_prefix, products_options_values_id,
                                               product_attribute_is_free
                                        from " 
    TABLE_ORDERS_PRODUCTS_ATTRIBUTES "
                                        where orders_id = '" 
    . (int)$order_id "'
                                        and orders_products_id = '" 
    . (int)$orders_products->fields['orders_products_id'] . "'");
            if (
    $attributes->RecordCount()>0) {
              while (!
    $attributes->EOF) {
                
    $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options'],
                                                                         
    'value' => $attributes->fields['products_options_values'],
                                                                         
    'value_id' => $attributes->fields['products_options_values_id'],
                                                                         
    'prefix' => $attributes->fields['price_prefix'],
                                                                         
    'price' => $attributes->fields['options_values_price'],
                                                                         
    'product_attribute_is_free' =>$attributes->fields['product_attribute_is_free']);
                
    // END "Stock by Attributes"
                
    $subindex++;
                
    $attributes->MoveNext();
              }
            }
            
    $index++;
            
    $orders_products->MoveNext();
          }
        }
      }
    Die Überschrift Lagerplatz wird zwar auf dem Packzettel ausgegeben, nicht aber das Feld. Habe ich etwas übersehen?
    Besten Dank im Voraus

    #2
    Lagerplatz auf Pickzettel

    Hat niemand eine Idee??

    Kommentar


      #3
      Der Eintrag in Deinem neuen Feld products_storage kommt bei einer Bestellung wohl gar nicht erst in der Tabelle orders_products an.

      Damit es bei einer Bestellung berücksichtigt werden kann, muss es in einer Bestellung durchgeschliffen werden, dazu wirst Du auch die includes/classes/shopping_cart.php anpassen müssen.

      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