Implementiert Subunternehmer-Katalog mit Suche/Filter, Zuordnung zu Losen via HTMX-Modal, Dienstleistertyp-CRUD und Präferenz-Badges. Bibliothek: Nachweis-Katalog mit Ablaufwarnung und Versionierung, Referenz-Katalog mit Ausschreibungszuordnung, Leistungsblatt-CRUD, Entscheidungsregel-CRUD mit Aktiv-Toggle. Migration für referenzen M2M auf Ausschreibung. 56 Tests grün. Tests-Discovery auf tests.py-Dateien ausgedehnt. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
102 lines
4.5 KiB
HTML
102 lines
4.5 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}{{ sub.name }}{% endblock %}
|
|
{% block content %}
|
|
<div class="flex items-start justify-between mb-5">
|
|
<div>
|
|
<h1 class="page-title">{{ sub.name }}</h1>
|
|
<p class="text-slate-500 text-sm">{{ sub.dienstleistertyp|default:"Kein Dienstleistertyp" }}</p>
|
|
</div>
|
|
<div class="flex gap-2 items-center">
|
|
<div id="praeferenz-badge"
|
|
hx-get="{% url 'partner:su_praeferenz' pk=sub.pk %}"
|
|
hx-trigger="load"
|
|
hx-swap="outerHTML">
|
|
{% if sub.praeferenz == 'bevorzugt' %}
|
|
<span class="badge-green">Bevorzugt</span>
|
|
{% elif sub.praeferenz == 'gesperrt' %}
|
|
<span class="badge-red">Gesperrt</span>
|
|
{% else %}
|
|
<span class="badge-gray">Zugelassen</span>
|
|
{% endif %}
|
|
</div>
|
|
<a href="{% url 'partner:su_bearbeiten' pk=sub.pk %}" class="btn-secondary">Bearbeiten</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-3 gap-4 mb-6">
|
|
<div class="card col-span-2 space-y-3">
|
|
<h2 class="section-title">Kontakt</h2>
|
|
{% if sub.strasse or sub.ort %}
|
|
<p class="text-sm">{{ sub.strasse }}{% if sub.strasse and sub.ort %}, {% endif %}{{ sub.plz }} {{ sub.ort }}, {{ sub.land }}</p>
|
|
{% endif %}
|
|
{% if sub.telefon %}<p class="text-sm">Tel: {{ sub.telefon }}</p>{% endif %}
|
|
{% if sub.email %}<p class="text-sm">E-Mail: <a href="mailto:{{ sub.email }}" class="text-brand-600">{{ sub.email }}</a></p>{% endif %}
|
|
{% if sub.website %}<p class="text-sm"><a href="{{ sub.website }}" class="text-brand-600" target="_blank">{{ sub.website }}</a></p>{% endif %}
|
|
{% if sub.ansprechpartner %}
|
|
<p class="text-sm font-medium">Ansprechpartner: {{ sub.ansprechpartner }}
|
|
{% if sub.ansprechpartner_email %} — <a href="mailto:{{ sub.ansprechpartner_email }}" class="text-brand-600">{{ sub.ansprechpartner_email }}</a>{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h2 class="section-title mb-3">Präferenz ändern</h2>
|
|
<form hx-post="{% url 'partner:su_praeferenz' pk=sub.pk %}"
|
|
hx-target="#praeferenz-badge"
|
|
hx-swap="outerHTML"
|
|
class="space-y-2">
|
|
{% csrf_token %}
|
|
{% for val, label in sub.PRAEFERENZ_CHOICES %}
|
|
<label class="flex items-center gap-2 text-sm cursor-pointer">
|
|
<input type="radio" name="praeferenz" value="{{ val }}" {% if sub.praeferenz == val %}checked{% endif %}>
|
|
{{ label }}
|
|
</label>
|
|
{% endfor %}
|
|
<div id="begruendung-field" class="mt-2{% if sub.praeferenz != 'gesperrt' %} hidden{% endif %}">
|
|
<label class="form-label">Begründung</label>
|
|
<textarea name="begruendung" class="form-input" rows="2">{{ sub.bewertung }}</textarea>
|
|
</div>
|
|
<button type="submit" class="btn-secondary btn-sm w-full mt-2">Speichern</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
{% if sub.leistungsprofil %}
|
|
<div class="card mb-4">
|
|
<h2 class="section-title mb-2">Leistungsprofil</h2>
|
|
<p class="text-sm text-slate-700 whitespace-pre-line">{{ sub.leistungsprofil }}</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="card">
|
|
<h2 class="section-title mb-3">Ausschreibungs-Zuordnungen</h2>
|
|
{% if zuordnungen %}
|
|
<table class="w-full text-sm">
|
|
<thead>
|
|
<tr class="text-left border-b border-slate-200">
|
|
<th class="pb-2 font-medium text-slate-600">Ausschreibung</th>
|
|
<th class="pb-2 font-medium text-slate-600">Los</th>
|
|
<th class="pb-2 font-medium text-slate-600">Leistung</th>
|
|
<th class="pb-2 font-medium text-slate-600">Zusage</th>
|
|
<th class="pb-2 font-medium text-slate-600">Nachweis</th>
|
|
<th class="pb-2 font-medium text-slate-600">Preis</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for z in zuordnungen %}
|
|
<tr class="border-b border-slate-100">
|
|
<td class="py-2">{{ z.ausschreibung.titel|truncatechars:50 }}</td>
|
|
<td class="py-2">{{ z.los|default:"—" }}</td>
|
|
<td class="py-2 text-slate-600">{{ z.konkrete_leistung|default:"—" }}</td>
|
|
<td class="py-2">{% if z.zusage_vorhanden %}<span class="badge-green">✓</span>{% else %}<span class="text-slate-300">—</span>{% endif %}</td>
|
|
<td class="py-2">{% if z.nachweis_eingegangen %}<span class="badge-green">✓</span>{% else %}<span class="text-slate-300">—</span>{% endif %}</td>
|
|
<td class="py-2">{% if z.preis_vorhanden %}<span class="badge-green">✓</span>{% else %}<span class="text-slate-300">—</span>{% endif %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<p class="text-slate-500 text-sm">Noch keiner Ausschreibung zugeordnet.</p>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock %}
|