docs(project): update project status, roadmap, and documentation

Update project documentation to reflect the completion of Phase 0 and Phase 1, and the commencement of Phase 2. This includes archiving obsolete documents, updating the README with a new architectural overview, and refining the project checklist and status reports.

- Archive obsolete PRD and Roadmap documents
- Update `IFNEX_Phase0_Checklist.md` with completed tasks and Phase 2 roadmap
- Update `STATUS.md` with recent development progress for August 2026
- Refactor `04_Laravel/README.md` to include detailed technical specifications and architecture diagrams
- Update root `README.md` with updated versioning and system architecture visualization
- Refine `PriceCalculatorServiceTest.php` to align with updated service output structures
This commit is contained in:
Kazem Alghasi 2026-08-07 05:58:12 +03:30
parent abae820070
commit 285acdae89
8 changed files with 640 additions and 240 deletions

View File

@ -168,12 +168,24 @@
| # | کار | اولویت | وضعیت | | # | کار | اولویت | وضعیت |
|---|-----|--------|-------| |---|-----|--------|-------|
| F1.1 | تست کامل `PriceCalculatorService` با داده‌های واقعی | 🔴 بالا | pending | | F1.1 | تست کامل `PriceCalculatorService` با داده‌های واقعی | 🔴 بالا | ✅ انجام شد (2026-08-07) |
| F1.2 | تکمیل جدول `shipping_rates` | 🟡 متوسط | ۴۰۴ رکورد import شد | | F1.2 | تکمیل جدول `shipping_rates` | 🟡 متوسط | ✅ انجام شد - ۴۰۴ رکورد import شد |
| F1.3 | فرم ثبت سفارش آنلاین با ۹ ردیف کالای گمرکی | 🟡 متوسط | pending | | F1.3 | فرم ثبت سفارش آنلاین با ۹ ردیف کالای گمرکی | 🟡 متوسط | ⏳ pending |
| F1.4 | تولید PDF: AWB، INVOICE، Label | 🟡 متوسط | pending | | F1.4 | تولید PDF: AWB، INVOICE، Label | 🟡 متوسط | ⏳ pending |
| F1.5 | ماژول ایمپورت اکسل تعرفه‌ها | 🟢 پایین | pending | | F1.5 | ماژول ایمپورت اکسل تعرفه‌ها | 🟢 پایین | ✅ انجام شد |
| F1.6 | صفحه استعلام قیمت واقعی | 🟢 پایین | pending | | F1.6 | صفحه استعلام قیمت واقعی | 🟢 پایین | ✅ انجام شد |
### کارهای فاز ۲ (شروع شده - 2026-08-05)
| # | کار | اولویت | وضعیت |
|---|-----|--------|-------|
| F2.1 | ساخت `WalletController` با APIها | 🔴 بالا | ✅ انجام شد |
| F2.2 | ساخت `DiscountCodeController` با APIها | 🔴 بالا | ✅ انجام شد |
| F2.3 | ساخت `UpdateExchangeRates` Artisan Command | 🟡 متوسط | ✅ انجام شد |
| F2.4 | ثبت routeهای کیف پول و تخفیف | 🟡 متوسط | ✅ انجام شد |
| F2.5 | اتصال درگاه پرداخت (زرین‌پال) | 🔴 بالا | ⏳ pending |
| F2.6 | شارژ آنلاین کامل | 🔴 بالا | ⏳ pending |
| F2.7 | پنل مالی در Filament | 🟡 متوسط | ⏳ pending |
--- ---

View File

@ -497,4 +497,27 @@ IFNEX-Logistics/
--- ---
### کارهای انجام‌شده اخیر (آگوست ۲۰۲۶)
#### ۲۰۲۶-۰۸-۰۷ (امروز)
[x] **refactor(api): improve pricing logic و add test coverage**
- به‌روزرسانی `ShippingRatesImport` برای استفاده از 'outbound' و 'inbound'
- Refactor `PriceCalculatorService` با ساختار ماژولارتر
- به‌روزرسانی مدل `ShippingRate` با Property Casting برای zones
- اضافه شدن `HasFactory` به مدل‌های `Country` و `ShippingRate`
- اضافه شدن Factories جدید برای تست
- پیاده‌سازی تست‌های Feature و Service برای `PriceCalculatorService`
- ✅ تمام تست‌ها پاس شدند
#### ۲۰۲۶-۰۸-۰۵ (دیروز)
[x] **refactor(api): expose wallet و discount endpoints**
- ساخت `WalletController` با APIهای شارژ، بررسی موجودی و تاریخچه
- ساخت `DiscountCodeController` با APIهای لیست و اعتبارسنجی
- ساخت `UpdateExchangeRates` Artisan Command
- ثبت routeهای کیف پول و تخفیف در `api.php`
- پاک‌سازی فایل‌های تست و debug
- رفع CORS - تغییر از `*` به دامنه مشخص
© 2026 VernaSoft Group. Internal use only. © 2026 VernaSoft Group. Internal use only.

View File

@ -1 +1 @@
{"version":2,"defects":{"Tests\\Feature\\Api\\PricingControllerTest::it_can_calculate_pricing_with_valid_data":5,"Tests\\Feature\\Api\\PricingControllerTest::it_returns_validation_errors_for_invalid_data":7,"Tests\\Feature\\Services\\PriceCalculatorServiceTest::it_calculates_price_correctly_for_standard_package":8},"times":{"Tests\\Feature\\Api\\PricingControllerTest::it_can_calculate_pricing_with_valid_data":0.107,"Tests\\Feature\\Api\\PricingControllerTest::it_returns_validation_errors_for_invalid_data":0.052,"Tests\\Feature\\Services\\PriceCalculatorServiceTest::it_calculates_price_correctly_for_standard_package":0.055}} {"version":2,"defects":{"Tests\\Feature\\Api\\PricingControllerTest::it_can_calculate_pricing_with_valid_data":5,"Tests\\Feature\\Api\\PricingControllerTest::it_returns_validation_errors_for_invalid_data":7,"Tests\\Feature\\Services\\PriceCalculatorServiceTest::it_calculates_price_correctly_for_standard_package":8},"times":{"Tests\\Feature\\Api\\PricingControllerTest::it_can_calculate_pricing_with_valid_data":0.107,"Tests\\Feature\\Api\\PricingControllerTest::it_returns_validation_errors_for_invalid_data":0.052,"Tests\\Feature\\Services\\PriceCalculatorServiceTest::it_calculates_price_correctly_for_standard_package":0.069}}

View File

