From 8125b4d321ac0807f657e7deeb1bd52c7b2240e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Pocrnji=C4=8D?= Date: Mon, 10 Nov 2025 19:07:54 +0100 Subject: [PATCH] paketno sms filter zadnja obljuba --- .../Controllers/Admin/PackageController.php | 37 ++- resources/js/Pages/Admin/Packages/Index.vue | 212 +++++++++++++----- 2 files changed, 188 insertions(+), 61 deletions(-) diff --git a/app/Http/Controllers/Admin/PackageController.php b/app/Http/Controllers/Admin/PackageController.php index d2f9eab..367c456 100644 --- a/app/Http/Controllers/Admin/PackageController.php +++ b/app/Http/Controllers/Admin/PackageController.php @@ -294,7 +294,7 @@ public function cancel(Package $package): RedirectResponse public function contracts(Request $request, PhoneSelector $selector): \Illuminate\Http\JsonResponse { $request->validate([ - 'segment_id' => ['required', 'integer', 'exists:segments,id'], + 'segment_id' => ['nullable', 'integer', 'exists:segments,id'], 'q' => ['nullable', 'string'], 'per_page' => ['nullable', 'integer', 'min:1', 'max:100'], 'client_id' => ['nullable', 'integer', 'exists:clients,id'], @@ -302,24 +302,31 @@ public function contracts(Request $request, PhoneSelector $selector): \Illuminat 'only_validated' => ['nullable', 'boolean'], 'start_date_from' => ['nullable', 'date'], 'start_date_to' => ['nullable', 'date'], + 'promise_date_from' => ['nullable', 'date'], + 'promise_date_to' => ['nullable', 'date'], ]); - $segmentId = (int) $request->input('segment_id'); + $segmentId = $request->input('segment_id') ? (int) $request->input('segment_id') : null; $perPage = (int) ($request->input('per_page') ?? 25); $query = Contract::query() - ->join('contract_segment', function ($j) use ($segmentId) { - $j->on('contract_segment.contract_id', '=', 'contracts.id') - ->where('contract_segment.segment_id', '=', $segmentId) - ->where('contract_segment.active', true); - }) ->with([ 'clientCase.person.phones', 'clientCase.client.person', + 'account', ]) ->select('contracts.*') ->latest('contracts.id'); + // Optional segment filter + if ($segmentId) { + $query->join('contract_segment', function ($j) use ($segmentId) { + $j->on('contract_segment.contract_id', '=', 'contracts.id') + ->where('contract_segment.segment_id', '=', $segmentId) + ->where('contract_segment.active', true); + }); + } + if ($q = trim((string) $request->input('q'))) { $query->where(function ($w) use ($q) { $w->where('contracts.reference', 'ILIKE', "%{$q}%"); @@ -340,6 +347,21 @@ public function contracts(Request $request, PhoneSelector $selector): \Illuminat $query->where('contracts.start_date', '<=', $startDateTo); } + // Date range filters for account.promise_date + $promiseDateFrom = $request->input('promise_date_from'); + $promiseDateTo = $request->input('promise_date_to'); + + if ($promiseDateFrom || $promiseDateTo) { + $query->whereHas('account', function ($q) use ($promiseDateFrom, $promiseDateTo) { + if ($promiseDateFrom) { + $q->where('promise_date', '>=', $promiseDateFrom); + } + if ($promiseDateTo) { + $q->where('promise_date', '<=', $promiseDateTo); + } + }); + } + // Optional phone filters if ($request->boolean('only_mobile') || $request->boolean('only_validated')) { $query->whereHas('clientCase.person.phones', function ($q) use ($request) { @@ -365,6 +387,7 @@ public function contracts(Request $request, PhoneSelector $selector): \Illuminat 'uuid' => $contract->uuid, 'reference' => $contract->reference, 'start_date' => $contract->start_date, + 'promise_date' => $contract->account?->promise_date, 'case' => [ 'id' => $contract->clientCase?->id, 'uuid' => $contract->clientCase?->uuid, diff --git a/resources/js/Pages/Admin/Packages/Index.vue b/resources/js/Pages/Admin/Packages/Index.vue index f3ca78b..d2033e5 100644 --- a/resources/js/Pages/Admin/Packages/Index.vue +++ b/resources/js/Pages/Admin/Packages/Index.vue @@ -89,19 +89,30 @@ const search = ref('') const clientId = ref(null) const startDateFrom = ref('') const startDateTo = ref('') +const promiseDateFrom = ref('') +const promiseDateTo = ref('') const onlyMobile = ref(false) const onlyValidated = ref(false) const loadingContracts = ref(false) const selectedContractIds = ref(new Set()) +const perPage = ref(25) async function loadContracts(url = null) { - if (!segmentId.value) { - contracts.value = { data: [], meta: { current_page: 1, last_page: 1, per_page: 25, total: 0 } } - return - } loadingContracts.value = true try { - const target = url || `${route('admin.packages.contracts')}?segment_id=${encodeURIComponent(segmentId.value)}${search.value ? `&q=${encodeURIComponent(search.value)}` : ''}${clientId.value ? `&client_id=${encodeURIComponent(clientId.value)}` : ''}${startDateFrom.value ? `&start_date_from=${encodeURIComponent(startDateFrom.value)}` : ''}${startDateTo.value ? `&start_date_to=${encodeURIComponent(startDateTo.value)}` : ''}${onlyMobile.value ? `&only_mobile=1` : ''}${onlyValidated.value ? `&only_validated=1` : ''}` + const params = new URLSearchParams() + if (segmentId.value) params.append('segment_id', segmentId.value) + if (search.value) params.append('q', search.value) + if (clientId.value) params.append('client_id', clientId.value) + if (startDateFrom.value) params.append('start_date_from', startDateFrom.value) + if (startDateTo.value) params.append('start_date_to', startDateTo.value) + if (promiseDateFrom.value) params.append('promise_date_from', promiseDateFrom.value) + if (promiseDateTo.value) params.append('promise_date_to', promiseDateTo.value) + if (onlyMobile.value) params.append('only_mobile', '1') + if (onlyValidated.value) params.append('only_validated', '1') + params.append('per_page', perPage.value) + + const target = url || `${route('admin.packages.contracts')}?${params.toString()}` const res = await fetch(target, { headers: { 'X-Requested-With': 'XMLHttpRequest' } }) const json = await res.json() contracts.value = { data: json.data || [], meta: json.meta || { current_page: 1, last_page: 1, per_page: 25, total: 0 } } @@ -151,7 +162,21 @@ function goContractsPage(delta) { const { current_page } = contracts.value.meta const nextPage = current_page + delta if (nextPage < 1 || nextPage > contracts.value.meta.last_page) return - const base = `${route('admin.packages.contracts')}?segment_id=${encodeURIComponent(segmentId.value)}${search.value ? `&q=${encodeURIComponent(search.value)}` : ''}${clientId.value ? `&client_id=${encodeURIComponent(clientId.value)}` : ''}${startDateFrom.value ? `&start_date_from=${encodeURIComponent(startDateFrom.value)}` : ''}${startDateTo.value ? `&start_date_to=${encodeURIComponent(startDateTo.value)}` : ''}${onlyMobile.value ? `&only_mobile=1` : ''}${onlyValidated.value ? `&only_validated=1` : ''}&page=${nextPage}` + + const params = new URLSearchParams() + if (segmentId.value) params.append('segment_id', segmentId.value) + if (search.value) params.append('q', search.value) + if (clientId.value) params.append('client_id', clientId.value) + if (startDateFrom.value) params.append('start_date_from', startDateFrom.value) + if (startDateTo.value) params.append('start_date_to', startDateTo.value) + if (promiseDateFrom.value) params.append('promise_date_from', promiseDateFrom.value) + if (promiseDateTo.value) params.append('promise_date_to', promiseDateTo.value) + if (onlyMobile.value) params.append('only_mobile', '1') + if (onlyValidated.value) params.append('only_validated', '1') + params.append('per_page', perPage.value) + params.append('page', nextPage) + + const base = `${route('admin.packages.contracts')}?${params.toString()}` loadContracts(base) } @@ -243,43 +268,92 @@ function submitCreateFromContracts() {