# اصلاح دستی شماره‌های قدیمی مشتریان ## چرا؟ فیلد‌های `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/` بروید. فیلد **توضیحات** در ستون سمت راست (کنار نام، آدرس، شماره‌های تماس) متن‌های برداشته‌شده را نشان می‌دهد، با سرصفحهٔ: ``` — پاک‌سازی خودکار فیلدهای تلفن — «phone3»: نصب جدید 1401/07/02 ``` این فیلد در حالت «ویرایش» قابل تغییر است و مقدارش ذخیره می‌شود. ## نکته‌ها - شماره‌های ثابت ۸رقمی طبق تصمیم، **دست‌نخورده** می‌مانند. - جدول `PhoneNumber` (شماره‌های جدید) دست‌کاری نمی‌شود؛ فقط فیلدهای قدیمی. - اگر دستور را با قاعدهٔ قدیمی روی یک دیتابیس اجرا کرده باشید، تکه‌های بی‌معنی (`0`، `573`) که آن زمان بدون یادداشت پاک شده‌اند قابل بازیابی نیستند. روی production که هنوز اجرا نشده، همه‌چیز کامل حفظ می‌شود.