Schweiz als Drittland behandeln (kein EU-Reverse Charge) #26

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

Die Schweiz steuerrechtlich korrekt als Drittland behandeln:

  • Kein EU-Reverse Charge für CH-Kunden — auch bei hinterlegter VAT ID
  • Schweizer MWST gilt unabhängig vom Kundentyp (7.7% Standard)
  • Im Tax Mapping explizit kennzeichnen dass CH ein Drittland ist
  • Keine EU OSS-Regelung anwenden
  • Dokumentation der steuerlichen Besonderheit im DocType als Hinweistext
Die Schweiz steuerrechtlich korrekt als Drittland behandeln: - Kein EU-Reverse Charge für CH-Kunden — auch bei hinterlegter VAT ID - Schweizer MWST gilt unabhängig vom Kundentyp (7.7% Standard) - Im Tax Mapping explizit kennzeichnen dass CH ein Drittland ist - Keine EU OSS-Regelung anwenden - Dokumentation der steuerlichen Besonderheit im DocType als Hinweistext
Owner

Umgesetzt in shopware6/utils/tax.py (determine_customer_tax_treatment(), #25).

Recherche vorab (wie bei #24):

  • CH-MWST unabhängig vom Kundentyp: bereits durch #23s Shopware Tax Mapping (Storefront + Satz → Konto) abgedeckt, keine B2B/B2C-Unterscheidung dort nötig.
  • EU-OSS-Regelung: wurde an keiner Stelle dieses Projekts implementiert, es gibt nichts zu deaktivieren.
  • Reverse Charge für CH als Lieferland (DE/AT-Storefront → CH): bereits korrekt, da "CH" nie in EU_COUNTRY_CODES enthalten war.

Der tatsächliche Bug (gefunden im Vergleich mit Marcels order/order_mapper.py): #25s reverse_charge-Bedingung prüfte nur das Lieferland gegen die EU-Länderliste, nicht das Herkunftsland (Company-Land des Storefronts). Ein Storefront mit Schweizer Company hätte bei einem deutschen B2B-Kunden mit gültiger USt-IdNr. fälschlich reverse_charge=True geliefert — rechtlich falsch, da Reverse Charge (Art. 138 MwStSystRL) nur zwischen zwei EU-Mitgliedstaaten gilt, eine Lieferung aus der Schweiz ist immer Drittlandsgeschäft.

Fix: eine zusätzliche Bedingung origin_country in EU_COUNTRY_CODES, bewusst generisch gehalten (nicht CH-spezifisch hartcodiert) — deckt damit jeden Nicht-EU-Herkunfts-Storefront ab.

Zusätzlich: Hinweistext (description) auf dem Shopware Tax Mapping-DocType, dass der Steuersatz pro Storefront unabhängig vom Kundentyp gilt und Nicht-EU-Storefronts nie Reverse-Charge/OSS auslösen, auch nicht mit hinterlegter USt-IdNr.

Live verifiziert:

  • Alle 4 zuvor in #25 verifizierten Szenarien liefern nach dem Fix identische Ergebnisse (keine Regression).
  • Neuer Fall: Test-Storefront mit Schweizer Company als Herkunft + deutscher B2B-Kunde mit gültiger VAT-ID + deutsches Lieferland → liefert jetzt korrekt reverse_charge=False (vorher wäre es fälschlich True gewesen).
  • Hinweistext auf Shopware Tax Mapping sichtbar (frappe.get_meta().description).
  • Alle Testdaten (temporäre Company + Storefront) danach gelöscht und Löschung unabhängig bestätigt.

Details: docs/architecture.md → "Issue 26: Switzerland as a third country", Projekt.md → Architecture Decisions.

Damit ist Milestone 7 ("Steuern") vollständig abgeschlossen (4/4 Issues).

Umgesetzt in `shopware6/utils/tax.py` (`determine_customer_tax_treatment()`, #25). **Recherche vorab (wie bei #24):** - CH-MWST unabhängig vom Kundentyp: bereits durch #23s `Shopware Tax Mapping` (Storefront + Satz → Konto) abgedeckt, keine B2B/B2C-Unterscheidung dort nötig. - EU-OSS-Regelung: wurde an keiner Stelle dieses Projekts implementiert, es gibt nichts zu deaktivieren. - Reverse Charge für CH als Lieferland (DE/AT-Storefront → CH): bereits korrekt, da "CH" nie in `EU_COUNTRY_CODES` enthalten war. **Der tatsächliche Bug (gefunden im Vergleich mit Marcels `order/order_mapper.py`):** #25s `reverse_charge`-Bedingung prüfte nur das Lieferland gegen die EU-Länderliste, nicht das Herkunftsland (Company-Land des Storefronts). Ein Storefront mit Schweizer Company hätte bei einem deutschen B2B-Kunden mit gültiger USt-IdNr. fälschlich `reverse_charge=True` geliefert — rechtlich falsch, da Reverse Charge (Art. 138 MwStSystRL) nur zwischen zwei EU-Mitgliedstaaten gilt, eine Lieferung aus der Schweiz ist immer Drittlandsgeschäft. **Fix:** eine zusätzliche Bedingung `origin_country in EU_COUNTRY_CODES`, bewusst generisch gehalten (nicht CH-spezifisch hartcodiert) — deckt damit jeden Nicht-EU-Herkunfts-Storefront ab. **Zusätzlich:** Hinweistext (`description`) auf dem `Shopware Tax Mapping`-DocType, dass der Steuersatz pro Storefront unabhängig vom Kundentyp gilt und Nicht-EU-Storefronts nie Reverse-Charge/OSS auslösen, auch nicht mit hinterlegter USt-IdNr. **Live verifiziert:** - Alle 4 zuvor in #25 verifizierten Szenarien liefern nach dem Fix identische Ergebnisse (keine Regression). - Neuer Fall: Test-Storefront mit Schweizer Company als Herkunft + deutscher B2B-Kunde mit gültiger VAT-ID + deutsches Lieferland → liefert jetzt korrekt `reverse_charge=False` (vorher wäre es fälschlich `True` gewesen). - Hinweistext auf `Shopware Tax Mapping` sichtbar (`frappe.get_meta().description`). - Alle Testdaten (temporäre Company + Storefront) danach gelöscht und Löschung unabhängig bestätigt. Details: `docs/architecture.md` → "Issue 26: Switzerland as a third country", `Projekt.md` → Architecture Decisions. Damit ist Milestone 7 ("Steuern") vollständig abgeschlossen (4/4 Issues).
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#26
No description provided.