docs: update project documentation and roadmap

- update `IFNEX_File_Map.md` to include new migrations and models from phases 2 and 3
- update `IFNEX_Phase0_Checklist.md` to reflect completed status of phase 0 and progress on subsequent phases
- add `IFNEX_Roadmap.md` to outline project milestones and future development stages
This commit is contained in:
Kazem Alghasi 2026-08-28 22:04:01 +03:30
parent 98181abc45
commit 6a4a619261
3 changed files with 575 additions and 507 deletions

View File

@ -1,202 +1,232 @@
# 📂 نقشه فایل‌های فاز ۰ — IFNEX Laravel
# نقشه فایل‌های پروژه IFNEX
> هر فایل را از پوشه `IFNEX_Laravel_Phase0/` در ریشه‌ی پروژه Laravel (مثلاً `04_Laravel/`) کپی کنید.
> **آخرین بروزرسانی:** 2026-08-29
---
## ۱. Migrations (۸ فایل)
## ۱. Migrations
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `database/migrations/2026_08_02_000001_create_countries_table.php` |
| 2 | `database/migrations/2026_08_02_000002_create_shipments_table.php` |
| 3 | `database/migrations/2026_08_02_000003_create_shipment_carrier_mappings_table.php` |
| 4 | `database/migrations/2026_08_02_000004_create_shipment_tracking_events_table.php` |
| 5 | `database/migrations/2026_08_02_000005_create_shipment_items_table.php` |
| 6 | `database/migrations/2026_08_02_000006_create_shipping_rates_table.php` |
| 7 | `database/migrations/2026_08_02_000007_create_system_settings_table.php` |
| 8 | `database/migrations/2026_08_02_000008_create_users_table.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `database/migrations/..._create_countries_table.php` | ۰ |
| 2 | `database/migrations/..._create_shipments_table.php` | ۰ |
| 3 | `database/migrations/..._create_shipment_carrier_mappings_table.php` | ۰ |
| 4 | `database/migrations/..._create_shipment_tracking_events_table.php` | ۰ |
| 5 | `database/migrations/..._create_shipment_items_table.php` | ۰ |
| 6 | `database/migrations/..._create_shipping_rates_table.php` | ۰ |
| 7 | `database/migrations/..._create_system_settings_table.php` | ۰ |
| 8 | `database/migrations/..._create_users_table.php` | ۰ |
| 9 | `database/migrations/..._create_currencies_table.php` | ۲ |
| 10 | `database/migrations/..._create_shipment_packages_table.php` | ۲ |
| 11 | `database/migrations/..._create_shipment_status_histories_table.php` | ۲ |
| 12 | `database/migrations/..._add_state_notes_to_shipments_table.php` | ۲ |
| 13 | `database/migrations/..._add_calling_code_to_countries_table.php` | ۲ |
| 14 | `database/migrations/..._create_wallets_table.php` | ۲ |
| 15 | `database/migrations/..._create_wallet_transactions_table.php` | ۲ |
---
## ۲. Models (۸ فایل)
## ۲. Models
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Models/Country.php` |
| 2 | `app/Models/Shipment.php` |
| 3 | `app/Models/ShipmentCarrierMapping.php` |
| 4 | `app/Models/ShipmentTrackingEvent.php` |
| 5 | `app/Models/ShipmentItem.php` |
| 6 | `app/Models/ShippingRate.php` |
| 7 | `app/Models/SystemSetting.php` |
| 8 | `app/Models/User.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Models/Country.php` | ۰ |
| 2 | `app/Models/Shipment.php` | ۰+۲ |
| 3 | `app/Models/ShipmentCarrierMapping.php` | ۰ |
| 4 | `app/Models/ShipmentTrackingEvent.php` | ۰+۲ |
| 5 | `app/Models/ShipmentItem.php` | ۰ |
| 6 | `app/Models/ShipmentPackage.php` | ۲ |
| 7 | `app/Models/ShipmentStatusHistory.php` | ۲ |
| 8 | `app/Models/ShippingRate.php` | ۰ |
| 9 | `app/Models/SystemSetting.php` | ۰ |
| 10 | `app/Models/User.php` | ۰+۲ |
| 11 | `app/Models/Currency.php` | ۲ |
| 12 | `app/Models/Wallet.php` | ۲ |
| 13 | `app/Models/WalletTransaction.php` | ۲ |
---
## ۳. Seeders (۳ فایل)
## ۳. Filament Resources
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `database/seeders/DatabaseSeeder.php` |
| 2 | `database/seeders/CountriesTableSeeder.php` |
| 3 | `database/seeders/SystemSettingSeeder.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Filament/Resources/CountryResource.php` | ۰ |
| 2 | `app/Filament/Resources/CountryResource/Pages/ListCountries.php` | ۰ |
| 3 | `app/Filament/Resources/CountryResource/Pages/CreateCountry.php` | ۰ |
| 4 | `app/Filament/Resources/CountryResource/Pages/EditCountry.php` | ۰ |
| 5 | `app/Filament/Resources/ShipmentResource.php` | ۰+۳ |
| 6 | `app/Filament/Resources/ShipmentResource/Pages/ListShipments.php` | ۰ |
| 7 | `app/Filament/Resources/ShipmentResource/Pages/CreateShipment.php` | ۰ |
| 8 | `app/Filament/Resources/ShipmentResource/Pages/ViewShipment.php` | ۰+۳ |
| 9 | `app/Filament/Resources/ShipmentResource/Pages/EditShipment.php` | ۰ |
| 10 | `app/Filament/Resources/ShipmentResource/RelationManagers/TrackingEventsRelationManager.php` | ۰+۲ |
| 11 | `app/Filament/Resources/ShipmentResource/RelationManagers/CarrierMappingsRelationManager.php` | ۰ |
| 12 | `app/Filament/Resources/ShipmentResource/RelationManagers/ItemsRelationManager.php` | ۰ |
| 13 | `app/Filament/Resources/ShippingRateResource.php` | ۰ |
| 14 | `app/Filament/Resources/ShippingRateResource/Pages/ListShippingRates.php` | ۰ |
| 15 | `app/Filament/Resources/ShippingRateResource/Pages/CreateShippingRate.php` | ۰ |
| 16 | `app/Filament/Resources/ShippingRateResource/Pages/EditShippingRate.php` | ۰ |
| 17 | `app/Filament/Resources/CurrencyResource.php` | ۲ |
| 18 | `app/Filament/Resources/CurrencyResource/Pages/ListCurrencies.php` | ۲ |
| 19 | `app/Filament/Resources/CurrencyResource/Pages/CreateCurrency.php` | ۲ |
| 20 | `app/Filament/Resources/CurrencyResource/Pages/EditCurrency.php` | ۲ |
---
## ۴. Fil> Filament Resources (۱۲ فایل)
## ۴. Filament Pages
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Filament/Resources/CountryResource.php` |
| 2 | `app/Filament/Resources/CountryResource/Pages/ListCountries.php` |
| 3 | `app/Filament/Resources/CountryResource/Pages/CreateCountry.php` |
| 4 | `app/Filament/Resources/CountryResource/Pages/EditCountry.php` |
| 5 | `app/Filament/Resources/ShipmentResource.php` |
| 6 | `app/Filament/Resources/ShipmentResource/Pages/ListShipments.php` |
| 7 | `app/Filament/Resources/ShipmentResource/Pages/CreateShipment.php` |
| 8 | `app/Filament/Resources/ShipmentResource/Pages/ViewShipment.php` |
| 9 | `app/Filament/Resources/ShipmentResource/Pages/EditShipment.php` |
| 10 | `app/Filament/Resources/ShipmentResource/RelationManagers/CarrierMappingsRelationManager.php` |
| 11 | `app/Filament/Resources/ShipmentResource/RelationManagers/TrackingEventsRelationManager.php` |
| 12 | `app/Filament/Resources/ShipmentResource/RelationManagers/ItemsRelationManager.php` |
| 13 | `app/Filament/Resources/ShippingRateResource.php` |
| 14 | `app/Filament/Resources/ShippingRateResource/Pages/ListShippingRates.php` |
| 15 | `app/Filament/Resources/ShippingRateResource/Pages/CreateShippingRate.php` |
| 16 | `app/Filament/Resources/ShippingRateResource/Pages/EditShippingRate.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Filament/Pages/SettingsPage.php` | ۰ |
| 2 | `app/Filament/Pages/PriceTestPage.php` | ۰ |
| 3 | `app/Filament/Pages/ImportRatesPage.php` | ۲ |
| 4 | `resources/views/filament/pages/settings-page.blade.php` | ۰ |
| 5 | `resources/views/filament/pages/price-test-page.blade.php` | ۰ |
| 6 | `resources/views/filament/pages/import-rates.blade.php` | ۲ |
---
## ۵. Filament Pages + Widget (۳ فایل)
## ۵. Controllers
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Filament/Pages/SettingsPage.php` |
| 2 | `app/Filament/Pages/PriceTestPage.php` |
| 3 | `app/Filament/Widgets/ShipmentStatsWidget.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Http/Controllers/Api/TrackController.php` | ۰ |
| 2 | `app/Http/Controllers/Api/PricingController.php` | ۰ |
| 3 | `app/Http/Controllers/Api/AuthController.php` | ۱ |
| 4 | `app/Http/Controllers/Api/BridgeAuthController.php` | ۱ |
| 5 | `app/Http/Controllers/Api/Customer/CustomerOrderController.php` | ۱+۲ |
| 6 | `app/Http/Controllers/Api/WalletController.php` | ۲ |
| 7 | `app/Http/Controllers/Api/PaymentController.php` | ۲ |
| 8 | `app/Http/Controllers/Api/DiscountCodeController.php` | ۲ |
| 9 | `app/Http/Controllers/Api/MockGatewayController.php` | ۲ |
| 10 | `app/Http/Controllers/OrderController.php` | ۱ |
| 11 | `app/Http/Controllers/PricingPageController.php` | ۱ |
| 12 | `app/Http/Controllers/ShipmentPdfController.php` | ۱ |
---
## ۶. Filament Blade Views (۲ فایل)
## ۶. Services
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `resources/views/filament/pages/settings-page.blade.php` |
| 2 | `resources/views/filament/pages/price-test-page.blade.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Services/PriceCalculatorService.php` | ۰ |
| 2 | `app/Services/TrackingService.php` | ۰ |
| 3 | `app/Services/PdfService.php` | ۱ |
| 4 | `app/Services/OrderPaymentService.php` | ۲ |
---
## ۷. Services (۲ فایل)
## ۷. Notifications
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Services/PriceCalculatorService.php` |
| 2 | `app/Services/TrackingService.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Notifications/ShipmentUpdatedNotification.php` | ۳ |
---
## ۸. Controllers (۲ فایل)
## ۸. Imports / Exports
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Http/Controllers/Api/PricingController.php` |
| 2 | `app/Http/Controllers/Api/TrackController.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Imports/OldShipmentsImport.php` | ۰ |
| 2 | `app/Imports/ShippingRatesImport.php` | ۰ |
| 3 | `app/Exports/ShippingRatesTemplateExport.php` | ۳ |
---
## ۹. Middleware (۱ فایل)
## ۹. Middleware
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Http/Middleware/ApiKeyAuth.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Http/Middleware/ApiKeyMiddleware.php` | ۰ |
---
## ۱۰. Form Requests (۲ فایل)
## ۱۰. Enums
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Http/Requests/Api/CalculatePriceRequest.php` |
| 2 | `app/Http/Requests/Api/TrackShipmentRequest.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `app/Enums/ShipmentStatus.php` | ۰ |
| 2 | `app/Enums/ShipmentDirection.php` | ۰ |
| 3 | `app/Enums/ShipmentType.php` | ۰ |
---
## ۱۱. Imports (۳ فایل)
## ۱۱. PDF Views
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Imports/OldShipmentsImport.php` |
| 2 | `app/Imports/ShippingRatesImport.php` |
| 3 | `app/Imports/ShippingRatesMultiSheetImport.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `resources/views/pdfs/awb.blade.php` | ۱ |
| 2 | `resources/views/pdfs/label.blade.php` | ۱ |
| 3 | `resources/views/pdfs/invoice.blade.php` | ۱ |
---
## ۱۲. Provider (۱ فایل)
## ۱۲. Routes
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `app/Providers/AdminPanelProvider.php` |
> ⚠️ **مهم:** این فایل را در `bootstrap/providers.php` هم ثبت کنید:
> ```php
> return [
> App\Providers\AdminPanelProvider::class,
> ];
> ```
| # | فایل | فاز |
|---|------|-----|
| 1 | `routes/api.php` | ۰+۱+۲ |
| 2 | `routes/web.php` | ۱ |
---
## ۱۳. Config (۲ فایل)
## ۱۳. Config
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `config/ifnex.php` |
| 2 | `config/cors.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `config/ifnex.php` | ۰ |
| 2 | `config/cors.php` | ۰ |
---
## ۱۴. Routes (۱ فایل)
## ۱۴. وردپرس — پلاگین IFNEX Bridge
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `routes/api.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `ifnex-bridge/ifnex-bridge.php` | ۱ |
| 2 | `ifnex-bridge/includes/api-client.php` | ۰ |
| 3 | `ifnex-bridge/includes/user-bridge.php` | ۱+۲+۳ |
| 4 | `ifnex-bridge/includes/shortcodes.php` | ۱+۲+۳ |
| 5 | `ifnex-bridge/includes/tracking-form.php` | ۰ |
| 6 | `ifnex-bridge/assets/css/ifnex-orders.css` | ۱+۲+۳ |
| 7 | `ifnex-bridge/assets/css/ifnex-bridge.css` | ۰ |
| 8 | `ifnex-bridge/assets/js/ifnex-order-form.js` | ۱+۳ |
---
## ۱۵. Bootstrap (۱ فایل)
## ۱۵. وردپرس — قالب IFNEX
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `bootstrap/app.php` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `ifnex/style.css` | ۱ |
| 2 | `ifnex/functions.php` | ۱ |
| 3 | `ifnex/header.php` | ۱ |
| 4 | `ifnex/footer.php` | ۱ |
| 5 | `ifnex/front-page.php` | ۱ |
| 6 | `ifnex/page.php` | ۱ |
| 7 | `ifnex/template-login.php` | ۱ |
| 8 | `ifnex/template-parts/hero.php` | ۱ |
| 9 | `ifnex/template-parts/services.php` | ۱ |
| 10 | `ifnex/template-parts/how-it-works.php` | ۱ |
| 11 | `ifnex/template-parts/stats.php` | ۱ |
| 12 | `ifnex/template-parts/testimonials.php` | ۱ |
| 13 | `ifnex/template-parts/cta.php` | ۱ |
| 14 | `ifnex/inc/customizer.php` | ۱ |
| 15 | `ifnex/inc/enqueue.php` | ۱ |
| 16 | `ifnex/assets/css/main.css` | ۱ |
| 17 | `ifnex/assets/js/main.js` | ۱ |
---
## ۱۶. Environment (۱ فایل)
## ۱۶. Seeders
| # | آدرس مقصد در پروژه Laravel |
|---|---|
| 1 | `.env.example` |
| # | فایل | فاز |
|---|------|-----|
| 1 | `database/seeders/DatabaseSeeder.php` | ۰ |
| 2 | `database/seeders/CountriesTableSeeder.php` | ۰ |
| 3 | `database/seeders/SystemSettingSeeder.php` | ۰ |
---
## ⚠️ فایل‌هایی که باید حذف شوند (قدیمی)
| # | آدرس | دلیل |
|---|---|---|
| 1 | `01_Documents/PRD_v2.md` | قدیمی — فقط ۲ زون و ۲ نوع سرویس |
| 2 | `01_Documents/Project_Roadmap.md` | قدیمی — نقشه راه ۳ فازی (الان ۴ فازی) |
---
## ⚠️ فایل‌هایی که باید دستی اصلاح شوند
| # | فایل | تغییر |
|---|---|---|
| 1 | `composer.json` | `"laravel/framework": "^12.0"``"^11.0"` |
| 2 | `composer.json` | اضافه کردن `"morilog/jalali": "^5.*"` |
| 3 | `bootstrap/providers.php` | اضافه کردن `App\Providers\AdminPanelProvider::class` |
| 4 | فونت Vazirmatn | نصب: `npm install @fontsource/vazirmatn` یا CDN |
---
> مجموع: **۵۶ فایل** قابل دانلود + **۴ تغییر دستی**
> مجموع تقریبی: **۱۰۰+ فایل** بین لاراول و وردپرس

View File

@ -1,450 +1,291 @@
# چک‌لیست فاز ۰ — IFNEX Phase 0 Checklist
# چک‌لیست فاز ۰ — IFNEX Phase 0 Checklist
> **مرجع:** Phase0_Proposal.docx + EXCEL_ANALYSIS.md + STATUS.md
> **تاریخ:** August 2026
> **وضعیت:** در دست اقدام
> **توسعه‌دهنده:** VernaSoft Group — Kazem Alghasi
> **وضعیت:** فاز ۰ تکمیل شده + فاز ۱/۲ بخشی انجام شده
> **توسعه‌دهنده:** VernaSoft Group — Kazem Alghasi
> **آخرین بروزرسانی:** 2026-08-29
---
## 🔴 بخش ۱: اصلاح اسکیمای دیتابیس (حیاتی — قبل از هر چیز)
## وضعیت کلی
| فاز | وضعیت | درصد |
|------|-------|------|
| فاز ۰ (پایه) | تکمیل شده | 100% |
| فاز ۱ (پنل مشتری) | انجام شده | 100% |
| فاز ۲ (پرداخت و کیف پول) | انجام شده | 100% |
| فاز ۳ (یکپارچه‌سازی) | در دست اقدام | 60% |
---
## بخش ۱: اصلاح اسکیمای دیتابیس
### 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)`)
- [x] حذف `export_zone` و `import_zone` (۲ زون قدیمی)
- [x] اضافه کردن `export_zone_parcel` (TINYINT 1-10)
- [x] اضافه کردن `export_zone_doc` (TINYINT 1-10)
- [x] اضافه کردن `import_zone_parcel` (TINYINT 1-10)
- [x] اضافه کردن `import_zone_doc` (TINYINT 1-10)
- [x] اضافه کردن `iso_code` (CHAR(2) UNIQUE)
- [x] اضافه کردن `is_active` (BOOLEAN default true)
- [x] اضافه کردن `calling_code` (VARCHAR 10 NULL) — فاز ۲
- [x] اصلاح `name` — بدون کد ISO در پرانتز
### 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 کردن
- [x] حذف `forwarder_track_id` (جایگزین با جدول مجزا)
- [x] تغییر `type` از STRING به ENUM: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [x] تغییر `direction` از STRING به ENUM: `import`, `export`
- [x] تغییر `status` از STRING به ENUM (وضعیت‌های استاندارد)
- [x] اضافه کردن `from_country_id` (FK → countries.id)
- [x] اضافه کردن `to_country_id` (FK → countries.id)
- [x] اضافه کردن فیلدهای مالی: `domestic_pickup`, `domestic_delivery`, `warehousing_cost`, `vat_amount`
- [x] تبدیل فیلدهای غیرضروری به `nullable`
- [x] اضافه کردن `state_notes` (فیلد وضعیت و یادداشت مشتری) — فاز ۲
- [x] اضافه کردن `cod_amount` (مبلغ COD) — فاز ۲
- [x] رابطه `packages()` و `statusHistories()` — فاز ۲
### 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.3 ایجاد Migration `shipment_carrier_mappings`
- [x] تمام فیلدها طبق طرح اولیه
- [x] RelationManager در Filament با CRUD کامل
### 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.4 ایجاد Migration `shipment_tracking_events`
- [x] تمام فیلدها طبق طرح اولیه
- [x] اضافه کردن فیلد `source` (manual/api/system) — فاز ۲
- [x] RelationManager در Filament با CRUD کامل
### 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`
- [x] تغییر به ساختار key-value
### 1.6 بازنویسی Migration `users`
- [ ] اضافه کردن `phone` (VARCHAR 20 NULL)
- [ ] اضافه کردن `role` (ENUM: super_admin, tracking_operator, data_entry, customer)
- [ ] اضافه کردن `is_active` (BOOLEAN default true)
- [x] اضافه کردن `phone`, `role`, `is_active`
### 1.7 اصلاح Migration `shipping_rates`
- [ ] تغییر `type` از STRING به ENUM: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] تغییر `direction` از STRING به ENUM: `import`, `export`
- [x] تغییر `type` و `direction` به ENUM
### 1.8 جداول جدید فاز ۱
- [x] `currencies` — جدول ارزها (code, name, symbol, rate_to_rial, rate_to_aed, is_active)
- [x] `shipment_packages` — بسته‌های چندگانه هر مرسوله (package_no, weight, dimensions)
- [x] `shipment_status_histories` — تاریخچه تغییرات وضعیت (from_status, to_status, reason, changed_by)
- [x] `wallets` — کیف پول کاربران
- [x] `wallet_transactions` — تراکنش‌های کیف پول
- [x] `notifications` — نوتیفیکیشن‌های دیتابیس (Laravel default)
---
## 🟡 بخش ۲: اصلاح و ایجاد Model ها
## بخش ۲: 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`
- [x] `Country.php` — با ۴ زون + iso_code + calling_code + is_active
- [x] `Shipment.php` — با enum casts + روابط کامل + packages + statusHistories
- [x] `ShipmentCarrierMapping.php` — با relation + enum casts
- [x] `ShipmentTrackingEvent.php` — با relation + enum casts + source
- [x] `ShipmentItem.php` — با relation
- [x] `ShipmentPackage.php` — با belongsTo(Shipment) — فاز ۲
- [x] `ShipmentStatusHistory.php` — با booted auto-fill changed_by — فاز ۲
- [x] `ShippingRate.php` — با enum casts
- [x] `SystemSetting.php` — با get/set متدها
- [x] `User.php` — با role + is_active + wallet relation
- [x] `Currency.php` — با fillable + casts — فاز ۲
- [x] `Wallet.php` — فاز ۲
- [x] `WalletTransaction.php` — فاز ۲
---
## 🟡 بخش ۳: Seeders
## بخش ۳: 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
- [x] `CountriesTableSeeder.php` — با ۴ زون مجزا
- [x] `SystemSettingSeeder.php` — با ساختار key-value
- [x] `DatabaseSeeder.php` — با User اولیه super_admin
---
## 🟢 بخش ۴: API و Controller ها
## بخش ۴: 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 با پیام مناسب
### ۴.۱ API ترکینگ
- [x] `GET /api/v1/track/{awb_no}` — تایم‌لاین کامل
- [x] `TrackController.php` — با timeline + carrier mappings
### 4.2 اصلاح `PricingController.php`
- [ ] تغییر `type` validation به ۳ مقدار: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- [ ] اضافه کردن API Key authentication middleware
- [ ] اضافه کردن Rate Limiting (60 req/min)
- [ ] تغییر مسیر به `POST /api/calculate-price` (در فاز ۱)
### ۴.۲ API قیمت‌گذاری
- [x] `POST /api/v1/calculate` — با ۳ نوع سرویس + VAT + هزینه‌های جانبی
- [x] `PricingController.php` — با API Key + Rate Limiting
### 4.3 تنظیمات امنیتی API
- [ ] ایجاد Middleware برای API Key (header: `Authorization: Bearer {key}`)
- [ ] تنظیم Rate Limiting در `RouteServiceProvider`
- [ ] تنظیم CORS در `config/cors.php` — فقط دامنه‌ی وردپرس تولیدی
- [ ] اعتبارسنجی ورودی‌ها با Form Request
### ۴.۳ API احراز هویت
- [x] `POST /api/v1/auth/login` — ورود با email + password
- [x] `POST /api/v1/auth/logout` — خروج ( Sanctum)
- [x] `POST /api/v1/bridge/login` — Bridge Auth (WordPress → Laravel)
### 4.4 اصلاح `routes/api.php`
- [ ] اضافه کردن `GET /api/track/{awb_no}` (فاز ۰)
- [ ] گروه‌بندی مسیرها با middleware (api_key + throttle)
- [ ] حفظ `GET /api/calculate-price` (فاز ۱)
### ۴.۴ API پنل مشتری (فاز ۱/۲)
- [x] `GET /api/v1/customer/profile` — پروفایل و آمار
- [x] `GET /api/v1/customer/countries` — لیست کشورها
- [x] `GET /api/v1/customer/orders` — لیست سفارشات
- [x] `POST /api/v1/customer/orders` — ثبت سفارش
- [x] `GET /api/v1/customer/orders/{shipment}` — جزئیات سفارش
- [x] `POST /api/v1/customer/orders/{shipment}/cancel` — لغو سفارش
- [x] `POST /api/v1/customer/orders/{shipment}/pay-wallet` — پرداخت از کیف پول
- [x] `POST /api/v1/customer/orders/{shipment}/pay-gateway` — پرداخت از درگاه
- [x] `GET /api/v1/customer/notifications` — نوتیفیکیشن‌ها — فاز ۲
- [x] `POST /api/v1/customer/notifications/{id}/read` — خواندن نوتیفیکیشن — فاز ۲
### ۴.۵ API کیف پول (فاز ۲)
- [x] `GET /api/v1/wallet/balance` — موجودی
- [x] `GET /api/v1/wallet/transactions` — تراکنش‌ها
### ۴.۶ API پرداخت (فاز ۲)
- [x] `POST /api/v1/payment/redirect` — انتقال به درگاه
- [x] `GET /api/v1/payment/check/{transaction}` — بررسی وضعیت
- [x] Mock Gateway (شبیه‌سازی درگاه پرداخت)
---
## 🟢 بخش ۵: Filament Admin Panel
## بخش ۵: Filament Admin Panel
### 5.1 بازنویسی `CountryResource.php`
- [ ] اضافه کردن فیلدهای ۴ زون در فرم
- [ ] اضافه کردن فیلد `iso_code`
- [ ] اضافه کردن فیلد `is_active` (toggle)
- [ ] نمایش ۴ زون در جدول
### ۵.۱ منابع (Resources)
- [x] `CountryResource` — با ۴ زون + iso_code + calling_code + is_active
- [x] `ShipmentResource` — با ستون‌های جدید + CSV export +Packages Repeater + changeStatus bulkAction
- [x] `ShippingRateResource` — با ۳ نوع سرویس
- [x] `CurrencyResource` — CRUD ارزها — فاز ۲
### 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)
### ۵.۲ RelationManagers
- [x] `TrackingEventsRelationManager` — با فیلد `source` — فاز ۲
- [x] `CarrierMappingsRelationManager` — با CRUD کامل
- [x] `ItemsRelationManager` — اقلام مرسوله
### 5.3 ایجاد `ShipmentCarrierMappingResource.php` (یا RelationManager)
- [ ] فرم افزودن نگاشت شرکت حمل:
- [ ] Select `carrier_code` (۸ گزینه + OTHER)
- [ ] `carrier_tracking_number`
- [ ] `booking_number` (nullable)
- [ ] `direction` (import/export)
- [ ] `notes` (nullable)
- [ ] نمایش در صفحه‌ی مرسوله به‌صورت RelationManager
### ۵.۳ صفحات سفارشی
- [x] `SettingsPage` — تنظیمات key-value
- [x] `PriceTestPage` — تست قیمت‌گذاری
- [x] `ImportRatesPage` — آپلود اکسل نرخ‌ها + دانلود template — فاز ۲
### 5.4 ایجاد `ShipmentTrackingEventResource.php` (یا RelationManager) ⭐ حیاتی
- [ ] UX اختصاصی اپراتور ترکینگ:
- [ ] جستجوی سریع با کد AWB
- [ ] فرم افزودن رویداد:
- [ ] `event_date` (پیش‌فرض: امروز)
- [ ] `event_time` (پیش‌فرض: اکنون)
- [ ] `delivery_status` (Select از لیست ۸-۱۰ حالت آماده)
- [ ] `location` (متن ساده)
- [ ] `event_description` (متن ساده)
- [ ] `source` (hidden — پیش‌فرض: manual)
- [ ] دکمه «ذخیره و افزودن بعدی» — برای ثبت سریع چند رویداد
- [ ] نمایش تایم‌لاین رویدادها در صفحه‌ی مرسوله
### ۵.۴ PDF
- [x] `PdfService` — با loadMissing (packages, fromCountry, toCountry, items)
- [x] `awb.blade.php` — با asset() برای تصاویر + جدول بسته‌ها
- [x] `label.blade.php` — با asset() برای تصاویر
- [x] `invoice.blade.php` — فاکتور
### 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 یا دستی)
### ۵.۵ نوتیفیکیشن ادمین
- [x] `ShipmentUpdatedNotification` — با لیست فیلدهای تغییر کرده
- [x] `afterSave` hook در ShipmentResource — ارسال نوتیفیکیشن
---
## 🟢 بخش ۶: Services
## بخش ۶: 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)` — مرسوله + رویدادها + نگاشت‌ها
- [x] `PriceCalculatorService.php` — با ۴ زون + ۳ نوع + VAT + هزینه‌های جانبی
- [x] `TrackingService.php` — تایم‌لاین + افزودن رویداد
- [x] `PdfService.php` — تولید PDF (AWB, Label, Invoice)
- [x] `OrderPaymentService.php` — پرداخت از کیف پول و درگاه — فاز ۲
---
## 🔵 بخش ۷: Import و مهاجرت داده
## بخش ۷: 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 تست مهاجرت
- [ ] مقایسه تعداد رکوردهای مهاجرت‌داده‌شده با اکسل
- [ ] نمونه‌گیری ۵۰ رکورد برای بررسی دقیق
- [ ] تست مهاجرت حداقل ۱۰ مرسوله با رویداد ترکینگ
- [x] `OldShipmentsImport.php` — مهاجرت ۳۹۵۰ رکورد تاریخی
- [x] `ShippingRatesImport.php` — ایمپورت نرخ‌ها (بدون SystemSetting)
- [x] `ShippingRatesTemplateExport.php` — دانلود template اکسل (FromArray)
---
## 🔵 بخش ۸: پلاگین وردپرس IFNEX Bridge
## بخش ۸: پلاگین وردپرس 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`
### ۸.۱ ساختار پلاگین
- [x] `ifnex-bridge.php` — فایل اصلی پلاگین
- [x] `includes/api-client.php` — ارتباط با API (قدیمی)
- [x] `includes/user-bridge.php` — Bridge Auth + API احراز‌شده
- [x] `includes/shortcodes.php` — تمام شورت‌کدها
- [x] `includes/tracking-form.php` — فرم رهگیری (قدیمی)
- [x] `assets/css/ifnex-orders.css` — استایل کامل (v1.6.0)
- [x] `assets/css/ifnex-bridge.css` — استایل ترکینگ
- [x] `assets/js/ifnex-order-form.js` — فرم سفارش + هشدار آدرس انگلیسی
### 8.2 شورت‌کد رهگیری مرسوله ⭐ حیاتی
- [ ] `[ifnex_tracking_form]` — فرم جستجوی کد AWB
- [ ] ارسال درخواست به `GET /api/track/{awb_no}` لاراول
- [ ] نمایش تایم‌لاین رویدادها (طراحی شبیه DHL)
- [ ] نمایش اطلاعات پایه مرسوله
- [ ] نمایش خطای «مرسوله پیدا نشد» اگر AWB معتبر نباشد
- [ ] لودینگ و UX روان
### ۸.۲ شورت‌کدها
- [x] `[ifnex_tracking_form]` — فرم رهگیری مرسوله
- [x] `[ifnex_tracking_status]` — نمایش مستقیم وضعیت
- [x] `[ifnex_wallet_balance]` — موجودی کیف پول
- [x] `[ifnex_transactions]` — تاریخچه تراکنش‌ها (با استایل جدید)
- [x] `[ifnex_user_profile]` — پروفایل مشتری
- [x] `[ifnex_orders_list]` — لیست سفارشات
- [x] `[ifnex_order_form]` — فرم ثبت سفارش چند مرحله‌ای
- [x] `[ifnex_order_payment]` — صفحه پرداخت
- [x] `[ifnex_order_detail]` — جزئیات سفارش
- [x] `[ifnex_customer_dashboard]` — پنل جامع مشتری (داشبورد + سفارشات + کیف پول + تراکنش‌ها + اعلان‌ها + رهگیری + پروفایل)
### 8.3 شورت‌کد استعلام قیمت (ساده — فاز ۰)
- [ ] `[ifnex_price_inquiry]` — فرم دریافت شماره موبایل + اطلاعات اولیه
- [ ] نمایش پیام «کارشناس ما تماس می‌گیرد»
- [ ] ذخیره اطلاعات برای پیگیری
### ۸.۳ استایل تراکنش‌ها — فاز ۲
- [x] استایل کامل برای `.ifnex-transactions-*` — مطابق دشبورد مدرن
### 8.4 امنیت پلاگین
- [ ] API Key در تنظیمات پلاگین (نه هاردکد)
- [ ] sanitize_text_field برای تمام ورودی‌ها
- [ ] esc_html و esc_attr برای خروجی‌ها
- [ ] Nonce برای فرم‌ها
### ۸.۴ هشدار آدرس انگلیسی — فاز ۲
- [x] تشخیص متن انگلیسی در آدرس (sender + receiver)
- [x] نمایش هشدار اسلایدی با انیمیشن
### ۸.۵ نوتیفیکیشن پنل کاربری — فاز ۲
- [x] تب اعلان‌ها در دشبورد
- [x] بج تعداد خوانده‌نشده در سایدبار
- [x] لیست نوتیفیکیشن‌ها با استایل مدرن
- [x] لینک به سفارش مرتبط
- [x] API لاراول برای دریافت/خواندن نوتیفیکیشن
---
## 🔵 بخش ۹: وب‌سایت وردپرس
## بخش ۹: وب‌سایت وردپرس
### 9.1 نصب و راه‌اندازی
- [ ] نصب وردپرس روی هاست مشتری
- [ ] تنظیمات امنیتی (HTTPS، فایروال، محدودیت ورود)
- [ ] نصب و تنظیم قالب (light mode، RTL-friendly، DHL-inspired)
### ۹.۱ قالب IFNEX
- [x] نصب و تنظیم قالب سفارشی
- [x] front-page.php — لندینگ پیج
- [x] header.php / footer.php
- [x] template-parts (hero, services, how-it-works, stats, testimonials, cta)
- [x] template-login.php — صفحه ورود
### 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 (آماده برای آینده)
- [ ] تست سرعت بارگذاری (< ۳ ثانیه)
### ۹.۲ صفحات
- [x] لندینگ پیج
- [x] صفحه رهگیری
- [x] صفحه استعلام قیمت (PricingPageController)
---
## 🔵 بخش ۱۰: اصلاحات فنی عمومی
## بخش ۱۰: موارد اخیر فاز ۳ (۱۷ مورد کارفرما)
### 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)
- [x] ۱. رفع `openUrlInNewTab()` روی اکشن‌های PDF در ViewShipment
- [x] ۲. رفع `ShippingRatesImport` (حذف SystemSetting + تبدیل ارز)
- [x] ۳. رفع تصاویر PDF (asset() بجای public_path())
- [x] ۴. رفع label.blade.php تصاویر
- [x] ۵. ستون‌های جدید ShipmentResource (fromCountry, toCountry, route, phones, cod_amount)
- [x] ۶. حذف reason_for_export تکراری
- [x] ۷. رفع CSV label ($status?->label())
- [x] ۸. Packages Repeater (collapsible)
- [x] ۹. changeStatus به عنوان bulkAction
- [x] ۱۰. afterSave hook برای ShipmentUpdatedNotification
- [x] ۱۱. Currency CRUD (Resource + Pages + Migration + Model)
- [x] ۱۲. RelationManagers (Create/Edit/Delete) + فیلد source
- [x] ۱۳. سیستم نوتیفیکیشن دیتابیس
- [x] ۱۴. Multi-package (migration + model + PDF)
- [x] ۱۵. ImportRatesPage (دکمه‌ها + دانلود template + ایمپورت)
- [x] ۱۶. استایل تراکنش‌های وردپرس
- [x] ۱۷. هشدار انگلیسی بودن آدرس
- [x] ۱۸. نوتیفیکیشن پنل کاربری وردپرس (تب + API + CSS)
- [ ] ۱۹. سیستم نمایندگی (طرح مطالعاتی آماده — منتظر تصمیم کارفرما)
---
## 📋 بخش ۱۱: مستندات
## بخش ۱۱: مستندات
- [ ] راهنمای نصب پروژه (Installation Guide)
- [x] IFNEX_Phase0_Checklist.md (همین فایل)
- [x] IFNEX_File_Map.md — نقشه فایل‌های پروژه
- [x] IFNEX_Roadmap.md — نقشه راه جامع ۴ فازی
- [ ] راهنمای اپراتور (Operator Manual) با اسکرین‌شات
- [ ] مستندات API (مسیرها، پارامترها، نمونه پاسخ‌ها)
- [ ] جلسه آموزشی ۴ ساعته برای اپراتورها
- [ ] مستندات API (OpenAPI/Swagger)
---
## 📅 بخش ۱۲: جدول زمانی (۴ هفته)
## خط قرمزها — هرگز این کارها را نکن
| هفته | زیرفاز ۰.الف (وردپرس) | زیرفاز ۰.ب (لاراول) | خروجی |
|------|------------------------|----------------------|-------|
| **هفته ۱** | نصب وردپرس + انتخاب قالب + صفحات اصلی | اصلاح Migration ها + Model ها + Seeders | محیط آماده + جداول دیتابیس |
| **هفته ۲** | لندینگ پیج + صفحات ثابت + وبلاگ | API ترکینگ + TrackController + Filament ترکینگ | صفحات آماده + API قابل تست |
| **هفته ۳** | صفحه رهگیری + شورت‌کد + فرم استعلام | پنل Filament کامل + UX اپراتور + پلاگین Bridge | ترکینگ دستی فعال |
| **هفته ۴** | سئو + Polylang + تست | مهاجرت ۳۹۵۰ رکورد + تست نهایی + رفع باگ | تحویل فاز ۰ |
- هرگز جدول countries را به ۲ زون برگردانی
- هرگز فقط ۲ نوع سرویس پیاده کن (۳ نوع الزامی است)
- هرگز ترکینگ را در وردپرس پیاده کن
- هرگز فیلدهای مالی (VAT, Packing, Warehousing) را حذف کن
- هرگز از رنگ/لوگو DHL کپی کن
- هرگز PDF را به فارسی بسازی
- هرگز تاریخ را شمسی در DB ذخیره کنی
- هرگز از CORS `*` استفاده کنی
- هرگز فایل .env را در Git کامیت کنی
---
## 🚫 خط قرمزها — هرگز این کارها را نکن
- ❌ هرگز جدول countries را به ۲ زون برگردانی
- ❌ هرگز فقط ۲ نوع سرویس پیاده کن (۳ نوع الزامی است)
- ❌ هرگز ترکینگ را در وردپرس پیاده کن
- ❌ هرگز فیلدهای مالی (VAT, Packing, Warehousing) را حذف کن
- ❌ هرگز از رنگ/لوگو DHL کپی کن
- ❌ هرگز PDF را به فارسی بسازی
- ❌ هرگز تاریخ را شمسی در DB ذخیره کنی
- ❌ هرگز از CORS `*` استفاده کنی
- ❌ هرگز فایل .env را در Git کامیت کنی
- ❌ هرگز فاز ۱ را قبل از تأیید فاز ۰ شروع کنی
---
> © 2026 VernaSoft Group. Internal use only.
> 2026 VernaSoft Group. Internal use only.

