feat(WP-0014): Aufgaben-Phasenzuordnung und Fertigstellungs-Scores
Aufgabe bekommt ein phase-Feld (1–8). aufgaben_score()-Helper in core/services.py berechnet abgeschlossen/total/score_pct für jedes QuerySet. Score-Spalten in Ausschreibungen-Liste, Lose-Liste und Ausschreibungs-Detail; per-Phase-Scores in der Seitenleisten-Navigation. Phasenfilter in Aufgaben-Liste. 68 Tests grün. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
f5950b6cbc
commit
e4eb5bc368
14 changed files with 343 additions and 5 deletions
|
|
@ -25,7 +25,15 @@ STATUS_TO_PHASE = {
|
|||
}
|
||||
|
||||
|
||||
def aufgaben_score(qs):
|
||||
total = qs.count()
|
||||
abgeschlossen = qs.filter(status__in=['erledigt', 'verworfen']).count()
|
||||
pct = round(abgeschlossen / total * 100) if total else 0
|
||||
return {'total': total, 'abgeschlossen': abgeschlossen, 'score_pct': pct}
|
||||
|
||||
|
||||
def build_phase_nav(ausschreibung, current_url=''):
|
||||
from vergabe_teilnahme.apps.aufgaben.models import Aufgabe
|
||||
aktuelle_phase = STATUS_TO_PHASE.get(ausschreibung.status, 1)
|
||||
base = f'/ausschreibungen/{ausschreibung.pk}'
|
||||
phase_urls = {
|
||||
|
|
@ -38,6 +46,11 @@ def build_phase_nav(ausschreibung, current_url=''):
|
|||
7: f'{base}/abgabe/',
|
||||
8: f'{base}/nachbetrachtung/',
|
||||
}
|
||||
aufgaben_qs = Aufgabe.objects.filter(ausschreibung=ausschreibung)
|
||||
phasen_stats = {
|
||||
num: aufgaben_score(aufgaben_qs.filter(phase=num))
|
||||
for num, _ in PHASEN
|
||||
}
|
||||
return [
|
||||
{
|
||||
'nummer': num,
|
||||
|
|
@ -46,6 +59,7 @@ def build_phase_nav(ausschreibung, current_url=''):
|
|||
'aktiv': num == aktuelle_phase,
|
||||
'erledigt': num < aktuelle_phase,
|
||||
'warnung': False,
|
||||
'aufgaben_score': phasen_stats[num],
|
||||
}
|
||||
for num, name in PHASEN
|
||||
]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue