Anleitung offene Warenkörbe mit Bestellabschluss

© 2008 Estelco

(no warranty) released under GPL

1. BACKUP MACHEN!!!

2. SQL-Datei rcs.sql per phpmyadmin o.ä. in die DB einfügen

3. Dateien bearbeiten

admin/includes/application_top.php

im Bereich der FILENAME defines einfügen:

define('FILENAME_RECOVER_CART_SALES', 'recover_cart_sales.php');
define('FILENAME_STATS_RECOVER_CART_SALES', 'stats_recover_cart_sales.php');
define('FILENAME_CATALOG_PRODUCT_INFO', 'product_info.php');
define('FILENAME_CATALOG_LOGIN', 'login.php');
define('TABLE_SCART', 'scart');

admin/includes/column_left.php

einfügen:

im Bereich echo ('<div class="dataTableHeadingContent"><b>'.BOX_HEADING_STATISTICS.'</b></div>');

if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['stats_recover_cart_sales'] == '1')) echo '<a href="' . xtc_href_link(FILENAME_STATS_RECOVER_CART_SALES, '', 'NONSSL') . '" class="menuBoxContentLink"> -' . BOX_REPORTS_RECOVER_CART_SALES . '</a><br>';

im Bereich echo ('<div class="dataTableHeadingContent"><b>'.BOX_HEADING_TOOLS.'</b></div>');

if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['recover_cart_sales'] == '1')) echo '<a href="' . xtc_href_link(FILENAME_RECOVER_CART_SALES) . '" class="menuBoxContentLink"> -' . BOX_TOOLS_RECOVER_CART . '</a><br>';

als letzte Zeile:

if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['recover_cart_sales'] == '1')) echo '<a href="' . xtc_href_link(FILENAME_CONFIGURATION, 'gID=33', 'NONSSL') . '" class="menuBoxContentLink"> -' . BOX_CONFIGURATION_33 . '</a><br>';

admin/includes/classes/shopping_cart.php

ca. Zeile 21

  function shoppingCart() {
    $this->reset();
  }
