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

21 KiB
Raw Blame History

چک‌لیست فاز ۰ — 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.