DAL und Statemachine - Statusänderungen über DAL - E-Mails und Verfügbarkeit werden nicht getriggert

Hallo zusammen,
Wir binden gerade ein ERP über eine Inbox-API an um die Stati der Bestellungen und den Lagerbestand der Artikel im Shop mit denen im ERP zu synchronisieren.

Die Änderung der Stati erfolgt im Plugin über die DAL und die Repos.
Z.B.:
$result = $this->orderPaymentRepo->update( [[ ‚id‘ => (string) $aCriteriaInner[‚order_transaction‘], ‚stateId‘ => (string) $aCriteriaInner[‚payment‘] ]], Shopware\Core\Framework\Context::createDefaultContext());

Das Ändern der Stati über das Plugin im Shopsystem ist erfolgreich - alle drei Stati lassen sich setzen (Order, Shipment, Payment) und werden danach im Shop korrekt dargestellt.

Aber:

  1. Es werden keine automatischen Status-Update-E-Mails verschickt (was ich anders erwartet hatte weil die DAL doch die Statemaschine triggert?)

  2. Es erfolgt kein Update der Verfügbarkeit. (hierbei scheint jedoch ein späteres manuelles Abschließen einer anderen Bestellung den Verfügbarkeitsupdate zu triggern)

Gibt es einen Trick das Verfügbarkeitsupdate zu triggern und die E-mails automatisch zu versenden?

Grüße

wenn man es über die DAL in die DB schreiben lässt umgehst du die StateMachine.

Hier habe ich eine State Transition mit eMail versandt umgesetzt:

github dot com/ufcyg/SynlabOrderInterface/blob/master/src/Core/Api/Utilities/OIOrderServiceUtils.php

joa shopware will wohl nicht dass man links postet… viel spaß beim kopieren

ich kümmere mich hier allerdings nicht um den bezahlstatus, da das in meinem aktuellen projekt nicht von belangen ist

1 Like

Danke für die Antwort und den Link - die Methode aus dem Quelltext sieht gut aus, werde die mal einbauen.

Danke nochmal, hat geklappt. Unten der Code zum Bezahlstatus (falls Du ihn mal brauchst).
In Deinem Code lädt getDeliveryEntityID alle Einträge - ich glaube das geht schneller:

$criteria = new Criteria();
	$criteria->addFilter(new EqualsFilter("orderId", $sID));
	$entities = $this->orderDeliveryRepo->search($criteria,\Shopware\Core\Framework\Context::createDefaultContext());
	$collection = $entities->getEntities();
	$aaIDs = $collection->getIds();

Payment:

public function updatePaymentStatus(OrderTransactionEntity $transaction, string $entityID, $transition) {   
	$stateName = $transaction->getStateMachineState()->getTechnicalName();
    switch ($stateName)
    {
        case "open":
            if(!(strcmp($transition,'pay') == 0 || strcmp($transition,'remind') == 0 || strcmp($transition,'pay_partially') == 0 || strcmp($transition,'cancel') == 0))
            {
				
                return false;
            }
        break;
		
		case "paid_partially":
            if(!(strcmp($transition,'refund_partially') == 0 || strcmp($transition,'refund') == 0 || strcmp($transition,'remind') == 0 || strcmp($transition,'pay') == 0))
            {
                return false;
            }
        break;
		
		case "reminded":
            if(!(strcmp($transition,'pay') == 0 || strcmp($transition,'pay_partially') == 0))
            {
                return false;
            }
        break;
		
		case "paid":
            if(!(strcmp($transition,'refund_partially') == 0 || strcmp($transition,'refund') == 0 ))
            {
                return false;
            }
        break;
		
		case "refunded_partially":
            if(!(strcmp($transition,'refund') == 0))
            {
                return false;
            }
        break;
    }
    $this->orderService->orderTransactionStateTransition($entityID, $transition, new ParameterBag([]),Context::createDefaultContext());
    return true;
}
1 Like