danach einfügen
  function restoreCustomersCart($customers_id) {
    $this->reset(false);

    $products_query = xtc_db_query("select products_id, customers_basket_quantity from ".TABLE_CUSTOMERS_BASKET." where customers_id = '$customers_id'");
    while ($products = xtc_db_fetch_array($products_query)) {
      $this->contents[$products['products_id']] = array ('qty' => $products['customers_basket_quantity']);
      // attributes
      $attributes_query = xtc_db_query("select products_options_id, products_options_value_id from ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." where customers_id = '$customers_id' and products_id = '".$products['products_id']."'");
      while ($attributes = xtc_db_fetch_array($attributes_query)) {
        $this->contents[$products['products_id']]['attributes'][$attributes['products_options_id']] = $attributes['products_options_value_id'];
      }
    }
    $this->calculate();
  }

  function get_content_type() {
        $this->content_type = false;

        if ((DOWNLOAD_ENABLED == 'true') && ($this->count_contents() > 0)) {
            reset($this->contents);
            while (list ($products_id,) = each($this->contents)) {
                if (isset ($this->contents[$products_id]['attributes'])) {
                    reset($this->contents[$products_id]['attributes']);
                    while (list (, $value) = each($this->contents[$products_id]['attributes'])) {
                        $virtual_check_query = xtc_db_query("select count(*) as total from ".TABLE_PRODUCTS_ATTRIBUTES." pa, ".TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD." pad where pa.products_id = '".$products_id."' and pa.options_values_id = '".$value."' and pa.products_attributes_id = pad.products_attributes_id");
                        $virtual_check = xtc_db_fetch_array($virtual_check_query);

                        if ($virtual_check['total'] > 0) {
                            switch ($this->content_type) {
                                case 'physical' :
                                    $this->content_type = 'mixed';
                                    return $this->content_type;
                                    break;

                                default :
                                    $this->content_type = 'virtual';
                                    break;
                            }
                        } else {
                            switch ($this->content_type) {
                                case 'virtual' :
                                    $this->content_type = 'mixed';
                                    return $this->content_type;
                                    break;

                                default :
                                    $this->content_type = 'physical';
                                    break;
                            }
                        }
                    }
                } else {
                    switch ($this->content_type) {
                        case 'virtual' :
                            $this->content_type = 'mixed';
                            return $this->content_type;
                            break;

                        default :
                            $this->content_type = 'physical';
                            break;
                    }
                }
            }
        } else {
            $this->content_type = 'physical';
        }
        return $this->content_type;
    }
  

admin/includes/functions/general.php

suchen nach

function xtc_get_products_url($product_id, $language_id) {
$product_query = xtc_db_query("select products_url from ".TABLE_PRODUCTS_DESCRIPTION." where products_id = '".$product_id."' and language_id = '".$language_id."'");
$product = xtc_db_fetch_array($product_query);

return $product['products_url'];
}

danach einfügen:

function xtc_get_products_special_price($product_id, $customer_id, $qty = 1){
$customer_group_query = xtc_db_query("select customers_status from " . TABLE_CUSTOMERS . " where customers_id = '" . $customer_id . "'");
$customer_group = xtc_db_fetch_array($customer_group_query);
$personal_query = xtc_db_query("SELECT personal_offer FROM " . TABLE_PERSONAL_OFFERS_BY . $customer_group['customers_status'] . " WHERE products_id=" . (int)$product_id . " AND quantity<=" . (int)$qty . " ORDER BY quantity DESC LIMIT 1");
if (xtc_db_num_rows($personal_query)) {
  $personal = xtc_db_fetch_array($personal_query);
  return $personal['personal_offer'];
}
$product_query = xtc_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "' and status");
$product = xtc_db_fetch_array($product_query);
return $product['specials_new_products_price'];
}

includes/modules/order_total/ot_loworderfee.php

ca. Zeile 36

      //include needed functions
      require_once(DIR_FS_INC . 'xtc_calculate_tax.inc.php');

Diesen Code löschen, er ist überflüssig und sorgt bei aktiviertem Mindermengenzuschlag für Fehler mit dieser Erweiterung.

lang/german/admin/buttons.php

anfügen (vor dem ?>)

define('BUTTON_COMPLETE', 'Bestellung abschlie&szlig;en');

lang/german/admin/german.php

anfügen (vor dem ?>)

  define('BOX_CONFIGURATION_33', 'Offene Warenk&ouml;rbe');
  define('BOX_REPORTS_RECOVER_CART_SALES', 'Wiederhergestellte Warenk&ouml;rbe');
  define('BOX_TOOLS_RECOVER_CART', 'Offene Warenk&ouml;rbe');
  define('TAX_ADD_TAX','inkl. ');
  define('TAX_NO_TAX','zzgl. ');

lang/german/admin/configuration.php

anfügen (vor dem ?>)

// Recover Cart Sales

