Markus Michalski FAQ

Kleinunternehmer: Technische Details

Kleinunternehmer §19 UStG für Shopware 6.7 - Lebenszyklus, gespeicherte Konfigurationswerte, Plugin-Struktur, überschriebene Templates, Twig-Funktion und die Unterschiede der Shopware-6.6-Linie.

English Version

Zurück zur Übersicht

Kleinunternehmer: Technische Details

Zusammenspiel

Das Plugin hat drei voneinander unabhängige Teile: den Lebenszyklus (Steuersatz anlegen), die Migration (Produktdaten ändern) und die Anzeige (Templates, gesteuert durch die Einstellung active). Einen eigenen Warenkorb- oder Steuerprozessor gibt es nicht.

graph TD
    A["Plugin aktivieren"] --> B["Steuersatz 0 Prozent anlegen oder wiederverwenden"]
    B --> C["Als Standard-Steuersatz des Shops setzen"]
    D["Plugin deaktivieren"] --> E["Gemerkten Standard-Steuersatz wiederherstellen"]
    F["Plugin deinstallieren"] --> G["Selbst angelegten Steuersatz löschen"]
    H["Einstellung active"] --> I["Storefront-Templates"]
    H --> J["Dokument-Templates"]
    K["Migration per Admin-Karte oder CLI"] --> L["Produkte: Steuersatz und Preise"]

Lebenszyklus

Die Plugin-Klasse Mmd\Kleinunternehmer\MmdKleinunternehmer nutzt diese Werte:

Wert Bedeutung
Steuersatz-Name Kleinunternehmer §19 UStG (0%) Der Steuersatz wird über diesen Namen gesucht und angelegt (Satz 0, Position 0).
core.tax.defaultTaxRate Shopware-Einstellung für den Standard-Steuersatz. Das Plugin setzt sie bei der Aktivierung auf den 0%-Steuersatz.
MmdKleinunternehmer.config.originalDefaultTaxId Der bei der Aktivierung gemerkte bisherige Standard-Steuersatz. Die Deaktivierung stellt ihn wieder her.
MmdKleinunternehmer.config.createdTaxId Die ID des vom Plugin neu angelegten Steuersatzes. Nur wenn sie gesetzt ist, löscht die Deinstallation den Steuersatz.
MmdKleinunternehmer.config.active Die Einstellung "Kleinunternehmerregelung aktiv" (bool, Standard false), pro Verkaufskanal überschreibbar.

Existiert beim Aktivieren bereits ein Steuersatz mit diesem Namen, verwendet das Plugin ihn und merkt ihn sich nicht als selbst angelegt. Er wird dann bei der Deinstallation nicht gelöscht.

Plugin-Struktur

Klasse oder Datei Aufgabe
Service\ConfigService Liest active mit optionaler Verkaufskanal-ID.
Service\ProductMigrationService Sucht den 0%-Steuersatz und Produkte nach Steuersatz, schreibt Steuersatz und Preise in Schritten von 100 Produkten. Gemeinsam genutzt von CLI und API.
Command\MigrateProductTaxCommand CLI-Befehl mmd:kleinunternehmer:migrate-products.
Controller\Api\MigrationController Die beiden Admin-API-Routen, siehe Admin-API.
Twig\SmallBusinessExtension Twig-Funktion mmd_small_business_active().
Resources/views/storefront/... Template-Overrides der Storefront, siehe Storefront.
Resources/views/documents/... Template-Overrides für Rechnung, Storno und Gutschrift, siehe Dokumente und E-Mails.
Resources/snippet/... Storefront-Snippets (storefront.de-DE, storefront.en-GB) und der Dokumenten-Hinweis (messages.de-DE, messages.en-GB).
Resources/app/administration/... Modul mit der Migrationskarte (Komponente mmd-kleinunternehmer-migration) und eigenen Admin-Snippets.

Twig-Funktion

mmd_small_business_active() gibt true zurück, wenn active für den aktuellen Verkaufskanal eingeschaltet ist. Den Verkaufskanal ermittelt sie aus der Variable context (Storefront) oder aus der Variable order (Dokumente). Fehlen beide, gilt der allgemeine Wert.

Unterschiede der Shopware-6.6-Linie

Die 6.6-Linie (mmd/sw66-kleinunternehmer, shopware/core ~6.6.0) hat denselben Aufbau. Verglichen mit dem Code der 6.7-Linie gibt es diese Unterschiede:

Bereich 6.7-Linie 6.6-Linie
Hinweistexte Nur Snippets. Zusätzlich zwei Textfelder in der Konfiguration (Karte "Hinweistexte"): invoiceHint ("Hinweistext für Rechnungen (optional)") und priceHint ("Hinweistext für Preisanzeige (optional)"). Ein ausgefüllter Wert überschreibt das jeweilige Snippet, ein leerer Wert nutzt das Snippet.
Dokumenten-Hinweis Snippet document.smallBusinessNotice. Wert aus invoiceHint, sonst Snippet document.smallBusinessNotice. Gilt für Rechnung, Storno und Gutschrift.
Preishinweis Produktseite Snippet mmd-kleinunternehmer.grossTaxInformation als Link auf die Versand- und Zahlungsinformationen. Wert aus priceHint, sonst Snippet mmd-kleinunternehmer.taxInfo ("Preis ohne MwSt. gem. §19 UStG") als einfacher Text ohne Link.
Preishinweis Offcanvas-Warenkorb Snippet mmd-kleinunternehmer.grossTaxInformation. Wert aus priceHint, sonst Snippet mmd-kleinunternehmer.taxInfo.
Produktliste Eigener Override der Produktbox mit dem Preishinweis. Kein Override, die Produktliste zeigt die Shopware-Standardtexte.
Twig-Funktionen mmd_small_business_active() Zusätzlich mmd_small_business_price_hint() und mmd_small_business_invoice_hint().
Admin-Migrationskarte Bestätigungsdialog vor der Migration und Warnung ab mehr als 1.500 Produkten. Migration startet direkt per Klick, ohne Dialog und ohne Warnung.
CLI-Befehl Fortschrittsbalken während der Migration. Gleicher Befehl mit denselben Optionen, ohne Fortschrittsbalken.
Admin-API-Rechte product:read (Status), product:update und system_config:read (Migration) product.viewer (Status), product.editor (Migration)

Unverändert gleich sind Plugin-Klasse und technischer Name, Lebenszyklus (Steuersatz, Standard-Steuersatz), Konfigurationsschlüssel active, die Routen der Admin-API, der Name des CLI-Befehls und seine Optionen, die Preislogik, die Überschreibungen der Dokumentvorlagen (abgesehen vom Hinweistext), der Checkout-Override und der Footer-Override.