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
21 KiB
21 KiB
✅ چکلیست فاز ۰ — 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,dimensionsreason_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
- اضافه کردن
directioncast → enum - اضافه کردن
typecast → enum - اضافه کردن
statuscast → 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 شیت Zoneexport_zone_doc— از ستون DOCUMENT شیت Zoneimport_zone_parcel— از شیت COUNTRIES ستون IMPORT ZONESimport_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
- تغییر
typevalidation به ۳ مقدار: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_numberbooking_number(nullable)direction(import/export)notes(nullable)
- Select
- نمایش در صفحهی مرسوله بهصورت 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
- اگر type=PARCEL →
- پشتیبانی از ۳ نوع سرویس: 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.