# Eigene Status definieren?

**URL:** <https://forum.shopware.com/t/eigene-status-definieren/95706>\
**Category:** Programmierung\
**Tags:** programming\
**Created:** [8. August 2022 um 12:34 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706 "2022-08-08T12:34:18Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gaxweb](https://avatars.discourse-cdn.com/v4/letter/g/ea5d25/32.png) [@gaxweb](https://forum.shopware.com/u/gaxweb)\
**Post date:** [8. August 2022 um 12:34 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/1 "2022-08-08T12:34:18Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [9. August 2022 um 07:21 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/2 "2022-08-09T07:21:08Z")

</div>

Es gibt diese Doku: [Shopware 6 - Tutorials & FAQs - Neuen Bestell-und Zahlstatus erstellen](https://docs.shopware.com/de/shopware-6-de/tutorials-und-faq/neuen-bestell-und-zahlstatus-erstellen#:~:text=Status%20anlegen&text=%C3%96ffne%20dazu%20%C3%BCber%20das%20Plugin,Datensatz%20in%20die%20Tabelle%20ein.)

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.

---

<div class="post-metadata">

**Author:** ![gaxweb](https://avatars.discourse-cdn.com/v4/letter/g/ea5d25/32.png) [@gaxweb](https://forum.shopware.com/u/gaxweb)\
**Post date:** [9. August 2022 um 07:27 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/3 "2022-08-09T07:27:29Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [9. August 2022 um 07:54 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/4 "2022-08-09T07:54:24Z")

</div>

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. 😉

```auto
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 '';
	}
}

```

---

<div class="post-metadata">

**Author:** ![gaxweb](https://avatars.discourse-cdn.com/v4/letter/g/ea5d25/32.png) [@gaxweb](https://forum.shopware.com/u/gaxweb)\
**Post date:** [9. August 2022 um 08:09 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/5 "2022-08-09T08:09:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [9. August 2022 um 08:20 UTC](https://forum.shopware.com/t/eigene-status-definieren/95706/6 "2022-08-09T08:20:03Z")

</div>

@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](https://developer.shopware.com/docs/guides/plugins/plugins/plugin-fundamentals/plugin-lifecycle)

Also z.B. so:

```auto
public function install(InstallContext $installContext): void {

        parent::install($installContext);
        $this->createMyOrderDeliveryState($installContext->getContext());
}

```
