Etwas Grundwissen zur convertECB - Währungsumrechnung in VirtueMart

Für die Währungsumrechnung nutzt VirtueMart 2 und 3 die tagesaktuellen Wechselkurse der ECB und holt sich diese von dieser Adresse: https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml. Achtung! Wer noch alte Shop-Scripte nutzt, die Downloadadresse für die ECB-XML-Datei hat sich seit Oktober 2018 endgültig geändert auf das SSL-Protokoll, muss also mit https:// beginnen!

Hierfür verwendet VirtueMart üblicherweise das ein Admin-Plugin-Script administrator/components/com_virtuemart/plugins/currency_converter/convertECB.php, wenn nicht in der VM-Configuration ein anderes Währungsumrechnungs-Script (currency-converter) bestimmt ist. Dieses Script erzeugt eine Klasse: convertECB.

In diesem Convert-Script gibt es immer auch ein Prüfung, wann zuletzt die o.g. Wechselkurzdatei geladen wurde. Spätestens nach 365 Tage erfolge eine Warnung.

Die XML-Datei wird i.d.R. 4x täglich geladen, also alle 6 Stunden. Das wird durch diese Zeile in der convertECB.php erreicht: $cache->setLifeTime(360);. Ein anderer Wert könnt hier gesetzt werden. Die geladene XML-Datei wird in den Cache gelegt (liegt dann also überlicherweise, wenn die Schreirechte vorhanden sind im Pfad /cache/ bzw. im Verzeichnis /media/ und steht damit für die Währungsumrechnung zur Verfügung. Im cache-Verzeichnis gibt es dann jeweils ein Unterordner, der genauso heißt wie das contver-Script also z.B. /convertECB/. In diesem liegen dann die gecachten Daten im JSON-Format. Wenn alles korrekt geladen wurde, dann sollte so eine Cache-Datei ca. 850kb haben.

Für die Ausgabe von Währungen in den VM-Templates ist verantwortlich das Script administrator/components/com_virtuemart/helpers/currencydisplay.php mit seiner Klasse CurrencyDisplay. Schon im Construtor wird hier o.g. convertECB in currencyConverter instanziert.

In diesem Script gibt es eine Methode convertCurrencyTo() die aus der Klasse convertECB die Methode convert() nutzt, um die Umrechnung vorzunehmen. In convert() gibt es eine Array-Variable $globalCurrencyConverter in die Währungscodes mit ihren Umrechnungsfaktoren übergeben werden.



 

Einen Währungsumrechnungs-Sicherheitsfaktor hinzufügen

Hinweis: Nachfolgende Handlungsanleitung ist nur für Profies, die wissen was sie tun. Es sind Eingriffe in VM die dazu führen können, dass Ihr Shop nicht mehr nutzbar ist! Also vorher sichern und nicht im Live-Projekt arbeiten.

Wer in verschiedene Länder versendet und folglich mit Fremdwährungen arbeit, wird schnell feststellen, dass bei der Überweisung von z.B. Dollar-Beträgen auf eine Euro-Konto außer z.B. der PayPal-Gebühr noch mal Gebühren abgezogen werden. Hier schlägt die Bank also zu und berechnet die für die Überweisung aus der Fremdwährung noch mal eine Umrechnungsobolus. Bei großen Beträgen kann hier schnell ein Sümmchen entstehen, welches den Gewinn erheblich schmälert.

Leider gibt es in VM keine einfache Möglichkeit diese Gebühr z.B. im Verkaufspreis für Fremdwährung aufzuschlagen. Natürlich kann man ein Kalkulationregel dafür im VirtueMart-Backend anlegen, aber dann müsste man unendlich viele Währungen oder Länder pflegen. Da hier die Rechenregeln aber keine Mehrfachzuweisung von Ländern oder Währungen zulassen, müsste man für jedes Land eine extra Regel erstellen. Das kann anstrengend sein.

Deshalb beschreibe ich hier einen Alternative mit nur wenigen Handgriffen. Wir nutzen dabei die Möglichkeit in VM einen anderes Währungsumrechner-Modul (ist eigentlich ein Plugin) einzustellen. Dazu wechseln wir zunächst einfach in den o.g. Ordner: administrator/components/com_virtuemart/plugins/currency_converter. Dort legen wir Dublikate der beiden vorhanden convertECB-Scripte an (z.B. als convertECB_myown.phpconvertECB_myown.xml). Nach dem das erfolgte können wir diesen Umrechner in der VM-Konfiguration auswählen und somit nutzen. Achtung! In dem Moment wo diese Zuweisung in VM erfolgte, werden diese Dateien auch verwendet. Das führt sofort erstmal dazu, dass es auf den Frontendseiten zu Script-Fehlern kommt. Das legt sich erst nach folgenden notw. Scriptanpassungen:

  1. In der neuen XML-Datei <filename>convertECB.php</filename> durch <filename>convertECB_myown.php</filename> ersetzen.
  2. Im neuen PHP-Script alle Vorkommen von convertECB durch convertECB_myown ersetzen, also sowohl in der Class-Bezeichnung als auch im Cache-Name.
  3. Frontend testen - es sollt jetzt wieder nutzbar sein. In Folge können wir unsere eigenen Modifikationen vornehmen.

In unserem Beispiel wollen wir nun also einfach nur einen 5%-Aufschlag hinzufügen, sobalt eine Währungsumrechnung erfolgt. Dazu für wir nach Zeile 69 $val = (float)$amountA * (float)$valB / (float)$valA; diese Zeile neu ein $val += ($val * 0.05);