637866b9f2
Records the user's choice between the two candidate link targets (the notice page on oeffentlichevergabe.de, not the awarding portal's own page), what was checked before touching the adapter, and the trap in verifying it: the target is a single-page app that answers 200 with an identical shell for any id, so only rendered content proves the link works. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
53 lines
2.7 KiB
Markdown
53 lines
2.7 KiB
Markdown
---
|
|
created: 2026-08-05
|
|
resolved: 2026-08-11
|
|
resolution: |
|
|
Behoben in Quick-Task 260811-j04, Commit ecf7872. Der User hat sich fuer die
|
|
Bekanntmachungsseite entschieden (nicht fuer den Link auf das ausschreibende
|
|
Portal). Adapter baut die URL jetzt aus der Bekanntmachungsnummer, Migration
|
|
20260811120000_doe_notice_url_backfill schreibt die 2846 bestehenden Zeilen um.
|
|
title: DÖE-Ausschreibungen verlinken auf die API statt auf die Bekanntmachungsseite
|
|
area: tender-radar
|
|
severity: major
|
|
trigger: nach Abschluss von Phase 16 — User will das ausdruecklich erst danach fixen (2026-08-05)
|
|
files:
|
|
- apps/api/src/tenders/adapters/doe-opendata.adapter.ts:127
|
|
---
|
|
|
|
## Problem
|
|
|
|
Öffnet ein Nutzer eine Ausschreibung aus der Quelle `doe-opendata`, landet er im Browser auf rohem JSON statt auf der Bekanntmachung.
|
|
|
|
Ursache steht fest: `doe-opendata.adapter.ts:127` setzt
|
|
|
|
```
|
|
sourceUrl: ocdsDocument.uri
|
|
```
|
|
|
|
`ocdsDocument.uri` ist die **API-Adresse** des Datensatzes, im Beispiel
|
|
`https://oeffentlichevergabe.de/api/notices/25669778?format=ocds¬iceVersion=1`.
|
|
Die liefert bestimmungsgemäß OCDS-JSON, keine Webseite.
|
|
|
|
Betrifft jede Stelle, die `sourceUrl` anzeigt: Detailansicht, Trefferliste und die Links in den E-Mail-Benachrichtigungen (`tender-mail.service.ts:275` und `:287`).
|
|
|
|
## Solution
|
|
|
|
Die menschenlesbare Seite ist am 2026-08-05 im Browser verifiziert:
|
|
|
|
```
|
|
https://oeffentlichevergabe.de/ui/de/notices/25669778
|
|
→ leitet weiter auf →
|
|
https://oeffentlichevergabe.de/ui/de/search/details?noticeId=25669778
|
|
```
|
|
|
|
Beide Formen rendern die richtige Bekanntmachung (geprüft: Titel „2026-0063, Beschaffung von Softwarelizenzen … Stadt Leverkusen"). Die zweite ist das Weiterleitungsziel und damit die stabilere Wahl — sie kommt ohne Redirect aus.
|
|
|
|
Die Nummer ist `release.id`, die der Adapter bereits als `sourceNoticeId` ablegt. Der Link lässt sich also ohne neue Datenquelle bauen.
|
|
|
|
**Zwei Teile, der zweite ist der wichtigere:**
|
|
|
|
1. Adapter korrigieren, damit neue Importe den richtigen Link tragen.
|
|
2. **Bestandskorrektur** — alle bereits importierten DÖE-Tender tragen die falsche URL in der Datenbank. Ohne Nachlauf bleiben sie kaputt. Muster dafür existiert: `20260721150000_tender_cpv_divisions_backfill`.
|
|
|
|
**Beim Umsetzen zusätzlich prüfen:** `ocdsDocument.uri` als Feld nicht ersatzlos wegwerfen — falls es anderswo als Kennung dient. Und im Datensatz steckt unter `tender.documents[0].url` noch der Link auf das ausschreibende Portal selbst (im Beispiel `vmp-rheinland.de`); das ist eine andere Sache als die Bekanntmachungsseite, könnte aber die eigentlich nützlichere Zielseite für den Nutzer sein. Vor dem Bauen einmal mit dem User klären, welcher der beiden Links in der Detailansicht stehen soll.
|