Issue #4 の検討で、引当済み・箱詰め済み注文のお届け先変更は、既存注文を書き換えるより「キャンセルして新しい宛先で注文を作り直す」運用に寄せる方が安全だと整理した。
その前提として、管理者がどの状態の注文でもキャンセル対応を開始でき、現在状態と後続作業を理解できる UI が必要になる。この Issue は、そのキャンセル機能と注文作り直し導線を扱う。
関連:
急なキャンセルや宛先変更に伴う「キャンセルして作り直し」を、管理者が迷わず行える導線が十分に整理されていない。
後工程に進んだ注文には、以下のデータが関係する。
AllocationPackageItemPackageこれらを意識せずにキャンセルすると、袋・箱・送料・入金の扱いが曖昧になる。
管理者が、注文の進行状態を見ながら安全にキャンセル対応できるようにする。
特に、宛先変更や注文内容変更が必要だが既に後工程に入っている注文について、以下の導線を分かりやすくする。
管理者に Allocation / PackageItem / Package.destination などの内部構造を直接理解させるのではなく、画面上では「どこまで作業が進んでいるか」「キャンセルすると何を確認すべきか」「作り直す場合に次に何をするか」が分かる状態を目指す。
注文ごとに、キャンセル確認画面で表示する状態を整理する。
| 状態 | 管理者に示す内容 |
|---|---|
| 未引当 | 袋はまだ引き当てられていない。キャンセルすると注文分の在庫予約を解除する。 |
| 引当済み・未梱包 | 袋が注文に引き当て済み。キャンセル時に引当解除が必要。 |
| 箱詰め中 | 注文分の袋が箱に入っている。箱から出す、またはシステム側で解除する必要がある。 |
| 発送準備完了 | 箱や送料確定の扱いを確認する必要がある。 |
| 伝票印刷済み / tracking_number あり | 伝票取消や再発行、配送業務上の確認が必要。 |
| 発送済み / 手渡し済み | 通常キャンセルではなく、返品・返金など別運用にする可能性がある。 |
システムが自動で戻す範囲と、管理者に手作業確認させる範囲を分ける。
検討項目:
Order.status を CANCELED にする条件。Stock.total_ordered_kg など在庫予約の戻し方。Allocation を自動削除するか。PackageItem を自動削除するか。Package を自動削除するか。final_shipping_fee / provisional_shipping_fee をどう扱うか。箱詰め済み注文をキャンセルする場合は、対象注文に由来する袋だけを箱から外す。
管理者向けには、キャンセル確認画面で以下の趣旨を明示する。
この注文の商品は、他の注文と同じ箱に入っています。
キャンセルすると、この注文分の商品だけ箱から外します。
残った箱は送料・発送準備の再確認が必要です。
削除順序は、箱との対応関係を失わないようにする。
PackageItem と Package を先に特定し、キャンセル確認画面へ表示するためのスナップショットを作る。PackageItem を箱から外す。Allocation を解除する。Order.status を CANCELED にする。Package だけ削除または無効化する。Package は、送料・発送準備の再確認対象として表示する。同梱箱の扱い:
READY_TO_SHIP / LABEL_PRINTED 以降であれば、送料確定・伝票・発送準備の再確認が必要であることを表示する。Package を削除または無効化する。OrderItem や Allocation だけを削除すると、PackageItem がどの注文由来だったか辿れなくなるため、対象 PackageItem / Package の特定とスナップショットを必ず先に行う。Order.payment_status = PAID の注文をキャンセルする場合、返金・再請求・入金履歴の扱いが必要になる。
検討項目:
payment_status をどう扱うか。管理者がキャンセル実行前に、現在状態と影響を確認できる画面またはモーダルを用意する。
表示したい内容:
箱詰め済みの場合は、「どの箱から外すのか」を管理者が確認できるように、対象注文の商品が入っている箱一覧を表示する。
箱一覧に表示する項目:
Package #123)Package.label がある場合)この表示は、内部的には Order -> OrderItem -> Allocation -> Bag -> PackageItem -> Package を辿って作る。
画面上では Allocation や PackageItem という内部名ではなく、「この注文分の商品が入っている箱」として表示する。
宛先変更や注文内容変更が必要な後工程注文では、既存注文を直接書き換えるのではなく、キャンセルして新しい注文を作る導線を用意する。
想定導線:
実装に入る前に、キャンセル対象の注文がどの状態にあるかを軸にユースケースを洗い出し、各ケースの操作・表示・導線を表で固定する。これにより「DB的には正しいが、管理者が次に何をすべきか分からない」状態を避ける。
4つの表(ユースケース一覧 / ユースケース別UIフロー / 管理者確認項目マトリクス / 必要UI追加一覧)を用意する。
この UI 設計は管理者向けキャンセルを対象とする。顧客自身による注文キャンセルは、既存の顧客向け order_cancel と別論点として扱い、この表では対象外とする。
レビューコメント #2588 の補強点を、以下の方針として全表に反映する。
自動実行 / 要確認のうえ実行 / 不可 のいずれかを必ず割り当てる。表を埋める作業自体が、伝票印刷済み・発送準備完了後・入金済みをどこまで許すかという業務判断を強制する。Order.status(注文由来)と Package.status(箱由来)は独立した別軸であり、UIフロー表の表示項目には各値が 注文由来 / 箱由来 / 引当・在庫由来 のどれかを必ず添える。PackageItem が 0 なら Package 削除)を扱える必要がある。| # | 注文状態(軸) | 代表ケース | 許可レベル | 主な注意点 |
|---|---|---|---|---|
| 1 | 未引当 | 新規注文をキャンセル | 自動実行 | 在庫予約(total_ordered_kg)を注文重量分だけ戻す。引当・箱は無い。 |
| 2 | 引当済み・未梱包 | 袋が引き当たった注文をキャンセル | 自動実行 | Allocation を解除し袋を在庫に戻す。在庫予約も戻す。箱詰め前なので削除順序問題なし。 |
| 3 | 箱詰め済み・対象注文のみ(単独箱) | 1箱に対象注文だけが入っている | 要確認のうえ実行 | 箱から袋を外す→引当解除→在庫戻し。箱が空になるので Package 削除。送料・発送準備の再確認。 |
| 4 | 箱詰め済み・他注文と同梱(1箱に複数注文) | 同じ箱に他注文の商品も入っている | 要確認のうえ実行 | 対象注文分の袋だけ外す。他注文の商品は残すため Package は削除しない。残箱は送料・発送準備の再確認対象。 |
| 5 | 箱詰め済み・1注文が複数箱に分散 | 対象注文の商品が複数の箱に入っている | 要確認のうえ実行 | 全該当箱から対象袋を外す。箱ごとに「空になるか/他注文が残るか」を個別判定。複数箱すべてを箱一覧に表示。 |
| 6 | 発送準備完了 | Package.status = READY_TO_SHIP の箱を含む |
要確認のうえ実行 | 確定送料(final_shipping_fee)の扱いを確認。箱を準備中に戻すか、システム側で解除するか。 |
| 7 | 伝票印刷済み / tracking_number あり | LABEL_PRINTED または伝票番号あり |
要確認のうえ実行(運用次第で不可) | 伝票取消・再発行など配送業務の確認が必須。システムだけで完結しない。 |
| 8 | 発送済み / 手渡し済み | SHIPPED / DELIVERED |
不可 | 通常キャンセルではなく返品・返金など別運用に誘導する。 |
| 9 | 入金済み(横断軸) | payment_status = PAID の注文をキャンセル |
要確認のうえ実行 | 上記1〜7に重畳する軸。返金・再請求・入金履歴の扱いを確認。payment_status の拡張要否を判断。 |
| 10 | キャンセルして作り直す(宛先変更) | 後工程注文の宛先を変えたい | 要確認のうえ実行 | 元注文をキャンセル後、購入者・明細・単価を引き継いで新宛先で新規作成。元注文と新注文を関連付ける。 |
| 11 | キャンセルして作り直す(内容変更) | 後工程注文の数量・商品を変えたい | 要確認のうえ実行 | 10と同様の引き継ぎ。Issue #12 の後工程変更制御と矛盾しない範囲で行う。 |
表示値の出所凡例: (注) = 注文由来(Order.status / payment_status / destination)、(箱) = 箱由来(Package.status / lock_status / tracking_number)、(引) = 引当・在庫由来(Allocation / PackageItem の有無、total_ordered_kg)。
| # | 入口 | 表示する状態(出所付き) | 許可レベル | 自動処理 | 管理者の確認作業 | 次の導線 |
| --- | --- | --- | --- | --- | --- |
| 1 | 注文詳細 / 注文編集 | 注文番号・購入者・宛先(注)、注文状態(注)、未引当(引) | 自動実行 | 在庫予約戻し(引)、status=CANCELED(注) | なし | 注文一覧へ戻る |
| 2 | 注文詳細 / 注文編集 | 注文状態(注)、引当済み(引)、入金状態(注) | 自動実行 | 引当解除(引)・袋を在庫へ、在庫予約戻し(引)、status=CANCELED(注) | なし | 注文一覧へ戻る |
| 3 | 注文詳細 / 注文編集 | 注文状態(注)、箱ID・箱状態・ロック・伝票(箱)、この注文の袋数/箱全体の袋数(引) | 要確認のうえ実行 | 箱から袋除去(引)→引当解除(引)→在庫戻し(引)、空箱Package削除、status=CANCELED(注) | 送料・発送準備の再確認 | 注文一覧 / 該当箱なし |
| 4 | 注文詳細 / 梱包画面 | 箱ID・箱状態(箱)、同梱あり(引)、対象注文分/箱全体の袋数(引) | 要確認のうえ実行 | 対象注文分の袋だけ除去(引)・引当解除・在庫戻し、Packageは残す、status=CANCELED(注) | 残箱の送料・発送準備の再確認 | 残箱の送料再確認導線へ |
| 5 | 注文詳細 / 梱包画面 | 複数箱の一覧(各箱の箱状態(箱)・対象袋数(引)・キャンセル後に空か(引)) | 要確認のうえ実行 | 全該当箱から対象袋除去・引当解除・在庫戻し、空になった箱のみ削除、status=CANCELED(注) | 空にならない各箱の送料・発送準備の再確認 | 各残箱の再確認導線へ |
| 6 | 注文詳細 / 発送準備画面 | 箱状態=発送準備完了(箱)、確定送料(注) | 要確認のうえ実行 | 3〜5に準じる処理 + 確定送料の扱い(final_shipping_fee クリア検討) | 送料再確定・発送準備のやり直し | 発送準備画面へ |
| 7 | 注文詳細 / 発送画面 | 箱状態=伝票印刷済み(箱)、伝票番号(箱)、CSV出力済み(箱) | 要確認のうえ実行 / 運用次第で不可 | (許可時のみ)箱の処理に加え伝票状態の整理 | 伝票取消・再発行など配送業務の確認 | 発送画面 / 配送業務へ |
| 8 | 注文詳細 | 注文状態=発送済み/手渡し済み(注) | 不可 | なし(キャンセル不可) | 返品・返金など別運用の案内 | 返品・返金運用(別途) |
| 9 | 各入口に重畳 | 入金状態=入金済み(注) を上記に追加表示 | 要確認のうえ実行 | (方針確定後)payment_status の更新 | 返金・再請求・入金履歴の確認 | 入金管理へ |
| 10 | 注文編集 / 注文詳細 | 元注文の状態一式(注)(箱)(引)、宛先変更が必要な旨 | 要確認のうえ実行 | 元注文キャンセル処理(状態に応じ1〜7) | キャンセル内容の確認 | 新規注文作成(購入者・明細・単価・元注文を引き継ぎ)→新宛先選択 |
| 11 | 注文編集 / 注文詳細 | 元注文の状態一式(注)(箱)(引)、内容変更が必要な旨 | 要確認のうえ実行 | 元注文キャンセル処理(状態に応じ1〜7) | キャンセル内容の確認 | 新規注文作成(引き継ぎ)→内容修正 |
各ユースケースで、管理者が確認すべき対象を横断的に固定する。これにより、たとえば「箱は見えているが袋が見えていない」「伝票印刷済みなのに伝票確認が抜けている」といった UI 漏れを防ぐ。
凡例:
表示: 状態として画面に出す。要確認: 管理者が内容を確認してから実行する。自動: キャンセル実行時にシステムが処理する。案内: システム外、または別画面での作業として導線や注意を出す。不可: 通常キャンセルとしては実行させない。状態に応じる: 入金済み・作り直しなどの横断/複合ケースで、下敷きになる状態行(1〜7)の値を継承する。-: 該当なし。| # | 注文 | 商品明細 | 在庫予約 | 引当 | 袋 | 箱 | 同梱注文 | 送料 | 伝票 | 入金/返金 | 次の導線 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 未引当 | 表示 | 表示 | 自動 | - | - | - | - | 表示 | - | 表示 | 注文一覧 |
| 2 引当済み・未梱包 | 表示 | 表示 | 自動 | 自動 | 表示 | - | - | 表示 | - | 表示 | 注文一覧 |
| 3 箱詰め済み・単独箱 | 表示 | 表示 | 自動 | 自動 | 要確認 | 要確認 | - | 要確認 | 表示 | 表示 | 注文一覧 / 送料再確認 |
| 4 箱詰め済み・同梱箱 | 表示 | 表示 | 自動 | 自動 | 要確認 | 要確認 | 要確認 | 要確認 | 表示 | 表示 | 残箱の送料・発送準備再確認 |
| 5 箱詰め済み・複数箱分散 | 表示 | 表示 | 自動 | 自動 | 要確認 | 要確認 | 要確認 | 要確認 | 表示 | 表示 | 各残箱の送料・発送準備再確認 |
| 6 発送準備完了 | 表示 | 表示 | 自動 | 自動 | 要確認 | 要確認 | 要確認 | 要確認 | 表示 | 表示 | 発送準備画面 / 送料再確定 |
| 7 伝票印刷済み | 表示 | 表示 | 自動 | 自動 | 要確認 | 要確認 | 要確認 | 要確認 | 案内 | 表示 | 発送画面 / 伝票取消案内 |
| 8 発送済み / 手渡し済み | 不可 | 表示 | - | - | - | 表示 | 表示 | 表示 | 表示 | 要確認 | 案内: 返品・返金など別運用 |
| 9 入金済み | 表示 | 表示 | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 案内 | 入金管理 / 返金確認 |
| 10 作り直し(宛先変更) | 要確認 | 要確認 | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 要確認 | 状態に応じる | 要確認 | 新規注文作成(新宛先選択) |
| 11 作り直し(内容変更) | 要確認 | 要確認 | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 状態に応じる | 要確認 | 状態に応じる | 要確認 | 新規注文作成(内容修正) |
マトリクス上の重要な UI 要件:
| 追加要素 | 目的 | 必要データ | 関連 view・template |
|---|---|---|---|
| 管理者注文へのキャンセル導線 | 注文詳細・注文編集からキャンセルを開始する | 注文状態(注)、引当・箱状態(引)(箱) | mg_orders/views.py(order_edit 周辺)、注文詳細テンプレート |
| キャンセル確認画面 / モーダル | 実行前に現在状態と影響・許可レベルを提示する | 注文・入金・引当・箱・伝票の各状態と「自動処理/確認作業」 | 新規 view + URL(mg_orders/urls.py)、確認テンプレート |
| 状態判定サービス / ヘルパー | 注文1件のキャンセル状態と許可レベルを一元判定する | Allocation / PackageItem の有無、Package.status / lock_status / tracking_number、payment_status |
mg_orders 配下の service 関数(order_edit の allocation_exists 判定を統合・再利用) |
| キャンセル対象の箱一覧コンポーネント | どの箱から外すか、複数箱・同梱・空になるかを可視化 | Order→OrderItem→Allocation→Bag→PackageItem→Package を辿った箱ごとの集計 |
箱一覧の部分テンプレート、上記サービス |
| 確認項目マトリクスに対応した表示ブロック | 注文・明細・在庫・引当・袋・箱・同梱・送料・伝票・入金の確認漏れを防ぐ | 表3の各列に対応する状態・件数・警告・導線 | キャンセル確認テンプレート、状態判定サービス |
| キャンセル実行 view / URL | 状態に応じた自動処理を atomic に行う | 削除順序(箱から袋除去→引当解除→在庫戻し→空箱削除→status=CANCELED) |
新規 view + URL、@transaction.atomic |
| 「キャンセルして作り直す」導線 | キャンセル後に新規注文作成へ引き継ぐ | 購入者・商品明細・注文時単価・元注文参照 | 新規注文作成 view、引き継ぎパラメータ受け渡し |
| 元注文⇔新注文の関連保持 | 作り直しの追跡(後から関係が分かる) | Order.recreated_from(self-FK, null可)等の新規フィールド |
orders/models.py + マイグレーション |
| 送料再確認が必要な箱へのリンク | 同梱・複数箱で残った箱の再確定を促す | 残箱の Package と final_shipping_fee 状態 |
発送準備・送料確定画面へのリンク |
| 伝票取消・返金確認の案内表示 | システムで完結しない手作業を明示する | 箱の伝票状態(箱)、payment_status(注) |
確認画面の注意表示 |
Allocation / PackageItem / Package をどこまで自動で戻すか、業務判断が必要。