Warenwirtschaft: AP-13-Umsetzungsansatz nach Plugin-Sichtung dokumentiert

Plugin-Trigger verifiziert (Kundendaten automatisch, Warenkorb per
Fulfillment-Button, Status per Cron-Poll). Bestandsabzug wird reiner
Serverseiten-Hook am Versand-Statuswechsel, kein Plugin-Update noetig.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-15 16:03:20 +00:00
parent 592b03ace5
commit f2f06f0ab9

View file

@ -130,6 +130,29 @@ Alle Punkte dieser älteren Runde sind in V4.0 eingeflossen und umgesetzt (URL-F
Die fachlichen Detailspezifikationen zu **AP-20, AP-21, AP-23, AP-24, AP-27, AP-28** stehen unverändert und weiterhin gültig in `entwicklungsplan-aktualisiert-12-06-2026.md` (§4 + §6) — dort sind DB-Schema, Dateipfade, Akzeptanzkriterien und Tests je AP vollständig beschrieben. Die OPT-Pakete sind in §2 dieses Dokuments spezifiziert. Für **AP-13** gilt das Konzept aus V4.0 (`entwicklungsplan-aktualisiert-02-06-2026.md`), mit einer Änderung: Buchung gegen `production_outputs`-basierte Bestände (nach AP-28).
### AP-13 — Umsetzungsansatz (ergänzt 15.07.2026 nach Sichtung des WooCommerce-Plugins)
Das in den Partner-Shops installierte Plugin **„PARTNERCENTER API Connector" v1.3.3** ist als Referenz eingecheckt (`dev/partnercenter-api/`, Commit `592b03a`). Die Sichtung ergibt: **Für den Shop-Bestandsabzug ist kein Plugin-Update und keine neue API-Route nötig** — alle benötigten Daten liegen zum Versandzeitpunkt bereits im Partnercenter.
**So arbeitet das Plugin heute (verifiziert im Code):**
| Auslöser | Richtung | Endpoint | Inhalt |
|---|---|---|---|
| **Automatisch** bei neuer Bestellung (`woocommerce_new_order`-Hook, auch Admin-Anlage) | WP → PC | `wp/store` | Kunde + Rechnungs-/Lieferadresse (**ohne** Warenkorb) |
| **Automatisch** bei Adressänderung (Hash-Vergleich in `woocommerce_update_order`) | WP → PC | `wp/update` | geänderte Adressen |
| **Manuell per Button** „Send to PARTNERCENTER for fulfillment" (Metabox in der WooCommerce-Bestellansicht) | WP → PC | `wp/order` | **Warenkorb** (SKU + Menge + Preis) inkl. Rechnungs-Link; SKU-Matching hier über `products.wp_number` |
| **Manuell per Button** „Retrieve" (nur solange Status `open`) | WP → PC | `wp/cancel` | Bestellung zurückziehen (serverseitig gegen versendete Bestellungen gesperrt) |
| **Stündlicher WP-Cron** | WP → PC | `wp/status` | fragt Versandstatus ab und schreibt ihn in die WooCommerce-Bestellung |
Der Warenkorb kommt also **per Knopfdruck** (Fulfillment-Übergabe), nicht automatisch — die Kundendaten dagegen automatisch. Das Versandereignis selbst findet **im Partnercenter** statt (`SalesController::store`, Aktion `store_shipped`, setzt `shipped_at` und Provisionsfreigaben); das Plugin holt den Status nur ab.
**Daraus folgt das AP-13-Design (reiner Serverseiten-Hook):**
1. **Abzug** beim erstmaligen Setzen von `shipped_at` (Statuswechsel auf „versendet"/„abgeschlossen" in `SalesController::store`): je `ShoppingOrderItem` Abgang mit `source='sale'` ins bestehende Ledger `product_stock_movements`; **Sets** werden über die Rezeptur in Einzelprodukte aufgelöst. `monthlyConsumptionByProduct()` wertet `source='sale'` bereits aus.
2. **Gegenbuchung** bei Storno (Status 10) einer bereits versendeten Bestellung — einziger Weg dafür ist der Admin, der API-Storno ist gegen Versendetes gesperrt.
3. Gilt automatisch für **alle Bestellquellen** (WooCommerce-Fulfillment, Whitelabel-Shop, manuelle Anlage), da alle als `ShoppingOrder` durch dieselbe Versand-Logik laufen.
4. **Bewusste Lücke (fachlich korrekt):** Self-Shipping-Bestellungen der Partner übertragen keinen Warenkorb und erzeugen keinen Abzug — der Partner versendet aus eigenem Bestand, das Partnercenter-Lager wird nicht berührt. **Mit dem Kunden bestätigen.**
5. **Mitzulösen:** (a) unbekannte SKUs sichtbar machen — heute geht „article not found" nur in der API-Antwort unter, die Position fehlt dann still in Bestellung und Abzug; (b) `wp_number`-Konsistenzprüfung (aktive Produkte ohne/mit doppelter SKU).
### Geklärte Punkte mit dem Kunden (beantwortet 06.07.2026)
1. **Lagerort-Modell (AP-21):** ✅ **drei getrennte Stammdaten-Tabellen** (Raum/Regal/Fach) — wie empfohlen.
2. **Chargen-Nr.-Datumsformat (AP-24):** ✅ `TP1` + `ddmmyy` bestätigt (Beispiel TP1150626 = 15.06.26). **Bei AP-24-Umsetzung in der Hinweise-Doku (AP-18) hinterlegen.**
@ -168,7 +191,7 @@ Die fachlichen Detailspezifikationen zu **AP-20, AP-21, AP-23, AP-24, AP-27, AP-
| 15.07.2026 | **OPT-9 (AuthZ/CSRF)** | Audit M-2/M-3/M-6/M-7/M-10: Produktionen erfordern admin ≥ 7 (Request + Controller-Gates + UI); tote Formulare für Stufen 1–6 ausgeblendet; `stock-entries/copy` POST, Produkt-Löschung DELETE-Formulare; `imageAttribute` mit Spalten-Whitelist; URL-Felder `url:http,https`. Commit `9ed47c0`. | +2 Tests, 3 Tests an neue Regeln angepasst |
| 15.07.2026 | **Audit-Niedrigbefunde** | N-2/3/4/5/7/8/9/15 (Preis nur aus Eingängen, exaktes Verbrauchsfenster, einheitliche Kritisch-Zählung, Limit-Hinweis Ausschussliste, konsistentes Zahlenparsing, Kopie ohne Alt-Chargen-Nr., withTrashed-Korrekturen, Markdown-html_input=strip). Bewusst offen: N-1/6/10/13 (Design-/Kundenentscheid). Commit `d34f0a7`. | Volle Suite: **231 grün, 823 Assertions** |
| 15.07.2026 | **N-1/N-6/N-10 (Kundenentscheide)** | **N-1:** Chargen-Gruppierung je Lieferant (`batchGroupKey` = `b:<supplier>:<lot>`, Batch-Check prüft Lieferant) — Kundenentscheid: Lot-Nummern kommen von extern und können kollidieren (`9b6c9de`). **N-6:** WaWi-Eingaben lesen einen einzelnen Punkt mit 1–2 Nachkommastellen als Dezimaltrenner („5.1" = 5,1; „1.500" = 1500) — neuer Helper `reFormatWawiNumber()` + JS-Parser vereinheitlicht (`016e8bb`). **N-10:** Bewegungs-Modal zeigt aktuellen Bestand + Bestätigung bei Minus-Buchung (`6af6760`). | +2 Tests. Volle Suite: **233 grün, 832 Assertions** |
| _offen_ | AP-13 | Shop-Bestandsabzug | – |
| _offen_ | AP-13 | Shop-Bestandsabzug — **Umsetzungsansatz dokumentiert (§4, 15.07.2026):** Hook am Versand-Statuswechsel, kein Plugin-Update nötig; WooCommerce-Plugin als Referenz eingecheckt (`592b03a`) | – |
| _offen_ | AP-14/15/16/17 | Audit-Trail, Blockrechte, 2FA, WaWi-Einstellungen | – |
> **✅ BLOCK ABGESCHLOSSEN (06.07.2026).** Alle fachlichen Pakete der Anforderungsrunde vom 12.06.2026 sind umgesetzt (OPT-1 … OPT-4, AP-20/21/23/24/27/28); die Quelldateien `docs/nächsten Anforderungen an die WaWi.md` und `docs/Todos.md` sind vollständig eingearbeitet. Suite: 201 Tests grün, 731 Assertions.