Eigene Status definieren?

Ich bin gerade dabei eine externe API anzuschließen, bei der die Order zusätzliche Status durchlaufen kann. Diese gibt es natürlich von Haus aus in Shopware nicht. Wie würde man das am Besten umsetzen? Kann man eigene Status definieren? Im Handbuch hab ich nix dazu gefunden.

Es gibt diese Doku: Shopware 6 - Tutorials & FAQs - Neuen Bestell-und Zahlstatus erstellen

Die ID für Lieferstatus wird nicht genannt, aber alle drei befinden sich in der Tabelle state_machine.

Ich persönlich mach das allerdings per PHP Code im eigenen Plugin, so dass es bei Update oder Installation einmal durchgeführt wird. Über Entities/Repository ist mMn. auch das Anlegen von Übersetzungen einfacher.

1 „Gefällt mir“

Ach da haben sie das versteckt. Danke, da wär ich nicht drauf gekommen.

Ja, ich werde das auch im Plugin per PHP umsetzen. Sieht erst mal umständlich aus… naja… hilft nix.

Das hab ich dafür geschrieben. Ich mach aber noch nicht so lange Shopware, deswegen weiß ich nicht, ob das alles so richtig ist. Verwenden auf eigene Gefahr. :wink:

private function createMyOrderDeliveryState(Context $context) {

	$entry_exists = $this->searchIDforFieldEquals($context,'state_machine_state.repository', 'technicalName', 'my_prep_to_ship');
	if($entry_exists!=='') {
		return;
	}

	$entry_exists = $this->searchIDforFieldEquals($context,'state_machine_transition.repository', 'actionName', 'my_cancel');
	if($entry_exists!=='') {
		return;
	}

	$id_deutsch = $this->searchIDforFieldEquals($context,'language.repository', 'name', 'Deutsch');
	$id_english = $this->searchIDforFieldEquals($context,'language.repository', 'name', 'English');
	if($id_deutsch==='' || $id_english==='') {
		throw new RuntimeException (__FUNCTION__ . ': Error fetching language IDs.');
	}

	$orderDeliveryStateID = $this->searchIDforFieldEquals($context,'state_machine.repository', 'technicalName', OrderDeliveryStates::STATE_MACHINE);
	if($orderDeliveryStateID==='') {
		throw new RuntimeException (__FUNCTION__ . ': Error fetching order delivery state ID.');
	}

	$id_open      = $this->searchIDforFieldEquals($context, 'state_machine_state.repository', 'technicalName', OrderDeliveryStates::STATE_OPEN,              $orderDeliveryStateID);
	$id_ship_part = $this->searchIDforFieldEquals($context, 'state_machine_state.repository', 'technicalName', OrderDeliveryStates::STATE_PARTIALLY_SHIPPED, $orderDeliveryStateID);
	$id_ship_full = $this->searchIDforFieldEquals($context, 'state_machine_state.repository', 'technicalName', OrderDeliveryStates::STATE_SHIPPED,           $orderDeliveryStateID);
	$id_cancelled = $this->searchIDforFieldEquals($context, 'state_machine_state.repository', 'technicalName', OrderDeliveryStates::STATE_CANCELLED,         $orderDeliveryStateID);
	if($id_open==='' || $id_ship_part==='' || $id_ship_full==='' || $id_cancelled==='') {
		throw new RuntimeException (__FUNCTION__ . ': Error fetching ID for order delivery state "open" / "shipped_partially" / "shipped" / "cancelled".');
	}

	$id_prep_to_ship = Uuid::randomHex();

	$stateRepo = $this->container->get('state_machine_state.repository');
	$stateRepo->upsert([[
		'id' => $id_prep_to_ship,
		'technicalName' => 'my_prep_to_ship',
		'stateMachineId' => $orderDeliveryStateID,
		'translations' => [
			['languageId' => $id_deutsch,
				'stateMachineStateId' => $id_prep_to_ship,
				'name' => 'Versandvorbereitung'],
			['languageId' => $id_english,
				'stateMachineStateId' => $id_prep_to_ship,
				'name' => 'Preparing for shipment']
		]]], $context);

	$myOrderTransitions = array();
	$myOrderTransitions[] = [
		'id' => Uuid::randomHex(),
		'actionName' => 'my_ship_prep',
		'stateMachineId' => $orderDeliveryStateID,
		'fromStateId' => $id_open,
		'toStateId' => $id_prep_to_ship
	];
	$myOrderTransitions[] = [
		'id' => Uuid::randomHex(),
		'actionName' => 'my_ship_part',
		'stateMachineId' => $orderDeliveryStateID,
		'fromStateId' => $id_prep_to_ship,
		'toStateId' => $id_ship_part
	];
	$myOrderTransitions[] = [
		'id' => Uuid::randomHex(),
		'actionName' => 'my_ship_full',
		'stateMachineId' => $orderDeliveryStateID,
		'fromStateId' => $id_prep_to_ship,
		'toStateId' => $id_ship_full
	];
	$myOrderTransitions[] = [
		'id' => Uuid::randomHex(),
		'actionName' => 'my_cancel',
		'stateMachineId' => $orderDeliveryStateID,
		'fromStateId' => $id_prep_to_ship,
		'toStateId' => $id_cancelled
	];

	$transitionRepo = $this->container->get('state_machine_transition.repository');
	$transitionRepo->upsert($myOrderTransitions, $context);
}

private function searchIDforFieldEquals (
	Context $context,
	 string $repository_name,
	 string $field_name,
	 string $equals,
	 string $order_state_id = '')
: string {

	$criteria = new Criteria();
	$repo = $this->container->get($repository_name);
	if($order_state_id==='') {
		$criteria->addFilter(
			new EqualsFilter($field_name, $equals)
		);
	} else {
		$criteria->addFilter(
			new AndFilter ([
				new EqualsFilter($field_name, $equals),
				new EqualsFilter('stateMachineId', $order_state_id),
			])
		);
	}
	$result = $repo->search($criteria, $context)->getEntities()->first();
	if($result!==null) {
		return $result->get('id');
	} else {
		return '';
	}
}
1 „Gefällt mir“

Super, danke! In welche Klasse würde das reinkommen?

@gaxweb Ich hab’s in die „Core“ Klasse des Plugins geschrieben, also die mit „extends Plugin“, und dann jeweils die Funktion in install und update aufgerufen.

Plugin lifecycle methods - Shopware Developer

Also z.B. so:

public function install(InstallContext $installContext): void {

        parent::install($installContext);
        $this->createMyOrderDeliveryState($installContext->getContext());
}
1 „Gefällt mir“