user()->id; $jobs = FieldJob::query() ->where('assigned_user_id', $userId) ->whereNull('completed_at') ->whereNull('cancelled_at') ->with([ 'contract' => function ($q) { $q->with(['type:id,name', 'account', 'clientCase.person' => function ($pq) { $pq->with(['addresses', 'phones']); }]); }, ]) ->orderByDesc('assigned_at') ->limit(100) ->get(); return Inertia::render('Phone/Index', [ 'jobs' => $jobs, ]); } public function showCase(\App\Models\ClientCase $clientCase, Request $request) { $userId = $request->user()->id; // Eager load client case with person details $case = \App\Models\ClientCase::query() ->with(['person' => fn ($q) => $q->with(['addresses', 'phones', 'emails', 'bankAccounts'])]) ->findOrFail($clientCase->id); // Determine contracts of this case assigned to the current user via FieldJobs and still active $assignedContractIds = FieldJob::query() ->where('assigned_user_id', $userId) ->whereNull('completed_at') ->whereNull('cancelled_at') ->whereHas('contract', fn ($q) => $q->where('client_case_id', $case->id)) ->pluck('contract_id') ->unique() ->values(); $contracts = \App\Models\Contract::query() ->where('client_case_id', $case->id) ->whereIn('id', $assignedContractIds) ->with(['type:id,name', 'account']) ->orderByDesc('created_at') ->get(); // Attach latest object (if any) to each contract as last_object for display if ($contracts->isNotEmpty()) { $byId = $contracts->keyBy('id'); $latestObjects = \App\Models\CaseObject::query() ->whereIn('contract_id', $byId->keys()) ->whereNull('deleted_at') ->select('id', 'reference', 'name', 'description', 'type', 'contract_id', 'created_at') ->orderByDesc('created_at') ->get() ->groupBy('contract_id') ->map(function ($group) { return $group->first(); }); foreach ($latestObjects as $cid => $obj) { if (isset($byId[$cid])) { $byId[$cid]->setAttribute('last_object', $obj); } } } // Build merged documents: case documents + documents of assigned contracts $contractRefMap = []; foreach ($contracts as $c) { $contractRefMap[$c->id] = $c->reference; } $contractDocs = \App\Models\Document::query() ->where('documentable_type', \App\Models\Contract::class) ->whereIn('documentable_id', $assignedContractIds) ->orderByDesc('created_at') ->get() ->map(function ($d) use ($contractRefMap) { $arr = $d->toArray(); $arr['contract_reference'] = $contractRefMap[$d->documentable_id] ?? null; $arr['documentable_type'] = \App\Models\Contract::class; $arr['contract_uuid'] = optional(\App\Models\Contract::withTrashed()->find($d->documentable_id))->uuid; return $arr; }); $caseDocs = $case->documents()->orderByDesc('created_at')->get()->map(function ($d) use ($case) { $arr = $d->toArray(); $arr['documentable_type'] = \App\Models\ClientCase::class; $arr['client_case_uuid'] = $case->uuid; return $arr; }); $documents = $caseDocs->concat($contractDocs)->sortByDesc('created_at')->values(); // Provide minimal types for PersonInfoGrid $types = [ 'address_types' => \App\Models\Person\AddressType::all(), 'phone_types' => \App\Models\Person\PhoneType::all(), ]; // Case activities (compact for phone): latest 20 with relations $activities = $case->activities() ->with(['action', 'decision', 'contract:id,uuid,reference', 'user:id,name']) ->orderByDesc('created_at') ->limit(20) ->get() ->map(function ($a) { $a->setAttribute('user_name', optional($a->user)->name); return $a; }); return Inertia::render('Phone/Case/Index', [ 'client' => $case->client()->with('person', fn ($q) => $q->with(['addresses', 'phones', 'emails', 'bankAccounts']))->firstOrFail(), 'client_case' => $case, 'contracts' => $contracts, 'documents' => $documents, 'types' => $types, 'account_types' => \App\Models\AccountType::all(), 'actions' => \App\Models\Action::with('decisions')->get(), 'activities' => $activities, ]); } }