田植え計画のEntry移動対応を実装する #7
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概要
作付け計画の品種変更時に、対象圃場の田植え計画Entryを新品種側の新規田植え計画へ移動する。
決定仕様
actual_bagsに相当する実績概念がないRiceTransplantEntryは全件移動する{year}年度 {品種名} 田植え計画(品種変更移動)実装内容
RiceTransplantPlan.variety=旧品種 and year=対象年 and field=対象圃場の Entry を抽出するplanFK を新品種側新規 plan へ付け替える受け入れ条件
関連
#7 レビュー結果
総合: 問題なし、承認
実装の評価
services_rice_transplant.pyの設計仕様書との照合:
仕様 | 実装 | 判定 -- | -- | -- 現時点では全件移動(実績概念なし) | actual_bags フィルタなし、field_id 一致で全件 | ✅ 移動先は常に新規作成 | RiceTransplantPlan.objects.create(...) | ✅ 計画名 {year}年度 {品種名} 田植え計画(品種変更移動) | 実装通り | ✅ old_variety / new_variety が NULL なら 0 を返す | 冒頭でガード | ✅ 施肥計画と対称的な構造 | move_unspread_entries_for_variety_change と同パターン | ✅default_seed_grams_per_box/seedling_boxes_per_tan/notesの引き継ぎ新計画に旧計画の計算パラメータを引き継いでいる点は施肥計画の
calc_settings引き継ぎと対称的で自然です。ファイル分離(
services_rice_transplant.py)施肥計画の移動は
fertilizer/services.py、田植えはplans/services_rice_transplant.pyと分けた設計は、循環インポートを避けつつ責務も明確で良い判断です。テストの妥当性評価
テストが検証していること ✅
self.field)のエントリが新計画へ移動するself.other_field)のエントリが旧計画に残るdefault_seed_grams_per_box/seedling_boxes_per_tan/notesが引き継がれる不足している観点(#6と同様、軽微)
① 田植え計画が存在しないケース — 施肥計画と同様、田植え計画が0件でも
moved_count = 0で正常終了することのテストがない②
old_variety / new_varietyが NULL のケース — ガードの動作テストがない③
moved_countへの田植え計画分の加算がないこと —process_plan_variety_changeでは施肥計画のmoved_countだけをchange.moved_entry_countに記録し、田植え計画の件数は含まれていない。これは仕様上の意図通りですか?(moved_entry_countの定義が「施肥エントリ移動数」なら問題なし)1点確認
moved_entry_countは施肥計画の未散布エントリ数のみカウントしており、田植え計画の移動件数は含まれていません。PlanVarietyChangeのverbose_nameが「移動エントリ数」のままなので、将来混乱する可能性があります。
</html>fertilizer_moved_entry_countに改名するか、コメントで「施肥エントリ数のみ」と明示するかのどちらかがあると明確になります。今の段階で直しますか?2026-04-07 時点で実装済みを確認したためクローズします。
確認内容:
move_rice_transplant_entries_for_variety_change()が呼ばれる構成になっているRiceTransplantEntryを新品種側の新規田植え計画へ移動する処理が実装済みapps.plans.testsの関連テストが 2026-04-07 に Docker 内で通過関連ファイル:
backend/apps/plans/services.pybackend/apps/plans/services_rice_transplant.pybackend/apps/plans/tests.py