diff --git a/app/Http/Controllers/Admin/ZarinController.php b/app/Http/Controllers/Admin/ZarinController.php index fb03b93..71e33fd 100644 --- a/app/Http/Controllers/Admin/ZarinController.php +++ b/app/Http/Controllers/Admin/ZarinController.php @@ -142,9 +142,16 @@ class ZarinController extends Controller return $nameG !== '' ? $nameG : 'مشتری نقدی (خریدار)'; } - /** آیا درخواست لیست زرین را خواسته؟ (query/body؛ مقاوم به boolean عجیب) */ + /** آیا درخواست لیست زرین را خواسته؟ (query/body/header؛ مقاوم به QUERY_STRING خالی) */ private function requestWantsZarinList(Request $request): bool { + $header = $request->header('X-Include-Zarin', $request->header('Include-Zarin')); + if ($header !== null && $header !== '') { + if (filter_var($header, FILTER_VALIDATE_BOOLEAN) || in_array($header, [1, '1', 'yes', 'on'], true)) { + return true; + } + } + foreach (['include_zarin', 'include_tahesab'] as $key) { $raw = $request->query($key, $request->input($key, null)); if ($raw === null && !$request->query->has($key) && !$request->exists($key)) { @@ -695,6 +702,17 @@ class ZarinController extends Controller } public function customerSyncStatus(Request $request): \Illuminate\Http\JsonResponse + { + return $this->buildCustomerSyncStatus($request, $this->requestWantsZarinList($request)); + } + + /** مسیر بدون query — وقتی nginx QUERY_STRING را نمی‌فرستد */ + public function customerSyncStatusWithZarin(Request $request): \Illuminate\Http\JsonResponse + { + return $this->buildCustomerSyncStatus($request, true); + } + + private function buildCustomerSyncStatus(Request $request, bool $include): \Illuminate\Http\JsonResponse { $panelTotal = Customer::whereNull('deleted_at')->count(); $panelRegistered = Customer::whereNull('deleted_at')->whereNotNull('moshtari_code')->count(); @@ -719,8 +737,6 @@ class ZarinController extends Controller $zarinOnlyResult = ['data' => [], 'total' => 0, 'current_page' => 1, 'last_page' => 1]; $debugSample = []; - $include = $this->requestWantsZarinList($request); - if ($include) { $fetched = $this->fetchAllZarinCustomers(); $zarinCustomers = $fetched['rows']; @@ -802,7 +818,7 @@ class ZarinController extends Controller 'zarin_only_list' => $zarinOnlyResult, ]; - if ($include && $request->boolean('raw')) { + if ($include && ($request->boolean('raw') || $request->input('raw'))) { $payload['zarin_debug_sample'] = $debugSample; } diff --git a/routes/admin.php b/routes/admin.php index 3b38e76..923eb66 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -205,7 +205,9 @@ Route::middleware('auth:user')->group(function (){ Route::get('zarin/health', [ZarinController::class, 'healthCheck']); Route::post('wallet/zarin', [ZarinController::class, 'wallet']); Route::post('zarin/table', [ZarinController::class, 'table']); - Route::get('zarin/customer-sync/status', [ZarinController::class, 'customerSyncStatus']); + // status با query روی بعضی سرورها QUERY_STRING خالی است — مسیر جدا برای لیست زرین + Route::get('zarin/customer-sync/status-with-zarin', [ZarinController::class, 'customerSyncStatusWithZarin']); + Route::match(['get', 'post'], 'zarin/customer-sync/status', [ZarinController::class, 'customerSyncStatus']); Route::post('zarin/customer-sync/panel-to-zarin', [ZarinController::class, 'syncPanelToZarin']); Route::post('zarin/customer-sync/import-from-zarin', [ZarinController::class, 'importFromZarin']); Route::post('zarin/customer-sync/rollback-import', [ZarinController::class, 'rollbackImport']);