Eigene Währung für Magento Commerce

Zugegeben: der Titel dieses Artikels klingt etwas komisch, denn wer hat schon eine eigene Währung?
Niemand, werden wohl viele jetzt sagen, doch was ist mit den ganzen Bonus- und Prämien-Programmen, die aus dem Boden schießen wie Unkraut? Mittlerweile kann man ja in jedem Tante Emma-Laden mit seiner Kundenkarte Punkte, Dots, Digits, Dingens und Kirchens sammeln, die man dann wieder gegen irgendwelche Sachen eintauschen kann. Also sind diese ganzen Punkte, Dots und Digits vom Prinzip her eigentlich nichts anderes als eine Währung. Zwar eine ziemlich eingeschränkte Währung, denn man kann nicht überall damit einkaufen und auch die Auswahl ist nicht sonderlich riesig, aber man erhält einen Gegenwert dafür.

Da sich die meisten Bonus- oder Prämien-Programme keine eigenen Ladenkette zulegen können oder wollen, drängt sich als Handelsplattform doch nur ein Internetshop auf. Der Punktesammler kann nach erfolgreicher Punkte-Jagd bequem von zu Hause aus seine Beute gegen irgendwelche Dinge eintauschen - am Ende wird aber nicht in Euro oder US-Dollar bezahlt, sondern in Punkten, Dots, Digits oder ähnlichen Dingen.

Nun kann man natürlich eine eigene Shop-Lösung entwickeln und alle Funktionalitäten nachbauen, die man für einen Webshop braucht - oder: man nimmt einen Open Source-Webshop und modifiziert diesen. In Bezug auf ein Punkte- und Prämien-System gilt es wohl als erstes, dass die Artikel und Produkte die man für seine gesammelten Punkte kaufen kann auch mit dem entsprechenden Preis in Punkten, Dots oder Digits ausgewiesen werden.

Bei der Vielzahl an OpenSource-Webshops fällt die Wahl für ein geeignetes Shop-System nicht immer leicht, doch mein Favorit ist zur Zeit Magento Commerce von Varien. Magento bringt eine unglaubliche Anzahl an Features und Funktionen mit, die bei anderen Webshop-Lösungen neu gebaut, nachgerüstet oder im schlimmsten Fall hinzugekauft werden müssen.

Ein Wort vorweg

In diesem Artikel beziehe ich mich auf die Version 1.2.1 von Magento. Zusätzlich habe ich das deutsche Sprachpaket installiert. Wer dieses nachinstallieren möchte, tut dies am besten über Magento Connect. Den Extension-Key, der für die Installation benötigt wird, findet ihr hier.

Was ich bis jetzt noch nicht ausprobiert und getestet habe, ist die Tatsache in wie weit die folgenden Anpassungen einem System-Update von Magento standhalten. Zur Sicherheit sollte man auf jeden Fall vor jedem Update eine Sicherung der modifizierten Dateien anlegen.

Alle Änderungen am Shopsystem werden auf eigene Gefahr durchgeführt. Es empfiehlt sich auf jeden Fall, zuerst ein Backup vom Ursprungssystem anzulegen oder das Vorgehen an einem unabhängigen Testsystem erst einmal auszuprobiren.
Es gilt die Parole: Jeder handelt eigene Gefahr!

Jetzt wird's technisch

Magento bringt von sich aus schon eine Vielzahl an Währungen mit, so dass für einen normalen Webshop ohne Probleme und weitere Umstände aufgesetzt werden kann. Doch für den Fall eines Prämien-Shops bietet Magento jedoch leider keine Lösung. Zudem ist es nicht möglich eine eigene Währung über die Oberfläche zu definieren, sondern man muss sich mehr oder weniger mit den vorgegebenen Währung begnügen.

Die einfachste Lösung wäre wohl, eine der unzähligen Währungen als Punkte-Währung zu verwenden und diese in der Webshop-Oberfläche mit einer eigenen Bezeichnung zu versehen. Doch was macht man, wenn man neben Punkten auch mit normalen Geld bezahlen können soll, das Prämien-Programm auf Expansionskurs ist und sich ausgerechnet in der Region in der die umgewnadelte Währung Hauptzahlungsmittel ist ausbreitet? Dann kommt man schnell in eine Zwickmühle. Dieser Fall klingt zwar unwahrscheinlich und wird wohl in der Realität so gut wie nie auftreten, doch am saubersten ist es wohl eine komplett eigenständige Währung zu definieren.

