feat(11-02): wire Region/PLZ/Bundesland filter into query builder + FilterPanel
TenderQueryDto gains validated plz (@MaxLength(5)), region, and bundesland fields. buildTenderWhere adds three conditional AND-branches: plz startsWith, bundesland exact-match against the now-backfilled indexed column (Pitfall 1), and region startsWith (usable independent of the bundesland column). FilterPanel gets a PLZ input and a 16-Land Bundesland dropdown (mirrors NUTS1_BUNDESLAND — web/api are separate packages) that write plz/bundesland into the URL searchParams; ResultsList already forwards the full URLSearchParams to listTenders(), so no additional fetch wiring was needed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,6 +68,28 @@ export function buildTenderWhere(dto: TenderQueryDto): Prisma.TenderWhereInput {
|
||||
);
|
||||
}
|
||||
|
||||
// FILTER-02 / D-02: PLZ prefix match — plz is a 5-digit German postal
|
||||
// code column; startsWith allows shorter prefixes to broaden the match.
|
||||
if (dto.plz) {
|
||||
AND.push({ plz: { startsWith: dto.plz } });
|
||||
}
|
||||
|
||||
// FILTER-02 / D-02: Bundesland exact match against the backfilled/
|
||||
// normalizer-derived `bundesland` column (indexed, Pitfall 1) — real
|
||||
// hits only after the 20260721140000_tender_bundesland_backfill
|
||||
// migration has run. Preferred over region-prefix matching once
|
||||
// bundesland is populated.
|
||||
if (dto.bundesland) {
|
||||
AND.push({ bundesland: dto.bundesland });
|
||||
}
|
||||
|
||||
// FILTER-02 / D-02: raw NUTS-region prefix match, independent of the
|
||||
// bundesland column — usable even for rows whose bundesland derivation
|
||||
// hasn't run yet, and for finer-grained region-level filtering.
|
||||
if (dto.region) {
|
||||
AND.push({ region: { startsWith: dto.region } });
|
||||
}
|
||||
|
||||
if (AND.length) where.AND = AND;
|
||||
return where;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user