fix feed initial balance and report button

This commit is contained in:
Alberto-Audrix committed 2026-09-01 08:38:16 +07:00
1 parent 30a736641f
commit 569d7c6bb6
9 files changed
+135 -24

No files matched your search

+58
View File
@@ -5,6 +5,7 @@ from rest_framework.test import APIClient
from apps.accounts.models import User
from apps.farms.models import Cycle, Flock, Kandang, Site
from apps.operations.models import FeedSacks, ManualInput
class FarmAPITests(TestCase):
@@ -85,3 +86,60 @@ class FarmAPITests(TestCase):
self.assertEqual(response.status_code, 200, response.data)
results = response.data["results"] if isinstance(response.data, dict) else response.data
self.assertEqual(len(results), 2)
def test_set_initial_balance_seeds_feed_sack_snapshot_when_none_exist(self):
start = date.today()
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=35,
start_date=start,
end_date=start + timedelta(days=34),
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
)
self.client.force_authenticate(self.user)
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/initial-balance/",
{"date": start.isoformat(), "feed_in_manual": 120},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
row = FeedSacks.objects.get(cycle=cycle)
self.assertEqual(row.date, start)
self.assertEqual(row.in_total, 120)
def test_set_initial_balance_recomputes_existing_feed_sack_in_total(self):
start = date.today()
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=35,
start_date=start,
end_date=start + timedelta(days=34),
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
)
feed_row = FeedSacks.objects.create(
cycle=cycle,
date=start + timedelta(days=1),
in_today=4,
in_total=4,
out_today=0,
out_total=0,
feed_use_today=0,
feed_use_total=0,
)
self.client.force_authenticate(self.user)
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/initial-balance/",
{"date": start.isoformat(), "feed_in_manual": 120},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
feed_row.refresh_from_db()
self.assertEqual(feed_row.in_total, 124)
+6 -6
View File
@@ -10,6 +10,10 @@ from apps.accounts.models import User
from apps.farms.models import Cycle, Flock, Kandang, Site
from apps.farms.serializers import CycleSerializer, FlockSerializer, KandangSerializer, SiteSerializer
from apps.operations.models import FeedSacks, ManualInput
from apps.operations.services.feed_sacks import (
ensure_opening_feed_sack_snapshot,
recompute_feed_sack_in_totals,
)
from apps.operations.services.karung_web import KarungWebError, request_karung
from apps.operations.services.manual_input import recompute_manual_totals
@@ -145,12 +149,8 @@ class CycleViewSet(viewsets.ModelViewSet):
recompute_manual_totals(cycle)
# FeedSacks in_total always includes the initial balance as its base.
running = cycle.feed_initial_balance
for fs_row in FeedSacks.objects.filter(cycle=cycle).order_by("date", "pk"):
running += fs_row.in_today
if fs_row.in_total != running:
fs_row.in_total = running
fs_row.save(update_fields=["in_total", "updated_at"])
recompute_feed_sack_in_totals(cycle)
ensure_opening_feed_sack_snapshot(cycle, balance_date)
accuracy = None
if feed_in_manual > 0 and iot_in is not None and iot_in > 0: