diff --git a/01_Documents/IFNEX_Phase0_Checklist.md b/01_Documents/IFNEX_Phase0_Checklist.md index fb4147f..26354af 100644 --- a/01_Documents/IFNEX_Phase0_Checklist.md +++ b/01_Documents/IFNEX_Phase0_Checklist.md @@ -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 | + --- diff --git a/01_Documents/STATUS.md b/01_Documents/STATUS.md index 5836740..2e4ce29 100644 --- a/01_Documents/STATUS.md +++ b/01_Documents/STATUS.md @@ -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. diff --git a/01_Documents/PRD_v2.md b/01_Documents/archives/PRD_v2.md similarity index 100% rename from 01_Documents/PRD_v2.md rename to 01_Documents/archives/PRD_v2.md diff --git a/01_Documents/Project_Roadmap.md b/01_Documents/archives/Project_Roadmap.md similarity index 100% rename from 01_Documents/Project_Roadmap.md rename to 01_Documents/archives/Project_Roadmap.md diff --git a/04_Laravel/.phpunit.result.cache b/04_Laravel/.phpunit.result.cache index 91db643..51dbb82 100644 --- a/04_Laravel/.phpunit.result.cache +++ b/04_Laravel/.phpunit.result.cache @@ -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}} \ No newline at end of file +{"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}} \ No newline at end of file diff --git a/04_Laravel/README.md b/04_Laravel/README.md index a682505..5b1167c 100644 --- a/04_Laravel/README.md +++ b/04_Laravel/README.md @@ -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 +✅ اعمال هزینه‌های جانبی +✅ اعمال کد تخفیف درصدی و ثابت +نوشتن تست جدید +برای نوشتن تست جدید، از این الگو استفاده کنید: + + '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. \ No newline at end of file diff --git a/04_Laravel/tests/Feature/Services/PriceCalculatorServiceTest.php b/04_Laravel/tests/Feature/Services/PriceCalculatorServiceTest.php index 558a4d2..b4dff6f 100644 --- a/04_Laravel/tests/Feature/Services/PriceCalculatorServiceTest.php +++ b/04_Laravel/tests/Feature/Services/PriceCalculatorServiceTest.php @@ -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']); } -} +} \ No newline at end of file diff --git a/README.md b/README.md index 0b1dd0d..99f01d4 100644 --- a/README.md +++ b/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 است و کپی یا استفاده‌ی غیرمجاز از آن ممنوع است. \ No newline at end of file