Und mit diesem Ansatz beginnen auch schon die Probleme; denn Magento setzt auf das Zend Framework und die darin enthaltene Internationalisierung. Die Internationalisierung ist standardisiert und in 99,99% aller Fälle auch vollkommen ausreichend. Unser Fall gehört jedoch zu den letzten 0,01% und liegt somit außerhalb der Norm.

Anpassen der Internationalisierung

Wie gesagt: Magento basiert auf dem Zend Framework, das eine eingebaute Internationalisierung mitbringt. Die komplette Internationalisierung wird über XML-Dateien gesteuert und definiert, so dass wir für den gesamten Vorgang keine einzige Zeile Code schreiben oder anpassen müssen.

Die Dateien für die Internationalisierung im Zend Framework findet ihr alle im Verzeichnis lib/Zend/Locale/Data.

Als erstes bearbeiten wir die Datei supplementalData.xml und fügen unter currencyData/fractions einen neuen <info>-Node hinzu, zum Beispiel: <info iso4217="XYZ" digits="0" rounding="0" />. Am wichtigsten sind die drei Zeichen des ISO 4217-Codes, denn diese identifizieren unsere neue Währung eindeutig. Man sollte also darauf achten, dass die neue Währung einen eindeutigen Bezeichner bekommt und das man Kürzel wie USD oder EUR auf jeden Fall vermeidet. Ich für meinen Fall, habe mir folgende Konvention auferlegt: ich benenne meine Währung nach dem Muster Z## (also Z01, Z02, Z03, usw.). Damit gehe ich sicher, das der Iso-Code auch wirklich eindeutig ist, aber das ist jedem selbst überlassen.

Mit dem nächsten Schritt definieren wir, wo unsere Währung gültig ist, denn Magento erlaubt nicht jede Währung in jedem Land. Hier spielt die Auswahl, die man unter "Erlaubte Länder" in der System-Administration getroffen hat, eine Rolle. Wenn man zum Beispiel Deutschland, Österreich und die Schweiz als "Erlaubte Länder" ausgewählt hat, dann muss man nur die jeweiligen <region>-Tags anpassen; also: <region iso3166="DE">, <region iso3166="AT"> und <region iso3166="CH">. Arbeitet man mit den standardmäßig ausgewählten Ländern von Magento, dann hat man etwas mehr zu tun. Ich beschränke mich aber vorerst auf diese drei Länder.

Der <region>-Tag definiert, welche Währung in dem jeweiligen Land bis wann oder seit wann gültig ist. Wir fügen also unsere neue Währung mit dem ISO 4217-Code "XYZ" diesen drei Ländern hinzu, so dass die <region>-Tags am Ende so aussehen sollten:

<!-- Österreich -->
<region iso3166="AT">
   <currency iso4217="XYZ" from="2009" /> <!-- unsere Bonus-Punkte-Währung -->
   <currency iso4217="EUR" from="1999-01-01"/>
   <currency iso4217="ATS" from="1947-12-04" to="2002-02-28"/>
</region>

<!-- Schweiz -->
<region iso3166="CH">
   <currency iso4217="XYZ" from="2009" /> <!-- unsere Bonus-Punkte-Währung --> 
   <currency iso4217="CHF" from="1799-03-17"/>
</region>

<!-- Deutschland -->
<region iso3166="DE">
   <currency iso4217="XYZ" from="2009" /> <!-- unsere Bonus-Punkte-Währung --> 
   <currency iso4217="EUR" from="1999-01-01"/>
   <currency iso4217="DEM" from="1948-06-20" to="2002-02-28"/> 
</region>

(Kommentare wurden von mir eingefügt)

Wenn wir den gesamten Euro-Zahlungsraum für unsere neue Bonus-Punkte-Währung nutzen möchten, dann geht es am einfachsten mit der Suchen und Ersetzen-Funktion. Einfach nach <currency iso4217="EUR" from="1999-01-01"/> suchen und durch <currency iso4217="XYZ" from="2009" /><currency iso4217="EUR" from="1999-01-01"/> ersetzen lassen.

