improve bazdid 4

This commit is contained in:
javad committed 2026-10-21 16:34:13 +03:30
1 parent 8fd881e0ea
commit 825f2a5973
13 files changed
+585 -15

No files matched your search

+56
View File
@@ -319,6 +319,62 @@ visit_hold_until = max(مقدار فعلی، تاریخ جدید)
---
## ۶.۱ حذف یک اقدام (soft-delete)
دکمهٔ «حذف» فقط در صفحهٔ اقدام‌های مشتری (`/panel/customer/<id>/action`) نمایش
داده می‌شود و **هیچ رکوردی فیزیکی حذف نمی‌شود**؛ به‌جای آن:
| ستون | مقدار |
|---|---|
| `status` | `cancell` |
| `deleted_at` | زمان حذف |
| `deleted_by` | کاربر حذف‌کننده |
### چرا `cancell` و نه ستون `is_deleted`؟
همهٔ محاسبات (`last_visit_map`، `cycle_anchor_map`، `appointment_sources_map`،
`followups_on_date`، `overdue_followups`) از قبل فقط `waite`/`finish` را
می‌بینند؛ و `ActionList*` و `ActionCount` هم با `status='waite'` فیلتر می‌شوند.
پس همین یک مقدار، اقدام را از **همهٔ** خروجی‌ها خارج می‌کند — بدون Manager
سفارشی، بدون تغییر ایندکس پوشا و بدون دست‌زدن به ۳۱ کوئری.
### قاعدهٔ محصولی: اقدام دارای نظرسنجی حذف نمی‌شود
اگر `nazarDT` پر باشد (نظرسنجی ثبت‌شده)، حذف انجام **نمی‌شود**؛ چون هیچ
آرشیو/کپی‌ای وجود ندارد و گزارش رضایت‌سنجی برای همیشه تغییر می‌کرد. در UI
دکمه به حالت قفل‌شده با برچسب «نظرسنجی» درمی‌آید.
### پیامدهای جانبی (در همان تراکنش)
۱. `last_bazdid_dt` بازمحاسبه می‌شود (کش کهنه نمی‌ماند).
۲. قرار دستی اگر دیگر مرجعی نداشته باشد، خودکار بی‌اثر می‌شود.
۳. پیامک‌های **ارسال‌نشدهٔ** «بازدید ثبت شد» همان مشتری به `cancelled` می‌روند
(پیامک‌های ارسال‌شده دست نمی‌خورند).
### اثر روی مصرف‌کننده‌ها
| بخش | اثر |
|---|---|
| `/panel/entezar/` (همهٔ نماها) | اقدام کاملاً نادیده گرفته می‌شود |
| `/panel/ActionList/<u>/today` | از صف وظایف خارج می‌شود |
| `ActionCount` داشبورد | بلافاصله کم می‌شود |
| فهرست اقدام‌های مشتری | به‌طور پیش‌فرض پنهان (با `?status=cancell` قابل مشاهده برای حسابرسی) |
| `/panel/customer/<id>/nazar/` | پنهان |
| `/panel/ActionList/all` | پنهان |
| گزارش وصول (`finance.py`) | آخرین اقدام وصول دیگر آن را نمی‌بیند |
| داشبورد رضایت‌سنجی و گزارش روزانه | `deleted_at__isnull=True` |
| صف پیامک | `CANCELLED` در `DONE_STATUSES` ⇒ از صف بیرون می‌رود |
### امنیت
- فقط **POST** مجاز است؛ درخواست GET ریدایرکت می‌شود و چیزی را عوض نمی‌کند.
- `get_object_or_404(Action, id=..., customer=customer)` ⇒ حذف اقدام مشتری دیگر
ممکن نیست (۴۰۴).
- توکن CSRF در فرم اجباری است.
- تأیید دو‌مرحله‌ای پیش از حذف (نوع اقدام در متن تأیید نمایش داده می‌شود).
---
## ۷. سناریوهای تست‌شده
| # | سناریو | نتیجهٔ انتظار | وضعیت |