Move all fertilization entries on variety change

This commit is contained in:
akira
2026-04-05 18:42:09 +09:00
parent ae0249be69
commit c675b7b7ae
4 changed files with 53 additions and 68 deletions

View File

@@ -60,7 +60,7 @@ def sync_stock_uses_for_spreading_session(session):
@transaction.atomic
def move_unspread_entries_for_variety_change(change):
def move_fertilization_entries_for_variety_change(change):
moved_count = 0
old_variety_id = change.old_variety_id
new_variety = change.new_variety
@@ -73,7 +73,6 @@ def move_unspread_entries_for_variety_change(change):
year=change.year,
variety_id=old_variety_id,
entries__field_id=change.field_id,
entries__actual_bags__isnull=True,
)
.distinct()
.prefetch_related('entries')
@@ -83,7 +82,6 @@ def move_unspread_entries_for_variety_change(change):
entries_to_move = list(
old_plan.entries.filter(
field_id=change.field_id,
actual_bags__isnull=True,
).order_by('id')
)
if not entries_to_move:

View File

@@ -59,10 +59,10 @@ def handle_plan_variety_change(plan: Plan, *, old_variety, new_variety, reason:
def process_plan_variety_change(change: PlanVarietyChange):
from apps.fertilizer.services import move_unspread_entries_for_variety_change
from apps.fertilizer.services import move_fertilization_entries_for_variety_change
from .services_rice_transplant import move_rice_transplant_entries_for_variety_change
moved_count = move_unspread_entries_for_variety_change(change)
moved_count = move_fertilization_entries_for_variety_change(change)
move_rice_transplant_entries_for_variety_change(change)
if moved_count != change.fertilizer_moved_entry_count:
change.fertilizer_moved_entry_count = moved_count

View File

@@ -111,47 +111,47 @@ class PlanVarietyChangeTests(TestCase):
self.assertEqual(change.old_variety_id, self.old_variety.id)
self.assertEqual(change.new_variety_id, self.new_variety.id)
def test_serializer_update_moves_only_unspread_fertilizer_entries(self):
material_unspread = Material.objects.create(
def test_serializer_update_moves_all_fertilizer_entries_for_target_field(self):
material_target = Material.objects.create(
name='高度化成14号',
material_type=Material.MaterialType.FERTILIZER,
)
material_partial = Material.objects.create(
material_spread = Material.objects.create(
name='分げつ一発',
material_type=Material.MaterialType.FERTILIZER,
)
fertilizer_unspread = Fertilizer.objects.create(
fertilizer_target = Fertilizer.objects.create(
name='高度化成14号',
material=material_unspread,
material=material_target,
)
fertilizer_partial = Fertilizer.objects.create(
fertilizer_spread = Fertilizer.objects.create(
name='分げつ一発',
material=material_partial,
material=material_spread,
)
old_fertilization_plan = FertilizationPlan.objects.create(
name='2026年度 にこまる 元肥',
year=2026,
variety=self.old_variety,
calc_settings=[{'fertilizer_id': fertilizer_unspread.id, 'method': 'per_tan', 'param': '1.0'}],
calc_settings=[{'fertilizer_id': fertilizer_target.id, 'method': 'per_tan', 'param': '1.0'}],
)
unspread_entry = FertilizationEntry.objects.create(
target_entry = FertilizationEntry.objects.create(
plan=old_fertilization_plan,
field=self.field,
fertilizer=fertilizer_unspread,
fertilizer=fertilizer_target,
bags='4.00',
actual_bags=None,
)
partial_entry = FertilizationEntry.objects.create(
spread_entry = FertilizationEntry.objects.create(
plan=old_fertilization_plan,
field=self.field,
fertilizer=fertilizer_partial,
fertilizer=fertilizer_spread,
bags='3.00',
actual_bags='1.0000',
)
untouched_entry = FertilizationEntry.objects.create(
plan=old_fertilization_plan,
field=self.other_field,
fertilizer=fertilizer_unspread,
fertilizer=fertilizer_target,
bags='2.00',
actual_bags=None,
)
@@ -166,7 +166,7 @@ class PlanVarietyChangeTests(TestCase):
serializer.save()
change = PlanVarietyChange.objects.get(plan=self.plan)
self.assertEqual(change.fertilizer_moved_entry_count, 1)
self.assertEqual(change.fertilizer_moved_entry_count, 2)
old_fertilization_plan.refresh_from_db()
new_plan = FertilizationPlan.objects.exclude(id=old_fertilization_plan.id).get(
@@ -179,12 +179,12 @@ class PlanVarietyChangeTests(TestCase):
)
self.assertEqual(new_plan.calc_settings, old_fertilization_plan.calc_settings)
unspread_entry.refresh_from_db()
partial_entry.refresh_from_db()
target_entry.refresh_from_db()
spread_entry.refresh_from_db()
untouched_entry.refresh_from_db()
self.assertEqual(unspread_entry.plan_id, new_plan.id)
self.assertEqual(partial_entry.plan_id, old_fertilization_plan.id)
self.assertEqual(target_entry.plan_id, new_plan.id)
self.assertEqual(spread_entry.plan_id, new_plan.id)
self.assertEqual(untouched_entry.plan_id, old_fertilization_plan.id)
old_reserves = list(
@@ -199,16 +199,21 @@ class PlanVarietyChangeTests(TestCase):
transaction_type=StockTransaction.TransactionType.RESERVE,
).order_by('material__name')
)
self.assertEqual(len(old_reserves), 2)
self.assertEqual(len(new_reserves), 1)
self.assertEqual(len(old_reserves), 1)
self.assertEqual(len(new_reserves), 2)
self.assertEqual(
{(reserve.material_id, reserve.quantity) for reserve in old_reserves},
{
(material_partial.id, partial_entry.bags),
(material_unspread.id, untouched_entry.bags),
(material_target.id, untouched_entry.bags),
},
)
self.assertEqual(
{(reserve.material_id, reserve.quantity) for reserve in new_reserves},
{
(material_target.id, target_entry.bags),
(material_spread.id, spread_entry.bags),
},
)
self.assertEqual(new_reserves[0].quantity, unspread_entry.bags)
def test_serializer_update_moves_rice_transplant_entries_for_target_field(self):
old_rice_plan = RiceTransplantPlan.objects.create(