fix(WP-0013): Feedback-Bugs — alle 8 Einträge aus Backlog behoben

- Fristen-Widget-Format: DateInput/DateTimeInput mit ISO-Format-Attribut, damit
  Browser date/datetime-local korrekt vorausfüllen (Feedback #4)
- Phase 2 Teilnahmeentscheidung: URL in build_phase_nav von
  /teilnahmeentscheidung/ → /entscheidung/ korrigiert (Feedback #6)
- Phase 3 Detaillierte Durchsicht: URL in build_phase_nav von
  /anforderungen/ → /lose/anforderungen/ korrigiert (Feedback #7)
- Phase 7 Abgabe: order_by('bezeichnung') → order_by('beschreibung') in
  abgabe_views.py (Dokument hat kein Feld 'bezeichnung') (Feedback #8)
- Ausschreibungen-Liste: Ausschreiber zuerst, Titel zweite Spalte,
  neues geschätztes Volumen (Feedback #5)
- Feedback-Backlog Leerstand: bereits durch vorherigen URL-Fix abgedeckt
  (Feedback #1)
- Rechtsgrundlage (VgV/UVgO/VOB/A/SektVO/GWB) als neues Formularfeld
  incl. Migration (Feedback #2)
- Bindefrist in Tagen + berechnetes Enddatum als Modell-Property
  bindefrist_berechnet, Formular und Detailansicht erweitert (Feedback #3)

68/68 Tests grün.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-05-14 00:31:55 +02:00
parent d6873d7b88
commit 7903f59f85
10 changed files with 240 additions and 14 deletions

View file

@ -59,6 +59,7 @@
<dl class="space-y-1">
{% render_field ausschreibung "ausschreiber" "Ausschreiber" %}
{% render_field ausschreibung "vergabeart" "Vergabeart" %}
{% render_field ausschreibung "rechtsgrundlage" "Rechtsgrundlage" %}
{% render_field ausschreibung "vergabenummer" "Vergabenummer" %}
{% render_field ausschreibung "vergabeplattform" "Plattform" %}
{% render_field ausschreibung "branche" "Branche" %}
@ -73,7 +74,19 @@
{% render_field ausschreibung "veroeffentlichungsdatum" "Veröffentlicht" %}
{% render_field ausschreibung "bieterfragen_bis" "Bieterfragen bis" %}
{% render_field ausschreibung "abgabe_bis" "Abgabe bis" %}
{% if ausschreibung.bindefrist_tage %}
<div class="flex justify-between text-sm py-0.5">
<dt class="text-slate-500">Bindefrist</dt>
<dd class="text-slate-800">
{{ ausschreibung.bindefrist_tage }} Tage
{% if ausschreibung.bindefrist_berechnet %}
<span class="text-slate-400">(bis {{ ausschreibung.bindefrist_berechnet|date:"d.m.Y" }})</span>
{% endif %}
</dd>
</div>
{% else %}
{% render_field ausschreibung "bindefrist" "Bindefrist" %}
{% endif %}
</dl>
</div>
</div>

View file

@ -26,6 +26,10 @@
<label class="form-label">Vergabeart</label>
{{ form.vergabeart }}
</div>
<div>
<label class="form-label">Rechtsgrundlage</label>
{{ form.rechtsgrundlage }}
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
@ -83,9 +87,14 @@
{{ form.abgabe_bis }}
</div>
<div>
<label class="form-label">Bindefrist</label>
<label class="form-label">Bindefrist (Datum)</label>
{{ form.bindefrist }}
</div>
<div>
<label class="form-label">Bindefrist (Tage ab Abgabe)</label>
{{ form.bindefrist_tage }}
<p class="text-xs text-slate-400 mt-0.5">Alternativ zum Datum — Enddatum wird automatisch berechnet</p>
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div class="flex items-center gap-2">

View file

@ -4,8 +4,9 @@
<table class="w-full text-sm">
<thead class="bg-slate-50 border-b border-slate-200">
<tr>
<th class="text-left px-4 py-2 font-medium text-slate-600">Titel</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Ausschreiber</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Titel</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Volumen (gesch.)</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Status</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Abgabe</th>
<th class="text-left px-4 py-2 font-medium text-slate-600">Bid Manager</th>
@ -14,12 +15,15 @@
<tbody class="divide-y divide-slate-100">
{% for a in ausschreibungen %}
<tr class="hover:bg-slate-50">
<td class="px-4 py-2 text-slate-600 font-medium">{{ a.ausschreiber|default:"—" }}</td>
<td class="px-4 py-2">
<a href="{% url 'ausschreibungen:detail' a.pk %}" class="text-brand-700 hover:underline font-medium">
{{ a.titel }}
</a>
</td>
<td class="px-4 py-2 text-slate-600">{{ a.ausschreiber }}</td>
<td class="px-4 py-2 text-slate-600 text-right whitespace-nowrap">
{% if a.geschaetztes_volumen %}{{ a.geschaetztes_volumen|floatformat:0 }} €{% else %}—{% endif %}
</td>
<td class="px-4 py-2">
{% status_badge a.status a.get_status_display %}
</td>