Als nächstes passen wir die Übersetzung unserer Währung in den jeweiligen Ländern an, denn es ist wohl äußerst unwahrscheinlich, dass unsere neue Währung in jedem Land gleich übersetzt wird.

Die Übersetzung solch grundlegender Dingen steuert ebenfalls die Internationalisierung des Zend Frameworks. Jedes Land besitzt eine eigene XML-Datei, die dies übernimmt. Der Dateiname setzt sich zusammen aus dem zweistelligen Sprachcode, in unserem Fall "de", und dem zweistelligen Ländercode, also "AT", "CH" oder "DE".

Es gibt jedoch eine Besonderheit bei diesen Dateien, denn in der Regel werden solch grundlegenden Dinge wie Währungen, Wochentage oder Datumsformate innerhalb eines Sprachraums gleich behandelt. Aus diesem Grund werden in den jeweiligen, länderspezifischen Dateien nur die Abweichungen von diesem Standard angegeben. Der Standard für den gesamten Sprachraum wird in einer eigenen Datei definiert; in unserem Fall ist dies die Datei "de.xml".

Die Dateien für das jeweilige Land erben sozusagen die grundlegenden Definitionen von der Sprachraum-Datei und überladen nur die abweichenden Definitionen.

<root>-Definition

      + Sprachraum-Definition, zum Beispiel: de.xml

            + landespezifische Abweichungen für Deutschland (de_DE.xml)

            + landesspezifische Abweichungen für Schweiz (de_CH.xml)

            + landesspezifische Abweichungen für Österreich (de_AT.xml)

In unserem Fall haben wir es relativ einfach, denn wir können unsere Anpassungen auf die Sprachraum-Definition beschränken. Innerhalb unserer Sprachraum-Definition finden wir den Absatz <currencies>, der wiederum in die einzelnen Währungen beinhaltet, die für unseren Sprachraum übersetzt werden müssen. Wir fügen einfach einen neuen <currency>-Knoten hinzu, der angibt, wie unsere Währung im deutschsprachigen Raum zu übersetzten ist.

<currencies>
      ....
      <currency type="XYZ">
            <displayName>Meine neue Währung</displayName>
            <displayName count="other">eine weitere, optionale Bezeichnung</displayName>
            <symbol>$€¥£</symbol>
      </currency>
      ....
</currencies>

Mit diesem Schritt haben wir zumindest die grundlegenden Schritte durchgeführt, um unsere neue Währung zu definieren.

Magento die neue Währung mitteilen

Im letzten Schritt geht es darum, dass Magento unsere neue Währung kennenlernt und uns diese auch zur Verfügung stellt.

Hierfür gibt es zwei Möglichkeiten:

Bei der ersten verkuppeln wir Magento mit unserer neuen Währung wiedermal durch anpassen der Konfiguration; diesmal nicht die des Zend Frameworks, sondern die Konfiguration von Magento direkt. Das hört sich zwar einfach an, doch ist am Ende nicht so einfach. Denn Magento besitzt keine globale Konfigurationsdatei, die alle Einstellungen beinhaltet, sondern nutzt ein verteiltes Konfigurationssystem, bei dem jeder Bestandteil von Magento seine eigene Konfigurationsdatei besitzt. Dies ist zwar genial in Hinblick auf eine einfache Erweiterbarkeit des Shop-Systems, doch für uns bedeutet dies erstmal eine ziemliche Sucherei. Aber: ich hab' da mal was vorbereitet und die Konfigurationsdatei, die wir benötigen befindet sich im Verzeichnis app/code/core/Mage/Directory/etc und nennt sich config.xml.

In dieser Datei gibt es einen Abschnitt, der bestimmt, welche Währungen Magento kennt und somit im Shop-System genutzt werden können. Diesem Abschnitt müssen wir einfach nur unsere neue Währung mit ihrem ISO4217-Code (XYZ) hinzufügen.

Der Abschnitt, der die installierten Währungen bestimmt, lautet wie folgt:

<default>
      <system>
            <currency>
                  <installed> (Komma getrennte Zeichenkette von ISO4217-Codes) </installed>
         ....

