{
	"info": {
		"_postman_id": "f1e2d3c4-b5a6-7890-order-lifecycle-01",
		"name": "SPARESHUB — دورة الطلب كاملة (زبون → متجر → سوبر أدمن → سائق)",
		"description": "## المتغيرات (Collection Variables)\nعدّل القيم حسب بيئتك بعد `db:seed` (DemoDataSeeder + DriverApiSeeder + …).\n\n| المتغير | الغرض | مثال افتراضي |\n|----------|--------|----------------|\n| `base_url` | رابط السيرفر | `http://127.0.0.1:8000` |\n| `customer_phone` | جوال زبون | `520000001` (customer_1) |\n| `customer_otp` | من `SPARESHUB_CUSTOMER_OTP_CODE` | `123456` |\n| `store_username` / `store_password` | حساب متجر | `store_owner_1` / `password` |\n| `super_admin_username` / `super_admin_password` | سوبر أدمن | `super_admin` / `password` |\n| `driver_username` / `driver_password` | سائق | `driver_demo` أو `settlement_driver_login` / `password` |\n| `product_id` | منتج من **نفس** متجر القبول | `1` (غيّره من DB) |\n| `driver_id` | يُملأ تلقائياً من `GET drivers` أو ضعه يدوياً | `1` |\n\n**الترتيب:** شغّل المجلد **1 Auth** أولاً (يملأ التوكنات)، ثم **2–6** بالترتيب.\n\n**صلاحيات:** بعد إضافة `sa.orders.update_status` شغّل `php artisan db:seed --class=PlatformPermissionSeeder`.\n\n**ملاحظة:** إذا كان المتجر `auto_accept_orders` الطلب يصير `store_accept` مباشرة من الشيك أوت — سطر قبول المتجر قد يرجع 422؛ عندها تخطّى مجلد المتجر أو عطّل auto_accept للتجربة.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"variable": [
		{ "key": "base_url", "value": "http://127.0.0.1:8000" },
		{ "key": "customer_phone", "value": "520000001" },
		{ "key": "customer_otp", "value": "123456" },
		{ "key": "store_username", "value": "store_owner_1" },
		{ "key": "store_password", "value": "password" },
		{ "key": "super_admin_username", "value": "super_admin" },
		{ "key": "super_admin_password", "value": "password" },
		{ "key": "driver_username", "value": "driver_demo" },
		{ "key": "driver_password", "value": "password" },
		{ "key": "customer_token", "value": "" },
		{ "key": "store_token", "value": "" },
		{ "key": "super_admin_token", "value": "" },
		{ "key": "driver_token", "value": "" },
		{ "key": "address_id", "value": "" },
		{ "key": "product_id", "value": "1" },
		{ "key": "order_id", "value": "" },
		{ "key": "driver_id", "value": "1" }
	],
	"item": [
		{
			"name": "1 Auth — تسجيل الدخول (يملأ التوكنات)",
			"item": [
				{
					"name": "1.1 Customer — طلب OTP",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"phone\": \"{{customer_phone}}\"\n}"
						},
						"url": "{{base_url}}/api/auth/customer/login",
						"description": "يُنشئ OTP (افتراضي 123456 من config)."
					}
				},
				{
					"name": "1.2 Customer — تحقق OTP → customer_token",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (j && j.success && j.data && j.data.token) {",
									"  pm.collectionVariables.set('customer_token', j.data.token);",
									"  pm.test('customer_token saved', () => pm.expect(j.data.token).to.be.a('string'));",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"phone\": \"{{customer_phone}}\",\n  \"otp\": \"{{customer_otp}}\"\n}"
						},
						"url": "{{base_url}}/api/auth/customer/otp/verify"
					}
				},
				{
					"name": "1.3 Store — login → store_token",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (j && j.success && j.data && j.data.token) {",
									"  pm.collectionVariables.set('store_token', j.data.token);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"username\": \"{{store_username}}\",\n  \"password\": \"{{store_password}}\",\n  \"user_type\": \"store\"\n}"
						},
						"url": "{{base_url}}/api/auth/login"
					}
				},
				{
					"name": "1.4 Super Admin — login → super_admin_token",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (j && j.success && j.data && j.data.token) {",
									"  pm.collectionVariables.set('super_admin_token', j.data.token);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"username\": \"{{super_admin_username}}\",\n  \"password\": \"{{super_admin_password}}\",\n  \"user_type\": \"super_admin\"\n}"
						},
						"url": "{{base_url}}/api/auth/login"
					}
				},
				{
					"name": "1.5 Driver — login → driver_token",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (j && j.success && j.data && j.data.token) {",
									"  pm.collectionVariables.set('driver_token', j.data.token);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"username\": \"{{driver_username}}\",\n  \"password\": \"{{driver_password}}\",\n  \"user_type\": \"driver\"\n}"
						},
						"url": "{{base_url}}/api/auth/login"
					}
				}
			]
		},
		{
			"name": "2 زبون — عنوان + معاينة + طلب",
			"item": [
				{
					"name": "2.1 GET عناويني → address_id",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (!j || !j.success || !j.data) return;",
									"let rows = j.data;",
									"if (rows && typeof rows === 'object' && Array.isArray(rows.data)) rows = rows.data;",
									"if (Array.isArray(rows) && rows.length && rows[0].id) {",
									"  pm.collectionVariables.set('address_id', String(rows[0].id));",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{customer_token}}" }
						],
						"url": "{{base_url}}/api/user/addresses"
					}
				},
				{
					"name": "2.2 POST معاينة طلب (preview + settlement)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{customer_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"address_id\": {{address_id}},\n  \"delivery_method\": \"standard\",\n  \"items\": [\n    { \"product_id\": {{product_id}}, \"quantity\": 1 }\n  ]\n}"
						},
						"url": "{{base_url}}/api/user/orders/preview"
					}
				},
				{
					"name": "2.3 POST إنشاء الطلب (checkout) → order_id",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (!j || !j.success || !j.data) return;",
									"let d = j.data;",
									"if (d && typeof d === 'object' && d.data && d.data.id) d = d.data;",
									"if (d && d.id) pm.collectionVariables.set('order_id', String(d.id));"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{customer_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"address_id\": {{address_id}},\n  \"delivery_method\": \"standard\",\n  \"items\": [\n    { \"product_id\": {{product_id}}, \"quantity\": 1 }\n  ]\n}"
						},
						"url": "{{base_url}}/api/user/orders"
					}
				}
			]
		},
		{
			"name": "3 متجر — قائمة معلقة + قبول الطلب",
			"item": [
				{
					"name": "3.1 GET طلبات المتجر (تبويب pending)",
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{store_token}}" }
						],
						"url": "{{base_url}}/api/store/orders?tab=pending"
					}
				},
				{
					"name": "3.2 POST قبول الطلب (store_accept)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{store_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"status\": \"store_accept\"\n}"
						},
						"url": "{{base_url}}/api/store/orders/{{order_id}}/status"
					}
				}
			]
		},
		{
			"name": "4 سوبر أدمن — إسناد سائق",
			"item": [
				{
					"name": "4.1 GET قائمة السائقين → driver_id (أول سائق)",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"const j = pm.response.json();",
									"if (!j || !j.success || !j.data) return;",
									"let rows = j.data;",
									"if (rows && typeof rows === 'object' && Array.isArray(rows.data)) rows = rows.data;",
									"if (Array.isArray(rows) && rows.length && rows[0].id) {",
									"  pm.collectionVariables.set('driver_id', String(rows[0].id));",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{super_admin_token}}" }
						],
						"url": "{{base_url}}/api/super_admin/drivers?active_only=1"
					}
				},
				{
					"name": "4.2 POST إسناد الطلب للسائق (redispatch)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{super_admin_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"driver_id\": {{driver_id}}\n}"
						},
						"url": "{{base_url}}/api/super_admin/orders/{{order_id}}/redispatch"
					}
				}
			]
		},
		{
			"name": "5 سائق — قبول + (اختياري) مراحل + إكمال",
			"item": [
				{
					"name": "5.1 POST قبول الطلب (driver_accept)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{driver_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"decision\": \"accept\"\n}"
						},
						"url": "{{base_url}}/api/driver/orders/{{order_id}}/respond"
					}
				},
				{
					"name": "5.2 PATCH حالة الطلب → packing (سوبر أدمن)",
					"request": {
						"method": "PATCH",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{super_admin_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"status\": \"packing\"\n}"
						},
						"url": "{{base_url}}/api/super_admin/orders/{{order_id}}/status",
						"description": "يتطلب `sa.orders.update_status` لغير مالك المنصة."
					}
				},
				{
					"name": "5.3 PATCH حالة الطلب → out_for_delivery",
					"request": {
						"method": "PATCH",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{super_admin_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"status\": \"out_for_delivery\"\n}"
						},
						"url": "{{base_url}}/api/super_admin/orders/{{order_id}}/status"
					}
				},
				{
					"name": "5.4 POST إكمال التوصيل (completed)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{driver_token}}" }
						],
						"url": "{{base_url}}/api/driver/orders/{{order_id}}/complete",
						"description": "يمكن أيضاً الإكمال من `driver_accept` بدون 5.2–5.3 إن رغبت."
					}
				}
			]
		},
		{
			"name": "6 تحقق — زبون / متجر / سائق / دفتر",
			"item": [
				{
					"name": "6.1 GET تفاصيل الطلب (زبون)",
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{customer_token}}" }
						],
						"url": "{{base_url}}/api/user/orders/{{order_id}}"
					}
				},
				{
					"name": "6.2 GET تفاصيل الطلب (متجر)",
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{store_token}}" }
						],
						"url": "{{base_url}}/api/store/orders/{{order_id}}"
					}
				},
				{
					"name": "6.3 GET تفاصيل الطلب (سائق + settlement)",
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{driver_token}}" }
						],
						"url": "{{base_url}}/api/driver/orders/{{order_id}}"
					}
				},
				{
					"name": "6.4 GET دفتر السائق (ledger)",
					"request": {
						"method": "GET",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{driver_token}}" }
						],
						"url": "{{base_url}}/api/driver/ledger"
					}
				}
			]
		},
		{
			"name": "7 بدائل — رفض سائق أو رفض متجر",
			"item": [
				{
					"name": "7.1 سائق — POST رفض (يُلغى الإسناد)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{driver_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"decision\": \"reject\"\n}"
						},
						"url": "{{base_url}}/api/driver/orders/{{order_id}}/respond",
						"description": "استخدمه فقط على طلب في `pending` أو `store_accept` مع إسناد للسائق الحالي. لا تشغّله بعد القبول إن كنت تكمّل التدفق الأساسي."
					}
				},
				{
					"name": "7.2 متجر — POST رفض الطلب (rejected)",
					"request": {
						"method": "POST",
						"header": [
							{ "key": "Accept", "value": "application/json" },
							{ "key": "Content-Type", "value": "application/json" },
							{ "key": "Authorization", "value": "Bearer {{store_token}}" }
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"status\": \"rejected\"\n}"
						},
						"url": "{{base_url}}/api/store/orders/{{order_id}}/status",
						"description": "فقط من `pending`."
					}
				}
			]
		}
	]
}
