From 6a4a619261ca59a8e5a586fc758c216767587af5 Mon Sep 17 00:00:00 2001 From: Kazem Alghasi Date: Fri, 28 Aug 2026 22:04:01 +0330 Subject: [PATCH] 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 --- 01_Documents/IFNEX_File_Map.md | 298 +++++++------ 01_Documents/IFNEX_Phase0_Checklist.md | 587 +++++++++---------------- 01_Documents/IFNEX_Roadmap.md | 197 +++++++++ 3 files changed, 575 insertions(+), 507 deletions(-) create mode 100644 01_Documents/IFNEX_Roadmap.md diff --git a/01_Documents/IFNEX_File_Map.md b/01_Documents/IFNEX_File_Map.md index a958be5..5b6b984 100644 --- a/01_Documents/IFNEX_File_Map.md +++ b/01_Documents/IFNEX_File_Map.md @@ -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 | - ---- - -> مجموع: **۵۶ فایل** قابل دانلود + **۴ تغییر دستی** +> مجموع تقریبی: **۱۰۰+ فایل** بین لاراول و وردپرس diff --git a/01_Documents/IFNEX_Phase0_Checklist.md b/01_Documents/IFNEX_Phase0_Checklist.md index 360f49a..a99aa70 100644 --- a/01_Documents/IFNEX_Phase0_Checklist.md +++ b/01_Documents/IFNEX_Phase0_Checklist.md @@ -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. diff --git a/01_Documents/IFNEX_Roadmap.md b/01_Documents/IFNEX_Roadmap.md new file mode 100644 index 0000000..07dfe2f --- /dev/null +++ b/01_Documents/IFNEX_Roadmap.md @@ -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.