some improve

This commit is contained in:
javad committed 2026-10-27 11:49:09 +03:30
1 parent fa73a734a0
commit 2e5d0bcdd3
17 files changed
+1512 -226

No files matched your search

+80 -2
View File
@@ -368,6 +368,25 @@ class AppointmentLifetimeSimulationTests(SimulationBase):
make_action(self.customer, 'nasb', 'finish', action_dt=NOW, finish_dt=NOW)
self.assertNotIn(self.customer.pk, manual_holds_map())
def test_same_microsecond_visit_still_kills_appointment(self):
"""ثبت بازدید در همان لحظهٔ هماهنگی هم قرار را باطل می‌کند.
``createdDT`` روی SQLite/ویندوز دقت کافی ندارد و دو رکورد پشت‌سرهم می‌توانند
مقدار یکسان بگیرند؛ مقایسه با ``id`` به‌عنوان مرز تساوی، این حالت را هم
درست تشخیص می‌دهد (قبلاً تست به زمان اجرا وابسته و ناپایدار بود).
"""
from admin_panel.models import Action
self._hold_customer()
visit = make_action(self.customer, 'bazdid', 'finish',
action_dt=NOW, finish_dt=NOW)
# هر دو رکورد همان createdDT را می‌گیرند (بازسازی شرط مسابقه).
stamp = Action.objects.get(
customer=self.customer, actionType='hamahangi',
).createdDT
Action.objects.filter(pk=visit.pk).update(createdDT=stamp)
self.assertNotIn(self.customer.pk, manual_holds_map())
class FollowupDaySimulationTests(SimulationBase):
"""فهرست «نیازمند پیگیری امروز»: کارِ باقی‌مانده، نه آرشیو."""
@@ -397,6 +416,45 @@ class FollowupDaySimulationTests(SimulationBase):
make_action(self.customer, 'bazdid', 'finish', action_dt=NOW, finish_dt=NOW)
self.assertIn(self.customer.pk, followups_on_date(yesterday))
# --- «نصب» هم مثل بازدید فهرست کار را می‌بندد ---
# قاعدهٔ کسب‌وکار: نصب و بازدید هر دو چرخه را از نو شروع می‌کنند
# (``_CYCLE_RESET_TYPES``) و قرار دستی را باطل می‌کنند؛ پس فهرست «نیازمند
# پیگیری» هم باید با هر دو بسته شود.
def test_install_done_today_clears_today_row(self):
"""«نصبِ انجام‌شدهٔ امروز» هم ردیف امروز را می‌بندد (مثل بازدید)."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=NOW, finish_dt=NOW)
self.assertIn(self.customer.pk, followups_on_date(timezone.localdate()))
make_action(self.customer, 'nasb', 'finish', action_dt=NOW, finish_dt=NOW)
self.assertNotIn(self.customer.pk, followups_on_date(timezone.localdate()))
ids, _ = self.stale_ids('today')
self.assertNotIn(self.customer.pk, ids)
def test_scheduled_install_hides_today_row(self):
"""«نصب» با وضعیت waite و تاریخ **آینده** ⇒ ردیف امروز پنهان می‌شود."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=NOW, finish_dt=NOW)
self.assertIn(self.customer.pk, followups_on_date(timezone.localdate()))
make_action(self.customer, 'nasb', 'waite', action_dt=at(7))
self.assertNotIn(self.customer.pk, followups_on_date(timezone.localdate()))
ids, _ = self.stale_ids('today')
self.assertNotIn(self.customer.pk, ids)
def test_old_pending_install_does_not_hide(self):
"""نصبِ «در انتظار» با تاریخ گذشته قرار فعال نیست ⇒ ردیف می‌ماند."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=NOW, finish_dt=NOW)
make_action(self.customer, 'nasb', 'waite', action_dt=at(-30))
self.assertIn(self.customer.pk, followups_on_date(timezone.localdate()))
def test_install_yesterday_does_not_clear_today_row(self):
"""نصبِ دیروز، موعدِ امروز را نمی‌بندد (اگر موعد تازه‌ای گذاشته شده)."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=NOW, finish_dt=NOW)
make_action(self.customer, 'nasb', 'finish',
action_dt=at(-1), finish_dt=at(-1))
self.assertIn(self.customer.pk, followups_on_date(timezone.localdate()))
class TaskListBoundaryTests(SimulationBase):
"""«لیست وظایف امروز»: مرزهای روز به وقت محلی و aware.
@@ -744,8 +802,9 @@ class MissedViewSimulationTests(SimulationBase):
"""رفتار فهرست ``?view=today&missed=1`` پس از رفع باگ.
قاعدهٔ کسب‌وکار: این فهرست فقط «پیگیری‌های واقعاً باقی‌مانده» را نشان می‌دهد.
هر مشتری که (الف) بازدیدش از موعد به بعد انجام شده، یا (ب) قرار دستیِ معتبر
دارد، یا (ج) بازدیدِ در انتظار از آن روز دارد، از فهرست خارج می‌شود.
هر مشتری که (الف) بازدید یا نصبش از موعد به بعد انجام شده، یا (ب) قرار
دستیِ معتبر دارد، یا (ج) بازدید/نصبِ در انتظار از آن روز دارد، از فهرست
خارج می‌شود.
"""
URL = '/panel/entezar/?view=today&missed=1'
@@ -807,6 +866,25 @@ class MissedViewSimulationTests(SimulationBase):
ids, _ = self.missed()
self.assertNotIn(self.customer.pk, ids)
def test_pending_install_removes_from_missed(self):
"""«نصبِ» در انتظار با تاریخ آینده هم مشتری را از missed خارج می‌کند."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=at(-3), finish_dt=at(-3))
make_action(self.customer, 'nasb', 'waite', action_dt=at(5))
ids, _ = self.missed()
self.assertNotIn(self.customer.pk, ids)
def test_finished_install_after_coordination_is_not_listed(self):
"""هماهنگی دیروز + نصب انجام‌شدهٔ امروز ⇒ نباید در missed بیاید."""
make_action(self.customer, 'hamahangi', 'finish',
action_dt=at(-1, -2), finish_dt=at(-1))
make_action(self.customer, 'nasb', 'finish',
action_dt=NOW, finish_dt=NOW)
ids, response = self.missed()
self.assertNotIn(self.customer.pk, ids)
self.assertNotIn(self.customer.pk, overdue_followups())
self.assertEqual(response.context['counts']['followup_overdue'], 0)
def test_old_pending_visit_does_not_remove(self):
"""بازدیدِ در انتظارِ قدیمی‌تر از موعد، قرار فعال نیست ⇒ در missed می‌ماند."""
make_action(self.customer, 'hamahangi', 'finish',