Steuer-Mapping bei Bestellungsimport anwenden #30

Closed
opened 2026-05-10 16:46:43 +00:00 by csaeum · 1 comment
csaeum commented 2026-05-10 16:46:43 +00:00 (Migrated from gitlab.localdomain)

Beim Import einer Shopware-Bestellung das korrekte ERPNext Tax Template ermitteln und setzen:

  • Steuersatz aus der Shopware-Bestellung auslesen
  • Storefront + Steuersatz + Kundentyp (B2B/B2C) gegen Shopware Tax Mapping abgleichen
  • Passendes ERPNext Tax Template auf der Sales Order setzen
  • Sonderfall Schweiz: kein Reverse Charge auch bei VAT ID
  • Bestellungen ohne Steuer-Mapping in Error Log schreiben
Beim Import einer Shopware-Bestellung das korrekte ERPNext Tax Template ermitteln und setzen: - Steuersatz aus der Shopware-Bestellung auslesen - Storefront + Steuersatz + Kundentyp (B2B/B2C) gegen `Shopware Tax Mapping` abgleichen - Passendes ERPNext Tax Template auf der Sales Order setzen - Sonderfall Schweiz: kein Reverse Charge auch bei VAT ID - Bestellungen ohne Steuer-Mapping in Error Log schreiben
Owner

Umgesetzt: _apply_taxes() in shopware6/api/order.py, aufgerufen aus _create_sales_order(), verdrahtet drei bereits bestehende Bausteine:

  • Shopware Tax Mapping (#23)
  • determine_customer_tax_treatment() (#25/#26)
  • #27s _create_sales_order(), die bisher bewusst keine Sales Taxes and Charges-Zeilen gebaut hat

Bewusste Abweichung vom Issue-Text: statt eines dritten Kundentyp-Felds auf Shopware Tax Mapping (#23 hat das absichtlich nicht) werden beide bereits existierenden Bausteine kombiniert: reverse_charge=True (EU-B2B-Grenzfall) → das konfigurierte eu_b2b_tax_template wird angewendet; sonst (Inland B2B/B2C, oder Drittland wie Schweiz — #26 sorgt dort bereits für reverse_charge=False) → Shopware Tax Mapping wird pro tatsächlich auf der Bestellung vorhandenem Steuersatz nachgeschlagen.

Quelle der Steuerbeträge ist order.price.calculatedTaxes — von Shopware bereits über alle Positionen und Versandkosten aggregiert. Gebucht wird mit charge_type="Actual" und Shopwares eigenem Betrag, nicht mit einem prozentualen ERPNext-Neuberechnen (ERPNexts eigene SKR04-Templates verlassen sich sonst auf Item Tax Templates, die hier nicht gebaut werden sollten). Fehlt für einen vorhandenen Satz die Zuordnung, wird die ganze Bestellung übersprungen (skipped_no_tax_mapping) statt ein Konto zu raten oder die Steuer stillschweigend wegzulassen.

Nebenbei gefunden und behoben: ein echter, bisher unentdeckter Bug in #23s eigenem Shopware Tax Mapping-DocType — autoname: "format:{shopware_storefront}-{tax_rate}" verschluckt das Float-Feld tax_rate stillschweigend (Frappes Naming-Engine unterstützt in "format:"-Mustern kein float), wodurch zwei Sätze für denselben Storefront kollidiert wären. Auf autoname: "hash" umgestellt.

Live gegen die echte Testinstanz verifiziert: Inlandsfall (ein Satz), gemischter Satz (zwei Sätze gleichzeitig, korrekt getrennt), EU-B2B-Reverse-Charge, fehlendes Mapping (korrekter Skip), Schweiz-Herkunfts-Regression zu #26, 0%-Einträge korrekt übersprungen, sowie ein voller import_orders()-Durchlauf über mehrere Szenarien gleichzeitig. Alle Testdaten gelöscht und unabhängig erneut als entfernt bestätigt.

Details: docs/architecture.md → Issue 30.

Damit ist Milestone 8 ("Bestellsynchronisation") vollständig abgeschlossen (4/4).

Umgesetzt: `_apply_taxes()` in `shopware6/api/order.py`, aufgerufen aus `_create_sales_order()`, verdrahtet drei bereits bestehende Bausteine: - `Shopware Tax Mapping` (#23) - `determine_customer_tax_treatment()` (#25/#26) - #27s `_create_sales_order()`, die bisher bewusst keine `Sales Taxes and Charges`-Zeilen gebaut hat **Bewusste Abweichung vom Issue-Text**: statt eines dritten Kundentyp-Felds auf `Shopware Tax Mapping` (#23 hat das absichtlich nicht) werden beide bereits existierenden Bausteine kombiniert: `reverse_charge=True` (EU-B2B-Grenzfall) → das konfigurierte `eu_b2b_tax_template` wird angewendet; sonst (Inland B2B/B2C, oder Drittland wie Schweiz — #26 sorgt dort bereits für `reverse_charge=False`) → `Shopware Tax Mapping` wird pro tatsächlich auf der Bestellung vorhandenem Steuersatz nachgeschlagen. Quelle der Steuerbeträge ist `order.price.calculatedTaxes` — von Shopware bereits über alle Positionen und Versandkosten aggregiert. Gebucht wird mit `charge_type="Actual"` und Shopwares eigenem Betrag, nicht mit einem prozentualen ERPNext-Neuberechnen (ERPNexts eigene SKR04-Templates verlassen sich sonst auf Item Tax Templates, die hier nicht gebaut werden sollten). Fehlt für einen vorhandenen Satz die Zuordnung, wird die **ganze Bestellung** übersprungen (`skipped_no_tax_mapping`) statt ein Konto zu raten oder die Steuer stillschweigend wegzulassen. **Nebenbei gefunden und behoben**: ein echter, bisher unentdeckter Bug in #23s eigenem `Shopware Tax Mapping`-DocType — `autoname: "format:{shopware_storefront}-{tax_rate}"` verschluckt das Float-Feld `tax_rate` stillschweigend (Frappes Naming-Engine unterstützt in `"format:"`-Mustern kein `float`), wodurch zwei Sätze für denselben Storefront kollidiert wären. Auf `autoname: "hash"` umgestellt. Live gegen die echte Testinstanz verifiziert: Inlandsfall (ein Satz), gemischter Satz (zwei Sätze gleichzeitig, korrekt getrennt), EU-B2B-Reverse-Charge, fehlendes Mapping (korrekter Skip), Schweiz-Herkunfts-Regression zu #26, 0%-Einträge korrekt übersprungen, sowie ein voller `import_orders()`-Durchlauf über mehrere Szenarien gleichzeitig. Alle Testdaten gelöscht und unabhängig erneut als entfernt bestätigt. Details: `docs/architecture.md` → Issue 30. Damit ist **Milestone 8 ("Bestellsynchronisation") vollständig abgeschlossen (4/4)**.
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Frappe-Projekte/ecommerce_integrations#30
No description provided.