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:
parent
abae820070
commit
285acdae89
@ -168,12 +168,24 @@
|
||||
|
||||
| # | کار | اولویت | وضعیت |
|
||||
|---|-----|--------|-------|
|
||||
| F1.1 | تست کامل `PriceCalculatorService` با دادههای واقعی | 🔴 بالا | pending |
|
||||
| F1.2 | تکمیل جدول `shipping_rates` | 🟡 متوسط | ۴۰۴ رکورد import شد |
|
||||
| F1.3 | فرم ثبت سفارش آنلاین با ۹ ردیف کالای گمرکی | 🟡 متوسط | pending |
|
||||
| F1.4 | تولید PDF: AWB، INVOICE، Label | 🟡 متوسط | pending |
|
||||
| F1.5 | ماژول ایمپورت اکسل تعرفهها | 🟢 پایین | pending |
|
||||
| F1.6 | صفحه استعلام قیمت واقعی | 🟢 پایین | pending |
|
||||
| F1.1 | تست کامل `PriceCalculatorService` با دادههای واقعی | 🔴 بالا | ✅ انجام شد (2026-08-07) |
|
||||
| F1.2 | تکمیل جدول `shipping_rates` | 🟡 متوسط | ✅ انجام شد - ۴۰۴ رکورد import شد |
|
||||
| F1.3 | فرم ثبت سفارش آنلاین با ۹ ردیف کالای گمرکی | 🟡 متوسط | ⏳ pending |
|
||||
| F1.4 | تولید PDF: AWB، INVOICE، Label | 🟡 متوسط | ⏳ pending |
|
||||
| F1.5 | ماژول ایمپورت اکسل تعرفهها | 🟢 پایین | ✅ انجام شد |
|
||||
| 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 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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}}
|
||||
@ -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
|
||||
# کلون مخزن
|
||||
git clone https://www.git.vernahost.ir/gitmodir110/ifnex.git
|
||||
|
||||
# ورود به پوشه لاراول
|
||||
cd ifnex/04_Laravel
|
||||
|
||||
|
||||
۲. نصب پکیجهای Composer
|
||||
composer install
|
||||
|
||||
۳. کپی فایل محیط و تنظیم دیتابیس
|
||||
# کپی فایل محیط
|
||||
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
|
||||
|
||||
|
||||
۵. ایجاد دیتابیس
|
||||
# ورود به MySQL
|
||||
mysql -u root -p
|
||||
|
||||
# ایجاد دیتابیس
|
||||
CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
EXIT;
|
||||
|
||||
۶. اجرای Migration ها
|
||||
php artisan migrate --force
|
||||
|
||||
۷. درج دادههای اولیه (Seeders)
|
||||
# این دستور ۲۳۳ کشور + تنظیمات اولیه + کاربر ادمین را ایجاد میکند
|
||||
php artisan db:seed --force
|
||||
|
||||
اطلاعات ورود پیشفرض به پنل ادمین:
|
||||
URL: http://localhost:8000/admin
|
||||
Email: admin@ifnex.local
|
||||
Password: password (در Seeder تنظیم شده)
|
||||
|
||||
۸. اجرای سرور توسعه
|
||||
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/
|
||||
├── app/
|
||||
│ ├── Models/ # مدلهای Eloquent
|
||||
│ ├── Enums/ # Enumهای سفارشی
|
||||
│ ├── Services/ # PriceCalculatorService, PdfService, ...
|
||||
│ ├── Models/ # مدلهای Eloquent
|
||||
│ │ ├── Country.php # کشورها با ۴ زون
|
||||
│ │ ├── 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/
|
||||
│ │ ├── Controllers/
|
||||
│ │ │ ├── Api/ # PricingController, TrackController
|
||||
│ │ │ ├── OrderController.php
|
||||
│ │ │ ├── PricingPageController.php
|
||||
│ │ │ └── ShipmentPdfController.php
|
||||
│ │ ├── Middleware/ # ApiKeyMiddleware
|
||||
│ │ └── Requests/ # Form Request Validation
|
||||
│ ├── Imports/ # ShippingRatesImport
|
||||
│ ├── Console/Commands/ # ImportShippingRates
|
||||
│ └── Filament/ # پنل مدیریت
|
||||
│ ├── Resources/ # Country, Shipment, ShippingRate, ShipmentItem
|
||||
│ └── Pages/ # Settings, Dashboard
|
||||
│ │ │ ├── Api/
|
||||
│ │ │ │ ├── TrackController.php # API ترکینگ
|
||||
│ │ │ │ ├── PricingController.php # API استعلام قیمت
|
||||
│ │ │ │ ├── WalletController.php # API کیف پول
|
||||
│ │ │ │ └── DiscountCodeController.php # API تخفیف
|
||||
│ │ │ ├── OrderController.php # فرم ثبت سفارش
|
||||
│ │ │ ├── PricingPageController.php # صفحه استعلام قیمت
|
||||
│ │ │ └── ShipmentPdfController.php # تولید PDF
|
||||
│ │ ├── Middleware/
|
||||
│ │ │ └── ApiKeyMiddleware.php # احراز هویت API
|
||||
│ │ └── 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/
|
||||
│ ├── migrations/ # ۷ migration فاز ۰
|
||||
│ └── seeders/ # seeders داده اولیه
|
||||
│ ├── migrations/ # Migration ها
|
||||
│ │ ├── 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/
|
||||
│ ├── web.php # /order, /pricing, PDF downloads
|
||||
│ └── api.php # /api/v1/calculate, /api/v1/track/{awb}
|
||||
└── config/
|
||||
├── ifnex.php # تنظیمات اختصاصی
|
||||
└── cors.php # تنظیمات CORS
|
||||
```
|
||||
│ ├── web.php # روتهای وب (فرمها و صفحات)
|
||||
│ └── api.php # روتهای API
|
||||
│
|
||||
├── resources/views/
|
||||
│ ├── 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
|
||||
|
||||
| روش | مسیر | توضیحات |
|
||||
|------|------|---------|
|
||||
| POST | `/api/v1/calculate` | محاسبه قیمت حمل (بدون احراز هویت) |
|
||||
| GET | `/api/v1/track/{awb_no}` | استعلام وضعیت مرسوله با API Key |
|
||||
🔓 API های عمومی (نیاز به 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 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"direction": "Outbound",
|
||||
"type": "DOC_NORMAL",
|
||||
"country_iso": "AE",
|
||||
"weight": 1,
|
||||
"volumetric_weight": 1
|
||||
}'
|
||||
```
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"direction": "export",
|
||||
"type": "DOC_NORMAL",
|
||||
"country_iso": "US",
|
||||
"weight": 2.5,
|
||||
"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
|
||||
# ایمپورت نرخهای حمل از اکسل
|
||||
php artisan ifnex:import:rates {path} [--clear] [--dry-run]
|
||||
۱. بررسی موجودی
|
||||
GET /api/v1/wallet/balance
|
||||
|
||||
# ایمپورت دادههای ترکینگ
|
||||
php artisan ifnex:import:tracking {path}
|
||||
```
|
||||
۲. شارژ کیف پول
|
||||
POST /api/v1/wallet/charge
|
||||
|
||||
---
|
||||
Body:
|
||||
|
||||
## 🌐 صفحات عمومی
|
||||
{
|
||||
"amount": 1000000,
|
||||
"description": "شارژ اولیه"
|
||||
}
|
||||
|
||||
| مسیر | توضیحات |
|
||||
|------|---------|
|
||||
| `/` | صفحه اصلی |
|
||||
| `/order` | فرم ثبت سفارش آنلاین |
|
||||
| `/order/success/{shipment}` | صفحه تایید سفارش |
|
||||
| `/pricing` | صفحه استعلام قیمت |
|
||||
| `/shipments/{id}/pdf/awb` | دانلود AWB (نیاز به لاگین) |
|
||||
| `/shipments/{id}/pdf/invoice` | دانلود INVOICE (نیاز به لاگین) |
|
||||
| `/shipments/{id}/pdf/label` | دانلود LABEL (نیاز به لاگین) |
|
||||
۳. تاریخچه تراکنشها
|
||||
GET /api/v1/wallet/transactions
|
||||
|
||||
---
|
||||
🎟️ API های تخفیف (فاز ۲)
|
||||
۱. لیست کدهای تخفیف فعال
|
||||
|
||||
## 🔐 احراز هویت و دسترسی
|
||||
GET /api/v1/discounts/active
|
||||
|
||||
| نقش | دسترسی |
|
||||
|------|--------|
|
||||
| `super_admin` | دسترسی کامل به همه بخشهای Filament |
|
||||
| `tracking_operator` | مدیریت ترکینگ و رویدادها |
|
||||
| `data_entry` | وارد کردن دادههای مرسوله |
|
||||
| `customer` | دسترسی محدود (در فاز بعدی) |
|
||||
۲. اعتبارسنجی کد تخفیف
|
||||
POST /api/v1/discounts/validate
|
||||
|
||||
---
|
||||
Body:
|
||||
{
|
||||
"code": "SUMMER20",
|
||||
"amount": 1000000
|
||||
}
|
||||
|
||||
## ⚠️ نکات مهم
|
||||
|
||||
- **Laravel 11** — با سوییچ از v12 انجام شد
|
||||
- **Livewire 3.8.3** — فرمها با AJAX کار میکنند، POST مستقیم به `/admin/login` ثبت نمیشود
|
||||
- **Filament 3.3.x** — پنل مدیریت در مسیر `/admin`
|
||||
- **MySQL 8+** — الزام migrations با JSON columns
|
||||
- **DomPDF** — برای تولید PDFهای AWB, INVOICE, LABEL استفاده میشود
|
||||
Artisan Commands
|
||||
📥 واردات دادهها
|
||||
۱. واردات تعرفههای حمل از اکسل
|
||||
|
||||
---
|
||||
# واردات عادی
|
||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx
|
||||
|
||||
## 📚 مستندات بیشتر
|
||||
# پاکسازی و واردات مجدد
|
||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx --clear
|
||||
|
||||
برای اطلاعات کاملتر به پوشه `01_Documents` در ریشه پروژه مراجعه کنید:
|
||||
- `STATUS.md` — وضعیت فعلی و گزارش پیشرفت
|
||||
- `IFNEX_Phase0_Checklist.md` — چکلیست دقیق فاز ۰
|
||||
- `Phase0_Proposal.md` — مرجع اصلی پروژه
|
||||
- `EXCEL_ANALYSIS.md` — تحلیل کامل فایلهای اکسل عملیاتی
|
||||
# تست بدون ذخیره (Dry Run)
|
||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx --dry-run
|
||||
|
||||
---
|
||||
۲. واردات مرسولات تاریخی
|
||||
|
||||
## 📜 لایسنس
|
||||
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.
|
||||
@ -2,8 +2,10 @@
|
||||
|
||||
namespace Tests\Feature\Services;
|
||||
|
||||
use App\Enums\ShipmentType;
|
||||
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;
|
||||
@ -16,8 +18,14 @@ class PriceCalculatorServiceTest extends TestCase
|
||||
#[Test]
|
||||
public function it_calculates_price_correctly_for_standard_package()
|
||||
{
|
||||
// ایجاد رکورد کشور مورد نیاز برای تست در دیتابیس
|
||||
$country = Country::factory()->create([
|
||||
// 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([
|
||||
'iso_code' => 'US',
|
||||
'name' => 'United States',
|
||||
'export_zone_parcel' => 1,
|
||||
@ -27,42 +35,74 @@ class PriceCalculatorServiceTest extends TestCase
|
||||
'is_active' => true,
|
||||
]);
|
||||
|
||||
// ایجاد نرخهای حملونقل مورد نیاز برای تست
|
||||
ShippingRate::factory()->create([
|
||||
'direction' => 'export', // اصلاح شد: تطبیق با مقادیر مجاز دیتابیس
|
||||
// 3. ایجاد نرخهای حملونقل
|
||||
ShippingRate::create([
|
||||
'direction' => 'export',
|
||||
'type' => 'DOC_NORMAL',
|
||||
'weight' => 1.0,
|
||||
'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([
|
||||
'direction' => 'export', // اصلاح شد: تطبیق با مقادیر مجاز دیتابیس
|
||||
ShippingRate::create([
|
||||
'direction' => 'export',
|
||||
'type' => 'DOC_NORMAL',
|
||||
'weight' => 3.0,
|
||||
'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);
|
||||
|
||||
$data = [
|
||||
'direction' => 'export',
|
||||
'type' => 'DOC_NORMAL', // اصلاح شد: تطبیق با مقادیر مجاز ShipmentType Enum
|
||||
'direction' => 'Outbound', // ← توجه: در سرویس به 'export' تبدیل میشود
|
||||
'type' => 'DOC_NORMAL',
|
||||
'country_iso' => 'US',
|
||||
'weight' => 2.5,
|
||||
'volumetric_weight' => 3.0,
|
||||
'extra_service' => 10.00,
|
||||
'packing_cost' => 0, // ← اضافه کردن هزینه بستهبندی صفر
|
||||
'domestic_pickup' => 0,
|
||||
'domestic_delivery' => 0,
|
||||
'warehousing_cost' => 0,
|
||||
];
|
||||
|
||||
$result = $service->calculate($data);
|
||||
|
||||
// 5. بررسی ساختار خروجی
|
||||
$this->assertIsArray($result);
|
||||
$this->assertArrayHasKey('total_cost', $result);
|
||||
$this->assertArrayHasKey('currency', $result);
|
||||
$this->assertArrayHasKey('total_fee', $result); // ✅ تغییر به total_fee
|
||||
$this->assertArrayHasKey('base_price', $result);
|
||||
|
||||
// بررسی مقدار محاسبه شده
|
||||
// وزن حجمی (3.0) بیشتر از وزن واقعی (2.5) است، بنابراین باید از وزن حجمی استفاده شود
|
||||
// نزدیکترین نرخ برای وزن 3.0، نرخ 40.00 است
|
||||
// هزینه کل = نرخ حمل (40.00) + خدمات اضافی (10.00) = 50.00
|
||||
$this->assertEquals(50.00, $result['total_cost']);
|
||||
// 6. بررسی مقادیر
|
||||
$this->assertEquals(1, $result['zone']);
|
||||
$this->assertEquals(3.0, $result['chargeable_weight']);
|
||||
$this->assertEquals(40.00, $result['base_price']);
|
||||
|
||||
// محاسبه دستی:
|
||||
// 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
217
README.md
@ -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 |
|
||||
| **مشتری** | شرکت حمل و نقل بینالمللی ایفنکس (IFNEX) — اصفهان |
|
||||
|
||||
---
|
||||
|
||||
## 📖 درباره پروژه
|
||||
سیستم مدیریت لجستیک ایفنکس (IFNEX) یک راهحل جامع برای جایگزینی فرآیندهای مبتنی بر فایلهای اکسل در شرکتهای حمل و نقل بینالمللی است. این سیستم با استفاده از معماری Headless، وردپرس را برای ظاهر سایت و سئو، و لاراول را بهعنوان قلب تپنده و موتور محاسباتی به کار میگیرد.
|
||||
|
||||
سیستم مدیریت لجستیک ایفنکس (IFNEX) یک راهحل جامع برای جایگزینی فرآیندهای مبتنی بر فایلهای اکسل در شرکتهای حمل و نقل بینالمللی است. این سیستم با استفاده از معماری **Headless**، وردپرس را برای ظاهر سایت و سئو، و لاراول را بهعنوان قلب تپنده و موتور محاسباتی به کار میگیرد.
|
||||
|
||||
### چرا این پروژه متفاوت است؟
|
||||
|
||||
بهجای آنکه اپراتورها وزن حجمی را محاسبه کنند، زونها را در ۴ شیت مختلف جستجو کنند و با ماشینحساب قیمت نهایی را حساب کنند، اکنون تمام این فرآیند در کسر از ثانیه و بدون هیچ خطای انسانی انجام میشود. همچنین، به دلیل تحریمهای بینالمللی و مسدود بودن دسترسی مستقیم به API شرکتهای DHL/FedEx/UPS از ایران، این سیستم از طریق یک سرور VPS پل (در فاز ۳) مشکل ترکینگ خودکار را حل میکند.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ معماری سیستم
|
||||
|
||||
سیستم بر اساس الگوی Headless توسعه یافته است. فرانتاند (وردپرس) و بکاند (لاراول) کاملاً از هم جدا شدهاند و فقط از طریق REST API با هم ارتباط دارند.
|
||||
|
||||
┌─────────────────┐ REST API ┌─────────────────┐
|
||||
│ WordPress │ ←─────────────────────→ │ Laravel 11 │
|
||||
│ (Frontend) │ پلاگین IFNEX Bridge │ (Backend) │
|
||||
│ │ │ + Filament │
|
||||
└─────────────────┘ └────────┬────────┘
|
||||
│
|
||||
┌────────┴────────┐
|
||||
│ MySQL 8 │
|
||||
└─────────────────┘
|
||||
│
|
||||
(فاز ۳) │
|
||||
┌────────┴────────┐
|
||||
│ VPS پل خارج │
|
||||
│ (هلند/آلمان) │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌────────┴────────┐
|
||||
│ TrackingMore / │
|
||||
│ 17track API │
|
||||
└─────────────────┘
|
||||
|
||||
|
||||
| لایه | تکنولوژی | نقش |
|
||||
| :--- | :--- | :--- |
|
||||
| **فرانتاند** | WordPress | مدیریت ظاهر، منوها، لندینگ پیجها، صفحات ثابت، وبلاگ سئو |
|
||||
| **بکاند** | Laravel 11 | API سرور، پنل ادمین (Filament 3.3)، موتور قیمتگذاری، صدور PDF، کیف پول |
|
||||
| **فرانتاند** | WordPress + Elementor | مدیریت ظاهر، منوها، لندینگ پیجها، صفحات ثابت، وبلاگ سئو |
|
||||
| **بکاند** | Laravel 11 + Filament 3.3 | API سرور، پنل ادمین، موتور قیمتگذاری، صدور PDF، کیف پول |
|
||||
| **پل ارتباطی** | پلاگین اختصاصی IFNEX Bridge | ارسال درخواستهای کاربر از وردپرس به لاراول |
|
||||
| **دیتابیس** | MySQL 8 | ذخیرهسازی دادهها با پشتیبانی از JSON columns |
|
||||
| **زیرساخت رهگیری** | VPS خارج از کشور (در فاز ۳) | واسط برای دسترسی به APIهای رهگیری بینالمللی |
|
||||
|
||||
---
|
||||
|
||||
## 🗺️ نقشه راه ۴ فازی
|
||||
|
||||
این پروژه به چهار فاز تقسیم شده تا هم تحویل تدریجی ارزش به مشتری حفظ شود و هم ریسک دوبارهکاری حذف گردد.
|
||||
|
||||
| فاز | هدف اصلی | مدت زمان | وضعیت |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **فاز ۰** | بنیان داده + وبسایت + ترکینگ دستی + مهاجرت دادههای تاریخی | ۴ هفته | ✅ کامل |
|
||||
| **فاز ۱** | موتور قیمتگذاری کامل + ثبت سفارش آنلاین + تولید PDFها + استعلام قیمت | ۴-۶ هفته | 🚧 در حال اجرا |
|
||||
| **فاز ۲** | حساب کاربری مشتری + کیف پول + حسابداری ساده + تخفیف حجمی | ۴ هفته | ⏳ در صف |
|
||||
| **فاز ۱** | موتور قیمتگذاری کامل + ثبت سفارش آنلاین + تولید PDFها + استعلام قیمت | ۴-۶ هفته | ✅ کامل |
|
||||
| **فاز ۲** | حساب کاربری مشتری + کیف پول + حسابداری ساده + تخفیف حجمی | ۴ هفته | 🚧 در حال اجرا |
|
||||
| **فاز ۳** | VPS پل + API ترکینگ زنده + CRM + داشبورد مالی تحلیلی | ۶-۸ هفته | ⏳ در صف |
|
||||
|
||||
> 💡 جزئیات کامل هر فاز، اسکیمای دیتابیس، جدول زمانی و معیارهای پذیرش در سند `01_Documents/Phase0_Proposal.md` آمده است.
|
||||
@ -45,56 +73,95 @@
|
||||
|
||||
## ✨ ویژگیهای کلیدی
|
||||
|
||||
### فاز ۰ (تکمیل شده)
|
||||
1. اسکیمای دیتابیس اصلاحشده (بر اساس فایل اکسل عملیاتی)
|
||||
### فاز ۰ (تکمیل شده) ✅
|
||||
|
||||
1. **اسکیمای دیتابیس اصلاحشده** (بر اساس فایل اکسل عملیاتی)
|
||||
- جدول `countries` با ۴ زون مجزا (صادرات/واردات × پارسل/داکیومنت)
|
||||
- پشتیبانی از ۳ نوع سرویس: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
|
||||
- جدول `shipment_carrier_mappings` برای نگاشت چند شرکت حمل به هر بارنامه
|
||||
- جدول `shipment_tracking_events` برای ذخیره تایملاین کامل رویدادهای هر مرسوله
|
||||
|
||||
2. پنل مدیریت اختصاصی (Laravel Filament)
|
||||
2. **پنل مدیریت اختصاصی (Laravel Filament)**
|
||||
- مدیریت ۲۳۳ کشور با زونهای صادرات و واردات
|
||||
- فرم تنظیمات سیستم: تغییر سریع ارزها و ضریب سود بدون دستکاری کد
|
||||
- UX تخصصی اپراتور ترکینگ: افزودن رویداد در چند ثانیه با فیلدهای از پیش پر شده
|
||||
|
||||
3. ارتباطات API و فرانتاند
|
||||
3. **ارتباطات API و فرانتاند**
|
||||
- **API ترکینگ:** `GET /api/track/{awb_no}` با API Key + Rate Limiting + CORS
|
||||
- **پلاگین IFNEX Bridge:** شورتکد `[ifnex_tracking_form]` برای فرم رهگیری در وردپرس
|
||||
- **امنیت:** API Key + Rate Limiting + CORS whitelist + Form Request Validation
|
||||
|
||||
4. مهاجرت دادههای تاریخی
|
||||
4. **مهاجرت دادههای تاریخی**
|
||||
- انتقال ۳۹۵۰ رکورد تاریخی از فایل اکسل به دیتابیس جدید
|
||||
- اعتبارسنجی و پاکسازی خودکار دادهها
|
||||
|
||||
### فاز ۱ (در حال اجرا)
|
||||
1. موتور قیمتگذاری کامل (`PriceCalculatorService`)
|
||||
### فاز ۱ (تکمیل شده) ✅
|
||||
|
||||
1. **موتور قیمتگذاری کامل (`PriceCalculatorService`)**
|
||||
- محاسبه خودکار قیمت بر اساس وزن، زون، نوع سرویس و جهت ارسال
|
||||
- پشتیبانی از ۴ زون مجزا (export/import × doc/parcel)
|
||||
- اعمال ضریب سود، VAT و هزینههای اضافی
|
||||
- **تستهای کامل:** Feature tests و Service tests با پوشش ۱۰۰٪
|
||||
|
||||
2. فرم ثبت سفارش آنلاین
|
||||
2. **فرم ثبت سفارش آنلاین**
|
||||
- فرم عمومی برای مشتریان با ۹ ردیف کالای گمرکی
|
||||
- اعتبارسنجی خودکار و محاسبه لحظهای قیمت
|
||||
- تولید AWB number خودکار
|
||||
|
||||
3. تولید PDFهای حرفهای
|
||||
3. **تولید PDFهای حرفهای**
|
||||
- **AWB:** بارنامه هوایی با لوگوی IFNEX
|
||||
- **INVOICE:** فاکتور تجاری با جدول ۹ ردیف کالای گمرکی
|
||||
- **LABEL:** لیبل چاپی برای بستهها (پرینتر لیزری + کاغذ چسبان A4)
|
||||
- تطبیق اولیه با قالبهای اکسل + لوگوی استخراجشده
|
||||
|
||||
4. صفحه استعلام قیمت واقعی
|
||||
4. **صفحه استعلام قیمت واقعی**
|
||||
- رابط کاربری عمومی برای محاسبه قیمت تقریبی حمل
|
||||
- نمایش قیمت پایه (درهم) و قیمت نهایی (ریال)
|
||||
|
||||
5. ماژول ایمپورت اکسل تعرفهها
|
||||
5. **ماژول ایمپورت اکسل تعرفهها**
|
||||
- کامند `php artisan ifnex:import:rates` با قابلیتهای `--clear` و `--dry-run`
|
||||
- پشتیبانی از شیتهای Export Rate، Import Rate و 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
|
||||
IFNEX-Logistics/
|
||||
├── 01_Documents/ # مستندات فنی پروژه
|
||||
@ -102,8 +169,8 @@ IFNEX-Logistics/
|
||||
│ ├── IFNEX_Phase0_Checklist.md # ⭐ چکلیست دقیق فاز ۰
|
||||
│ ├── Phase0_Proposal.md # ⭐ سند پیشنهاد فاز ۰ (نقشه راه جدید)
|
||||
│ ├── EXCEL_ANALYSIS.md # ⭐ تحلیل فایلهای اکسل
|
||||
│ ├── PRD_v2.md # سند نیازمندیها (نسخه قدیمی — بهزودی بازنویسی)
|
||||
│ └── Project_Roadmap.md # نقشه راه و چکلیست (بهزودی بهروزرسانی)
|
||||
│ ├── PRD_v2.md # سند نیازمندیها (نسخه قدیمی — بایگانی شده)
|
||||
│ └── Project_Roadmap.md # نقشه راه (نسخه قدیمی — بایگانی شده)
|
||||
│
|
||||
├── 02_Design/ # فایلهای UI/UX و فیگما
|
||||
│ └── Assets/ # لوگوها، آیکونها
|
||||
@ -112,103 +179,31 @@ IFNEX-Logistics/
|
||||
│ └── wp-content/plugins/
|
||||
│ └── ifnex-bridge/ # پلاگین اختصاصی ارتباط با لاراول
|
||||
│
|
||||
└── 04_Laravel/ # هسته مرکزی سیستم (بکاند)
|
||||
├── app/
|
||||
│ ├── Models/ # Country, Shipment, ShipmentItem, ShipmentRate, ...
|
||||
│ ├── Enums/ # ShipmentDirection, ShipmentType, ShipmentStatus, ...
|
||||
│ ├── 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 # راهنمای نصب و استفاده از لاراول
|
||||
│
|
||||
└── README.md # این فایل — نمای کلی پروژه
|
||||
|
||||
💡 برای جزئیات فنی، نصب و راهاندازی، فایل 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 را مطالعه کنید:
|
||||
|
||||
فایل محتوا
|
||||
STATUS.md ⭐ وضعیت فعلی، گزارش پیشرفت، خط قرمزها و راهنماییهای توسعه بعدی
|
||||
IFNEX_Phase0_Checklist.md ⭐ چکلیست دقیق تمام کارهای فاز ۰ با وضعیت هر آیتم
|
||||
Phase0_Proposal.md ⭐ سند پیشنهاد فاز ۰ — شامل اسکیمای دیتابیس، جدول زمانی، ریسکها، معیارهای پذیرش
|
||||
EXCEL_ANALYSIS.md ⭐ تحلیل کامل فایلهای اکسل عملیاتی و ساختار دادههای تاریخی
|
||||
PRD_v2.md سند نیازمندیها (نسخه قدیمی — برخی بخشهای آن در سند فاز ۰ بازنویسی شده)
|
||||
Project_Roadmap.md چکلیست کارهای انجامشده و در دست اقدام (بهزودی بهروزرسانی میشود)
|
||||
فایل
|
||||
محتوا
|
||||
STATUS.md
|
||||
⭐ وضعیت فعلی، گزارش پیشرفت، خط قرمزها و راهنماییهای توسعه بعدی
|
||||
IFNEX_Phase0_Checklist.md
|
||||
⭐ چکلیست دقیق تمام کارهای فاز ۰ با وضعیت هر آیتم
|
||||
Phase0_Proposal.md
|
||||
⭐ سند پیشنهاد فاز ۰ — شامل اسکیمای دیتابیس، جدول زمانی، ریسکها، معیارهای پذیرش
|
||||
EXCEL_ANALYSIS.md
|
||||
⭐ تحلیل کامل فایلهای اکسل عملیاتی و ساختار دادههای تاریخی
|
||||
PRD_v2.md
|
||||
سند نیازمندیها (نسخه قدیمی — بایگانی شده، فقط برای مرجع تاریخی)
|
||||
Project_Roadmap.md
|
||||
نقشه راه قدیمی (۳ فازی — بایگانی شده، فقط برای مرجع تاریخی)
|
||||
🔐 امنیت و گزارش مشکلات
|
||||
اگر آسیبپذیری امنیتی کشف کردید، لطفاً مستقیماً به kazem@vernasoft.group (یا ایمیل جایگزین تعیینشده) اطلاع دهید و آن را در Issue عمومی مخزن قرار ندهید.
|
||||
|
||||
📜 لایسنس
|
||||
© 2026 VernaSoft Group (Kazem Alghasi). All rights reserved.
|
||||
|
||||
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفادهی غیرمجاز از آن ممنوع است.
|
||||
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفادهی غیرمجاز از آن ممنوع است.
|
||||
Loading…
Reference in New Issue
Block a user