B2B / B2C Unterscheidung implementieren #25

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

Bei Bestellungen zwischen B2B- und B2C-Kunden unterscheiden:

  • B2B: Kunde hat Umsatzsteuer-ID (VAT ID) in Shopware hinterlegt
  • B2C: Privatkunde ohne VAT ID
  • B2B innerhalb EU: Reverse Charge anwenden (0% Steuer mit Hinweis)
  • B2C: normaler Steuersatz des Lieferlandes
  • Kundentyp beim Bestellungsimport ermitteln und korrektes Tax Template wählen
Bei Bestellungen zwischen B2B- und B2C-Kunden unterscheiden: - B2B: Kunde hat Umsatzsteuer-ID (VAT ID) in Shopware hinterlegt - B2C: Privatkunde ohne VAT ID - B2B innerhalb EU: Reverse Charge anwenden (0% Steuer mit Hinweis) - B2C: normaler Steuersatz des Lieferlandes - Kundentyp beim Bestellungsimport ermitteln und korrektes Tax Template wählen
Owner

Umgesetzt. Anders als #24 gab es hier echten Bedarf — zusammengefasst:

Neu: shopware6/utils/tax.py (determine_customer_tax_treatment()) — reine Entscheidungslogik ohne Seiteneffekte (noch keine Sales Order/Customer, das kommt erst mit #27-#30). Klassifiziert eine Shopware-Bestellung als B2C, inländisches B2B oder grenzüberschreitendes EU-B2B (Reverse Charge), basierend auf orderCustomer.company/vatIds (im Bestell-Snapshot eingefroren, im Shopware-Core-Quellcode bestätigt) sowie Liefer- vs. Herkunftsland.

ERPNext/ALYF-Check zuerst (wie bei #23/#24): ERPNext-Core hat kein EU-Reverse-Charge-Konzept. erpnext_germany hätte einen echten VAT ID Check-DocType (VIES) und ein tax_exemption_reason-Feld auf Tax-Templates — ist aber in dieser Instanz nicht installiert (auch sonst keine ALYF-Bundles). Kein Blocker: Da eu_b2b_tax_template nur ein bestehendes Template referenziert statt selbst Text zu erzeugen, greift der automatische Hinweistext transparent, sobald erpnext_germany später installiert wird — ohne Code-Änderung hier.

Julian/Marcel-Check: ihre eu_reverse_charge/tax_exemption_notice/validated_vat_id/vat_validation_status-Felder sind in beiden Forks toter Code (angelegt, nirgends im echten Bestell-Import gelesen/geschrieben) — nicht übernommen.

Neues Feld: Shopware Storefront.eu_b2b_tax_template (Link → Sales Taxes and Charges Template, optional) statt Titel-Raten. Neue Validierung: muss zur Company des Storefronts passen.

Nebenbei gefunden und behoben: beim Feld-Hinzufügen fiel auf, dass das warehouse-Feld (aus #10) in der DocType-Metadaten-DB verschwunden war (Spalte/Daten unberührt, nur die Feld-Definition fehlte) — wiederhergestellt, Details in docs/stolperfallen.md.

Live verifiziert: echte Bestellung mit den nötigen Assoziationen abgerufen (Struktur bestätigt); vier Testfälle (B2C, inländisches B2B, grenzüberschreitendes B2B, fehlkonfiguriertes B2B) korrekt behandelt; Company-Validierung korrekt abgelehnt.

Details: docs/architecture.md#issue-25

Nebenbei zwei neue Issues angelegt (#31 Artikelbilder pushen, #32 PIM-Scoping) auf deinen Wunsch.

Umgesetzt. Anders als #24 gab es hier echten Bedarf — zusammengefasst: **Neu**: `shopware6/utils/tax.py` (`determine_customer_tax_treatment()`) — reine Entscheidungslogik ohne Seiteneffekte (noch keine Sales Order/Customer, das kommt erst mit #27-#30). Klassifiziert eine Shopware-Bestellung als B2C, inländisches B2B oder grenzüberschreitendes EU-B2B (Reverse Charge), basierend auf `orderCustomer.company`/`vatIds` (im Bestell-Snapshot eingefroren, im Shopware-Core-Quellcode bestätigt) sowie Liefer- vs. Herkunftsland. **ERPNext/ALYF-Check zuerst** (wie bei #23/#24): ERPNext-Core hat kein EU-Reverse-Charge-Konzept. `erpnext_germany` hätte einen echten `VAT ID Check`-DocType (VIES) und ein `tax_exemption_reason`-Feld auf Tax-Templates — ist aber in dieser Instanz nicht installiert (auch sonst keine ALYF-Bundles). Kein Blocker: Da `eu_b2b_tax_template` nur ein bestehendes Template referenziert statt selbst Text zu erzeugen, greift der automatische Hinweistext transparent, sobald `erpnext_germany` später installiert wird — ohne Code-Änderung hier. **Julian/Marcel-Check**: ihre `eu_reverse_charge`/`tax_exemption_notice`/`validated_vat_id`/`vat_validation_status`-Felder sind in beiden Forks toter Code (angelegt, nirgends im echten Bestell-Import gelesen/geschrieben) — nicht übernommen. **Neues Feld**: `Shopware Storefront.eu_b2b_tax_template` (Link → Sales Taxes and Charges Template, optional) statt Titel-Raten. Neue Validierung: muss zur Company des Storefronts passen. **Nebenbei gefunden und behoben**: beim Feld-Hinzufügen fiel auf, dass das `warehouse`-Feld (aus #10) in der DocType-Metadaten-DB verschwunden war (Spalte/Daten unberührt, nur die Feld-Definition fehlte) — wiederhergestellt, Details in `docs/stolperfallen.md`. Live verifiziert: echte Bestellung mit den nötigen Assoziationen abgerufen (Struktur bestätigt); vier Testfälle (B2C, inländisches B2B, grenzüberschreitendes B2B, fehlkonfiguriertes B2B) korrekt behandelt; Company-Validierung korrekt abgelehnt. Details: [docs/architecture.md#issue-25](docs/architecture.md#issue-25-b2bb2c-detection-and-eu-cross-border-reverse-charge) Nebenbei zwei neue Issues angelegt (#31 Artikelbilder pushen, #32 PIM-Scoping) auf deinen Wunsch.
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#25
No description provided.