with('person') ->when($request->input('search'), function ($que, $search) { $que->whereHas('person', function ($q) use ($search) { $q->where('full_name', 'ilike', '%'.$search.'%'); }); }) ->where('active', 1) ->addSelect([ // Number of client cases for this client that have at least one active contract 'cases_with_active_contracts_count' => DB::query() ->from('client_cases') ->join('contracts', 'contracts.client_case_id', '=', 'client_cases.id') ->selectRaw('COUNT(DISTINCT client_cases.id)') ->whereColumn('client_cases.client_id', 'clients.id') ->whereNull('contracts.deleted_at') ->whereExists(function ($q) { $q->from('contract_segment') ->whereColumn('contract_segment.contract_id', 'contracts.id') ->where('contract_segment.active', true); }), // Sum of account balances for active contracts that belong to this client's cases 'active_contracts_balance_sum' => DB::query() ->from('contracts') ->join('accounts', 'accounts.contract_id', '=', 'contracts.id') ->selectRaw('COALESCE(SUM(accounts.balance_amount), 0)') ->whereExists(function ($q) { $q->from('client_cases') ->whereColumn('client_cases.id', 'contracts.client_case_id') ->whereColumn('client_cases.client_id', 'clients.id'); }) ->whereNull('contracts.deleted_at') ->whereExists(function ($q) { $q->from('contract_segment') ->whereColumn('contract_segment.contract_id', 'contracts.id') ->where('contract_segment.active', true); }), ]) ->orderByDesc('created_at'); return Inertia::render('Client/Index', [ 'clients' => $query ->paginate(15) ->withQueryString(), 'filters' => $request->only(['search']), ]); } public function show(Client $client, Request $request) { $data = $client::query() ->with(['person' => fn ($que) => $que->with(['addresses', 'phones', 'bankAccounts'])]) ->findOrFail($client->id); $types = [ 'address_types' => \App\Models\Person\AddressType::all(), 'phone_types' => \App\Models\Person\PhoneType::all(), ]; return Inertia::render('Client/Show', [ 'client' => $data, 'client_cases' => $data->clientCases() ->with(['person', 'client.person']) ->when($request->input('search'), fn ($que, $search) => $que->whereHas( 'person', fn ($q) => $q->where('full_name', 'ilike', '%'.$search.'%') ) ) ->addSelect([ 'active_contracts_count' => \DB::query() ->from('contracts') ->selectRaw('COUNT(*)') ->whereColumn('contracts.client_case_id', 'client_cases.id') ->whereNull('contracts.deleted_at') ->whereExists(function ($q) { $q->from('contract_segment') ->whereColumn('contract_segment.contract_id', 'contracts.id') ->where('contract_segment.active', true); }), 'active_contracts_balance_sum' => \DB::query() ->from('contracts') ->join('accounts', 'accounts.contract_id', '=', 'contracts.id') ->selectRaw('COALESCE(SUM(accounts.balance_amount), 0)') ->whereColumn('contracts.client_case_id', 'client_cases.id') ->whereNull('contracts.deleted_at') ->whereExists(function ($q) { $q->from('contract_segment') ->whereColumn('contract_segment.contract_id', 'contracts.id') ->where('contract_segment.active', true); }), ]) ->where('active', 1) ->orderByDesc('created_at') ->paginate(15) ->withQueryString(), 'types' => $types, 'filters' => $request->only(['search']), ]); } public function store(Request $request) { DB::transaction(function () use ($request) { $address = $request->input('address'); $phone = $request->input('phone'); $person = \App\Models\Person\Person::create([ 'nu' => rand(100000, 200000), 'first_name' => $request->input('first_name'), 'last_name' => $request->input('last_name'), 'full_name' => $request->input('full_name'), 'gender' => null, 'birthday' => null, 'tax_number' => $request->input('tax_number'), 'social_security_number' => $request->input('social_security_number'), 'description' => $request->input('description'), 'group_id' => 1, 'type_id' => 2, ]); $person->addresses()->create([ 'address' => $address['address'], 'country' => $address['country'], 'type_id' => $address['type_id'], ]); $person->phones()->create([ 'nu' => $phone['nu'], 'country_code' => $phone['country_code'], 'type_id' => $phone['type_id'], ]); $person->client()->create(); }); // \App\Models\Person\PersonAddress::create($address); return to_route('client'); } public function update(Client $client, Request $request) { return to_route('client.show', $client); } }