79 lines
2.8 KiB
PHP
79 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Reports;
|
|
|
|
use App\Models\Contract;
|
|
use App\Reports\Contracts\Report;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class ActiveContractsReport extends BaseEloquentReport implements Report
|
|
{
|
|
public function slug(): string
|
|
{
|
|
return 'active-contracts';
|
|
}
|
|
|
|
public function name(): string
|
|
{
|
|
return 'Aktivne pogodbe';
|
|
}
|
|
|
|
public function description(): ?string
|
|
{
|
|
return 'Pogodbe, ki so aktivne na izbrani dan, z možnostjo filtriranja po stranki.';
|
|
}
|
|
|
|
public function inputs(): array
|
|
{
|
|
return [
|
|
['key' => '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');
|
|
}
|
|
}
|