この Issue は、管理者向け注文編集画面に表示されているお届け先選択欄が、POST 処理で保存されない不具合を直すもの。
議論の過程で、引当済み・箱詰め済み注文のお届け先変更には、キャンセル処理や数量・商品変更制御まで関係する大きな設計課題があることが分かった。ただし、それらは Issue #11 / Issue #12 に切り出し、Issue #4 は軽微な保存バグ修正に絞る。
関連:
管理者向け注文編集画面には <select name="destination"> があるが、mg_orders/views.py の order_edit は POST 時に destination を読んでいない。
そのため、管理者がお届け先を変更して「この内容で注文を更新する」を押しても、Order.destination は変わらない。送料再計算も既存のお届け先を基準に行われる。
対象:
/management/orders/edit/<order_id>/dashboard:mg_orders:order_editmg_orders/views.py の order_edittemplates/mg_orders/order_edit.htmlorder_edit の POST 処理で request.POST.get('destination') を取得する。
処理:
destination を整数 ID として扱う。destination が未送信、空、整数でない場合はエラーにする。destination が現在の order.destination_id と同じなら、お届け先変更要求ではないと判定する。destination が現在の order.destination_id と異なる場合だけ、お届け先変更要求として扱う。お届け先変更要求がある場合は、変更先を以下の条件で検証する。
user=order.useris_deleted=False他ユーザーのお届け先、存在しないお届け先、削除済みお届け先への変更は拒否する。
ただし、POST された ID が現在の order.destination_id と同じ場合は no-op とし、現お届け先が is_deleted=True でも通常編集を許可する。
お届け先変更要求がある場合は、以下で引当有無を確認する。
Allocation.objects.filter(order_item__order=order).exists()
order.destination を変更する。同じ POST 内で数量・単価などが変更されていても、お届け先変更が拒否された場合はまとめて保存しない。管理者が「宛先も変わった」と誤認したまま一部だけ保存されるのを避けるため。
お届け先変更が保存される場合は、変更後のお届け先を使って参考送料を再計算する。
temp_cart_group['destination'] には変更後のお届け先を渡す。temp_cart_group['items'] は更新予定の明細から作る。order.provisional_shipping_fee を更新する。order.final_shipping_fee = None に戻す。お届け先変更のみで商品数量が変わらない場合でも、配送方法や送料区分が変わる可能性があるため再計算する。
注文後に顧客管理側でお届け先がソフト削除されると、通常の Destination.objects.filter(user=order.user, is_deleted=False) だけでは現お届け先が選択肢に出ない。
この状態でブラウザが先頭 option を自動選択すると、管理者が数量だけ編集したつもりでも、お届け先変更要求として誤判定される。
対策:
order.destination を必ず含める。is_deleted=True の場合も、現在値として表示する。destination == order.destination_id なら no-op と判定する。is_deleted=False に限定する。これにより、削除済みの現お届け先を保持した注文でも、数量・単価などの通常編集を壊さない。
注文編集画面では、現在の注文がお届け先変更できる状態か分かるようにする。
文言例:
この注文はすでに出荷準備作業が始まっているため、この画面ではお届け先を変更できません。お届け先を変更する場合は、既存注文をキャンセルし、新しいお届け先で注文を作り直してください。
final_shipping_fee が None になる。is_deleted=True の別お届け先 ID を POST しても保存されない。order.destination が is_deleted=True の注文でも、宛先を変えない POST なら通常編集がブロックされない。order.destination が is_deleted=True の注文で、有効なお届け先へ変更する場合は未引当なら保存できる。Order.destination が変わらない。Issue #4 は「お届け先選択欄が保存されない」バグへの最小修正にする。
後工程に入った注文の変更全般は、注文編集画面だけで完結させるには影響範囲が大きい。キャンセル処理と注文作り直し導線は Issue #11、数量・商品変更の制御は Issue #12 で整理する。