updating cycle close request feature to get approval from national dashboard instead auto from system

This commit is contained in:
Alberto-Audrix committed 2026-09-09 14:18:39 +07:00
1 parent 3a868cf1db
commit e4dbfd0252
31 files changed
+1322 -182

No files matched your search

+111 -7
View File
@@ -64,11 +64,12 @@ class FarmAPITests(TestCase):
def test_update_cycle(self):
self.client.force_authenticate(self.user)
start = date(2026, 8, 1)
original_end = start + timedelta(days=34)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=35,
start_date=start,
end_date=start + timedelta(days=34),
end_date=original_end,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
@@ -86,20 +87,22 @@ class FarmAPITests(TestCase):
)
self.assertEqual(response.status_code, 200, response.data)
cycle.refresh_from_db()
self.assertEqual(cycle.end_date, new_end)
self.assertEqual(cycle.total_days, 40)
# end_date is GM-approval only — client writes are ignored; total_days
# is recomputed from the existing end_date on full save.
self.assertEqual(cycle.end_date, original_end)
self.assertEqual(cycle.total_days, 35)
self.assertEqual(cycle.doc_in_count, 9500)
self.assertEqual(cycle.doc_in_weight, 42)
@patch("apps.operations.services.visibility.visible_through_date", return_value=date(2026, 9, 10))
def test_cycle_status_closes_when_end_date_is_visible(self, _mock_visible):
def test_cycle_stays_active_without_gm_approval(self, _mock_visible):
self.client.force_authenticate(self.user)
start = date(2026, 8, 1)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=35,
start_date=start,
end_date=start + timedelta(days=34),
end_date=None,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
@@ -108,9 +111,110 @@ class FarmAPITests(TestCase):
response = self.client.get(f"/api/v1/cycles/{cycle.pk}/")
self.assertEqual(response.status_code, 200, response.data)
self.assertEqual(response.data["status"], Cycle.STATUS_CLOSED)
self.assertEqual(response.data["status"], Cycle.STATUS_ACTIVE)
cycle.refresh_from_db()
self.assertEqual(cycle.status, Cycle.STATUS_CLOSED)
self.assertEqual(cycle.status, Cycle.STATUS_ACTIVE)
def test_active_user_can_request_and_cancel_close(self):
self.client.force_authenticate(self.user)
start = date(2026, 8, 1)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=1,
start_date=start,
end_date=None,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
)
proposed = start + timedelta(days=34)
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/request-close/",
{"proposed_end_date": proposed.isoformat()},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
body = response.data.get("cycle", response.data)
self.assertEqual(body["status"], Cycle.STATUS_PENDING_CLOSE)
self.assertEqual(body["proposed_end_date"], proposed.isoformat())
cancel = self.client.post(f"/api/v1/cycles/{cycle.pk}/cancel-close-request/", {}, format="json")
self.assertEqual(cancel.status_code, 200, cancel.data)
cancel_body = cancel.data.get("cycle", cancel.data)
self.assertEqual(cancel_body["status"], Cycle.STATUS_ACTIVE)
self.assertIsNone(cancel_body["proposed_end_date"])
def test_superadmin_cannot_request_close(self):
self.client.force_authenticate(self.admin)
start = date(2026, 8, 1)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=1,
start_date=start,
end_date=None,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_ACTIVE,
)
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/request-close/",
{"proposed_end_date": (start + timedelta(days=30)).isoformat()},
format="json",
)
self.assertEqual(response.status_code, 400, response.data)
cycle.refresh_from_db()
self.assertEqual(cycle.status, Cycle.STATUS_ACTIVE)
def test_session_user_cannot_apply_close_decision(self):
self.client.force_authenticate(self.user)
start = date(2026, 8, 1)
end = start + timedelta(days=34)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=1,
start_date=start,
end_date=None,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_PENDING_CLOSE,
proposed_end_date=end,
)
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/apply-close-decision/",
{"decision": "approve", "end_date": end.isoformat()},
format="json",
)
self.assertEqual(response.status_code, 403, response.data)
cycle.refresh_from_db()
self.assertEqual(cycle.status, Cycle.STATUS_PENDING_CLOSE)
def test_apply_close_decision_approve(self):
from django.test import override_settings
start = date(2026, 8, 1)
end = start + timedelta(days=34)
cycle = Cycle.objects.create(
kandang=self.kandang,
total_days=1,
start_date=start,
end_date=None,
doc_in_weight=40,
doc_in_count=9000,
status=Cycle.STATUS_PENDING_CLOSE,
proposed_end_date=end,
)
with override_settings(PUSAT_API_KEY="pusat-test-key"):
response = self.client.post(
f"/api/v1/cycles/{cycle.pk}/apply-close-decision/",
{"decision": "approve", "end_date": end.isoformat()},
format="json",
HTTP_X_API_KEY="pusat-test-key",
)
self.assertEqual(response.status_code, 200, response.data)
self.assertEqual(response.data["status"], Cycle.STATUS_CLOSED)
self.assertEqual(response.data["end_date"], end.isoformat())
self.assertEqual(response.data["total_days"], 35)
def test_flock_persists_across_cycles(self):
flock = Flock.objects.create(flock_name="Lantai 1", kandang=self.kandang)