Ankündigung

Einklappen
Keine Ankündigung bisher.

PDF Rechnung versendet keine Rechnung und Agb usw. mehr.

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

  • rctools
    antwortet
    Lösung für fehlende pdf-Rechnung, wenn Kunde ohne Kundenkonto bestellt

    Hallo,
    ich glaube, die Lösung für das Problem (pdf Rechung wird nicht versendet, wenn Kunde ohne Konto bestellt) gefunden zu haben:

    Es reicht NICHT aus, die Dateien für "pdf-Rechung" und "Bestellen ohne Kundenkonto" zeilenweise zu mergen.
    Es muss zusätzlich in /MEINADMIN/orders.php noch an 2 Stellen der Code angepasst werden, so dass beim Versand der Email auch die pdf-Dateien mitgesendet werden. Dieser anzupassende Code stammt aus dem "Bestellen ohne Kundenkonto" und berücksichtigt deshalb nicht, dass die pdf-Anlagen noch mitgesendet werden müssen.

    Deshalb muss an 2 Stellen bei der Funktion "zen_mail" noch ein ",$attach" angefügt werden.

    Code:
    // BOF COWOA SEND ORDER_STATUS EMAIL
    if (COWOA_ORDER_STATUS == 'true') {
        if ($check_status->fields['COWOA_order'] == 1)  {
      
                $message =
                EMAIL_TEXT_ORDER_NUMBER . ' ' . $oID . "\n\n" .
                EMAIL_TEXT_COWOA_URL . ' ' . zen_catalog_href_link(FILENAME_ORDER_STATUS, 'order_id=' . $oID, 'SSL') . "\n\n" .
                EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']) . "\n\n" .
          strip_tags($notify_comments) .
          EMAIL_TEXT_STATUS_UPDATED . sprintf(EMAIL_TEXT_STATUS_LABEL, $orders_status_array[$status] ) .
          EMAIL_TEXT_STATUS_PLEASE_REPLY;
    
    
              $html_msg['EMAIL_CUSTOMERS_NAME']    = $check_status->fields['customers_name'];
              $html_msg['EMAIL_TEXT_ORDER_NUMBER'] = EMAIL_TEXT_ORDER_NUMBER . ' ' . $oID;
              $html_msg['EMAIL_TEXT_INVOICE_URL']  = '<a href="' . zen_catalog_href_link(FILENAME_ORDER_STATUS, 'order_id=' . $oID, 'SSL') .'">'.str_replace(':','',EMAIL_TEXT_COWOA_URL).'</a>';
              $html_msg['EMAIL_TEXT_DATE_ORDERED'] = EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']);
              $html_msg['EMAIL_TEXT_STATUS_COMMENTS'] = nl2br($notify_comments);
              $html_msg['EMAIL_TEXT_STATUS_UPDATED'] = str_replace('\n','', EMAIL_TEXT_STATUS_UPDATED);
              $html_msg['EMAIL_TEXT_STATUS_LABEL'] = str_replace('\n','', sprintf(EMAIL_TEXT_STATUS_LABEL, $orders_status_array[$status] ));
              $html_msg['EMAIL_TEXT_NEW_STATUS'] = $orders_status_array[$status];
              $html_msg['EMAIL_TEXT_STATUS_PLEASE_REPLY'] = str_replace('\n','', EMAIL_TEXT_STATUS_PLEASE_REPLY);
    
    
                zen_mail($check_status->fields['customers_name'], $check_status->fields['customers_email_address'], EMAIL_TEXT_SUBJECT . ' #' . $oID, $message, STORE_NAME, EMAIL_FROM, $html_msg, 'order_status', $attach);
                $customer_notified = '1';
              }
        } 
    if (COWOA_ORDER_STATUS == 'false') {
          if ($check_status->fields['COWOA_order'] == 1)  {
    
    
              $htmlInvoiceURL='';
              $htmlInvoiceValue='';
              $message =
              EMAIL_TEXT_ORDER_NUMBER . ' ' . $oID . "\n\n" .
              EMAIL_TEXT_INVOICE_URL . ' ' . zen_catalog_href_link(FILENAME_CATALOG_ACCOUNT_HISTORY_INFO, 'order_id=' . $oID, 'SSL') . "\n\n" .
              EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']) . "\n\n" .
              strip_tags($notify_comments) .
              EMAIL_TEXT_STATUS_UPDATED . sprintf(EMAIL_TEXT_STATUS_LABEL, $orders_status_array[$status] ) .
              EMAIL_TEXT_STATUS_PLEASE_REPLY;
              $html_msg['EMAIL_CUSTOMERS_NAME']    = $check_status->fields['customers_name'];
              $html_msg['EMAIL_TEXT_ORDER_NUMBER'] = EMAIL_TEXT_ORDER_NUMBER . ' ' . $oID;
              $html_msg['INTRO_URL_TEXT']        = '';
              $html_msg['INTRO_URL_VALUE']       = '';
              $html_msg['EMAIL_TEXT_DATE_ORDERED'] = EMAIL_TEXT_DATE_ORDERED . ' ' . zen_date_long($check_status->fields['date_purchased']);
              $html_msg['EMAIL_TEXT_STATUS_COMMENTS'] = nl2br($notify_comments);
              $html_msg['EMAIL_TEXT_STATUS_UPDATED'] = str_replace('\n','', EMAIL_TEXT_STATUS_UPDATED);
              $html_msg['EMAIL_TEXT_STATUS_LABEL'] = str_replace('\n','', sprintf(EMAIL_TEXT_STATUS_LABEL, $orders_status_array[$status] ));
              $html_msg['EMAIL_TEXT_NEW_STATUS'] = $orders_status_array[$status];
              $html_msg['EMAIL_TEXT_STATUS_PLEASE_REPLY'] = str_replace('\n','', EMAIL_TEXT_STATUS_PLEASE_REPLY);
    
    
                zen_mail($check_status->fields['customers_name'], $check_status->fields['customers_email_address'], EMAIL_TEXT_SUBJECT . ' #' . $oID, $message, STORE_NAME, EMAIL_FROM, $html_msg, 'order_status', $attach);
                $customer_notified = '1';
              }    
        }
    // EOF COWOA SEND ORDER_STATUS EMAIL
    Da ich nach 4 Nächten Fehlersuche schon ganz gaga und auch nicht der begnadete Programmierer bin, würde ich mich freuen, wenn die Experten hier im Forum diese Lösung/Modifikation absegnen oder davon abraten würden.

    Mit dieser Änderung funktioniert in meinem Shop das Versenden der pdf-Rechung und der anderen Anlagen beim Ändern des Bestellstatus jetzt jedenfalls (für Kunde ohne Kundenkonto).

    Gruss
    rctools

    Einen Kommentar schreiben:


  • Cocker Imaging
    antwortet
    Hallo, ich habe ein Problem, dass ich will creat Rechnung mit pdf, es ist schön Programm kann ich verwenden? jeder Vorschlag wird gedankt.

    Einen Kommentar schreiben:


  • bumerang24
    antwortet
    Hallo Webchillis noch mal,

    du hast in Teilbereichen wahrscheinlich recht gehabt, der Eintrag zum Verzeichniss war nicht da.
    Den Eintrag

    " home/xxx/xxx/includes/pdf/rechnung_de.pdf', " ( natürlich mit den richtigen Server Daten )
    habe ich jezt hinzugefügt, aber die Rechnung kommt trozdem nicht. Weder bei Bestelleingang, noch bei Statusänderung.
    Ich werde jetzt doch noch mal die komplette RL Invoice deinstalieren und völlig neu hochladen.



    Danke noch mal

    Guido

    Einen Kommentar schreiben:


  • webchills
    antwortet
    Du solltest Dir auch mal anschauen, was Du in der includes/pdf/rl_invoice3_def.php angegeben hast.
    Stimmen die hier angegebenen Pfade zur Rechnungsvorlage, AGB und Widerruf wirklich?
    Code:
    'bgPDFLang' => array('43' => '/home/xxx/xxx/includes/pdf/rechnung_de.pdf',
    '1' => '/home/xxx/xxx/includes/pdf/rechnung_en.pdf',
    ),
    'attachLang' =>
    array('43' => array('/home/xxx/xxx/includes/pdf/AGB.pdf',
    '/home/xxx/xxx/includes/pdf/Widerrufsrecht.pdf',
    ),
    ),
    array('1' => array('/home/xxx/xxx/includes/pdf/AGB_en.pdf',
    '/home/xxx/xxx/includes/pdf/Widerrufsrecht_en.pdf',
    ),
    ),

    Einen Kommentar schreiben:


  • bumerang24
    antwortet
    Hallo Webchillis,

    danke noch mal, aber leider ist trotz der richtigen Datei noch keine Lösung da.
    Ich habe mittlerweile über den Admin die PDF Rechnung auch noch mal neu instaliert, deine ORDER.php eingebaut usw.
    Nach noch mal 2 Test Bestellungen hat sich nichts geändert.

    Einstellung der PDF Rechnung getestet mit
    Rechnung verschicken bei status 1,2, 3, und 2/100 und 3/100
    Rechnung kommt weder bei bestelleingang, noch bei Statusänderung oder Rechnung versenden.


    Ich werde mir noch mal die Zeit nehmen, die RL Invoice komplett zu deinstalieren, und auch die DB von den Überresten zu befreien. Dann schauen wir mal, was nach neu Instalation der Datei passiert.

    Merci für den tollen Support

    Guido

    Einen Kommentar schreiben:


  • webchills
    antwortet
    Zitat von bumerang24 Beitrag anzeigen
    das neu mergen so wie du es beschrieben hast hatte ich bereits auch komplett gemacht, aber die Rechnung, agb und Wiederruf werden trotzdem nicht mitgeschickt. Weder bei der Bestellung, noch bei Rechnung versenden.
    Die von mir genutzte order php ( oben im vorhergehenden Posting ) ist auch ohne die cowa.
    Du hast einen Fehler beim Mergen gemacht. Zeile 1100 in Deiner includes/classes/order.php gehört raus.
    Hier eine includes/classes/order.php für Buttonlösung, pdf Rechnung und Stock by Attributes. Wenn Du die mit Deiner vergleichst siehts Du, dass Du in Zeile 1100 eine überflüssige zen_mail drin hast, die an deiser Stelle noch gar nicht weiß, dass sie irgendwelche Attachments mitsenden soll.
    Code:
    <?php
    /**
     * File contains the order-processing class ("order")
     *
     * @package classes
     * @copyright Copyright 2003-2012 Zen Cart Development Team
     * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
     * @version $Id: order.php für Buttonlösung, SBA und pdf Rechnung 3.1 2012-11-21 09:26:25Z webchills $
     */
    /**
     * order class
     *
     * Handles all order-processing functions
     *
     * @package classes
     */
    if (!defined('IS_ADMIN_FLAG')) {
      die('Illegal Access');
    }
    class order extends base {
      var $info, $totals, $products, $customer, $delivery, $content_type, $email_low_stock, $products_ordered_attributes,
      $products_ordered, $products_ordered_email, $attachArray;
    
      function order($order_id = '') {
        $this->info = array();
        $this->totals = array();
        $this->products = array();
        $this->customer = array();
        $this->delivery = array();
    
        if (zen_not_null($order_id)) {
          $this->query($order_id);
        } else {
          $this->cart();
        }
      }
    
      function query($order_id) {
        global $db;
    
        $order_id = zen_db_prepare_input($order_id);
    
        $order_query = "select customers_id, customers_name, customers_company,
                             customers_street_address, customers_suburb, customers_city,
                             customers_postcode, customers_state, customers_country,
                             customers_telephone, customers_email_address, customers_address_format_id,
                             delivery_name, delivery_company, delivery_street_address, delivery_suburb,
                             delivery_city, delivery_postcode, delivery_state, delivery_country,
                             delivery_address_format_id, billing_name, billing_company,
                             billing_street_address, billing_suburb, billing_city, billing_postcode,
                             billing_state, billing_country, billing_address_format_id,
                             payment_method, payment_module_code, shipping_method, shipping_module_code,
                             coupon_code, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value,
                             date_purchased, orders_status, last_modified, order_total, order_tax, ip_address
                            from " . TABLE_ORDERS . "
                            where orders_id = '" . (int)$order_id . "'";
    
        $order = $db->Execute($order_query);
    
        $totals_query = "select title, text, class
                             from " . TABLE_ORDERS_TOTAL . "
                             where orders_id = '" . (int)$order_id . "'
                             order by sort_order";
    
        $totals = $db->Execute($totals_query);
    
        while (!$totals->EOF) {
    
    
          if ($totals->fields['class'] == 'ot_coupon') {
            $coupon_link_query = "SELECT coupon_id
                    from " . TABLE_COUPONS . "
                    where coupon_code ='" . $order->fields['coupon_code'] . "'";
            $coupon_link = $db->Execute($coupon_link_query);
            $zc_coupon_link = '<a href="javascript:couponpopupWindow(\'' . zen_href_link(FILENAME_POPUP_COUPON_HELP, 'cID=' . $coupon_link->fields['coupon_id']) . '\')">';
          }
          $this->totals[] = array('title' => ($totals->fields['class'] == 'ot_coupon' ? $zc_coupon_link . $totals->fields['title'] . '</a>' : $totals->fields['title']),
                                  'text' => $totals->fields['text'],
                                  'class' => $totals->fields['class']);
          $totals->MoveNext();
        }
    
        $order_total_query = "select text, value
                                 from " . TABLE_ORDERS_TOTAL . "
                                 where orders_id = '" . (int)$order_id . "'
                                 and class = 'ot_total'";
    
    
        $order_total = $db->Execute($order_total_query);
    
    
        $shipping_method_query = "select title, value
                                    from " . TABLE_ORDERS_TOTAL . "
                                    where orders_id = '" . (int)$order_id . "'
                                    and class = 'ot_shipping'";
    
    
        $shipping_method = $db->Execute($shipping_method_query);
    
        $order_status_query = "select orders_status_name
                                 from " . TABLE_ORDERS_STATUS . "
                                 where orders_status_id = '" . $order->fields['orders_status'] . "'
                                 and language_id = '" . (int)$_SESSION['languages_id'] . "'";
    
        $order_status = $db->Execute($order_status_query);
    
        $this->info = array('currency' => $order->fields['currency'],
                            'currency_value' => $order->fields['currency_value'],
                            'payment_method' => $order->fields['payment_method'],
                            'payment_module_code' => $order->fields['payment_module_code'],
                            'shipping_method' => $order->fields['shipping_method'],
                            'shipping_module_code' => $order->fields['shipping_module_code'],
                            'coupon_code' => $order->fields['coupon_code'],
                            'cc_type' => $order->fields['cc_type'],
                            'cc_owner' => $order->fields['cc_owner'],
                            'cc_number' => $order->fields['cc_number'],
                            'cc_expires' => $order->fields['cc_expires'],
                            'date_purchased' => $order->fields['date_purchased'],
                            'orders_status' => $order_status->fields['orders_status_name'],
                            'last_modified' => $order->fields['last_modified'],
                            'total' => $order->fields['order_total'],
                            'tax' => $order->fields['order_tax'],
                            'ip_address' => $order->fields['ip_address']
                            );
    
        $this->customer = array('id' => $order->fields['customers_id'],
                                'name' => $order->fields['customers_name'],
                                'company' => $order->fields['customers_company'],
                                'street_address' => $order->fields['customers_street_address'],
                                'suburb' => $order->fields['customers_suburb'],
                                'city' => $order->fields['customers_city'],
                                'postcode' => $order->fields['customers_postcode'],
                                'state' => $order->fields['customers_state'],
                                'country' => $order->fields['customers_country'],
                                'format_id' => $order->fields['customers_address_format_id'],
                                'telephone' => $order->fields['customers_telephone'],
                                'email_address' => $order->fields['customers_email_address']);
    
        $this->delivery = array('name' => $order->fields['delivery_name'],
                                'company' => $order->fields['delivery_company'],
                                'street_address' => $order->fields['delivery_street_address'],
                                'suburb' => $order->fields['delivery_suburb'],
                                'city' => $order->fields['delivery_city'],
                                'postcode' => $order->fields['delivery_postcode'],
                                'state' => $order->fields['delivery_state'],
                                'country' => $order->fields['delivery_country'],
                                'format_id' => $order->fields['delivery_address_format_id']);
    
        if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {
          $this->delivery = false;
        }
    
        $this->billing = array('name' => $order->fields['billing_name'],
                               'company' => $order->fields['billing_company'],
                               'street_address' => $order->fields['billing_street_address'],
                               'suburb' => $order->fields['billing_suburb'],
                               'city' => $order->fields['billing_city'],
                               'postcode' => $order->fields['billing_postcode'],
                               'state' => $order->fields['billing_state'],
                               'country' => $order->fields['billing_country'],
                               'format_id' => $order->fields['billing_address_format_id']);
    
        $index = 0;
        $orders_products_query = "select orders_products_id, products_id, products_name,
                                     products_model, products_price, products_tax,
                                     products_quantity, final_price,
                                     onetime_charges,
                                     products_priced_by_attribute, product_is_free, products_discount_type,
                                     products_discount_type_from
                                      from " . TABLE_ORDERS_PRODUCTS . "
                                      where orders_id = '" . (int)$order_id . "'
                                      order by orders_products_id";
    
        $orders_products = $db->Execute($orders_products_query);
    
        while (!$orders_products->EOF) {
          // convert quantity to proper decimals - account history
          if (QUANTITY_DECIMALS != 0) {
            $fix_qty = $orders_products->fields['products_quantity'];
            switch (true) {
              case (!strstr($fix_qty, '.')):
              $new_qty = $fix_qty;
              break;
              default:
              $new_qty = preg_replace('/[0]+$/', '', $orders_products->fields['products_quantity']);
              break;
            }
          } else {
            $new_qty = $orders_products->fields['products_quantity'];
          }
    
          $new_qty = round($new_qty, QUANTITY_DECIMALS);
    
          if ($new_qty == (int)$new_qty) {
            $new_qty = (int)$new_qty;
          }
    
          $this->products[$index] = array('qty' => $new_qty,
                                          'id' => $orders_products->fields['products_id'],
                                          'name' => $orders_products->fields['products_name'],
                                          'model' => $orders_products->fields['products_model'],
                                          'tax' => $orders_products->fields['products_tax'],
                                          'price' => $orders_products->fields['products_price'],
                                          'final_price' => $orders_products->fields['final_price'],
                                          'onetime_charges' => $orders_products->fields['onetime_charges'],
                                          'products_priced_by_attribute' => $orders_products->fields['products_priced_by_attribute'],
                                          'product_is_free' => $orders_products->fields['product_is_free'],
                                          'products_discount_type' => $orders_products->fields['products_discount_type'],
                                          'products_discount_type_from' => $orders_products->fields['products_discount_type_from']);
    
          $subindex = 0;
          $attributes_query = "select products_options_id, products_options_values_id, products_options, products_options_values,
                                  options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . "
                                   where orders_id = '" . (int)$order_id . "'
                                   and orders_products_id = '" . (int)$orders_products->fields['orders_products_id'] . "'";
    
          $attributes = $db->Execute($attributes_query);
          if ($attributes->RecordCount()) {
            while (!$attributes->EOF) {
              $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options'],
                                                                       'value' => $attributes->fields['products_options_values'],
                                                                       '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();
        }
      }
    
      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' => (is_array($_SESSION['shipping']) ? $_SESSION['shipping']['title'] : $_SESSION['shipping']),
                            'shipping_module_code' => (isset($_SESSION['shipping']['id']) && strpos($_SESSION['shipping']['id'], '_') > 0 ? $_SESSION['shipping']['id'] : $_SESSION['shipping']),
                            'shipping_cost' => $_SESSION['shipping']['cost'],
                            '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'],
                                          '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);
          $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_round(zen_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) ,$decimals) * $this->products[$index]['qty'];
          $shown_price +=  zen_round(zen_add_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']), $decimals);
          
          $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'];
          $this->info['subtotal'] += $shown_price;
          $totalTaxAdd = 0;
          foreach ($taxRates as $taxDescription=>$taxRate)
          {
            $taxAdd = 0;
            if ($taxDescription == $products_tax_description)
            {
              if (DISPLAY_PRICE_WITH_TAX == 'true')
              {
                $taxAdd = zen_round($shown_price / (100 + $this->products[$index]['tax']) * $this->products[$index]['tax'], $decimals);
              } else 
              {
                  $taxAdd = zen_calculate_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty'];
                          +  zen_round(zen_calculate_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']), $decimals);
              }
              if (isset($this->info['tax_groups'][$taxDescription]))
              {
                $this->info['tax_groups'][$taxDescription] += $taxAdd;
              } else
              {
                $this->info['tax_groups'][$taxDescription] = $taxAdd;
              }
            }
            $totalTaxAdd += $taxAdd;
          }
          $this->info['tax'] += $totalTaxAdd;
          /*********************************************
           * 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;
    
        if ($this->info['total'] == 0) {
          if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
            $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
          } else {
            if ($_SESSION['payment'] != 'freecharger') {
              $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
            }
          }
        }
    
        if ($_SESSION['shipping'] == 'free_free') {
          $this->info['shipping_module_code'] = $_SESSION['shipping'];
        }
    
        // 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 > 4 ? 4 : (int)$cOffset));
          $this->info['cc_number'] = str_pad($cStart, 6, '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'], '_') > 0 ? substr($this->info['shipping_module_code'], 0, strpos($this->info['shipping_module_code'], '_')) : $this->info['shipping_module_code']),
                                'coupon_code' => $this->info['coupon_code'],
                                'cc_type' => $this->info['cc_type'],
                                'cc_owner' => $this->info['cc_owner'],
                                'cc_number' => $this->info['cc_number'],
                                'cc_expires' => $this->info['cc_expires'],
                                'date_purchased' => 'now()',
                                'orders_status' => $this->info['order_status'],
                                'order_total' => $this->info['total'],
                                'order_tax' => $this->info['tax'],
                                'currency' => $this->info['currency'],
                                'currency_value' => $this->info['currency_value'],
                                'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
                                );
    
    
        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 = '';
          // Stock Update - Joao Correia
          if (STOCK_LIMITED == 'true') {
            if (DOWNLOAD_ENABLED == 'true') {
              $stock_query_raw = "select p.products_quantity, pad.products_attributes_filename, p.product_is_always_free_shipping
                                  from " . TABLE_PRODUCTS . " p
                                  left join " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                                   on p.products_id=pa.products_id
                                  left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                                   on pa.products_attributes_id=pad.products_attributes_id
                                  WHERE p.products_id = '" . zen_get_prid($this->products[$i]['id']) . "'";
    
              // Will work with only one option for downloadable products
              // otherwise, we have to build the query dynamically with a loop
              $products_attributes = $this->products[$i]['attributes'];
              if (is_array($products_attributes)) {
                $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
              }
              $stock_values = $db->Execute($stock_query_raw);
            } else {
              $stock_values = $db->Execute("select * from " . TABLE_PRODUCTS . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
            }
    
            $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN');
    
            if ($stock_values->RecordCount() > 0) {
              // do not decrement quantities if products_attributes_filename exists
              if ((DOWNLOAD_ENABLED != 'true') || $stock_values->fields['product_is_always_free_shipping'] == 2 || (!$stock_values->fields['products_attributes_filename']) ) {
                $stock_left = $stock_values->fields['products_quantity'] - $this->products[$i]['qty'];
                $this->products[$i]['stock_reduce'] = $this->products[$i]['qty'];
              } else {
                $stock_left = $stock_values->fields['products_quantity'];
              }
    
              //            $this->products[$i]['stock_value'] = $stock_values->fields['products_quantity'];
    
              $db->Execute("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
                // Begin SBA 1.5
                // added to update quantities of products with attributes
                $attribute_search = array();
                $attribute_stock_left = STOCK_REORDER_LEVEL + 1;  // kuroi: prevent false low stock triggers  
    
                if(isset($this->products[$i]['attributes']) and sizeof($this->products[$i]['attributes']) >0){
                    foreach($this->products[$i]['attributes'] as $attributes){
                        $attribute_search[] = $attributes['value_id'];
                    }
                
                    if(sizeof($attribute_search) > 1){
                        $attribute_search = 'where options_values_id in ("'.implode('","', $attribute_search).'")';
                    } else {
                        $attribute_search = 'where options_values_id="' . $attribute_search[0].'"';
                    }
    
                    $query = 'select products_attributes_id from ' . TABLE_PRODUCTS_ATTRIBUTES . ' ' . $attribute_search .' and products_id="' . zen_get_prid($this->products[$i]['id']) . '" order by products_attributes_id';
                    $attributes = $db->Execute($query);
                    $stock_attributes_search = array();
                    while(!$attributes->EOF){
                        $stock_attributes_search[] = $attributes->fields['products_attributes_id'];    
                        $attributes->MoveNext();
                    }
                    if(sizeof($stock_attributes_search) > 1){
                        $stock_attributes_search = implode(',', $stock_attributes_search);
                    } else {
                        foreach($stock_attributes_search as $attribute_search){
                            $stock_attributes_search1 = $attribute_search;
                        }
                        $stock_attributes_search = $stock_attributes_search1;
                    }
                    
                    $get_quantity_query = 'select quantity from ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
    
                  $attribute_stock_available = $db->Execute($get_quantity_query);    
                    $attribute_stock_left = $attribute_stock_available->fields['quantity'] - $this->products[$i]['qty'];
        
                    $attribute_update_query = 'update ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' set quantity='.$attribute_stock_left.' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
                    $db->Execute($attribute_update_query);    
                }
                // kuroi: End SBA 1.5
              //        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.5 kuroi: trigger and details for attribute low stock email
              } elseif ($attribute_stock_left <= STOCK_REORDER_LEVEL) {
                $this->email_low_stock .=  'ID# ' . zen_get_prid($this->products[$i]['id']) . ', ' . $this->products[$i]['model'] . ', ' . $this->products[$i]['name'] . ', ';
                            foreach($this->products[$i]['attributes'] as $attributes){
                                $this->email_low_stock .= $attributes['option'] . ': ' . $attributes['value'] . ', ';
                            }
                            $this->email_low_stock .= 'Stock: ' . $attribute_stock_left . "\n\n";
              }
            }
          }
    
          // Update products_ordered (for bestsellers list)
          //    $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . zen_get_prid($order->products[$i]['id']) . "'");
          $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%f', $this->products[$i]['qty']) . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
    
          $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END');
    
          $sql_data_array = array('orders_id' => $zf_insert_id,
                                  'products_id' => zen_get_prid($this->products[$i]['id']),
                                  'products_model' => $this->products[$i]['model'],
                                  'products_name' => $this->products[$i]['name'],
                                  
                                  'products_price' => $this->products[$i]['price'],
                                  'final_price' => $this->products[$i]['final_price'],
                                  'onetime_charges' => $this->products[$i]['onetime_charges'],
                                  'products_tax' => $this->products[$i]['tax'],
                                  'products_quantity' => $this->products[$i]['qty'],
                                  'products_priced_by_attribute' => $this->products[$i]['products_priced_by_attribute'],
                                  'product_is_free' => $this->products[$i]['product_is_free'],
                                  'products_discount_type' => $this->products[$i]['products_discount_type'],
                                  'products_discount_type_from' => $this->products[$i]['products_discount_type_from'],
                                  'products_prid' => $this->products[$i]['id']);
          zen_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
    
          $order_products_id = $db->Insert_ID();
    
          $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', $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');
    
          // build output for email notification
          $this->products_ordered .=  $this->products[$i]['qty'] . ' x ' . $this->products[$i]['name'] . ($this->products[$i]['model'] != '' ? ' (' . $this->products[$i]['model'] . ') ' : '') . ' = ' .
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
          ($this->products[$i]['onetime_charges'] !=0 ? "\n" . TEXT_ONETIME_CHARGES_EMAIL . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
          $this->products_ordered_attributes . "\n";
          $this->products_ordered_html .=
          '<tr>' . "\n" .
          '<td class="product-details" align="right" valign="top" width="30">' . $this->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
          '<td class="product-details" valign="top">' . nl2br($this->products[$i]['name']) . ($this->products[$i]['model'] != '' ? ' (' . nl2br($this->products[$i]['model']) . ') ' : '') . "\n" .
          '<nobr>' .
          '<small><em> '. nl2br($this->products_ordered_attributes) .'</em></small>' .
          '</nobr>' .
          '</td>' . "\n" .
          '<td class="product-details-num" valign="top" align="right">' .
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
          ($this->products[$i]['onetime_charges'] !=0 ?
          '</td></tr>' . "\n" . '<tr><td class="product-details">' . nl2br(TEXT_ONETIME_CHARGES_EMAIL) . '</td>' . "\n" .
          '<td>' . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
          '</td></tr>' . "\n";
        }
    
        $order_total_modules->apply_credit();//ICW ADDED FOR CREDIT CLASS SYSTEM
        $this->notify('NOTIFY_ORDER_AFTER_ORDER_CREATE_ADD_PRODUCTS');
      }
    
    
      function send_order_email($zf_insert_id, $zf_mode) {
        global $currencies, $order_totals;
        if ($this->email_low_stock != '' and SEND_LOWSTOCK_EMAIL=='1') {
          // send an email
          $email_low_stock = SEND_EXTRA_LOW_STOCK_EMAIL_TITLE . "\n\n" . $this->email_low_stock;
          zen_mail('', SEND_EXTRA_LOW_STOCK_EMAILS_TO, EMAIL_TEXT_SUBJECT_LOWSTOCK, $email_low_stock, STORE_OWNER, EMAIL_FROM, array('EMAIL_MESSAGE_HTML' => nl2br($email_low_stock)),'low_stock');
        }
    
        // lets start with the email confirmation
        // make an array to store the html version
        $html_msg=array();
    
        //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);
    
        //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_DISCLAIMER, STORE_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));
        // BOF rl_invoice3
        $this->attachArray = array();
        if(RL_INVOICE3_SEND_PDF=='1'){
            if(!(0==$this->info['total'] && RL_INVOICE3_NOT_NULL_INVOICE==0)){     
                if( (defined('RL_INVOICE3_ORDERSTATUS')) && ($this->info['order_status'] >= RL_INVOICE3_ORDERSTATUS)) {
                    require_once(DIR_WS_INCLUDES . 'classes/class.rl_invoice3.php');
                    
                    $pdfT = new rl_invoice3($zf_insert_id, $paper['orientation'], $paper['unit'], $paper['format']);
                    $pdfT -> createPdfFile(true);
                    $this->attachArray = $pdfT->getPDFAttachments();
                    #$this->attachArray[] = array('file'=>$x, 'mime_type'=>'pdf');
                }
            }
        }
        zen_mail($this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id, $email_order, STORE_NAME, EMAIL_FROM, $html_msg, 'checkout', $this->attachArray);
        // EOF rl_invoice3
    
        // send additional emails
        if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
          $extra_info=email_collect_extra_info('','', $this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], $this->customer['telephone']);
          $html_msg['EXTRA_INFO'] = $extra_info['HTML'];
    
          // 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'];
          }
    
          $this->notify('NOTIFY_ORDER_INVOICE_CONTENT_FOR_ADDITIONAL_EMAILS', array('zf_insert_id' => $zf_insert_id, 'text_email' => $email_order, 'html_email' => $html_msg));
          if(method_exists($pdfT, "getPDFAttachments")){
            $this->attachArray = $pdfT->getPDFAttachments('NO');
          }
          zen_mail('', SEND_EXTRA_ORDER_EMAILS_TO, SEND_EXTRA_NEW_ORDERS_EMAILS_TO_SUBJECT . ' ' . EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id,
          $email_order . $extra_info['TEXT'], STORE_NAME, EMAIL_FROM, $html_msg, 'checkout_extra', $this->attachArray);
        }
        $this->notify('NOTIFY_ORDER_AFTER_SEND_ORDER_EMAIL', array($zf_insert_id, $email_order, $extra_info, $html_msg));
      }
    
    }

    Einen Kommentar schreiben:


  • bumerang24
    antwortet
    Hallo Webchillis,

    das neu mergen so wie du es beschrieben hast hatte ich bereits auch komplett gemacht, aber die Rechnung, agb und Wiederruf werden trotzdem nicht mitgeschickt. Weder bei der Bestellung, noch bei Rechnung versenden.
    Die von mir genutzte order php ( oben im vorhergehenden Posting ) ist auch ohne die cowa.

    hast du oder sonst wer noch eine andere idee?

    merci

    Guido

    Einen Kommentar schreiben:


  • webchills
    antwortet
    Zitat von bumerang24 Beitrag anzeigen
    Bei der Order PHP weiter oben von webchillis habe ich das Problem, im Kundenbereich kann ich keine Bestellung einsehen, weisse Seite...
    Die oben gepostete order.php bezog sich ja auch auf ganz was anderes, nämlich einen Shop mit COWOA, es macht doch gar keinen Sinn, wenn Du die bei Dir integrierst. Du verwendest wie Du schribst Stock by Attributes, pdf Rechnung und Buttonlösung. Alle drei ändern die order.php. Also zunächst mal die order.php der Buttonlösung mit der von Stock by Attributes mergen. Die Tools dazu sind bekannt. Und dann diese neue order.php mit der von der pdf Rechnung mergen.

    Einen Kommentar schreiben:


  • sierra83
    antwortet
    Ist mit Developers Tool Kit der Eintrag COWOA_order zu finden?

    Mfg Stefan

    Einen Kommentar schreiben:


  • bumerang24
    antwortet
    Das gleiche Prob, nur die Forum Datei geht auch nicht

    Hallo Webchillis und die anderen PHP Spezialisten,

    mein Problem ist:
    es wird weder die Rechnung noch sonst eine Datei verschickt, ( hat schon funktioniert ) im Kundenkonto sind die Rechnungen usw. da. Ich vermute es liegt an meiner Order.PHP
    HTML-Code:
    <?php
    /**
     * File contains the order-processing class ("order")
     *
     * @package classes
     * @copyright Copyright 2003-2012 Zen Cart Development Team
     * @license https://www.zen-cart-pro.at/license/2_0.txt GNU Public License V2.0
     * @version $Id: order.php for SBA 1.5 2012-08-21 16: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 order($order_id = '') {
        $this->info = array();
        $this->totals = array();
        $this->products = array();
        $this->customer = array();
        $this->delivery = array();
    
        if (zen_not_null($order_id)) {
          $this->query($order_id);
        } else {
          $this->cart();
        }
      }
    
      function query($order_id) {
        global $db;
    
        $order_id = zen_db_prepare_input($order_id);
    
        $order_query = "select customers_id, customers_name, customers_company,
                             customers_street_address, customers_suburb, customers_city,
                             customers_postcode, customers_state, customers_country,
                             customers_telephone, customers_email_address, customers_address_format_id,
                             delivery_name, delivery_company, delivery_street_address, delivery_suburb,
                             delivery_city, delivery_postcode, delivery_state, delivery_country,
                             delivery_address_format_id, billing_name, billing_company,
                             billing_street_address, billing_suburb, billing_city, billing_postcode,
                             billing_state, billing_country, billing_address_format_id,
                             payment_method, payment_module_code, shipping_method, shipping_module_code,
                             coupon_code, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value,
                             date_purchased, orders_status, last_modified, order_total, order_tax, ip_address
                            from " . TABLE_ORDERS . "
                            where orders_id = '" . (int)$order_id . "'";
    
        $order = $db->Execute($order_query);
    
        $totals_query = "select title, text, class
                             from " . TABLE_ORDERS_TOTAL . "
                             where orders_id = '" . (int)$order_id . "'
                             order by sort_order";
    
        $totals = $db->Execute($totals_query);
    
        while (!$totals->EOF) {
    
    
          if ($totals->fields['class'] == 'ot_coupon') {
            $coupon_link_query = "SELECT coupon_id
                    from " . TABLE_COUPONS . "
                    where coupon_code ='" . $order->fields['coupon_code'] . "'";
            $coupon_link = $db->Execute($coupon_link_query);
            $zc_coupon_link = '<a href="javascript:couponpopupWindow(\'' . zen_href_link(FILENAME_POPUP_COUPON_HELP, 'cID=' . $coupon_link->fields['coupon_id']) . '\')">';
          }
          $this->totals[] = array('title' => ($totals->fields['class'] == 'ot_coupon' ? $zc_coupon_link . $totals->fields['title'] . '</a>' : $totals->fields['title']),
                                  'text' => $totals->fields['text'],
                                  'class' => $totals->fields['class']);
          $totals->MoveNext();
        }
    
        $order_total_query = "select text, value
                                 from " . TABLE_ORDERS_TOTAL . "
                                 where orders_id = '" . (int)$order_id . "'
                                 and class = 'ot_total'";
    
    
        $order_total = $db->Execute($order_total_query);
    
    
        $shipping_method_query = "select title, value
                                    from " . TABLE_ORDERS_TOTAL . "
                                    where orders_id = '" . (int)$order_id . "'
                                    and class = 'ot_shipping'";
    
    
        $shipping_method = $db->Execute($shipping_method_query);
    
        $order_status_query = "select orders_status_name
                                 from " . TABLE_ORDERS_STATUS . "
                                 where orders_status_id = '" . $order->fields['orders_status'] . "'
                                 and language_id = '" . (int)$_SESSION['languages_id'] . "'";
    
        $order_status = $db->Execute($order_status_query);
    
        $this->info = array('currency' => $order->fields['currency'],
                            'currency_value' => $order->fields['currency_value'],
                            'payment_method' => $order->fields['payment_method'],
                            'payment_module_code' => $order->fields['payment_module_code'],
                            'shipping_method' => $order->fields['shipping_method'],
                            'shipping_module_code' => $order->fields['shipping_module_code'],
                            'coupon_code' => $order->fields['coupon_code'],
                            'cc_type' => $order->fields['cc_type'],
                            'cc_owner' => $order->fields['cc_owner'],
                            'cc_number' => $order->fields['cc_number'],
                            'cc_expires' => $order->fields['cc_expires'],
                            'date_purchased' => $order->fields['date_purchased'],
                            'orders_status' => $order_status->fields['orders_status_name'],
                            'last_modified' => $order->fields['last_modified'],
                            'total' => $order->fields['order_total'],
                            'tax' => $order->fields['order_tax'],
                            'ip_address' => $order->fields['ip_address']
                            );
    
        $this->customer = array('id' => $order->fields['customers_id'],
                                'name' => $order->fields['customers_name'],
                                'company' => $order->fields['customers_company'],
                                'street_address' => $order->fields['customers_street_address'],
                                'suburb' => $order->fields['customers_suburb'],
                                'city' => $order->fields['customers_city'],
                                'postcode' => $order->fields['customers_postcode'],
                                'state' => $order->fields['customers_state'],
                                'country' => $order->fields['customers_country'],
                                'format_id' => $order->fields['customers_address_format_id'],
                                'telephone' => $order->fields['customers_telephone'],
                                'email_address' => $order->fields['customers_email_address']);
    
        $this->delivery = array('name' => $order->fields['delivery_name'],
                                'company' => $order->fields['delivery_company'],
                                'street_address' => $order->fields['delivery_street_address'],
                                'suburb' => $order->fields['delivery_suburb'],
                                'city' => $order->fields['delivery_city'],
                                'postcode' => $order->fields['delivery_postcode'],
                                'state' => $order->fields['delivery_state'],
                                'country' => $order->fields['delivery_country'],
                                'format_id' => $order->fields['delivery_address_format_id']);
    
        if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {
          $this->delivery = false;
        }
    
        $this->billing = array('name' => $order->fields['billing_name'],
                               'company' => $order->fields['billing_company'],
                               'street_address' => $order->fields['billing_street_address'],
                               'suburb' => $order->fields['billing_suburb'],
                               'city' => $order->fields['billing_city'],
                               'postcode' => $order->fields['billing_postcode'],
                               'state' => $order->fields['billing_state'],
                               'country' => $order->fields['billing_country'],
                               'format_id' => $order->fields['billing_address_format_id']);
    
        $index = 0;
        $orders_products_query = "select orders_products_id, products_id, products_name,
                                     products_model, products_price, products_tax,
                                     products_quantity, final_price,
                                     onetime_charges,
                                     products_priced_by_attribute, product_is_free, products_discount_type,
                                     products_discount_type_from
                                      from " . TABLE_ORDERS_PRODUCTS . "
                                      where orders_id = '" . (int)$order_id . "'
                                      order by orders_products_id";
    
        $orders_products = $db->Execute($orders_products_query);
    
        while (!$orders_products->EOF) {
          // convert quantity to proper decimals - account history
          if (QUANTITY_DECIMALS != 0) {
            $fix_qty = $orders_products->fields['products_quantity'];
            switch (true) {
              case (!strstr($fix_qty, '.')):
              $new_qty = $fix_qty;
              break;
              default:
              $new_qty = preg_replace('/[0]+$/', '', $orders_products->fields['products_quantity']);
              break;
            }
          } else {
            $new_qty = $orders_products->fields['products_quantity'];
          }
    
          $new_qty = round($new_qty, QUANTITY_DECIMALS);
    
          if ($new_qty == (int)$new_qty) {
            $new_qty = (int)$new_qty;
          }
    
          $this->products[$index] = array('qty' => $new_qty,
                                          'id' => $orders_products->fields['products_id'],
                                          'name' => $orders_products->fields['products_name'],
                                          'model' => $orders_products->fields['products_model'],
                                          'tax' => $orders_products->fields['products_tax'],
                                          'price' => $orders_products->fields['products_price'],
                                          'final_price' => $orders_products->fields['final_price'],
                                          'onetime_charges' => $orders_products->fields['onetime_charges'],
                                          'products_priced_by_attribute' => $orders_products->fields['products_priced_by_attribute'],
                                          'product_is_free' => $orders_products->fields['product_is_free'],
                                          'products_discount_type' => $orders_products->fields['products_discount_type'],
                                          'products_discount_type_from' => $orders_products->fields['products_discount_type_from']);
    
          $subindex = 0;
          $attributes_query = "select products_options_id, products_options_values_id, products_options, products_options_values,
                                  options_values_price, price_prefix from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . "
                                   where orders_id = '" . (int)$order_id . "'
                                   and orders_products_id = '" . (int)$orders_products->fields['orders_products_id'] . "'";
    
          $attributes = $db->Execute($attributes_query);
          if ($attributes->RecordCount()) {
            while (!$attributes->EOF) {
              $this->products[$index]['attributes'][$subindex] = array('option' => $attributes->fields['products_options'],
                                                                       'value' => $attributes->fields['products_options_values'],
                                                                       '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();
        }
      }
    
      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' => (is_array($_SESSION['shipping']) ? $_SESSION['shipping']['title'] : $_SESSION['shipping']),
                            'shipping_module_code' => (isset($_SESSION['shipping']['id']) && strpos($_SESSION['shipping']['id'], '_') > 0 ? $_SESSION['shipping']['id'] : $_SESSION['shipping']),
                            'shipping_cost' => $_SESSION['shipping']['cost'],
                            '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'],
                                          '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);
          $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_round(zen_add_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) ,$decimals) * $this->products[$index]['qty'];
          $shown_price +=  zen_round(zen_add_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']), $decimals);
          
          $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'];
          $this->info['subtotal'] += $shown_price;
          $totalTaxAdd = 0;
          foreach ($taxRates as $taxDescription=>$taxRate)
          {
            $taxAdd = 0;
            if ($taxDescription == $products_tax_description)
            {
              if (DISPLAY_PRICE_WITH_TAX == 'true')
              {
                $taxAdd = zen_round($shown_price / (100 + $this->products[$index]['tax']) * $this->products[$index]['tax'], $decimals);
              } else 
              {
                  $taxAdd = zen_calculate_tax($this->products[$index]['final_price'], $this->products[$index]['tax']) * $this->products[$index]['qty'];
                          +  zen_round(zen_calculate_tax($this->products[$index]['onetime_charges'], $this->products[$index]['tax']), $decimals);
              }
              if (isset($this->info['tax_groups'][$taxDescription]))
              {
                $this->info['tax_groups'][$taxDescription] += $taxAdd;
              } else
              {
                $this->info['tax_groups'][$taxDescription] = $taxAdd;
              }
            }
            $totalTaxAdd += $taxAdd;
          }
          $this->info['tax'] += $totalTaxAdd;
          /*********************************************
           * 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;
    
        if ($this->info['total'] == 0) {
          if (DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID == 0) {
            $this->info['order_status'] = DEFAULT_ORDERS_STATUS_ID;
          } else {
            if ($_SESSION['payment'] != 'freecharger') {
              $this->info['order_status'] = DEFAULT_ZERO_BALANCE_ORDERS_STATUS_ID;
            }
          }
        }
    
        if ($_SESSION['shipping'] == 'free_free') {
          $this->info['shipping_module_code'] = $_SESSION['shipping'];
        }
        // 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 > 4 ? 4 : (int)$cOffset));
          $this->info['cc_number'] = str_pad($cStart, 6, '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'], '_') > 0 ? substr($this->info['shipping_module_code'], 0, strpos($this->info['shipping_module_code'], '_')) : $this->info['shipping_module_code']),
                                'coupon_code' => $this->info['coupon_code'],
                                'cc_type' => $this->info['cc_type'],
                                'cc_owner' => $this->info['cc_owner'],
                                'cc_number' => $this->info['cc_number'],
                                'cc_expires' => $this->info['cc_expires'],
                                'date_purchased' => 'now()',
                                'orders_status' => $this->info['order_status'],
                                'order_total' => $this->info['total'],
                                'order_tax' => $this->info['tax'],
                                'currency' => $this->info['currency'],
                                'currency_value' => $this->info['currency_value'],
                                'ip_address' => $_SESSION['customers_ip_address'] . ' - ' . $_SERVER['REMOTE_ADDR']
                                );
    
    
        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 = '';
          // Stock Update - Joao Correia
          if (STOCK_LIMITED == 'true') {
            if (DOWNLOAD_ENABLED == 'true') {
              $stock_query_raw = "select p.products_quantity, pad.products_attributes_filename, p.product_is_always_free_shipping
                                  from " . TABLE_PRODUCTS . " p
                                  left join " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                                   on p.products_id=pa.products_id
                                  left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                                   on pa.products_attributes_id=pad.products_attributes_id
                                  WHERE p.products_id = '" . zen_get_prid($this->products[$i]['id']) . "'";
    
              // Will work with only one option for downloadable products
              // otherwise, we have to build the query dynamically with a loop
              $products_attributes = $this->products[$i]['attributes'];
              if (is_array($products_attributes)) {
                $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
              }
              $stock_values = $db->Execute($stock_query_raw);
            } else {
              $stock_values = $db->Execute("select * from " . TABLE_PRODUCTS . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
            }
    
            $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN');
    
            if ($stock_values->RecordCount() > 0) {
              // do not decrement quantities if products_attributes_filename exists
              if ((DOWNLOAD_ENABLED != 'true') || $stock_values->fields['product_is_always_free_shipping'] == 2 || (!$stock_values->fields['products_attributes_filename']) ) {
                $stock_left = $stock_values->fields['products_quantity'] - $this->products[$i]['qty'];
                $this->products[$i]['stock_reduce'] = $this->products[$i]['qty'];
              } else {
                $stock_left = $stock_values->fields['products_quantity'];
              }
    
              //            $this->products[$i]['stock_value'] = $stock_values->fields['products_quantity'];
    
              $db->Execute("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
    
                // Begin SBA 1.5
                // added to update quantities of products with attributes
                $attribute_search = array();
                $attribute_stock_left = STOCK_REORDER_LEVEL + 1;  // kuroi: prevent false low stock triggers  
    
                if(isset($this->products[$i]['attributes']) and sizeof($this->products[$i]['attributes']) >0){
                    foreach($this->products[$i]['attributes'] as $attributes){
                        $attribute_search[] = $attributes['value_id'];
                    }
                
                    if(sizeof($attribute_search) > 1){
                        $attribute_search = 'where options_values_id in ("'.implode('","', $attribute_search).'")';
                    } else {
                        $attribute_search = 'where options_values_id="' . $attribute_search[0].'"';
                    }
    
                    $query = 'select products_attributes_id from ' . TABLE_PRODUCTS_ATTRIBUTES . ' ' . $attribute_search .' and products_id="' . zen_get_prid($this->products[$i]['id']) . '" order by products_attributes_id';
                    $attributes = $db->Execute($query);
                    $stock_attributes_search = array();
                    while(!$attributes->EOF){
                        $stock_attributes_search[] = $attributes->fields['products_attributes_id'];    
                        $attributes->MoveNext();
                    }
                    if(sizeof($stock_attributes_search) > 1){
                        $stock_attributes_search = implode(',', $stock_attributes_search);
                    } else {
                        foreach($stock_attributes_search as $attribute_search){
                            $stock_attributes_search1 = $attribute_search;
                        }
                        $stock_attributes_search = $stock_attributes_search1;
                    }
                    
                    $get_quantity_query = 'select quantity from ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
    
                  $attribute_stock_available = $db->Execute($get_quantity_query);    
                    $attribute_stock_left = $attribute_stock_available->fields['quantity'] - $this->products[$i]['qty'];
        
                    $attribute_update_query = 'update ' . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . ' set quantity='.$attribute_stock_left.' where products_id="' . zen_get_prid($this->products[$i]['id']) . '" and stock_attributes="' . $stock_attributes_search . '"';
                    $db->Execute($attribute_update_query);    
                }
                // kuroi: End SBA 1.5
    
              //        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.5 kuroi: trigger and details for attribute low stock email
              } elseif ($attribute_stock_left <= STOCK_REORDER_LEVEL) {
                $this->email_low_stock .=  'ID# ' . zen_get_prid($this->products[$i]['id']) . ', ' . $this->products[$i]['model'] . ', ' . $this->products[$i]['name'] . ', ';
                            foreach($this->products[$i]['attributes'] as $attributes){
                                $this->email_low_stock .= $attributes['option'] . ': ' . $attributes['value'] . ', ';
                            }
                            $this->email_low_stock .= 'Stock: ' . $attribute_stock_left . "\n\n";
              }
            }
          }
    
          // Update products_ordered (for bestsellers list)
          //    $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . zen_get_prid($order->products[$i]['id']) . "'");
          $db->Execute("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%f', $this->products[$i]['qty']) . " where products_id = '" . zen_get_prid($this->products[$i]['id']) . "'");
    
          $this->notify('NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END');
    
          $sql_data_array = array('orders_id' => $zf_insert_id,
                                  'products_id' => zen_get_prid($this->products[$i]['id']),
                                  'products_model' => $this->products[$i]['model'],
                                  'products_name' => $this->products[$i]['name'],
                                  'products_price' => $this->products[$i]['price'],
                                  'final_price' => $this->products[$i]['final_price'],
                                  'onetime_charges' => $this->products[$i]['onetime_charges'],
                                  'products_tax' => $this->products[$i]['tax'],
                                  'products_quantity' => $this->products[$i]['qty'],
                                  'products_priced_by_attribute' => $this->products[$i]['products_priced_by_attribute'],
                                  'product_is_free' => $this->products[$i]['product_is_free'],
                                  'products_discount_type' => $this->products[$i]['products_discount_type'],
                                  'products_discount_type_from' => $this->products[$i]['products_discount_type_from'],
                                  'products_prid' => $this->products[$i]['id']);
          zen_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
    
          $order_products_id = $db->Insert_ID();
    
          $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', $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');
    
          // build output for email notification
          $this->products_ordered .=  $this->products[$i]['qty'] . ' x ' . $this->products[$i]['name'] . ($this->products[$i]['model'] != '' ? ' (' . $this->products[$i]['model'] . ') ' : '') . ' = ' .
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
          ($this->products[$i]['onetime_charges'] !=0 ? "\n" . TEXT_ONETIME_CHARGES_EMAIL . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
          $this->products_ordered_attributes . "\n";
          $this->products_ordered_html .=
          '<tr>' . "\n" .
          '<td class="product-details" align="right" valign="top" width="30">' . $this->products[$i]['qty'] . '&nbsp;x</td>' . "\n" .
          '<td class="product-details" valign="top">' . nl2br($this->products[$i]['name']) . ($this->products[$i]['model'] != '' ? ' (' . nl2br($this->products[$i]['model']) . ') ' : '') . "\n" .
          '<nobr>' .
          '<small><em> '. nl2br($this->products_ordered_attributes) .'</em></small>' .
          '</nobr>' .
          '</td>' . "\n" .
          '<td class="product-details-num" valign="top" align="right">' .
          $currencies->display_price($this->products[$i]['final_price'], $this->products[$i]['tax'], $this->products[$i]['qty']) .
          ($this->products[$i]['onetime_charges'] !=0 ?
          '</td></tr>' . "\n" . '<tr><td class="product-details">' . nl2br(TEXT_ONETIME_CHARGES_EMAIL) . '</td>' . "\n" .
          '<td>' . $currencies->display_price($this->products[$i]['onetime_charges'], $this->products[$i]['tax'], 1) : '') .
          '</td></tr>' . "\n";
        }
    
        $order_total_modules->apply_credit();//ICW ADDED FOR CREDIT CLASS SYSTEM
        $this->notify('NOTIFY_ORDER_AFTER_ORDER_CREATE_ADD_PRODUCTS');
      }
    
    
      function send_order_email($zf_insert_id, $zf_mode) {
        global $currencies, $order_totals;
        if ($this->email_low_stock != '' and SEND_LOWSTOCK_EMAIL=='1') {
          // send an email
          $email_low_stock = SEND_EXTRA_LOW_STOCK_EMAIL_TITLE . "\n\n" . $this->email_low_stock;
          zen_mail('', SEND_EXTRA_LOW_STOCK_EMAILS_TO, EMAIL_TEXT_SUBJECT_LOWSTOCK, $email_low_stock, STORE_OWNER, EMAIL_FROM, array('EMAIL_MESSAGE_HTML' => nl2br($email_low_stock)),'low_stock');
        }
    
        // lets start with the email confirmation
        // make an array to store the html version
        $html_msg=array();
    
        //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);
    
        //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_DISCLAIMER, STORE_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));
        zen_mail($this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id, $email_order, STORE_NAME, EMAIL_FROM, $html_msg, 'checkout', $this->attachArray);
    
        // BOF rl_invoice3
        $this->attachArray = array();
        if(RL_INVOICE3_SEND_PDF=='1'){
            if(!(0==$this->info['total'] && RL_INVOICE3_NOT_NULL_INVOICE==0)){     
                if( (defined('RL_INVOICE3_ORDERSTATUS')) && ($this->info['order_status'] >= RL_INVOICE3_ORDERSTATUS)) {
                    require_once(DIR_WS_INCLUDES . 'classes/class.rl_invoice3.php');
                    
                    $pdfT = new rl_invoice3($zf_insert_id, $paper['orientation'], $paper['unit'], $paper['format']);
                    $pdfT -> createPdfFile(true);
                    $this->attachArray = $pdfT->getPDFAttachments();
                    #$this->attachArray[] = array('file'=>$x, 'mime_type'=>'pdf');
                }
            }
        }
        zen_mail($this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id, $email_order, STORE_NAME, EMAIL_FROM, $html_msg, 'checkout', $this->attachArray);
        // EOF rl_invoice3
        
        // send additional emails
        if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
          $extra_info=email_collect_extra_info('','', $this->customer['firstname'] . ' ' . $this->customer['lastname'], $this->customer['email_address'], $this->customer['telephone']);
          $html_msg['EXTRA_INFO'] = $extra_info['HTML'];
    
          // 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'];
          }
                $this->notify('NOTIFY_ORDER_INVOICE_CONTENT_FOR_ADDITIONAL_EMAILS', array('zf_insert_id' => $zf_insert_id, 'text_email' => $email_order, 'html_email' => $html_msg));
    
          if(method_exists($pdfT, "getPDFAttachments")){
            $this->attachArray = $pdfT->getPDFAttachments('NO');
          }
          zen_mail('', SEND_EXTRA_ORDER_EMAILS_TO, SEND_EXTRA_NEW_ORDERS_EMAILS_TO_SUBJECT . ' ' . EMAIL_TEXT_SUBJECT . EMAIL_ORDER_NUMBER_SUBJECT . $zf_insert_id,
          $email_order . $extra_info['TEXT'], STORE_NAME, EMAIL_FROM, $html_msg, 'checkout_extra', $this->attachArray);
        }
        $this->notify('NOTIFY_ORDER_AFTER_SEND_ORDER_EMAIL', array($zf_insert_id, $email_order, $extra_info, $html_msg));
      }
    
    }
    Folgende erweiterungen sind drinn:
    PDF Rechnung
    Buttonlösung
    Stock by Atributes
    das läuft auch alles problemlos.

    Bei der Order PHP weiter oben von webchillis habe ich das Problem, im Kundenbereich kann ich keine Bestellung einsehen, weisse Seite...

    HTML-Code:
    [20-Nov-2012 18:09:39] PHP Fatal error:  1054:Unknown column 'COWOA_order' in 'field list' :: 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 ,COWOA_order
                                from X_orders
                                where orders_id = '97' in /var/w/w/html/SHOP/includes/classes/db/mysql/query_factory.php on line 101
    Ich habe aber auch COWA nicht eingebaut

    danke schon mal für einen Tipp

    Grüße

    Guido

    Einen Kommentar schreiben:


  • Beowolf
    antwortet
    Noch mal zu meiner Orders.php.

    Kann es sein, das dieser Eintrag zu viel ist? Bei Zeile 264 - 271.

    Code:
              $db->Execute("insert into " . TABLE_ORDERS_STATUS_HISTORY . "
                          (orders_id, orders_status_id, date_added, customer_notified, comments)
                          values ('" . (int)$oID . "',
                          '" . zen_db_input($status) . "',
                          now(),
                          '" . zen_db_input($customer_notified) . "',
                          '" . zen_db_input($comments)  . "')");
              $order_updated = true;
    Grüße und Danke

    Einen Kommentar schreiben:


  • Domain
    antwortet
    tag beowolf

    Tschjah ... zum Magento

    Schlimm = dasses sogut wie e-b-a-y gehört und bei Heise viele jammern, das quelloffen schon gar nicht mehr in allen Varianten standart ist. Das widerspricht dem Grundgedanken an Open-Source doch sehr...

    *Bessere Funktionen* wie bei ZEN sehe ich nicht, ok, Navi oben ist cool aber sonst... hm... da hab ich heissere Varianten schon mit WordPress entdeckt. Aber das geht halt gar nicht wg. sicher!

    In punkto Sicherheit halte ich ZEN für sehr kompetent! - da kommt so schnell nix anderes hin, obwohl 100% safe wird es nie geben. NIEMALS und NIRGENDWO !!! Auf keinem Server der Welt!

    Der *Gäg* mit dem ZOOM in die Pix ist ja auch uralt, und als Plugin erhältlich - Ergo, das kann man auch jederzeit in ZEN einbauen.

    Daher.. ich kenn vieles in Sachen Shops (auch von Kunden), aber ich denke - trotz mergen - ich werde so schnell nicht mehr umbauen und ZEN defi die Treue halten, den letztlich laufen die ZENS, und es nützt ja nix,
    wenn andere Shoppies klasse aussehen, aber der Betreiber oder der Admin kreischen muss, weil er es ned so hinkriegt wie er es haben mag. Ich denke, man muss auch so ehrlich sein und deutlich sagen, ein Web-Shop ist nix für Newbies das kannste knixen, aber das ist in allen anderen Shop-System auch so.

    Und deutlich: Das war nur ein erster Eindruck, ich kenne Magento viel zu wenig, als daß ich mir ein Urteil erlauben könnte, aber nach 15 mins *gugeln* lasse ich da die Fingerchen von.

    Und zum mergen und den guten alten DOS Zeiten: JOH - was habe ich das vermisst...

    Aber letztlich geht die Entwicklung hier in die richtige Richtung, wenn das mergen automatisiert wird (und das wird doch kommen, denn so ist ja im Mom keiner 100% zufrieden) dann ist zen so offen, das man wirklich alles realisieren kann.

    Ich mache jetzt meine 2ten 1.5er, hatte 3 1.38er und staune immer noch jeden Tag, wie geil manches hier gelöst ist...

    Wirklich cool wäre mal eine Reihenfolge, wie man welche Module am besten einspielt, um das mergen so gering wie möglich zu halten! Gerade jetzt, wo 1.5 noch überschaubar ist...

    Naja, 4 Stühle, 5 Meinungen wie so oft...

    und lasse dich wg mir nicht vom Magenten* abhalten, aber ich empfehle Dir mal, Heise (auch zwischen den Zeilen) zu lesen, ehe du deine Zeit *versemmelst*

    Beste Grüsse

    Einen Kommentar schreiben:


  • Beowolf
    antwortet
    Zitat von Domain Beitrag anzeigen
    Guten Abend,

    ....
    Zitat von Domain
    Aber mergen... Gott is das Kacke )))))))))))

    ....
    Wenn man es aber langsam rafft ( Zungeschnalz - Gott ist das genial) dann hoffe ich, daß es *ein biß-chen* anwenderfreundlicher wird in Sachen Plug-ins und mergen, denn ich fürchte, das schreckt
    viele nach den ersten missratenen Versuchen doch ab und zen endet als Dateileiche auf mancher Platte.

    .....
    Beim mergen komme ich mir vor wie zu den alten DOS-Zeiten und Kommandozeileninterpreter. Das war damals schon mehr als grauenhaft.

    Ich will es nicht schwarz malen, und auch von mir Respekt für die ganze tolle Arbeit, ABER, wenn sich da auf die Dauer nichts ändert, wird das der meiner Meinung nach ein großes Problem für ZenCart.

    Schaue dir mal das Magento Community Shop-System an. Auch kostenlos. Habe mir mal einen "Probe-Shop" aufgespielt. Nicht schlecht das System.

    Grüße
    Manfred

    Einen Kommentar schreiben:


  • Domain
    antwortet
    Guten Abend,

    Zitat von Domain
    -- Die gibt der derzeitige Zen-Cart Code aber halt nicht her. Es gibt kein Pluginsystem, es werden Corefiles verändert. Das kann man mögen oder nicht, es ist leider so.

    Ja schon logo, das war auch nicht als Kritik gemeint, eher als Anregung für kommende Versionen, ist doch schade, wenn viele von ZEN wieder zu OScomm-Scherz umschwenken,
    nur weil Sie massiv Probs haben, n paar Plug-ins einzubauen.

    Zitat von Domain
    -- Und wenn dann ein weiteres Modul integriert werden soll, muss nicht mehr gemerged werden oder wie?

    Auch das liest sich böser* als es gemeint war...
    Ich sagte, die meisten Module inclusive, nicht alles was bei drei nicht auf den Bäumen ist. Alternativ liesse sich auch eine *umfangreichere Zweitversion* zum Download einstellen...

    Zitat von Doamin
    -- Hier gehts ja nicht um Traffic.

    Naja, was ist dann gemeint? Die paar Admin - Einstellungen, oder die Menge an zusätzlichen Datei / Datenbanken ?

    Zitat von Domain
    Aber mergen... Gott is das Kacke )))))))))))

    -- Ganz Deiner Meinung. Ich hätt auch lieber ein Pluginsystem à la WordPress. Wenn Du eins geschrieben hast, lass es mich wissen.

    Ich gestehe Dir mal, ich habe sowas in der Art mal für nen Kunden gemacht... soooon* Riesen Hexenwerk ist das gar nicht. Allerdings wurden die Files ZENTRAL von einem Server geholt
    und Kunden / Downloader hatten einen festen Account, das vereinfacht vieles...

    Aber z.B. ... da habt ihr nun eine gute Installationsroutine und eigentlich wäre es z.B: keine grosse Sache, einmal zuerst DEINTEMPLATE anzugeben und dann die fertige Struktur zu kriegen
    als durch jeden Ordner zu klixen und zu guggen, ob DEINTEMPLATE geändert werden muss...

    In der PDF (zumindest bei mir) war die PDF Zeile fürs mergen nicht kommentiert, nach COWOA und einigen fieldsets/ Tables ist da nix mehr gleich... so ziehen sich noch viele Kleinigkeiten noch durch das Zen System

    Wenn man es aber langsam rafft ( Zungeschnalz - Gott ist das genial) dann hoffe ich, daß es *ein biß-chen* anwenderfreundlicher wird in Sachen Plug-ins und mergen, denn ich fürchte, das schreckt
    viele nach den ersten missratenen Versuchen doch ab und zen endet als Dateileiche auf mancher Platte.

    Wie immer... nur meine pers. Meinung mit dem deutlichen Hinweis, das ich weiss, wieviel unendlicher FLEISS und ARBEIT in einem so mächtigen System steckt, und ich vermute, zu Allem kommt noch, daß
    ihr das in eurer *Freizeit* und mit einer Eselsgeduld macht und natürlich keine Kohle dafür bekommt.

    Es waren nur Gedanken zum Thema, keinesfalls sollte es negativ wirken.

    In diesem Sinne

    Vielen Dank, Grosse Klasse, Respekt

    Beste Grüsse


    P.S.:
    Antwort ist auch nicht nötig, denn letztlich kann man da ja nix auf die Schnelle daran ändern, nur so ganz unkommentiert wollte ich es halt auch ned stehen lassen...

    Einen Kommentar schreiben:


  • webchills
    antwortet
    Zitat von Domain Beitrag anzeigen
    Jedenfalls: mein Fazit nach viel MERGEN - DAS ist DEFI kein Königsweg - insbesondere wenn man sich andere gelungene *Plug-in install Routinen anschaut*
    Die gibt der derzeitige Zen-Cart Code aber halt nicht her. Es gibt kein Pluginsystem, es werden Corefiles verändert. Das kann man mögen oder nicht, es ist leider so.

    Zitat von Domain Beitrag anzeigen
    Deshalb plädiere ich tendenziell auch für die KOMPLETTE Grundinstallation mit den meisten Modulen inclusive
    Und wenn dann ein weiteres Modul integriert werden soll, muss nicht mehr gemerged werden oder wie?

    Zitat von Doamin Beitrag anzeigen
    Das Argument von unnötig aufgebläht kann man m.E. in der heutigen Zeit vergessen, ein einziges PDF oder grosses, nicht komprimiertes IMAGE macht genausoviel Traffic.
    Hier gehts ja nicht um Traffic.

    Zitat von Domain Beitrag anzeigen
    Aber mergen... Gott is das Kacke )))))))))))
    Ganz Deiner Meinung. Ich hätt auch lieber ein Pluginsystem à la WordPress. Wenn Du eins geschrieben hast, lass es mich wissen.

    Einen Kommentar schreiben:

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