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.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 |
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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
|
```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 تخفیف
|
||||||
|
│ │ │ ├── OrderController.php # فرم ثبت سفارش
|
||||||
|
│ │ │ ├── PricingPageController.php # صفحه استعلام قیمت
|
||||||
|
│ │ │ └── ShipmentPdfController.php # تولید PDF
|
||||||
|
│ │ ├── Middleware/
|
||||||
|
│ │ │ └── ApiKeyMiddleware.php # احراز هویت API
|
||||||
│ │ └── Requests/ # Form Request Validation
|
│ │ └── Requests/ # Form Request Validation
|
||||||
│ ├── Imports/ # ShippingRatesImport
|
│ │
|
||||||
│ ├── Console/Commands/ # ImportShippingRates
|
│ ├── Imports/ # Excel Imports
|
||||||
│ └── Filament/ # پنل مدیریت
|
│ │ ├── ShippingRatesImport.php # واردات تعرفهها
|
||||||
│ ├── Resources/ # Country, Shipment, ShippingRate, ShipmentItem
|
│ │ ├── HistoricalShipmentsImport.php # واردات مرسولات تاریخی
|
||||||
│ └── Pages/ # Settings, Dashboard
|
│ │ └── 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.
|
||||||
@ -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,7 +18,13 @@ 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 ها برای تست (جلوگیری از مقادیر پیشفرض بزرگ)
|
||||||
|
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([
|
$country = Country::factory()->create([
|
||||||
'iso_code' => 'US',
|
'iso_code' => 'US',
|
||||||
'name' => 'United States',
|
'name' => 'United States',
|
||||||
@ -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']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
215
README.md
215
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 |
|
| **توسعهدهنده** | 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 است و کپی یا استفادهی غیرمجاز از آن ممنوع است.
|
||||||
Loading…
Reference in New Issue
Block a user