From 872b76b012747e5683c503d0c9e321871d81c12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Pocrnji=C4=8D?= Date: Mon, 20 Oct 2025 19:39:26 +0200 Subject: [PATCH] changes --- app/Http/Controllers/ClientController.php | 12 +- app/Http/Controllers/ImportController.php | 9 ++ app/Http/Controllers/SegmentController.php | 1 + app/Http/Requests/UpdateSegmentRequest.php | 1 + app/Models/Segment.php | 2 + ...10_20_153058_add_exclude_segment_table.php | 26 ++++ .../Cases/Partials/CaseObjectsDialog.vue | 117 ++++++++++++++++-- resources/js/Pages/Client/Contracts.vue | 29 ++++- .../js/Pages/Settings/Segments/Index.vue | 114 +++++++++++++---- 9 files changed, 268 insertions(+), 43 deletions(-) create mode 100644 database/migrations/2025_10_20_153058_add_exclude_segment_table.php diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index ce2efd4..0db4353 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -118,6 +118,7 @@ public function contracts(Client $client, Request $request) $from = $request->input('from'); $to = $request->input('to'); $search = $request->input('search'); + $segmentId = $request->input('segment'); $contractsQuery = \App\Models\Contract::query() ->whereHas('clientCase', function ($q) use ($client) { @@ -149,8 +150,16 @@ public function contracts(Client $client, Request $request) }); }); }) + ->when($segmentId, function ($q) use ($segmentId) { + $q->whereHas('segments', function ($s) use ($segmentId) { + $s->where('segments.id', $segmentId) + ->where('contract_segment.active', true); + }); + }) ->orderByDesc('start_date'); + $segments = \App\Models\Segment::orderBy('name')->get(['id', 'name']); + $types = [ 'address_types' => \App\Models\Person\AddressType::all(), 'phone_types' => \App\Models\Person\PhoneType::all(), @@ -159,7 +168,8 @@ public function contracts(Client $client, Request $request) return Inertia::render('Client/Contracts', [ 'client' => $data, 'contracts' => $contractsQuery->paginate($request->integer('perPage', 20))->withQueryString(), - 'filters' => $request->only(['from', 'to', 'search']), + 'filters' => $request->only(['from', 'to', 'search', 'segment']), + 'segments' => $segments, 'types' => $types, ]); } diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 23aba38..381d886 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -415,6 +415,15 @@ public function missingContracts(Import $import) ->where('client_cases.client_id', $import->client_id) ->where('contracts.active', 1) ->whereNull('contracts.deleted_at') + // Exclude contracts that have any ACTIVE segment marked as excluded + ->whereNotExists(function ($sq) { + $sq->select(\DB::raw(1)) + ->from('contract_segment') + ->join('segments', 'segments.id', '=', 'contract_segment.segment_id') + ->whereColumn('contract_segment.contract_id', 'contracts.id') + ->where('contract_segment.active', true) + ->where('segments.exclude', true); + }) ->when(count($present) > 0, function ($q) use ($present) { $q->whereNotIn('contracts.reference', $present); }) diff --git a/app/Http/Controllers/SegmentController.php b/app/Http/Controllers/SegmentController.php index 0cf69c6..3046b94 100644 --- a/app/Http/Controllers/SegmentController.php +++ b/app/Http/Controllers/SegmentController.php @@ -120,6 +120,7 @@ public function update(UpdateSegmentRequest $request, Segment $segment) 'name' => $data['name'], 'description' => $data['description'] ?? null, 'active' => $data['active'] ?? $segment->active, + 'exclude' => $data['exclude'] ?? $segment->exclude ]); return to_route('settings.segments')->with('success', 'Segment updated'); diff --git a/app/Http/Requests/UpdateSegmentRequest.php b/app/Http/Requests/UpdateSegmentRequest.php index eb58893..e07fc72 100644 --- a/app/Http/Requests/UpdateSegmentRequest.php +++ b/app/Http/Requests/UpdateSegmentRequest.php @@ -17,6 +17,7 @@ public function rules(): array 'name' => ['required', 'string', 'max:50'], 'description' => ['nullable', 'string', 'max:255'], 'active' => ['boolean'], + 'exclude' => ['boolean'] ]; } diff --git a/app/Models/Segment.php b/app/Models/Segment.php index 12c6753..be41cc8 100644 --- a/app/Models/Segment.php +++ b/app/Models/Segment.php @@ -15,12 +15,14 @@ class Segment extends Model 'name', 'description', 'active', + 'exclude' ]; protected function casts(): array { return [ 'active' => 'boolean', + 'exclude' => 'boolean' ]; } diff --git a/database/migrations/2025_10_20_153058_add_exclude_segment_table.php b/database/migrations/2025_10_20_153058_add_exclude_segment_table.php new file mode 100644 index 0000000..00ac60e --- /dev/null +++ b/database/migrations/2025_10_20_153058_add_exclude_segment_table.php @@ -0,0 +1,26 @@ +boolean('exclude')->default(false)->after('active'); + } + }); + } + + public function down(): void + { + Schema::table('segments', function (Blueprint $table) { + if (Schema::hasColumn('segments', 'exclude')) { + $table->dropColumn('exclude'); + } + }); + } +}; diff --git a/resources/js/Pages/Cases/Partials/CaseObjectsDialog.vue b/resources/js/Pages/Cases/Partials/CaseObjectsDialog.vue index 9a9a12e..a2236c8 100644 --- a/resources/js/Pages/Cases/Partials/CaseObjectsDialog.vue +++ b/resources/js/Pages/Cases/Partials/CaseObjectsDialog.vue @@ -1,43 +1,128 @@