Varianten pushen #19

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

ERPNext Item Variants als Shopware Produkt-Varianten pushen:

  • ERPNext Item Attributes → Shopware Properties + Options
  • Varianten-Artikel dem Eltern-Produkt in Shopware zuordnen
  • Preis pro Variante aus Preisliste auslesen und pushen
  • Bereits vorhandene Varianten aktualisieren statt neu anlegen
  • Implementierung als Erweiterung von shopware6/api/product.py
ERPNext Item Variants als Shopware Produkt-Varianten pushen: - ERPNext Item Attributes → Shopware Properties + Options - Varianten-Artikel dem Eltern-Produkt in Shopware zuordnen - Preis pro Variante aus Preisliste auslesen und pushen - Bereits vorhandene Varianten aktualisieren statt neu anlegen - Implementierung als Erweiterung von `shopware6/api/product.py`
Owner

Umgesetzt in shopware6/api/product.py (Erweiterung, keine neue Datei, wie gefordert):

  • push_variants(shopware_account) — pro Template-Item (has_variants=1) mit mindestens einer Variante: sammelt die tatsächlich bei den Varianten-Kindern vorkommenden Attribut-Werte, stellt dafür Shopware Property-Group/Option sicher (Live-Suche + In-Memory-Cache pro Lauf, keine neuen Custom Fields/DocTypes), pusht das Template als Parent-Produkt mit configuratorSettings und jede Variante mit parentId+options.
  • Preis pro Variante: keine eigene Logik nötig — #18s push_prices() deckt Varianten automatisch mit ab (Filter dafür verkürzt, siehe unten).
  • Neuer Button "Push Variants" auf Shopware Account.

Zwei Dinge live entdeckt, die vom ursprünglichen Plan abwichen:

  1. Shopware-Bug: Ein zweiter push_variants()-Lauf gegen ein bereits gepushtes Template schlug mit 500 fehl (SQLSTATE[23000], FK-Verletzung auf product_configurator_setting.property_group_option_id) — erneutes Verlinken einer bereits verlinkten optionId beim PATCH von configuratorSettings ist serverseitig nicht erlaubt. Fix: vor dem PATCH werden die bestehenden configurator-settings-Zeilen einzeln gelöscht (_clear_configurator_settings()), danach die neue Liste gesetzt. Live bestätigt, dass Varianten-options davon nicht betroffen sind (kein Clear-first nötig dort). Dokumentiert in docs/stolperfallen.md.
  2. Eigener Bug in der Plan-Umsetzung: Die geplante Filter-Verkürzung in price.py/translation.py auf {"has_variants": 0} (damit "Push Prices"/"Push Descriptions" auch Varianten erfassen) war nötig, aber unvollständig — beide Dateien lasen die Shopware-ID nur aus shopware_product_id, das bei Varianten nie gesetzt ist (nur shopware_variant_id). Ein Live-Testlauf von push_prices() zeigte das direkt (beide Test-Varianten fälschlich skipped_not_pushed). Fix: item.get(SHOPWARE_VARIANT_ID_FIELD) or item.get(SHOPWARE_PRODUCT_ID_FIELD) in beiden Dateien.

Live-Verifikation End-to-End (Test-Template mit Attribut "Farbe", 2 Werten, 2 Varianten): Parent + beide Varianten korrekt in Shopware mit sichtbarer Konfigurator-Achse; zweiter Lauf aktualisiert statt dupliziert (created: 0); anschließender "Push Prices"-Lauf setzte auf beiden Varianten echte Preise (Brutto/unrounded Netto/echte taxId) statt Platzhalter. Testdaten (Shopware + ERPNext) sind nach dem Test wieder gelöscht.

Volle Begründung: docs/architecture.md#issue-19

Damit ist Milestone 5 (#16-#19) komplett.

Umgesetzt in `shopware6/api/product.py` (Erweiterung, keine neue Datei, wie gefordert): - `push_variants(shopware_account)` — pro Template-Item (`has_variants=1`) mit mindestens einer Variante: sammelt die tatsächlich bei den Varianten-Kindern vorkommenden Attribut-Werte, stellt dafür Shopware Property-Group/Option sicher (Live-Suche + In-Memory-Cache pro Lauf, keine neuen Custom Fields/DocTypes), pusht das Template als Parent-Produkt mit `configuratorSettings` und jede Variante mit `parentId`+`options`. - Preis pro Variante: keine eigene Logik nötig — #18s `push_prices()` deckt Varianten automatisch mit ab (Filter dafür verkürzt, siehe unten). - Neuer Button "Push Variants" auf `Shopware Account`. **Zwei Dinge live entdeckt, die vom ursprünglichen Plan abwichen:** 1. **Shopware-Bug**: Ein zweiter `push_variants()`-Lauf gegen ein bereits gepushtes Template schlug mit `500` fehl (`SQLSTATE[23000]`, FK-Verletzung auf `product_configurator_setting.property_group_option_id`) — erneutes Verlinken einer bereits verlinkten `optionId` beim PATCH von `configuratorSettings` ist serverseitig nicht erlaubt. Fix: vor dem PATCH werden die bestehenden configurator-settings-Zeilen einzeln gelöscht (`_clear_configurator_settings()`), danach die neue Liste gesetzt. Live bestätigt, dass Varianten-`options` davon nicht betroffen sind (kein Clear-first nötig dort). Dokumentiert in `docs/stolperfallen.md`. 2. **Eigener Bug in der Plan-Umsetzung**: Die geplante Filter-Verkürzung in `price.py`/`translation.py` auf `{"has_variants": 0}` (damit "Push Prices"/"Push Descriptions" auch Varianten erfassen) war nötig, aber unvollständig — beide Dateien lasen die Shopware-ID nur aus `shopware_product_id`, das bei Varianten nie gesetzt ist (nur `shopware_variant_id`). Ein Live-Testlauf von `push_prices()` zeigte das direkt (beide Test-Varianten fälschlich `skipped_not_pushed`). Fix: `item.get(SHOPWARE_VARIANT_ID_FIELD) or item.get(SHOPWARE_PRODUCT_ID_FIELD)` in beiden Dateien. Live-Verifikation End-to-End (Test-Template mit Attribut "Farbe", 2 Werten, 2 Varianten): Parent + beide Varianten korrekt in Shopware mit sichtbarer Konfigurator-Achse; zweiter Lauf aktualisiert statt dupliziert (`created: 0`); anschließender "Push Prices"-Lauf setzte auf beiden Varianten echte Preise (Brutto/unrounded Netto/echte `taxId`) statt Platzhalter. Testdaten (Shopware + ERPNext) sind nach dem Test wieder gelöscht. Volle Begründung: [docs/architecture.md#issue-19](https://git.web-seo-consulting.eu/Frappe-Projekte/ecommerce_integrations/src/branch/shopware6-dach/docs/architecture.md#issue-19-push-variants) Damit ist Milestone 5 (#16-#19) komplett.
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#19
No description provided.