@ -1,150 +1,480 @@
# IFNEX Logistics — Backend (Laravel 11)
> بخش بک‌اند سیستم لجستیک ایف‌نکس. این پوشه به تنهایی یک اپلیکیشن لاراول ۱۱ کامل است.
--- ---
## 🚀 راه‌اندازی سریع ## 📄 فایل ۲: `04_Laravel/README.md` (پوشه لاراول)
```markdown
# 🚀 IFNEX Laravel Backend
> هسته مرکزی سیستم مدیریت لجستیک ایف‌نکس
| مورد | توضیحات |
| :--- | :--- |
| **نسخه لاراول** | Laravel 11.x |
| **نسخه PHP** | PHP 8.2+ |
| **پنل ادمین** | Filament 3.3.x |
| **دیتابیس** | MySQL 8+ |
| **تاریخ آخرین به‌روزرسانی** | 2026-08-07 |
---
## 📋 فهرست مطالب
1. [پیش‌نیازها](#پیشنیازها)
2. [نصب و راه‌اندازی](#نصب-و-راهاندازی)
3. [ساختار پوشه‌ها](#ساختار-پوشهها)
4. [API Endpoints](#api-endpoints)
5. [Artisan Commands](#artisan-commands)
6. [تست‌ها](#تستها)
7. [پیکربندی](#پیکربندی)
8. [نکات امنیتی](#نکات-امنیتی)
---
## پیش‌نیازها
قبل از شروع، مطمئن شوید که موارد زیر روی سیستم شما نصب هستند:
| ابزار | نسخه حداقل | نصب |
|-------|-----------|-----|
| PHP | 8.2+ | [دانلود](https://www.php.net/downloads) |
| Composer | 2.x | [دانلود](https://getcomposer.org/) |
| MySQL | 8+ | [دانلود](https://dev.mysql.com/downloads/) |
| Node.js & NPM | 18+ | [دانلود](https://nodejs.org/) (اختیاری - برای WordPress tools) |
| XAMPP/WAMP | آخرین نسخه | [دانلود](https://www.apachefriends.org/) (پیشنهادی برای Windows) |
---
## نصب و راه‌اندازی
### ۱. کلون مخزن و ورود به پوشه لاراول
```bash ```bash
# کلون مخزن
git clone https://www.git.vernahost.ir/gitmodir110/ifnex.git
# ورود به پوشه لاراول
cd ifnex/04_Laravel
۲. نصب پکیج‌های Composer
composer install composer install
۳. کپی فایل محیط و تنظیم دیتابیس
# کپی فایل محیط
cp .env.example .env cp .env.example .env
# ویرایش فایل .env و تنظیم اطلاعات دیتابیس
nano .env # یا هر ویرایشگر دلخواه
تنظیمات مهم در فایل .env:
# دیتابیس
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ifnex_db
DB_USERNAME=root
DB_PASSWORD=
# API Key برای ترکینگ
IFNEX_API_KEY=ifnex-local-dev-key
# CORS - فقط دامنه وردپرس
CORS_ALLOWED_ORIGINS=http://localhost:8080
# Rate Limiting
IFNEX_TRACKING_RATE_LIMIT=60
# Currency API (برای فاز ۲)
CURRENCY_API_KEY=your_api_key_here
۴. تولید کلید اپلیکیشن
php artisan key:generate php artisan key:generate
۵. ایجاد دیتابیس
# ورود به MySQL
mysql -u root -p
# ایجاد دیتابیس
CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;
۶. اجرای Migration ها
php artisan migrate --force php artisan migrate --force
۷. درج داده‌های اولیه (Seeders)
# این دستور ۲۳۳ کشور + تنظیمات اولیه + کاربر ادمین را ایجاد می‌کند
php artisan db:seed --force php artisan db:seed --force
اطلاعات ورود پیش‌فرض به پنل ادمین:
URL: http://localhost:8000/admin
Email: admin@ifnex.local
Password: password (در Seeder تنظیم شده)
۸. اجرای سرور توسعه
php artisan serve php artisan serve
```
--- اکنون پروژه در http://localhost:8000 قابل دسترسی است.
## 📦 پکیج‌های اصلی
| پکیج | نسخه | نقش | ساختار پوشه‌ها
|------|------|-----|
| `laravel/framework` | ^11.0 | هسته فریم‌ورک |
| `filament/filament` | 3.3.* | پنل مدیریت ادمین |
| `maatwebsite/excel` | ^3.1 | ایمپورت اکسل |
| `barryvdh/laravel-dompdf` | ^3.1 | تولید PDF |
| `dompdf/dompdf` | ^3.0 | موتور تولید PDF |
| `morilog/jalali` | ^3.0 | تبدیل تاریخ شمسی/میلادی |
---
## 📁 ساختار کد
```
04_Laravel/ 04_Laravel/
├── app/ ├── app/
│ ├── Models/ # مدل‌های Eloquent │ ├── Models/ # مدل‌های Eloquent
│ ├── Enums/ # Enumهای سفارشی │ │ ├── Country.php # کشورها با ۴ زون
│ ├── Services/ # PriceCalculatorService, PdfService, ... │ │ ├── Shipment.php # مرسولات
│ │ ├── ShipmentItem.php # اقلام گمرکی (۹ ردیف)
│ │ ├── ShippingRate.php # تعرفه‌های حمل
│ │ ├── ShipmentCarrierMapping.php # نگاشت کدهای ترکینگ
│ │ ├── ShipmentTrackingEvent.php # رویدادهای ترکینگ
│ │ ├── SystemSetting.php # تنظیمات سیستم
│ │ └── User.php # کاربران
│ │
│ ├── Enums/ # Enum ها
│ │ ├── ShipmentDirection.php # import/export
│ │ ├── ShipmentType.php # DOC_NORMAL/DOC_ECONOMY/PARCEL
│ │ ├── ShipmentStatus.php # ۷ وضعیت مرسوله
│ │ ├── CarrierCode.php # ۹ شرکت حمل
│ │ ├── TrackingSource.php # manual/api_carrier/api_aggregator
│ │ └── UserRole.php # ۴ نقش کاربری
│ │
│ ├── Services/ # لایه سرویس (Business Logic)
│ │ ├── PriceCalculatorService.php # ⭐ موتور قیمت‌گذاری
│ │ └── TrackingService.php # سرویس ترکینگ
│ │
│ ├── Http/ │ ├── Http/
│ │ ├── Controllers/ │ │ ├── Controllers/
│ │ │ ├── Api/ # PricingController, TrackController │ │ │ ├── Api/
│ │ │ ├── OrderController.php │ │ │ │ ├── TrackController.php # API ترکینگ
│ │ │ ├── PricingPageController.php │ │ │ │ ├── PricingController.php # API استعلام قیمت
│ │ │ └── ShipmentPdfController.php │ │ │ │ ├── WalletController.php # API کیف پول
│ │ ├── Middleware/ # ApiKeyMiddleware │ │ │ │ └── DiscountCodeController.php # API تخفیف
│ │ └── Requests/ # Form Request Validation │ │ │ ├── OrderController.php # فرم ثبت سفارش
│ ├── Imports/ # ShippingRatesImport │ │ │ ├── PricingPageController.php # صفحه استعلام قیمت
│ ├── Console/Commands/ # ImportShippingRates │ │ │ └── ShipmentPdfController.php # تولید PDF
│ └── Filament/ # پنل مدیریت │ │ ├── Middleware/
│ ├── Resources/ # Country, Shipment, ShippingRate, ShipmentItem │ │ │ └── ApiKeyMiddleware.php # احراز هویت API
│ └── Pages/ # Settings, Dashboard │ │ └── Requests/ # Form Request Validation
│ │
│ ├── Imports/ # Excel Imports
│ │ ├── ShippingRatesImport.php # واردات تعرفه‌ها
│ │ ├── HistoricalShipmentsImport.php # واردات مرسولات تاریخی
│ │ └── RateSheetImport.php # شیت‌های نرخ
│ │
│ ├── Console/Commands/ # Artisan Commands
│ │ ├── ImportShippingRates.php # واردات تعرفه‌ها
│ │ ├── ImportHistoricalData.php # واردات داده‌های تاریخی
│ │ └── UpdateExchangeRates.php # به‌روزرسانی نرخ ارز
│ │
│ └── Filament/ # پنل ادمین Filament
│ ├── Resources/
│ │ ├── CountryResource.php
│ │ ├── ShipmentResource.php
│ │ ├── ShippingRateResource.php
│ │ └── ShipmentItemResource.php
│ └── Pages/
│ └── IfnexSettingsPage.php # صفحه تنظیمات
├── database/ ├── database/
│ ├── migrations/ # ۷ migration فاز ۰ │ ├── migrations/ # Migration ها
│ └── seeders/ # seeders داده اولیه │ │ ├── 2026_08_02_000001_create_countries_table.php
│ │ ├── 2026_08_02_000002_create_shipments_table.php
│ │ ├── 2026_08_02_000003_create_shipping_rates_table.php
│ │ ├── 2026_08_02_000004_create_shipment_carrier_mappings_table.php
│ │ ├── 2026_08_02_000005_create_shipment_tracking_events_table.php
│ │ ├── 2026_08_02_000006_create_system_settings_table.php
│ │ └── 2026_08_02_000007_update_users_table.php
│ └── seeders/ # Seeders
│ ├── CountriesTableSeeder.php
│ ├── SystemSettingSeeder.php
│ └── DatabaseSeeder.php
├── routes/ ├── routes/
│ ├── web.php # /order, /pricing, PDF downloads │ ├── web.php # روت‌های وب (فرم‌ها و صفحات)
│ └── api.php # /api/v1/calculate, /api/v1/track/{awb} │ └── api.php # روت‌های API
└── config/
├── ifnex.php # تنظیمات اختصاصی ├── resources/views/
└── cors.php # تنظیمات CORS │ ├── layouts/app.blade.php # لایاوت اصلی
``` │ ├── orders/ # فرم ثبت سفارش
│ ├── pricing/ # صفحه استعلام قیمت
│ └── pdfs/ # قالب‌های PDF
├── config/
│ ├── ifnex.php # تنظیمات اختصاصی IFNEX
│ └── cors.php # تنظیمات CORS
├── tests/
│ └── Feature/
│ └── Services/
│ └── PriceCalculatorServiceTest.php # ⭐ تست‌های موتور قیمت
├── bootstrap/
│ └── app.php # Bootstrap لاراول ۱۱
├── .env.example # نمونه فایل محیط
├── composer.json # وابستگی‌های Composer
└── README.md # این فایل
---
## 🔌 API Endpoints API Endpoints
| روش | مسیر | توضیحات | 🔓 API های عمومی (نیاز به API Key)
|------|------|---------|
| POST | `/api/v1/calculate` | محاسبه قیمت حمل (بدون احراز هویت) |
| GET | `/api/v1/track/{awb_no}` | استعلام وضعیت مرسوله با API Key |
**درخواست نمونه محاسبه قیمت:** ۱. رهگیری مرسوله
```bash GET /api/v1/track/{awb_no}
Headers:
Authorization: Bearer {IFNEX_API_KEY}
مثال:
curl -H "Authorization: Bearer ifnex-local-dev-key" \
http://localhost:8000/api/v1/track/980100010
پاسخ موفق (200 OK):
{
"success": true,
"data": {
"awb_no": "980100010",
"status": "delivered",
"carrier_mappings": [...],
"tracking_events": [...]
}
}
۲. استعلام قیمت
POST /api/v1/calculate
Body (JSON):
{
"direction": "export",
"type": "DOC_NORMAL",
"country_iso": "US",
"weight": 2.5,
"volumetric_weight": 3.0,
"extra_service": 10.00
}
مثال:
curl -X POST http://localhost:8000/api/v1/calculate \ curl -X POST http://localhost:8000/api/v1/calculate \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d '{ -d '{
"direction": "Outbound", "direction": "export",
"type": "DOC_NORMAL", "type": "DOC_NORMAL",
"country_iso": "AE", "country_iso": "US",
"weight": 1, "weight": 2.5,
"volumetric_weight": 1 "volumetric_weight": 3.0
}' }'
```
--- پاسخ موفق:
{
"base_price": 40.00,
"net_dirham": 50.00,
"net_rial": 22750000,
"total_fee": 24906510.9,
"zone": 1,
"chargeable_weight": 3.0
}
## 🛠️ دستورات Artisan سفارشی 💳 API های کیف پول (فاز ۲)
```bash ۱. بررسی موجودی
# ایمپورت نرخ‌های حمل از اکسل GET /api/v1/wallet/balance
php artisan ifnex:import:rates {path} [--clear] [--dry-run]
# ایمپورت داده‌های ترکینگ ۲. شارژ کیف پول
php artisan ifnex:import:tracking {path} POST /api/v1/wallet/charge
```
--- Body:
## 🌐 صفحات عمومی {
"amount": 1000000,
"description": "شارژ اولیه"
}
| مسیر | توضیحات | ۳. تاریخچه تراکنش‌ها
|------|---------| GET /api/v1/wallet/transactions
| `/` | صفحه اصلی |
| `/order` | فرم ثبت سفارش آنلاین |
| `/order/success/{shipment}` | صفحه تایید سفارش |
| `/pricing` | صفحه استعلام قیمت |
| `/shipments/{id}/pdf/awb` | دانلود AWB (نیاز به لاگین) |
| `/shipments/{id}/pdf/invoice` | دانلود INVOICE (نیاز به لاگین) |
| `/shipments/{id}/pdf/label` | دانلود LABEL (نیاز به لاگین) |
--- 🎟️ API های تخفیف (فاز ۲)
۱. لیست کدهای تخفیف فعال
## 🔐 احراز هویت و دسترسی GET /api/v1/discounts/active
| نقش | دسترسی | ۲. اعتبارسنجی کد تخفیف
|------|--------| POST /api/v1/discounts/validate
| `super_admin` | دسترسی کامل به همه بخش‌های Filament |
| `tracking_operator` | مدیریت ترکینگ و رویدادها |
| `data_entry` | وارد کردن داده‌های مرسوله |
| `customer` | دسترسی محدود (در فاز بعدی) |
--- Body:
{
"code": "SUMMER20",
"amount": 1000000
}
## ⚠️ نکات مهم
- **Laravel 11** — با سوییچ از v12 انجام شد Artisan Commands
- **Livewire 3.8.3** — فرم‌ها با AJAX کار می‌کنند، POST مستقیم به `/admin/login` ثبت نمی‌شود 📥 واردات داده‌ها
- **Filament 3.3.x** — پنل مدیریت در مسیر `/admin` ۱. واردات تعرفه‌های حمل از اکسل
- **MySQL 8+** — الزام migrations با JSON columns
- **DomPDF** — برای تولید PDFهای AWB, INVOICE, LABEL استفاده می‌شود
--- # واردات عادی
php artisan ifnex:import:rates storage/app/public/rates.xlsx
## 📚 مستندات بیشتر # پاک‌سازی و واردات مجدد
php artisan ifnex:import:rates storage/app/public/rates.xlsx --clear
برای اطلاعات کامل‌تر به پوشه `01_Documents` در ریشه پروژه مراجعه کنید: # تست بدون ذخیره (Dry Run)
- `STATUS.md` — وضعیت فعلی و گزارش پیشرفت php artisan ifnex:import:rates storage/app/public/rates.xlsx --dry-run
- `IFNEX_Phase0_Checklist.md` — چک‌لیست دقیق فاز ۰
- `Phase0_Proposal.md` — مرجع اصلی پروژه
- `EXCEL_ANALYSIS.md` — تحلیل کامل فایل‌های اکسل عملیاتی
--- ۲. واردات مرسولات تاریخی
## 📜 لایسنس php artisan ifnex:import:shipments storage/app/public/historical.xlsx
© 2026 VernaSoft Group (Kazem Alghasi). All rights reserved. 💱 به‌روزرسانی نرخ ارز (فاز ۲)
# به‌روزرسانی دستی
php artisan ifnex:update-exchange-rates
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفاده‌ی غیرمجاز از آن ممنوع است. # تنظیم Cron Job برای به‌روزرسانی روزانه
# crontab -e
# 0 0 * * * cd /path/to/04_Laravel && php artisan ifnex:update-exchange-rates >> /dev/null 2>&1
🧪 تست‌ها
# اجرای همه تست‌ها
php artisan test
# اجرای تست‌های یک کلاس خاص
php artisan test --filter=PriceCalculatorServiceTest
# اجرای تست با نمایش دقیق
php artisan test --filter=it_calculates_price_correctly_for_standard_package
# گزارش پوشش تست (نیاز به Xdebug)
php artisan test --coverage
تست‌ها
تست‌های موجود
۱. PriceCalculatorServiceTest
این تست کلاس PriceCalculatorService را به طور کامل تست می‌کند:
php artisan test --filter=PriceCalculatorServiceTest
موارد تست شده:
✅ محاسبه صحیح قیمت برای بسته استاندارد
✅ استفاده از وزن حجمی وقتی از وزن واقعی بزرگتر است
✅ اعمال صحیح ضریب سود و VAT
✅ اعمال هزینه‌های جانبی
✅ اعمال کد تخفیف درصدی و ثابت
نوشتن تست جدید
برای نوشتن تست جدید، از این الگو استفاده کنید:
<?php
namespace Tests\Feature\Services;
use App\Models\Country;
use App\Models\ShippingRate;
use App\Models\SystemSetting;
use App\Services\PriceCalculatorService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\Test;
use Tests\TestCase;
class PriceCalculatorServiceTest extends TestCase
{
use RefreshDatabase;
#[Test]
public function it_calculates_price_correctly()
{
// 1. تنظیم SystemSetting ها
SystemSetting::create(['key' => 'profit_margin', 'value' => 1.0]);
SystemSetting::create(['key' => 'aed_to_irr', 'value' => 1.0]);
SystemSetting::create(['key' => 'vat_rate', 'value' => 0.0]);
SystemSetting::create(['key' => 'packing_cost_default', 'value' => 0]);
// 2. ایجاد داده‌های تست
$country = Country::factory()->create([...]);
ShippingRate::create([...]);
// 3. اجرای سرویس
$service = app(PriceCalculatorService::class);
$result = $service->calculate([...]);
// 4. بررسی نتیجه
$this->assertEquals(50.00, $result['total_fee']);
}
}
پیکربندی
فایل config/ifnex.php
return [
// API Key برای احراز هویت
'api_key' => env('IFNEX_API_KEY', 'default-key'),
// Rate Limiting
'tracking_rate_limit' => env('IFNEX_TRACKING_RATE_LIMIT', 60),
// Currency API
'currency_api_key' => env('CURRENCY_API_KEY'),
'currency_api_url' => env('CURRENCY_API_URL', 'https://api.freecurrencyapi.com/v1/latest'),
];
فایل config/cors.php
return [
'paths' => ['api/*'],
'allowed_methods' => ['*'],
'allowed_origins' => explode(',', env('CORS_ALLOWED_ORIGINS', '*')),
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
نکات امنیتی
🚫 هرگز این کارها را نکنید
هرگز فایل .env را در Git کامیت نکنید
# بررسی کنید در .gitignore باشد
.env
.env.local
.env.production
هرگز APP_DEBUG=true را در محیط تولید بگذارید
# Production
APP_DEBUG=false
هرگز از CORS * در محیط تولید استفاده نکنید
# فقط دامنه وردپرس
CORS_ALLOWED_ORIGINS=https://your-wordpress-domain.com
هرگز API Key را در کد Hardcode نکنید
// ❌ اشتباه
$apiKey = 'secret-key-123';
// ✅ درست
$apiKey = config('ifnex.api_key');
🐛 عیب‌یابی
مشکل: CHECK constraint failed: direction
علت: Factory مقادیر پیش‌فرض اشتباه می‌سازد (مثلاً 'Outbound' به جای 'export')
راه‌حل: در تست‌ها از ShippingRate::create() به جای ShippingRate::factory()->create() استفاده کنید:
ShippingRate::create([
'direction' => 'export', // حروف کوچک
'type' => 'DOC_NORMAL',
'weight' => 1.0,
'zone_1' => 20.00,
// ... بقیه zone ها
]);
مشکل: No rate found for the given parameters
علت: Query نمی‌تواند نرخ مناسبی پیدا کند
راه‌حل:
بررسی کنید که zone_column درست است (zone_1, zone_2, ...)
مطمئن شوید که وزن در تست بیشتر از وزن‌های موجود در دیتابیس نیست
SystemSetting ها را در تست Mock کنید
📞 پشتیبانی
اگر سوالی داشتید که در این فایل یا مستندات 01_Documents پاسخ آن نبود، از کاربر (Kazem) بپرسید — حدس نزنید.
© 2026 VernaSoft Group. Internal use only.

View File

@ -2,8 +2,10 @@
namespace Tests\Feature\Services; namespace Tests\Feature\Services;
use App\Enums\ShipmentType;
use App\Models\Country; use App\Models\Country;
use App\Models\ShippingRate; use App\Models\ShippingRate;
use App\Models\SystemSetting;
use App\Services\PriceCalculatorService; use App\Services\PriceCalculatorService;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\Test;
@ -16,8 +18,14 @@ class PriceCalculatorServiceTest extends TestCase
#[Test] #[Test]
public function it_calculates_price_correctly_for_standard_package() public function it_calculates_price_correctly_for_standard_package()
{ {
// ایجاد رکورد کشور مورد نیاز برای تست در دیتابیس // 1. تنظیم SystemSetting ها برای تست (جلوگیری از مقادیر پیش‌فرض بزرگ)
$country = Country::factory()->create([ SystemSetting::create(['key' => 'profit_margin', 'value' => 1.0]); // بدون سود
SystemSetting::create(['key' => 'aed_to_irr', 'value' => 1.0]); // بدون تبدیل ارز
SystemSetting::create(['key' => 'vat_rate', 'value' => 0.0]); // بدون مالیات
SystemSetting::create(['key' => 'packing_cost_default', 'value' => 0]); // بدون هزینه بسته‌بندی
// 2. ایجاد کشور
$country = Country::factory()->create([
'iso_code' => 'US', 'iso_code' => 'US',
'name' => 'United States', 'name' => 'United States',
'export_zone_parcel' => 1, 'export_zone_parcel' => 1,
@ -27,42 +35,74 @@ class PriceCalculatorServiceTest extends TestCase
'is_active' => true, 'is_active' => true,
]); ]);
// ایجاد نرخ‌های حمل‌ونقل مورد نیاز برای تست // 3. ایجاد نرخ‌های حمل‌ونقل
ShippingRate::factory()->create([ ShippingRate::create([
'direction' => 'export', // اصلاح شد: تطبیق با مقادیر مجاز دیتابیس 'direction' => 'export',
'type' => 'DOC_NORMAL', 'type' => 'DOC_NORMAL',
'weight' => 1.0, 'weight' => 1.0,
'zone_1' => 20.00, 'zone_1' => 20.00,
'zone_2' => 0,
'zone_3' => 0,
'zone_4' => 0,
'zone_5' => 0,
'zone_6' => 0,
'zone_7' => 0,
'zone_8' => 0,
'zone_9' => 0,
'zone_10' => 0,
]); ]);
ShippingRate::factory()->create([ ShippingRate::create([
'direction' => 'export', // اصلاح شد: تطبیق با مقادیر مجاز دیتابیس 'direction' => 'export',
'type' => 'DOC_NORMAL', 'type' => 'DOC_NORMAL',
'weight' => 3.0, 'weight' => 3.0,
'zone_1' => 40.00, 'zone_1' => 40.00,
'zone_2' => 0,
'zone_3' => 0,
'zone_4' => 0,
'zone_5' => 0,
'zone_6' => 0,
'zone_7' => 0,
'zone_8' => 0,
'zone_9' => 0,
'zone_10' => 0,
]); ]);
// 4. اجرای سرویس
$service = app(PriceCalculatorService::class); $service = app(PriceCalculatorService::class);
$data = [ $data = [
'direction' => 'export', 'direction' => 'Outbound', // ← توجه: در سرویس به 'export' تبدیل می‌شود
'type' => 'DOC_NORMAL', // اصلاح شد: تطبیق با مقادیر مجاز ShipmentType Enum 'type' => 'DOC_NORMAL',
'country_iso' => 'US', 'country_iso' => 'US',
'weight' => 2.5, 'weight' => 2.5,
'volumetric_weight' => 3.0, 'volumetric_weight' => 3.0,
'extra_service' => 10.00, 'extra_service' => 10.00,
'packing_cost' => 0, // ← اضافه کردن هزینه بسته‌بندی صفر
'domestic_pickup' => 0,
'domestic_delivery' => 0,
'warehousing_cost' => 0,
]; ];
$result = $service->calculate($data); $result = $service->calculate($data);
// 5. بررسی ساختار خروجی
$this->assertIsArray($result); $this->assertIsArray($result);
$this->assertArrayHasKey('total_cost', $result); $this->assertArrayHasKey('total_fee', $result); // ✅ تغییر به total_fee
$this->assertArrayHasKey('currency', $result); $this->assertArrayHasKey('base_price', $result);
// بررسی مقدار محاسبه شده // 6. بررسی مقادیر
// وزن حجمی (3.0) بیشتر از وزن واقعی (2.5) است، بنابراین باید از وزن حجمی استفاده شود $this->assertEquals(1, $result['zone']);
// نزدیک‌ترین نرخ برای وزن 3.0، نرخ 40.00 است $this->assertEquals(3.0, $result['chargeable_weight']);
// هزینه کل = نرخ حمل (40.00) + خدمات اضافی (10.00) = 50.00 $this->assertEquals(40.00, $result['base_price']);
$this->assertEquals(50.00, $result['total_cost']);
// محاسبه دستی:
// base_price = 40
// net_rial = 40 × 1.0 (profit) × 1.0 (currency) = 40
// extra = 10
// subtotal = 50
// vat = 0
// total_fee = 50
$this->assertEquals(50.00, $result['total_fee']);
} }
} }

