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

    #16
    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

    Kommentar


      #17
      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

      Kommentar


        #18
        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

        Kommentar


          #19
          Ist mit Developers Tool Kit der Eintrag COWOA_order zu finden?

          Mfg Stefan

          Kommentar


            #20
            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.

            Kommentar


              #21
              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

              Kommentar


                #22
                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));
                  }
                
                }

                Kommentar


                  #23
                  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

                  Kommentar


                    #24
                    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',
                    ),
                    ),

                    Kommentar


                      #25
                      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

                      Kommentar


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

                        Kommentar


                          #27
                          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

                          Kommentar

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

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