The roads I take...
KaiRo's weBlog
| Zeige Beiträge veröffentlicht am 19.07.2023 an. Zurück zu allen aktuellen Beiträgen |
19. Juli 2023
Integration eines Magento-2-Webshops mit FreeFinance und selbstgebautem Warenmanagement
In den letzten paar Monaten habe ich (mit einem Kollegen) ein neues Unternehmen unter dem Namen Trade Post 47 aufgebaut. Während wir es uns als eine kleine Raumstation im Orbit eines schönen Planeten vorstellen, wird es für die meisten Menschen als Handelsunternehmen für Science-Fiction-Merchandise gesehen werden, mit einem Online-Shop sowie Ständen bei Veranstaltungen wie lokalen Comic-Cons in Mitteleuropa, vor allem in Österreich. Für alle, die mehr erfahren wollen, haben wir eine komplette Seite über uns auf unserer Shop-Website erstellt.
Um unsere Produkte zu verwalten, die wir von verschiedenen Anbietern (manchmal das gleiche Produkt über verschiedene Anbieter) erhalten, sowie unsere Bestellungen zu planen und zu verwalten, habe ich ein internes, benutzerdefiniertes Warenmanagement in meinem eigenen PHP-Framework bzw. CMS CBSM (das zum Beispiel auch für dieses Blog verwendet wird) aufgebaut. Zum Großteil fiel die Entscheidung dafür aus Bequemlichkeit, nachdem ich dieses System sowieso betreibe und warte und ich einige Datenbanktabellen benötigte, inkl. passender Benutzeroberfläche für die Verwaltung unserer Waren, Anbieter und mehr (sogar Conventions, auf denen wir Stände betreiben möchten).
Andererseits ist der öffentliche Shop (wie Sie es bemerken können, wenn Sie sich die Website ansehen) eine Installation von Magento 2 (d.h. die Open-Source-Version von dem, was heute "Adobe Commerce" genannt wird). Wir haben uns für dieses System entschieden, weil wir eng mit MCO Shop zusammenarbeiten, einem lokalen CB-Funk- und Elektronikgeschäft, und dort bereits zuvor diese Software auf den Servern lief, die wir mitverwenden und das Wissen bereits da ist, wie damit gearbeitet wird, die Upgrades ausführt werden und das System gewartet wird. Schließlich hilft es beim Aufbau eines neuen Unternehmens immer, wie in so vielen Lebensbereichen, wenn man einige Ressourcen und Wissen mit anderen gemeinsam nutzen kann. Für unseren Teil, habe ich zuerst das Magento-Theme angepasst, um den Shop "Weltraum-ähnlicher" aussehen zu lassen, vor allem mit einem dunklen statt hellen Hintergrund. Sobald das gut genug funktionierte, musste ich immer noch jene Produkte aus meinem selbstgebauten Warenmanagement, die wir tatsächlich bestellt haben, in diesen Magento-Shop bekommen. Anfangs habe ich dafür eine große CSV-Datei erstellt und in den Shop importiert habe, aber es war klar, dass wir auf lange Sicht eine feinkörnige Lösung brauchten, die Einträge einzeln hinzufügen bzw. aktualisieren kann.
Zusätzlich, wann immer wir Stände auf unseren "Außenmissionen" auf Veranstaltungen/Conventions betreiben (oder wann immer wir sonst etwas persönlich verkaufen), verlangt das österreichische Recht die Verwendung eines Registrierkassensystems, das strengen Regeln befolgt und entsprechend zertifiziert ist, damit von Seiten der öffentlichen Verwaltung sichergestellt werden kann, dass wir korrekt unsere Steuern abführen. In diesem Bereich haben wir uns für die integrierte Lösung unseres Buchhaltungssystems entschieden, die auch online als Web-Service läuft, eine spezialisierte österreichische Lösung namens FreeFinance. Und natürlich braucht die Registrierkasse auch eine vollständige Liste der Produkte und Preise, die wir zunächst auch mit einer CSV-Erstellung und -Import gelöst haben, in Erwartung einer detaillierteren Lösung nach unserem ersten großen Auftritt auf der Austria Comic-Con Anfang Juni.
Zur Abrundung wollten wir auch schön gestaltete Rechnungsdokumente in FreeFinance für alle Online-Shop-Bestellungen generieren, die nicht über die Registrierkasse bezahlt wurden, und in Zukunft möchten wir den Online-Shop automatisch auf Waren aufmerksam machen, die auf Veranstaltungen verkauft werden, so dass sie für Online-Käufe aus dem verfügbaren Lagerstand entfernt werden.
Um dies zu erreichen, habe ich mir die APIs angesehen, die sowohl Magento als auch FreeFinance bieten, und baute Verbindungen auf diese vom eigenen internen System auf, auf das ich vollen Zugriff habe und das für die Bereitstellung der Warendaten sowieso erforderlich ist. Ich fand heraus, dass die FreeFinance API relativ einfach und gut dokumentiert ist und die Authentifizierung über OAuth2 durchführt, von denen ich bereits durch andere Projekte einige Kenntnisse hatte (und Code für den Zugriff darauf), einschließlich einigem Code, der bereits im CBSM-System zur Durchführung von Logins verwendet wird. Magento dagegen ist eine andere Baustelle: sein Produktkatalog-Funktionsumfang ist viel komplexer, und ebenso die API dazu. Außerdem gibt es keine gut strukturierte kollektive Dokumentation, die erklären würde, was verschiedene Dinge bedeuten oder was vorzugsweise auf welche Weise getan wird (oft gibt es mehrere Wege zum gleichen Ergebnis) - Im Endeffekt resultiert die Arbeit meist im Einschalten des Entwicklermodus, so dass eine Swagger/Open-API-Benutzeroberfläche auf der Installation verfügbar ist und dann in Herumprobieren und im Internet herumsuche, was wie funktionieren könnte und welche Wert was heißen könnte. Darüber hinaus erfolgt die Authentifizierung über OAuth1, was komplizierter ist als sein Nachfolger, und wofür den ich keinen bereits bestehenden Code hatte, obwohl ich auf Code aus dem Tutorial aufbauen konnte. Da wir Magento selbst auf der Serverseite betreiben, konnte ich leichter mit Dingen herumprobieren, als bei FreeFinance, einem gehosteten Dienst, wo ich Zugangsdaten von ihrem Team anfordern musste. Aber FreeFinance gab uns Zugang zu einem Testsystem, während wir für Magento aus verschiedenen Gründen nur ein Live-System und kein Staging-/Test-Umgebung haben, so dass wir beim Testen nicht sehr viel "herumspielen" können.
Im Endeffekt habe ich ziemlich viel Code für all diese Fälle geschrieben, der einfachste Teil war und aktualisiert sicherlich die Kasse mit unseren Produkten, die einzige leichte Komplikation dort war Kategorien hinzuzufügen, wenn nötig. Um Produkte in den Shop zu bringen, musste ich alle möglichen Dinge respektieren, wie das Erstellen und Verwalten konfigurierbarer Produkte, Werte zu einigen Attributen anzulegen, Hochladen von Bildern, Verwalten von Kategorien und mehr. Und die merkwürdige Struktur der Magento-API, die viel detailliertere Aktionen als der CSV-Import-Weg erfordert, macht dies manchmal noch komplizierter - aber es funktioniert jetzt und ich kann einfach ein Produkt im Warenmanagement hinzufügen oder ändern und spätestens am nächsten Tag sind sowohl der Shop als auch die Registrierkasse mit den Änderungen aktualisiert (ich kann die Jobs auch früher auslösen, wenn benötigt). Für die Erstellung der Rechnungsdokumente konnte ich einige Dinge auf einem make.com "Blueprint" von FreeFinance aufbauen, aber zum einen möchten wir keinen bezahlten Drittanbieter-Service verwenden, wenn wir dies selbst automatisieren können, und zum anderen haben wir einige Einschränkungen und Spezialitäten unsererseits auch dabei (wie Rechnungen nur zu generieren, wenn Zahlungen direkt im Online-Shop gemacht wurden und nicht persönlich über die Registrierkasse). Ich bin dort auch auf einige Kuriositäten gestoßen, wie dass die Magento-Bestellungs-API manche Datensätze mehrmals enthält, oder wir haben zunächst eine Dokument-Layout-Vorlage verwendet, die nicht unterschiedliche Mehrwertsteuersätze unterstützt (was wir allerdings benötigen) - aber das funktioniert jetzt auch. Die umgekehrte Variante, Registrierkassen-Einkäufe im Online-Shop zu reflektieren, steht immer noch auf meiner Liste, aber ich habe jetzt einen guten Plan, wie ich das erledigen kann, und einige Zeit bis zu unserer nächsten großen "Außenmission", bei der dies wichtig sein wird.
Alles in allem war es eine ziemlich interessante Erfahrung, und nachdem ich mich jetzt mit der Arbeit mit diesen Systemen und APIs wohlfühle, bin ich mir sicher, dass ich werde auf lange Sicht mehr mit ihnen machen werde - und unser Trade Post 47 wird hoffentlich auch weiter wachsen und daher in Zukunft zusätzliche Anforderungen haben. Wenn ihr Entwickler seid und Fragen zu einigen Details habt, könnt ihr mich gerne kontaktieren - und wenn ihe solche Systeme selbst betreibt und einen Entwickler benötigt, der diese in ähnlicher Weise anpassen kann, bin ich auch gerne bereit, diese Dienste anzubieten!
Um unsere Produkte zu verwalten, die wir von verschiedenen Anbietern (manchmal das gleiche Produkt über verschiedene Anbieter) erhalten, sowie unsere Bestellungen zu planen und zu verwalten, habe ich ein internes, benutzerdefiniertes Warenmanagement in meinem eigenen PHP-Framework bzw. CMS CBSM (das zum Beispiel auch für dieses Blog verwendet wird) aufgebaut. Zum Großteil fiel die Entscheidung dafür aus Bequemlichkeit, nachdem ich dieses System sowieso betreibe und warte und ich einige Datenbanktabellen benötigte, inkl. passender Benutzeroberfläche für die Verwaltung unserer Waren, Anbieter und mehr (sogar Conventions, auf denen wir Stände betreiben möchten).
Andererseits ist der öffentliche Shop (wie Sie es bemerken können, wenn Sie sich die Website ansehen) eine Installation von Magento 2 (d.h. die Open-Source-Version von dem, was heute "Adobe Commerce" genannt wird). Wir haben uns für dieses System entschieden, weil wir eng mit MCO Shop zusammenarbeiten, einem lokalen CB-Funk- und Elektronikgeschäft, und dort bereits zuvor diese Software auf den Servern lief, die wir mitverwenden und das Wissen bereits da ist, wie damit gearbeitet wird, die Upgrades ausführt werden und das System gewartet wird. Schließlich hilft es beim Aufbau eines neuen Unternehmens immer, wie in so vielen Lebensbereichen, wenn man einige Ressourcen und Wissen mit anderen gemeinsam nutzen kann. Für unseren Teil, habe ich zuerst das Magento-Theme angepasst, um den Shop "Weltraum-ähnlicher" aussehen zu lassen, vor allem mit einem dunklen statt hellen Hintergrund. Sobald das gut genug funktionierte, musste ich immer noch jene Produkte aus meinem selbstgebauten Warenmanagement, die wir tatsächlich bestellt haben, in diesen Magento-Shop bekommen. Anfangs habe ich dafür eine große CSV-Datei erstellt und in den Shop importiert habe, aber es war klar, dass wir auf lange Sicht eine feinkörnige Lösung brauchten, die Einträge einzeln hinzufügen bzw. aktualisieren kann.
Zusätzlich, wann immer wir Stände auf unseren "Außenmissionen" auf Veranstaltungen/Conventions betreiben (oder wann immer wir sonst etwas persönlich verkaufen), verlangt das österreichische Recht die Verwendung eines Registrierkassensystems, das strengen Regeln befolgt und entsprechend zertifiziert ist, damit von Seiten der öffentlichen Verwaltung sichergestellt werden kann, dass wir korrekt unsere Steuern abführen. In diesem Bereich haben wir uns für die integrierte Lösung unseres Buchhaltungssystems entschieden, die auch online als Web-Service läuft, eine spezialisierte österreichische Lösung namens FreeFinance. Und natürlich braucht die Registrierkasse auch eine vollständige Liste der Produkte und Preise, die wir zunächst auch mit einer CSV-Erstellung und -Import gelöst haben, in Erwartung einer detaillierteren Lösung nach unserem ersten großen Auftritt auf der Austria Comic-Con Anfang Juni.
Zur Abrundung wollten wir auch schön gestaltete Rechnungsdokumente in FreeFinance für alle Online-Shop-Bestellungen generieren, die nicht über die Registrierkasse bezahlt wurden, und in Zukunft möchten wir den Online-Shop automatisch auf Waren aufmerksam machen, die auf Veranstaltungen verkauft werden, so dass sie für Online-Käufe aus dem verfügbaren Lagerstand entfernt werden.
Um dies zu erreichen, habe ich mir die APIs angesehen, die sowohl Magento als auch FreeFinance bieten, und baute Verbindungen auf diese vom eigenen internen System auf, auf das ich vollen Zugriff habe und das für die Bereitstellung der Warendaten sowieso erforderlich ist. Ich fand heraus, dass die FreeFinance API relativ einfach und gut dokumentiert ist und die Authentifizierung über OAuth2 durchführt, von denen ich bereits durch andere Projekte einige Kenntnisse hatte (und Code für den Zugriff darauf), einschließlich einigem Code, der bereits im CBSM-System zur Durchführung von Logins verwendet wird. Magento dagegen ist eine andere Baustelle: sein Produktkatalog-Funktionsumfang ist viel komplexer, und ebenso die API dazu. Außerdem gibt es keine gut strukturierte kollektive Dokumentation, die erklären würde, was verschiedene Dinge bedeuten oder was vorzugsweise auf welche Weise getan wird (oft gibt es mehrere Wege zum gleichen Ergebnis) - Im Endeffekt resultiert die Arbeit meist im Einschalten des Entwicklermodus, so dass eine Swagger/Open-API-Benutzeroberfläche auf der Installation verfügbar ist und dann in Herumprobieren und im Internet herumsuche, was wie funktionieren könnte und welche Wert was heißen könnte. Darüber hinaus erfolgt die Authentifizierung über OAuth1, was komplizierter ist als sein Nachfolger, und wofür den ich keinen bereits bestehenden Code hatte, obwohl ich auf Code aus dem Tutorial aufbauen konnte. Da wir Magento selbst auf der Serverseite betreiben, konnte ich leichter mit Dingen herumprobieren, als bei FreeFinance, einem gehosteten Dienst, wo ich Zugangsdaten von ihrem Team anfordern musste. Aber FreeFinance gab uns Zugang zu einem Testsystem, während wir für Magento aus verschiedenen Gründen nur ein Live-System und kein Staging-/Test-Umgebung haben, so dass wir beim Testen nicht sehr viel "herumspielen" können.
Im Endeffekt habe ich ziemlich viel Code für all diese Fälle geschrieben, der einfachste Teil war und aktualisiert sicherlich die Kasse mit unseren Produkten, die einzige leichte Komplikation dort war Kategorien hinzuzufügen, wenn nötig. Um Produkte in den Shop zu bringen, musste ich alle möglichen Dinge respektieren, wie das Erstellen und Verwalten konfigurierbarer Produkte, Werte zu einigen Attributen anzulegen, Hochladen von Bildern, Verwalten von Kategorien und mehr. Und die merkwürdige Struktur der Magento-API, die viel detailliertere Aktionen als der CSV-Import-Weg erfordert, macht dies manchmal noch komplizierter - aber es funktioniert jetzt und ich kann einfach ein Produkt im Warenmanagement hinzufügen oder ändern und spätestens am nächsten Tag sind sowohl der Shop als auch die Registrierkasse mit den Änderungen aktualisiert (ich kann die Jobs auch früher auslösen, wenn benötigt). Für die Erstellung der Rechnungsdokumente konnte ich einige Dinge auf einem make.com "Blueprint" von FreeFinance aufbauen, aber zum einen möchten wir keinen bezahlten Drittanbieter-Service verwenden, wenn wir dies selbst automatisieren können, und zum anderen haben wir einige Einschränkungen und Spezialitäten unsererseits auch dabei (wie Rechnungen nur zu generieren, wenn Zahlungen direkt im Online-Shop gemacht wurden und nicht persönlich über die Registrierkasse). Ich bin dort auch auf einige Kuriositäten gestoßen, wie dass die Magento-Bestellungs-API manche Datensätze mehrmals enthält, oder wir haben zunächst eine Dokument-Layout-Vorlage verwendet, die nicht unterschiedliche Mehrwertsteuersätze unterstützt (was wir allerdings benötigen) - aber das funktioniert jetzt auch. Die umgekehrte Variante, Registrierkassen-Einkäufe im Online-Shop zu reflektieren, steht immer noch auf meiner Liste, aber ich habe jetzt einen guten Plan, wie ich das erledigen kann, und einige Zeit bis zu unserer nächsten großen "Außenmission", bei der dies wichtig sein wird.
Alles in allem war es eine ziemlich interessante Erfahrung, und nachdem ich mich jetzt mit der Arbeit mit diesen Systemen und APIs wohlfühle, bin ich mir sicher, dass ich werde auf lange Sicht mehr mit ihnen machen werde - und unser Trade Post 47 wird hoffentlich auch weiter wachsen und daher in Zukunft zusätzliche Anforderungen haben. Wenn ihr Entwickler seid und Fragen zu einigen Details habt, könnt ihr mich gerne kontaktieren - und wenn ihe solche Systeme selbst betreibt und einen Entwickler benötigt, der diese in ähnlicher Weise anpassen kann, bin ich auch gerne bereit, diese Dienste anzubieten!
Von KaiRo, um 00:18 | Tags: API, FreeFinance, Magento, merch, PHP, science fiction, Shop, Trade Post 47 | keine Kommentare | TrackBack: 0