View File

@ -0,0 +1,197 @@
# نقشه راه پروژه IFNEX
> **آخرین بروزرسانی:** 2026-08-29
> **توسعه‌دهنده:** VernaSoft Group — Kazem Alghasi
---
## خلاصه وضعیت
| فاز | عنوان | وضعیت | درصد |
|------|-------|--------|------|
| فاز ۰ | پایه و زیرساخت | تکمیل شده | 100% |
| فاز ۱ | پنل مشتری وردپرس | تکمیل شده | 100% |
| فاز ۲ | پرداخت و کیف پول | تکمیل شده | 100% |
| فاز ۳ | یکپارچه‌سازی و بهبود | در دست اقدام | 60% |
| فاز ۴ (آینده) | سیستم نمایندگی | مطالعاتی | 0% |
---
## فاز ۰ — پایه و زیرساخت ✅
**هدف:** ساخت زیرساخت API لاراول + پنل ادمین Filament + ترکینگ دستی
### انجام شده:
- دیتابیس کامل با ۴ زون مجزا + ۳ نوع سرویس
- Model ها با Enum casts و روابط کامل
- Seeders کشورها و تنظیمات
- API ترکینگ (`GET /api/v1/track/{awb}`)
- API قیمت‌گذاری (`POST /api/v1/calculate`)
- پنل Filament: Country, Shipment, ShippingRate Resources
- RelationManagers: TrackingEvents, CarrierMappings, Items
- صفحات سفارشی: Settings, PriceTest, ImportRates
- مهاجرت ۳۹۵۰ رکورد تاریخی
- ایمپورت/اکسپورت نرخ‌ها (Excel)
---
## فاز ۱ — پنل مشتری وردپرس ✅
**هدف:** ثبت سفارش، لیست سفارشات، جزئیات و رهگیری در سایت وردپرس
### انجام شده:
- Bridge Auth (وردپرس → لاراول بدون رمز عبور)
- شورت‌کدهای وردپرس: فرم سفارش چند مرحله‌ای، لیست سفارشات، جزئیات، پرداخت
- دشبورد جامع مشتری (داشبورد، سفارشات، کیف پول، تراکنش‌ها، اعلان‌ها، رهگیری، پروفایل)
- API مشتری: پروفایل، کشورها، سفارشات، لغو
- قالب سفارشی IFNEX برای وردپرس
---
## فاز ۲ — پرداخت و کیف پول ✅
**هدف:** سیستم پرداخت آنلاین و کیف پول
### انجام شده:
- جدول کیف پول و تراکنش‌ها
- API کیف پول (موجودی، تراکنش‌ها)
- پرداخت از کیف پول و درگاه بانکی
- Mock Gateway (شبیه‌سازی درگاه)
- سیستم ارز (Currency CRUD)
- Multi-package (بسته‌های چندگانه مرسوله)
- تاریخچه تغییرات وضعیت (ShipmentStatusHistory)
- نوتیفیکیشن دیتابیس (ادمین و مشتری)
---
## فاز ۳ — یکپارچه‌سازی و بهبود 🔄
**هدف:** اصلاحات کارفرما، بهبود UI/UX، استانداردسازی
### انجام شده (۱۷ مورد کارفرما):
1. رفع اکشن‌های PDF در ViewShipment
2. رفع ShippingRatesImport
3. رفع تصاویر PDF (asset بجای public_path)
4. ستون‌های جدید جدول Shipment
5. Packages Repeater در فرم
6. changeStatus به عنوان bulkAction
7. afterSave hook نوتیفیکیشن
8. Currency CRUD
9. فیلد source در TrackingEvents
10. ImportRatesPage (دکمه‌ها + template)
11. استایل تراکنش‌های وردپرس
12. هشدار آدرس انگلیسی
13. نوتیفیکیشن پنل کاربری وردپرس
### باقی‌مانده:
- [ ] سیستم نمایندگی (طرح مطالعاتی آماده)
- [ ] مستندات API (OpenAPI/Swagger)
- [ ] راهنمای اپراتور
- [ ] تست‌های واحد و Integration
- [ ] بهبود سئو وب‌سایت وردپرس
---
## فاز ۴ (آینده) — سیستم نمایندگی 📋
**وضعیت:** طرح مطالعاتی آماده — منتظر تصمیم کارفرما
### مدل‌های پیشنهادی:
| مدل | توضیح | پیچیدگی |
|-----|-------|---------|
| A) کد معرف ساده | هر کاربر یه کد معرف داره، درصدی از سود به معرف میرسه | کم |
| B) نمایندگی کامل | پنل جداگانه، گزارش فروش، کمیسیون | متوسط |
| C) زیرعامل‌دهی | نماینده زیرمجموعه تعریف می‌کنه (چند سطحی) | زیاد |
**پیشنهاد:** شروع با مدل B و امکان ارتقا به C
### جداول دیتابیس پیشنهادی:
- `agents` — اطلاعات نماینده (agent_code, commission_rate, parent_agent_id)
- `agent_customers` — تخصیص مشتریان به نماینده
- `agent_commissions` — محاسبه و پرداخت کمیسیون‌ها
### فازهای پیاده‌سازی:
1. جداول + مدل + ثبت‌نام با کد معرف
2. محاسبه خودکار کمیسیون هنگام ثبت سفارش
3. پنل نماینده در Filament (گزارش‌ها + تسویه)
4. لینک معرف اختصاصی + صفحه لندینگ ثبت‌نام
---
## معماری پروژه
```
┌─────────────────────────────────────────────────┐
│ کاربر نهایی │
│ (مرورگر وب / موبایل) │
└──────────────────┬──────────────────────────────┘
┌──────────▼──────────┐
│ وب‌سایت وردپرس │
│ (ifnex.vernahost.ir) │
│ │
│ ─ قالب IFNEX │
│ ─ پلاگین IFNEX │
│ Bridge │
│ ─ دشبورد مشتری │
│ ─ فرم سفارش │
│ ─ صفحه پرداخت │
└──────────┬──────────┘
│ API (Sanctum/Bridge)
┌──────────▼──────────┐
│ API لاراول │
│ (api.ifnex.vernahost) │
│ │
│ ─ قیمت‌گذاری │
│ ─ سفارشات مشتری │
│ ─ کیف پول │
│ ─ پرداخت │
│ ─ نوتیفیکیشن │
└──────────┬──────────┘
┌──────────▼──────────┐
│ پنل ادمین Filament │
│ (api.ifnex.vernahost) │
│ /panel │
│ │
│ ─ مرسولات │
│ ─ نرخ‌ها │
│ ─ کشورها │
│ ─ ارزها │
│ ─ ترکینگ │
│ ─ تنظیمات │
└─────────────────────┘
```
---
## تکنولوژی‌ها
| لایه | تکنولوژی |
|------|---------|
| بک‌اند | Laravel 11 + PHP 8.2 |
| پنل ادمین | Filament 3.x |
| فرانت‌اند | WordPress + قالب سفارشی |
| پرداخت | Mock Gateway + آماده برای Zarinpal/IDPay |
| PDF | Dompdf |
| Excel | maatwebsite/excel |
| بارکد | picqer/php-barcode-generator |
| تاریخ | morilog/jalali |
| احراز هویت | Laravel Sanctum + Bridge Auth |
| دیتابیس | MySQL |
| سرور | HestiaCP + SSH |
---
## محیط‌ها
| محیط | دامنه | وضعیت |
|------|-------|--------|
| تست/تولید | api.ifnex.vernahost.ir | فعال |
| تست/تولید | ifnex.vernahost.ir | فعال |
| لوکال | localhost:8000 | توسعه |
---
> 2026 VernaSoft Group. Internal use only.