Files
khatibi/fix_customer_phones.md
2026-10-10 14:21:04 +03:30

122 lines
5.5 KiB
Markdown

# اصلاح دستی شماره‌های قدیمی مشتریان
## چرا؟
فیلد‌های `phone1` / `phone2` / `phone3` در مدل `Customer` از نوع `CharField` هستند و
سال‌ها داده در آن‌ها به هر شکلی وارد شده: بدون صفر ابتدایی (`9133722815`)، ارقام
فارسی، فاصله/خط تیره، شمارهٔ ثابت ۸رقمی، یا کلاهی متن آزاد (نام، تاریخ نصب، «معرف …»).
هدف: هرچه در فیلد شماره هست پاک‌سازی شود، موبایل به شکل استاندارد `09xxxxxxxxx`
در بیاید، و **هیچ متنی از سیستم حذف نشود** — متن‌های برداشته‌شده در فیلد
`Customer.notes` (توضیحات) می‌مانند و در پنل، ستون سمت راست صفحهٔ مشتری نمایش
داده می‌شوند.
> این کار **یک‌بار** لازم است. دستور idempotent است؛ اجرای دوباره‌اش هیچ تغییری
> ایجاد نمی‌کند و یادداشتی را تکرار نمی‌کند.
## قاعدهٔ پاک‌سازی
| ورودی (نمونه) | نتیجه |
|---|---|
| `9133722815` | `09133722815` (و اصل متن در توضیحات) |
| `۰۹۱۳۳۷۲۲۸۱۵` | `09133722815` (و اصل متن در توضیحات) |
| `0913-372-2815` | `09133722815` (و اصل متن در توضیحات) |
| `57322182/9130261671` | `09130261671` (کل متن اصلی در توضیحات) |
| `57387608` (ثابت ۸رقمی) | **دست‌نخورده** |
| `اعظمی` (متن آزاد) | خالی؛ `اعظمی` در توضیحات |
| `0` (تکهٔ بی‌معنی) | خالی؛ `0` در توضیحات |
خلاصه: هرچیزی که در مقدار جدید نمی‌ماند، بی‌کم‌وکاست در `notes` ثبت می‌شود.
## اجرای دستور
دستور منیجمنت: `fix_customer_phones`
### ۱) اول «شبیه‌سازی» — بدون هیچ تغییری
فقط گزارش می‌دهد چه چیزی تغییر می‌کند. **قبل از هر اجرای واقعی این را بزنید.**
از WSL:
```bash
cd /mnt/d/projects/khatibi
.venv/Scripts/python.exe manage.py fix_customer_phones --dry-run
```
از ویندوز (PowerShell / CMD):
```bat
cd D:\projects\khatibi
.venv\Scripts\python.exe manage.py fix_customer_phones --dry-run
```
خروجی نمونه:
```
شبیه‌سازی (بدون تغییر): 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.
```
### ۲) اجرای واقعی
```bash
.venv/Scripts/python.exe manage.py fix_customer_phones
```
خروجی نمونه:
```
پاک‌سازی انجام شد: 653 مشتری، 700 فیلد اصلاح شد، 640 یادداشت ثبت شد.
```
### ۳) اجرای دوباره برای اطمینان (اختیاری)
دوباره بزنید؛ باید صفر باشد:
```
پاک‌سازی انجام شد: 0 مشتری، 0 فیلد اصلاح شد، 0 یادداشت ثبت شد.
```
## اجرا روی سرور اصلی (production)
دستور برای همین کار نوشته شده: روی دیتابیس production هم بی‌خطر است.
```bash
cd /path/to/khatibi # مسیر پروژه روی سرور
source .venv/bin/activate # یا مسیر venv سرور
python manage.py fix_customer_phones --dry-run # اول شبیه‌سازی
python manage.py fix_customer_phones # سپس اجرا
```
**توصیهٔ مهم:** پیش از اجرای واقعی روی production یک بکاپ از دیتابیس بگیرید
(دستور `sqlite_db_backup` در همین پروژه موجود است). شبیه‌سازی فقط می‌خواند و
بی‌خطر است، ولی بکاپ عادت خوبی است.
## راه جایگزین: مهاجرت (migration)
هنگام `manage.py migrate`، مهاجرت `0067_customer_notes` هم فیلد `notes` را می‌سازد
و هم **همین پاک‌سازی را یک‌بار** روی دیتابیس اجرا می‌کند. پس اگر سرور را با
`migrate` به‌روز می‌کنید، لازم نیست دستور را جدا بزنید؛ نتیجه یکی است.
هر دو مسیر به یک پیاده‌سازی مشترک
(`admin_panel/sms/phone_cleanup.py`) تکیه دارند.
## مشاهدهٔ نتیجه
پس از اجرا، به `/panel/customer/<id>` بروید. فیلد **توضیحات** در ستون سمت راست
(کنار نام، آدرس، شماره‌های تماس) متن‌های برداشته‌شده را نشان می‌دهد، با سرصفحهٔ:
```
— پاک‌سازی خودکار فیلدهای تلفن —
«phone3»: نصب جدید 1401/07/02
```
این فیلد در حالت «ویرایش» قابل تغییر است و مقدارش ذخیره می‌شود.
## نکته‌ها
- شماره‌های ثابت ۸رقمی طبق تصمیم، **دست‌نخورده** می‌مانند.
- جدول `PhoneNumber` (شماره‌های جدید) دست‌کاری نمی‌شود؛ فقط فیلدهای قدیمی.
- اگر دستور را با قاعدهٔ قدیمی روی یک دیتابیس اجرا کرده باشید، تکه‌های بی‌معنی
(`0`، `573`) که آن زمان بدون یادداشت پاک شده‌اند قابل بازیابی نیستند. روی
production که هنوز اجرا نشده، همه‌چیز کامل حفظ می‌شود.