59 lines
2.9 KiB
PHP
59 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Finance;
|
|
|
|
use App\Models\BankVerification;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class FinanceVerificationQuery
|
|
{
|
|
/**
|
|
* @param array<string, mixed> $filters
|
|
* @return Builder<BankVerification>
|
|
*/
|
|
public function build(array $filters = []): Builder
|
|
{
|
|
return BankVerification::query()
|
|
->with([
|
|
'application.election',
|
|
'application.pusatMengundi',
|
|
'application.approvedPosition',
|
|
'application.requestedPosition',
|
|
'application.documents',
|
|
'application.staffAssignments.position',
|
|
'verifiedBy',
|
|
])
|
|
->whereHas('application', function (Builder $query) use ($filters): void {
|
|
$query->whereIn('status', ['approved', 'assigned'])
|
|
->when(! empty($filters['pusat_mengundi_id']), fn (Builder $nested) => $nested->where('pusat_mengundi_id', $filters['pusat_mengundi_id']))
|
|
->when(! empty($filters['role_id']), function (Builder $nested) use ($filters): void {
|
|
$nested->where(function (Builder $roleQuery) use ($filters): void {
|
|
$roleQuery->where('approved_position_id', $filters['role_id'])
|
|
->orWhere(function (Builder $fallback) use ($filters): void {
|
|
$fallback->whereNull('approved_position_id')
|
|
->where('requested_position_id', $filters['role_id']);
|
|
});
|
|
});
|
|
})
|
|
->when(! empty($filters['missing_account_number']), function (Builder $nested): void {
|
|
$nested->where(function (Builder $accountQuery): void {
|
|
$accountQuery->whereNull('bank_account_number')
|
|
->orWhere('bank_account_number', '');
|
|
});
|
|
})
|
|
->when(! empty($filters['missing_bank_statement']), function (Builder $nested): void {
|
|
$nested->whereDoesntHave('documents', fn (Builder $documentQuery) => $documentQuery->where('document_type', 'bank_statement'));
|
|
})
|
|
->when(! empty($filters['q']), function (Builder $nested) use ($filters): void {
|
|
$term = '%'.$filters['q'].'%';
|
|
$nested->where(function (Builder $keywordQuery) use ($term): void {
|
|
$keywordQuery->where('name', 'like', $term)
|
|
->orWhere('ic_number', 'like', $term)
|
|
->orWhere('email', 'like', $term);
|
|
});
|
|
});
|
|
})
|
|
->when(! empty($filters['status']), fn (Builder $query) => $query->where('status', $filters['status']));
|
|
}
|
|
}
|