Hallo zusammen,
ich bin heute über ein tolles Fehlerbild gestolpert was mich etwas länger beschäftigt hat. Daher halte ich es hier mal fest, falls jemand auf ähnliche Probleme stößt.
Die Ausgangssituation war folgende. Es wurden Kundendaten und Bestellungen aus einem Magento 1.9 über den Migrationsassistenen in Shopware 6 importiert. Kundendaten und Bestellungen waren im Backend verknüpft und alles sah ganz normal aus. Auch die Anzahl der Bestellungen in der „Kunden->Übersicht->Allgemein->Anzahl Bestellungen“ zeigte gezählte Bestellungen an.
Für Zahlungsarten wurde nun eine Rule festgelegt welche Kunden die schon Bestellungen ausgelöst haben (> x Anzahl Bestellungen) die Rechnungsoption „Zahlung auf Rechnung“ zur Verfügung stellt.
Das Fehlerbild war nun das bei Migrierten Kunden die Rule nicht griff, bei neu angelegten Kunden es aber ohne Probleme funktionierte.
Ich bin davon ausgegangen das Shopware beim Ermitteln der Bestellungen ein Count auf die in der Datenbank hinterlegten Bestellungen macht und der Rule Builder weiß ab wann er die Zahlungsoption Rechnung anzeigen darf. Die Vermutung wurde gestärkt da die Anzeige unter „Kunden->Übersicht->Allgemein->Anzahl Bestellungen“ genau so funktioniert. Lösche/Erstelle ich Bestellungen im Backend oder über die Datenbank, verändert sich dort die Anzahl.
[Schnelleinstieg ohne Blabla]
Nach längerer Suche habe ich festgestellt das es in der „customer table“ ein Feld order_count gibt (Siehe Screenshot, schön weit hinten versteckt ), dieser Count wird nur beim Auslösen einer Bestellung hochgezählt und nicht bei der Migration. Und genau hier greift sich der Rule Builder seine Info ab um die „Anzahl Bestellungen“ zu definieren. Ist nicht gerade konsistent umgesetzt da in der Benutzer Übersichtsseite vorhandene Bestellungen gezählt werden und beim Rule Builder auf den Count aus Customer Tabelle zugegriffen wird.
[Bonus]
Wird einmal eine Bestellung bei migrierten Daten ausgelöst, zählt er alle vorhandenen hoch.
[Workaround]
Ich habe hierzu ein Query gebaut der über alle Customer drüber geht, sich den Bestell-Count aus der order_customer Tabelle nimmt und die Customer-Tabelle updated. Bitte ein Backup erstellen bevor ihr den Schnipsel auf die Datenbank los lasst
UPDATE
`customer` as c
SET
c.order_count =
(
SELECT COUNT(*)
FROM `order_customer`
WHERE `customer_id` = c.id
)