ifnex/01_Documents/IFNEX_Phase0_Checklist.md
Kazem Alghasi 48c88e9bc7 refactor(shipment): update direction enums and shipment import logic
Refactor the shipment direction logic from 'outbound/inbound' to 'export/import' to align with the new database schema requirements. This includes updating the `ShippingRatesImport` logic, adjusting the Excel import sheet mappings, and removing the AED to IRR conversion during import as rates are now stored in AED.

Additionally, updated the shipment view action to open PDF documents in a new tab and updated the Phase 0 checklist with the new database schema requirements.

- docs: update Phase 0 checklist with new schema requirements
- refactor(ui): update shipment view actions to open in new tab
- refactor(import): update shipping rates import to use new direction enums and AED values
- docs: add file map and new excel document
2026-08-23 21:33:56 +03:30

451 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ✅ چک‌لیست فاز ۰ — IFNEX Phase 0 Checklist
> **مرجع:** Phase0_Proposal.docx + EXCEL_ANALYSIS.md + STATUS.md
> **تاریخ:** August 2026
> **وضعیت:** در دست اقدام
> **توسعه‌دهنده:** VernaSoft Group — Kazem Alghasi
---
## 🔴 بخش ۱: اصلاح اسکیمای دیتابیس (حیاتی — قبل از هر چیز)
### 1.1 بازنویسی Migration `countries`
- [ ] حذف `export_zone` و `import_zone` (۲ زون قدیمی)
- [ ] اضافه کردن `export_zone_parcel` (TINYINT 1-10)
- [ ] اضافه کردن `export_zone_doc` (TINYINT 1-10)
- [ ] اضافه کردن `import_zone_parcel` (TINYINT 1-10)
- [ ] اضافه کردن `import_zone_doc` (TINYINT 1-10)
- [ ] اضافه کردن `iso_code` (CHAR(2) UNIQUE)
- [ ] اضافه کردن `is_active` (BOOLEAN default true)
- [ ] اصلاح `name` — بدون کد ISO در پرانتز (مثلاً `Afghanistan` نه `Afghanistan (AF)`)
### 1.2 بازنویسی Migration `shipments`
- [ ] حذف `forwarder_track_id` (جایگزین با جدول مجزا)
- [ ] تغییر `type` از STRING به ENUM: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] تغییر `direction` از STRING به ENUM: `import`, `export` (نه Outbound/Inbound)
- [ ] تغییر `status` از STRING به ENUM (وضعیت‌های استاندارد)
- [ ] اضافه کردن `from_country_id` (FK → countries.id)
- [ ] اضافه کردن `to_country_id` (FK → countries.id)
- [ ] اضافه کردن فیلدهای مالی غایب:
- [ ] `domestic_pickup` (DECIMAL 12,2 default 0)
- [ ] `domestic_delivery` (DECIMAL 12,2 default 0)
- [ ] `warehousing_cost` (DECIMAL 12,2 default 0)
- [ ] `vat_amount` (DECIMAL 12,2 default 0)
- [ ] تبدیل فیلدهای غیرضروری فاز ۰ به `nullable`:
- [ ] `weight`, `volumetric_weight`, `chargeable_weight`, `dimensions`
- [ ] `reason_for_export`, `forwarder`
- [ ] تمام فیلدهای مالی (shipping_price, extra_service, packing_cost, discount, total_fee, net_dirham, net_rial)
- [ ] sender_company, sender_id_number, receiver_company, receiver_id_number
- [ ] حذف `user_id` از فاز ۰ (مشتریان در فاز ۲ اضافه می‌شوند) یا nullable کردن
### 1.3 ایجاد Migration `shipment_carrier_mappings` (جدول جدید)
- [ ] `id` (BIGINT PK)
- [ ] `shipment_id` (FK → shipments.id, cascadeOnDelete)
- [ ] `carrier_code` (ENUM: DHL, FEDEX, UPS, ARAMEX, NAGHEL, EMX, APSITEX, IMPEX, OTHER)
- [ ] `carrier_tracking_number` (VARCHAR 50)
- [ ] `booking_number` (VARCHAR 50 NULL)
- [ ] `direction` (ENUM: import, export)
- [ ] `delivery_status` (ENUM NULL)
- [ ] `last_synced_at` (TIMESTAMP NULL — برای فاز ۳)
- [ ] `manually_updated_at` (TIMESTAMP NULL)
- [ ] `notes` (TEXT NULL — مثلاً 100AED disposal charge)
- [ ] `created_at`, `updated_at`
### 1.4 ایجاد Migration `shipment_tracking_events` (جدول جدید)
- [ ] `id` (BIGINT PK)
- [ ] `shipment_id` (FK → shipments.id, cascadeOnDelete)
- [ ] `event_date` (DATE)
- [ ] `event_time` (TIME)
- [ ] `location` (VARCHAR 200 NULL — مثلاً DUBAI, MUSCAT)
- [ ] `event_description` (VARCHAR 500 — مثلاً Picked up by Naqel)
- [ ] `delivery_status` (ENUM NULL — اگر رویداد مرتبط با تحویل باشد)
- [ ] `source` (ENUM: manual, api_carrier, api_aggregator — فاز ۰: فقط manual)
- [ ] `carrier_mapping_id` (FK NULL — برای فاز ۳)
- [ ] `raw_payload` (JSON NULL — برای فاز ۳)
- [ ] `created_at`
### 1.5 بازنویسی Migration `system_settings`
- [ ] تغییر از ساختار ستونی به ساختار key-value:
- [ ] `key` (VARCHAR 100 UNIQUE)
- [ ] `value` (DECIMAL 15,4)
- [ ] `description` (VARCHAR 255)
- [ ] `updated_by` (FK → users.id)
- [ ] `updated_at`
### 1.6 بازنویسی Migration `users`
- [ ] اضافه کردن `phone` (VARCHAR 20 NULL)
- [ ] اضافه کردن `role` (ENUM: super_admin, tracking_operator, data_entry, customer)
- [ ] اضافه کردن `is_active` (BOOLEAN default true)
### 1.7 اصلاح Migration `shipping_rates`
- [ ] تغییر `type` از STRING به ENUM: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] تغییر `direction` از STRING به ENUM: `import`, `export`
---
## 🟡 بخش ۲: اصلاح و ایجاد Model ها
### 2.1 بازنویسی `Country.php`
- [ ] اضافه کردن fillable: `iso_code`, `export_zone_parcel`, `export_zone_doc`, `import_zone_parcel`, `import_zone_doc`, `is_active`
- [ ] حذف `export_zone`, `import_zone` از fillable
- [ ] اضافه کردن `casts` برای `is_active` → boolean
### 2.2 بازنویسی `Shipment.php`
- [ ] اضافه کردن `direction` cast → enum
- [ ] اضافه کردن `type` cast → enum
- [ ] اضافه کردن `status` cast → enum
- [ ] اضافه کردن fillable: `from_country_id`, `to_country_id`, `domestic_pickup`, `domestic_delivery`, `warehousing_cost`, `vat_amount`
- [ ] حذف `forwarder_track_id` از fillable
- [ ] اضافه کردن رابطه `carrierMappings()` (HasMany)
- [ ] اضافه کردن رابطه `trackingEvents()` (HasMany)
- [ ] اضافه کردن رابطه `fromCountry()` (BelongsTo)
- [ ] اضافه کردن رابطه `toCountry()` (BelongsTo)
### 2.3 ایجاد `ShipmentCarrierMapping.php`
- [ ] fillable: تمام فیلدهای جدول
- [ ] casts: `direction` → enum, `last_synced_at` → datetime
- [ ] رابطه `shipment()` (BelongsTo)
### 2.4 ایجاد `ShipmentTrackingEvent.php`
- [ ] fillable: تمام فیلدهای جدول
- [ ] casts: `event_date` → date, `event_time` → datetime, `source` → enum
- [ ] رابطه `shipment()` (BelongsTo)
### 2.5 بازنویسی `SystemSetting.php`
- [ ] تغییر به ساختار key-value
- [ ] اضافه کردن متد `get($key)` — استخراج مقدار با کلید
- [ ] اضافه کردن متد `set($key, $value)` — تنظیم مقدار
- [ ] اضافه کردن رابطه `updatedBy()` (BelongsTo)
### 2.6 بازنویسی `User.php`
- [ ] اضافه کردن fillable: `phone`, `role`, `is_active`
- [ ] اضافه کردن casts: `is_active` → boolean
- [ ] اضافه کردن متد `isSuperAdmin()`, `isTrackingOperator()`, `isDataEntry()`
### 2.7 بازنویسی `ShippingRate.php`
- [ ] تغییر `type` به enum: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] تغییر `direction` به enum: `import`, `export`
---
## 🟡 بخش ۳: Seeders
### 3.1 بازنویسی `CountriesTableSeeder.php`
- [ ] استخراج نام کشور و iso_code از فرمت `Afghanistan (AF)`
- [ ] تنظیم ۴ زون مجزا (از شیت Zone اکسل):
- [ ] `export_zone_parcel` — از ستون PARCEL شیت Zone
- [ ] `export_zone_doc` — از ستون DOCUMENT شیت Zone
- [ ] `import_zone_parcel` — از شیت COUNTRIES ستون IMPORT ZONES
- [ ] `import_zone_doc` — از شیت COUNTRIES (نیاز به تأیید مشتری)
- [ ] ایران (IR) را بدون زون تنظیم (مبدا/مقصد داخلی)
- [ ] تنظیم `is_active = true` برای همه
### 3.2 بازنویسی `SystemSettingSeeder.php`
- [ ] ساختار key-value:
- [ ] `('vat_rate', 0.09, 'VAT rate — 9%')`
- [ ] `('packing_cost_default', 100000, 'Default packing cost in IRR')`
- [ ] `('profit_margin', 1.25, 'Profit margin — set per company')`
- [ ] `('aed_to_irr', 455000, 'AED to IRR exchange rate')`
- [ ] `('usd_to_irr', 0, 'USD to IRR exchange rate')`
- [ ] `('cny_to_irr', 0, 'CNY to IRR exchange rate')`
- [ ] `('eur_to_irr', 0, 'EUR to IRR exchange rate')`
### 3.3 بازنویسی `DatabaseSeeder.php`
- [ ] اضافه کردن CountriesTableSeeder
- [ ] اضافه کردن SystemSettingSeeder
- [ ] ایجاد User اولیه با نقش `super_admin`
- [ ] حذف User::factory
---
## 🟢 بخش ۴: API و Controller ها
### 4.1 ایجاد `TrackController.php` (حیاتی — فاز ۰)
- [ ] `GET /api/track/{awb_no}` — تایم‌لاین ترکینگ
- [ ] جستجوی shipment با awb_no
- [ ] برگرداندن رویدادهای ترکینگ مرتب‌شده (تاریخ + زمان)
- [ ] برگرداندن اطلاعات پایه مرسوله (direction, type, status, sender, receiver)
- [ ] برگرداندن نگاشت‌های شرکت حمل (carrier_mappings)
- [ ] Response در قالب JSON مرتب
- [ ] اگر AWB پیدا نشد → 404 با پیام مناسب
### 4.2 اصلاح `PricingController.php`
- [ ] تغییر `type` validation به ۳ مقدار: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] اضافه کردن API Key authentication middleware
- [ ] اضافه کردن Rate Limiting (60 req/min)
- [ ] تغییر مسیر به `POST /api/calculate-price` (در فاز ۱)
### 4.3 تنظیمات امنیتی API
- [ ] ایجاد Middleware برای API Key (header: `Authorization: Bearer {key}`)
- [ ] تنظیم Rate Limiting در `RouteServiceProvider`
- [ ] تنظیم CORS در `config/cors.php` — فقط دامنه‌ی وردپرس تولیدی
- [ ] اعتبارسنجی ورودی‌ها با Form Request
### 4.4 اصلاح `routes/api.php`
- [ ] اضافه کردن `GET /api/track/{awb_no}` (فاز ۰)
- [ ] گروه‌بندی مسیرها با middleware (api_key + throttle)
- [ ] حفظ `GET /api/calculate-price` (فاز ۱)
---
## 🟢 بخش ۵: Filament Admin Panel
### 5.1 بازنویسی `CountryResource.php`
- [ ] اضافه کردن فیلدهای ۴ زون در فرم
- [ ] اضافه کردن فیلد `iso_code`
- [ ] اضافه کردن فیلد `is_active` (toggle)
- [ ] نمایش ۴ زون در جدول
### 5.2 بازنویسی `ShipmentResource.php`
- [ ] حذف `forwarder_track_id` از فرم
- [ ] تغییر `type` به Select با ۳ گزینه: DOC_NORMAL, DOC_ECONOMY, PARCEL
- [ ] تغییر `direction` به Select با ۲ گزینه: import, export
- [ ] اضافه کردن `from_country_id` و `to_country_id` (Select از کشورها)
- [ ] اضافه کردن فیلدهای مالی غایب (domestic_pickup, domestic_delivery, warehousing_cost, vat_amount)
- [ ] تبدیل فیلدهای غیرضروری فاز ۰ به `nullable`
- [ ] حذف `user_id` از فرم (یا nullable)
### 5.3 ایجاد `ShipmentCarrierMappingResource.php` (یا RelationManager)
- [ ] فرم افزودن نگاشت شرکت حمل:
- [ ] Select `carrier_code` (۸ گزینه + OTHER)
- [ ] `carrier_tracking_number`
- [ ] `booking_number` (nullable)
- [ ] `direction` (import/export)
- [ ] `notes` (nullable)
- [ ] نمایش در صفحه‌ی مرسوله به‌صورت RelationManager
### 5.4 ایجاد `ShipmentTrackingEventResource.php` (یا RelationManager) ⭐ حیاتی
- [ ] UX اختصاصی اپراتور ترکینگ:
- [ ] جستجوی سریع با کد AWB
- [ ] فرم افزودن رویداد:
- [ ] `event_date` (پیش‌فرض: امروز)
- [ ] `event_time` (پیش‌فرض: اکنون)
- [ ] `delivery_status` (Select از لیست ۸-۱۰ حالت آماده)
- [ ] `location` (متن ساده)
- [ ] `event_description` (متن ساده)
- [ ] `source` (hidden — پیش‌فرض: manual)
- [ ] دکمه «ذخیره و افزودن بعدی» — برای ثبت سریع چند رویداد
- [ ] نمایش تایم‌لاین رویدادها در صفحه‌ی مرسوله
### 5.5 بازنویسی `SettingsPage.php`
- [ ] تغییر به ساختار key-value
- [ ] فرم داینامیک: هر تنظیم یک فیلد با label از description
- [ ] اضافه کردن `vat_rate` (0.09)
- [ ] اضافه کردن `packing_cost_default` (100,000 ریال)
- [ ] ذخیره `updated_by` (کاربر فعلی)
### 5.6 بازنویسی `PriceTestPage.php`
- [ ] تغییر `type` به ۳ گزینه: DOC_NORMAL, DOC_ECONOMY, PARCEL
- [ ] نمایش زون استخراج‌شده (کدام زون استفاده شد)
- [ ] اضافه کردن محاسبه VAT و هزینه‌های جانبی
### 5.7 اصلاح `ShippingRateResource.php`
- [ ] تغییر `type` به ۳ گزینه: DOC_NORMAL, DOC_ECONOMY, PARCEL
- [ ] تغییر `direction` به: import, export
### 5.8 تنظیمات Filament
- [ ] تنظیم زبان فارسی پنل (fa)
- [ ] تنظیم navigation groups (مدیریت، ترکینگ، مالی، تنظیمات)
- [ ] تنظیم نقش‌ها و دسترسی‌ها (Filament Shield یا دستی)
---
## 🟢 بخش ۶: Services
### 6.1 اصلاح `PriceCalculatorService.php`
- [ ] استفاده از ۴ زون مجزا (نه ۲ زون):
- [ ] اگر type=PARCEL → `export_zone_parcel` / `import_zone_parcel`
- [ ] اگر type=DOC_* → `export_zone_doc` / `import_zone_doc`
- [ ] پشتیبانی از ۳ نوع سرویس: DOC_NORMAL, DOC_ECONOMY, PARCEL
- [ ] اضافه کردن محاسبه VAT (9%)
- [ ] اضافه کردن هزینه‌های جانبی (domestic_pickup, packing, warehousing, delivery)
- [ ] محاسبه sub-total قبل از VAT
- [ ] خروجی کامل: base_price, net_dirham, net_rial, vat_amount, total_fee
### 6.2 ایجاد `TrackingService.php` (فاز ۰)
- [ ] متد `getTrackingTimeline($awb_no)` — دریافت تایم‌لاین
- [ ] متد `addTrackingEvent($shipment_id, $data)` — افزودن رویداد دستی
- [ ] متد `getShipmentWithTracking($awb_no)` — مرسوله + رویدادها + نگاشت‌ها
---
## 🔵 بخش ۷: Import و مهاجرت داده
### 7.1 اصلاح `OldShipmentsImport.php`
- [ ] اصلاح ایندکس‌های ستون‌ها (مطابق EXCEL_ANALYSIS.md شیت List):
- [ ] ستون ۱: HAWB No. (ایندکس ۰)
- [ ] ستون ۲: Date (ایندکس ۱)
- [ ] ستون ۳: Forwarder (ایندکس ۲)
- [ ] ستون ۴-۵: From/To (ایندکس ۳-۴)
- [ ] ستون ۶: Zone (ایندکس ۵)
- [ ] ستون ۷: Service/Direction (ایندکس ۶)
- [ ] ستون ۸: Type (ایندکس ۷)
- [ ] و غیره...
- [ ] تبدیل `type` به ۳ مقدار: DOC_NORMAL, DOC_ECONOMY, PARCEL
- [ ] تبدیل `direction` به: import, export
- [ ] تبدیل نام کشورها از `Iran (IR)` به `iso_code` برای lookup
- [ ] فیلتر رکوردهای خالی
- [ ] اعتبارسنجی داده‌ها
### 7.2 اصلاح `ShippingRatesImport.php`
- [ ] پشتیبانی از ۳ نوع سرویس (نه ۲):
- [ ] شیت DocNor → type = DOC_NORMAL
- [ ] شیت DocEco → type = DOC_ECONOMY
- [ ] شیت Parcel → type = PARCEL
- [ ] پشتیبانی از فرمت Long format (شیت‌های DocNor/DocEco/Parcel)
- [ ] پشتیبانی از فرمت Wide format (شیت‌های Import/Export Rate)
### 7.3 ایجاد مهاجرت ترکینگ دستی
- [ ] اسکریپت مهاجرت شیت Sheet1 فایل `Data entry 2026-06-28.xlsx`
- [ ] نگاشت به `shipment_tracking_events` با `source = manual`
- [ ] مهاجرت شیت Refrence به `shipment_carrier_mappings`
### 7.4 تست مهاجرت
- [ ] مقایسه تعداد رکوردهای مهاجرت‌داده‌شده با اکسل
- [ ] نمونه‌گیری ۵۰ رکورد برای بررسی دقیق
- [ ] تست مهاجرت حداقل ۱۰ مرسوله با رویداد ترکینگ
---
## 🔵 بخش ۸: پلاگین وردپرس IFNEX Bridge
### 8.1 ساختار پلاگین
- [ ] ایجاد `ifnex-bridge.php` (فایل اصلی پلاگین)
- [ ] ایجاد `includes/api-client.php` (ارتباط با API لاراول)
- [ ] ایجاد `includes/shortcodes.php` (ثبت شورت‌کدها)
- [ ] ایجاد `includes/tracking-form.php` (فرم رهگیری)
- [ ] ایجاد `assets/css/ifnex-tracking.css`
- [ ] ایجاد `assets/js/ifnex-tracking.js`
### 8.2 شورت‌کد رهگیری مرسوله ⭐ حیاتی
- [ ] `[ifnex_tracking_form]` — فرم جستجوی کد AWB
- [ ] ارسال درخواست به `GET /api/track/{awb_no}` لاراول
- [ ] نمایش تایم‌لاین رویدادها (طراحی شبیه DHL)
- [ ] نمایش اطلاعات پایه مرسوله
- [ ] نمایش خطای «مرسوله پیدا نشد» اگر AWB معتبر نباشد
- [ ] لودینگ و UX روان
### 8.3 شورت‌کد استعلام قیمت (ساده — فاز ۰)
- [ ] `[ifnex_price_inquiry]` — فرم دریافت شماره موبایل + اطلاعات اولیه
- [ ] نمایش پیام «کارشناس ما تماس می‌گیرد»
- [ ] ذخیره اطلاعات برای پیگیری
### 8.4 امنیت پلاگین
- [ ] API Key در تنظیمات پلاگین (نه هاردکد)
- [ ] sanitize_text_field برای تمام ورودی‌ها
- [ ] esc_html و esc_attr برای خروجی‌ها
- [ ] Nonce برای فرم‌ها
---
## 🔵 بخش ۹: وب‌سایت وردپرس
### 9.1 نصب و راه‌اندازی
- [ ] نصب وردپرس روی هاست مشتری
- [ ] تنظیمات امنیتی (HTTPS، فایروال، محدودیت ورود)
- [ ] نصب و تنظیم قالب (light mode، RTL-friendly، DHL-inspired)
### 9.2 لندینگ پیج
- [ ] بخش معرفی شرکت
- [ ] بخش خدمات (صادرات، واردات، داخلی)
- [ ] بخش «چرا ما» (مزیت رقابتی)
- [ ] فراخوان به اقدام (Call to Action)
### 9.3 صفحات ثابت
- [ ] درباره ما
- [ ] تماس با ما
- [ ] قوانین و مقررات
- [ ] سوالات متداول (FAQ)
- [ ] حریم خصوصی
### 9.4 صفحه رهگیری مرسوله
- [ ] شورت‌کد `[ifnex_tracking_form]` در صفحه
- [ ] طراحی تایم‌لاین شبیه DHL
- [ ] تست عملکرد
### 9.5 صفحه استعلام قیمت
- [ ] شورت‌کد `[ifnex_price_inquiry]` در صفحه
- [ ] فرم ساده (موبایل + مبدا + مقصد + وزن تقریبی)
- [ ] پیام «کارشناس ما تماس می‌گیرد»
### 9.6 وبلاگ سئو
- [ ] نصب بخش وبلاگ
- [ ] پست ۱: تفاوت صادرات و واردات
- [ ] پست ۲: نحوه محاسبه وزن حجمی
- [ ] پست ۳: راهنمای انتخاب شرکت حمل مناسب
### 9.7 سئو و چندزبانه
- [ ] meta tags و sitemap XML و schema markup
- [ ] ثبت در Google Search Console
- [ ] نصب Polylang (آماده برای آینده)
- [ ] تست سرعت بارگذاری (< ۳ ثانیه)
---
## 🔵 بخش ۱۰: اصلاحات فنی عمومی
### 10.1 `composer.json`
- [ ] تغییر `laravel/framework` از `^12.0` به `^11.0`
- [ ] اضافه کردن `morilog/jalali` (برای تبدیل تاریخ در لایه نمایش)
### 10.2 تنظیمات `.env.example`
- [ ] اضافه کردن `IFNEX_API_KEY=` (برای احراز هویت وردپرس)
- [ ] اضافه کردن `CORS_ALLOWED_ORIGINS=` (فقط دامنه‌ی وردپرس)
- [ ] اضافه کردن `IFNEX_TRACKING_RATE_LIMIT=60` (درخواست در دقیقه)
### 10.3 Config اختصاصی
- [ ] ایجاد `config/ifnex.php` (تنظیمات اختصاصی پروژه)
- [ ] API Key
- [ ] CORS whitelist
- [ ] Rate limits
- [ ] Carrier codes list
- [ ] Tracking status list
### 10.4 تست‌ها
- [ ] تست Migration ها (php artisan migrate --seed)
- [ ] تست API ترکینگ (GET /api/track/{awb_no})
- [ ] تست API قیمت‌گذاری (GET /api/calculate-price)
- [ ] تست مهاجرت داده‌های تاریخی
- [ ] تست پنل Filament (CRUD + ترکینگ)
- [ ] تست پلاگین وردپرس
- [ ] تست امنیتی (CORS, Rate Limiting, API Key)
---
## 📋 بخش ۱۱: مستندات
- [ ] راهنمای نصب پروژه (Installation Guide)
- [ ] راهنمای اپراتور (Operator Manual) با اسکرین‌شات
- [ ] مستندات API (مسیرها، پارامترها، نمونه پاسخ‌ها)
- [ ] جلسه آموزشی ۴ ساعته برای اپراتورها
---
## 📅 بخش ۱۲: جدول زمانی (۴ هفته)
| هفته | زیرفاز ۰.الف (وردپرس) | زیرفاز ۰.ب (لاراول) | خروجی |
|------|------------------------|----------------------|-------|
| **هفته ۱** | نصب وردپرس + انتخاب قالب + صفحات اصلی | اصلاح Migration ها + Model ها + Seeders | محیط آماده + جداول دیتابیس |
| **هفته ۲** | لندینگ پیج + صفحات ثابت + وبلاگ | API ترکینگ + TrackController + Filament ترکینگ | صفحات آماده + API قابل تست |
| **هفته ۳** | صفحه رهگیری + شورت‌کد + فرم استعلام | پنل Filament کامل + UX اپراتور + پلاگین Bridge | ترکینگ دستی فعال |
| **هفته ۴** | سئو + Polylang + تست | مهاجرت ۳۹۵۰ رکورد + تست نهایی + رفع باگ | تحویل فاز ۰ |
---
## 🚫 خط قرمزها — هرگز این کارها را نکن
- هرگز جدول countries را به ۲ زون برگردانی
- هرگز فقط ۲ نوع سرویس پیاده کن (۳ نوع الزامی است)
- هرگز ترکینگ را در وردپرس پیاده کن
- هرگز فیلدهای مالی (VAT, Packing, Warehousing) را حذف کن
- هرگز از رنگ/لوگو DHL کپی کن
- هرگز PDF را به فارسی بسازی
- هرگز تاریخ را شمسی در DB ذخیره کنی
- هرگز از CORS `*` استفاده کنی
- هرگز فایل .env را در Git کامیت کنی
- هرگز فاز ۱ را قبل از تأیید فاز ۰ شروع کنی
---
> © 2026 VernaSoft Group. Internal use only.