updating cycle close request feature to get approval from national dashboard instead auto from system
This commit is contained in:
1 parent
3a868cf1db
commit
e4dbfd0252
31 files changed
+1322
-182
No files matched your search
+111
-7
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user