Move StaffApiMiddleware from the Controllers directory to the correct Middleware directory to adhere to Laravel directory structure standards. - Relocate StaffApiMiddleware from `app/Http/Controllers` to `app/Http/Middleware` - Update `api.php` to use the correct namespace for `StaffApiMiddleware` - Add `IFNEX_Logistics_Review_Workflow_HANDOFF.md` documentation for the review workflow
12 KiB
IFNEX Logistics — Review Workflow & Continuation Handoff
وضعیت پروژه
مسیر Laravel:
C:\xampp\htdocs\IFNEX-Logistics\04_Laravel
هدف فعلی: تکمیل Client Delivery و Hardening؛ سپس Productization.
1. Review Architecture
Review از Shipment Operational Status جدا شده است.
Review State:
pendingchanges_requestedapprovedrejected
جریان:
Create Order
-> review_state=pending / status=pending_approval
-> Staff Review
-> Request Changes -> Customer Edit -> Resubmit -> pending
-> Approve -> review_state=approved / status=approved
-> Reject -> review_state=rejected / status=cancelled
Review History با مدل ShipmentReview و revision مستقل نگهداری میشود و جایگزین ShipmentStatusHistory نیست.
2. وضعیت Filament
در لیست مرسولات Actionها ساخته و تست شدهاند:
- نمایش
- ویرایش
- تأیید
- درخواست اصلاح
- رد سفارش
Approve تست شده:
- Dialog تأیید نمایش داده شد.
- پیام موفقیت نمایش داده شد.
- Status به
Approvedتغییر کرد. - Actionهای Review از ردیف حذف شدند.
- مشتری پس از تأیید وارد مرحله پرداخت میشود.
Reject نیز تست شده:
- با موفقیت انجام شد.
- عنوان/وضعیت به «رد شد» تغییر کرد.
- Actionهای Review حذف شدند.
Request Changes هنوز باید از API و End-to-End تست شود.
3. APIهای Staff Review
در routes/api.php این مسیرها وجود دارند:
GET /api/v1/staff/orders/pending-approval
POST /api/v1/staff/orders/{shipment}/request-changes
POST /api/v1/staff/orders/{shipment}/approve
POST /api/v1/staff/orders/{shipment}/reject
این گروه با:
\App\Http\Middleware\StaffApiMiddleware::class
محافظت میشود.
4. Authorization
User از Spatie Permission استفاده میکند.
Roleهای مهم:
super_adminadminstaffcustomer
تستها:
Customer با Token معتبر -> 403 Forbidden
Super Admin -> دسترسی موفق.
User شماره 1:
- name: مدیر کاظم
- role:
super_admin - Spatie role:
super_admin
5. Pending Approval API — موفق
Endpoint:
GET /api/v1/staff/orders/pending-approval
با Super Admin و Bearer Token تست شد و:
HTTP/1.1 200 OK
برگشت.
یک Shipment فعلی در پاسخ:
id = 22
awb_no = IFN-2026-39337
status.value = pending_approval
review.state = pending
API شامل:
- shipment id
- AWB
- direction/type
- status
- review
- from/to country
- user
- weight
- chargeable_weight
- total_fee
- created_at
- created_at_jalali
- pagination
است.
6. مشکل ShipmentStatus — حل شد
در StaffOrderController.php این import اضافه/اصلاح شده:
use App\Enums\ShipmentStatus;
و:
->where('status', ShipmentStatus::PendingApproval)
ابتدا خطای:
Class "App\Http\Controllers\Api\ShipmentStatus" not found
وجود داشت.
بعد از اصلاح، Tinker تأیید کرد:
\App\Enums\ShipmentStatus::PendingApproval
و:
value = pending_approval
پس این مشکل حل شده است.
7. ShipmentStatus.php
فایل:
app\Enums\ShipmentStatus.php
Enum شامل statusهای اصلی است:
pending_approval
approved
pending_payment
cancelled
processed
picked_up
in_transit
out_for_delivery
failed
delivered
returned
archived
متدهای مهم:
isApproved()
isPendingApproval()
canBeApprovedByStaff()
canBePaid()
انتهای فایل بررسی شد و canBeApprovedByStaff() و canBePaid() بهدرستی بسته شدهاند.
8. مشکل ShipmentPdfController — حل شد
route:list ابتدا به علت نبود import صحیح برای ShipmentPdfController خطا میداد.
فایل واقعی:
app\Http\Controllers\ShipmentPdfController.php
Namespace:
namespace App\Http\Controllers;
پس import صحیح باید بر اساس همین namespace باشد.
بعد از اصلاح، این دستور موفق شد:
php artisan route:list --path=api/v1/staff
و 6 route نشان داده شد:
- customers/search
- customers/{customer}/financial-status
- orders/pending-approval
- orders/{shipment}/approve
- orders/{shipment}/reject
- orders/{shipment}/request-changes
9. مشکل PSR-4 — هنوز حل نشده
این دستور دو فایل پیدا کرده:
Get-ChildItem .\app -Recurse -Filter "StaffApiMiddleware.php" | Select-Object FullName
نتیجه:
app\Http\Controllers\StaffApiMiddleware.php
app\Http\Middleware\StaffApiMiddleware.php
Composer هشدار میدهد:
Class App\Http\Middleware\StaffApiMiddleware located in
./app/Http/Controllers/StaffApiMiddleware.php
does not comply with psr-4 autoloading standard.
بنابراین باید قبل از هر چیز دو فایل را مقایسه کنیم.
قدم بعدی دقیق
اجرا:
Get-Content .\app\Http\Controllers\StaffApiMiddleware.php
و:
Get-Content .\app\Http\Middleware\StaffApiMiddleware.php
سپس:
Select-String -Path .\app\**\*.php -Pattern "StaffApiMiddleware"
هدف:
- مشخص شود کدام فایل Middleware واقعی است.
- بررسی شود فایل Controllers duplicate است یا خیر.
- فقط پس از تأیید، duplicate حذف شود.
- سپس:
composer dump-autoload
و هشدار PSR-4 دیگر نباید ظاهر شود.
10. پاکسازیها
اینها با موفقیت اجرا شدهاند:
php artisan optimize:clear
composer dump-autoload
Composer package discovery و Filament upgrade نیز موفق بودهاند.
11. PowerShell
نوشتن:
GET /api/v1/staff/orders/pending-approval
مستقیم در PowerShell اشتباه است؛ PowerShell آن را command تلقی میکند.
برای تست HTTP:
curl.exe -i `
-H "Authorization: Bearer YOUR_TOKEN" `
-H "Accept: application/json" `
http://127.0.0.1:8000/api/v1/staff/orders/pending-approval
12. Token
یک Token تستی برای Super Admin ساخته و استفاده شد. Token واقعی را در این فایل ثبت نکردهایم.
برای ادامه، در صورت نیاز Token جدید بساز و Token تستی را credential دائمی تلقی نکن.
13. StaffOrderController
فایل:
app\Http\Controllers\Api\StaffOrderController.php
متدهای اصلی:
pendingApproval()
requestChanges()
approve()
reject()
formatShipment()
toJalali()
Business logic Review به:
ShipmentReviewService
سپرده شده و نباید منطق اصلی Review را داخل Controller کپی کنیم.
14. تستهای بعدی
A — Request Changes
POST /api/v1/staff/orders/{shipment}/request-changes
نمونه:
{
"reason": "لطفاً اطلاعات گیرنده اصلاح شود.",
"notes": "شماره تماس کامل نیست."
}
انتظار:
review_state = changes_requested- ایجاد Review History
- سفارش قابل ویرایش/Resubmit باشد.
B — Approve API
POST /api/v1/staff/orders/{shipment}/approve
انتظار:
review_state = approved
status = approved
C — Reject API
POST /api/v1/staff/orders/{shipment}/reject
با reason اجباری.
انتظار:
review_state = rejected
status = cancelled
D — Customer Resubmit
پس از Request Changes:
- Customer دلیل اصلاح را ببیند.
- سفارش را اصلاح کند.
- Resubmit کند.
- Review State دوباره
pendingشود. - revision جدید ایجاد شود.
- AWB تغییر نکند.
- Shipment/Packages/Items transactional بهروزرسانی شوند.
15. API Contract
Laravel منبع canonical Order Detail API است.
ساختار هدف:
shipment
├── status
├── review
├── sender
├── receiver
├── packages[]
├── items[]
├── financial
├── documents[]
└── tracking_events[]
WordPress باید این contract را مصرف کند، نه اینکه روی flattened legacy fields تکیه کند.
Mismatchهای شناختهشده:
Laravel:
sender.*
receiver.*
WordPress قدیمی:
sender_name
sender_phone
receiver_name
receiver_phone
Tracking:
Laravel:
date
description
location
WordPress:
event_date
event_description
event_time
16. موارد Hardening شناختهشده
ShipmentStatus::isPaid()از نظر semantic امن نیست.Shipment::isDelivered()باید از نظر Enum/string بررسی شود.- Staff authorization باید صریح و role-aware بماند.
- Sender/receiver API contract باید یکسان شود.
- Tracking event contract باید یکسان شود.
- PDF token key باید با Bridge token استاندارد هماهنگ شود.
- Commitment Form requirement باید برای Shipment snapshot شود.
- Signed-document upload باید از public storage semantics خارج/harden شود.
ShipmentPackageوShipmentItemدر detailed customer response بررسی شوند.- Payment state نباید در بلندمدت از Shipment status استنتاج شود.
- Preview pricing و committed pricing باید تفکیک شوند.
- Migrationهای تاریخی rewrite نشوند.
17. Payment Architecture
هدف نهایی:
Shipment Operational Status
Review State
Payment State
سه domain مستقل.
فعلاً:
Approved -> payment available
اما این coupling باید در معماری نهایی حذف/deprecate شود.
18. Commitment Documents
CommitmentForm = template
ShipmentCommitmentForm = requirement/instance برای Shipment
برای Client فعلی:
- physical delivery فرآیند اصلی است.
- online upload اختیاری است.
- signed document نباید بدون business policy صریح approval/payment را block کند.
هدف بعدی: snapshot شدن required documents برای هر Shipment.
19. Finance Boundary
IFNEX نباید accounting system کامل شود.
حوزه مالی IFNEX:
- wallet
- receivable/debt
- order financial status
- payment transactions
- credit/settlement
- audit trail
Accounting عمیق در صورت نیاز باید external integration باشد.
20. End-to-End هدف
Customer creates order
↓
Pending Approval
↓
Staff Review
┌────┼─────┐
↓ ↓ ↓
Changes Approve Reject
↓
Customer Edit
↓
Resubmit
↓
Pending Approval
↓
Approve
↓
Payment
21. ترتیب ادامه کار
- مقایسه دو
StaffApiMiddleware.php. - رفع duplicate/PSR-4 warning.
composer dump-autoload.php artisan route:list --path=api/v1/staff.- تست Pending Approval مجدد.
- تست Request Changes API.
- تست Approve API.
- تست Reject API.
- بررسی
ShipmentReviewServiceوShipmentReview. - تست Customer Resubmit.
- بررسی Customer Order Detail API.
- هماهنگسازی WordPress Bridge با Laravel canonical contract.
- تست End-to-End کامل.
- سپس سایر Hardeningهای Client Delivery.
22. پیام شروع پیشنهادی برای چت جدید
ما روی پروژه IFNEX-Logistics کار میکنیم.
فایل IFNEX_Logistics_Review_Workflow_HANDOFF.md را مبنا قرار بده.
آخرین وضعیت:
GET /api/v1/staff/orders/pending-approval با super_admin موفقاً HTTP 200 میدهد.
Approve و Reject در Filament تست شدهاند.
Request Changes و Resubmit هنوز باید تست شوند.
اولین کار:
دو فایل زیر را مقایسه کنیم و PSR-4 warning را بدون خراب کردن Middleware واقعی رفع کنیم:
app\Http\Controllers\StaffApiMiddleware.php
app\Http\Middleware\StaffApiMiddleware.php
بعد APIهای request-changes / approve / reject و customer resubmit را تست کنیم.