Kleinunternehmer: Preis-Migration
Produktpreise im Sylius-Shop auf die 0-%-Steuerkategorie nach §19 UStG umstellen und zurücksetzen: Admin-Button, Konsolenbefehl mit allen Optionen, Rundungsgrenzen, übersprungene Varianten.
Kleinunternehmer: Preis-Migration
Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net
Was die Migration macht
Bestehende Produkte behalten ihre Steuerkategorie (zum Beispiel 19 % oder 7 %), auch wenn du die Regelung aktivierst. Die Migration stellt jede Produktvariante auf die 0-%-Steuerkategorie kleinunternehmer_zero um und rechnet dabei den Preis neu:
- Aus dem bisherigen Bruttopreis wird der Nettopreis berechnet:
Netto = Brutto / (1 + Steuersatz), auf den nächsten Cent gerundet. Der Steuersatz ist der der bisherigen Steuerkategorie für die ZoneDE. - Die Variante bekommt die Kategorie
kleinunternehmer_zero, der Nettopreis wird ihr neuer Preis. - Das Plugin merkt sich pro Variante die ursprüngliche Steuerkategorie, damit ein Zurücksetzen weiß, welche Kategorie es wiederherstellen muss.
Gearbeitet wird in Blöcken zu je 100 Varianten.
graph TD
A["Variante auf bisheriger Steuerkategorie"] --> B{"Kategorie, Code und Steuersatz für Zone DE vorhanden?"}
B -->|Nein| C["Wird übersprungen, bleibt unverändert"]
B -->|Ja| D["Netto = Brutto geteilt durch 1 plus Steuersatz, gerundet"]
D --> E["Kategorie kleinunternehmer_zero, Preis = Netto"]
E --> F["Ursprungs-Kategorie in mmd_kleinunternehmer_migrated_variant merken"]
Die Migration ändert Preise im Shop. Sichere vorher deine Datenbank und prüfe die Anzahl mit
--dry-run.
Migration im Admin
Auf der Einstellungsseite (Admin → MMKreativ Plugins → Kleinunternehmer §19 UStG) zeigt die Karte „Preise migrieren“ zwei Zähler: wie viele Varianten noch nicht migriert und wie viele bereits migriert sind. Der Knopf Jetzt migrieren erscheint nur, solange noch Varianten offen sind, und verlangt eine Bestätigung.
Die Karte warnt außerdem bei Widersprüchen:
- Die Regelung ist aktiv, aber Varianten berechnen noch Umsatzsteuer: Hinweis und Preise passen nicht zusammen.
- Die Regelung ist inaktiv, aber migrierte Varianten berechnen weiterhin keine Umsatzsteuer.
Der Knopf löst eine geschützte POST-Anfrage aus (CSRF-Token, Recht ROLE_ADMINISTRATION_ACCESS). Konnten einzelne Varianten nicht migriert werden, erscheint der Hinweis „Einige Varianten konnten nicht migriert werden (kein Steuersatz für die DE-Zone auf ihrer Steuerkategorie hinterlegt) und wurden unverändert gelassen.“
Im Admin gibt es nur die Richtung zur Kleinunternehmerregelung. Zurücksetzen geht ausschließlich per Konsolenbefehl.
Migration per Konsole
Für Skripte und zum Zurücksetzen gibt es mmd:kleinunternehmer:migrate-prices:
| Option | Kürzel | Beschreibung |
|---|---|---|
--to-small-business |
Preise auf die 0-%-Kategorie migrieren | |
--restore |
Zuvor migrierte Varianten auf ihre ursprüngliche Steuerkategorie und ihren Preis zurücksetzen | |
--dry-run |
Nur melden, wie viele Varianten betroffen wären, ohne etwas zu schreiben | |
--force |
-f |
Bestätigungsabfrage überspringen |
Genau eine der beiden Optionen --to-small-business und --restore ist Pflicht, sonst bricht der Befehl ab.
# Vorschau: Wie viele Varianten wären betroffen?
bin/console mmd:kleinunternehmer:migrate-prices --to-small-business --dry-run
# Migrieren, mit Bestätigungsabfrage
bin/console mmd:kleinunternehmer:migrate-prices --to-small-business
# Migrieren in einem Skript ohne Rückfrage
bin/console mmd:kleinunternehmer:migrate-prices --to-small-business --force
# Auf die ursprüngliche Steuerkategorie zurücksetzen
bin/console mmd:kleinunternehmer:migrate-prices --restore
Ohne
--forceverweigert der Befehl in einer nicht interaktiven Umgebung die Arbeit, weil die Umstellung einmalig ist und das Zurücksetzen Rundungsabweichungen hat. Im Skript also immer--forceangeben.
Bei einer ungültigen Optionskombination und bei fehlendem --force ohne Terminal endet der Befehl mit dem Exit-Code INVALID. Während der Arbeit zeigt er einen Fortschrittsbalken. Nach --to-small-business prüft er, ob Varianten übrig geblieben sind, und warnt dann, dass sie wegen eines fehlenden Steuersatzes für die Zone DE übersprungen wurden. bin/console mmd:kleinunternehmer:migrate-prices --help zeigt den ausführlichen Hilfetext.
Zurücksetzen und seine Grenzen
--restore stellt für jede gemerkte Variante die ursprüngliche Steuerkategorie wieder her und rechnet den Bruttopreis aus dem aktuellen Preis der Variante zurück: Brutto = Netto x (1 + ursprünglicher Steuersatz), auf den Cent gerundet. Gespeichert ist nur die ursprüngliche Steuerkategorie, nicht der Preis. Hast du den Preis nach der Migration von Hand geändert, rechnet das Zurücksetzen von diesem neuen Preis aus.
Das Zurücksetzen ist nicht cent-genau. Weil der Nettopreis schon beim Migrieren auf den Cent gerundet wurde, kann der zurückgerechnete Bruttopreis um ein bis zwei Cent vom ursprünglichen abweichen. Das gilt für die meisten Steuersätze und ist kein Fehler.
Gibt es die ursprüngliche Steuerkategorie oder ihren Steuersatz für die Zone DE nicht mehr, bleibt die Variante auf der 0-%-Kategorie und ihrem Preis. Der Eintrag zur Variante wird trotzdem gelöscht, weil ein erneuter Versuch nichts ändern würde, und die gemeldete Anzahl der zurückgesetzten Varianten zählt solche Einträge mit.
Was übersprungen wird
Das Plugin rät keine Preise und überspringt deshalb Varianten, die es nicht umrechnen kann:
- Variante ohne Steuerkategorie: Sie wird gar nicht erst ausgewählt, erscheint nicht in den Zählern und löst keine Warnung aus. Weise ihr eine Steuerkategorie zu, wenn sie mitmigriert werden soll.
- Variante ohne Code oder ohne Steuersatz der bisherigen Kategorie für die Zone
DE: Sie bleibt unverändert und zählt weiterhin als „noch nicht migriert“, damit du sie erkennst. Ergänze den Code oder einenDE-Steuersatz und starte die Migration erneut.
Grenzen der Preisumrechnung
- Umgerechnet wird nur der Verkaufspreis (
price) der Variante im Channel. Der Originalpreis (originalPrice) und der Mindestpreis (minimumPrice) bleiben unverändert. - Die Formel geht davon aus, dass die Steuer im Preis enthalten ist, wie es bei Brutto-Preisen üblich ist. Der Schalter „im Preis enthalten“ der bisherigen Steuersätze wird nicht ausgewertet. Pflegst du deine Preise netto, prüfe das Ergebnis vor dem Livegang.
- Die neue 0-%-Steuerkategorie legt das Plugin mit dem Namen „Kleinunternehmer §19 UStG (0%)“ an, der Steuersatz heißt „USt. 0% (Kleinunternehmer §19 UStG)“, hat den Betrag 0 und gilt für die Zone
DE. - Das Migrieren und das Zurücksetzen brauchen beide eine Zone mit dem Code
DE. Ohne sie bricht der Befehl mit einem Fehler ab (Exit-CodeFAILURE), im Admin erscheint die Meldung „Migration fehlgeschlagen: …“.