define('RCS_BASE_DAYS_TITLE', 'Zeitraum');
define('RCS_BASE_DAYS_DESC', 'Anzahl der vergangenen Tage f&uuml;r nicht abgeschlossene Warenk&ouml;rbe.');
define('RCS_REPORT_DAYS_TITLE', 'Verkaufsbericht Zeitraum');
define('RCS_REPORT_DAYS_DESC', 'Anzahl der Tage, die ber&uuml;cksichtigt werden sollen. Je mehr, desto l&auml;nger dauert die Abfrage!');
define('RCS_EMAIL_TTL_TITLE', 'Lebensdauer Email');
define('RCS_EMAIL_TTL_DESC','Anzahl der Tage, die die E-Mail als gesendet markiert wird');
define('RCS_EMAIL_FRIENDLY_TITLE', 'Pers&ouml;nliche E-Mails');
define('RCS_EMAIL_FRIENDLY_DESC', 'Wenn <b>true</b> wird der Name des Kunden in der Anrede verwendet. Wenn <b>false</b> wird eine allgemeine Anrede verwendet.');
define('RCS_EMAIL_COPIES_TO_TITLE', 'E-Mail Kopien an');
define('RCS_EMAIL_COPIES_TO_DESC', 'Wenn Kopien der Emails an die Kunden versendet werden sollen, bitte Empf&auml;nger hier eintragen.');
define('RCS_SHOW_ATTRIBUTES_TITLE', 'Attribute anzeigen');
define('RCS_SHOW_ATTRIBUTES_DESC', 'Kontrolliert die Anzeige von Attributen.<br>Einige Shops nutzen Produktattribute.<br>Auf <b>true</b> setzen, wenn die Attribute angezeigt werden sollen, ansonsten auf <b>false</b>.');
define('RCS_CHECK_SESSIONS_TITLE', 'Ignoriere Kunden mit Sitzung');
define('RCS_CHECK_SESSIONS_DESC', 'Wenn Kunden mit aktiver Sitzung ignoriert werden sollen (z.B. weil sie noch einkaufen), w&auml;hlen sie <b>true</b>.<br>Wenn auf <b>false</b> gesetzt, werden die Sitzungsdaten ignoriert (schneller).');
define('RCS_CURCUST_COLOR_TITLE', 'Farbe aktiver Kunde');
define('RCS_CURCUST_COLOR_DESC', 'Farbe, die aktive Kunden markiert<br>Ein &quot;aktiver Kunde&quot; hat bereits Artikel im Shop bestellt.');
define('RCS_UNCONTACTED_COLOR_TITLE', 'Farbe "noch nicht kontaktiert"');
define('RCS_UNCONTACTED_COLOR_DESC', 'Hintergrundfarbe f&uuml;r noch nicht kontaktierte Kunden.<br>Ein nicht kontaktierter Kunde wurde noch <i>nicht</i> mit diesem Tool angeschrieben.');
define('RCS_CONTACTED_COLOR_TITLE', 'Farbe kontaktiert');
define('RCS_CONTACTED_COLOR_DESC', 'Hintergrundfarbe f&uuml;r kontaktierte Kunden.<br>Ein kontaktierter Kunde wurde bereits mit diesem Tool <i>informiert</i>.');
define('RCS_MATCHED_ORDER_COLOR_TITLE', 'Farbe alternative Bestellung gefunden');
define('RCS_MATCHED_ORDER_COLOR_DESC', 'Hintergrundfarbe f&uuml;r gefundene alternative Bestellungen.<br>Diese wird verwendet, wenn sich ein oder mehrere Artikel im offenen Warenkorb befinden und die E-Mail-Adresse oder die Kundennummer mit einer anderen Bestellung &uuml;bereinstimmt (siehe n&auml;chster Punkt).');
define('RCS_SKIP_MATCHED_CARTS_TITLE', '&Uuml;berspringe alternative Warenk&ouml;rbe');
define('RCS_SKIP_MATCHED_CARTS_DESC', 'Pr&uuml;fen, ob der Kunde den Warenkorb alternativ abgeschlossen hat (z.B. &uuml;ber Gastzugang statt per Anmeldung).');
define('RCS_AUTO_CHECK_TITLE', '"sichere" Warenk&ouml;rbe automatisch markieren');
define('RCS_AUTO_CHECK_DESC', 'Um Eintr&auml;ge, die relativ sicher sind (z.B. noch nicht existierende Kunden, noch nicht angemailt, etc.) zu markieren, setzen Sie <b>true</b>.<br>Wenn auf <b>false</b> gesetzt, werden keine Eintr&auml;ge vorausgew&auml;hlt.');
define('RCS_CARTS_MATCH_ALL_DATES_TITLE', 'Verwende Bestellungen jeden Datums');
define('RCS_CARTS_MATCH_ALL_DATES_DESC', 'Wenn <b>true</b> wird jede Bestellung des Kunden f&uuml;r die alternativen Abschl&uuml;sse herangezogen.<br>Wenn <b>false</b> werden nur Bestellungen im Zeitraum nach dem ablegen des letzten Artikels im Warenkorb gesucht.');
define('RCS_PENDING_SALE_STATUS_TITLE', 'Mindestbestellstatus');
define('RCS_PENDING_SALE_STATUS_DESC', 'H&ouml;chster Status, den eine Bestellung haben kann, um immer noch als offen zu gelten. Alle Werte dar&uuml;ber werden als Kauf gewertet');
define('RCS_REPORT_EVEN_STYLE_TITLE', 'Style ungerade Reihe');
define('RCS_REPORT_EVEN_STYLE_DESC', 'Style f&uuml;r die ungeraden Reihen im Bericht. Typische Optionen sind <i>dataTableRow</i> und <i>attributes-even</i>.');
define('RCS_REPORT_ODD_STYLE_TITLE', 'Style gerade Reihe');
define('RCS_REPORT_ODD_STYLE_DESC', 'Style f&uuml;r die geraden Reihen im Bericht. Typische Optionen sind NULL (bzw. kein Eintrag) und <i>attributes-odd</i>.');
define('RCS_SHOW_BRUTTO_PRICE_TITLE', 'Brutto-Anzeige');
define('RCS_SHOW_BRUTTO_PRICE_DESC', 'Sollen die Preise Brutto (true) oder Netto (false) angezeigt werden?');
define('DEFAULT_RCS_PAYMENT_TITLE', 'Standard-Zahlweise');
define('DEFAULT_RCS_PAYMENT_DESC', 'Modulname der Zahlweise f&uuml;r das abschlie&szlig;en der Bestellung (z.B. moneyorder).');
define('DEFAULT_RCS_SHIPPING_TITLE', 'Standard-Versandart');
define('DEFAULT_RCS_SHIPPING_DESC', 'Modulname der Versandart f&uuml;r das abschlie&szlig;en der Bestellung (z.B. dp_dp).');
define('RCS_DELETE_COMPLETED_ORDERS_TITLE', 'Bestellte Warenk&ouml;rbe l&ouml;schen');
define('RCS_DELETE_COMPLETED_ORDERS_DESC', 'Soll der Warenkorb im Zuge des Bestellabschlusses automatisch gel&ouml;scht werden?');

