docs(docs): overhaul project documentation and deployment guides
Refactor all primary documentation files to improve readability, visual presentation, and technical accuracy. - Update `README.md` with a modern layout, including technology badges and a high-level architecture overview. - Redesign `04_Laravel/README.md` to include a streamlined installation guide, environment configuration details, and default credentials. - Revamp `DEPLOYMENT.md` to provide clear, environment-specific instructions for production and local setups.
This commit is contained in:
parent
6a4a619261
commit
6aee0324d4
@ -1,73 +1,85 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
# ⚙️ IFNEX Laravel Backend
|
||||||
|
|
||||||
|
### هسته مرکزی سیستم مدیریت لجستیک ایفنکس
|
||||||
|
|
||||||
|
[](https://laravel.com)
|
||||||
|
[](https://php.net)
|
||||||
|
[](https://filamentphp.com)
|
||||||
|
[](https://mysql.com)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📄 فایل ۲: `04_Laravel/README.md` (پوشه لاراول)
|
**REST API + Admin Panel + Financial Engine**
|
||||||
|
|
||||||
```markdown
|
[🚀 نصب سریع](#-نصب-و-راهاندازی-سریع) • [📡 API Endpoints](#-api-endpoints) • [🗃️ Models](#-models) • [📚 مستندات](#-مستندات)
|
||||||
# 🚀 IFNEX Laravel Backend
|
|
||||||
> هسته مرکزی سیستم مدیریت لجستیک ایفنکس
|
|
||||||
|
|
||||||
| مورد | توضیحات |
|
</div>
|
||||||
| :--- | :--- |
|
|
||||||
| **نسخه لاراول** | Laravel 11.x |
|
|
||||||
| **نسخه PHP** | PHP 8.2+ |
|
|
||||||
| **پنل ادمین** | Filament 3.3.x |
|
|
||||||
| **دیتابیس** | MySQL 8+ |
|
|
||||||
| **تاریخ آخرین بهروزرسانی** | 2026-08-10 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📋 فهرست مطالب
|
## 🎯 نمای کلی
|
||||||
|
|
||||||
1. [پیشنیازها](#پیشنیازها)
|
این پوشه شامل **هسته مرکزی سیستم IFNEX** است:
|
||||||
2. [نصب و راهاندازی](#نصب-و-راهاندازی)
|
|
||||||
3. [ساختار پوشهها](#ساختار-پوشهها)
|
- REST API کامل برای ارتباط با WordPress
|
||||||
4. [API Endpoints](#api-endpoints)
|
- پنل مدیریت Filament
|
||||||
5. [Artisan Commands](#artisan-commands)
|
- موتور قیمتگذاری با ۴ زون و ۳ نوع سرویس
|
||||||
6. [تستها](#تستها)
|
- سیستم کیف پول و پرداخت
|
||||||
7. [پیکربندی](#پیکربندی)
|
- تولید PDF (AWB, Invoice, Label) با بارکد
|
||||||
8. [نکات امنیتی](#نکات-امنیتی)
|
- سیستم اعلانها و تاریخچه تغییرات
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## پیشنیازها
|
## 🚀 نصب و راهاندازی سریع
|
||||||
|
|
||||||
قبل از شروع، مطمئن شوید که موارد زیر روی سیستم شما نصب هستند:
|
### پیشنیازها
|
||||||
|
|
||||||
| ابزار | نسخه حداقل | نصب |
|
| ابزار | حداقل نسخه |
|
||||||
|-------|-----------|-----|
|
|-------|-----------|
|
||||||
| PHP | 8.2+ | [دانلود](https://www.php.net/downloads) |
|
| PHP | 8.2+ |
|
||||||
| Composer | 2.x | [دانلود](https://getcomposer.org/) |
|
| Composer | 2.x |
|
||||||
| MySQL | 8+ | [دانلود](https://dev.mysql.com/downloads/) |
|
| MySQL | 8.0+ |
|
||||||
| 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 04_Laravel
|
||||||
|
|
||||||
# ورود به پوشه لاراول
|
# ۲. نصب وابستگیها
|
||||||
cd ifnex/04_Laravel
|
|
||||||
|
|
||||||
|
|
||||||
۲. نصب پکیجهای Composer
|
|
||||||
composer install
|
composer install
|
||||||
|
|
||||||
۳. کپی فایل محیط و تنظیم دیتابیس
|
# ۳. تنظیم فایل محیط
|
||||||
# کپی فایل محیط
|
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
# ویرایش فایل .env و تنظیم اطلاعات دیتابیس
|
# ۴. ایجاد دیتابیس
|
||||||
nano .env # یا هر ویرایشگر دلخواه
|
mysql -u root -p -e "CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||||
|
|
||||||
تنظیمات مهم در فایل .env:
|
# ۵. ویرایش .env و تنظیم DB_DATABASE, DB_USERNAME, DB_PASSWORD
|
||||||
# دیتابیس
|
|
||||||
|
# ۶. اجرای migrations و seeders
|
||||||
|
php artisan migrate --force
|
||||||
|
php artisan db:seed --force
|
||||||
|
|
||||||
|
# ۷. اجرای سرور
|
||||||
|
php artisan serve
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔐 دسترسی پیشفرض
|
||||||
|
|
||||||
|
| آیتم | مقدار |
|
||||||
|
|-------|-------|
|
||||||
|
| URL پنل | http://localhost:8000/panel |
|
||||||
|
| ایمیل ادمین | admin@ifnex.local |
|
||||||
|
| رمز عبور | password |
|
||||||
|
|
||||||
|
### ⚙️ تنظیمات مهم .env
|
||||||
|
|
||||||
|
```env
|
||||||
|
# DATABASE
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=127.0.0.1
|
DB_HOST=127.0.0.1
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
@ -75,567 +87,184 @@ DB_DATABASE=ifnex_db
|
|||||||
DB_USERNAME=root
|
DB_USERNAME=root
|
||||||
DB_PASSWORD=
|
DB_PASSWORD=
|
||||||
|
|
||||||
# API Key برای ترکینگ
|
# IFNEX
|
||||||
IFNEX_API_KEY=ifnex-local-dev-key
|
IFNEX_API_KEY=ifnex-local-dev-key
|
||||||
|
|
||||||
# CORS - فقط دامنه وردپرس
|
|
||||||
CORS_ALLOWED_ORIGINS=http://localhost:8080
|
|
||||||
|
|
||||||
# Rate Limiting
|
|
||||||
IFNEX_TRACKING_RATE_LIMIT=60
|
IFNEX_TRACKING_RATE_LIMIT=60
|
||||||
|
|
||||||
# Currency API (برای فاز ۲)
|
# CORS (فقط دامنههای مجاز وردپرس)
|
||||||
CURRENCY_API_KEY=your_api_key_here
|
CORS_ALLOWED_ORIGINS=http://localhost:8080,http://ifnex.local
|
||||||
|
|
||||||
|
# PAYMENT GATEWAY (Zarinpal)
|
||||||
|
ZARINPAL_MERCHANT_ID=your_merchant_id
|
||||||
|
ZARINPAL_SANDBOX=true
|
||||||
|
```
|
||||||
|
|
||||||
۴. تولید کلید اپلیکیشن
|
---
|
||||||
php artisan key:generate
|
|
||||||
|
|
||||||
|
## 📡 API Endpoints
|
||||||
|
|
||||||
۵. ایجاد دیتابیس
|
### 🔓 API عمومی (API Key)
|
||||||
# ورود به MySQL
|
|
||||||
mysql -u root -p
|
|
||||||
|
|
||||||
# ایجاد دیتابیس
|
| متد | Endpoint | توضیح |
|
||||||
CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|------|----------|--------|
|
||||||
EXIT;
|
| GET | `/api/v1/track/{awb_no}` | رهگیری مرسوله |
|
||||||
|
| POST | `/api/v1/calculate` | محاسبه قیمت |
|
||||||
|
| GET | `/api/v1/discount-codes` | لیست کدهای تخفیف |
|
||||||
|
| POST | `/api/v1/discount-codes/validate` | اعتبارسنجی کد تخفیف |
|
||||||
|
| POST | `/api/v1/bridge/login` | Bridge Auth (وردپرس) |
|
||||||
|
| POST | `/api/v1/auth/login` | ورود مشتری |
|
||||||
|
| POST | `/api/v1/auth/logout` | خروج |
|
||||||
|
|
||||||
۶. اجرای Migration ها
|
### 🔐 API مشتری (Sanctum Token)
|
||||||
php artisan migrate --force
|
|
||||||
|
|
||||||
۷. درج دادههای اولیه (Seeders)
|
| متد | Endpoint | توضیح |
|
||||||
# این دستور ۲۳۳ کشور + تنظیمات اولیه + کاربر ادمین را ایجاد میکند
|
|------|----------|--------|
|
||||||
php artisan db:seed --force
|
| GET | `/api/v1/customer/profile` | پروفایل و آمار |
|
||||||
|
| GET | `/api/v1/customer/countries` | لیست کشورها |
|
||||||
|
| GET | `/api/v1/customer/orders` | لیست سفارشات |
|
||||||
|
| POST | `/api/v1/customer/orders` | ثبت سفارش |
|
||||||
|
| GET | `/api/v1/customer/orders/{id}` | جزئیات سفارش |
|
||||||
|
| POST | `/api/v1/customer/orders/{id}/cancel` | لغو سفارش |
|
||||||
|
| POST | `/api/v1/customer/orders/{id}/pay-wallet` | پرداخت کیف پول |
|
||||||
|
| POST | `/api/v1/customer/orders/{id}/pay-gateway` | پرداخت درگاه |
|
||||||
|
| GET | `/api/v1/customer/notifications` | اعلانها |
|
||||||
|
| POST | `/api/v1/customer/notifications/{id}/read` | خواندن اعلان |
|
||||||
|
|
||||||
اطلاعات ورود پیشفرض به پنل ادمین:
|
### 💰 API کیف پول (Sanctum Token)
|
||||||
URL: http://localhost:8000/admin
|
|
||||||
Email: admin@ifnex.local
|
|
||||||
Password: password (در Seeder تنظیم شده)
|
|
||||||
|
|
||||||
۸. اجرای سرور توسعه
|
| متد | Endpoint | توضیح |
|
||||||
php artisan serve
|
|------|----------|--------|
|
||||||
|
| GET | `/api/v1/wallet/balance` | موجودی |
|
||||||
|
| GET | `/api/v1/wallet/transactions` | تراکنشها |
|
||||||
|
|
||||||
اکنون پروژه در http://localhost:8000 قابل دسترسی است.
|
### 💳 API پرداخت
|
||||||
|
|
||||||
|
| متد | Endpoint | توضیح |
|
||||||
|
|------|----------|--------|
|
||||||
|
| POST | `/api/v1/payment/redirect` | انتقال به درگاه |
|
||||||
|
| GET | `/api/v1/payment/check/{id}` | بررسی وضعیت |
|
||||||
|
| ANY | `/api/v1/payment/callback` | Callback درگاه |
|
||||||
|
|
||||||
ساختار پوشهها
|
### 🧪 Mock Gateway (تست)
|
||||||
|
|
||||||
|
| متد | Endpoint | توضیح |
|
||||||
|
|------|----------|--------|
|
||||||
|
| GET | `/api/v1/payment/mock-gateway` | صفحه شبیهسازی |
|
||||||
|
| GET | `/api/v1/payment/mock-gateway/success` | شبیه موفق |
|
||||||
|
| GET | `/api/v1/payment/mock-gateway/failure` | شبیه شکست |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗂️ ساختار پروژه
|
||||||
|
|
||||||
|
```
|
||||||
04_Laravel/
|
04_Laravel/
|
||||||
├── app/
|
├── app/
|
||||||
│ ├── Models/ # مدلهای Eloquent
|
│ ├── Enums/ # ShipmentStatus, ShipmentDirection, ShipmentType
|
||||||
│ │ ├── Country.php # کشورها با ۴ زون
|
│ ├── Filament/
|
||||||
│ │ ├── Shipment.php # مرسولات
|
│ │ ├── Resources/ # Shipment, Country, ShippingRate, Currency
|
||||||
│ │ ├── ShipmentItem.php # اقلام گمرکی (۹ ردیف)
|
│ │ ├── Pages/ # Settings, ImportRates, PriceTest
|
||||||
│ │ ├── ShippingRate.php # تعرفههای حمل
|
│ │ └── Widgets/ # Dashboard Widgets
|
||||||
│ │ ├── 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, import, system, customer)
|
|
||||||
│ │ ├── TransactionType.php
|
|
||||||
│ │ ├── TransactionStatus.php
|
|
||||||
│ │ ├── PaymentGateway.php # ۴ درگاه (zarinpal, wallet, manual, system)
|
|
||||||
│ │ └── UserRole.php
|
|
||||||
│ │
|
|
||||||
│ ├── Services/ # لایه سرویس (Business Logic)
|
|
||||||
│ │ ├── PriceCalculatorService.php
|
|
||||||
│ │ ├── TrackingService.php
|
|
||||||
│ │ ├── ExchangeRateService.php
|
|
||||||
│ │ ├── ZarinpalService.php
|
|
||||||
│ │ ├── MockZarinpalService.php
|
|
||||||
│ │ └── OrderPaymentService.php
|
|
||||||
│ │
|
|
||||||
│ ├── Http/
|
│ ├── Http/
|
||||||
│ │ ├── Controllers/
|
│ │ ├── Controllers/Api/ # Track, Pricing, Auth, Bridge, Customer, Wallet, Payment
|
||||||
│ │ │ ├── Api/
|
│ │ └── Middleware/ # ApiKeyMiddleware
|
||||||
│ │ │ │ ├── TrackController.php
|
│ ├── Models/ # Eloquent Models (13 مدل)
|
||||||
│ │ │ │ ├── PricingController.php
|
│ ├── Notifications/ # ShipmentUpdatedNotification
|
||||||
│ │ │ │ ├── AuthController.php # ورود/خروج Sanctum
|
│ ├── Services/ # PriceCalculator, Pdf, Tracking, OrderPayment
|
||||||
│ │ │ │ ├── BridgeAuthController.php # لاگین از پلاگین وردپرس
|
│ └── Imports/ # OldShipments, ShippingRates
|
||||||
│ │ │ │ ├── WalletController.php
|
|
||||||
│ │ │ │ ├── PaymentController.php
|
|
||||||
│ │ │ │ ├── DiscountCodeController.php
|
|
||||||
│ │ │ │ └── Customer/
|
|
||||||
│ │ │ │ └── CustomerOrderController.php # ۶ endpoint سفارش مشتری
|
|
||||||
│ │ │ ├── OrderController.php
|
|
||||||
│ │ │ ├── PricingPageController.php
|
|
||||||
│ │ │ └── ShipmentPdfController.php
|
|
||||||
│ │ ├── Middleware/
|
|
||||||
│ │ │ └── ApiKeyMiddleware.php
|
|
||||||
│ │ └── Requests/
|
|
||||||
│ │
|
|
||||||
│ ├── Imports/ # Excel Imports
|
|
||||||
│ │ ├── ShippingRatesImport.php # واردات تعرفهها
|
|
||||||
│ │ ├── HistoricalShipmentsImport.php # واردات مرسولات تاریخی
|
|
||||||
│ │ └── RateSheetImport.php # شیتهای نرخ
|
|
||||||
│ │
|
|
||||||
│ ├── Console/Commands/ # Artisan Commands
|
|
||||||
│ │ ├── ImportShippingRates.php
|
|
||||||
│ │ ├── ImportHistoricalData.php
|
|
||||||
│ │ ├── UpdateExchangeRates.php
|
|
||||||
│ │ ├── SyncWordPressUsers.php
|
|
||||||
│ │ └── DebugImportCommand.php
|
|
||||||
│ │
|
|
||||||
│ └── Filament/ # پنل ادمین Filament
|
|
||||||
│ ├── Resources/
|
|
||||||
│ │ ├── CountryResource.php
|
|
||||||
│ │ ├── ShipmentResource.php
|
|
||||||
│ │ ├── ShippingRateResource.php
|
|
||||||
│ │ ├── ShipmentItemResource.php
|
|
||||||
│ │ ├── WalletResource.php
|
|
||||||
│ │ ├── WalletTransactionResource.php
|
|
||||||
│ │ ├── PaymentResource.php
|
|
||||||
│ │ ├── DiscountCodeResource.php
|
|
||||||
│ │ ├── ExchangeRateHistoryResource.php
|
|
||||||
│ │ ├── RoleResource.php
|
|
||||||
│ │ └── UserResource.php
|
|
||||||
│ ├── Widgets/
|
|
||||||
│ │ ├── DashboardInfoWidget.php
|
|
||||||
│ │ ├── ExchangeRateWidget.php
|
|
||||||
│ │ ├── WalletStats.php
|
|
||||||
│ │ ├── TransactionChartWidget.php
|
|
||||||
│ │ └── RecentTransactionsWidget.php
|
|
||||||
│ └── Pages/
|
|
||||||
│ ├── IfnexSettingsPage.php
|
|
||||||
│ ├── PriceTestPage.php
|
|
||||||
│ └── Reports/
|
|
||||||
│ └── FinancialReport.php
|
|
||||||
│
|
│
|
||||||
├── database/
|
├── database/
|
||||||
│ ├── migrations/ # Migration ها
|
│ ├── migrations/ # 15+ migrations
|
||||||
│ │ ├── 2026_08_02_000001_create_countries_table.php
|
│ └── seeders/ # Countries, SystemSettings, DatabaseSeeder
|
||||||
│ │ ├── 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
|
|
||||||
│ │ ├── 2026_08_08_000001_create_shipment_items_table.php
|
|
||||||
│ │ ├── 2026_08_05_135026_create_discount_codes_table.php
|
|
||||||
│ │ ├── 2026_08_09_231738_create_exchange_rate_history_table.php
|
|
||||||
│ │ ├── 2026_08_10_080853_add_wallet_to_payment_gateway_enum.php
|
|
||||||
│ │ ├── 2026_08_10_082121_add_system_to_tracking_source_enum.php
|
|
||||||
│ │ ├── 2026_08_09_012526_create_notifications_table.php
|
|
||||||
│ │ └── 2026_08_09_220409_create_permission_tables.php
|
|
||||||
│ └── seeders/ # Seeders
|
|
||||||
│ ├── CountriesTableSeeder.php
|
|
||||||
│ ├── SystemSettingSeeder.php
|
|
||||||
│ ├── DatabaseSeeder.php
|
|
||||||
│ ├── RoleAndPermissionSeeder.php
|
|
||||||
│ └── SampleDataSeeder.php
|
|
||||||
│
|
|
||||||
├── routes/
|
|
||||||
│ ├── web.php # روتهای وب (فرمها و صفحات)
|
|
||||||
│ └── api.php # روتهای API
|
|
||||||
│
|
│
|
||||||
├── resources/views/
|
├── resources/views/
|
||||||
│ ├── layouts/app.blade.php # لایاوت اصلی
|
│ └── pdfs/ # awb.blade, invoice.blade, label.blade
|
||||||
│ ├── orders/ # فرم ثبت سفارش
|
|
||||||
│ ├── pricing/ # صفحه استعلام قیمت
|
|
||||||
│ └── pdfs/ # قالبهای PDF
|
|
||||||
│
|
│
|
||||||
├── config/
|
├── routes/
|
||||||
│ ├── ifnex.php # تنظیمات اختصاصی IFNEX
|
│ ├── api.php # REST API
|
||||||
│ └── cors.php # تنظیمات CORS
|
│ └── web.php # Web + Download Template
|
||||||
│
|
|
||||||
├── tests/
|
└── config/
|
||||||
│ └── Feature/
|
└── ifnex.php # تنظیمات اختصاصی
|
||||||
│ └── Services/
|
```
|
||||||
│ └── PriceCalculatorServiceTest.php # ⭐ تستهای موتور قیمت
|
|
||||||
│
|
---
|
||||||
├── bootstrap/
|
|
||||||
│ └── app.php # Bootstrap لاراول ۱۱
|
## 🗃️ Models
|
||||||
│
|
|
||||||
├── .env.example # نمونه فایل محیط
|
| Model | جدول | توضیح |
|
||||||
├── composer.json # وابستگیهای Composer
|
|-------|------|--------|
|
||||||
└── README.md # این فایل
|
| Country | countries | ۲۳۳ کشور با ۴ زون |
|
||||||
|
| Shipment | shipments | مرسولهها (مرکزی) |
|
||||||
|
| ShipmentItem | shipment_items | اقلام گمرکی |
|
||||||
API Endpoints
|
| ShipmentPackage | shipment_packages | بستههای چندگانه |
|
||||||
|
| ShipmentCarrierMapping | shipment_carrier_mappings | نگاشت شرکتهای حمل |
|
||||||
🔓 API های عمومی (نیاز به API Key)
|
| ShipmentTrackingEvent | shipment_tracking_events | رویدادهای ترکینگ |
|
||||||
|
| ShipmentStatusHistory | shipment_status_histories | تاریخچه تغییرات |
|
||||||
۱. رهگیری مرسوله
|
| ShippingRate | shipping_rates | تعرفههای حمل |
|
||||||
GET /api/v1/track/{awb_no}
|
| SystemSetting | system_settings | تنظیمات key-value |
|
||||||
|
| Currency | currencies | ارزهای پشتیبانی |
|
||||||
Headers:
|
| User | users | کاربران سیستم |
|
||||||
Authorization: Bearer {IFNEX_API_KEY}
|
| Wallet | wallets | کیف پول کاربران |
|
||||||
|
| WalletTransaction | wallet_transactions | تراکنشها |
|
||||||
مثال:
|
|
||||||
curl -H "Authorization: Bearer ifnex-local-dev-key" \
|
---
|
||||||
http://localhost:8000/api/v1/track/980100010
|
|
||||||
|
## 🎨 Filament Resources
|
||||||
پاسخ موفق (200 OK):
|
|
||||||
{
|
| Resource | توضیح |
|
||||||
"success": true,
|
|----------|--------|
|
||||||
"data": {
|
| ShipmentResource | مدیریت مرسولهها (جدول + فرم + جزئیات + CSV) |
|
||||||
"awb_no": "980100010",
|
| CountryResource | مدیریت کشورها |
|
||||||
"status": "delivered",
|
| ShippingRateResource | مدیریت تعرفهها |
|
||||||
"carrier_mappings": [...],
|
| CurrencyResource | مدیریت ارزها |
|
||||||
"tracking_events": [...]
|
|
||||||
}
|
### RelationManagers
|
||||||
}
|
|
||||||
|
| RelationManager | والد | توضیح |
|
||||||
۲. استعلام قیمت
|
|---------------|------|--------|
|
||||||
POST /api/v1/calculate
|
| TrackingEventsRelationManager | Shipment | رویدادهای ترکینگ |
|
||||||
|
| CarrierMappingsRelationManager | Shipment | نگاشت شرکتهای حمل |
|
||||||
Body (JSON):
|
| ItemsRelationManager | Shipment | اقلام گمرکی |
|
||||||
{
|
|
||||||
"direction": "export",
|
### صفحات سفارشی
|
||||||
"type": "DOC_NORMAL",
|
|
||||||
"country_iso": "US",
|
| صفحه | توضیح |
|
||||||
"weight": 2.5,
|
|-------|--------|
|
||||||
"volumetric_weight": 3.0,
|
| SettingsPage | تنظیمات سیستم (key-value) |
|
||||||
"extra_service": 10.00
|
| PriceTestPage | تست محاسبه قیمت |
|
||||||
}
|
| ImportRatesPage | آپلود اکسل نرخها |
|
||||||
|
|
||||||
مثال:
|
---
|
||||||
curl -X POST http://localhost:8000/api/v1/calculate \
|
|
||||||
-H "Content-Type: application/json" \
|
## 🔴 خط قرمزها
|
||||||
-d '{
|
|
||||||
"direction": "export",
|
| ❌ هرگز | ✅ همیشه |
|
||||||
"type": "DOC_NORMAL",
|
|------------|------------|
|
||||||
"country_iso": "US",
|
| برگرداندن countries به ۲ زون | ۴ زون مجزا |
|
||||||
"weight": 2.5,
|
| استفاده از ۲ نوع سرویس | ۳ نوع (DOC_NORMAL, DOC_ECONOMY, PARCEL) |
|
||||||
"volumetric_weight": 3.0
|
| ذخیره تاریخ شمسی در DB | ذخیره timestamp میلادی |
|
||||||
}'
|
| CORS `*` در Production | CORS محدود به دامنه وردپرس |
|
||||||
|
| کامیت `.env` در Git | در `.gitignore` باشد |
|
||||||
پاسخ موفق:
|
| `APP_DEBUG=true` در Production | `APP_DEBUG=false` |
|
||||||
{
|
| PDF فارسی (AWB/Invoice/Label) | همیشه انگلیسی |
|
||||||
"base_price": 40.00,
|
| کپی از DHL | طراحی منحصر به فرد IFNEX |
|
||||||
"net_dirham": 50.00,
|
|
||||||
"net_rial": 22750000,
|
---
|
||||||
"total_fee": 24906510.9,
|
|
||||||
"zone": 1,
|
## 📚 مستندات
|
||||||
"chargeable_weight": 3.0
|
|
||||||
}
|
| فایل | محتوا |
|
||||||
|
|------|-------|
|
||||||
💳 API های کیف پول (فاز ۲)
|
| [IFNEX_Phase0_Checklist.md](../01_Documents/IFNEX_Phase0_Checklist.md) | چکلیست کامل |
|
||||||
|
| [IFNEX_Roadmap.md](../01_Documents/IFNEX_Roadmap.md) | نقشه راه |
|
||||||
۱. بررسی موجودی
|
| [IFNEX_File_Map.md](../01_Documents/IFNEX_File_Map.md) | نقشه فایلها |
|
||||||
GET /api/v1/wallet/balance
|
| [DEPLOYMENT.md](../DEPLOYMENT.md) | راهنمای استقرار |
|
||||||
|
|
||||||
۲. شارژ کیف پول
|
---
|
||||||
POST /api/v1/wallet/charge
|
|
||||||
|
<div align="center">
|
||||||
Body:
|
|
||||||
|
© 2026 VernaSoft Group. All Rights Reserved.
|
||||||
{
|
|
||||||
"amount": 1000000,
|
</div>
|
||||||
"description": "شارژ اولیه"
|
|
||||||
}
|
|
||||||
|
|
||||||
۳. تاریخچه تراکنشها
|
|
||||||
GET /api/v1/wallet/transactions
|
|
||||||
|
|
||||||
🎟️ API های تخفیف (فاز ۲)
|
|
||||||
۱. لیست کدهای تخفیف فعال
|
|
||||||
|
|
||||||
GET /api/v1/discount-codes/active
|
|
||||||
|
|
||||||
۲. اعتبارسنجی کد تخفیف
|
|
||||||
POST /api/v1/discount-codes/validate
|
|
||||||
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"code": "SUMMER20",
|
|
||||||
"amount": 1000000
|
|
||||||
}
|
|
||||||
|
|
||||||
🔐 API های احراز هویت (فاز ۳)
|
|
||||||
|
|
||||||
۱. ورود و دریافت توکن Sanctum
|
|
||||||
POST /api/v1/auth/login
|
|
||||||
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"email": "user@example.com",
|
|
||||||
"password": "password",
|
|
||||||
"token_name": "api-token"
|
|
||||||
}
|
|
||||||
|
|
||||||
۲. خروج و حذف توکن
|
|
||||||
POST /api/v1/auth/logout
|
|
||||||
|
|
||||||
Header: Authorization: Bearer {token}
|
|
||||||
|
|
||||||
🛒 API های سفارشات مشتری (فاز ۳)
|
|
||||||
|
|
||||||
۱. پروفایل و آمار کاربر
|
|
||||||
GET /api/v1/customer/profile
|
|
||||||
|
|
||||||
۲. لیست کشورها برای فرم سفارش
|
|
||||||
GET /api/v1/customer/countries
|
|
||||||
|
|
||||||
۳. لیست سفارشات کاربر
|
|
||||||
GET /api/v1/customer/orders
|
|
||||||
|
|
||||||
۴. ثبت سفارش جدید
|
|
||||||
POST /api/v1/customer/orders
|
|
||||||
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"direction": "export",
|
|
||||||
"type": "PARCEL",
|
|
||||||
"from_country_id": 1,
|
|
||||||
"to_country_id": 2,
|
|
||||||
"weight": 2.5,
|
|
||||||
"sender_name": "نام فرستنده",
|
|
||||||
"sender_phone": "۰۹۱۲۳۴۵۶۷۸۹",
|
|
||||||
"sender_address": "آدرس",
|
|
||||||
"receiver_name": "نام گیرنده",
|
|
||||||
"receiver_phone": "۰۹۱۲۳۴۵۶۷۸۹",
|
|
||||||
"receiver_address": "آدرس",
|
|
||||||
"items": [
|
|
||||||
{
|
|
||||||
"description": "کالای گمرکی",
|
|
||||||
"hs_code": "8542390001",
|
|
||||||
"quantity": 1,
|
|
||||||
"unit_price": 100
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
۵. جزئیات یک سفارش
|
|
||||||
GET /api/v1/customer/orders/{shipment}
|
|
||||||
|
|
||||||
۶. لغو سفارش (فقط pending_payment)
|
|
||||||
POST /api/v1/customer/orders/{shipment}/cancel
|
|
||||||
|
|
||||||
۷. پرداخت از کیف پول
|
|
||||||
POST /api/v1/customer/orders/{shipment}/pay-wallet
|
|
||||||
|
|
||||||
۸. پرداخت از درگاه بانکی
|
|
||||||
POST /api/v1/customer/orders/{shipment}/pay-gateway
|
|
||||||
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"frontend_callback": "https://your-wordpress.com/order-payment/"
|
|
||||||
}
|
|
||||||
|
|
||||||
🔗 API پل وردپرس (فاز ۳)
|
|
||||||
|
|
||||||
POST /api/v1/bridge/login
|
|
||||||
|
|
||||||
Body:
|
|
||||||
{
|
|
||||||
"bridge_api_key": "ifnex-bridge-key",
|
|
||||||
"wp_user_id": 1,
|
|
||||||
"wp_user_email": "user@wordpress.local",
|
|
||||||
"wp_user_name": "نام کاربر"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Artisan Commands
|
|
||||||
📥 واردات دادهها
|
|
||||||
۱. واردات تعرفههای حمل از اکسل
|
|
||||||
|
|
||||||
# واردات عادی
|
|
||||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx
|
|
||||||
|
|
||||||
# پاکسازی و واردات مجدد
|
|
||||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx --clear
|
|
||||||
|
|
||||||
# تست بدون ذخیره (Dry Run)
|
|
||||||
php artisan ifnex:import:rates storage/app/public/rates.xlsx --dry-run
|
|
||||||
|
|
||||||
۲. واردات مرسولات تاریخی
|
|
||||||
|
|
||||||
php artisan ifnex:import:shipments storage/app/public/historical.xlsx
|
|
||||||
|
|
||||||
💱 بهروزرسانی نرخ ارز (فاز ۲)
|
|
||||||
# بهروزرسانی دستی
|
|
||||||
php artisan ifnex:update-exchange-rates
|
|
||||||
|
|
||||||
# تنظیم Cron Job برای بهروزرسانی روزانه
|
|
||||||
# crontab -e
|
|
||||||
# 0 0 * * * cd /path/to/04_Laravel && php artisan ifnex:update-exchange-rates >> /dev/null 2>&1
|
|
||||||
|
|
||||||
🔄 سینک کاربران وردپرس (فاز ۳)
|
|
||||||
# سینک دستی کاربران بین وردپرس و لاراول
|
|
||||||
php artisan ifnex:sync-wp-users
|
|
||||||
|
|
||||||
🔑 تولید توکن API (فاز ۲)
|
|
||||||
php artisan ifnex:token --user=admin@ifnex.local --name=api-token
|
|
||||||
|
|
||||||
🧪 تستها
|
|
||||||
# اجرای همه تستها
|
|
||||||
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
|
|
||||||
✅ اعمال هزینههای جانبی
|
|
||||||
✅ اعمال کد تخفیف درصدی و ثابت
|
|
||||||
|
|
||||||
۲. WalletServiceTest (فاز ۲)
|
|
||||||
تستهای مربوط به کیف پول و تراکنشها:
|
|
||||||
|
|
||||||
php artisan test --filter=WalletServiceTest
|
|
||||||
|
|
||||||
|
|
||||||
۳. PaymentControllerTest (فاز ۲)
|
|
||||||
تستهای مربوط به درگاه پرداخت:
|
|
||||||
|
|
||||||
php artisan test --filter=PaymentControllerTest
|
|
||||||
|
|
||||||
|
|
||||||
۴. DiscountCodeControllerTest (فاز ۲)
|
|
||||||
تستهای مربوط به کدهای تخفیف:
|
|
||||||
|
|
||||||
php artisan test --filter=DiscountCodeControllerTest
|
|
||||||
|
|
||||||
|
|
||||||
نوشتن تست جدید
|
|
||||||
برای نوشتن تست جدید، از این الگو استفاده کنید:
|
|
||||||
|
|
||||||
<?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'),
|
|
||||||
|
|
||||||
// Zarinpal Payment Gateway
|
|
||||||
'zarinpal' => [
|
|
||||||
'merchant_id' => env('ZARINPAL_MERCHANT_ID', 'fake-merchant-id-for-testing'),
|
|
||||||
'sandbox' => env('ZARINPAL_SANDBOX', true),
|
|
||||||
'callback_url' => env('ZARINPAL_CALLBACK_URL', 'http://localhost:8000/api/v1/payment/callback'),
|
|
||||||
],
|
|
||||||
|
|
||||||
// WordPress Bridge
|
|
||||||
'bridge_api_key' => env('IFNEX_BRIDGE_API_KEY', 'ifnex-bridge-key'),
|
|
||||||
|
|
||||||
// CORS
|
|
||||||
'cors_allowed_origins' => explode(',', env('CORS_ALLOWED_ORIGINS', '*')),
|
|
||||||
];
|
|
||||||
|
|
||||||
فایل 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.
|
|
||||||
665
DEPLOYMENT.md
665
DEPLOYMENT.md
@ -1,616 +1,227 @@
|
|||||||
# 📦 راهنمای دپلوی IFNEX Logistics Platform
|
# راهنمای استقرار IFNEX
|
||||||
|
|
||||||
راهنمای کامل انتقال پروژه از محیط توسعه (XAMPP) به سرور Production
|
> **آخرین بروزرسانی:** 2026-08-29
|
||||||
|
|
||||||
**نسخه:** 1.0.0
|
|
||||||
**تاریخ:** 2026-08-10
|
|
||||||
**نویسنده:** تیم توسعه IFNEX
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📋 فهرست مطالب
|
## محیطها
|
||||||
|
|
||||||
1. [پیشنیازهای سرور](#۱-پیشنیازهای-سرور)
|
| محیط | دامنه | نقش |
|
||||||
2. [ساختار پروژه](#۲-ساختار-پروژه)
|
|-------|-------|------|
|
||||||
3. [دپلوی Laravel (Backend)](#۳-دپلوی-laravel-backend)
|
| Production | api.ifnex.vernahost.ir | API لاراول |
|
||||||
4. [دپلوی WordPress (Frontend)](#۴-دپلوی-wordpress-frontend)
|
| Production | ifnex.vernahost.ir | وبسایت وردپرس |
|
||||||
5. [اتصال دو سیستم (Bridge)](#۵-اتصال-دو-سیستم-bridge)
|
| Local | localhost:8000 | توسعه |
|
||||||
6. [تنظیمات امنیتی](#۶-تنظیمات-امنیتی)
|
|
||||||
7. [Cron Jobs](#۷-cron-jobs)
|
|
||||||
8. [Backup Strategy](#۸-backup-strategy)
|
|
||||||
9. [چکلیست نهایی](#۹-چکلیست-نهایی)
|
|
||||||
10. [Troubleshooting](#۱۰-troubleshooting)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۱. پیشنیازهای سرور
|
## پیشنیازها
|
||||||
|
|
||||||
### حداقل نیازمندیها
|
- SSH دسترسی به سرور
|
||||||
|
- HestiaCP (مدیریت سرور)
|
||||||
| مورد | حداقل | پیشنهادی |
|
- Git روی سرور
|
||||||
|------|-------|----------|
|
- Composer روی سرور (اختیاری — بهتره locallly نصب کنی)
|
||||||
| PHP | 8.2 | 8.3 |
|
|
||||||
| MySQL | 8.0 | 8.0+ |
|
|
||||||
| RAM | 2GB | 4GB |
|
|
||||||
| Disk | 20GB SSD | 50GB NVMe |
|
|
||||||
| Web Server | Apache 2.4 / Nginx 1.24 | Nginx |
|
|
||||||
|
|
||||||
### افزونههای PHP مورد نیاز
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php -m | grep -E "pdo_mysql|mbstring|openssl|tokenizer|xml|ctype|json|bcmath|gd|zip|curl|intl"
|
|
||||||
```
|
|
||||||
|
|
||||||
لیست کامل:
|
|
||||||
- `pdo_mysql` - اتصال به MySQL
|
|
||||||
- `mbstring` - پشتیبانی UTF-8 (فارسی)
|
|
||||||
- `openssl` - رمزنگاری
|
|
||||||
- `tokenizer` - Laravel
|
|
||||||
- `xml` - Laravel
|
|
||||||
- `ctype` - Laravel
|
|
||||||
- `json` - Laravel
|
|
||||||
- `bcmath` - محاسبات مالی
|
|
||||||
- `gd` یا `imagick` - پردازش تصویر
|
|
||||||
- `zip` - Composer
|
|
||||||
- `curl` - درخواستهای HTTP
|
|
||||||
- `intl` - تاریخ شمسی (Jalali)
|
|
||||||
|
|
||||||
### نصب Composer و Node
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Composer
|
|
||||||
curl -sS https://getcomposer.org/installer | php
|
|
||||||
mv composer.phar /usr/local/bin/composer
|
|
||||||
|
|
||||||
# بررسی نسخه
|
|
||||||
composer --version
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۲. ساختار پروژه
|
## ۱. استقرار لاراول
|
||||||
|
|
||||||
```
|
### ۱.۱ کلون مخزن روی سرور
|
||||||
IFNEX-Logistics/
|
|
||||||
├── 01_WordPress/ # (قدیمی - قابل حذف بعد از مهاجرت)
|
|
||||||
├── 03_WordPress/ # ✅ وردپرس اصلی (Frontend مشتری)
|
|
||||||
│ └── wp-content/
|
|
||||||
│ ├── plugins/
|
|
||||||
│ │ └── ifnex-bridge/ # ✅ پلاگین اتصال به Laravel
|
|
||||||
│ └── themes/
|
|
||||||
│ └── ifnex/ # ✅ قالب اختصاصی
|
|
||||||
├── 04_Laravel/ # ✅ Laravel (Backend + پنل ادمین)
|
|
||||||
│ ├── app/
|
|
||||||
│ ├── database/
|
|
||||||
│ ├── public/ # Document root برای Laravel
|
|
||||||
│ └── routes/
|
|
||||||
└── DEPLOYMENT.md # این فایل
|
|
||||||
```
|
|
||||||
|
|
||||||
### Document Roots روی سرور
|
|
||||||
|
|
||||||
| دامنه | مسیر |
|
|
||||||
|-------|------|
|
|
||||||
| `ifnex.com` | `/var/www/IFNEX/03_WordPress` |
|
|
||||||
| `api.ifnex.com` یا `ifnex.com/api` | `/var/www/IFNEX/04_Laravel/public` |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ۳. دپلوی Laravel (Backend)
|
|
||||||
|
|
||||||
### گام ۱: آپلود فایلها
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# از سیستم محلی به سرور
|
cd /home/USER/web/api.ifnex.vernahost.ir/public_html
|
||||||
scp -r 04_Laravel user@server:/var/www/IFNEX/
|
git clone https://www.git.vernahost.ir/gitmodir110/ifnex.git .
|
||||||
|
|
||||||
# یا با rsync (پیشنهادی)
|
|
||||||
rsync -avz --exclude 'vendor' --exclude 'node_modules' \
|
|
||||||
04_Laravel/ user@server:/var/www/IFNEX/04_Laravel/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### گام ۲: نصب Dependencies
|
> اگر پوشه لاراول زیرمسیر `04_Laravel/` هست:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /var/www/IFNEX/04_Laravel
|
cd /home/USER/web/api.ifnex.vernahost.ir/public_html
|
||||||
|
ngit clone https://www.git.vernahost.ir/gitmodir110/ifnex.git tmp-ifnex
|
||||||
# نصب بدون dev packages (برای production)
|
cp -r tmp-ifnex/04_Laravel/* .
|
||||||
composer install --optimize-autoloader --no-dev --no-interaction
|
cp -r tmp-ifnex/04_Laravel/.* . 2>/dev/null
|
||||||
|
rm -rf tmp-ifnex
|
||||||
```
|
```
|
||||||
|
|
||||||
### گام ۳: تنظیم `.env`
|
### ۱.۲ نصب وابستگیها
|
||||||
|
|
||||||
فایل `.env` را برای production تنظیم کن:
|
```bash
|
||||||
|
ncd /home/USER/web/api.ifnex.vernahost.ir/public_html
|
||||||
|
composer install --no-dev --optimize-autoloader
|
||||||
|
```
|
||||||
|
|
||||||
|
### ۱.۳ تنظیم .env
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
nano .env
|
||||||
|
```
|
||||||
|
|
||||||
|
مقادیر مهم:
|
||||||
|
|
||||||
```env
|
```env
|
||||||
# ─── تنظیمات پایه ───────────────────────────
|
|
||||||
APP_NAME="IFNEX Logistics"
|
|
||||||
APP_ENV=production
|
APP_ENV=production
|
||||||
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
||||||
APP_DEBUG=false
|
APP_DEBUG=false
|
||||||
APP_URL=https://api.ifnex.com
|
APP_URL=https://api.ifnex.vernahost.ir
|
||||||
|
|
||||||
# ─── دیتابیس ─────────────────────────────────
|
DB_HOST=localhost
|
||||||
DB_CONNECTION=mysql
|
DB_DATABASE=ifnex_db
|
||||||
DB_HOST=127.0.0.1
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_DATABASE=ifnex_laravel
|
|
||||||
DB_USERNAME=ifnex_user
|
DB_USERNAME=ifnex_user
|
||||||
DB_PASSWORD=StrongPassword@123
|
DB_PASSWORD=STRONG_PASSWORD
|
||||||
|
|
||||||
# ─── Session و Cache ─────────────────────────
|
CORS_ALLOWED_ORIGINS=https://ifnex.vernahost.ir
|
||||||
SESSION_DRIVER=database
|
|
||||||
CACHE_STORE=redis
|
|
||||||
QUEUE_CONNECTION=database
|
|
||||||
|
|
||||||
# ─── Sanctum ─────────────────────────────────
|
|
||||||
SANCTUM_STATEFUL_DOMAINS=ifnex.com,www.ifnex.com
|
|
||||||
SESSION_DOMAIN=.ifnex.com
|
|
||||||
|
|
||||||
# ─── IFNEX Bridge ────────────────────────────
|
|
||||||
# ⚠️ مهم: این کلید باید با وردپرس یکسان باشد
|
|
||||||
IFNEX_BRIDGE_API_KEY=your-very-strong-random-key-here
|
|
||||||
|
|
||||||
# ─── Zarinpal ────────────────────────────────
|
|
||||||
ZARINPAL_MERCHANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
||||||
ZARINPAL_SANDBOX=false
|
ZARINPAL_SANDBOX=false
|
||||||
|
ZARINPAL_MERCHANT_ID=YOUR_MERCHANT_ID
|
||||||
# ─── Mail ────────────────────────────────────
|
|
||||||
MAIL_MAILER=smtp
|
|
||||||
MAIL_HOST=smtp.ifnex.com
|
|
||||||
MAIL_PORT=587
|
|
||||||
MAIL_USERNAME=noreply@ifnex.com
|
|
||||||
MAIL_PASSWORD=xxxxx
|
|
||||||
MAIL_ENCRYPTION=tls
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**تولید کلید امن:**
|
### ۱.۴ دیتابیس
|
||||||
```bash
|
|
||||||
php artisan key:generate --show
|
|
||||||
openssl rand -hex 32 # برای BRIDGE_API_KEY
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۴: ساخت دیتابیس
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mysql -u root -p
|
# ایجاد دیتابیس (اگر وجود نداره)
|
||||||
```
|
mysql -u root -p -e "CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE DATABASE ifnex_laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
||||||
CREATE USER 'ifnex_user'@'localhost' IDENTIFIED BY 'StrongPassword@123';
|
|
||||||
GRANT ALL PRIVILEGES ON ifnex_laravel.* TO 'ifnex_user'@'localhost';
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
EXIT;
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۵: Import دیتابیس از توسعه
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# از سیستم محلی (XAMPP)
|
|
||||||
mysqldump -u root ifnex_laravel > ifnex_backup.sql
|
|
||||||
|
|
||||||
# آپلود به سرور
|
|
||||||
scp ifnex_backup.sql user@server:/tmp/
|
|
||||||
|
|
||||||
# Import روی سرور
|
|
||||||
mysql -u ifnex_user -p ifnex_laravel < /tmp/ifnex_backup.sql
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۶: Migrations و Cache
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /var/www/IFNEX/04_Laravel
|
|
||||||
|
|
||||||
# اجرای migrations
|
# اجرای migrations
|
||||||
php artisan migrate --force
|
php artisan migrate --force
|
||||||
|
|
||||||
# Seed دادههای اولیه (نرخ ارز، zones، ...)
|
# اجرای seeders (فقط بار اول)
|
||||||
php artisan db:seed --class=SampleShippingRatesSeeder --force
|
php artisan db:seed --force
|
||||||
|
```
|
||||||
|
|
||||||
# ساخت cache ها برای سرعت
|
### ۱.۵ پیکربندی نهایی
|
||||||
|
|
||||||
|
```bash
|
||||||
php artisan config:cache
|
php artisan config:cache
|
||||||
php artisan route:cache
|
php artisan route:cache
|
||||||
php artisan view:cache
|
php artisan view:cache
|
||||||
php artisan event:cache
|
php artisan filament:clear-cached-components
|
||||||
|
|
||||||
# Permissions
|
|
||||||
chmod -R 775 storage bootstrap/cache
|
|
||||||
chown -R www-data:www-data storage bootstrap/cache
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۷: تنظیم Nginx
|
|
||||||
|
|
||||||
فایل `/etc/nginx/sites-available/ifnex-api`:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name api.ifnex.com;
|
|
||||||
return 301 https://$server_name$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
server_name api.ifnex.com;
|
|
||||||
|
|
||||||
root /var/www/IFNEX/04_Laravel/public;
|
|
||||||
index index.php;
|
|
||||||
|
|
||||||
# SSL
|
|
||||||
ssl_certificate /etc/letsencrypt/live/api.ifnex.com/fullchain.pem;
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/api.ifnex.com/privkey.pem;
|
|
||||||
|
|
||||||
# Security headers
|
|
||||||
add_header X-Frame-Options SAMEORIGIN;
|
|
||||||
add_header X-Content-Type-Options nosniff;
|
|
||||||
add_header X-XSS-Protection "1; mode=block";
|
|
||||||
|
|
||||||
# Upload limits
|
|
||||||
client_max_body_size 50M;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.php?$query_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
|
||||||
include fastcgi_params;
|
|
||||||
}
|
|
||||||
|
|
||||||
# مسدود کردن فایلهای حساس
|
|
||||||
location ~ /\.(env|git) {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
فعالسازی:
|
|
||||||
```bash
|
|
||||||
ln -s /etc/nginx/sites-available/ifnex-api /etc/nginx/sites-enabled/
|
|
||||||
nginx -t && systemctl reload nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۸: SSL رایگان با Let's Encrypt
|
|
||||||
|
|
||||||
```bash
|
|
||||||
apt install certbot python3-certbot-nginx
|
|
||||||
certbot --nginx -d api.ifnex.com
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۴. دپلوی WordPress (Frontend)
|
## ۲. استقرار وردپرس (پلاگین و قالب)
|
||||||
|
|
||||||
### گام ۱: آپلود فایلها
|
### ۲.۱ آپلود فایلها
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
rsync -avz --exclude 'wp-content/uploads' \
|
# قالب IFNEX
|
||||||
03_WordPress/ user@server:/var/www/IFNEX/03_WordPress/
|
cd /home/USER/web/ifnex.vernahost.ir/public_html/wp-content/themes/
|
||||||
|
# فایلهای قالب را اینجا آپلود/بروزرسانی کن
|
||||||
|
|
||||||
|
# پلاگین IFNEX Bridge
|
||||||
|
cd /home/USER/web/ifnex.vernahost.ir/public_html/wp-content/plugins/
|
||||||
|
# فایلهای پلاگین را اینجا آپلود/بروزرسانی کن
|
||||||
```
|
```
|
||||||
|
|
||||||
### گام ۲: تنظیم `wp-config.php`
|
### ۲.۲ تنظیم پلاگین
|
||||||
|
|
||||||
```php
|
در پیشخوان وردپرس → تنظیمات → IFNEX Bridge:
|
||||||
<?php
|
|
||||||
// ─── دیتابیس ─────────────────────────────
|
|
||||||
define('DB_NAME', 'ifnex_wp');
|
|
||||||
define('DB_USER', 'ifnex_wp_user');
|
|
||||||
define('DB_PASSWORD', 'StrongPassword@456');
|
|
||||||
define('DB_HOST', 'localhost');
|
|
||||||
define('DB_CHARSET', 'utf8mb4');
|
|
||||||
|
|
||||||
// ─── کلیدهای امنیتی ──────────────────────
|
| تنظیم | مقدار |
|
||||||
// از https://api.wordpress.org/secret-key/1.1/salt/ بگیرید
|
|--------|-------|
|
||||||
define('AUTH_KEY', 'xxxxx');
|
| API URL | `https://api.ifnex.vernahost.ir/api/v1` |
|
||||||
define('SECURE_AUTH_KEY', 'xxxxx');
|
| Bridge API Key | کلید مشترک بین وردپرس و لاراول |
|
||||||
define('LOGGED_IN_KEY', 'xxxxx');
|
|
||||||
define('NONCE_KEY', 'xxxxx');
|
|
||||||
|
|
||||||
// ─── Production ──────────────────────────
|
|
||||||
define('WP_DEBUG', false);
|
|
||||||
define('WP_DEBUG_LOG', false);
|
|
||||||
define('WP_DEBUG_DISPLAY', false);
|
|
||||||
define('SCRIPT_DEBUG', false);
|
|
||||||
|
|
||||||
// ─── Performance ─────────────────────────
|
|
||||||
define('WP_CACHE', true);
|
|
||||||
|
|
||||||
define('ABSPATH', __DIR__ . '/');
|
|
||||||
require_once ABSPATH . 'wp-settings.php';
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۳: Import دیتابیس وردپرس
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mysqldump -u root ifnexwp > ifnexwp_backup.sql
|
|
||||||
scp ifnexwp_backup.sql user@server:/tmp/
|
|
||||||
mysql -u ifnex_wp_user -p ifnex_wp < /tmp/ifnexwp_backup.sql
|
|
||||||
```
|
|
||||||
|
|
||||||
**اصلاح URLها در دیتابیس:**
|
|
||||||
```sql
|
|
||||||
UPDATE wp_options SET option_value = 'https://ifnex.com'
|
|
||||||
WHERE option_name IN ('siteurl', 'home');
|
|
||||||
|
|
||||||
UPDATE wp_posts SET post_content = REPLACE(post_content,
|
|
||||||
'http://localhost/IFNEX-Logistics/03_WordPress', 'https://ifnex.com');
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۴: تنظیم Nginx برای وردپرس
|
|
||||||
|
|
||||||
فایل `/etc/nginx/sites-available/ifnex-wp`:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
server_name ifnex.com www.ifnex.com;
|
|
||||||
|
|
||||||
root /var/www/IFNEX/03_WordPress;
|
|
||||||
index index.php;
|
|
||||||
|
|
||||||
ssl_certificate /etc/letsencrypt/live/ifnex.com/fullchain.pem;
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/ifnex.com/privkey.pem;
|
|
||||||
|
|
||||||
client_max_body_size 50M;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.php?$args;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
|
||||||
include fastcgi_params;
|
|
||||||
}
|
|
||||||
|
|
||||||
# کش فایلهای استاتیک
|
|
||||||
location ~* \.(jpg|jpeg|png|gif|css|js|svg|woff2)$ {
|
|
||||||
expires 30d;
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ /\.(env|git) {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### گام ۵: Permissions
|
|
||||||
|
|
||||||
```bash
|
|
||||||
chown -R www-data:www-data /var/www/IFNEX/03_WordPress
|
|
||||||
find /var/www/IFNEX/03_WordPress -type d -exec chmod 755 {} \;
|
|
||||||
find /var/www/IFNEX/03_WordPress -type f -exec chmod 644 {} \;
|
|
||||||
chmod -R 775 /var/www/IFNEX/03_WordPress/wp-content/uploads
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۵. اتصال دو سیستم (Bridge)
|
## ۳. بروزرسانی (بعد از تغییرات جدید)
|
||||||
|
|
||||||
### گام ۱: تنظیم پلاگین IFNEX Bridge
|
### ۳.۱ لاراول
|
||||||
|
|
||||||
در پیشخوان وردپرس:
|
|
||||||
**IFNEX → تنظیمات**
|
|
||||||
|
|
||||||
| فیلد | مقدار |
|
|
||||||
|------|-------|
|
|
||||||
| API URL | `https://api.ifnex.com/api/v1` |
|
|
||||||
| API Key | (کلید عمومی از Laravel) |
|
|
||||||
| Bridge API Key | (همان مقدار `.env` لاراول) |
|
|
||||||
|
|
||||||
### گام ۲: بررسی اتصال
|
|
||||||
|
|
||||||
در وردپرس یک صفحه تست بساز با شورتکد:
|
|
||||||
```
|
|
||||||
[ifnex_wallet_balance]
|
|
||||||
```
|
|
||||||
|
|
||||||
اگر موجودی نمایش داده شد، اتصال برقرار است. ✅
|
|
||||||
|
|
||||||
### گام ۳: Sync کاربران
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /var/www/IFNEX/04_Laravel
|
cd /home/USER/web/api.ifnex.vernahost.ir/public_html
|
||||||
php artisan ifnex:sync-wp-users \
|
|
||||||
--wp-db-name=ifnex_wp \
|
# خاموش کردن موقت سایت
|
||||||
--wp-db-user=ifnex_wp_user \
|
php artisan down
|
||||||
--wp-db-pass=StrongPassword@456
|
|
||||||
|
# بکاپ
|
||||||
|
cp .env .env.backup
|
||||||
|
|
||||||
|
# دریافت تغییرات
|
||||||
|
git fetch --all
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# وابستگیها (اگه composer.json تغییر کرده)
|
||||||
|
composer install --no-dev --optimize-autoloader
|
||||||
|
|
||||||
|
# مایگریشنهای جدید
|
||||||
|
php artisan migrate --force
|
||||||
|
|
||||||
|
# پاکسازی کش
|
||||||
|
php artisan config:clear
|
||||||
|
php artisan cache:clear
|
||||||
|
php artisan route:clear
|
||||||
|
php artisan view:clear
|
||||||
|
php artisan filament:clear-cached-components
|
||||||
|
|
||||||
|
# کش مجدد
|
||||||
|
php artisan config:cache
|
||||||
|
php artisan route:cache
|
||||||
|
php artisan view:cache
|
||||||
|
|
||||||
|
# روشن کردن سایت
|
||||||
|
php artisan up
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ۳.۲ وردپرس
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /home/USER/web/ifnex.vernahost.ir/public_html/wp-content/plugins/ifnex-bridge
|
||||||
|
git pull origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
> اگر پلاگین از طریق گیت کلون نشده، فایلها را دستی آپلود کن.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۶. تنظیمات امنیتی
|
## ۴. تنظیمات Cron
|
||||||
|
|
||||||
### چکلیست امنیتی
|
|
||||||
|
|
||||||
- [ ] `APP_DEBUG=false` در Laravel
|
|
||||||
- [ ] `WP_DEBUG=false` در WordPress
|
|
||||||
- [ ] SSL فعال روی هر دو دامنه
|
|
||||||
- [ ] فایلهای `.env` و `.git` مسدود شدهاند
|
|
||||||
- [ ] رمزهای قوی برای دیتابیس
|
|
||||||
- [ ] `IFNEX_BRIDGE_API_KEY` قوی و تصادفی
|
|
||||||
- [ ] حذف فایلهای debug از production:
|
|
||||||
```bash
|
|
||||||
rm -f debug-payment.php check-*.php test-*.php
|
|
||||||
```
|
|
||||||
- [ ] محدودیت دسترسی به `/admin` (اختیاری: IP whitelist)
|
|
||||||
|
|
||||||
### Firewall (UFW)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ufw allow 22/tcp # SSH
|
|
||||||
ufw allow 80/tcp # HTTP
|
|
||||||
ufw allow 443/tcp # HTTPS
|
|
||||||
ufw enable
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ۷. Cron Jobs
|
|
||||||
|
|
||||||
### Laravel Scheduler
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
crontab -e
|
crontab -e
|
||||||
```
|
```
|
||||||
|
|
||||||
```cron
|
```cron
|
||||||
* * * * * cd /var/www/IFNEX/04_Laravel && php artisan schedule:run >> /dev/null 2>&1
|
# بهروزرسانی نرخ ارز (اگر ExchangeRateService فعال شد)
|
||||||
```
|
0 0 * * * cd /home/USER/web/api.ifnex.vernahost.ir/public_html && php artisan ifnex:update-exchange-rates >> /dev/null 2>&1
|
||||||
|
|
||||||
### Cron آپدیت نرخ ارز (هر ساعت)
|
|
||||||
|
|
||||||
اگر از scheduler استفاده نمیکنید:
|
|
||||||
|
|
||||||
```cron
|
|
||||||
0 * * * * cd /var/www/IFNEX/04_Laravel && php artisan ifnex:update-rates >> /dev/null 2>&1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Cron Backup روزانه (ساعت ۲ بامداد)
|
|
||||||
|
|
||||||
```cron
|
|
||||||
0 2 * * * /var/www/IFNEX/scripts/backup.sh >> /var/log/ifnex-backup.log 2>&1
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۸. Backup Strategy
|
## ۵. عیبیابی
|
||||||
|
|
||||||
### اسکریپت `backup.sh`
|
### بررسی لاگها
|
||||||
|
|
||||||
فایل `/var/www/IFNEX/scripts/backup.sh`:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
# لاگ لاراول
|
||||||
# ─── IFNEX Backup Script ───────────────────
|
tail -f /home/USER/web/api.ifnex.vernahost.ir/public_html/storage/logs/laravel.log
|
||||||
|
|
||||||
BACKUP_DIR="/var/backups/ifnex"
|
# لاگ HestiaCP
|
||||||
DATE=$(date +%Y%m%d_%H%M%S)
|
tail -f /var/log/hestia.log
|
||||||
RETENTION_DAYS=7
|
|
||||||
|
|
||||||
mkdir -p $BACKUP_DIR
|
|
||||||
|
|
||||||
# Backup دیتابیس Laravel
|
|
||||||
mysqldump -u ifnex_user -p'StrongPassword@123' ifnex_laravel \
|
|
||||||
| gzip > $BACKUP_DIR/laravel_$DATE.sql.gz
|
|
||||||
|
|
||||||
# Backup دیتابیس WordPress
|
|
||||||
mysqldump -u ifnex_wp_user -p'StrongPassword@456' ifnex_wp \
|
|
||||||
| gzip > $BACKUP_DIR/wordpress_$DATE.sql.gz
|
|
||||||
|
|
||||||
# Backup فایلهای آپلود وردپرس
|
|
||||||
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz \
|
|
||||||
-C /var/www/IFNEX/03_WordPress/wp-content uploads
|
|
||||||
|
|
||||||
# حذف backup های قدیمی
|
|
||||||
find $BACKUP_DIR -name "*.gz" -mtime +$RETENTION_DAYS -delete
|
|
||||||
|
|
||||||
echo "✅ Backup completed: $DATE"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
اجرا:
|
### کلیر کش
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chmod +x /var/www/IFNEX/scripts/backup.sh
|
php artisan optimize:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
### بررسی وضعیت
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan about
|
||||||
|
php artisan route:list --path=api/v1
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۹. چکلیست نهایی
|
## ۶. نکات امنیتی
|
||||||
|
|
||||||
### قبل از Go-Live
|
- `.env` هرگز در گیت کامیت نشود (در `.gitignore` باشد)
|
||||||
|
- `APP_DEBUG=false` در Production
|
||||||
**Laravel:**
|
- `CORS_ALLOWED_ORIGINS` فقط دامنه وردپرس
|
||||||
- [ ] `php artisan migrate --force` بدون خطا
|
- `IFNEX_API_KEY` یک کلید قوی و تصادفی باشد
|
||||||
- [ ] `php artisan config:cache` موفق
|
- SSL/HTTPS فعال باشد
|
||||||
- [ ] ورود به `/admin` با ادمین
|
- رمز عبور دیتابیس قوی باشد
|
||||||
- [ ] داشبورد بدون خطا لود میشود
|
|
||||||
- [ ] ویجتهای نرخ ارز نمایش داده میشوند
|
|
||||||
|
|
||||||
**WordPress:**
|
|
||||||
- [ ] صفحه اصلی بدون خطا
|
|
||||||
- [ ] ورود مشتری کار میکند
|
|
||||||
- [ ] `/new-order/` فرم را نمایش میدهد
|
|
||||||
- [ ] `/my-orders/` لیست سفارشات را نشان میدهد
|
|
||||||
- [ ] تست کامل: ثبت سفارش → پرداخت → تغییر status
|
|
||||||
|
|
||||||
**اتصال:**
|
|
||||||
- [ ] Bridge API Key یکسان در هر دو طرف
|
|
||||||
- [ ] تست پرداخت از کیف پول موفق
|
|
||||||
- [ ] Tracking event ثبت میشود
|
|
||||||
|
|
||||||
### بعد از Go-Live
|
|
||||||
|
|
||||||
- [ ] مانیتورینگ لاگها:
|
|
||||||
```bash
|
|
||||||
tail -f /var/www/IFNEX/04_Laravel/storage/logs/laravel.log
|
|
||||||
```
|
|
||||||
- [ ] بررسی cron jobs: `crontab -l`
|
|
||||||
- [ ] تست backup و restore
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ۱۰. Troubleshooting
|
© 2026 VernaSoft Group. Internal use only.
|
||||||
|
|
||||||
### مشکل: خطای 500 در Laravel
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# بررسی لاگ
|
|
||||||
tail -100 storage/logs/laravel.log
|
|
||||||
|
|
||||||
# پاک کردن cache
|
|
||||||
php artisan config:clear
|
|
||||||
php artisan cache:clear
|
|
||||||
|
|
||||||
# بررسی permissions
|
|
||||||
chmod -R 775 storage bootstrap/cache
|
|
||||||
```
|
|
||||||
|
|
||||||
### مشکل: وردپرس به Laravel وصل نمیشود
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# تست اتصال از سرور وردپرس
|
|
||||||
curl -X POST https://api.ifnex.com/api/v1/bridge/login \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"bridge_api_key":"YOUR_KEY","wp_user_id":1,"wp_user_email":"test@test.com"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### مشکل: خطای "توکن احراز هویت یافت نشد"
|
|
||||||
|
|
||||||
1. بررسی کنید کاربر در Laravel وجود دارد (sync شده)
|
|
||||||
2. توکنهای قدیمی را پاک کنید:
|
|
||||||
```sql
|
|
||||||
DELETE FROM wp_usermeta WHERE meta_key LIKE 'ifnex_laravel%';
|
|
||||||
```
|
|
||||||
3. دوباره لاگین کنید
|
|
||||||
|
|
||||||
### مشکل: SSL certificate error
|
|
||||||
|
|
||||||
```bash
|
|
||||||
certbot renew --dry-run
|
|
||||||
certbot renew
|
|
||||||
```
|
|
||||||
|
|
||||||
### مشکل: خطای CORS
|
|
||||||
|
|
||||||
در `config/cors.php` لاراول:
|
|
||||||
```php
|
|
||||||
'paths' => ['api/*', 'sanctum/csrf-cookie'],
|
|
||||||
'allowed_origins' => ['https://ifnex.com', 'https://www.ifnex.com'],
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 پشتیبانی
|
|
||||||
|
|
||||||
در صورت بروز مشکل:
|
|
||||||
- ایمیل: dev@ifnex.com
|
|
||||||
- مستندات Laravel: https://laravel.com/docs
|
|
||||||
- مستندات WordPress: https://wordpress.org/documentation/
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**پایان راهنمای دپلوی**
|
|
||||||
🎉 موفق باشید!
|
|
||||||
|
|||||||
573
README.md
573
README.md
@ -1,381 +1,246 @@
|
|||||||
# 🚀 IFNEX Logistics Management System
|
<div align="center">
|
||||||
> جایگزینی فرآیندهای دستی مبتنی بر اکسل با یک معماری Headless مدرن
|
|
||||||
|
|
||||||
| مورد | توضیحات |
|
# 🚀 IFNEX Logistics Management System
|
||||||
| :--- | :--- |
|
|
||||||
| **ویرایش سند** | v4.2 (Laravel 11 + Filament 3.3 + فاز ۰ کامل + فاز ۱ کامل + فاز ۲ کامل + فاز ۳ کامل) |
|
### پلتفرم جامع مدیریت لجستیک بینالمللی
|
||||||
| **تاریخ آخرین بهروزرسانی** | 2026-08-10 |
|
|
||||||
| **توسعهدهنده** | VernaSoft Group — Kazem Alghasi |
|
[](https://laravel.com)
|
||||||
| **مشتری** | شرکت حمل و نقل بینالمللی ایفنکس (IFNEX) — اصفهان |
|
[](https://php.net)
|
||||||
|
[](https://filamentphp.com)
|
||||||
|
[](https://wordpress.org)
|
||||||
|
[](https://mysql.com)
|
||||||
|
[]()
|
||||||
|
[]()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*جایگزینی فرآیندهای دستی مبتنی بر اکسل با معماری Headless مدرن*
|
||||||
|
|
||||||
|
**[📚 مستندات](#-مستندات)** • **[⚡ شروع سریع](#-شروع-سریع)** • **[🏗️ معماری](#%EF%B8%8F-معماری-سیستم)** • **[📞 پشتیبانی](#-تماس)**
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📖 درباره پروژه
|
## 📖 درباره پروژه
|
||||||
|
|
||||||
سیستم مدیریت لجستیک ایفنکس (IFNEX) یک راهحل جامع برای جایگزینی فرآیندهای مبتنی بر فایلهای اکسل در شرکتهای حمل و نقل بینالمللی است. این سیستم با استفاده از معماری **Headless**، وردپرس را برای ظاهر سایت و سئو، و لاراول را بهعنوان قلب تپنده و موتور محاسباتی به کار میگیرد.
|
**IFNEX** یک راهحل جامع برای شرکتهای حملونقل بینالمللی است که فرآیندهای مبتنی بر فایلهای اکسل را با یک سیستم Headless مدرن جایگزین میکند.
|
||||||
|
|
||||||
### چرا این پروژه متفاوت است؟
|
این سیستم شامل:
|
||||||
|
|
||||||
بهجای آنکه اپراتورها وزن حجمی را محاسبه کنند، زونها را در ۴ شیت مختلف جستجو کنند و با ماشینحساب قیمت نهایی را حساب کنند، اکنون تمام این فرآیند در کسر از ثانیه و بدون هیچ خطای انسانی انجام میشود. همچنین، به دلیل تحریمهای بینالمللی و مسدود بودن دسترسی مستقیم به API شرکتهای DHL/FedEx/UPS از ایران، این سیستم از طریق یک سرور VPS پل (در فاز ۳) مشکل ترکینگ خودکار را حل میکند.
|
- **موتور قیمتگذاری هوشمند** با ۴ زون و ۳ نوع سرویس
|
||||||
|
- **ثبت سفارش آنلاین** چند بستهای با محاسبه لحظهای قیمت
|
||||||
|
- **تولید خودکار اسناد** (AWB, Invoice, Label) با بارکد استاندارد
|
||||||
|
- **پورتال مشتری کامل** با کیف پول، پرداخت آنلاین و اعلانها
|
||||||
|
- **پنل مدیریت قدرتمند** با Filament 3.3
|
||||||
|
- **سیستم ترکینگ** با قابلیت مهاجرت دادههای تاریخی
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🏗️ معماری سیستم
|
## 🏗️ معماری سیستم
|
||||||
|
|
||||||
سیستم بر اساس الگوی Headless توسعه یافته است. فرانتاند (وردپرس) و بکاند (لاراول) کاملاً از هم جدا شدهاند و فقط از طریق REST API با هم ارتباط دارند.
|
این پروژه بر اساس الگوی **Headless** طراحی شده است — فرانتاند (WordPress) و بکاند (Laravel) کاملاً جدا و فقط از طریق REST API با هم ارتباط دارند.
|
||||||
|
|
||||||
┌─────────────────┐ REST API ┌─────────────────┐
|
```
|
||||||
│ WordPress │ ←─────────────────────→ │ Laravel 11 │
|
┌──────────────────────────────────────────────────────┐
|
||||||
│ (Frontend) │ پلاگین IFNEX Bridge │ (Backend) │
|
│ CLIENT BROWSER │
|
||||||
│ │ │ + Filament │
|
└────────────────────────┬─────────────────────────────┘
|
||||||
└─────────────────┘ └────────┬────────┘
|
│
|
||||||
│
|
┌────────────────────────▼─────────────────────────────┐
|
||||||
┌────────┴────────┐
|
│ WORDPRESS (Frontend) │
|
||||||
│ MySQL 8 │
|
│ ┌───────────────────┐ ┌──────────────────────────┐ │
|
||||||
└─────────────────┘
|
│ │ IFNEX Theme │ │ IFNEX Bridge Plugin │ │
|
||||||
│
|
│ │ (Landing Page) │ │ (REST Client) │ │
|
||||||
(فاز ۳) │
|
│ └───────────────────┘ └────────────┬─────────────┘ │
|
||||||
┌────────┴────────┐
|
└───────────────────────────────────┼───────────────────┘
|
||||||
│ VPS پل خارج │
|
│ REST API (Sanctum)
|
||||||
│ (هلند/آلمان) │
|
┌───────────────────────────────────▼───────────────────┐
|
||||||
└────────┬────────┘
|
│ LARAVEL 11 (Backend) │
|
||||||
│
|
│ ┌─────────────────┐ ┌──────────────┐ ┌────────────┐ │
|
||||||
┌────────┴────────┐
|
│ │ Filament │ │ API │ │ Services │ │
|
||||||
│ TrackingMore / │
|
│ │ Admin Panel │ │ Controllers │ │ (Pricing, │ │
|
||||||
│ 17track API │
|
│ │ │ │ │ │ PDF, │ │
|
||||||
└─────────────────┘
|
│ └─────────────────┘ └──────┬───────┘ │ Payment) │ │
|
||||||
|
└──────────────────────────┼────┼─────────┘────────────┘ │
|
||||||
|
│ │ │
|
||||||
| لایه | تکنولوژی | نقش |
|
┌──────▼────▼────┐ │
|
||||||
| :--- | :--- | :--- |
|
│ MySQL 8 │ │
|
||||||
| **فرانتاند** | WordPress 7.0.3 + پوسته سفارشی IFNEX + Polylang | مدیریت ظاهر، چندزبانه، پورتال مشتری، لندینگ پیجها |
|
│ Database │ │
|
||||||
| **بکاند** | Laravel 11 + Filament 3.3 | API سرور، پنل ادمین، موتور قیمتگذاری، صدور PDF، کیف پول، پرداخت آنلاین |
|
└───────────────┘ │
|
||||||
| **پل ارتباطی** | پلاگین اختصاصی IFNEX Bridge | ارسال درخواستهای کاربر از وردپرس به لاراول، مدیریت توکن Sanctum |
|
```
|
||||||
| **دیتابیس** | MySQL 8 | ذخیرهسازی دادهها با پشتیبانی از JSON columns |
|
|
||||||
| **زیرساخت رهگیری** | VPS خارج از کشور (در فاز ۴) | واسط برای دسترسی به APIهای رهگیری بینالمللی |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🗺️ نقشه راه ۴ فازی
|
|
||||||
|
|
||||||
این پروژه به چهار فاز تقسیم شده تا هم تحویل تدریجی ارزش به مشتری حفظ شود و هم ریسک دوبارهکاری حذف گردد.
|
|
||||||
|
|
||||||
| فاز | هدف اصلی | مدت زمان | وضعیت |
|
|
||||||
| :--- | :--- | :--- | :--- |
|
|
||||||
| **فاز ۰** | بنیان داده + وبسایت + ترکینگ دستی + مهاجرت دادههای تاریخی | ۴ هفته | ✅ کامل |
|
|
||||||
| **فاز ۱** | موتور قیمتگذاری کامل + ثبت سفارش آنلاین + تولید PDFها + استعلام قیمت | ۴-۶ هفته | ✅ کامل |
|
|
||||||
| **فاز ۲** | حساب کاربری مشتری + کیف پول + پرداخت آنلاین + تخفیف حجمی + پنل مالی | ۴ هفته | ✅ کامل |
|
|
||||||
| **فاز ۳** | پورتال مشتری کامل + پلاگین وردپرس + سینک کاربران + پرداخت سفارش | ۶ هفته | ✅ کامل |
|
|
||||||
|
|
||||||
> 💡 جزئیات کامل هر فاز، اسکیمای دیتابیس، جدول زمانی و معیارهای پذیرش در سند `01_Documents/Phase0_Proposal.md` آمده است.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ ویژگیهای کلیدی
|
|
||||||
|
|
||||||
### فاز ۰ (تکمیل شده) ✅
|
|
||||||
|
|
||||||
1. **اسکیمای دیتابیس اصلاحشده** (بر اساس فایل اکسل عملیاتی)
|
|
||||||
- جدول `countries` با ۴ زون مجزا (صادرات/واردات × پارسل/داکیومنت)
|
|
||||||
- پشتیبانی از ۳ نوع سرویس: `DOC_NORMAL`, `DOC_ECONOMY`, `PARCEL`
|
|
||||||
- جدول `shipment_carrier_mappings` برای نگاشت چند شرکت حمل به هر بارنامه
|
|
||||||
- جدول `shipment_tracking_events` برای ذخیره تایملاین کامل رویدادهای هر مرسوله
|
|
||||||
- جدول `system_settings` برای ذخیره تنظیمات سیستم (VAT، نرخ ارز، ضریب سود)
|
|
||||||
- جدول `shipment_items` برای اقلام گمرکی (۹ ردیف)
|
|
||||||
|
|
||||||
2. **پنل مدیریت اختصاصی (Laravel Filament)**
|
|
||||||
- مدیریت ۲۳۳ کشور با زونهای صادرات و واردات
|
|
||||||
- فرم تنظیمات سیستم: تغییر سریع ارزها و ضریب سود بدون دستکاری کد
|
|
||||||
- UX تخصصی اپراتور ترکینگ: افزودن رویداد در چند ثانیه با فیلدهای از پیش پر شده
|
|
||||||
- **تببندی ویجتهای داشبورد:** اطلاعات کلی، نرخ ارز، آمار کیف پول
|
|
||||||
- **رابط کاربری سفارشی:** رنگ Navy gradient، فونت Vazirmatn، RTL کامل
|
|
||||||
|
|
||||||
3. **ارتباطات API و فرانتاند**
|
|
||||||
- **API ترکینگ:** `GET /api/track/{awb_no}` با API Key + Rate Limiting + CORS
|
|
||||||
- **API استعلام قیمت:** `POST /api/v1/calculate`
|
|
||||||
- **API احراز هویت:** `POST /api/v1/auth/login` + `POST /api/v1/auth/logout` (Sanctum)
|
|
||||||
- **API سفارشات مشتری:** ۶ endpoint برای پروفایل، سفارشات، پرداخت و لغو
|
|
||||||
- **API کیف پول:** موجودی، تراکنشها، تنظیمات ادمین
|
|
||||||
- **API تخفیف:** لیست و اعتبارسنجی کدهای تخفیف
|
|
||||||
- **پلاگین IFNEX Bridge:** شورتکدهای `[ifnex_tracking_form]`، `[ifnex_tracking_status]`، `[ifnex_wallet_balance]`، `[ifnex_transactions]`
|
|
||||||
- **امنیت:** API Key + Rate Limiting + CORS whitelist + Form Request Validation + Sanctum
|
|
||||||
|
|
||||||
4. **مهاجرت دادههای تاریخی**
|
|
||||||
- انتقال ۳۹۵۰ رکورد تاریخی از فایل اکسل به دیتابیس جدید
|
|
||||||
- اعتبارسنجی و پاکسازی خودکار دادهها
|
|
||||||
- import ۴۰۴ رکورد تعرفههای حمل
|
|
||||||
- import ۹۸ رویداد ترکینگ دستی
|
|
||||||
|
|
||||||
### فاز ۱ (تکمیل شده) ✅
|
|
||||||
|
|
||||||
1. **موتور قیمتگذاری کامل (`PriceCalculatorService`)**
|
|
||||||
- محاسبه خودکار قیمت بر اساس وزن، زون، نوع سرویس و جهت ارسال
|
|
||||||
- پشتیبانی از ۴ زون مجزا (export/import × doc/parcel)
|
|
||||||
- اعمال ضریب سود، VAT و هزینههای اضافی
|
|
||||||
- **تستهای کامل:** Feature tests و Service tests با پوشش ۱۰۰٪
|
|
||||||
|
|
||||||
2. **فرم ثبت سفارش آنلاین**
|
|
||||||
- فرم عمومی برای مشتریان با ۹ ردیف کالای گمرکی
|
|
||||||
- اعتبارسنجی خودکار و محاسبه لحظهای قیمت
|
|
||||||
- تولید AWB number خودکار با فرمت `IFN-YYYY-XXXXX`
|
|
||||||
|
|
||||||
3. **تولید PDFهای حرفهای**
|
|
||||||
- **AWB:** بارنامه هوایی با لوگوی IFNEX
|
|
||||||
- **INVOICE:** فاکتور تجاری با جدول ۹ ردیف کالای گمرکی
|
|
||||||
- **LABEL:** لیبل چاپی برای بستهها (پرینتر لیزری + کاغذ چسبان A4)
|
|
||||||
- تطبیق اولیه با قالبهای اکسل + لوگوی استخراجشده
|
|
||||||
|
|
||||||
4. **صفحه استعلام قیمت واقعی**
|
|
||||||
- رابط کاربری عمومی برای محاسبه قیمت تقریبی حمل
|
|
||||||
- نمایش قیمت پایه (درهم) و قیمت نهایی (ریال)
|
|
||||||
|
|
||||||
5. **ماژول ایمپورت اکسل تعرفهها**
|
|
||||||
- کامند `php artisan ifnex:import:rates` با قابلیتهای `--clear` و `--dry-run`
|
|
||||||
- پشتیبانی از شیتهای Export Rate، Import Rate و DocEco
|
|
||||||
- تبدیل خودکار واحد قیمت (ریال → درهم) برای شیتهای DocNor/DocEco
|
|
||||||
|
|
||||||
### فاز ۲ (تکمیل شده) ✅
|
|
||||||
|
|
||||||
1. **سیستم کیف پول (Wallet)**
|
|
||||||
- API شارژ اعتبار (دستی و خودکار)
|
|
||||||
- API بررسی موجودی
|
|
||||||
- API تاریخچه تراکنشها
|
|
||||||
- **اتصال درگاه پرداخت زرینپال** با Mock Gateway برای تست
|
|
||||||
- پرداخت آنلاین کامل با بازگشت به فرانتاند
|
|
||||||
|
|
||||||
2. **سیستم تخفیف (Discount Codes)**
|
|
||||||
- API لیست کدهای تخفیف فعال
|
|
||||||
- API اعتبارسنجی کد تخفیف
|
|
||||||
- پشتیبانی از تخفیف درصدی و ثابت
|
|
||||||
- **DiscountCodeResource** در Filament با form/table/filters کامل
|
|
||||||
|
|
||||||
3. **بهروزرسانی خودکار نرخ ارز**
|
|
||||||
- Artisan Command برای بهروزرسانی روزانه
|
|
||||||
- پشتیبانی از ECB و FreeCurrencyAPI
|
|
||||||
- **ردیابی تاریخچه نرخ ارز** با `ExchangeRateHistory` و `ExchangeRateHistoryResource`
|
|
||||||
|
|
||||||
4. **پنل مالی در Filament**
|
|
||||||
- **FinanceOverviewWidget** — خلاصه مالی
|
|
||||||
- **TransactionChartWidget** — نمودار تراکنشها
|
|
||||||
- **RecentTransactionsWidget** — آخرین تراکنشها
|
|
||||||
- **PaymentResource** — مشاهده تراکنشهای درگاه
|
|
||||||
- **WalletTransactionResource** — CRUD کامل تراکنشهای کیف پول
|
|
||||||
- خروجی CSV برای تراکنشها و مرسولات
|
|
||||||
|
|
||||||
5. **کنترل دسترسی مبتنی بر نقش (RBAC)**
|
|
||||||
- یکپارچگی با `spatie/laravel-permission`
|
|
||||||
- **RoleResource** و **UserResource** در Filament
|
|
||||||
- **RoleAndPermissionSeeder** برای تنظیم اولیه
|
|
||||||
|
|
||||||
6. **یکپارچگی وردپرس ↔ لاراول**
|
|
||||||
- دستور Artisan `ifnex:sync-wp-users` برای سینک کاربران
|
|
||||||
- پلاگین IFNEX Bridge گسترش یافته:
|
|
||||||
- شورتکد `[ifnex_wallet_balance]` برای موجودی کیف پول
|
|
||||||
- شورتکد `[ifnex_transactions]` برای لیست تراکنشها
|
|
||||||
- AJAX handlers برای موجودی و تراکنشها
|
|
||||||
|
|
||||||
### فاز ۳ (تکمیل شده) ✅
|
|
||||||
|
|
||||||
1. **سیستم ثبت سفارش مشتری (Customer Ordering)**
|
|
||||||
- **CustomerOrderController** با ۶ endpoint:
|
|
||||||
- `GET /api/v1/customer/profile` — پروفایل و آمار کاربر
|
|
||||||
- `GET /api/v1/customer/countries` — لیست کشورها
|
|
||||||
- `GET /api/v1/customer/orders` — لیست سفارشات
|
|
||||||
- `POST /api/v1/customer/orders` — ثبت سفارش جدید
|
|
||||||
- `GET /api/v1/customer/orders/{shipment}` — جزئیات سفارش
|
|
||||||
- `POST /api/v1/customer/orders/{shipment}/cancel` — لغو سفارش
|
|
||||||
- تولید خودکار شماره AWB با فرمت `IFN-YYYY-XXXXX`
|
|
||||||
- وضعیتهای جدید: `pending_payment` و `cancelled`
|
|
||||||
- اعتبارسنجی کامل و محاسبه لحظهای قیمت
|
|
||||||
|
|
||||||
2. **سیستم پرداخت سفارش (Order Payment)**
|
|
||||||
- **OrderPaymentService** برای مدیریت پرداختها
|
|
||||||
- پرداخت از کیف پول: `POST /api/v1/customer/orders/{shipment}/pay-wallet`
|
|
||||||
- پرداخت از درگاه: `POST /api/v1/customer/orders/{shipment}/pay-gateway`
|
|
||||||
- تکمیل خودکار پرداخت بعد از callback درگاه
|
|
||||||
- ثبت رویداد ترکینگ پس از پرداخت موفق
|
|
||||||
|
|
||||||
3. **احراز هویت مشتری (Customer Auth)**
|
|
||||||
- **AuthController** با login/logout برای Sanctum
|
|
||||||
- **BridgeAuthController** برای لاگین مستقیم از وردپرس
|
|
||||||
- توکنهای Sanctum با انقضا ۳۰ روزه
|
|
||||||
|
|
||||||
4. **پورتال مشتری در وردپرس**
|
|
||||||
- **شورتکد `[ifnex_order_form]`** — فرم ثبت سفارش چندمرحلهای (۴ مرحله)
|
|
||||||
- **شورتکد `[ifnex_orders_list]`** — لیست سفارشات با فیلتر وضعیت
|
|
||||||
- **شورتکد `[ifnex_order_payment]`** — صفحه پرداخت سفارش (کیف پول + درگاه)
|
|
||||||
- **شورتکد `[ifnex_order_detail]`** — جزئیات سفارش با timeline رهگیری
|
|
||||||
- **شورتکد `[ifnex_user_profile]`** — پروفایل کاربر با آمار کیف پول
|
|
||||||
- استایلهای CSS کامل برای تمام کامپوننتها (`ifnex-orders.css`)
|
|
||||||
- JavaScript برای ناوبری مراحل و AJAX (`ifnex-order-form.js`)
|
|
||||||
|
|
||||||
5. **پوسته وردپرس سفارشی IFNEX**
|
|
||||||
- پشتیبانی چندزبانه با Polylang
|
|
||||||
- مدیریت LTR/RTL خودکار
|
|
||||||
- Customizer برای لوگو و زبان
|
|
||||||
- قالبهای archive, single, front-page
|
|
||||||
- ساختار تمیک شرکتی با لوگو IFNEX
|
|
||||||
|
|
||||||
6. **سیستم طراحی یکپارچه (Design System)**
|
|
||||||
- **DESIGN_SYSTEM.md** — مرجع کامل رنگها، فونتها، فاصلهگذاری
|
|
||||||
- رنگهای برند: Primary Amber `#f59e0b`، Sidebar Dark Navy `#1a1a2e → #16213e`
|
|
||||||
- فونت Vazirmatn برای کل پنل ادمین و فرانتاند
|
|
||||||
- استایلهای یکپارچه برای Filament و پلاگین وردپرس
|
|
||||||
|
|
||||||
7. **گزارشگیری مالی در Filament**
|
|
||||||
- صفحه **FinancialReport** با خلاصه تراکنشها و مرسولات
|
|
||||||
- خروجی Excel برای ShipmentResource و WalletTransactionResource
|
|
||||||
- ویجتهایdashboard اطلاعاتی
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📁 ساختار پروژه
|
## 📁 ساختار پروژه
|
||||||
|
|
||||||
```text
|
```
|
||||||
IFNEX-Logistics/
|
IFNEX-Logistics/
|
||||||
├── 01_Documents/ # مستندات فنی پروژه
|
├── 📄 01_Documents/ # مستندات فنی پروژه
|
||||||
│ ├── STATUS.md # ⭐ وضعیت فعلی و گزارش پیشرفت
|
│ ├── IFNEX_File_Map.md # نقشه کامل فایلها
|
||||||
│ ├── IFNEX_Phase0_Checklist.md # ⭐ چکلیست دقیق فاز ۰
|
│ ├── IFNEX_Roadmap.md # نقشه راه پروژه
|
||||||
│ ├── Phase0_Proposal.md # ⭐ سند پیشنهاد فاز ۰ (نقشه راه جدید)
|
│ ├── IFNEX_Phase0_Checklist.md
|
||||||
│ ├── EXCEL_ANALYSIS.md # ⭐ تحلیل فایلهای اکسل
|
│ ├── IFNEX_DEPRECATED_FILES_NOTICE.md
|
||||||
│ ├── PRD_v2.md # سند نیازمندیها (نسخه قدیمی — بایگانی شده)
|
│ └── EXCEL_ANALYSIS.md # تحلیل دادههای تاریخی
|
||||||
│ └── Project_Roadmap.md # نقشه راه (نسخه قدیمی — بایگانی شده)
|
|
||||||
│
|
│
|
||||||
├── 02_Design/ # فایلهای UI/UX و فیگما
|
├── 🌐 03_WordPress/ # فرانتاند (WordPress)
|
||||||
│ └── Assets/ # لوگوها، آیکونها
|
│ └── wp-content/
|
||||||
|
│ ├── themes/ifnex/ # قالب سفارشی IFNEX
|
||||||
|
│ └── plugins/
|
||||||
|
│ └── ifnex-bridge/ # پلاگین ارتباط با لاراول
|
||||||
│
|
│
|
||||||
├── 03_WordPress/ # سیستم مدیریت محتوا (فرانتاند)
|
├── ⚙️ 04_Laravel/ # بکاند (Laravel 11)
|
||||||
│ ├── wp-content/
|
|
||||||
│ │ ├── themes/ifnex/ # پوسته سفامشی IFNEX (چندزبانه، RTL/LTR)
|
|
||||||
│ │ └── plugins/
|
|
||||||
│ │ └── ifnex-bridge/ # پلاگین اختصاصی ارتباط با لاراول
|
|
||||||
│ │ ├── ifnex-bridge.php
|
|
||||||
│ │ ├── includes/
|
|
||||||
│ │ │ ├── api-client.php
|
|
||||||
│ │ │ ├── shortcodes.php
|
|
||||||
│ │ │ ├── tracking-form.php
|
|
||||||
│ │ │ └── user-bridge.php
|
|
||||||
│ │ └── assets/
|
|
||||||
│ │ ├── css/
|
|
||||||
│ │ │ ├── ifnex-bridge.css
|
|
||||||
│ │ │ └── ifnex-orders.css
|
|
||||||
│ │ └── js/
|
|
||||||
│ │ └── ifnex-order-form.js
|
|
||||||
│
|
|
||||||
├── 04_Laravel/ # هسته مرکزی سیستم (بکاند)
|
|
||||||
│ ├── README.md # راهنمای نصب و استفاده از لاراول
|
|
||||||
│ ├── app/
|
│ ├── app/
|
||||||
│ │ ├── Models/
|
│ │ ├── Filament/ # پنل مدیریت
|
||||||
│ │ │ ├── Country.php
|
│ │ ├── Http/Controllers/ # کنترلرها (API, Web)
|
||||||
│ │ │ ├── Shipment.php
|
│ │ ├── Models/ # مدلهای Eloquent
|
||||||
│ │ │ ├── ShipmentItem.php
|
│ │ ├── Services/ # لایه سرویس
|
||||||
│ │ │ ├── ShippingRate.php
|
│ │ └── Imports/ # Excel imports
|
||||||
│ │ │ ├── ShipmentCarrierMapping.php
|
│ ├── database/migrations/ # ۱۵+ migration
|
||||||
│ │ │ ├── ShipmentTrackingEvent.php
|
│ ├── resources/views/
|
||||||
│ │ │ ├── SystemSetting.php
|
│ │ ├── pdfs/ # قالبهای PDF
|
||||||
│ │ │ ├── Wallet.php
|
│ │ └── filament/ # Blade views
|
||||||
│ │ │ ├── WalletTransaction.php
|
│ └── routes/
|
||||||
│ │ │ ├── DiscountCode.php
|
│ ├── api.php # REST API endpoints
|
||||||
│ │ │ ├── ExchangeRateHistory.php
|
│ └── web.php # Public routes
|
||||||
│ │ │ ├── Role.php # spatie/laravel-permission
|
|
||||||
│ │ │ └── User.php
|
|
||||||
│ │ ├── Enums/
|
|
||||||
│ │ │ ├── ShipmentDirection.php
|
|
||||||
│ │ │ ├── ShipmentType.php
|
|
||||||
│ │ │ ├── ShipmentStatus.php # ۹ وضعیت (pending_payment, cancelled اضافه شد)
|
|
||||||
│ │ │ ├── CarrierCode.php
|
|
||||||
│ │ │ ├── TrackingSource.php # ۵ منبع (manual, api, import, system, customer)
|
|
||||||
│ │ │ ├── TransactionType.php
|
|
||||||
│ │ │ ├── TransactionStatus.php
|
|
||||||
│ │ │ ├── PaymentGateway.php # ۴ درگاه (zarinpal, wallet, manual, system)
|
|
||||||
│ │ │ └── UserRole.php
|
|
||||||
│ │ ├── Services/
|
|
||||||
│ │ │ ├── PriceCalculatorService.php
|
|
||||||
│ │ │ ├── TrackingService.php
|
|
||||||
│ │ │ ├── ExchangeRateService.php # ردیابی و مدیریت نرخ ارز
|
|
||||||
│ │ │ ├── ZarinpalService.php # اتصال به درگاه زرینپال
|
|
||||||
│ │ │ ├── MockZarinpalService.php # شبیهسازی درگاه برای تست
|
|
||||||
│ │ │ └── OrderPaymentService.php # پرداخت سفارشات (کیف پول + درگاه)
|
|
||||||
│ │ ├── Http/
|
|
||||||
│ │ │ ├── Controllers/
|
|
||||||
│ │ │ │ ├── Api/
|
|
||||||
│ │ │ │ │ ├── TrackController.php
|
|
||||||
│ │ │ │ │ ├── PricingController.php
|
|
||||||
│ │ │ │ │ ├── AuthController.php # ورود/خروج Sanctum
|
|
||||||
│ │ │ │ │ ├── BridgeAuthController.php # لاگین از پلاگین وردپرس
|
|
||||||
│ │ │ │ │ ├── WalletController.php
|
|
||||||
│ │ │ │ │ ├── PaymentController.php
|
|
||||||
│ │ │ │ │ ├── DiscountCodeController.php
|
|
||||||
│ │ │ │ │ └── Customer/
|
|
||||||
│ │ │ │ │ └── CustomerOrderController.php # ۶ endpoint سفارش مشتری
|
|
||||||
│ │ │ │ ├── OrderController.php
|
|
||||||
│ │ │ │ ├── PricingPageController.php
|
|
||||||
│ │ │ │ └── ShipmentPdfController.php
|
|
||||||
│ │ │ ├── Middleware/
|
|
||||||
│ │ │ │ └── ApiKeyMiddleware.php
|
|
||||||
│ │ │ └── Requests/
|
|
||||||
│ │ ├── Imports/
|
|
||||||
│ │ │ ├── ShippingRatesImport.php
|
|
||||||
│ │ │ ├── HistoricalShipmentsImport.php
|
|
||||||
│ │ │ └── RateSheetImport.php
|
|
||||||
│ │ ├── Console/
|
|
||||||
│ │ │ └── Commands/
|
|
||||||
│ │ │ │ ├── ImportShippingRates.php
|
|
||||||
│ │ │ │ │ ├── ImportHistoricalData.php
|
|
||||||
│ │ │ │ │ ├── UpdateExchangeRates.php
|
|
||||||
│ │ │ │ │ ├── SyncWordPressUsers.php # سینک کاربران وردپرس
|
|
||||||
│ │ │ │ │ └── DebugImportCommand.php
|
|
||||||
│ │ ├── Filament/
|
|
||||||
│ │ │ ├── Resources/
|
|
||||||
│ │ │ │ ├── CountryResource.php
|
|
||||||
│ │ │ │ ├── ShipmentResource.php
|
|
||||||
│ │ │ │ ├── ShippingRateResource.php
|
|
||||||
│ │ │ │ ├── ShipmentItemResource.php
|
|
||||||
│ │ │ │ ├── WalletResource.php
|
|
||||||
│ │ │ │ ├── WalletTransactionResource.php # CRUD کامل با صفحات Create/Edit
|
|
||||||
│ │ │ │ ├── PaymentResource.php # مشاهده تراکنشهای درگاه
|
|
||||||
│ │ │ │ ├── DiscountCodeResource.php # مدیریت کدهای تخفیف
|
|
||||||
│ │ │ │ ├── ExchangeRateHistoryResource.php # تاریخچه نرخ ارز
|
|
||||||
│ │ │ │ ├── RoleResource.php # مدیریت نقشها (spatie)
|
|
||||||
│ │ │ │ └── UserResource.php # مدیریت کاربران (spatie)
|
|
||||||
│ │ │ ├── Widgets/
|
|
||||||
│ │ │ │ ├── DashboardInfoWidget.php # اطلاعات کلی داشبورد
|
|
||||||
│ │ │ │ ├── ExchangeRateWidget.php # نرخ ارز زنده
|
|
||||||
│ │ │ │ ├── WalletStats.php # آمار کیف پول
|
|
||||||
│ │ │ │ ├── TransactionChartWidget.php # نمودار تراکنشها
|
|
||||||
│ │ │ │ └── RecentTransactionsWidget.php
|
|
||||||
│ │ │ └── Pages/
|
|
||||||
│ │ │ │ ├── IfnexSettingsPage.php
|
|
||||||
│ │ │ │ ├── PriceTestPage.php
|
|
||||||
│ │ │ │ └── Reports/
|
|
||||||
│ │ │ │ └── FinancialReport.php # گزارش مالی
|
|
||||||
│ │ └── Providers/
|
|
||||||
│ │ ├── AppServiceProvider.php
|
|
||||||
│ │ └── Filament/
|
|
||||||
│ │ └── AdminPanelProvider.php # پیکربندی کامل (رنگ، فونت، نوتیفیکیشن)
|
|
||||||
│
|
│
|
||||||
└── README.md # این فایل — نمای کلی پروژه
|
├── 📋 README.md # این فایل
|
||||||
|
├── 📋 DEPLOYMENT.md # راهنمای استقرار
|
||||||
|
└── 📋 04_Laravel/README.md # راهنمای بکاند
|
||||||
|
```
|
||||||
|
|
||||||
💡 برای جزئیات فنی، نصب و راهاندازی، فایل 04_Laravel/README.md را مطالعه کنید.
|
---
|
||||||
|
|
||||||
|
## ✨ ویژگیهای کلیدی
|
||||||
|
|
||||||
|
### فاز ۰ — بنیان سیستم ✅
|
||||||
|
- اسکیمای دیتابیس مدرن با ۴ زون مجزا (Export/Import × Parcel/Doc)
|
||||||
|
- مهاجرت ۳۹۵۰ رکورد تاریخی از اکسل به دیتابیس
|
||||||
|
- پنل مدیریت Filament با UX تخصصی اپراتور
|
||||||
|
- API ترکینگ با امنیت API Key + Rate Limiting
|
||||||
|
- پلاگین WordPress Bridge برای ارتباط با فرانتاند
|
||||||
|
|
||||||
|
### فاز ۱ — پورتال مشتری ✅
|
||||||
|
- احراز هویت Laravel Sanctum + Bridge Auth
|
||||||
|
- فرم ثبت سفارش چندمرحلهای با Wizard
|
||||||
|
- داشبورد جامع مشتری (سفارشات، کیف پول، تراکنشها، اعلانها، رهگیری، پروفایل)
|
||||||
|
- سیستم ترکینگ با تایملاین
|
||||||
|
|
||||||
|
### فاز ۲ — مالی و کیف پول ✅
|
||||||
|
- سیستم کیف پول کامل با تراکنشها
|
||||||
|
- درگاه پرداخت + Mock Gateway برای تست
|
||||||
|
- مدیریت ارزهای چندگانه (IRR, AED, USD, EUR)
|
||||||
|
- کدهای تخفیف با اعتبارسنجی و محدودیت مصرف
|
||||||
|
- تولید PDF حرفهای (AWB, Invoice, Label) با بارکد
|
||||||
|
|
||||||
|
### فاز ۳ — بهبود و یکپارچهسازی 🔄
|
||||||
|
- ایمپورت/اکسپورت نرخها با دانلود Template
|
||||||
|
- سیستم اعلانهای دیتابیس (ادمین + مشتری)
|
||||||
|
- پشتیبانی از چند بسته در یک سفارش (Multi-Package)
|
||||||
|
- تاریخچه تغییرات وضعیت
|
||||||
|
- استایل مدرن تراکنشها و هشدار آدرس انگلیسی
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ شروع سریع
|
||||||
|
|
||||||
|
### پیشنیازها
|
||||||
|
- PHP 8.2+
|
||||||
|
- Composer 2.x
|
||||||
|
- MySQL 8+
|
||||||
|
- WordPress 7.0+
|
||||||
|
|
||||||
|
### نصب
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ۱. کلون مخزن
|
||||||
|
git clone https://www.git.vernahost.ir/gitmodir110/ifnex.git
|
||||||
|
cd ifnex/04_Laravel
|
||||||
|
|
||||||
|
# ۲. نصب وابستگیها
|
||||||
|
composer install
|
||||||
|
|
||||||
|
# ۳. تنظیم فایل محیط
|
||||||
|
cp .env.example .env
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
|
# ۴. ایجاد دیتابیس
|
||||||
|
mysql -u root -p -e "CREATE DATABASE ifnex_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||||
|
# ۵. ویرایش .env و تنظیم DB_DATABASE, DB_USERNAME, DB_PASSWORD
|
||||||
|
# ۶. اجرای migrations و seeders
|
||||||
|
php artisan migrate --force
|
||||||
|
php artisan db:seed --force
|
||||||
|
# ۷. اجرای سرور
|
||||||
|
php artisan serve
|
||||||
|
```
|
||||||
|
|
||||||
|
> 📖 برای راهنمای کامل استقرار، [DEPLOYMENT.md](DEPLOYMENT.md) را ببینید.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Stack فنی
|
||||||
|
|
||||||
|
### Backend (Laravel)
|
||||||
|
|
||||||
|
| تکنولوژی | نسخه | کاربرد |
|
||||||
|
|-----------|------|--------|
|
||||||
|
| Laravel | 11.x | فریمورک اصلی |
|
||||||
|
| PHP | 8.2+ | زبان برنامهنویسی |
|
||||||
|
| Filament | 3.3.x | پنل مدیریت ادمین |
|
||||||
|
| MySQL | 8+ | دیتابیس |
|
||||||
|
| Dompdf | Latest | تولید PDF |
|
||||||
|
| Laravel Excel | Latest | Import/Export |
|
||||||
|
| Sanctum | Latest | API Authentication |
|
||||||
|
| Morilog Jalali | 3.x | تاریخ شمسی |
|
||||||
|
|
||||||
|
### Frontend (WordPress)
|
||||||
|
|
||||||
|
| تکنولوژی | نسخه | کاربرد |
|
||||||
|
|-----------|------|--------|
|
||||||
|
| WordPress | 7.0.3 | CMS |
|
||||||
|
| IFNEX Theme | Custom | قالب سفارشی |
|
||||||
|
| IFNEX Bridge | 1.6.0 | پلاگین ارتباطی |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 مستندات
|
||||||
|
|
||||||
|
برای مطالعه دقیق منطقهای سیستم:
|
||||||
|
|
||||||
|
| فایل | محتوا | اولویت |
|
||||||
|
|------|-------|--------|
|
||||||
|
| IFNEX_Phase0_Checklist.md | چکلیست کامل فازها | ⭐⭐⭐ |
|
||||||
|
| IFNEX_Roadmap.md | نقشه راه آینده | ⭐⭐⭐ |
|
||||||
|
| IFNEX_File_Map.md | نقشه ۱۰۰+ فایل پروژه | ⭐⭐⭐ |
|
||||||
|
| DEPLOYMENT.md | راهنمای استقرار Production | ⭐⭐ |
|
||||||
|
| EXCEL_ANALYSIS.md | تحلیل دادههای اکسل | ⭐⭐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 مراحل بعدی
|
||||||
|
|
||||||
|
- اتصال به API های ترکینگ زنده (TrackingMore/17track)
|
||||||
|
- پلاگین SMS برای اطلاعرسانی
|
||||||
|
- مستندات API (OpenAPI/Swagger)
|
||||||
|
- راهنمای اپراتور (Operator Manual)
|
||||||
|
- تستهای واحد و Integration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 تماس
|
||||||
|
|
||||||
|
- **توسعهدهنده:** Kazem Alghasi
|
||||||
|
- **شرکت:** VernaSoft Group
|
||||||
|
- **ایمیل:** kazem@vernasoft.group
|
||||||
|
- **مخزن:** git.vernahost.ir/gitmodir110/ifnex
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
📚 مستندات بیشتر
|
|
||||||
برای مطالعه دقیق منطقهای سیستم، حتماً فایلهای داخل پوشه 01_Documents را مطالعه کنید:
|
|
||||||
فایل
|
|
||||||
محتوا
|
|
||||||
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 است و کپی یا استفادهی غیرمجاز از آن ممنوع است.
|
© 2026 VernaSoft Group. تمام حقوق محفوظ است.
|
||||||
|
این پروژه اختصاصی شرکت IFNEX است و کپی یا استفاده غیرمجاز ممنوع میباشد.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user