Löst ein Kunde eines Gambio-Shops einen Gutschein ein, in dem er den Gutschein-Code im Warenkorb eingibt, wird dieser zwar verarbeitet, jedoch in der Summenaufstellung im Warenkorb nicht in Abzug gebracht. Besser hinsichtlich User-Experience und Conversion-Rate ist es hier, den angewendeten Rabatt direkt anzuzeigen. Hier ein Lösungsvorschlag für Gambio in der Version GX2:
1) Warum alles selber machen? Wir holen uns zur Vorbereitung unseres Vorhabens das Gambio-Plugin "Gutscheinanzeige im Warenkorb" von Alkim Media (übrigens sehr netter Kontakt) und laden die Verzeichnisse
\user_classes\overloads
und
\user_classes\overloads
in unser Hauptverzeichnis, sowie die Dateien
\lang\german\gutschein_anzeige.conf
und
\templates\EyeCandy\boxes
Bei letzterer natürlich das passende Template-Verzeichnis auswählen bzw. die bestehende Datei manuell anpassen gemäß Plugin-Datei, wenn bereits andere Modifiktaionen vorhanden (wie in unserer Installation der Fall). Dasselbe gilt dann für die Datei
\templates\EyeCandy\module\order_details-USERMOD.html
Nun noch Datei
\templates\EyeCandy\usermod
in das passende Templateverzeichis kopieren und wir sind schon recht weit.
2) Wir müssen nun noch darauf achten, dass auch der Express-Checkout von PayPal aus dem Warenkorb heraus funktioniert (falls aktiviert, wenn nicht, gehe zu Punkt 3). Mit den aktuellen Änderungen wird (falls nur die Gesamtsumme aktualisiert wird) eine Ablehnung der PayPal-Prüfung hervorgerufen, da die Artikelsumme nicht gleich der Gesamtsumme ist, d.h. die Summe der einzelnen Artikel ist eben um den reduzierten Betrag höher als die reduzierte Gesamtsumme. Die Lösung für dieses Problem kennen wir auch aus anderen Shopsystemen (unter anderem aus dem Magento-Onestepcheckout): Wir fügen dem Warenkorb vor der Übermittlung an PayPal einen zusätzlichen Artikel mit negativem Preis in Höhe des Rabattes hinzu, der die Differenz von Summe der Artikel und Gesamtsumme ausgleichen kann. Hierzu ändern wir die Datei
\gm\classes\GMPayPal.php
bzw. den passenden Override:
Zuerst übergeben wir an PayPal die reduzierte Gesamtsumme. Nach (ca. Zeile 310)
// items
unset($_SESSION['shipping']);
ersetzen wir den bestehenden Code mit
if (isset($_SESSION['customer_id']) && $_SESSION['cc_id']) {
global $order;
$order = new order();
require_once (DIR_WS_CLASSES . 'order_total.php');
$order_total_modules = new order_total();
$order_total_modules->collect_posts();
$order_total_modules->pre_confirmation_check();
$order_total_modules->process();
} else {
$order = new order();
}
Danach fügen wir den Pseudo-Artikel hinzu (nach Einfügen des oben aufgeführten Teiles ca. Zeile 475), somit ersetzen wir nach
else if($remainingTotal < 0) {
// discount
$itemAmount = new BasicAmountType($currencyCode, self::_formatAmount($remainingTotal));
$itemDetails = new PaymentDetailsItemType();
$itemDetails->Name = $this->transcodeOutbound($this->get_text('discount'));
$itemDetails->Amount = $itemAmount;
$itemDetails->Quantity = 1;
$t_paymentdetailsitem[] = $itemDetails;
$itemTotal += $remainingTotal;
}
die bestehenden Zeilen mit
if(array_key_exists('deduction', $p_order->info))
{
// deduction
$deduction = -$p_order->info['deduction'];
$itemAmount = new BasicAmountType($currencyCode, self::_formatAmount($deduction));
$itemDetails = new PaymentDetailsItemType();
$itemDetails->Name = $this->transcodeOutbound($this->get_text('discount'));
$itemDetails->Amount = $itemAmount;
$itemDetails->Quantity = 1;
$t_paymentdetailsitem[] = $itemDetails;
$itemTotal += $deduction;
}
So wird der Artikel hinzugefügt und die PayPal-Prüfung funktioniert nun ohne Probleme.
3) Fertig.