EC-CUBE4で受注ステータスを追加する

EC-CUBE4では、受注のステータス遷移がより厳密になりました。

https://github.com/EC-CUBE/ec-cube/pull/3325

これにより、誤ったステータスへの変更防止や、在庫やポイントの引当・戻しが適切に取り扱えるようになりました。
ただ、従来のようにステータスを追加したい場合は、ステータスの追加に加え、ステータスの遷移も定義する必要があります。

今回は、「取寄中」というステータスを追加し、「新規登録」→「取寄中」→「注文取消し」という遷移ができるようにする例を紹介したいと思います。

## 受注ステータスを追加する

従来どおり、mtb_order_statusテーブルにデータを追加します。

```
INSERT INTO mtb_order_status (id, display_order_count, name, sort_no, discriminator_type) VALUES (10, 'f', '取寄中', 8, 'orderstatus')
```

## 受注ステータスの遷移を定義する

app/config/packages/order_state_machine.phpに、ステータスの遷移が定義されています。

`places`に、取寄中のIDを追加します。

```php
            'places' => [
                (string) Status::NEW,
                (string) Status::CANCEL,
                (string) Status::IN_PROGRESS,
                (string) Status::DELIVERED,
                (string) Status::PAID,
                (string) Status::PENDING,
                (string) Status::PROCESSING,
                (string) Status::RETURNED,
                '10'	// <- 追加
            ],
```

次に、`transitions`にステータス遷移の定義を行います。

```php
            'transitions' => [
            	// 「新規受付」から「取寄中」への遷移できるようにする
                'toriyose' => [
                    'from' => (string) Status::NEW,
                    'to' => '10'	 
                ],
                'pay' => [
                    'from' => (string) Status::NEW,
                    'to' => (string) Status::PAID,
                ],
                'packing' => [
                    'from' => [(string) Status::NEW, (string) Status::PAID],
                    'to' => (string) Status::IN_PROGRESS,
                ],
                'cancel' => [
                	// 「取寄中」から「注文取消し」へ遷移できるようにする
                    'from' => [(string) Status::NEW, (string) Status::IN_PROGRESS, (string) Status::PAID, '10'],	// <- 10を追加する
                    'to' => (string) Status::CANCEL,
                ],
```

変更後の差分は以下のようになります。

```diff
            'places' => [
                (string) Status::NEW,
                (string) Status::CANCEL,
                (string) Status::IN_PROGRESS,
                (string) Status::DELIVERED,
                (string) Status::PAID,
                (string) Status::PENDING,
                (string) Status::PROCESSING,
                (string) Status::RETURNED,
+                '10'
            ],
            'transitions' => [
+                'toriyose' => [
+                    'from' => (string) Status::NEW,
+                    'to' => '10'
+                ],
                'pay' => [
                    'from' => (string) Status::NEW,
                    'to' => (string) Status::PAID,
                ],
                'packing' => [
                    'from' => [(string) Status::NEW, (string) Status::PAID],
                    'to' => (string) Status::IN_PROGRESS,
                ],
                'cancel' => [
-                    'from' => [(string) Status::NEW, (string) Status::IN_PROGRESS, (string) Status::PAID],
+                    'from' => [(string) Status::NEW, (string) Status::IN_PROGRESS, (string) Status::PAID, '10'],
                    'to' => (string) Status::CANCEL,
                ],
                'back_to_in_progress' => [
                    'from' => (string) Status::CANCEL,
                    'to' => (string) Status::IN_PROGRESS,
                ],
```

以上で定義は完了です。

管理画面の受注登録から、受注を作成し、「新規受付」→「取寄中」→「注文取消し」へ遷移できるようになっていれば成功です。