Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: PDF Rechnung versendet keine Rechnung und Agb usw. mehr.

  1. #11
    Jedi-Ritter Avatar von webchills
    Registriert seit
    30.10.2004
    Ort
    Österreich
    Beiträge
    6.092
    Themen
    85
    DANKE
    3
    Erhaltene Danke: 961

    Standard

    Es geht darum ALLE Dateien von den diversen Modulen, die Du integriert hast, die Originaldateien verändert haben, anzuschauen und die jeweiligen Änderungen Schritt für Schritt mit den Orginal Zen-Cart Files zu mergen.
    Ich weiss nicht, welche Erweiterungen Du alle aktiv hast, ich sehe Deine Files nicht und kann daher auch keine Standardlösung posten. Das ist völlig individuell und eine Fehlersuche erfordert Zeit und eine Analyse aller betroffenen Dateien.
    Ein nützliches Tool zum Mergen habe ich empfohlen. Viel Erfolg.
    !!! kostenloser Support ausschließlich im Forum - Nicht per Email, nicht per Telefon und nicht per PM !!!

  2. #12
    Padawan Stufe I Avatar von Domain
    Registriert seit
    24.01.2011
    Ort
    Landei innem erloschenen Vulkankrater
    Beiträge
    72
    Themen
    10
    DANKE
    8
    erhaltene Danke

    Pfeil mergen

    Zitat Zitat von webchills Beitrag anzeigen
    Es geht darum ALLE Dateien von den diversen Modulen, die Du integriert hast, die Originaldateien verändert haben, anzuschauen und die jeweiligen Änderungen Schritt für Schritt mit den Orginal Zen-Cart Files zu mergen.
    Ich weiss nicht, welche Erweiterungen Du alle aktiv hast, ich sehe Deine Files nicht und kann daher auch keine Standardlösung posten. Das ist völlig individuell und eine Fehlersuche erfordert Zeit und eine Analyse aller betroffenen Dateien.
    Ein nützliches Tool zum Mergen habe ich empfohlen. Viel Erfolg.
    Also, vorab... Webchills, was Du hier alles so machst, DIR gehört ein DENKMAL gesetzt!!

    Aber fachlich... das mergen is n Elendsjob, ich hab mich auch schon nächtelang damit rumgequält und ich kann PHP / MySQL lesen wie andere ne Bildzeitung...
    Aber für nen *normalen* Shopbetreiber ist es einfach nicht mehr machbar. Ein weiteres GROSSES Prob isses, wenn man als Drittprogger dann in einem bestehenden Shop Dinge vergleichen / anpassen / erweitern muss - da kannste ja wahnsinnig werden.

    Deshalb plädiere ich tendenziell auch für die KOMPLETTE Grundinstallation mit den meisten Modulen inclusive. Das Argument von unnötig aufgebläht kann man m.E. in der heutigen Zeit vergessen, ein einziges PDF oder grosses, nicht komprimiertes IMAGE macht genausoviel Traffic.

    Und das zweite Argument, das man *das nicht braucht* .. nun gut, man könnte es trotzdem installern, und per klick abschalten... zumal das allermeiste dann ja auch gar nicht in die entsprechende Abfrage/Schleife läuft.

    Jedenfalls: mein Fazit nach viel MERGEN - DAS ist DEFI kein Königsweg - insbesondere wenn man sich andere gelungene *Plug-in install Routinen anschaut* - und einem ambitionierten Webmaster mit rudimentären Kenntnissen einfach nicht zuzumuten, der is schon heilfroh, wenn er noch 'n Fieldset um vieles in reinem HTML hinwurschteln kann.

    Nichts desto Trotz - I love ZEN und dieses Forum, wohl das BESTE Shop-SYSTEM, das man seit vielen Jahren finden kann, vom grandiosen Support (Merci Eentje und DIR und den vielen Helfenden) mal ganz abgesehen.

    Aber mergen... Gott is das Kacke )))))))))))

    In diesem Sinne, nicht böse sein, nur meine pers Erfahrung mit diversen Modulen und zum Schluss der PDF Rechnung - ich kann nur empfehlen, erstmal pdf, dann die anderen Module ( COWOA usw)

    Beste Grüsse
    Geändert von Domain (29.08.2012 um 00:59 Uhr)
    livin' is easy with eyes closed...

  3. #13
    Jedi-Ritter Avatar von webchills
    Registriert seit
    30.10.2004
    Ort
    Österreich
    Beiträge
    6.092
    Themen
    85
    DANKE
    3
    Erhaltene Danke: 961

    Standard

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

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

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

    Zitat Zitat von Domain Beitrag anzeigen
    Aber mergen... Gott is das Kacke )))))))))))
    Ganz Deiner Meinung. Ich hätt auch lieber ein Pluginsystem à la WordPress. Wenn Du eins geschrieben hast, lass es mich wissen.
    !!! kostenloser Support ausschließlich im Forum - Nicht per Email, nicht per Telefon und nicht per PM !!!

  4. #14
    Padawan Stufe I Avatar von Domain
    Registriert seit
    24.01.2011
    Ort
    Landei innem erloschenen Vulkankrater
    Beiträge
    72
    Themen
    10
    DANKE
    8
    erhaltene Danke

    Standard

    Guten Abend,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    In diesem Sinne

    Vielen Dank, Grosse Klasse, Respekt

    Beste Grüsse


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

  5. #15
    Padawan Stufe V Avatar von Beowolf
    Registriert seit
    14.06.2011
    Beiträge
    666
    Themen
    197
    DANKE
    60
    Erhaltene Danke: 14
    Erstellt von

    Standard

    Zitat Zitat von Domain Beitrag anzeigen
    Guten Abend,

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

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

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

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

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

    Grüße
    Manfred

  6. #16
    Padawan Stufe I Avatar von Domain
    Registriert seit
    24.01.2011
    Ort
    Landei innem erloschenen Vulkankrater
    Beiträge
    72
    Themen
    10
    DANKE
    8
    erhaltene Danke

    Standard 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
    livin' is easy with eyes closed...

  7. #17
    Padawan Stufe V Avatar von Beowolf
    Registriert seit
    14.06.2011
    Beiträge
    666
    Themen
    197
    DANKE
    60
    Erhaltene Danke: 14
    Erstellt von

    Standard

    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

  8. #18
    Padawan Stufe V Avatar von bumerang24
    Registriert seit
    25.11.2011
    Ort
    München
    Beiträge
    521
    Themen
    65
    DANKE
    25
    Erhaltene Danke: 38

    Standard 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

  9. #19
    Padawan Stufe II Avatar von sierra83
    Registriert seit
    31.08.2007
    Ort
    Bad Fischau Brunn
    Beiträge
    85
    Themen
    21
    DANKE
    4
    erhaltene Danke

    Standard

    Ist mit Developers Tool Kit der Eintrag COWOA_order zu finden?

    Mfg Stefan

  10. #20
    Jedi-Ritter Avatar von webchills
    Registriert seit
    30.10.2004
    Ort
    Österreich
    Beiträge
    6.092
    Themen
    85
    DANKE
    3
    Erhaltene Danke: 961

    Standard

    Zitat 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.
    !!! kostenloser Support ausschließlich im Forum - Nicht per Email, nicht per Telefon und nicht per PM !!!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Rechnung nicht versendet
    Von my-poi im Forum Archivierte Beiträge Zen-Cart Support
    Antworten: 5
    Letzter Beitrag: 17.06.2011, 10:21
  2. Shop versendet nach Umzug keine Mails mehr
    Von rabo im Forum Archivierte Beiträge Zen-Cart Support
    Antworten: 2
    Letzter Beitrag: 29.07.2009, 11:36
  3. PDF Rechnung zeigt keine Umlaute
    Von streamer im Forum Archivierte Beiträge Zen-Cart Support
    Antworten: 7
    Letzter Beitrag: 01.02.2009, 09:45
  4. PDF Rechnung wird nicht mehr gespeichert!
    Von l46tilo im Forum Archivierte Beiträge Zen-Cart Support
    Antworten: 1
    Letzter Beitrag: 11.06.2007, 23:19
  5. Bekomme überhaupt keine Rechnung
    Von jovandeik im Forum Archivierte Beiträge Zen-Cart Support
    Antworten: 7
    Letzter Beitrag: 20.12.2006, 19:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
zen-cart-pro.at
Zen Cart ist eine kostenlose unter der GPL-Lizenz veröffentlichte Open-Source Shopsoftware. Das System wird in den USA entwickelt, die amerikanische Website dazu ist www.zen-cart.com

Die deutsche Zen-Cart Version, um die es hier auf zen-cart-pro.at geht, ist eine Anpassung der amerikanischen Version an die Bedürfnisse von Onlineshopbetreibern im deutschsprachigen Raum.

Die deutsche Zen Cart Version wird von einem Team von Entwicklern in Österreich und Deutschland betreut, weiterentwickelt und supportet und steht kostenlos in unserem Downloadbereich zur Verfügung.

[mehr]
Follow Us
  • zen-cart-pro-at auf Twitter
  • zen-cart-pro-at auf Github
  • zen-cart-pro-at auf SourceForge
Aktuelle Version
Zen Cart 1.5.5 deutsch
Revision 1188 vom 02.12.2016
[Download]