checkout_shipping.php

ca. Zeile 77

require (DIR_WS_CLASSES.'order.php');
davor einfügen
xtc_checkout_site('shipping');

checkout_payment.php

ca. Zeile 66

if (isset ($_SESSION['credit_covers']))
davor einfügen
xtc_checkout_site('payment');

checkout_confirmation.php

ca. Zeile 82

// load the selected payment module
require (DIR_WS_CLASSES . 'payment.php');
davor einfügen
xtc_checkout_site('confirm');

includes/application_top.php

ca. Zeile 104

require_once (DIR_FS_INC.'xtc_get_top_level_domain.inc.php');
danach einfügen
require_once (DIR_FS_INC.'xtc_checkout_site.inc.php');

4. Dateien kopieren

Alle Dateien an ihren entsprechenden Ort kopieren

admin/recover_cart_sales.php
admin/stats_recover_cart_sales.php
admin/includes/classes/order_rcs.php
admin/includes/classes/order_total.php
admin/includes/classes/payment.php
admin/includes/classes/shipping.php
inc/xtc_checkout_site.inc.php
lang/german/admin/recover_cart_sales.php
lang/german/admin/stats_recover_cart_sales.php
templates/TEMPLATE/admin/mail/german/cart_mail.html
templates/TEMPLATE/admin/mail/german/cart_mail.txt

Wir wünschen Ihnen viel Erfolg mit unserem Modul.