Warenwirtschaft: AP-34 — Varianten-Artikelnummer korrekt zuordnen

Bestellungen mit Produktvarianten (z. B. Deocreme MINI) wurden im Versand nicht
automatisch zugeordnet und mussten manuell nachgepflegt werden. Zwei
zusammenwirkende Fehler:

1. Connector (partnercenter-api v1.6.0): compose_cart_content() las per
   get_product_id() das Elternprodukt und sendete dessen SKU — nie die eigene
   Artikel-Nr. der Variation. Jetzt liest get_product() (variations-aware) die
   Variations-SKU, Fallback auf Eltern-SKU nur wenn leer. Plugin muss neu in den
   Shop ausgerollt werden.

2. Importer (ShoppingUserController::prepareOrder): matchte nur den Teil vor dem
   ersten „-" gegen wp_number. In der Live-DB ist jede Variante eine eigene
   products-Zeile mit eigener wp_number (kein main_product_id, keine „-"-Suffixe).
   Jetzt Zuordnung primär über die VOLLE SKU gegen wp_number; der „-"-Split bleibt
   nur Legacy-Fallback für alte Variations-SKUs „basisnr-suffix".

Tests: neue AP-34-Prüfung (MINI 100026 landet beim MINI-Produkt, nicht beim
50-ml-Basisprodukt 100006) + Legacy-Fallback-Test. Suite 327 grün.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-08-28 09:32:51 +00:00
parent 190713c21b
commit 8c938eed0a
4 changed files with 65 additions and 14 deletions

View file

@ -722,14 +722,27 @@ class ShoppingUserController extends Controller
$error[] = 'article parameter is missing';
} else {
// Variations-SKUs aus dem Shop (z. B. „10042-1") sind dasselbe Produkt:
// für die Zuordnung zählt nur der Teil vor dem ersten „-". Das Original
// AP-34 (26.08.2026): Jede Produktvariante ist im Shop eine eigene
// Bestellposition mit eigener Artikel-Nr. — in der DB eine eigene
// products-Zeile mit eigener wp_number (kein main_product_id, keine
// „-"-Suffixe). Der Connector sendet ab v1.6 die Variations-SKU statt
// der Eltern-SKU. Zuordnung deshalb primär über die VOLLE SKU gegen
// wp_number; der frühere „-"-Split bleibt nur optionaler Fallback für
// evtl. alte Variations-SKUs im Format „basisnr-suffix". Das Original
// bleibt in $order->article, damit das API-Protokoll die echte SKU zeigt.
$baseArticle = trim(explode('-', trim((string) $order->article), 2)[0]);
$article = trim((string) $order->article);
$product = $baseArticle !== ''
? Product::whereWpNumber($baseArticle)->first()
$product = $article !== ''
? Product::whereWpNumber($article)->first()
: null;
// Legacy-Fallback: alte Variations-SKU „basisnr-suffix" → Basisnummer
if (! $product && str_contains($article, '-')) {
$baseArticle = trim(explode('-', $article, 2)[0]);
if ($baseArticle !== '') {
$product = Product::whereWpNumber($baseArticle)->first();
}
}
if (! $product) {
$error[] = 'article not found';
} else {