$filters * @return Builder */ 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'])); } }