From 0c8d321f66267dba3eb5fcefe516c3ee53ef60c8 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 28 Aug 2026 11:01:25 +0000 Subject: [PATCH] =?UTF-8?q?Warenwirtschaft:=20AP-38=20=E2=80=94=20ERP-/Con?= =?UTF-8?q?nector-Status-Mapping=20vervollst=C3=A4ndigt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die orange Ampel bei abgeschlossenen Bestellungen ist KEIN ERP-Fehler: der Endpoint /api/wp/status liefert für versendete Bestellungen bereits sent/close (Live-DB: 111× shipped=2, 1× shipped=3). Ursache liegt shopseitig (Cron/Auth) — wird per SSH geprüft. Unabhängig davon die latenten Mapping-Lücken geschlossen: ERP (ShoppingOrder::$apiShippedTypes): - Status 5 (Wartestellung) fehlte und lieferte den Default 'free' (im Shop gar kein Licht). Jetzt 5 => 'process' (Shop-Ampel orange = in Bearbeitung). Connector (partnercenter-api, Teil von v1.6.0 — noch nicht ausgerollt): - admin/post-list.php: Ampel-Switch deckt jetzt 'pick_up' (Abholung ⇒ grün) und 'cancel' (storniert ⇒ neue rote Kugel) ab; vorher fielen beide auf ⚠️. - woocommerce/order-status.php: 'pick_up' und 'cancel' gelten jetzt als Endzustände und fallen aus der stündlichen Nachfrage-Liste (_partnercenter_api_unclear_order_ids) — vorher wurden 12 stornierte Bestellungen dauerhaft weiter gepollt. Test: AP-38-Mapping prüft alle shipped-Werte (kein stiller 'free'-Fallback mehr). Suite 338 grün. Co-Authored-By: Claude Opus 4.8 --- app/Models/ShoppingOrder.php | 3 +++ dev/partnercenter-api/admin/post-list.php | 13 +++++++++- .../public/woocommerce/order-status.php | 4 +++- tests/Feature/SalesShippedStatusTest.php | 24 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/Models/ShoppingOrder.php b/app/Models/ShoppingOrder.php index 8364054..3d1fcbc 100644 --- a/app/Models/ShoppingOrder.php +++ b/app/Models/ShoppingOrder.php @@ -256,6 +256,9 @@ class ShoppingOrder extends Model 2 => 'sent', // (Fullfilment: Versand erfolgt)' 3 => 'close', // (Fullfilment: Versand erfolgt)', 4 => 'pick_up', // (Fullfilment: Versand erfolgt)', + // AP-38: Wartestellung fehlte hier und lieferte den Default 'free' (im Shop + // gar kein Licht). „In Bearbeitung"-Semantik ⇒ 'process' (Shop-Ampel orange). + 5 => 'process', // Wartestellung (noch nicht versendet) 10 => 'cancel', ]; diff --git a/dev/partnercenter-api/admin/post-list.php b/dev/partnercenter-api/admin/post-list.php index 87c0971..efc2075 100644 --- a/dev/partnercenter-api/admin/post-list.php +++ b/dev/partnercenter-api/admin/post-list.php @@ -81,7 +81,9 @@ class PARTNERCENTER_API_Order_Post_List_Class case 'free': break; case 'sent': - case 'close': ?> + case 'close': + case 'pick_up': // AP-38: Abholung = erfüllt ⇒ grün + ?>
+
+ @@ -127,6 +134,10 @@ class PARTNERCENTER_API_Order_Post_List_Class background: limegreen; } + .partnercenter-status-circle.red { + background: crimson; + } + 2, ])->assertNotFound(); }); + +test('AP-38: API-Status-Mapping deckt alle shipped-Werte ab (Wartestellung nicht mehr free)', function () { + // Der Shop pollt getAPIShippedType(); versendete Bestellungen müssen grün-fähig + // sein (sent/close), Wartestellung darf NICHT 'free' (im Shop kein Licht) liefern. + $expected = [ + 0 => 'open', // orange + 1 => 'process', // orange + 2 => 'sent', // grün + 3 => 'close', // grün + 4 => 'pick_up', // grün (Abholung) + 5 => 'process', // AP-38: Wartestellung ⇒ orange statt 'free' + 10 => 'cancel', // rot + ]; + + foreach ($expected as $shipped => $apiStatus) { + $order = salesMakeOrder(['shipped' => $shipped]); + expect($order->getAPIShippedType())->toBe($apiStatus); + } + + // Jeder gepflegte Versandstatus hat auch ein API-Mapping (kein stiller 'free'-Fallback). + foreach (array_keys(ShoppingOrder::$shippedTypes) as $shipped) { + expect(ShoppingOrder::$apiShippedTypes)->toHaveKey($shipped); + } +});