Implement modular report system with 6 report types and composer UI
Refactors the Berichte section from a single hardcoded Jahresbericht into a modular report-building system. Jahresbericht now uses PDFGenerator for corporate identity (logo, colors, headers/footers, cover page). 8 reusable section templates can be freely combined. 6 predefined report templates (Jahres-, Destinatär-, Grundstücks-, Finanz-, Förder-, Pachtbericht) with HTML preview and PDF export. New Bericht-Baukasten UI lets users compose custom reports from individual sections. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
109
app/templates/berichte/bericht_modular.html
Normal file
109
app/templates/berichte/bericht_modular.html
Normal file
@@ -0,0 +1,109 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{ bericht_titel }} – {{ corporate_settings.stiftung_name }}</title>
|
||||
<style>
|
||||
{{ css_content }}
|
||||
/* Cover page styles */
|
||||
.cover-page {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 85vh;
|
||||
text-align: center;
|
||||
}
|
||||
.cover-logo-img { max-height: 100px; max-width: 250px; margin-bottom: 30px; }
|
||||
.cover-title h1 {
|
||||
font-size: 24pt;
|
||||
color: {{ corporate_settings.primary_color|default:"#2c3e50" }};
|
||||
margin: 0 0 10px 0;
|
||||
border-bottom: none;
|
||||
}
|
||||
.cover-title h2 {
|
||||
font-size: 18pt;
|
||||
color: {{ corporate_settings.secondary_color|default:"#3498db" }};
|
||||
margin: 0 0 5px 0;
|
||||
}
|
||||
.cover-subtitle { font-size: 12pt; color: #666; }
|
||||
.cover-meta { margin-top: 40px; font-size: 11pt; color: #555; }
|
||||
.cover-meta p { margin: 5px 0; }
|
||||
.cover-footer { margin-top: 60px; font-size: 9pt; color: #999; }
|
||||
.cover-footer p { margin: 3px 0; }
|
||||
.cover-confidential {
|
||||
margin-top: 15px !important;
|
||||
font-weight: bold;
|
||||
color: {{ corporate_settings.primary_color|default:"#2c3e50" }} !important;
|
||||
font-size: 10pt;
|
||||
}
|
||||
/* Bilanz cards */
|
||||
.bilanz-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.bilanz-card { border-radius: 8px; padding: 16px; text-align: center; }
|
||||
.bilanz-card.einnahmen { background: #d4edda; border: 1px solid #c3e6cb; }
|
||||
.bilanz-card.ausgaben { background: #f8d7da; border: 1px solid #f5c6cb; }
|
||||
.bilanz-card.netto-positiv { background: #d1ecf1; border: 1px solid #bee5eb; }
|
||||
.bilanz-card.netto-negativ { background: #fff3cd; border: 1px solid #ffeeba; }
|
||||
.bilanz-card .value { font-size: 1.5em; font-weight: bold; }
|
||||
.bilanz-card .label { font-size: 0.85em; margin-top: 4px; color: #555; }
|
||||
/* Status badges extra */
|
||||
.status-aktiv { background-color: #d4edda; color: #155724; }
|
||||
.status-beendet { background-color: #e2e3e5; color: #383d41; }
|
||||
.status-gekuendigt { background-color: #f8d7da; color: #721c24; }
|
||||
.status-geplant, .status-faellig { background-color: #e2e3e5; color: #383d41; }
|
||||
.status-abgeschlossen { background-color: #d4edda; color: #155724; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{% if show_cover %}
|
||||
{% include "berichte/cover_page.html" %}
|
||||
{% endif %}
|
||||
|
||||
<!-- Kopfzeile (auf jeder Seite nach dem Deckblatt) -->
|
||||
<div class="header">
|
||||
<div class="header-content">
|
||||
<div class="header-left">
|
||||
{% if logo_base64 %}
|
||||
<img src="{{ logo_base64 }}" alt="Logo" class="logo">
|
||||
{% endif %}
|
||||
<p class="stiftung-name">{{ corporate_settings.stiftung_name }}</p>
|
||||
<p class="document-title">{{ bericht_titel }}</p>
|
||||
</div>
|
||||
<div class="header-right">
|
||||
<div class="contact-info">
|
||||
{% if corporate_settings.address_line1 %}<p>{{ corporate_settings.address_line1 }}</p>{% endif %}
|
||||
{% if corporate_settings.address_line2 %}<p>{{ corporate_settings.address_line2 }}</p>{% endif %}
|
||||
{% if corporate_settings.phone %}<p>{{ corporate_settings.phone }}</p>{% endif %}
|
||||
{% if corporate_settings.email %}<p>{{ corporate_settings.email }}</p>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-info">
|
||||
Erstellt am {% now "d.m.Y" %}{% if berichtszeitraum %} · Zeitraum: {{ berichtszeitraum }}{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dynamische Sektionen -->
|
||||
{% for sektion in sektionen %}
|
||||
{% if sektion == "bilanz" %}{% include "berichte/sektionen/bilanz.html" %}
|
||||
{% elif sektion == "unterstuetzungen" %}{% include "berichte/sektionen/unterstuetzungen.html" %}
|
||||
{% elif sektion == "foerderungen" %}{% include "berichte/sektionen/foerderungen.html" %}
|
||||
{% elif sektion == "grundstuecke" %}{% include "berichte/sektionen/grundstuecke.html" %}
|
||||
{% elif sektion == "verwaltungskosten" %}{% include "berichte/sektionen/verwaltungskosten.html" %}
|
||||
{% elif sektion == "destinataere_uebersicht" %}{% include "berichte/sektionen/destinataere_uebersicht.html" %}
|
||||
{% elif sektion == "konten_uebersicht" %}{% include "berichte/sektionen/konten_uebersicht.html" %}
|
||||
{% elif sektion == "verpachtungen" %}{% include "berichte/sektionen/verpachtungen.html" %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<div class="footer">
|
||||
<p>{{ bericht_titel }} — automatisch generiert von der Stiftungsverwaltung</p>
|
||||
<p>{{ corporate_settings.stiftung_name }} · {{ corporate_settings.footer_text }}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
39
app/templates/berichte/cover_page.html
Normal file
39
app/templates/berichte/cover_page.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!-- Deckblatt / Cover Page für Berichte -->
|
||||
<div class="cover-page">
|
||||
<div class="cover-logo">
|
||||
{% if logo_base64 %}
|
||||
<img src="{{ logo_base64 }}" alt="Logo" class="cover-logo-img">
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="cover-title">
|
||||
<h1>{{ corporate_settings.stiftung_name }}</h1>
|
||||
<h2>{{ bericht_titel }}</h2>
|
||||
{% if bericht_untertitel %}
|
||||
<p class="cover-subtitle">{{ bericht_untertitel }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="cover-meta">
|
||||
<p><strong>Berichtszeitraum:</strong> {{ berichtszeitraum }}</p>
|
||||
<p><strong>Erstellt am:</strong> {% now "d.m.Y" %}</p>
|
||||
{% if cover_freitext %}
|
||||
<p>{{ cover_freitext }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="cover-footer">
|
||||
{% if corporate_settings.address_line1 %}
|
||||
<p>{{ corporate_settings.address_line1 }}</p>
|
||||
{% endif %}
|
||||
{% if corporate_settings.address_line2 %}
|
||||
<p>{{ corporate_settings.address_line2 }}</p>
|
||||
{% endif %}
|
||||
{% if corporate_settings.phone or corporate_settings.email %}
|
||||
<p>
|
||||
{% if corporate_settings.phone %}Tel.: {{ corporate_settings.phone }}{% endif %}
|
||||
{% if corporate_settings.phone and corporate_settings.email %} · {% endif %}
|
||||
{% if corporate_settings.email %}{{ corporate_settings.email }}{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p class="cover-confidential">Vertraulich</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="page-break-after: always;"></div>
|
||||
36
app/templates/berichte/sektionen/bilanz.html
Normal file
36
app/templates/berichte/sektionen/bilanz.html
Normal file
@@ -0,0 +1,36 @@
|
||||
<!-- Sektion: Jahresbilanz -->
|
||||
<div class="section">
|
||||
<h2>Jahresbilanz {{ jahr }}</h2>
|
||||
<div class="bilanz-grid">
|
||||
<div class="bilanz-card einnahmen">
|
||||
<div class="value">€{{ total_einnahmen|floatformat:2 }}</div>
|
||||
<div class="label">Einnahmen (Pacht)</div>
|
||||
</div>
|
||||
<div class="bilanz-card ausgaben">
|
||||
<div class="value">€{{ total_ausgaben|floatformat:2 }}</div>
|
||||
<div class="label">Ausgaben gesamt</div>
|
||||
</div>
|
||||
<div class="bilanz-card {% if netto >= 0 %}netto-positiv{% else %}netto-negativ{% endif %}">
|
||||
<div class="value">{% if netto >= 0 %}+{% endif %}€{{ netto|floatformat:2 }}</div>
|
||||
<div class="label">Nettosaldo</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ total_ausgaben_foerderung|floatformat:2 }}</div>
|
||||
<div class="label">Förderausgaben</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ total_verwaltungskosten|floatformat:2 }}</div>
|
||||
<div class="label">Verwaltungskosten</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ pacht_vereinnahmt|floatformat:2 }}</div>
|
||||
<div class="label">Pacht vereinnahmt</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ grundsteuer_gesamt|floatformat:2 }}</div>
|
||||
<div class="label">Grundsteuer</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,46 @@
|
||||
<!-- Sektion: Destinatär-Übersicht -->
|
||||
<div class="section">
|
||||
<h2>Destinatär-Übersicht{% if jahr %} {{ jahr }}{% endif %}</h2>
|
||||
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ destinataere_aktiv }}</div>
|
||||
<div class="label">Aktive Destinatäre</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ destinataere_gesamt }}</div>
|
||||
<div class="label">Gesamt</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ destinataere_total_unterstuetzung|floatformat:2 }}</div>
|
||||
<div class="label">Gesamte Unterstützungen</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if destinataere_liste %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Ort</th>
|
||||
<th>Berufsgruppe</th>
|
||||
<th>Aktiv</th>
|
||||
<th>Unterstützungen</th>
|
||||
<th>Betrag gesamt</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for d in destinataere_liste %}
|
||||
<tr>
|
||||
<td>{{ d.get_full_name }}</td>
|
||||
<td>{{ d.ort|default:"-" }}</td>
|
||||
<td>{{ d.get_berufsgruppe_display|default:"-" }}</td>
|
||||
<td>{% if d.aktiv %}Ja{% else %}Nein{% endif %}</td>
|
||||
<td>{{ d.unterstuetzung_count }}</td>
|
||||
<td class="amount">€{{ d.unterstuetzung_summe|floatformat:2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
41
app/templates/berichte/sektionen/foerderungen.html
Normal file
41
app/templates/berichte/sektionen/foerderungen.html
Normal file
@@ -0,0 +1,41 @@
|
||||
<!-- Sektion: Förderungen (Legacy) -->
|
||||
{% if foerderungen %}
|
||||
<div class="section">
|
||||
<h2>Förderungen {{ jahr }}</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Begünstigter</th>
|
||||
<th>Kategorie</th>
|
||||
<th>Betrag</th>
|
||||
<th>Status</th>
|
||||
<th>Antragsdatum</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for f in foerderungen %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if f.destinataer %}{{ f.destinataer.get_full_name }}
|
||||
{% elif f.person %}{{ f.person.get_full_name }}
|
||||
{% else %}–{% endif %}
|
||||
</td>
|
||||
<td>{{ f.get_kategorie_display }}</td>
|
||||
<td class="amount">€{{ f.betrag|floatformat:2 }}</td>
|
||||
<td>
|
||||
<span class="status-badge status-{{ f.status }}">{{ f.get_status_display }}</span>
|
||||
</td>
|
||||
<td>{{ f.antragsdatum|date:"d.m.Y" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td colspan="2">Summe</td>
|
||||
<td class="amount">€{{ total_foerderungen_legacy|floatformat:2 }}</td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
76
app/templates/berichte/sektionen/grundstuecke.html
Normal file
76
app/templates/berichte/sektionen/grundstuecke.html
Normal file
@@ -0,0 +1,76 @@
|
||||
<!-- Sektion: Grundstücksverwaltung -->
|
||||
<div class="section">
|
||||
<h2>Grundstücksverwaltung</h2>
|
||||
|
||||
{% if verpachtungen %}
|
||||
<h3>Aktive Verpachtungen</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Länderei</th>
|
||||
<th>Pächter</th>
|
||||
<th>Verpachtete Fläche</th>
|
||||
<th>Jahrespachtzins</th>
|
||||
<th>Pachtende</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for v in verpachtungen %}
|
||||
<tr>
|
||||
<td>{{ v.land }}</td>
|
||||
<td>{{ v.paechter.get_full_name }}</td>
|
||||
<td class="amount">{{ v.verpachtete_flaeche|floatformat:0 }} qm</td>
|
||||
<td class="amount">€{{ v.pachtzins_pauschal|floatformat:2 }}</td>
|
||||
<td>{% if v.pachtende %}{{ v.pachtende|date:"d.m.Y" }}{% else %}unbefristet{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td colspan="3">Gesamtpachtzins (kalkuliert)</td>
|
||||
<td class="amount">€{{ total_pachtzins|floatformat:2 }}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% if landabrechnungen %}
|
||||
<h3>Landabrechnungen {{ jahr }}</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Länderei</th>
|
||||
<th>Pacht vereinnahmt</th>
|
||||
<th>Umlagen</th>
|
||||
<th>Grundsteuer</th>
|
||||
<th>Sonstige Einnahmen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for a in landabrechnungen %}
|
||||
<tr>
|
||||
<td>{{ a.land }}</td>
|
||||
<td class="amount">€{{ a.pacht_vereinnahmt|floatformat:2 }}</td>
|
||||
<td class="amount">€{{ a.umlagen_vereinnahmt|floatformat:2 }}</td>
|
||||
<td class="amount">€{{ a.grundsteuer_betrag|floatformat:2 }}</td>
|
||||
<td class="amount">€{{ a.sonstige_einnahmen|floatformat:2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td>Summe</td>
|
||||
<td class="amount">€{{ pacht_vereinnahmt|floatformat:2 }}</td>
|
||||
<td></td>
|
||||
<td class="amount">€{{ grundsteuer_gesamt|floatformat:2 }}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% if not verpachtungen and not landabrechnungen %}
|
||||
<p style="color: #999;">Keine Verpachtungs- oder Abrechnungsdaten für {{ jahr }} vorhanden.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
46
app/templates/berichte/sektionen/konten_uebersicht.html
Normal file
46
app/templates/berichte/sektionen/konten_uebersicht.html
Normal file
@@ -0,0 +1,46 @@
|
||||
<!-- Sektion: Konten-Übersicht -->
|
||||
<div class="section">
|
||||
<h2>Kontenübersicht</h2>
|
||||
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ konten_anzahl }}</div>
|
||||
<div class="label">Aktive Konten</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ konten_gesamtsaldo|floatformat:2 }}</div>
|
||||
<div class="label">Gesamtsaldo</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if konten_liste %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kontoname</th>
|
||||
<th>Bank</th>
|
||||
<th>Kontotyp</th>
|
||||
<th>IBAN</th>
|
||||
<th>Saldo</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for k in konten_liste %}
|
||||
<tr>
|
||||
<td>{{ k.kontoname }}</td>
|
||||
<td>{{ k.bank_name }}</td>
|
||||
<td>{{ k.get_konto_typ_display }}</td>
|
||||
<td>{{ k.iban|default:"-" }}</td>
|
||||
<td class="amount">€{{ k.saldo|floatformat:2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td colspan="4">Gesamtsaldo</td>
|
||||
<td class="amount">€{{ konten_gesamtsaldo|floatformat:2 }}</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
41
app/templates/berichte/sektionen/unterstuetzungen.html
Normal file
41
app/templates/berichte/sektionen/unterstuetzungen.html
Normal file
@@ -0,0 +1,41 @@
|
||||
<!-- Sektion: Unterstützungszahlungen -->
|
||||
{% if unterstuetzungen %}
|
||||
<div class="section">
|
||||
<h2>Unterstützungszahlungen {{ jahr }}</h2>
|
||||
<p style="color: #666; margin-bottom: 12px;">
|
||||
{{ unterstuetzungen.count }} Unterstützung(en) geplant/ausgezahlt ·
|
||||
{{ unterstuetzungen_ausgezahlt.count }} überwiesen (€{{ total_unterstuetzungen|floatformat:2 }})
|
||||
</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Destinatär</th>
|
||||
<th>Betrag</th>
|
||||
<th>Fällig am</th>
|
||||
<th>Status</th>
|
||||
<th>Verwendungszweck</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for u in unterstuetzungen %}
|
||||
<tr>
|
||||
<td>{{ u.destinataer.get_full_name }}</td>
|
||||
<td class="amount">€{{ u.betrag|floatformat:2 }}</td>
|
||||
<td>{{ u.faellig_am|date:"d.m.Y" }}</td>
|
||||
<td>
|
||||
<span class="status-badge status-{{ u.status }}">{{ u.get_status_display }}</span>
|
||||
</td>
|
||||
<td>{{ u.beschreibung|default:"-" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td>Summe ausgezahlt</td>
|
||||
<td class="amount">€{{ total_unterstuetzungen|floatformat:2 }}</td>
|
||||
<td colspan="3"></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
88
app/templates/berichte/sektionen/verpachtungen.html
Normal file
88
app/templates/berichte/sektionen/verpachtungen.html
Normal file
@@ -0,0 +1,88 @@
|
||||
<!-- Sektion: Pachtbericht -->
|
||||
<div class="section">
|
||||
<h2>Pachtbericht{% if jahr %} {{ jahr }}{% endif %}</h2>
|
||||
|
||||
{% if pacht_statistik %}
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ pacht_statistik.aktive_vertraege }}</div>
|
||||
<div class="label">Aktive Pachtverträge</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">€{{ pacht_statistik.total_pachtzins|floatformat:2 }}</div>
|
||||
<div class="label">Gesamtpachtzins p.a.</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ pacht_statistik.total_flaeche|floatformat:0 }} qm</div>
|
||||
<div class="label">Verpachtete Fläche</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="value">{{ pacht_statistik.auslaufend_12m }}</div>
|
||||
<div class="label">Laufen in 12 Mon. aus</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pacht_auslaufend %}
|
||||
<h3>Auslaufende Verträge (nächste 12 Monate)</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Länderei</th>
|
||||
<th>Pächter</th>
|
||||
<th>Pachtende</th>
|
||||
<th>Pachtzins</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for v in pacht_auslaufend %}
|
||||
<tr>
|
||||
<td>{{ v.land }}</td>
|
||||
<td>{{ v.paechter.get_full_name }}</td>
|
||||
<td>{{ v.pachtende|date:"d.m.Y" }}</td>
|
||||
<td class="amount">€{{ v.pachtzins_pauschal|floatformat:2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% if verpachtungen %}
|
||||
<h3>Alle Verpachtungen</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Länderei</th>
|
||||
<th>Pächter</th>
|
||||
<th>Fläche</th>
|
||||
<th>Pachtzins</th>
|
||||
<th>Beginn</th>
|
||||
<th>Ende</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for v in verpachtungen %}
|
||||
<tr>
|
||||
<td>{{ v.land }}</td>
|
||||
<td>{{ v.paechter.get_full_name }}</td>
|
||||
<td class="amount">{{ v.verpachtete_flaeche|floatformat:0 }} qm</td>
|
||||
<td class="amount">€{{ v.pachtzins_pauschal|floatformat:2 }}</td>
|
||||
<td>{{ v.pachtbeginn|date:"d.m.Y" }}</td>
|
||||
<td>{% if v.pachtende %}{{ v.pachtende|date:"d.m.Y" }}{% else %}unbefristet{% endif %}</td>
|
||||
<td>
|
||||
<span class="status-badge status-{{ v.status }}">{{ v.get_status_display }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td colspan="3">Gesamtpachtzins</td>
|
||||
<td class="amount">€{{ total_pachtzins|floatformat:2 }}</td>
|
||||
<td colspan="3"></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
30
app/templates/berichte/sektionen/verwaltungskosten.html
Normal file
30
app/templates/berichte/sektionen/verwaltungskosten.html
Normal file
@@ -0,0 +1,30 @@
|
||||
<!-- Sektion: Verwaltungskosten -->
|
||||
{% if verwaltungskosten_nach_kategorie %}
|
||||
<div class="section">
|
||||
<h2>Verwaltungskosten {{ jahr }}</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Kategorie</th>
|
||||
<th>Anzahl</th>
|
||||
<th>Betrag</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for k in verwaltungskosten_nach_kategorie %}
|
||||
<tr>
|
||||
<td>{{ k.kategorie|capfirst }}</td>
|
||||
<td>{{ k.anzahl }}</td>
|
||||
<td class="amount">€{{ k.summe|floatformat:2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="font-weight: bold; background: #f0f7f4;">
|
||||
<td colspan="2">Gesamt</td>
|
||||
<td class="amount">€{{ total_verwaltungskosten|floatformat:2 }}</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
Reference in New Issue
Block a user