Wir fügen der Zeichenkette innerhalb des <installed>-Knotens einfach per Komma getrennt unsere neue Währung hinzu und schon kennt Magento unsere Währung und kann auch damit arbeiten.

Die zweite Möglichkeit ist jedoch entschieden einfacher und nutzt die von Administrationsmöglichkeiten von Magento. Wir melden uns also im Backend von Magento an und wechseln über das Menü "System" in die "Konfiguration". Auf der linken Seite sehen wir die unterschiedlichen Konfigurationsbereiche und am Ende dieser Liste gibt es einen Bereich "Erweitert" mit dem Menüpunkt "System". Dieser Konfigurationsbereich beinhaltet auch die Einstellungsmöglichkeiten für die installierten Währungen. In einer Liste werden alle zur Verfügung stehenden Währungen angezeigt, so dass wir nur noch unsere neue Währung Bonus-Punkte raussuchen und diese der Auswahl hinzufügen müssen, speichern und fertig. Am Ende kennt Magento unsere neue Währung und wir können Sie in den nächsten Schritten weiterverwenden.

Einstellungen im Backend von Magento

Den Rest erledigen wir auch über das Backend von Magento. Wir bleiben im Menü "System" in die "Konfiguration". Im Abschnitt "Einrichten der Währung" können wir dann unsere Standardwährung, unsere Standardmäßig angezeigt Währung und unsere erlaubten Währungen auswählen.

Wenn man im Shop nur per Bonus-Punkte bezahlen kann, wählt man am Besten für alle drei Einstellungen die Bonus-Punkte-Währung. Soll auch noch mit anderen Währungen bezahlt werden können, dann erweitert man einfach seine Auswahl für "Erlaubte Währungen".

Je nachdem welche Basiswährung ausgewählt wurde, gibt man den Preis für ein Produkt in dieser Währung an. Haben wir zum Beispiel Euro als Basiswährung ausgewählt, dann werden alle Preise auch in Euro gespeichert. Über die Auswahl "Standardmäßig angezeigte Währung" kann man die Anzeige im Frontend des Shops beeinflussen. Magento übernimmt automatisch die Umrechnung in die passende Währung.

In den meisten Fällen entspricht der reale Gegenwert eines Bonus-Punktes aber kaum einem Euro, sondern ist in der Regel viel niedriger, zum Beispiel: 25 Bonus-Punkte entsprechen 1 Euro. Damit Magento diese Umrechnung auch korrekt vornehmen kann, können wir über das Menü "System" unter dem Punkt "Währungskurse verwalten" unseren Umrechnungskurs eingeben. Die Umrechnung erfolgt immer von der eingestellten Basiswährung aus, so dass wir mit Euro als Basiswährung einfach den Wert 25 in das Feld für den Umrechnungsfaktor in unsere Bonus-Punkte-Währung eintragen müssen.

Der ein oder andere wird sich jetzt aber fragen, was passiert, wenn er auf "Wechselkurse importieren" klickt oder die automatische Synchronisierung der Wechselkurse eingestellt hat? Diese Damen und Herren kann ich aber beruhigen, denn da unsere Währung außerhalb des Standard liegt und dem Webserice-Anbieter nicht bekannt ist, ist unser Umrechnungskurs von der Synchronisierung ausgenommen. Bei einer manuellen Synchronisierung der Wechselkurse gibt Magento zwar eine Warnung aus, behält aber den ursprünglichen Umrechnungsfaktor bei.

Zum Abschluss

Wir haben zwar jetzt unsere eigene Währung, aber leider ist es mit diesen Modifikationen nicht möglich zwei Währungen zeitgleich auszuweisen. Man kann also keinen Shop aufbauen, bei dem man Artikel mit Punkten auspreist und zusätzlich eine Zuzahlung verlangt, zum Beispiel "Artikel ABC für 200 Punkte plus 55,00 Euro Zuzahlung".

Ein weiterer Nachteil ist, dass, wenn man sowohl Bonus-Punkte als auch eine reale Währung verwendet, der Kunde relativ einfach den realen Gegenwert der Bonus-Punkte ausrechnen kann.

Aber abgesehen von diesen Nachteilen, bietet diese Modifikation die Möglichkeit sich Währungen und Bezahlsysteme außerhalb des zur Verfügung stehenden Standards von Magento zu definieren.