first
This commit is contained in:
58
app/Services/Finance/FinanceVerificationQuery.php
Normal file
58
app/Services/Finance/FinanceVerificationQuery.php
Normal 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']));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user