'client_uuid', 'type' => 'select:client', 'label' => 'Stranka', 'nullable' => true], ]; } public function columns(): array { return [ ['key' => 'contract_reference', 'label' => 'Pogodba'], ['key' => 'client_name', 'label' => 'Stranka'], ['key' => 'person_name', 'label' => 'Zadeva (oseba)'], ['key' => 'start_date', 'label' => 'Začetek'], ['key' => 'end_date', 'label' => 'Konec'], ['key' => 'balance_amount', 'label' => 'Saldo'], ]; } public function query(array $filters): Builder { $asOf = now()->toDateString(); return Contract::query() ->join('client_cases', 'contracts.client_case_id', '=', 'client_cases.id') ->leftJoin('clients', 'client_cases.client_id', '=', 'clients.id') ->leftJoin('person as client_people', 'clients.person_id', '=', 'client_people.id') ->leftJoin('person as subject_people', 'client_cases.person_id', '=', 'subject_people.id') ->leftJoin('accounts', 'contracts.id', '=', 'accounts.contract_id') ->when(! empty($filters['client_uuid']), fn ($q) => $q->where('clients.uuid', $filters['client_uuid'])) // Active as of date: start_date <= as_of (or null) AND (end_date is null OR end_date >= as_of) ->where(function ($q) use ($asOf) { $q->whereNull('contracts.start_date') ->orWhereDate('contracts.start_date', '<=', $asOf); }) ->where(function ($q) use ($asOf) { $q->whereNull('contracts.end_date') ->orWhereDate('contracts.end_date', '>=', $asOf); }) ->select([ 'contracts.id', 'contracts.start_date', 'contracts.end_date', ]) ->addSelect([ \DB::raw('contracts.reference as contract_reference'), \DB::raw('client_people.full_name as client_name'), \DB::raw('subject_people.full_name as person_name'), \DB::raw('CAST(accounts.balance_amount AS FLOAT) as balance_amount'), ]) ->orderBy('contracts.start_date', 'asc'); } }