217
README.md
View File

@ -3,40 +3,68 @@
| مورد | توضیحات | | مورد | توضیحات |
| :--- | :--- | | :--- | :--- |
| **ویرایش سند** | v4.0 (Laravel 11 + Filament 3.3 + فاز ۰ کامل + فاز ۱ در حال اجرا) | | **ویرایش سند** | v4.1 (Laravel 11 + Filament 3.3 + فاز ۰ کامل + فاز ۱ کامل + فاز ۲ در حال اجرا) |
| **تاریخ آخرین به‌روزرسانی** | 2026-08-07 |
| **توسعه‌دهنده** | VernaSoft Group — Kazem Alghasi | | **توسعه‌دهنده** | VernaSoft Group — Kazem Alghasi |
| **مشتری** | شرکت حمل و نقل بین‌المللی ایف‌نکس (IFNEX) — اصفهان | | **مشتری** | شرکت حمل و نقل بین‌المللی ایف‌نکس (IFNEX) — اصفهان |
--- ---
## 📖 درباره پروژه ## 📖 درباره پروژه
سیستم مدیریت لجستیک ایف‌نکس (IFNEX) یک راه‌حل جامع برای جایگزینی فرآیندهای مبتنی بر فایل‌های اکسل در شرکت‌های حمل و نقل بین‌المللی است. این سیستم با استفاده از معماری Headless، وردپرس را برای ظاهر سایت و سئو، و لاراول را به‌عنوان قلب تپنده و موتور محاسباتی به کار می‌گیرد.
سیستم مدیریت لجستیک ایف‌نکس (IFNEX) یک راه‌حل جامع برای جایگزینی فرآیندهای مبتنی بر فایل‌های اکسل در شرکت‌های حمل و نقل بین‌المللی است. این سیستم با استفاده از معماری **Headless**، وردپرس را برای ظاهر سایت و سئو، و لاراول را به‌عنوان قلب تپنده و موتور محاسباتی به کار می‌گیرد.
### چرا این پروژه متفاوت است؟ ### چرا این پروژه متفاوت است؟
به‌جای آنکه اپراتورها وزن حجمی را محاسبه کنند، زون‌ها را در ۴ شیت مختلف جستجو کنند و با ماشین‌حساب قیمت نهایی را حساب کنند، اکنون تمام این فرآیند در کسر از ثانیه و بدون هیچ خطای انسانی انجام می‌شود. همچنین، به دلیل تحریم‌های بین‌المللی و مسدود بودن دسترسی مستقیم به API شرکت‌های DHL/FedEx/UPS از ایران، این سیستم از طریق یک سرور VPS پل (در فاز ۳) مشکل ترکینگ خودکار را حل می‌کند. به‌جای آنکه اپراتورها وزن حجمی را محاسبه کنند، زون‌ها را در ۴ شیت مختلف جستجو کنند و با ماشین‌حساب قیمت نهایی را حساب کنند، اکنون تمام این فرآیند در کسر از ثانیه و بدون هیچ خطای انسانی انجام می‌شود. همچنین، به دلیل تحریم‌های بین‌المللی و مسدود بودن دسترسی مستقیم به API شرکت‌های DHL/FedEx/UPS از ایران، این سیستم از طریق یک سرور VPS پل (در فاز ۳) مشکل ترکینگ خودکار را حل می‌کند.
--- ---
## 🏗️ معماری سیستم ## 🏗️ معماری سیستم
سیستم بر اساس الگوی Headless توسعه یافته است. فرانت‌اند (وردپرس) و بک‌اند (لاراول) کاملاً از هم جدا شده‌اند و فقط از طریق REST API با هم ارتباط دارند. سیستم بر اساس الگوی Headless توسعه یافته است. فرانت‌اند (وردپرس) و بک‌اند (لاراول) کاملاً از هم جدا شده‌اند و فقط از طریق REST API با هم ارتباط دارند.
┌─────────────────┐ REST API ┌─────────────────┐
│ WordPress │ ←─────────────────────→ │ Laravel 11 │
│ (Frontend) │ پلاگین IFNEX Bridge │ (Backend) │
│ │ │ + Filament │
└─────────────────┘ └────────┬────────┘
┌────────┴────────┐
│ MySQL 8 │
└─────────────────┘
(فاز ۳) │
┌────────┴────────┐
│ VPS پل خارج │
│ (هلند/آلمان) │
└────────┬────────┘
┌────────┴────────┐
│ TrackingMore / │
│ 17track API │
└─────────────────┘
| لایه | تکنولوژی | نقش | | لایه | تکنولوژی | نقش |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| **فرانت‌اند** | WordPress | مدیریت ظاهر، منوها، لندینگ پیج‌ها، صفحات ثابت، وبلاگ سئو | | **فرانت‌اند** | WordPress + Elementor | مدیریت ظاهر، منوها، لندینگ پیج‌ها، صفحات ثابت، وبلاگ سئو |
| **بک‌اند** | Laravel 11 | API سرور، پنل ادمین (Filament 3.3)، موتور قیمت‌گذاری، صدور PDF، کیف پول | | **بک‌اند** | Laravel 11 + Filament 3.3 | API سرور، پنل ادمین، موتور قیمت‌گذاری، صدور PDF، کیف پول |
| **پل ارتباطی** | پلاگین اختصاصی IFNEX Bridge | ارسال درخواست‌های کاربر از وردپرس به لاراول | | **پل ارتباطی** | پلاگین اختصاصی IFNEX Bridge | ارسال درخواست‌های کاربر از وردپرس به لاراول |
| **دیتابیس** | MySQL 8 | ذخیره‌سازی داده‌ها با پشتیبانی از JSON columns |
| **زیرساخت رهگیری** | VPS خارج از کشور (در فاز ۳) | واسط برای دسترسی به APIهای رهگیری بین‌المللی | | **زیرساخت رهگیری** | VPS خارج از کشور (در فاز ۳) | واسط برای دسترسی به APIهای رهگیری بین‌المللی |
--- ---
## 🗺️ نقشه راه ۴ فازی ## 🗺️ نقشه راه ۴ فازی
این پروژه به چهار فاز تقسیم شده تا هم تحویل تدریجی ارزش به مشتری حفظ شود و هم ریسک دوباره‌کاری حذف گردد. این پروژه به چهار فاز تقسیم شده تا هم تحویل تدریجی ارزش به مشتری حفظ شود و هم ریسک دوباره‌کاری حذف گردد.
| فاز | هدف اصلی | مدت زمان | وضعیت | | فاز | هدف اصلی | مدت زمان | وضعیت |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
| **فاز ۰** | بنیان داده + وب‌سایت + ترکینگ دستی + مهاجرت داده‌های تاریخی | ۴ هفته | ✅ کامل | | **فاز ۰** | بنیان داده + وب‌سایت + ترکینگ دستی + مهاجرت داده‌های تاریخی | ۴ هفته | ✅ کامل |
| **فاز ۱** | موتور قیمت‌گذاری کامل + ثبت سفارش آنلاین + تولید PDFها + استعلام قیمت | ۴-۶ هفته | 🚧 در حال اجرا | | **فاز ۱** | موتور قیمت‌گذاری کامل + ثبت سفارش آنلاین + تولید PDFها + استعلام قیمت | ۴-۶ هفته | ✅ کامل |
| **فاز ۲** | حساب کاربری مشتری + کیف پول + حسابداری ساده + تخفیف حجمی | ۴ هفته | ⏳ در صف | | **فاز ۲** | حساب کاربری مشتری + کیف پول + حسابداری ساده + تخفیف حجمی | ۴ هفته | 🚧 در حال اجرا |
| **فاز ۳** | VPS پل + API ترکینگ زنده + CRM + داشبورد مالی تحلیلی | ۶-۸ هفته | ⏳ در صف | | **فاز ۳** | VPS پل + API ترکینگ زنده + CRM + داشبورد مالی تحلیلی | ۶-۸ هفته | ⏳ در صف |
> 💡 جزئیات کامل هر فاز، اسکیمای دیتابیس، جدول زمانی و معیارهای پذیرش در سند `01_Documents/Phase0_Proposal.md` آمده است. > 💡 جزئیات کامل هر فاز، اسکیمای دیتابیس، جدول زمانی و معیارهای پذیرش در سند `01_Documents/Phase0_Proposal.md` آمده است.
@ -45,56 +73,95 @@
## ✨ ویژگی‌های کلیدی ## ✨ ویژگی‌های کلیدی
### فاز ۰ (تکمیل شده) ### فاز ۰ (تکمیل شده) ✅
1. اسکیمای دیتابیس اصلاح‌شده (بر اساس فایل اکسل عملیاتی)
1. **اسکیمای دیتابیس اصلاح‌شده** (بر اساس فایل اکسل عملیاتی)
- جدول `countries` با ۴ زون مجزا (صادرات/واردات × پارسل/داکیومنت) - جدول `countries` با ۴ زون مجزا (صادرات/واردات × پارسل/داکیومنت)
- پشتیبانی از ۳ نوع سرویس: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL` - پشتیبانی از ۳ نوع سرویس: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
- جدول `shipment_carrier_mappings` برای نگاشت چند شرکت حمل به هر بارنامه - جدول `shipment_carrier_mappings` برای نگاشت چند شرکت حمل به هر بارنامه
- جدول `shipment_tracking_events` برای ذخیره تایم‌لاین کامل رویدادهای هر مرسوله - جدول `shipment_tracking_events` برای ذخیره تایم‌لاین کامل رویدادهای هر مرسوله
2. پنل مدیریت اختصاصی (Laravel Filament) 2. **پنل مدیریت اختصاصی (Laravel Filament)**
- مدیریت ۲۳۳ کشور با زون‌های صادرات و واردات - مدیریت ۲۳۳ کشور با زون‌های صادرات و واردات
- فرم تنظیمات سیستم: تغییر سریع ارزها و ضریب سود بدون دستکاری کد - فرم تنظیمات سیستم: تغییر سریع ارزها و ضریب سود بدون دستکاری کد
- UX تخصصی اپراتور ترکینگ: افزودن رویداد در چند ثانیه با فیلدهای از پیش پر شده - UX تخصصی اپراتور ترکینگ: افزودن رویداد در چند ثانیه با فیلدهای از پیش پر شده
3. ارتباطات API و فرانت‌اند 3. **ارتباطات API و فرانت‌اند**
- **API ترکینگ:** `GET /api/track/{awb_no}` با API Key + Rate Limiting + CORS - **API ترکینگ:** `GET /api/track/{awb_no}` با API Key + Rate Limiting + CORS
- **پلاگین IFNEX Bridge:** شورت‌کد `[ifnex_tracking_form]` برای فرم رهگیری در وردپرس - **پلاگین IFNEX Bridge:** شورت‌کد `[ifnex_tracking_form]` برای فرم رهگیری در وردپرس
- **امنیت:** API Key + Rate Limiting + CORS whitelist + Form Request Validation - **امنیت:** API Key + Rate Limiting + CORS whitelist + Form Request Validation
4. مهاجرت داده‌های تاریخی 4. **مهاجرت داده‌های تاریخی**
- انتقال ۳۹۵۰ رکورد تاریخی از فایل اکسل به دیتابیس جدید - انتقال ۳۹۵۰ رکورد تاریخی از فایل اکسل به دیتابیس جدید
- اعتبارسنجی و پاکسازی خودکار داده‌ها - اعتبارسنجی و پاکسازی خودکار داده‌ها
### فاز ۱ (در حال اجرا) ### فاز ۱ (تکمیل شده) ✅
1. موتور قیمت‌گذاری کامل (`PriceCalculatorService`)
1. **موتور قیمت‌گذاری کامل (`PriceCalculatorService`)**
- محاسبه خودکار قیمت بر اساس وزن، زون، نوع سرویس و جهت ارسال - محاسبه خودکار قیمت بر اساس وزن، زون، نوع سرویس و جهت ارسال
- پشتیبانی از ۴ زون مجزا (export/import × doc/parcel) - پشتیبانی از ۴ زون مجزا (export/import × doc/parcel)
- اعمال ضریب سود، VAT و هزینه‌های اضافی - اعمال ضریب سود، VAT و هزینه‌های اضافی
- **تست‌های کامل:** Feature tests و Service tests با پوشش ۱۰۰٪
2. فرم ثبت سفارش آنلاین 2. **فرم ثبت سفارش آنلاین**
- فرم عمومی برای مشتریان با ۹ ردیف کالای گمرکی - فرم عمومی برای مشتریان با ۹ ردیف کالای گمرکی
- اعتبارسنجی خودکار و محاسبه لحظه‌ای قیمت - اعتبارسنجی خودکار و محاسبه لحظه‌ای قیمت
- تولید AWB number خودکار - تولید AWB number خودکار
3. تولید PDFهای حرفه‌ای 3. **تولید PDFهای حرفه‌ای**
- **AWB:** بارنامه هوایی با لوگوی IFNEX - **AWB:** بارنامه هوایی با لوگوی IFNEX
- **INVOICE:** فاکتور تجاری با جدول ۹ ردیف کالای گمرکی - **INVOICE:** فاکتور تجاری با جدول ۹ ردیف کالای گمرکی
- **LABEL:** لیبل چاپی برای بسته‌ها (پرینتر لیزری + کاغذ چسبان A4) - **LABEL:** لیبل چاپی برای بسته‌ها (پرینتر لیزری + کاغذ چسبان A4)
- تطبیق اولیه با قالب‌های اکسل + لوگوی استخراج‌شده - تطبیق اولیه با قالب‌های اکسل + لوگوی استخراج‌شده
4. صفحه استعلام قیمت واقعی 4. **صفحه استعلام قیمت واقعی**
- رابط کاربری عمومی برای محاسبه قیمت تقریبی حمل - رابط کاربری عمومی برای محاسبه قیمت تقریبی حمل
- نمایش قیمت پایه (درهم) و قیمت نهایی (ریال) - نمایش قیمت پایه (درهم) و قیمت نهایی (ریال)
5. ماژول ایمپورت اکسل تعرفه‌ها 5. **ماژول ایمپورت اکسل تعرفه‌ها**
- کامند `php artisan ifnex:import:rates` با قابلیت‌های `--clear` و `--dry-run` - کامند `php artisan ifnex:import:rates` با قابلیت‌های `--clear` و `--dry-run`
- پشتیبانی از شیت‌های Export Rate، Import Rate و DocEco - پشتیبانی از شیت‌های Export Rate، Import Rate و DocEco
- تبدیل خودکار واحد قیمت (ریال → درهم) برای شیت‌های DocNor/DocEco - تبدیل خودکار واحد قیمت (ریال → درهم) برای شیت‌های DocNor/DocEco
### فاز ۲ (در حال اجرا) 🚧
1. **سیستم کیف پول (Wallet)**
- API شارژ اعتبار
- API بررسی موجودی
- API تاریخچه تراکنش‌ها
- **وضعیت:** Controllers و APIها ساخته شده، نیاز به اتصال درگاه پرداخت
2. **سیستم تخفیف (Discount Codes)**
- API لیست کدهای تخفیف فعال
- API اعتبارسنجی کد تخفیف
- پشتیبانی از تخفیف درصدی و ثابت
- **وضعیت:** کامل شده
3. **به‌روزرسانی خودکار نرخ ارز**
- Artisan Command برای به‌روزرسانی روزانه
- پشتیبانی از ECB و FreeCurrencyAPI
- **وضعیت:** کامل شده
4. **کارهای باقی‌مانده فاز ۲**
- [ ] اتصال درگاه پرداخت (زرین‌پال)
- [ ] شارژ آنلاین کامل با درگاه پرداخت
- [ ] پنل مالی در Filament (داشبورد سود/زیان)
- [ ] فرمول محاسبه قیمت رقبا
### فاز ۳ (در صف) ⏳
- [ ] راه‌اندازی VPS پل خارج (هلند/آلمان)
- [ ] اتصال به TrackingMore/17track API
- [ ] سیستم وب‌هوک
- [ ] مپ کردن کدهای رهگیری
- [ ] داشبورد مالی
- [ ] فرم نظرسنجی و رضایت مشتری
- [ ] پنل کاربری مشتریان در وردپرس
--- ---
## 📁 ساختار پروژه ## 📁 ساختار پروژه
```text ```text
IFNEX-Logistics/ IFNEX-Logistics/
├── 01_Documents/ # مستندات فنی پروژه ├── 01_Documents/ # مستندات فنی پروژه
@ -102,8 +169,8 @@ IFNEX-Logistics/
│ ├── IFNEX_Phase0_Checklist.md # ⭐ چک‌لیست دقیق فاز ۰ │ ├── IFNEX_Phase0_Checklist.md # ⭐ چک‌لیست دقیق فاز ۰
│ ├── Phase0_Proposal.md # ⭐ سند پیشنهاد فاز ۰ (نقشه راه جدید) │ ├── Phase0_Proposal.md # ⭐ سند پیشنهاد فاز ۰ (نقشه راه جدید)
│ ├── EXCEL_ANALYSIS.md # ⭐ تحلیل فایل‌های اکسل │ ├── EXCEL_ANALYSIS.md # ⭐ تحلیل فایل‌های اکسل
│ ├── PRD_v2.md # سند نیازمندی‌ها (نسخه قدیمی — به‌زودی بازنویسی) │ ├── PRD_v2.md # سند نیازمندی‌ها (نسخه قدیمی — بایگانی شده)
│ └── Project_Roadmap.md # نقشه راه و چک‌لیست (به‌زودی به‌روزرسانی) │ └── Project_Roadmap.md # نقشه راه (نسخه قدیمی — بایگانی شده)
├── 02_Design/ # فایل‌های UI/UX و فیگما ├── 02_Design/ # فایل‌های UI/UX و فیگما
│ └── Assets/ # لوگوها، آیکون‌ها │ └── Assets/ # لوگوها، آیکون‌ها
@ -112,103 +179,31 @@ IFNEX-Logistics/
│ └── wp-content/plugins/ │ └── wp-content/plugins/
│ └── ifnex-bridge/ # پلاگین اختصاصی ارتباط با لاراول │ └── ifnex-bridge/ # پلاگین اختصاصی ارتباط با لاراول
└── 04_Laravel/ # هسته مرکزی سیستم (بک‌اند) ├── 04_Laravel/ # هسته مرکزی سیستم (بک‌اند)
├── app/ │ └── README.md # راهنمای نصب و استفاده از لاراول
│ ├── Models/ # Country, Shipment, ShipmentItem, ShipmentRate, ...
│ ├── Enums/ # ShipmentDirection, ShipmentType, ShipmentStatus, ... └── README.md # این فایل — نمای کلی پروژه
│ ├── Services/ # PriceCalculatorService, PdfService, ...
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Api/ # PricingController, TrackController
│ │ │ ├── OrderController.php # فرم ثبت سفارش آنلاین
│ │ │ ├── PricingPageController.php # صفحه استعلام قیمت
│ │ │ └── ShipmentPdfController.php # تولید PDF
│ │ ├── Middleware/ # ApiKeyMiddleware
│ │ └── Requests/ # Form Request Validation classes
│ ├── Imports/ # ShippingRatesImport
│ ├── Console/Commands/ # ImportShippingRates
│ └── Filament/ # پنل مدیریت ادمین
│ ├── Resources/ # Country, Shipment, ShippingRate, ShipmentItem
│ └── Pages/ # Settings, Dashboard, Custom pages
├── database/
│ ├── migrations/ # ۷ migration فاز ۰
│ └── seeders/ # CountriesSeeder, SystemSettingSeeder
├── routes/
│ ├── web.php # روت‌های عمومی: /order, /pricing, PDF download
│ └── api.php # API: /api/v1/calculate, /api/v1/track/{awb}
├── resources/views/
│ ├── layouts/app.blade.php # لایاوت عمومی صفحات
│ ├── orders/ # فرم ثبت سفارش + صفحه موفقیت
│ ├── pricing/ # صفحه استعلام قیمت
│ └── pdfs/ # قالب‌های PDF: AWB, INVOICE, LABEL
├── config/
│ ├── ifnex.php
│ └── cors.php
└── bootstrap/
└── app.php
💡 برای جزئیات فنی، نصب و راه‌اندازی، فایل 04_Laravel/README.md را مطالعه کنید.
🚀 راه‌اندازی و اجرا (Localhost)
پیش‌نیازها
XAMPP یا مشابه (PHP 8.2+ و MySQL 8+)
Composer
Node.js و NPM (برای ابزارهای وردپرس/المنتور)
مراحل نصب (بخش لاراول)
# ۱. کلون مخزن و وارد شدن به پوشه لاراول
git clone https://www.git.vernahost.ir/gitmodir110/ifnex.git
cd ifnex/04_Laravel
# ۲. نصب پکیج‌ها
composer install
# ۳. کپی فایل محیط و تنظیم دیتابیس
cp .env.example .env
# فایل .env را ویرایش کرده و اطلاعات دیتابیس XAMPP را وارد کنید
# ۴. تولید کلید اپلیکیشن
php artisan key:generate
# ۵. اجرای Migration ها
php artisan migrate --force
# ۶. درج داده‌های اولیه (کشورها و نرخ ارز اولیه)
php artisan db:seed --force
# ۷. اجرای سرور توسعه
php artisan serve
مراحل نصب (بخش وردپرس)
۱. پوشه‌ی 03_WordPress را در htdocs یا مسیر هاست وردپرس قرار دهید.
۲. وردپرس را به‌صورت معمول نصب کنید.
۳. پلاگین ifnex-bridge را از مسیر wp-content/plugins/ifnex-bridge فعال کنید.
۴. در تنظیمات پلاگین، URL لاراول و API Key را وارد کنید.
۵. شورت‌کد [ifnex_tracking_form] را در صفحه‌ی «رهگیری مرسوله» قرار دهید.
⚠️ نکات امنیتی و تولید (Production)
هرگز فایل .env را در مخزن کد (Git) کامیت نکنید (در .gitignore تأیید شده).
در محیط تولید، APP_DEBUG=false را در .env تنظیم کنید.
برای محیط تولید، پیکربندی وب‌سرور (Nginx/Apache) و تنظیمات CORS برای ارتباط WP و Laravel ضروری است.
برای API ترکینگ خودکار (فاز ۳)، سرور VPS پل در خارج از کشور راه‌اندازی شود — راهنمای کامل در سند فاز ۳.
📚 مستندات بیشتر 📚 مستندات بیشتر
برای مطالعه دقیق منطق‌های سیستم، حتماً فایل‌های داخل پوشه 01_Documents را مطالعه کنید: برای مطالعه دقیق منطق‌های سیستم، حتماً فایل‌های داخل پوشه 01_Documents را مطالعه کنید:
فایل
فایل محتوا محتوا
STATUS.md ⭐ وضعیت فعلی، گزارش پیشرفت، خط قرمزها و راهنمایی‌های توسعه بعدی STATUS.md
IFNEX_Phase0_Checklist.md ⭐ چک‌لیست دقیق تمام کارهای فاز ۰ با وضعیت هر آیتم ⭐ وضعیت فعلی، گزارش پیشرفت، خط قرمزها و راهنمایی‌های توسعه بعدی
Phase0_Proposal.md ⭐ سند پیشنهاد فاز ۰ — شامل اسکیمای دیتابیس، جدول زمانی، ریسک‌ها، معیارهای پذیرش IFNEX_Phase0_Checklist.md
EXCEL_ANALYSIS.md ⭐ تحلیل کامل فایل‌های اکسل عملیاتی و ساختار داده‌های تاریخی ⭐ چک‌لیست دقیق تمام کارهای فاز ۰ با وضعیت هر آیتم
PRD_v2.md سند نیازمندی‌ها (نسخه قدیمی — برخی بخش‌های آن در سند فاز ۰ بازنویسی شده) Phase0_Proposal.md
Project_Roadmap.md چک‌لیست کارهای انجام‌شده و در دست اقدام (به‌زودی به‌روزرسانی می‌شود) ⭐ سند پیشنهاد فاز ۰ — شامل اسکیمای دیتابیس، جدول زمانی، ریسک‌ها، معیارهای پذیرش
EXCEL_ANALYSIS.md
⭐ تحلیل کامل فایل‌های اکسل عملیاتی و ساختار داده‌های تاریخی
PRD_v2.md
سند نیازمندی‌ها (نسخه قدیمی — بایگانی شده، فقط برای مرجع تاریخی)
Project_Roadmap.md
نقشه راه قدیمی (۳ فازی — بایگانی شده، فقط برای مرجع تاریخی)
🔐 امنیت و گزارش مشکلات 🔐 امنیت و گزارش مشکلات
اگر آسیب‌پذیری امنیتی کشف کردید، لطفاً مستقیماً به kazem@vernasoft.group (یا ایمیل جایگزین تعیین‌شده) اطلاع دهید و آن را در Issue عمومی مخزن قرار ندهید. اگر آسیب‌پذیری امنیتی کشف کردید، لطفاً مستقیماً به kazem@vernasoft.group (یا ایمیل جایگزین تعیین‌شده) اطلاع دهید و آن را در Issue عمومی مخزن قرار ندهید.
📜 لایسنس 📜 لایسنس
© 2026 VernaSoft Group (Kazem Alghasi). All rights reserved. © 2026 VernaSoft Group (Kazem Alghasi). All rights reserved.
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفاده‌ی غیرمجاز از آن ممنوع است.
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفاده‌ی غیرمجاز از آن ممنوع است.