Hallo,
mit Auftragsverarbeitung bin ich regelmäßig herausgefordert :-/
Diesmal:
Ich will (immer noch) Aufträge nach gewissen Kriterien filtern, und wenn die zutreffen, den Positionen ein anderes Lager zuordnen. Konkret: ich hab eine handvoll Bundles per ID in einer Variable gespeichert, und will am Ende nur Aufträge haben die eines oder mehrere dieser Bundles, aber keine anderen Artikel enthalten, per Brief versandt werden, ein Gesamtgewicht nicht überschreiten, und in Lager 23 ausreichend Bestand aufweisen. Alles außer dem letzten Punkt klappt zuverlässig.
Aus PlentySearchOrders bekomme ich ja diverse Zeilen: die Kopfzeile, eine Zeile für die Versandkosten, eine für das erste Bundle, gefolgt von seinen Bestandteilen, danach optional ein anderes (oder das selbe!) Bundle, wieder mit Bestandteilen, beliebig oft.
Ich gruppiere nach einem String den ich aus OrderID und VariantenID zusammengesetzt habe: wenn ein Artikel mehrfach in der Bestellung war, wird er so zusammengefasst. Aber nur innerhalb der selben Bestellung.
Ich habe einen (aktuellen) Datastore mit den Beständen (im Ziellager) für die Bundles, darauf Querverweis per VariantID. Im Nachgang leere ich per #if alle Stock-Zeilen, wenn die Artikelbeschreibung nicht auf "?contains('[Bundle]')" zutrifft. So entferne ich die gescheiterten Querverweise für Zeilen die keine Bundles waren.
Jetzt simple Prüfung: Wenn Bestand im neuen Lager >= bestellte Anzahl für Artikel (in dieser Bestellung) Zelle = 1 , wenn nicht 0. Wenn Zeile ohne Bestand (d.h. kein Bundle), Zelle leer.
Danach gruppieren nach OrderID, dabei die Ergebnisse dieser letzten Prüfung alle verketten, und mit contains() prüfen dass keine 0 und mindestens eine 1 drin sind, dann kann der Auftrag verschoben werden. Ergebnis wieder als 0 oder 1 in eine Spalte, darauf später filtern.
So, Problem jetzt: ich prüfe immer auf den selben, "gecachten" Bestand (aus dem Querverweis). Wenn ich zB 5 Bestand habe, und der erste Auftrag 3 reserviert, sollten bei der Prüfung in der darauffolgenden Zeile/Auftrag nur noch 2 verfügbar sein.
Die hat aber das selbe Ergebnis aus dem Querverweis bekommen wie die erste (und jede weitere): 5. Und würde die Prüfung jetzt wieder bestehen, auch wenn er das Bundle auch 3 mal enthält. Dann sind 6 reserviert, aber nur 5 im Lager.
Komplizierte Herleitung, simple Frage: wie komme ich in der Auftragsverarbeitung immer an aktuelle Stocks zu Artikeln?
Ich hatte (zum ersten mal) mit setVariable und getVariable rumexperimentiert, bin aber zu keinem Ergebnis gekommen. In etwa so:
<#if (getVariable(VariantID) == ""> <#if (bestand?number >= anzahl?number)>1<#else>0</#if> setVariable(VariantID, bestand?number - anzahl?number) <#else> <#if (getVariable(VariantID)?number >= anzahl?number)>1<#else>0</#if> setVariable(VariantID, getVariable(VariantID)?number - anzahl?number) </#if>
Gibt es weitere Ansätze?
Grüße Daniel