This commit is contained in:
Saufi
2026-06-03 08:51:22 +08:00
commit a14d43fe34
347 changed files with 38197 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
<?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']));
}
}