fix: configure CI database connection properly
- Add dotenv loading to Django settings - Update CI workflow to use correct environment variables - Set POSTGRES_* variables instead of DATABASE_URL - Add environment variables to all Django management commands - Fixes CI test failures due to database connection issues
This commit is contained in:
@@ -292,10 +292,32 @@
|
||||
<i class="fas fa-tachometer-alt me-1"></i>Dashboard
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'stiftung:destinataer_list' %}">
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="destinataereDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fas fa-users me-1"></i>Destinatäre
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="destinataereDropdown">
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:destinataer_list' %}">
|
||||
<i class="fas fa-list me-2"></i>Alle Destinatäre
|
||||
</a></li>
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:destinataer_create' %}">
|
||||
<i class="fas fa-plus me-2"></i>Neuer Destinatär
|
||||
</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:foerderung_list' %}">
|
||||
<i class="fas fa-gift me-2"></i>Alle Förderungen
|
||||
</a></li>
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:foerderung_create' %}">
|
||||
<i class="fas fa-plus me-2"></i>Neue Förderung
|
||||
</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:unterstuetzungen_all' %}">
|
||||
<i class="fas fa-hand-holding-usd me-2"></i>Alle Unterstützungen
|
||||
</a></li>
|
||||
<li><a class="dropdown-item" href="{% url 'stiftung:unterstuetzung_create' %}">
|
||||
<i class="fas fa-plus me-2"></i>Neue Unterstützung
|
||||
</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="laendereiDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
|
||||
66
app/templates/pdf/base.html
Normal file
66
app/templates/pdf/base.html
Normal file
@@ -0,0 +1,66 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{ title }} - {{ corporate_settings.stiftung_name }}</title>
|
||||
<style>
|
||||
{{ css_content|safe }}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Header Section -->
|
||||
<div class="header">
|
||||
<div class="header-content">
|
||||
<div class="header-left">
|
||||
{% if logo_base64 %}
|
||||
<img src="{{ logo_base64 }}" alt="{{ corporate_settings.stiftung_name }} Logo" class="logo">
|
||||
{% endif %}
|
||||
<h1 class="stiftung-name">{{ corporate_settings.stiftung_name }}</h1>
|
||||
<div class="document-title">{{ title }}</div>
|
||||
<div class="header-info">
|
||||
Erstellt am: {{ generation_date|date:"d.m.Y H:i" }}
|
||||
{% if generated_by %} | Erstellt von: {{ generated_by }}{% endif %}
|
||||
{% if total_count %} | Anzahl Einträge: {{ total_count }}{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if corporate_settings.address_line1 or corporate_settings.phone or corporate_settings.email %}
|
||||
<div class="header-right">
|
||||
<div class="contact-info">
|
||||
{% if corporate_settings.address_line1 %}
|
||||
{{ corporate_settings.address_line1 }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.address_line2 %}
|
||||
{{ corporate_settings.address_line2 }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.phone %}
|
||||
Tel: {{ corporate_settings.phone }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.email %}
|
||||
E-Mail: {{ corporate_settings.email }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.website %}
|
||||
Web: {{ corporate_settings.website }}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content Section -->
|
||||
<div class="content">
|
||||
{% block content %}
|
||||
<!-- Content will be injected here -->
|
||||
{% endblock %}
|
||||
</div>
|
||||
|
||||
<!-- Footer Section -->
|
||||
<div class="footer">
|
||||
{% if corporate_settings.footer_text %}
|
||||
<p>{{ corporate_settings.footer_text }}</p>
|
||||
{% endif %}
|
||||
<p>{{ corporate_settings.stiftung_name }} | Generiert am {{ generation_date|date:"d.m.Y H:i" }}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
272
app/templates/pdf/data_list.html
Normal file
272
app/templates/pdf/data_list.html
Normal file
@@ -0,0 +1,272 @@
|
||||
{% load pdf_tags %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{ title }} - {{ corporate_settings.stiftung_name }}</title>
|
||||
<style>
|
||||
@page {
|
||||
size: A4;
|
||||
margin: 2cm 1.5cm 2cm 1.5cm;
|
||||
@bottom-center {
|
||||
content: "Seite " counter(page) " von " counter(pages);
|
||||
font-size: 10pt;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', 'DejaVu Sans', Arial, sans-serif;
|
||||
font-size: 10pt;
|
||||
line-height: 1.4;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.header {
|
||||
border-bottom: 2px solid {{ corporate_settings.primary_color|default:"#2c3e50" }};
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 25px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.header-content {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.header-left {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.header-right {
|
||||
text-align: right;
|
||||
flex-shrink: 0;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.logo {
|
||||
max-height: 60px;
|
||||
max-width: 150px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.stiftung-name {
|
||||
font-size: 20pt;
|
||||
font-weight: bold;
|
||||
color: {{ corporate_settings.primary_color|default:"#2c3e50" }};
|
||||
margin: 0;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.document-title {
|
||||
font-size: 16pt;
|
||||
color: {{ corporate_settings.secondary_color|default:"#3498db" }};
|
||||
margin: 5px 0 0 0;
|
||||
}
|
||||
|
||||
.header-info {
|
||||
font-size: 9pt;
|
||||
color: #666;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.contact-info {
|
||||
font-size: 8pt;
|
||||
color: #666;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
color: {{ corporate_settings.primary_color|default:"#2c3e50" }};
|
||||
page-break-inside: avoid;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 14pt;
|
||||
margin: 20px 0 15px 0;
|
||||
border-bottom: 1px solid {{ corporate_settings.secondary_color|default:"#3498db" }};
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 12pt;
|
||||
margin: 15px 0 10px 0;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 10px 0;
|
||||
page-break-inside: avoid;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
th, td {
|
||||
border: 1px solid #ddd;
|
||||
padding: 4px 6px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #f8f9fa;
|
||||
font-weight: 600;
|
||||
color: {{ corporate_settings.primary_color|default:"#2c3e50" }};
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.amount {
|
||||
text-align: right;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
padding: 2px 4px;
|
||||
border-radius: 3px;
|
||||
font-size: 7pt;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.status-beantragt { background-color: #fff3cd; color: #856404; }
|
||||
.status-genehmigt { background-color: #d1ecf1; color: #0c5460; }
|
||||
.status-ausgezahlt { background-color: #d4edda; color: #155724; }
|
||||
.status-abgelehnt { background-color: #f8d7da; color: #721c24; }
|
||||
.status-storniert { background-color: #e2e3e5; color: #383d41; }
|
||||
|
||||
.footer {
|
||||
margin-top: 30px;
|
||||
padding-top: 15px;
|
||||
border-top: 1px solid #ddd;
|
||||
font-size: 8pt;
|
||||
color: #666;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stats-summary {
|
||||
background-color: #f8f9fa;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
padding: 10px;
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 20px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Header Section -->
|
||||
<div class="header">
|
||||
<div class="header-content">
|
||||
<div class="header-left">
|
||||
{% if logo_base64 %}
|
||||
<img src="{{ logo_base64 }}" alt="{{ corporate_settings.stiftung_name }} Logo" class="logo">
|
||||
{% endif %}
|
||||
<h1 class="stiftung-name">{{ corporate_settings.stiftung_name }}</h1>
|
||||
<div class="document-title">{{ title }}</div>
|
||||
<div class="header-info">
|
||||
Erstellt am: {{ generation_date|date:"d.m.Y H:i" }}
|
||||
{% if generated_by %} | Erstellt von: {{ generated_by }}{% endif %}
|
||||
{% if total_count %} | Anzahl Einträge: {{ total_count }}{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if corporate_settings.address_line1 or corporate_settings.phone or corporate_settings.email %}
|
||||
<div class="header-right">
|
||||
<div class="contact-info">
|
||||
{% if corporate_settings.address_line1 %}
|
||||
{{ corporate_settings.address_line1 }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.address_line2 %}
|
||||
{{ corporate_settings.address_line2 }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.phone %}
|
||||
Tel: {{ corporate_settings.phone }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.email %}
|
||||
E-Mail: {{ corporate_settings.email }}<br>
|
||||
{% endif %}
|
||||
{% if corporate_settings.website %}
|
||||
Web: {{ corporate_settings.website }}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Summary Section -->
|
||||
{% if total_count %}
|
||||
<div class="stats-summary">
|
||||
<strong>Zusammenfassung:</strong> {{ total_count }} Eintrag{{ total_count|pluralize:"e" }} exportiert
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Data Table -->
|
||||
{% if data %}
|
||||
<div class="section">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
{% for field_key, field_display in fields_config.items %}
|
||||
<th>{{ field_display }}</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in data %}
|
||||
<tr>
|
||||
{% for field_key, field_display in fields_config.items %}
|
||||
<td>
|
||||
{% if field_key == 'betrag' or field_key == 'pachtzins' or 'betrag' in field_key %}
|
||||
<span class="amount">
|
||||
{% if item|lookup:field_key %}€{{ item|lookup:field_key|floatformat:2 }}{% else %}-{% endif %}
|
||||
</span>
|
||||
{% elif field_key == 'status' %}
|
||||
{% with status_value=item|lookup:field_key %}
|
||||
{% if status_value %}
|
||||
<span class="status-badge status-{{ status_value }}">{{ status_value|capfirst }}</span>
|
||||
{% else %}-{% endif %}
|
||||
{% endwith %}
|
||||
{% elif field_key|slice:"-5:" == '_date' or field_key|slice:"-6:" == '_datum' or 'datum' in field_key or 'date' in field_key %}
|
||||
{% with date_value=item|lookup:field_key %}
|
||||
{% if date_value %}{{ date_value|date:"d.m.Y" }}{% else %}-{% endif %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{% with field_value=item|lookup:field_key %}
|
||||
{{ field_value|default:"-"|truncatechars:50 }}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="section">
|
||||
<p><em>Keine Daten zum Anzeigen verfügbar.</em></p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Footer Section -->
|
||||
<div class="footer">
|
||||
{% if corporate_settings.footer_text %}
|
||||
<p>{{ corporate_settings.footer_text }}</p>
|
||||
{% endif %}
|
||||
<p>{{ corporate_settings.stiftung_name }} | Generiert am {{ generation_date|date:"d.m.Y H:i" }}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -211,6 +211,12 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:app_settings' %}" class="btn btn-outline-primary w-100">
|
||||
<i class="fas fa-cogs d-block mb-2 fa-2x"></i>
|
||||
<span>App Settings</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:audit_log_list' %}" class="btn btn-outline-primary w-100">
|
||||
<i class="fas fa-history d-block mb-2 fa-2x"></i>
|
||||
|
||||
148
app/templates/stiftung/app_settings.html
Normal file
148
app/templates/stiftung/app_settings.html
Normal file
@@ -0,0 +1,148 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h3 class="card-title">
|
||||
<i class="fas fa-cogs"></i>
|
||||
{{ title }}
|
||||
</h3>
|
||||
<a href="{% url 'stiftung:administration' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left"></i>
|
||||
Back to Administration
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<form method="post" class="settings-form">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for category_name, settings in categories.items %}
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-{% if category_name == 'Paperless Integration' %}file-alt{% elif category_name == 'System' %}cog{% elif category_name == 'Database' %}database{% else %}folder{% endif %}"></i>
|
||||
{{ category_name }}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
{% for setting in settings %}
|
||||
<div class="col-md-6 mb-3">
|
||||
<div class="form-group">
|
||||
<label for="setting_{{ setting.key }}" class="form-label">
|
||||
<strong>{{ setting.display_name }}</strong>
|
||||
{% if setting.is_system %}
|
||||
<span class="badge badge-secondary ml-1">System</span>
|
||||
{% endif %}
|
||||
</label>
|
||||
|
||||
{% if setting.description %}
|
||||
<small class="form-text text-muted">{{ setting.description }}</small>
|
||||
{% endif %}
|
||||
|
||||
{% if setting.setting_type == 'boolean' %}
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
class="form-check-input"
|
||||
id="setting_{{ setting.key }}"
|
||||
name="setting_{{ setting.key }}"
|
||||
value="True"
|
||||
{% if setting.get_typed_value %}checked{% endif %}
|
||||
{% if setting.is_system %}disabled{% endif %}>
|
||||
<label class="form-check-label" for="setting_{{ setting.key }}">
|
||||
Enabled
|
||||
</label>
|
||||
</div>
|
||||
{% if not setting.get_typed_value %}
|
||||
<input type="hidden" name="setting_{{ setting.key }}" value="False">
|
||||
{% endif %}
|
||||
{% elif setting.setting_type == 'integer' %}
|
||||
<input type="number"
|
||||
class="form-control"
|
||||
id="setting_{{ setting.key }}"
|
||||
name="setting_{{ setting.key }}"
|
||||
value="{{ setting.get_typed_value }}"
|
||||
{% if setting.is_system %}readonly{% endif %}>
|
||||
{% elif setting.setting_type == 'text' or setting.setting_type == 'url' %}
|
||||
<input type="{% if setting.setting_type == 'url' %}url{% else %}text{% endif %}"
|
||||
class="form-control"
|
||||
id="setting_{{ setting.key }}"
|
||||
name="setting_{{ setting.key }}"
|
||||
value="{{ setting.value }}"
|
||||
{% if setting.is_system %}readonly{% endif %}>
|
||||
{% else %}
|
||||
<textarea class="form-control"
|
||||
id="setting_{{ setting.key }}"
|
||||
name="setting_{{ setting.key }}"
|
||||
rows="3"
|
||||
{% if setting.is_system %}readonly{% endif %}>{{ setting.value }}</textarea>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
No configuration settings are available.
|
||||
<a href="{% url 'stiftung:administration' %}" class="alert-link">Initialize settings first</a>.
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{% if categories %}
|
||||
<div class="text-right mt-4">
|
||||
<button type="button" class="btn btn-secondary mr-2" onclick="window.history.back()">
|
||||
<i class="fas fa-times"></i>
|
||||
Cancel
|
||||
</button>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-save"></i>
|
||||
Save Settings
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.settings-form .card {
|
||||
border-left: 4px solid #007bff;
|
||||
}
|
||||
|
||||
.settings-form .card-header {
|
||||
background-color: #f8f9fa;
|
||||
border-bottom: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.settings-form .form-group label {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.settings-form .badge {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
.settings-form input[readonly],
|
||||
.settings-form textarea[readonly] {
|
||||
background-color: #f8f9fa;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.settings-form .form-check {
|
||||
padding-top: 0.375rem;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
@@ -15,30 +15,6 @@
|
||||
|
||||
<!-- Statistics Cards -->
|
||||
<div class="row mb-4">
|
||||
<!-- Person Statistics -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-primary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
|
||||
Personen
|
||||
</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">
|
||||
{{ total_persons }}
|
||||
</div>
|
||||
<div class="text-xs text-muted">
|
||||
{{ active_persons }} aktiv
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="fas fa-users fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Land Statistics -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
@@ -129,12 +105,7 @@
|
||||
<span>Neue Förderung</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:verpachtung_create' %}" class="btn btn-outline-success w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-handshake fa-2x mb-2"></i>
|
||||
<span>Neue Verpachtung</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- Removed generic "Neue Verpachtung" - now created via specific Land pages -->
|
||||
<div class="col-md-3 mb-3">
|
||||
<a href="{% url 'stiftung:bericht_list' %}" class="btn btn-outline-info w-100 h-100 d-flex flex-column align-items-center justify-content-center p-3">
|
||||
<i class="fas fa-chart-bar fa-2x mb-2"></i>
|
||||
@@ -364,15 +335,15 @@
|
||||
€{{ verpachtung.pachtzins_jaehrlich|floatformat:0 }}/Jahr
|
||||
</small>
|
||||
</div>
|
||||
<a href="{% url 'stiftung:verpachtung_detail' verpachtung.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' verpachtung.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-sm btn-primary">
|
||||
Alle Verpachtungen anzeigen
|
||||
<a href="{% url 'stiftung:land_list' %}" class="btn btn-sm btn-primary">
|
||||
Ländereien verwalten
|
||||
</a>
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
Destinatär: {{ destinataer.get_full_name }}
|
||||
</h1>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:foerderung_create' %}?destinataer={{ destinataer.pk }}" class="btn btn-success me-2">
|
||||
<i class="fas fa-gift me-2"></i>Neue Förderung
|
||||
</a>
|
||||
<a href="{% url 'stiftung:destinataer_update' pk=destinataer.pk %}" class="btn btn-warning me-2">
|
||||
<i class="fas fa-edit me-2"></i>Bearbeiten
|
||||
</a>
|
||||
@@ -263,6 +266,64 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Unterstützungen -->
|
||||
{% if unterstuetzungen %}
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-info text-white">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-hand-holding-usd me-2"></i>Unterstützungen ({{ unterstuetzungen.count }})
|
||||
</h5>
|
||||
<a href="{% url 'stiftung:unterstuetzung_create' %}?destinataer={{ destinataer.pk }}"
|
||||
class="btn btn-light btn-sm">
|
||||
<i class="fas fa-plus me-1"></i>Neue Unterstützung
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Fällig am</th>
|
||||
<th>Betrag</th>
|
||||
<th>Status</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for unterstuetzung in unterstuetzungen %}
|
||||
<tr>
|
||||
<td>{{ unterstuetzung.faellig_am|date:"d.m.Y" }}</td>
|
||||
<td><span class="text-success fw-bold">€{{ unterstuetzung.betrag|floatformat:2 }}</span></td>
|
||||
<td>
|
||||
{% if unterstuetzung.status == 'ausgezahlt' %}
|
||||
<span class="badge bg-success">Ausgezahlt</span>
|
||||
{% elif unterstuetzung.status == 'in_bearbeitung' %}
|
||||
<span class="badge bg-warning">In Bearbeitung</span>
|
||||
{% elif unterstuetzung.status == 'geplant' %}
|
||||
<span class="badge bg-secondary">Geplant</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ unterstuetzung.beschreibung|truncatechars:40 }}</td>
|
||||
<td>
|
||||
<a href="{% url 'stiftung:unterstuetzung_detail' pk=unterstuetzung.pk %}"
|
||||
class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Verknüpfte Dokumente -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load help_tags %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
@@ -420,22 +421,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<!-- Sidebar mit Hilfe -->
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>Hilfe
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="small">
|
||||
<p><strong>Voraussetzungen für Unterstützung</strong></p>
|
||||
<p>Die Stiftung kann grundsätzlich laufende Leistungen nur an Abkömmlinge der Geschwister des Stifters Hendrik van Hees und seiner Ehefrau oder im Einzelfall an weitere Personen erbringen, die als Alleinstehende(r) oder Haushaltsvorstand keine höheren Bezüge als 2.245,00 € (5× Regelsatz 563,00 €) haben und deren Vermögen 15.500 € nicht übersteigt (§53 AO). Die Sätze erhöhen sich bei weiteren Haushaltsangehörigen.</p>
|
||||
<p class="text-muted">Dieser Text ist redaktionell anpassbar (Template).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% help_box 'destinataer_new' user %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -78,6 +78,8 @@
|
||||
<option value="land">Ländereien</option>
|
||||
<option value="paechter">Pächter</option>
|
||||
<option value="verpachtung">Verpachtungen</option>
|
||||
<option value="foerderung">Förderungen</option>
|
||||
<option value="abrechnung">Abrechnungen</option>
|
||||
<option value="rentmeister">Rentmeister</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -253,7 +255,11 @@ function renderDocuments() {
|
||||
} else if (link.link_type === 'paechter') {
|
||||
detailUrl = `/paechter/${obj.id}/`;
|
||||
} else if (link.link_type === 'verpachtung') {
|
||||
detailUrl = `/verpachtungen/${obj.id}/`;
|
||||
detailUrl = `/laendereien/verpachtungen/${obj.id}/`;
|
||||
} else if (link.link_type === 'foerderung') {
|
||||
detailUrl = `/foerderungen/${obj.id}/`;
|
||||
} else if (link.link_type === 'abrechnung') {
|
||||
detailUrl = `/laendereien/abrechnungen/${obj.id}/`;
|
||||
} else if (link.link_type === 'rentmeister') {
|
||||
detailUrl = `/geschaeftsfuehrung/rentmeister/${obj.id}/`;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,16 @@
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Warnung!
|
||||
</h5>
|
||||
<p class="mb-0">
|
||||
Sind Sie sicher, dass Sie die Förderung für <strong>{{ foerderung.person.get_full_name }}</strong>
|
||||
Sind Sie sicher, dass Sie die Förderung für
|
||||
<strong>
|
||||
{% if foerderung.destinataer %}
|
||||
{{ foerderung.destinataer.get_full_name }}
|
||||
{% elif foerderung.person %}
|
||||
{{ foerderung.person.get_full_name }} (Legacy)
|
||||
{% else %}
|
||||
Unbekannter Empfänger
|
||||
{% endif %}
|
||||
</strong>
|
||||
({{ foerderung.jahr }}, €{{ foerderung.betrag|floatformat:2 }}) löschen möchten?
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -26,9 +26,13 @@
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-primary">Person</h6>
|
||||
<p class="mb-3">
|
||||
{% if foerderung.destinataer %}
|
||||
<a href="{% url 'stiftung:destinataer_detail' foerderung.destinataer.pk %}">
|
||||
{{ foerderung.person.get_full_name }}
|
||||
{{ foerderung.destinataer.get_full_name }}
|
||||
</a>
|
||||
{% else %}
|
||||
<em class="text-muted">Keine Person zugeordnet</em>
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
<h6 class="text-primary">Jahr</h6>
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load help_tags %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 mx-auto">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header">
|
||||
<h4 class="mb-0">
|
||||
@@ -19,13 +20,13 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="{{ form.person.id_for_label }}" class="form-label">
|
||||
{{ form.person.label }} *
|
||||
<label for="{{ form.destinataer.id_for_label }}" class="form-label">
|
||||
{{ form.destinataer.label }} *
|
||||
</label>
|
||||
{{ form.person }}
|
||||
{% if form.person.errors %}
|
||||
{{ form.destinataer }}
|
||||
{% if form.destinataer.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.person.errors.0 }}
|
||||
{{ form.destinataer.errors.0 }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -121,6 +122,9 @@
|
||||
{{ form.verwendungsnachweis.errors.0 }}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="form-text">
|
||||
Optionale Verknüpfung zu einem Dokument aus dem Paperless-System
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -148,6 +152,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar mit Hilfe -->
|
||||
<div class="col-lg-4">
|
||||
{% help_box 'foerderung_new' user %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -9,11 +9,173 @@
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-gift text-primary me-2"></i>Förderungen
|
||||
</h1>
|
||||
<a href="{% url 'stiftung:foerderung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i> Neue Förderung
|
||||
</a>
|
||||
<div>
|
||||
<button type="button" class="btn btn-success me-2" data-bs-toggle="modal" data-bs-target="#exportModal">
|
||||
<i class="fas fa-download me-2"></i> CSV/PDF Export
|
||||
</button>
|
||||
<a href="{% url 'stiftung:foerderung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i> Neue Förderung
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Export Modal -->
|
||||
<div class="modal fade" id="exportModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Export Optionen</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<form id="exportForm" method="post" action="{% url 'stiftung:foerderung_list' %}">
|
||||
{% csrf_token %}
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6 class="fw-bold">Export Format</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_csv" value="csv" checked>
|
||||
<label class="form-check-label" for="format_csv">
|
||||
<i class="fas fa-file-csv me-2"></i>CSV (Excel-kompatibel)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_pdf" value="pdf">
|
||||
<label class="form-check-label" for="format_pdf">
|
||||
<i class="fas fa-file-pdf me-2"></i>PDF (Tabelle)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h6 class="fw-bold">Export Umfang</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_all" value="all" checked>
|
||||
<label class="form-check-label" for="scope_all">
|
||||
Alle Einträge (<span id="total-count">{{ foerderungen.count }}</span>)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_selected" value="selected">
|
||||
<label class="form-check-label" for="scope_selected">
|
||||
Nur ausgewählte Einträge (<span id="selected-count">0</span>)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6" id="field-selection" style="max-height: 400px; overflow-y: auto;">
|
||||
<h6 class="fw-bold">Felder auswählen</h6>
|
||||
<div class="mb-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary me-2" onclick="selectAllFields()">Alle auswählen</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="selectDefaultFields()">Standard</button>
|
||||
</div>
|
||||
|
||||
<div class="field-groups">
|
||||
<!-- Kernfelder -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-muted mb-2">Kernfelder</h6>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="destinataer_name" id="field_destinataer_name" checked>
|
||||
<label class="form-check-label" for="field_destinataer_name">Destinatär Name</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="jahr" id="field_jahr" checked>
|
||||
<label class="form-check-label" for="field_jahr">Jahr</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="betrag" id="field_betrag" checked>
|
||||
<label class="form-check-label" for="field_betrag">Betrag (€)</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="kategorie" id="field_kategorie" checked>
|
||||
<label class="form-check-label" for="field_kategorie">Kategorie</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="status" id="field_status" checked>
|
||||
<label class="form-check-label" for="field_status">Status</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="antragsdatum" id="field_antragsdatum" checked>
|
||||
<label class="form-check-label" for="field_antragsdatum">Antragsdatum</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Zeitfelder -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-muted mb-2">Datumsfelder</h6>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="bewilligungsdatum" id="field_bewilligungsdatum">
|
||||
<label class="form-check-label" for="field_bewilligungsdatum">Bewilligungsdatum</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="auszahlungsdatum" id="field_auszahlungsdatum">
|
||||
<label class="form-check-label" for="field_auszahlungsdatum">Auszahlungsdatum</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="erstellt_am" id="field_erstellt_am">
|
||||
<label class="form-check-label" for="field_erstellt_am">Erstellt am</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Beschreibungsfelder -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-muted mb-2">Details</h6>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="beschreibung" id="field_beschreibung" checked>
|
||||
<label class="form-check-label" for="field_beschreibung">Beschreibung</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="begruendung" id="field_begruendung">
|
||||
<label class="form-check-label" for="field_begruendung">Begründung</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="verwendungsnachweis_status" id="field_verwendungsnachweis_status">
|
||||
<label class="form-check-label" for="field_verwendungsnachweis_status">Verwendungsnachweis Status</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Destinataer Details -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-muted mb-2">Destinatär Details</h6>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="familienzweig" id="field_familienzweig">
|
||||
<label class="form-check-label" for="field_familienzweig">Familienzweig</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="email" id="field_email">
|
||||
<label class="form-check-label" for="field_email">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="telefon" id="field_telefon">
|
||||
<label class="form-check-label" for="field_telefon">Telefon</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="adresse" id="field_adresse">
|
||||
<label class="form-check-label" for="field_adresse">Adresse</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="fields" value="berufsgruppe" id="field_berufsgruppe">
|
||||
<label class="form-check-label" for="field_berufsgruppe">Berufsgruppe</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-download me-2"></i>Export starten
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Cards -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3">
|
||||
@@ -107,6 +269,9 @@
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="50">
|
||||
<input type="checkbox" class="form-check-input" id="selectAll" onchange="toggleAllCheckboxes(this)">
|
||||
</th>
|
||||
<th>Person</th>
|
||||
<th>Jahr</th>
|
||||
<th>Betrag</th>
|
||||
@@ -120,9 +285,16 @@
|
||||
{% for foerderung in page_obj %}
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" class="form-check-input entry-checkbox" name="entry" value="{{ foerderung.pk }}" onchange="updateSelectedCount()">
|
||||
</td>
|
||||
<td>
|
||||
{% if foerderung.destinataer and foerderung.destinataer.pk %}
|
||||
<a href="{% url 'stiftung:destinataer_detail' foerderung.destinataer.pk %}">
|
||||
{{ foerderung.person.get_full_name }}
|
||||
{{ foerderung.destinataer.get_full_name }}
|
||||
</a>
|
||||
{% else %}
|
||||
<em class="text-muted">Keine Person zugeordnet</em>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ foerderung.jahr }}</td>
|
||||
<td>€{{ foerderung.betrag|floatformat:2 }}</td>
|
||||
@@ -200,4 +372,80 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let selectedEntries = [];
|
||||
|
||||
function toggleAllCheckboxes(source) {
|
||||
checkboxes = document.getElementsByName('entry');
|
||||
for(let i=0, n=checkboxes.length;i<n;i++) {
|
||||
checkboxes[i].checked = source.checked;
|
||||
}
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function updateSelectedCount() {
|
||||
selectedEntries = [];
|
||||
const checkboxes = document.getElementsByName('entry');
|
||||
for(let i=0, n=checkboxes.length;i<n;i++) {
|
||||
if(checkboxes[i].checked) {
|
||||
selectedEntries.push(checkboxes[i].value);
|
||||
}
|
||||
}
|
||||
|
||||
const count = selectedEntries.length;
|
||||
document.getElementById('selectedCount').textContent = count;
|
||||
document.getElementById('exportButton').disabled = count === 0;
|
||||
|
||||
// Update text in buttons
|
||||
document.getElementById('exportText').textContent =
|
||||
count === 0 ? 'Export' : `${count} Einträge exportieren`;
|
||||
}
|
||||
|
||||
function selectAllFields() {
|
||||
document.querySelectorAll('#exportModal input[type="checkbox"]').forEach(cb => cb.checked = true);
|
||||
}
|
||||
|
||||
function selectDefaultFields() {
|
||||
// First uncheck all
|
||||
document.querySelectorAll('#exportModal input[type="checkbox"]').forEach(cb => cb.checked = false);
|
||||
|
||||
// Then check default fields
|
||||
const defaultFields = [
|
||||
'destinataer__person__vorname',
|
||||
'destinataer__person__nachname',
|
||||
'jahr',
|
||||
'betrag',
|
||||
'kategorie',
|
||||
'status',
|
||||
'antragsdatum',
|
||||
'notizen'
|
||||
];
|
||||
|
||||
defaultFields.forEach(field => {
|
||||
const checkbox = document.querySelector(`#exportModal input[value="${field}"]`);
|
||||
if(checkbox) checkbox.checked = true;
|
||||
});
|
||||
}
|
||||
|
||||
function submitExportForm() {
|
||||
// Set selected entries
|
||||
document.getElementById('selectedEntries').value = selectedEntries.join(',');
|
||||
|
||||
// Collect selected fields
|
||||
const selectedFields = [];
|
||||
document.querySelectorAll('#exportModal input[type="checkbox"]:checked').forEach(cb => {
|
||||
selectedFields.push(cb.value);
|
||||
});
|
||||
document.getElementById('selectedFields').value = selectedFields.join(',');
|
||||
|
||||
// Submit form
|
||||
document.getElementById('exportForm').submit();
|
||||
}
|
||||
|
||||
// Initialize on page load
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
updateSelectedCount();
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
147
app/templates/stiftung/help_box.html
Normal file
147
app/templates/stiftung/help_box.html
Normal file
@@ -0,0 +1,147 @@
|
||||
{% load static %}
|
||||
{% if help_obj %}
|
||||
<div class="card border-info mb-3" style="max-width: 350px;">
|
||||
<div class="card-header bg-info text-white d-flex justify-content-between align-items-center">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>{{ help_obj.title }}
|
||||
</h6>
|
||||
{% if can_edit %}
|
||||
<button class="btn btn-sm btn-outline-light" onclick="editHelpBox('{{ page_key }}')" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="help-content">
|
||||
{{ content_html }}
|
||||
</div>
|
||||
{% if can_edit %}
|
||||
<div class="mt-2">
|
||||
<small class="text-muted">
|
||||
<i class="fas fa-user me-1"></i>{{ help_obj.updated_by|default:"System" }}
|
||||
<i class="fas fa-clock ms-2 me-1"></i>{{ help_obj.updated_at|date:"d.m.Y H:i" }}
|
||||
</small>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if can_edit %}
|
||||
<!-- Modal für Bearbeitung -->
|
||||
<div class="modal fade" id="helpBoxModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Hilfs-Infobox bearbeiten</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<form id="helpBoxForm" method="post" action="{% url 'stiftung:edit_help_box' %}">
|
||||
<div class="modal-body">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="page_key" value="{{ page_key }}">
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="title" class="form-label">Titel</label>
|
||||
<input type="text" class="form-control" id="title" name="title"
|
||||
value="{{ help_obj.title }}" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="content" class="form-label">Inhalt</label>
|
||||
<textarea class="form-control" id="content" name="content" rows="10" required>{{ help_obj.content }}</textarea>
|
||||
<div class="form-text">
|
||||
<strong>Markdown Syntax:</strong><br>
|
||||
**fett** | *kursiv* | `code` | [Link](url)<br>
|
||||
- Liste | 1. Nummerierte Liste | > Zitat
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="is_active" name="is_active"
|
||||
{% if help_obj.is_active %}checked{% endif %}>
|
||||
<label class="form-check-label" for="is_active">
|
||||
Aktiv (anzeigen)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary">Speichern</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function editHelpBox(pageKey) {
|
||||
var modal = new bootstrap.Modal(document.getElementById('helpBoxModal'));
|
||||
modal.show();
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% elif can_edit %}
|
||||
<!-- Keine Hilfsbox vorhanden - Button zum Erstellen -->
|
||||
<div class="card border-secondary mb-3" style="max-width: 350px;">
|
||||
<div class="card-body text-center">
|
||||
<p class="text-muted mb-2">Keine Hilfe verfügbar</p>
|
||||
<button class="btn btn-outline-primary btn-sm" onclick="createHelpBox('{{ page_key }}')">
|
||||
<i class="fas fa-plus me-1"></i>Hilfe erstellen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal für neue Hilfsbox -->
|
||||
<div class="modal fade" id="createHelpBoxModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Neue Hilfs-Infobox erstellen</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<form id="createHelpBoxForm" method="post" action="{% url 'stiftung:edit_help_box' %}">
|
||||
<div class="modal-body">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="page_key" value="{{ page_key }}">
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="new_title" class="form-label">Titel</label>
|
||||
<input type="text" class="form-control" id="new_title" name="title"
|
||||
placeholder="z.B. Hilfe beim Erstellen" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="new_content" class="form-label">Inhalt</label>
|
||||
<textarea class="form-control" id="new_content" name="content" rows="10"
|
||||
placeholder="Geben Sie hier die Hilfsinformationen ein..." required></textarea>
|
||||
<div class="form-text">
|
||||
<strong>Markdown Syntax:</strong><br>
|
||||
**fett** | *kursiv* | `code` | [Link](url)<br>
|
||||
- Liste | 1. Nummerierte Liste | > Zitat
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="new_is_active" name="is_active" checked>
|
||||
<label class="form-check-label" for="new_is_active">
|
||||
Aktiv (anzeigen)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary">Erstellen</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function createHelpBox(pageKey) {
|
||||
var modal = new bootstrap.Modal(document.getElementById('createHelpBoxModal'));
|
||||
modal.show();
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
166
app/templates/stiftung/help_boxes_admin.html
Normal file
166
app/templates/stiftung/help_boxes_admin.html
Normal file
@@ -0,0 +1,166 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Hilfs-Infoboxen verwalten - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-info-circle text-primary me-2"></i>
|
||||
Hilfs-Infoboxen verwalten
|
||||
</h1>
|
||||
<div>
|
||||
<a href="{% url 'admin:stiftung_helpbox_add' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Neue Hilfsbox erstellen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-list me-2"></i>Alle Hilfsboxen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
{% if help_boxes %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Seite</th>
|
||||
<th>Titel</th>
|
||||
<th>Status</th>
|
||||
<th>Zuletzt geändert</th>
|
||||
<th>Geändert von</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for help_box in help_boxes %}
|
||||
<tr>
|
||||
<td>
|
||||
<span class="badge bg-secondary">{{ help_box.get_page_key_display }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<strong>{{ help_box.title }}</strong>
|
||||
<br>
|
||||
<small class="text-muted">{{ help_box.content|truncatechars:80 }}</small>
|
||||
</td>
|
||||
<td>
|
||||
{% if help_box.is_active %}
|
||||
<span class="badge bg-success">Aktiv</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">Inaktiv</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ help_box.updated_at|date:"d.m.Y H:i" }}
|
||||
</td>
|
||||
<td>
|
||||
{{ help_box.updated_by|default:"-" }}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'admin:stiftung_helpbox_change' help_box.id %}"
|
||||
class="btn btn-sm btn-outline-primary me-1"
|
||||
title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'admin:stiftung_helpbox_delete' help_box.id %}"
|
||||
class="btn btn-sm btn-outline-danger"
|
||||
title="Löschen">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-4">
|
||||
<i class="fas fa-info-circle fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine Hilfsboxen gefunden</h5>
|
||||
<p class="text-muted">Erstellen Sie Ihre erste Hilfsbox!</p>
|
||||
<a href="{% url 'admin:stiftung_helpbox_add' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Hilfsbox erstellen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-light">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-chart-pie me-2"></i>Statistiken
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Gesamt:</span>
|
||||
<strong>{{ help_boxes|length }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Aktiv:</span>
|
||||
<strong class="text-success">{{ active_count }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Inaktiv:</span>
|
||||
<strong class="text-danger">{{ inactive_count }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<h6 class="text-primary">Verfügbare Seiten:</h6>
|
||||
<div class="small">
|
||||
{% for key, display in available_pages %}
|
||||
{% if key not in existing_pages %}
|
||||
<div class="mb-1">
|
||||
<span class="badge bg-light text-dark">{{ display }}</span>
|
||||
<a href="{% url 'admin:stiftung_helpbox_add' %}?page_key={{ key }}"
|
||||
class="btn btn-sm btn-outline-primary ms-2">
|
||||
<i class="fas fa-plus"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mt-3">
|
||||
<div class="card-header bg-light">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-info me-2"></i>Hilfetipps
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="small">
|
||||
<h6>Markdown Syntax:</h6>
|
||||
<ul class="list-unstyled">
|
||||
<li><code>**fett**</code> → <strong>fett</strong></li>
|
||||
<li><code>*kursiv*</code> → <em>kursiv</em></li>
|
||||
<li><code>`code`</code> → <code>code</code></li>
|
||||
<li><code>[Link](url)</code> → <a href="#">Link</a></li>
|
||||
<li><code>- Liste</code> → Aufzählung</li>
|
||||
<li><code>1. Nummer</code> → Nummeriert</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -97,7 +97,7 @@
|
||||
<i class="fas fa-handshake fa-3x text-secondary mb-3"></i>
|
||||
<h5 class="card-title">🤝 Verpachtungsverwaltung</h5>
|
||||
<p class="card-text">Organisieren Sie Pachtverträge und deren Verwaltung effizient.</p>
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-outline-secondary btn-sm mt-2">
|
||||
<a href="{% url 'stiftung:land_list' %}" class="btn btn-outline-secondary btn-sm mt-2">
|
||||
<i class="fas fa-external-link-alt me-1"></i>Öffnen
|
||||
</a>
|
||||
</div>
|
||||
@@ -143,7 +143,7 @@
|
||||
<a href="{% url 'stiftung:paechter_list' %}" class="btn btn-info btn-lg">
|
||||
<i class="fas fa-user-tie me-2"></i>Pächter
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-secondary btn-lg">
|
||||
<a href="{% url 'stiftung:land_list' %}" class="btn btn-secondary btn-lg">
|
||||
<i class="fas fa-handshake me-2"></i>Verpachtungen
|
||||
</a>
|
||||
<a href="{% url 'stiftung:foerderung_list' %}" class="btn btn-warning btn-lg">
|
||||
|
||||
@@ -391,6 +391,7 @@
|
||||
<th>Fläche</th>
|
||||
<th>Pachtzins</th>
|
||||
<th>Status</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -433,6 +434,21 @@
|
||||
<span class="badge bg-info">{{ verpachtung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' verpachtung.pk %}" class="btn btn-outline-primary" title="Details anzeigen">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:land_verpachtung_update' verpachtung.pk %}" class="btn btn-outline-warning" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
{% if verpachtung.status == 'aktiv' %}
|
||||
<a href="{% url 'stiftung:land_verpachtung_end_direct' verpachtung.pk %}" class="btn btn-outline-danger" title="Beenden">
|
||||
<i class="fas fa-stop"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@@ -626,11 +642,18 @@
|
||||
<i class="fas fa-handshake me-2"></i>Verpachtungs-Management
|
||||
</h6>
|
||||
<div class="btn-group">
|
||||
{% if not land.aktueller_paechter %}
|
||||
{% if land.neue_verpachtungen.exists %}
|
||||
<!-- New system: Create new LandVerpachtung -->
|
||||
<a href="{% url 'stiftung:land_verpachtung_create' land_pk=land.pk %}" class="btn btn-sm btn-success">
|
||||
<i class="fas fa-plus me-2"></i>Neue Verpachtung
|
||||
</a>
|
||||
{% elif not land.aktueller_paechter %}
|
||||
<!-- Old system: No current tenant -->
|
||||
<a href="{% url 'stiftung:land_verpachtung_create' land_pk=land.pk %}" class="btn btn-sm btn-success">
|
||||
<i class="fas fa-plus me-2"></i>Verpachtung erstellen
|
||||
</a>
|
||||
{% else %}
|
||||
<!-- Old system: Has current tenant -->
|
||||
<a href="{% url 'stiftung:land_verpachtung_edit' land_pk=land.pk %}" class="btn btn-sm btn-warning">
|
||||
<i class="fas fa-edit me-2"></i>Verpachtung bearbeiten
|
||||
</a>
|
||||
@@ -641,7 +664,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Neue Verpachtungen anzeigen -->
|
||||
<!-- New LandVerpachtung objects -->
|
||||
{% if land.neue_verpachtungen.all %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
@@ -696,13 +719,18 @@
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<a href="#" class="btn btn-sm btn-outline-primary" title="Bearbeiten">
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' verpachtung.pk %}" class="btn btn-outline-primary" title="Details anzeigen">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:land_verpachtung_update' verpachtung.pk %}" class="btn btn-outline-warning" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="#" class="btn btn-sm btn-outline-danger" title="Beenden">
|
||||
{% if verpachtung.status == 'aktiv' %}
|
||||
<a href="{% url 'stiftung:land_verpachtung_end_direct' verpachtung.pk %}" class="btn btn-outline-danger" title="Beenden">
|
||||
<i class="fas fa-stop"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -734,6 +762,58 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% elif land.aktueller_paechter %}
|
||||
<!-- Old system verpachtung display -->
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>
|
||||
<strong>Legacy Verpachtung:</strong> Diese Länderei verwendet das alte Verpachtungssystem.
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Pächter</th>
|
||||
<th>Zeitraum</th>
|
||||
<th>Fläche</th>
|
||||
<th>Pachtzins</th>
|
||||
<th>Status</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{% url 'stiftung:paechter_detail' land.aktueller_paechter.pk %}">
|
||||
{{ land.aktueller_paechter.get_full_name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{% if land.pachtbeginn %}{{ land.pachtbeginn|date:"d.m.Y" }}{% else %}<span class="text-muted">N/A</span>{% endif %} -
|
||||
{% if land.pachtende %}{{ land.pachtende|date:"d.m.Y" }}{% else %}<span class="text-muted">Unbefristet</span>{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ land.verp_flaeche_aktuell|default_if_none:land.groesse_qm|floatformat:0 }} qm
|
||||
</td>
|
||||
<td>
|
||||
{% if land.pachtzins_aktuell %}€{{ land.pachtzins_aktuell|floatformat:2 }}/Jahr{% else %}<span class="text-muted">N/A</span>{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-warning">Legacy System</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
<a href="{% url 'stiftung:land_verpachtung_edit' land_pk=land.pk %}" class="btn btn-outline-warning" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:land_verpachtung_end' land_pk=land.pk %}" class="btn btn-outline-danger" title="Beenden">
|
||||
<i class="fas fa-stop"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-5">
|
||||
<i class="fas fa-handshake fa-3x text-muted mb-3"></i>
|
||||
@@ -759,7 +839,7 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="d-grid gap-2">
|
||||
<a href="{% url 'stiftung:verpachtung_create' %}?land={{ land.pk }}" class="btn btn-info">
|
||||
<a href="{% url 'stiftung:land_verpachtung_create' land_pk=land.pk %}" class="btn btn-info">
|
||||
<i class="fas fa-handshake me-2"></i>Neue Verpachtung
|
||||
</a>
|
||||
<a href="{% url 'stiftung:land_update' land.pk %}" class="btn btn-warning">
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load help_tags %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
@@ -19,8 +20,12 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Form -->
|
||||
<!-- Form -->
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
@@ -414,6 +419,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar mit Hilfe -->
|
||||
<div class="col-lg-4">
|
||||
{% help_box 'laenderei_new' user %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
247
app/templates/stiftung/land_verpachtung_detail.html
Normal file
247
app/templates/stiftung/land_verpachtung_detail.html
Normal file
@@ -0,0 +1,247 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Verpachtung {{ landverpachtung.vertragsnummer }} - Stiftung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1><i class="fas fa-handshake me-2"></i>Verpachtung {{ landverpachtung.vertragsnummer }}</h1>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:land_verpachtung_update' landverpachtung.pk %}" class="btn btn-warning">
|
||||
<i class="fas fa-edit me-1"></i>Bearbeiten
|
||||
</a>
|
||||
{% if landverpachtung.status == 'aktiv' %}
|
||||
<a href="{% url 'stiftung:land_verpachtung_end_direct' landverpachtung.pk %}" class="btn btn-danger">
|
||||
<i class="fas fa-stop me-1"></i>Beenden
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'stiftung:land_detail' landverpachtung.land.pk %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-1"></i>Zur Länderei
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Grunddaten -->
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="fas fa-info-circle me-2"></i>Grunddaten</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Vertragsnummer:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.vertragsnummer }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Status:</strong></div>
|
||||
<div class="col-sm-8">
|
||||
{% if landverpachtung.status == 'aktiv' %}
|
||||
<span class="badge bg-success">{{ landverpachtung.get_status_display }}</span>
|
||||
{% elif landverpachtung.status == 'beendet' %}
|
||||
<span class="badge bg-secondary">{{ landverpachtung.get_status_display }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-warning">{{ landverpachtung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Länderei:</strong></div>
|
||||
<div class="col-sm-8">
|
||||
<a href="{% url 'stiftung:land_detail' landverpachtung.land.pk %}">
|
||||
{{ landverpachtung.land.gemarkung }} - {{ landverpachtung.land.gemeinde }},
|
||||
Flur {{ landverpachtung.land.flur }}, Flurstück {{ landverpachtung.land.flurstueck|default:"N/A" }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Pächter:</strong></div>
|
||||
<div class="col-sm-8">
|
||||
<a href="{% url 'stiftung:paechter_detail' landverpachtung.paechter.pk %}">
|
||||
{{ landverpachtung.paechter.get_full_name }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Verpachtete Fläche:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.verpachtete_flaeche|floatformat:0 }} m² ({{ landverpachtung.verpachtete_flaeche_hektar }} ha)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vertragsdaten -->
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="fas fa-calendar-alt me-2"></i>Vertragsdaten</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Pachtbeginn:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.pachtbeginn|date:"d.m.Y" }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Pachtende:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.pachtende|date:"d.m.Y"|default:"Unbefristet" }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Verlängerung:</strong></div>
|
||||
<div class="col-sm-8">
|
||||
{% if landverpachtung.verlaengerung_klausel %}
|
||||
<i class="fas fa-check text-success me-1"></i>Automatische Verlängerung
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Keine automatische Verlängerung
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Finanzielle Daten -->
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="fas fa-euro-sign me-2"></i>Finanzielle Daten</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Pachtzins pauschal:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.pachtzins_pauschal|floatformat:2 }} € / Jahr</div>
|
||||
</div>
|
||||
{% if landverpachtung.pachtzins_pro_ha %}
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Pachtzins pro ha:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.pachtzins_pro_ha|floatformat:2 }} € / ha</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>Zahlungsweise:</strong></div>
|
||||
<div class="col-sm-8">{{ landverpachtung.get_zahlungsweise_display }}</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-4"><strong>USt-Option:</strong></div>
|
||||
<div class="col-sm-8">
|
||||
{% if landverpachtung.ust_option %}
|
||||
<i class="fas fa-check text-success me-1"></i>Ja ({{ landverpachtung.ust_satz }}%)
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Nein
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Umlagen -->
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="fas fa-calculator me-2"></i>Umlagen</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6"><strong>Grundsteuer:</strong></div>
|
||||
<div class="col-sm-6">
|
||||
{% if landverpachtung.grundsteuer_umlage %}
|
||||
<i class="fas fa-check text-success me-1"></i>Umlagefähig
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Nicht umlagefähig
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6"><strong>Versicherungen:</strong></div>
|
||||
<div class="col-sm-6">
|
||||
{% if landverpachtung.versicherungen_umlage %}
|
||||
<i class="fas fa-check text-success me-1"></i>Umlagefähig
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Nicht umlagefähig
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6"><strong>Verbandsbeiträge:</strong></div>
|
||||
<div class="col-sm-6">
|
||||
{% if landverpachtung.verbandsbeitraege_umlage %}
|
||||
<i class="fas fa-check text-success me-1"></i>Umlagefähig
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Nicht umlagefähig
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-2">
|
||||
<div class="col-sm-6"><strong>Jagdpachtanteile:</strong></div>
|
||||
<div class="col-sm-6">
|
||||
{% if landverpachtung.jagdpacht_anteil_umlage %}
|
||||
<i class="fas fa-check text-success me-1"></i>Umlagefähig
|
||||
{% else %}
|
||||
<i class="fas fa-times text-danger me-1"></i>Nicht umlagefähig
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Verknüpfte Dokumente -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0"><i class="fas fa-folder-open me-2"></i>Verknüpfte Dokumente</h5>
|
||||
<a href="/dokumente/verwaltung/" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-link me-1"></i>Dokument verknüpfen
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if verknuepfte_dokumente %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Titel</th>
|
||||
<th>Kontext</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for doc in verknuepfte_dokumente %}
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ doc.titel|default:"Ohne Titel" }}</strong>
|
||||
<br>
|
||||
<small class="text-muted">Paperless-ID: {{ doc.paperless_document_id }}</small>
|
||||
</td>
|
||||
<td>{{ doc.get_kontext_display }}</td>
|
||||
<td>
|
||||
<a href="{{ doc.get_paperless_url }}" target="_blank" class="btn btn-sm btn-outline-primary" title="In Paperless öffnen">
|
||||
<i class="fas fa-external-link-alt"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted">Keine Dokumente verknüpft.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bemerkungen -->
|
||||
{% if landverpachtung.bemerkungen %}
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0"><i class="fas fa-sticky-note me-2"></i>Bemerkungen</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="mb-0">{{ landverpachtung.bemerkungen|linebreaks }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,37 +1,38 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Verpachtung löschen - Stiftungsverwaltung{% endblock %}
|
||||
{% block title %}Verpachtung beenden - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 mx-auto">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Verpachtung löschen
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Verpachtung beenden
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="alert alert-warning">
|
||||
<h5 class="alert-heading">
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Warnung!
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Bestätigung erforderlich!
|
||||
</h5>
|
||||
<p class="mb-0">
|
||||
Sind Sie sicher, dass Sie die Verpachtung <strong>{{ verpachtung.vertragsnummer }}</strong> löschen möchten?
|
||||
Sind Sie sicher, dass Sie die Verpachtung <strong>{{ verpachtung.vertragsnummer }}</strong> beenden möchten?
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h6 class="card-title">Verpachtungsdetails:</h6>
|
||||
<h6 class="card-title">Verpachtungs-Details:</h6>
|
||||
<p class="card-text">
|
||||
<strong>Länderei:</strong> {{ verpachtung.land.gemeinde }} - {{ verpachtung.land.gemarkung }}<br>
|
||||
<strong>Pächter:</strong> {{ verpachtung.paechter.get_full_name }}<br>
|
||||
<strong>Zeitraum:</strong> {{ verpachtung.pachtbeginn|date:"d.m.Y" }} - {{ verpachtung.pachtende|date:"d.m.Y" }}<br>
|
||||
<strong>Fläche:</strong> {{ verpachtung.verpachtete_flaeche|floatformat:2 }} qm<br>
|
||||
<strong>Jährlicher Pachtzins:</strong> €{{ verpachtung.pachtzins_jaehrlich|floatformat:2 }}
|
||||
<strong>Vertragsnummer:</strong> {{ verpachtung.vertragsnummer }}<br>
|
||||
<strong>Pächter:</strong> {{ verpachtung.paechter }}<br>
|
||||
<strong>Länderei:</strong> {{ verpachtung.land }}<br>
|
||||
<strong>Pachtbeginn:</strong> {{ verpachtung.pachtbeginn|date:"d.m.Y" }}<br>
|
||||
<strong>Verpachtete Fläche:</strong> {{ verpachtung.verpachtete_flaeche_qm|floatformat:2 }} qm<br>
|
||||
<strong>Pachtzins:</strong> {{ verpachtung.pachtzins_euro_pro_qm|floatformat:4 }} €/qm
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -41,18 +42,18 @@
|
||||
<i class="fas fa-info-circle me-2"></i>Wichtiger Hinweis
|
||||
</h6>
|
||||
<p class="mb-0">
|
||||
Diese Aktion kann nicht rückgängig gemacht werden. Alle zugehörigen Daten werden permanent gelöscht.
|
||||
Die Verpachtung wird auf "beendet" gesetzt und das Pachtende auf das heutige Datum gesetzt. Diese Aktion kann rückgängig gemacht werden, indem der Status und das Pachtende manuell geändert werden.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="d-flex justify-content-between">
|
||||
<a href="{% url 'stiftung:verpachtung_detail' verpachtung.pk %}" class="btn btn-secondary">
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' verpachtung.pk %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Abbrechen
|
||||
</a>
|
||||
<button type="submit" class="btn btn-danger">
|
||||
<i class="fas fa-trash me-2"></i>Endgültig löschen
|
||||
<button type="submit" class="btn btn-warning">
|
||||
<i class="fas fa-stop me-2"></i>Verpachtung beenden
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -61,4 +62,4 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
@@ -15,12 +15,19 @@
|
||||
<p class="text-muted">
|
||||
Länderei: <a href="{% url 'stiftung:land_detail' land.pk %}">{{ land }}</a>
|
||||
{% if is_edit and land.aktueller_paechter %} | Aktueller Pächter: {{ land.aktueller_paechter.get_full_name }}{% endif %}
|
||||
{% if is_update %} | Bearbeitung von {{ landverpachtung.vertragsnummer }}{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-4 text-end">
|
||||
{% if is_update %}
|
||||
<a href="{% url 'stiftung:land_verpachtung_detail' landverpachtung.pk %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Verpachtung
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{% url 'stiftung:land_detail' land.pk %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Länderei
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -42,11 +49,12 @@
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="aktueller_paechter" class="form-label">Pächter auswählen *</label>
|
||||
<select class="form-select" id="aktueller_paechter" name="aktueller_paechter" required>
|
||||
<select class="form-select" id="aktueller_paechter" name="paechter" required>
|
||||
<option value="">Bitte wählen...</option>
|
||||
{% for paechter in paechter_list %}
|
||||
<option value="{{ paechter.pk }}"
|
||||
{% if is_edit and land.aktueller_paechter and paechter.pk == land.aktueller_paechter.pk %}selected{% endif %}
|
||||
{% if is_update and landverpachtung.paechter and paechter.pk == landverpachtung.paechter.pk %}selected
|
||||
{% elif is_edit and land.aktueller_paechter and paechter.pk == land.aktueller_paechter.pk %}selected{% endif %}
|
||||
data-name="{{ paechter.get_full_name }}"
|
||||
data-anschrift="{{ paechter.strasse|default:'' }} {{ paechter.plz|default:'' }} {{ paechter.ort|default:'' }}">
|
||||
{{ paechter.get_full_name }}
|
||||
@@ -60,7 +68,7 @@
|
||||
<div class="mb-3">
|
||||
<label for="verpachtete_flaeche" class="form-label">Verpachtete Fläche (qm) *</label>
|
||||
<input type="number" step="0.01" class="form-control" id="verpachtete_flaeche" name="verpachtete_flaeche"
|
||||
value="{% if is_edit %}{{ land.verp_flaeche_aktuell|default:verfuegbare_flaeche }}{% else %}{{ verfuegbare_flaeche|default:land.groesse_qm }}{% endif %}"
|
||||
value="{% if is_update %}{{ landverpachtung.verpachtete_flaeche }}{% elif is_edit %}{{ land.verp_flaeche_aktuell|default:verfuegbare_flaeche }}{% else %}{{ verfuegbare_flaeche|default:land.groesse_qm }}{% endif %}"
|
||||
max="{{ verfuegbare_flaeche|default:land.groesse_qm }}" required>
|
||||
<small class="text-muted">Verfügbar: {{ verfuegbare_flaeche|default:land.groesse_qm|floatformat:0 }} qm | Gesamt: {{ land.groesse_qm|floatformat:0 }} qm</small>
|
||||
</div>
|
||||
@@ -73,14 +81,14 @@
|
||||
<div class="mb-3">
|
||||
<label for="pachtbeginn" class="form-label">Pachtbeginn *</label>
|
||||
<input type="date" class="form-control" id="pachtbeginn" name="pachtbeginn"
|
||||
value="{% if is_edit and land.pachtbeginn %}{{ land.pachtbeginn|date:'Y-m-d' }}{% endif %}" required>
|
||||
value="{% if is_update %}{{ landverpachtung.pachtbeginn|date:'Y-m-d' }}{% elif is_edit and land.pachtbeginn %}{{ land.pachtbeginn|date:'Y-m-d' }}{% endif %}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="pachtende" class="form-label">Pachtende</label>
|
||||
<input type="date" class="form-control" id="pachtende" name="pachtende"
|
||||
value="{% if is_edit and land.pachtende %}{{ land.pachtende|date:'Y-m-d' }}{% endif %}">
|
||||
value="{% if is_update and landverpachtung.pachtende %}{{ landverpachtung.pachtende|date:'Y-m-d' }}{% elif is_edit and land.pachtende %}{{ land.pachtende|date:'Y-m-d' }}{% endif %}">
|
||||
<small class="text-muted">Leer = unbefristet</small>
|
||||
</div>
|
||||
</div>
|
||||
@@ -88,7 +96,7 @@
|
||||
<div class="mb-3">
|
||||
<div class="form-check mt-4">
|
||||
<input class="form-check-input" type="checkbox" id="verlaengerung_klausel" name="verlaengerung_klausel"
|
||||
{% if is_edit and land.verlaengerung_klausel %}checked{% endif %}>
|
||||
{% if is_update and landverpachtung.verlaengerung_klausel %}checked{% elif is_edit and land.verlaengerung_klausel %}checked{% endif %}>
|
||||
<label class="form-check-label" for="verlaengerung_klausel">
|
||||
Automatische Verlängerung
|
||||
</label>
|
||||
@@ -139,9 +147,9 @@
|
||||
<label for="zahlungsweise" class="form-label">Zahlungsweise</label>
|
||||
<select class="form-select" id="zahlungsweise" name="zahlungsweise">
|
||||
<option value="jaehrlich" {% if is_edit and land.zahlungsweise == 'jaehrlich' %}selected{% endif %}>Jährlich</option>
|
||||
<option value="halbjaehrlich" {% if is_edit and land.zahlungsweise == 'halbjaehrlich' %}selected{% endif %}>Halbjährlich</option>
|
||||
<option value="vierteljaehrlich" {% if is_edit and land.zahlungsweise == 'vierteljaehrlich' %}selected{% endif %}>Vierteljährlich</option>
|
||||
<option value="monatlich" {% if is_edit and land.zahlungsweise == 'monatlich' %}selected{% endif %}>Monatlich</option>
|
||||
<option value="halbjaehrlich" {% if is_update and landverpachtung.zahlungsweise == 'halbjaehrlich' %}selected{% elif is_edit and land.zahlungsweise == 'halbjaehrlich' %}selected{% endif %}>Halbjährlich</option>
|
||||
<option value="vierteljaehrlich" {% if is_update and landverpachtung.zahlungsweise == 'vierteljaehrlich' %}selected{% elif is_edit and land.zahlungsweise == 'vierteljaehrlich' %}selected{% endif %}>Vierteljährlich</option>
|
||||
<option value="monatlich" {% if is_update and landverpachtung.zahlungsweise == 'monatlich' %}selected{% elif is_edit and land.zahlungsweise == 'monatlich' %}selected{% endif %}>Monatlich</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -153,7 +161,7 @@
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="ust_option" name="ust_option"
|
||||
{% if is_edit and land.ust_option %}checked{% endif %}>
|
||||
{% if is_update and landverpachtung.ust_option %}checked{% elif is_edit and land.ust_option %}checked{% endif %}>
|
||||
<label class="form-check-label" for="ust_option">
|
||||
<strong>USt-Option</strong> (Pacht mit Umsatzsteuer)
|
||||
</label>
|
||||
@@ -164,7 +172,7 @@
|
||||
<div class="mb-3">
|
||||
<label for="ust_satz" class="form-label">USt-Satz (%)</label>
|
||||
<input type="number" step="0.01" class="form-control" id="ust_satz" name="ust_satz"
|
||||
value="{% if is_edit %}{{ land.ust_satz|default:'19.00' }}{% else %}19.00{% endif %}">
|
||||
value="{% if is_update %}{{ landverpachtung.ust_satz|default:'19.00' }}{% elif is_edit %}{{ land.ust_satz|default:'19.00' }}{% else %}19.00{% endif %}">
|
||||
<small class="text-muted">Standard: 19%</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load help_tags %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
@@ -18,15 +19,17 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-edit me-2"></i>Pächter-Daten
|
||||
</h5>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-edit me-2"></i>Pächter-Daten
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
@@ -90,7 +93,6 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Kontaktinformationen -->
|
||||
<div class="row mb-4">
|
||||
@@ -418,34 +420,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<!-- Sidebar mit Hilfe -->
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>Hilfe
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h6>Pflichtfelder:</h6>
|
||||
<ul class="list-unstyled small">
|
||||
<li><i class="fas fa-asterisk text-danger me-1"></i>Vorname</li>
|
||||
<li><i class="fas fa-asterisk text-danger me-1"></i>Nachname</li>
|
||||
</ul>
|
||||
|
||||
<hr>
|
||||
|
||||
<h6>Wichtige Hinweise:</h6>
|
||||
<ul class="list-unstyled small">
|
||||
<li><i class="fas fa-lightbulb text-warning me-1"></i>Die Pachtnummer dient zur eindeutigen Identifikation</li>
|
||||
<li><i class="fas fa-lightbulb text-warning me-1"></i>Landwirtschaftliche Ausbildung wird für die Pachtbewertung benötigt</li>
|
||||
<li><i class="fas fa-lightbulb text-warning me-1"></i>Berufserfahrung und Spezialisierung helfen bei der Flächenzuweisung</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% help_box 'paechter_new' user %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,15 +1,67 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Unterstützung löschen{% endblock %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Unterstützung löschen - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<h5>Möchten Sie diese Unterstützung wirklich löschen?</h5>
|
||||
<p><strong>{{ obj.destinataer.get_full_name }}</strong>, €{{ obj.betrag|floatformat:2 }}, fällig am {{ obj.faellig_am|date:"d.m.Y" }}</p>
|
||||
<form method="post">{% csrf_token %}
|
||||
<a href="{% url 'stiftung:unterstuetzungen_list' %}" class="btn btn-outline-secondary">Abbrechen</a>
|
||||
<button type="submit" class="btn btn-danger">Löschen</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 mx-auto">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Unterstützung löschen
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="alert alert-warning">
|
||||
<h5 class="alert-heading">
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Warnung!
|
||||
</h5>
|
||||
<p class="mb-0">
|
||||
Sind Sie sicher, dass Sie die Unterstützung für <strong>{{ obj.destinataer.get_full_name }}</strong>
|
||||
(€{{ obj.betrag|floatformat:2 }}, fällig am {{ obj.faellig_am|date:"d.m.Y" }}) löschen möchten?
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{% if obj.beschreibung %}
|
||||
<div class="mb-3">
|
||||
<strong>Beschreibung:</strong> {{ obj.beschreibung }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if obj.wiederkehrend_von %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-sync-alt me-2"></i>
|
||||
<strong>Hinweis:</strong> Diese Unterstützung ist Teil einer wiederkehrenden Zahlung.
|
||||
{% if will_delete_template %}
|
||||
<br><strong>Achtung:</strong> Da dies die letzte Zahlung dieser wiederkehrenden Vorlage ist,
|
||||
wird auch die wiederkehrende Zahlungsvorlage gelöscht.
|
||||
{% else %}
|
||||
Das Löschen betrifft nur diese einzelne Zahlung, nicht die wiederkehrende Vorlage.
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<p class="text-muted">
|
||||
Diese Aktion kann nicht rückgängig gemacht werden. Alle zugehörigen Daten werden permanent gelöscht.
|
||||
</p>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="d-flex justify-content-between">
|
||||
<a href="{% url 'stiftung:unterstuetzungen_all' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Abbrechen
|
||||
</a>
|
||||
<button type="submit" class="btn btn-danger">
|
||||
<i class="fas fa-trash me-2"></i>Endgültig löschen
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
183
app/templates/stiftung/unterstuetzung_detail.html
Normal file
183
app/templates/stiftung/unterstuetzung_detail.html
Normal file
@@ -0,0 +1,183 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">{{ title }}</h5>
|
||||
<div>
|
||||
{% if unterstuetzung.status == 'geplant' %}
|
||||
<span class="badge bg-light text-dark">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% elif unterstuetzung.status == 'faellig' %}
|
||||
<span class="badge bg-warning">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% elif unterstuetzung.status == 'in_bearbeitung' %}
|
||||
<span class="badge bg-info">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% elif unterstuetzung.status == 'ausgezahlt' %}
|
||||
<span class="badge bg-success">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
|
||||
{% if unterstuetzung.is_overdue %}
|
||||
<span class="badge bg-danger ms-2">Überfällig</span>
|
||||
{% endif %}
|
||||
|
||||
{% if unterstuetzung.wiederkehrend_von %}
|
||||
<span class="badge bg-secondary ms-2">Wiederkehrend</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Basic Information -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2"><i class="fas fa-user me-2"></i>Destinatär</h6>
|
||||
<p class="fw-bold mb-0">
|
||||
<a href="{% url 'stiftung:destinataer_detail' pk=unterstuetzung.destinataer.pk %}"
|
||||
class="text-decoration-none">
|
||||
{{ unterstuetzung.destinataer.get_full_name }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2"><i class="fas fa-euro-sign me-2"></i>Betrag</h6>
|
||||
<p class="fw-bold fs-4 text-success mb-0">€{{ unterstuetzung.betrag|floatformat:2 }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-4">
|
||||
<h6 class="text-muted mb-2"><i class="fas fa-calendar me-2"></i>Fällig am</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.faellig_am|date:"d.m.Y" }}</p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h6 class="text-muted mb-2"><i class="fas fa-university me-2"></i>Zahlungskonto</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.konto }}</p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h6 class="text-muted mb-2"><i class="fas fa-info-circle me-2"></i>Status</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.get_status_display }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bank Transfer Information -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h6 class="text-muted mb-3"><i class="fas fa-money-bill-transfer me-2"></i>Überweisungsdaten</h6>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2">Empfänger IBAN</h6>
|
||||
<p class="mb-0 font-monospace">{{ unterstuetzung.empfaenger_iban|default:"Nicht angegeben" }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2">Empfänger Name</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.empfaenger_name|default:"Nicht angegeben" }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if unterstuetzung.verwendungszweck %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h6 class="text-muted mb-2">Verwendungszweck</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.verwendungszweck }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if unterstuetzung.beschreibung %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h6 class="text-muted mb-2">Beschreibung</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.beschreibung }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Payment Information (if paid) -->
|
||||
{% if unterstuetzung.status == 'ausgezahlt' and unterstuetzung.ausgezahlt_am %}
|
||||
<div class="alert alert-success mb-4">
|
||||
<h6 class="alert-heading mb-2"><i class="fas fa-check-circle me-2"></i>Zahlungsinformationen</h6>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<strong>Ausgezahlt am:</strong> {{ unterstuetzung.ausgezahlt_am|date:"d.m.Y" }}
|
||||
</div>
|
||||
{% if unterstuetzung.ausgezahlt_von %}
|
||||
<div class="col-md-6">
|
||||
<strong>Ausgezahlt von:</strong> {{ unterstuetzung.ausgezahlt_von.get_full_name }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Recurring Payment Information -->
|
||||
{% if unterstuetzung.wiederkehrend_von %}
|
||||
<div class="alert alert-info mb-4">
|
||||
<h6 class="alert-heading mb-2"><i class="fas fa-sync-alt me-2"></i>Wiederkehrende Zahlung</h6>
|
||||
<p class="mb-2">Diese Zahlung wurde automatisch aus einer wiederkehrenden Vorlage generiert.</p>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<strong>Intervall:</strong> {{ unterstuetzung.wiederkehrend_von.get_intervall_display }}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<strong>Erste Zahlung:</strong> {{ unterstuetzung.wiederkehrend_von.erste_zahlung_am|date:"d.m.Y" }}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<strong>Nächste Generierung:</strong> {{ unterstuetzung.wiederkehrend_von.naechste_generierung|date:"d.m.Y" }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Meta Information -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2">Erstellt am</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.erstellt_am|date:"d.m.Y H:i" }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="text-muted mb-2">Zuletzt aktualisiert</h6>
|
||||
<p class="mb-0">{{ unterstuetzung.aktualisiert_am|date:"d.m.Y H:i" }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="d-flex justify-content-between mt-4">
|
||||
<div>
|
||||
<a href="{% url 'stiftung:unterstuetzungen_all' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
|
||||
</a>
|
||||
<a href="{% url 'stiftung:destinataer_detail' pk=unterstuetzung.destinataer.pk %}" class="btn btn-outline-primary ms-2">
|
||||
<i class="fas fa-user me-2"></i>Destinatär anzeigen
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:unterstuetzung_edit' pk=unterstuetzung.pk %}" class="btn btn-warning me-2">
|
||||
<i class="fas fa-edit me-2"></i>Bearbeiten
|
||||
</a>
|
||||
{% if can_mark_paid %}
|
||||
<a href="{% url 'stiftung:unterstuetzung_mark_paid' pk=unterstuetzung.pk %}" class="btn btn-success me-2">
|
||||
<i class="fas fa-check me-2"></i>Als bezahlt markieren
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'stiftung:unterstuetzung_delete' pk=unterstuetzung.pk %}" class="btn btn-danger">
|
||||
<i class="fas fa-trash me-2"></i>Löschen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,46 +1,265 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load help_tags %}
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white"><h5 class="mb-0">{{ title }}</h5></div>
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="mb-0">{{ title }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post">{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="{{ form.destinataer.id_for_label }}">{{ form.destinataer.label }}</label>
|
||||
{{ form.destinataer }}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<!-- Basic Information -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.destinataer.id_for_label }}">{{ form.destinataer.label }}</label>
|
||||
{{ form.destinataer }}
|
||||
{% if form.destinataer.errors %}
|
||||
<div class="text-danger">{{ form.destinataer.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.konto.id_for_label }}">{{ form.konto.label }}</label>
|
||||
{{ form.konto }}
|
||||
{% if form.konto.errors %}
|
||||
<div class="text-danger">{{ form.konto.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="{{ form.konto.id_for_label }}">{{ form.konto.label }}</label>
|
||||
{{ form.konto }}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4 mb-3">
|
||||
|
||||
<!-- Payment Details -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label" for="{{ form.betrag.id_for_label }}">{{ form.betrag.label }}</label>
|
||||
{{ form.betrag }}
|
||||
{% if form.betrag.errors %}
|
||||
<div class="text-danger">{{ form.betrag.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label" for="{{ form.faellig_am.id_for_label }}">{{ form.faellig_am.label }}</label>
|
||||
{{ form.faellig_am }}
|
||||
{% if form.faellig_am.errors %}
|
||||
<div class="text-danger">{{ form.faellig_am.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label" for="{{ form.status.id_for_label }}">{{ form.status.label }}</label>
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="text-danger">{{ form.status.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<div class="form-check mt-4">
|
||||
{{ form.ist_wiederkehrend }}
|
||||
<label class="form-check-label" for="{{ form.ist_wiederkehrend.id_for_label }}">
|
||||
{{ form.ist_wiederkehrend.label }}
|
||||
</label>
|
||||
{% if form.ist_wiederkehrend.help_text %}
|
||||
<div class="form-text">{{ form.ist_wiederkehrend.help_text }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="{{ form.beschreibung.id_for_label }}">{{ form.beschreibung.label }}</label>
|
||||
{{ form.beschreibung }}
|
||||
|
||||
<!-- Recurring Payment Settings (initially hidden) -->
|
||||
<div id="recurring-fields" style="display: none;" class="mb-4">
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>
|
||||
<strong>Wiederkehrende Zahlung:</strong> Diese Einstellungen werden nur für automatisch wiederkehrende Zahlungen verwendet.
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.intervall.id_for_label }}">{{ form.intervall.label }}</label>
|
||||
{{ form.intervall }}
|
||||
{% if form.intervall.errors %}
|
||||
<div class="text-danger">{{ form.intervall.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.letzte_zahlung_am.id_for_label }}">{{ form.letzte_zahlung_am.label }}</label>
|
||||
{{ form.letzte_zahlung_am }}
|
||||
{% if form.letzte_zahlung_am.help_text %}
|
||||
<div class="form-text">{{ form.letzte_zahlung_am.help_text }}</div>
|
||||
{% endif %}
|
||||
{% if form.letzte_zahlung_am.errors %}
|
||||
<div class="text-danger">{{ form.letzte_zahlung_am.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bank Transfer Information -->
|
||||
<h6 class="text-muted mb-3"><i class="fas fa-university me-2"></i>Überweisungsdaten</h6>
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.empfaenger_iban.id_for_label }}">{{ form.empfaenger_iban.label }}</label>
|
||||
{{ form.empfaenger_iban }}
|
||||
{% if form.empfaenger_iban.errors %}
|
||||
<div class="text-danger">{{ form.empfaenger_iban.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.empfaenger_name.id_for_label }}">{{ form.empfaenger_name.label }}</label>
|
||||
{{ form.empfaenger_name }}
|
||||
{% if form.empfaenger_name.errors %}
|
||||
<div class="text-danger">{{ form.empfaenger_name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-8 mb-3">
|
||||
<label class="form-label" for="{{ form.verwendungszweck.id_for_label }}">{{ form.verwendungszweck.label }}</label>
|
||||
{{ form.verwendungszweck }}
|
||||
{% if form.verwendungszweck.errors %}
|
||||
<div class="text-danger">{{ form.verwendungszweck.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label" for="{{ form.beschreibung.id_for_label }}">{{ form.beschreibung.label }}</label>
|
||||
{{ form.beschreibung }}
|
||||
{% if form.beschreibung.errors %}
|
||||
<div class="text-danger">{{ form.beschreibung.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-between">
|
||||
<a href="{% url 'stiftung:unterstuetzungen_list' %}" class="btn btn-outline-secondary">Abbrechen</a>
|
||||
<button class="btn btn-primary" type="submit">Speichern</button>
|
||||
<a href="{% url 'stiftung:unterstuetzungen_all' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück
|
||||
</a>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-save me-2"></i>Speichern
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar mit Hilfe -->
|
||||
<div class="col-lg-4">
|
||||
{% help_box 'unterstuetzung_new' user %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function toggleRecurringFields() {
|
||||
const recurringCheckbox = document.getElementById('{{ form.ist_wiederkehrend.id_for_label }}');
|
||||
const recurringFields = document.getElementById('recurring-fields');
|
||||
const intervalField = document.getElementById('{{ form.intervall.id_for_label }}');
|
||||
|
||||
console.log('toggleRecurringFields called', {
|
||||
checkbox: !!recurringCheckbox,
|
||||
checked: recurringCheckbox ? recurringCheckbox.checked : 'N/A',
|
||||
fieldsDiv: !!recurringFields,
|
||||
intervalField: !!intervalField
|
||||
});
|
||||
|
||||
if (recurringCheckbox && recurringFields) {
|
||||
if (recurringCheckbox.checked) {
|
||||
recurringFields.style.display = 'block';
|
||||
if (intervalField) {
|
||||
intervalField.required = true;
|
||||
}
|
||||
console.log('Showing recurring fields');
|
||||
} else {
|
||||
recurringFields.style.display = 'none';
|
||||
if (intervalField) {
|
||||
intervalField.required = false;
|
||||
intervalField.value = '';
|
||||
}
|
||||
console.log('Hiding recurring fields');
|
||||
}
|
||||
} else {
|
||||
console.error('Could not find required elements for recurring fields toggle');
|
||||
}
|
||||
}
|
||||
|
||||
function updateDestinataerInfo() {
|
||||
const destinataerSelect = document.getElementById('{{ form.destinataer.id_for_label }}');
|
||||
const ibanField = document.getElementById('{{ form.empfaenger_iban.id_for_label }}');
|
||||
const nameField = document.getElementById('{{ form.empfaenger_name.id_for_label }}');
|
||||
|
||||
if (destinataerSelect.value) {
|
||||
// Fetch IBAN and name information via AJAX
|
||||
fetch(`/api/destinataer/${destinataerSelect.value}/info/`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
|
||||
},
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
// Update IBAN field if it's empty
|
||||
if (!ibanField.value && data.iban) {
|
||||
ibanField.value = data.iban;
|
||||
}
|
||||
// Update name field if it's empty
|
||||
if (!nameField.value && data.name) {
|
||||
nameField.value = data.name;
|
||||
}
|
||||
} else {
|
||||
console.error('Error fetching destinataer info:', data.error);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
} else {
|
||||
// Clear fields when no destinataer is selected
|
||||
if (!ibanField.value) ibanField.value = '';
|
||||
if (!nameField.value) nameField.value = '';
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize the form
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
console.log('Initializing form...');
|
||||
|
||||
// Get form elements
|
||||
const destinataerSelect = document.getElementById('{{ form.destinataer.id_for_label }}');
|
||||
const recurringCheckbox = document.getElementById('{{ form.ist_wiederkehrend.id_for_label }}');
|
||||
const recurringFields = document.getElementById('recurring-fields');
|
||||
const intervalField = document.getElementById('{{ form.intervall.id_for_label }}');
|
||||
|
||||
console.log('Form elements found:', {
|
||||
destinataerSelect: !!destinataerSelect,
|
||||
recurringCheckbox: !!recurringCheckbox,
|
||||
recurringFields: !!recurringFields,
|
||||
intervalField: !!intervalField
|
||||
});
|
||||
|
||||
// Add event listeners
|
||||
if (destinataerSelect) {
|
||||
destinataerSelect.addEventListener('change', updateDestinataerInfo);
|
||||
}
|
||||
|
||||
if (recurringCheckbox) {
|
||||
recurringCheckbox.addEventListener('change', function() {
|
||||
console.log('Recurring checkbox changed:', this.checked);
|
||||
toggleRecurringFields();
|
||||
});
|
||||
|
||||
// Initialize state
|
||||
toggleRecurringFields();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
74
app/templates/stiftung/unterstuetzung_mark_paid.html
Normal file
74
app/templates/stiftung/unterstuetzung_mark_paid.html
Normal file
@@ -0,0 +1,74 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzung_detail' pk=unterstuetzung.pk %}">Unterstützung Details</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Als bezahlt markieren</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h5 class="mb-0">{{ title }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Payment Summary -->
|
||||
<div class="alert alert-info mb-4">
|
||||
<h6><i class="fas fa-info-circle me-2"></i>Zahlungsdetails</h6>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<strong>Destinatär:</strong> {{ unterstuetzung.destinataer.get_full_name }}<br>
|
||||
<strong>Betrag:</strong> €{{ unterstuetzung.betrag }}<br>
|
||||
<strong>Fällig am:</strong> {{ unterstuetzung.faellig_am }}
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<strong>IBAN:</strong> {{ unterstuetzung.empfaenger_iban|default:"Nicht angegeben" }}<br>
|
||||
<strong>Verwendungszweck:</strong> {{ unterstuetzung.verwendungszweck|default:"Nicht angegeben" }}<br>
|
||||
<strong>Status:</strong> <span class="badge bg-warning">{{ unterstuetzung.get_status_display }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label" for="{{ form.ausgezahlt_am.id_for_label }}">{{ form.ausgezahlt_am.label }}</label>
|
||||
{{ form.ausgezahlt_am }}
|
||||
{% if form.ausgezahlt_am.errors %}
|
||||
<div class="text-danger">{{ form.ausgezahlt_am.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="{{ form.bemerkung.id_for_label }}">{{ form.bemerkung.label }}</label>
|
||||
{{ form.bemerkung }}
|
||||
{% if form.bemerkung.help_text %}
|
||||
<div class="form-text">{{ form.bemerkung.help_text }}</div>
|
||||
{% endif %}
|
||||
{% if form.bemerkung.errors %}
|
||||
<div class="text-danger">{{ form.bemerkung.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-between">
|
||||
<a href="{% url 'stiftung:unterstuetzung_detail' pk=unterstuetzung.pk %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück
|
||||
</a>
|
||||
<button type="submit" class="btn btn-success">
|
||||
<i class="fas fa-check me-2"></i>Als bezahlt markieren
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
492
app/templates/stiftung/unterstuetzungen_all.html
Normal file
492
app/templates/stiftung/unterstuetzungen_all.html
Normal file
@@ -0,0 +1,492 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Unterstützungen - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-hand-holding-usd text-primary me-2"></i>Unterstützungen
|
||||
</h1>
|
||||
<div>
|
||||
<button type="button" class="btn btn-outline-secondary me-2" data-bs-toggle="modal" data-bs-target="#exportModal">
|
||||
<i class="fas fa-download me-2"></i>Exportieren
|
||||
</button>
|
||||
<a href="{% url 'stiftung:wiederkehrende_unterstuetzungen' %}" class="btn btn-outline-info me-2">
|
||||
<i class="fas fa-sync-alt me-2"></i> Wiederkehrende
|
||||
</a>
|
||||
<a href="{% url 'stiftung:unterstuetzung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i> Neue Unterstützung
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Export Modal -->
|
||||
<div class="modal fade" id="exportModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Export Optionen</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<form id="exportForm" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6 class="fw-bold">Export Format</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_csv" value="csv" checked>
|
||||
<label class="form-check-label" for="format_csv">
|
||||
<i class="fas fa-file-csv me-2"></i>CSV (Excel-kompatibel)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_pdf" value="pdf">
|
||||
<label class="form-check-label" for="format_pdf">
|
||||
<i class="fas fa-file-pdf me-2"></i>PDF (Tabelle)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h6 class="fw-bold">Export Umfang</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_all" value="all" checked>
|
||||
<label class="form-check-label" for="scope_all">
|
||||
Alle Einträge (<span id="total-count">{{ unterstuetzungen.count }}</span>)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_selected" value="selected">
|
||||
<label class="form-check-label" for="scope_selected">
|
||||
Nur ausgewählte Einträge (<span id="selected-count">0</span>)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6" id="field-selection" style="max-height: 400px; overflow-y: auto;">
|
||||
<h6 class="fw-bold">Felder auswählen</h6>
|
||||
<div class="mb-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary me-2" onclick="selectAllFields()">Alle auswählen</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="selectDefaultFields()">Standard</button>
|
||||
</div>
|
||||
|
||||
<div class="field-groups">
|
||||
<!-- Core Payment Fields -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-primary mb-2">Zahlungsdaten</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="destinataer_name" id="field_destinataer_name" checked>
|
||||
<label class="form-check-label" for="field_destinataer_name">Destinatär Name</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="betrag" id="field_betrag" checked>
|
||||
<label class="form-check-label" for="field_betrag">Betrag (€)</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="faellig_am" id="field_faellig_am" checked>
|
||||
<label class="form-check-label" for="field_faellig_am">Fällig am</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="status" id="field_status" checked>
|
||||
<label class="form-check-label" for="field_status">Status</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="beschreibung" id="field_beschreibung" checked>
|
||||
<label class="form-check-label" for="field_beschreibung">Beschreibung</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="ausgezahlt_am" id="field_ausgezahlt_am">
|
||||
<label class="form-check-label" for="field_ausgezahlt_am">Ausgezahlt am</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Payment Details -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-info mb-2">Überweisungsdetails</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="empfaenger_iban" id="field_empfaenger_iban" checked>
|
||||
<label class="form-check-label" for="field_empfaenger_iban">Empfänger IBAN</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="empfaenger_name" id="field_empfaenger_name" checked>
|
||||
<label class="form-check-label" for="field_empfaenger_name">Empfänger Name</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="verwendungszweck" id="field_verwendungszweck">
|
||||
<label class="form-check-label" for="field_verwendungszweck">Verwendungszweck</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Account Information -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-success mb-2">Kontoinformationen</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_name" id="field_konto_name">
|
||||
<label class="form-check-label" for="field_konto_name">Konto</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_bank" id="field_konto_bank">
|
||||
<label class="form-check-label" for="field_konto_bank">Bank</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_iban" id="field_konto_iban">
|
||||
<label class="form-check-label" for="field_konto_iban">Konto IBAN</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Destinataer Personal Info -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-warning mb-2">Destinatär Details</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="familienzweig" id="field_familienzweig">
|
||||
<label class="form-check-label" for="field_familienzweig">Familienzweig</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="email" id="field_email">
|
||||
<label class="form-check-label" for="field_email">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="telefon" id="field_telefon">
|
||||
<label class="form-check-label" for="field_telefon">Telefon</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="adresse" id="field_adresse">
|
||||
<label class="form-check-label" for="field_adresse">Adresse</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- System Fields -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-secondary mb-2">System & Verlauf</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="erstellt_am" id="field_erstellt_am">
|
||||
<label class="form-check-label" for="field_erstellt_am">Erstellt am</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="ist_wiederkehrend" id="field_ist_wiederkehrend">
|
||||
<label class="form-check-label" for="field_ist_wiederkehrend">Wiederkehrend</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-download me-2"></i>Exportieren
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Cards -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-primary text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Gesamtbetrag</h5>
|
||||
<h3 class="card-text">€{{ total_betrag|floatformat:2 }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-success text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Durchschnitt</h5>
|
||||
<h3 class="card-text">€{{ avg_betrag|floatformat:2 }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-info text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Anzahl</h5>
|
||||
<h3 class="card-text">{{ unterstuetzungen.count }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filters -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-filter me-2"></i>Filter
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="get" class="row g-3">
|
||||
<div class="col-md-2">
|
||||
<label for="status" class="form-label">Status</label>
|
||||
<select name="status" id="status" class="form-select">
|
||||
<option value="">Alle Status</option>
|
||||
{% for status in status_choices %}
|
||||
<option value="{{ status.0 }}" {% if status_filter == status.0 %}selected{% endif %}>{{ status.1 }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="destinataer" class="form-label">Destinatär</label>
|
||||
<select name="destinataer" id="destinataer" class="form-select">
|
||||
<option value="">Alle Destinatäre</option>
|
||||
{% for dest in destinataer %}
|
||||
<option value="{{ dest.id }}" {% if filter_destinataer == dest.id|stringformat:"s" %}selected{% endif %}>{{ dest.get_full_name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary me-2">
|
||||
<i class="fas fa-search me-2"></i>Filtern
|
||||
</button>
|
||||
<a href="{% url 'stiftung:unterstuetzungen_all' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-times me-2"></i>Zurücksetzen
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Unterstützungen Table -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-list me-2"></i>Unterstützungen
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if unterstuetzungen %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="selectAll" onchange="toggleAllCheckboxes()">
|
||||
</div>
|
||||
</th>
|
||||
<th>Destinatär</th>
|
||||
<th>Betrag</th>
|
||||
<th>Fällig am</th>
|
||||
<th>Konto</th>
|
||||
<th>Status</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for unterstuetzung in unterstuetzungen %}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input entry-checkbox" type="checkbox" name="selected_entries" value="{{ unterstuetzung.id }}" onchange="updateSelectedCount()">
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'stiftung:destinataer_detail' unterstuetzung.destinataer.pk %}">
|
||||
{{ unterstuetzung.destinataer.get_full_name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>€{{ unterstuetzung.betrag|floatformat:2 }}</td>
|
||||
<td>{{ unterstuetzung.faellig_am|date:"d.m.Y" }}</td>
|
||||
<td>
|
||||
<span class="badge bg-secondary">{{ unterstuetzung.konto }}</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if unterstuetzung.status == 'geplant' %}
|
||||
<span class="badge bg-secondary">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% elif unterstuetzung.status == 'in_bearbeitung' %}
|
||||
<span class="badge bg-warning">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% elif unterstuetzung.status == 'ausgezahlt' %}
|
||||
<span class="badge bg-success">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">{{ unterstuetzung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ unterstuetzung.beschreibung|truncatechars:40 }}</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<a href="{% url 'stiftung:unterstuetzung_detail' unterstuetzung.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
<div class="text-center py-5">
|
||||
<i class="fas fa-hand-holding-usd fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine Unterstützungen gefunden</h5>
|
||||
<p class="text-muted">Erstellen Sie Ihre erste Unterstützung oder passen Sie die Filter an.</p>
|
||||
<a href="{% url 'stiftung:unterstuetzung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Neue Unterstützung erstellen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Field selection functions
|
||||
function selectAllFields() {
|
||||
document.querySelectorAll('.field-checkbox').forEach(checkbox => {
|
||||
checkbox.checked = true;
|
||||
});
|
||||
}
|
||||
|
||||
function selectDefaultFields() {
|
||||
// Uncheck all first
|
||||
document.querySelectorAll('.field-checkbox').forEach(checkbox => {
|
||||
checkbox.checked = false;
|
||||
});
|
||||
|
||||
// Check default fields
|
||||
const defaultFields = [
|
||||
'destinataer_name', 'betrag', 'faellig_am', 'status',
|
||||
'empfaenger_iban', 'empfaenger_name', 'beschreibung'
|
||||
];
|
||||
|
||||
defaultFields.forEach(fieldName => {
|
||||
const checkbox = document.getElementById('field_' + fieldName);
|
||||
if (checkbox) checkbox.checked = true;
|
||||
});
|
||||
}
|
||||
|
||||
// Bulk selection functions
|
||||
function toggleAllCheckboxes() {
|
||||
const selectAll = document.getElementById('selectAll');
|
||||
const checkboxes = document.querySelectorAll('.entry-checkbox');
|
||||
|
||||
checkboxes.forEach(checkbox => {
|
||||
checkbox.checked = selectAll.checked;
|
||||
});
|
||||
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function updateSelectedCount() {
|
||||
const selectedCheckboxes = document.querySelectorAll('.entry-checkbox:checked');
|
||||
const count = selectedCheckboxes.length;
|
||||
|
||||
document.getElementById('selected-count').textContent = count;
|
||||
|
||||
// Update the select all checkbox state
|
||||
const selectAll = document.getElementById('selectAll');
|
||||
const allCheckboxes = document.querySelectorAll('.entry-checkbox');
|
||||
|
||||
if (count === 0) {
|
||||
selectAll.indeterminate = false;
|
||||
selectAll.checked = false;
|
||||
} else if (count === allCheckboxes.length) {
|
||||
selectAll.indeterminate = false;
|
||||
selectAll.checked = true;
|
||||
} else {
|
||||
selectAll.indeterminate = true;
|
||||
}
|
||||
|
||||
// Enable/disable the "selected only" radio button
|
||||
const scopeSelected = document.getElementById('scope_selected');
|
||||
const scopeSelectedLabel = scopeSelected.parentElement.querySelector('label');
|
||||
|
||||
if (count > 0) {
|
||||
scopeSelected.disabled = false;
|
||||
scopeSelectedLabel.classList.remove('text-muted');
|
||||
} else {
|
||||
scopeSelected.disabled = true;
|
||||
scopeSelected.checked = false;
|
||||
document.getElementById('scope_all').checked = true;
|
||||
scopeSelectedLabel.classList.add('text-muted');
|
||||
}
|
||||
}
|
||||
|
||||
// Export form handling
|
||||
document.getElementById('exportForm').addEventListener('submit', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
const formData = new FormData(this);
|
||||
const format = formData.get('format');
|
||||
const scope = formData.get('scope');
|
||||
|
||||
// Build query string for GET request with format
|
||||
const params = new URLSearchParams();
|
||||
params.append('format', format);
|
||||
|
||||
// Add selected fields to the URL
|
||||
formData.getAll('fields').forEach(field => {
|
||||
params.append('fields', field);
|
||||
});
|
||||
|
||||
// If scope is "selected", we need to POST the selected IDs
|
||||
if (scope === 'selected') {
|
||||
const selectedIds = [];
|
||||
document.querySelectorAll('.entry-checkbox:checked').forEach(checkbox => {
|
||||
selectedIds.push(checkbox.value);
|
||||
});
|
||||
|
||||
if (selectedIds.length === 0) {
|
||||
alert('Bitte wählen Sie mindestens einen Eintrag aus.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a temporary form for POST request
|
||||
const tempForm = document.createElement('form');
|
||||
tempForm.method = 'POST';
|
||||
tempForm.action = window.location.pathname + '?' + params.toString();
|
||||
tempForm.style.display = 'none';
|
||||
|
||||
// Add CSRF token
|
||||
const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
|
||||
const csrfInput = document.createElement('input');
|
||||
csrfInput.type = 'hidden';
|
||||
csrfInput.name = 'csrfmiddlewaretoken';
|
||||
csrfInput.value = csrfToken;
|
||||
tempForm.appendChild(csrfInput);
|
||||
|
||||
// Add selected IDs
|
||||
selectedIds.forEach(id => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'selected_entries';
|
||||
input.value = id;
|
||||
tempForm.appendChild(input);
|
||||
});
|
||||
|
||||
// Add fields
|
||||
formData.getAll('fields').forEach(field => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'fields';
|
||||
input.value = field;
|
||||
tempForm.appendChild(input);
|
||||
});
|
||||
|
||||
document.body.appendChild(tempForm);
|
||||
tempForm.submit();
|
||||
document.body.removeChild(tempForm);
|
||||
} else {
|
||||
// For "all" scope, use GET request
|
||||
window.location.href = window.location.pathname + '?' + params.toString();
|
||||
}
|
||||
|
||||
// Close modal
|
||||
bootstrap.Modal.getInstance(document.getElementById('exportModal')).hide();
|
||||
});
|
||||
|
||||
// Initialize counts on page load
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
updateSelectedCount();
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,19 +1,228 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Destinatärunterstützungen - Administration{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3"><i class="fas fa-hand-holding-usd me-2"></i>Destinatärunterstützungen</h1>
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-outline-primary" href="?format=csv"><i class="fas fa-file-csv me-2"></i>CSV exportieren</a>
|
||||
<a class="btn btn-outline-danger" href="?format=pdf"><i class="fas fa-file-pdf me-2"></i>PDF exportieren</a>
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exportModal">
|
||||
<i class="fas fa-download me-2"></i>Exportieren
|
||||
</button>
|
||||
<a class="btn btn-outline-success" href="{% url 'stiftung:unterstuetzung_create' %}">
|
||||
<i class="fas fa-plus me-2"></i>Neue Unterstützung
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Export Modal -->
|
||||
<div class="modal fade" id="exportModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Export Optionen</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<form id="exportForm" method="post" action="{% url 'stiftung:unterstuetzungen_list' %}">
|
||||
{% csrf_token %}
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6 class="fw-bold">Export Format</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_csv" value="csv" checked>
|
||||
<label class="form-check-label" for="format_csv">
|
||||
<i class="fas fa-file-csv me-2"></i>CSV (Excel-kompatibel)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="format" id="format_pdf" value="pdf">
|
||||
<label class="form-check-label" for="format_pdf">
|
||||
<i class="fas fa-file-pdf me-2"></i>PDF (Tabelle)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h6 class="fw-bold">Export Umfang</h6>
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_all" value="all" checked>
|
||||
<label class="form-check-label" for="scope_all">
|
||||
Alle Einträge (<span id="total-count">{{ unterstuetzungen|length }}</span>)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="scope" id="scope_selected" value="selected">
|
||||
<label class="form-check-label" for="scope_selected">
|
||||
Nur ausgewählte Einträge (<span id="selected-count">0</span>)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6" id="field-selection" style="max-height: 400px; overflow-y: auto;">
|
||||
<h6 class="fw-bold">Felder auswählen</h6>
|
||||
<div class="mb-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary me-2" onclick="selectAllFields()">Alle auswählen</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="selectDefaultFields()">Standard</button>
|
||||
</div>
|
||||
|
||||
<div class="field-groups">
|
||||
<!-- Core Payment Fields -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-primary mb-2">Zahlungsdaten</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="destinataer_name" id="field_destinataer_name" checked>
|
||||
<label class="form-check-label" for="field_destinataer_name">Destinatär Name</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="betrag" id="field_betrag" checked>
|
||||
<label class="form-check-label" for="field_betrag">Betrag (€)</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="faellig_am" id="field_faellig_am" checked>
|
||||
<label class="form-check-label" for="field_faellig_am">Fällig am</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="status" id="field_status" checked>
|
||||
<label class="form-check-label" for="field_status">Status</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="beschreibung" id="field_beschreibung" checked>
|
||||
<label class="form-check-label" for="field_beschreibung">Beschreibung</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="ausgezahlt_am" id="field_ausgezahlt_am">
|
||||
<label class="form-check-label" for="field_ausgezahlt_am">Ausgezahlt am</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Payment Details -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-info mb-2">Überweisungsdetails</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="empfaenger_iban" id="field_empfaenger_iban" checked>
|
||||
<label class="form-check-label" for="field_empfaenger_iban">Empfänger IBAN</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="empfaenger_name" id="field_empfaenger_name" checked>
|
||||
<label class="form-check-label" for="field_empfaenger_name">Empfänger Name</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="verwendungszweck" id="field_verwendungszweck">
|
||||
<label class="form-check-label" for="field_verwendungszweck">Verwendungszweck</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Account Information -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-success mb-2">Kontoinformationen</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_name" id="field_konto_name">
|
||||
<label class="form-check-label" for="field_konto_name">Konto</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_bank" id="field_konto_bank">
|
||||
<label class="form-check-label" for="field_konto_bank">Bank</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="konto_iban" id="field_konto_iban">
|
||||
<label class="form-check-label" for="field_konto_iban">Konto IBAN</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Destinataer Personal Info -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-warning mb-2">Destinatär Details</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="familienzweig" id="field_familienzweig">
|
||||
<label class="form-check-label" for="field_familienzweig">Familienzweig</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="geburtsdatum" id="field_geburtsdatum">
|
||||
<label class="form-check-label" for="field_geburtsdatum">Geburtsdatum</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="email" id="field_email">
|
||||
<label class="form-check-label" for="field_email">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="telefon" id="field_telefon">
|
||||
<label class="form-check-label" for="field_telefon">Telefon</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="adresse" id="field_adresse">
|
||||
<label class="form-check-label" for="field_adresse">Adresse</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Financial Information -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-danger mb-2">Finanzinformationen</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="jaehrliches_einkommen" id="field_jaehrliches_einkommen">
|
||||
<label class="form-check-label" for="field_jaehrliches_einkommen">Jährliches Einkommen</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="monatliche_bezuege" id="field_monatliche_bezuege">
|
||||
<label class="form-check-label" for="field_monatliche_bezuege">Monatliche Bezüge</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="haushaltsgroesse" id="field_haushaltsgroesse">
|
||||
<label class="form-check-label" for="field_haushaltsgroesse">Haushaltsgröße</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="vermoegen" id="field_vermoegen">
|
||||
<label class="form-check-label" for="field_vermoegen">Vermögen</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- System Fields -->
|
||||
<div class="mb-3">
|
||||
<h6 class="text-secondary mb-2">System & Verlauf</h6>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="erstellt_am" id="field_erstellt_am">
|
||||
<label class="form-check-label" for="field_erstellt_am">Erstellt am</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="ausgezahlt_von" id="field_ausgezahlt_von">
|
||||
<label class="form-check-label" for="field_ausgezahlt_von">Ausgezahlt von</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="ist_wiederkehrend" id="field_ist_wiederkehrend">
|
||||
<label class="form-check-label" for="field_ist_wiederkehrend">Wiederkehrend</label>
|
||||
</div>
|
||||
<div class="form-check form-check-sm">
|
||||
<input class="form-check-input field-checkbox" type="checkbox" name="fields" value="id" id="field_id">
|
||||
<label class="form-check-label" for="field_id">ID</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-download me-2"></i>Exportieren
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="selectAll" onchange="toggleAllCheckboxes()">
|
||||
</div>
|
||||
</th>
|
||||
<th>Destinatär</th>
|
||||
<th>Bank</th>
|
||||
<th>IBAN</th>
|
||||
@@ -28,13 +237,27 @@
|
||||
<tbody>
|
||||
{% for u in unterstuetzungen %}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input entry-checkbox" type="checkbox" name="selected_entries" value="{{ u.id }}" onchange="updateSelectedCount()">
|
||||
</div>
|
||||
</td>
|
||||
<td>{{ u.destinataer.get_full_name }}</td>
|
||||
<td>{{ u.konto.bank_name }}</td>
|
||||
<td>{{ u.konto.iban }}</td>
|
||||
<td>€{{ u.betrag|floatformat:2 }}</td>
|
||||
<td>{{ u.konto }}</td>
|
||||
<td>{{ u.faellig_am|date:"d.m.Y" }}</td>
|
||||
<td><span class="badge bg-secondary">{{ u.get_status_display }}</span></td>
|
||||
<td>
|
||||
<span class="badge
|
||||
{% if u.status == 'ausgezahlt' %}bg-success
|
||||
{% elif u.status == 'faellig' %}bg-warning
|
||||
{% elif u.status == 'in_bearbeitung' %}bg-info
|
||||
{% elif u.status == 'storniert' %}bg-danger
|
||||
{% else %}bg-secondary{% endif %}">
|
||||
{{ u.get_status_display }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ u.beschreibung }}</td>
|
||||
<td>
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
@@ -44,12 +267,165 @@
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="6" class="text-center text-muted">Keine Einträge</td></tr>
|
||||
<tr><td colspan="10" class="text-center text-muted">Keine Einträge</td></tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Field selection functions
|
||||
function selectAllFields() {
|
||||
document.querySelectorAll('.field-checkbox').forEach(checkbox => {
|
||||
checkbox.checked = true;
|
||||
});
|
||||
}
|
||||
|
||||
function selectDefaultFields() {
|
||||
// Uncheck all first
|
||||
document.querySelectorAll('.field-checkbox').forEach(checkbox => {
|
||||
checkbox.checked = false;
|
||||
});
|
||||
|
||||
// Check default fields
|
||||
const defaultFields = [
|
||||
'destinataer_name', 'betrag', 'faellig_am', 'status',
|
||||
'empfaenger_iban', 'empfaenger_name', 'beschreibung'
|
||||
];
|
||||
|
||||
defaultFields.forEach(fieldName => {
|
||||
const checkbox = document.getElementById('field_' + fieldName);
|
||||
if (checkbox) checkbox.checked = true;
|
||||
});
|
||||
}
|
||||
|
||||
// Bulk selection functions
|
||||
function toggleAllCheckboxes() {
|
||||
const selectAll = document.getElementById('selectAll');
|
||||
const checkboxes = document.querySelectorAll('.entry-checkbox');
|
||||
|
||||
checkboxes.forEach(checkbox => {
|
||||
checkbox.checked = selectAll.checked;
|
||||
});
|
||||
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function updateSelectedCount() {
|
||||
const selectedCheckboxes = document.querySelectorAll('.entry-checkbox:checked');
|
||||
const count = selectedCheckboxes.length;
|
||||
|
||||
document.getElementById('selected-count').textContent = count;
|
||||
|
||||
// Update the select all checkbox state
|
||||
const selectAll = document.getElementById('selectAll');
|
||||
const allCheckboxes = document.querySelectorAll('.entry-checkbox');
|
||||
|
||||
if (count === 0) {
|
||||
selectAll.indeterminate = false;
|
||||
selectAll.checked = false;
|
||||
} else if (count === allCheckboxes.length) {
|
||||
selectAll.indeterminate = false;
|
||||
selectAll.checked = true;
|
||||
} else {
|
||||
selectAll.indeterminate = true;
|
||||
}
|
||||
|
||||
// Enable/disable the "selected only" radio button
|
||||
const scopeSelected = document.getElementById('scope_selected');
|
||||
const scopeSelectedLabel = scopeSelected.parentElement.querySelector('label');
|
||||
|
||||
if (count > 0) {
|
||||
scopeSelected.disabled = false;
|
||||
scopeSelectedLabel.classList.remove('text-muted');
|
||||
} else {
|
||||
scopeSelected.disabled = true;
|
||||
scopeSelected.checked = false;
|
||||
document.getElementById('scope_all').checked = true;
|
||||
scopeSelectedLabel.classList.add('text-muted');
|
||||
}
|
||||
}
|
||||
|
||||
// Export form handling
|
||||
document.getElementById('exportForm').addEventListener('submit', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
const formData = new FormData(this);
|
||||
const format = formData.get('format');
|
||||
const scope = formData.get('scope');
|
||||
|
||||
// Build query string for GET request with format
|
||||
const params = new URLSearchParams();
|
||||
params.append('format', format);
|
||||
|
||||
// Add selected fields to the URL
|
||||
formData.getAll('fields').forEach(field => {
|
||||
params.append('fields', field);
|
||||
});
|
||||
|
||||
// If scope is "selected", we need to POST the selected IDs
|
||||
if (scope === 'selected') {
|
||||
const selectedIds = [];
|
||||
document.querySelectorAll('.entry-checkbox:checked').forEach(checkbox => {
|
||||
selectedIds.push(checkbox.value);
|
||||
});
|
||||
|
||||
if (selectedIds.length === 0) {
|
||||
alert('Bitte wählen Sie mindestens einen Eintrag aus.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a temporary form for POST request
|
||||
const tempForm = document.createElement('form');
|
||||
tempForm.method = 'POST';
|
||||
tempForm.action = window.location.pathname + '?' + params.toString();
|
||||
tempForm.style.display = 'none';
|
||||
|
||||
// Add CSRF token
|
||||
const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
|
||||
const csrfInput = document.createElement('input');
|
||||
csrfInput.type = 'hidden';
|
||||
csrfInput.name = 'csrfmiddlewaretoken';
|
||||
csrfInput.value = csrfToken;
|
||||
tempForm.appendChild(csrfInput);
|
||||
|
||||
// Add selected IDs
|
||||
selectedIds.forEach(id => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'selected_entries';
|
||||
input.value = id;
|
||||
tempForm.appendChild(input);
|
||||
});
|
||||
|
||||
// Add fields
|
||||
formData.getAll('fields').forEach(field => {
|
||||
const input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'fields';
|
||||
input.value = field;
|
||||
tempForm.appendChild(input);
|
||||
});
|
||||
|
||||
document.body.appendChild(tempForm);
|
||||
tempForm.submit();
|
||||
document.body.removeChild(tempForm);
|
||||
} else {
|
||||
// For "all" scope, use GET request
|
||||
window.location.href = window.location.pathname + '?' + params.toString();
|
||||
}
|
||||
|
||||
// Close modal
|
||||
bootstrap.Modal.getInstance(document.getElementById('exportModal')).hide();
|
||||
});
|
||||
|
||||
// Initialize counts on page load
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
updateSelectedCount();
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,304 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ verpachtung }} - Verpachtung - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<!-- Header -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-handshake text-primary me-2"></i>
|
||||
Verpachtung: {{ verpachtung }}
|
||||
</h1>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:verpachtung_update' pk=verpachtung.pk %}" class="btn btn-warning me-2">
|
||||
<i class="fas fa-edit me-2"></i>Bearbeiten
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_export' pk=verpachtung.pk %}" class="btn btn-success me-2">
|
||||
<i class="fas fa-download me-2"></i>Export
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Main Content -->
|
||||
<div class="col-lg-8">
|
||||
<!-- Verpachtungs-Informationen -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>Verpachtungs-Informationen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p><strong>Status:</strong>
|
||||
{% if verpachtung.status == 'aktiv' %}
|
||||
<span class="badge bg-success">Aktiv</span>
|
||||
{% elif verpachtung.status == 'beendet' %}
|
||||
<span class="badge bg-secondary">Beendet</span>
|
||||
{% elif verpachtung.status == 'gekündigt' %}
|
||||
<span class="badge bg-danger">Gekündigt</span>
|
||||
{% else %}
|
||||
<span class="badge bg-warning">{{ verpachtung.get_status_display }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p><strong>Pachtbeginn:</strong> {{ verpachtung.pachtbeginn|date:"d.m.Y" }}</p>
|
||||
<p><strong>Pachtende:</strong>
|
||||
{% if verpachtung.pachtende %}
|
||||
{{ verpachtung.pachtende|date:"d.m.Y" }}
|
||||
{% else %}
|
||||
<span class="text-muted">Unbefristet</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p><strong>Verpachtete Fläche:</strong> {{ verpachtung.verpachtete_flaeche|floatformat:2 }} qm
|
||||
<small class="text-muted">({{ verpachtung.verpachtete_flaeche_hektar|floatformat:2 }} ha)</small></p>
|
||||
<p><strong>Pachtzins (jährlich):</strong> €{{ verpachtung.pachtzins_jaehrlich|floatformat:2 }}</p>
|
||||
<p><strong>Kündigungsfrist:</strong> {{ verpachtung.kuendigungsfrist }} Monate</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Pächter-Informationen -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-user-tie me-2"></i>Pächter-Informationen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p><strong>Name:</strong>
|
||||
<a href="{% url 'stiftung:paechter_detail' pk=verpachtung.paechter.pk %}">
|
||||
{{ verpachtung.paechter.get_full_name }}
|
||||
</a>
|
||||
</p>
|
||||
<p><strong>Pachtnummer:</strong>
|
||||
{% if verpachtung.paechter.pachtnummer %}
|
||||
{{ verpachtung.paechter.pachtnummer }}
|
||||
{% else %}
|
||||
<span class="text-muted">Nicht vergeben</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p><strong>Landwirtschaftliche Ausbildung:</strong>
|
||||
{% if verpachtung.paechter.landwirtschaftliche_ausbildung %}
|
||||
<span class="badge bg-success">Ja</span>
|
||||
{% else %}
|
||||
<span class="badge bg-warning">Nein</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p><strong>Berufserfahrung:</strong>
|
||||
{% if verpachtung.paechter.berufserfahrung_jahre %}
|
||||
{{ verpachtung.paechter.berufserfahrung_jahre }} Jahre
|
||||
{% else %}
|
||||
<span class="text-muted">Nicht angegeben</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p><strong>Kontakt:</strong>
|
||||
{% if verpachtung.paechter.telefon %}
|
||||
<i class="fas fa-phone me-1"></i>{{ verpachtung.paechter.telefon }}<br>
|
||||
{% endif %}
|
||||
{% if verpachtung.paechter.email %}
|
||||
<i class="fas fa-envelope me-1"></i>{{ verpachtung.paechter.email }}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Verknüpfte Dokumente -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-file-alt me-2"></i>Verknüpfte Dokumente
|
||||
</h5>
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-light btn-sm">
|
||||
<i class="fas fa-plus me-1"></i>Dokument verknüpfen
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if verknuepfte_dokumente %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Dokument</th>
|
||||
<th>Kontext</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for dokument in verknuepfte_dokumente %}
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ dokument.titel }}</strong>
|
||||
<br>
|
||||
<small class="text-muted">ID: {{ dokument.paperless_document_id }}</small>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-secondary">{{ dokument.get_kontext_display }}</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if dokument.beschreibung %}
|
||||
{{ dokument.beschreibung|truncatewords:10 }}
|
||||
{% else %}
|
||||
<span class="text-muted">Keine Beschreibung</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<a href="{{ dokument.get_paperless_url }}" target="_blank" class="btn btn-sm btn-outline-primary" title="In Paperless öffnen">
|
||||
<i class="fas fa-external-link-alt"></i>
|
||||
</a>
|
||||
<a href="{{ dokument.get_paperless_thumbnail_url }}" target="_blank" class="btn btn-sm btn-outline-info" title="Thumbnail anzeigen">
|
||||
<i class="fas fa-image"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:dokument_update' dokument.pk %}" class="btn btn-sm btn-outline-warning" title="Bearbeiten">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:dokument_delete' dokument.pk %}" class="btn btn-sm btn-outline-danger" title="Verknüpfung löschen">
|
||||
<i class="fas fa-unlink"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-4">
|
||||
<i class="fas fa-file-alt fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine Dokumente verknüpft</h5>
|
||||
<p class="text-muted">Verknüpfen Sie Dokumente aus Paperless mit dieser Verpachtung.</p>
|
||||
<a href="{% url 'stiftung:dokument_management' %}" class="btn btn-success">
|
||||
<i class="fas fa-plus me-2"></i>Erstes Dokument verknüpfen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Länderei-Informationen -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-map me-2"></i>Länderei-Informationen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p><strong>Lfd. Nr.:</strong>
|
||||
<a href="{% url 'stiftung:land_detail' pk=verpachtung.land.pk %}">
|
||||
{{ verpachtung.land.lfd_nr }}
|
||||
</a>
|
||||
</p>
|
||||
<p><strong>Gemeinde:</strong> {{ verpachtung.land.gemeinde }}</p>
|
||||
<p><strong>Gemarkung:</strong> {{ verpachtung.land.gemarkung }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p><strong>Flur:</strong> {{ verpachtung.land.flur }}</p>
|
||||
<p><strong>Flurstück:</strong> {{ verpachtung.land.flurstueck }}</p>
|
||||
<p><strong>Gesamtgröße:</strong> {{ verpachtung.land.groesse_qm|floatformat:2 }} qm</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Notizen -->
|
||||
{% if verpachtung.notizen %}
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-sticky-note me-2"></i>Notizen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ verpachtung.notizen|linebreaks }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="col-lg-4">
|
||||
<!-- Statistiken -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-chart-bar me-2"></i>Statistiken
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p><strong>Verpachtungsgrad:</strong>
|
||||
{% if verpachtung.land.groesse_qm > 0 %}
|
||||
{% widthratio verpachtung.verpachtete_flaeche verpachtung.land.groesse_qm 100 %}%
|
||||
{% else %}
|
||||
0%
|
||||
{% endif %}
|
||||
</p>
|
||||
<p><strong>Flächenanteil:</strong>
|
||||
{% if verpachtung.land.groesse_qm > 0 %}
|
||||
{% widthratio verpachtung.verpachtete_flaeche verpachtung.land.groesse_qm 100 %}%
|
||||
{% else %}
|
||||
0%
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aktionen -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-tools me-2"></i>Aktionen
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<a href="{% url 'stiftung:verpachtung_update' pk=verpachtung.pk %}" class="btn btn-warning btn-sm w-100 mb-2">
|
||||
<i class="fas fa-edit me-2"></i>Bearbeiten
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_export' pk=verpachtung.pk %}" class="btn btn-success btn-sm w-100 mb-2">
|
||||
<i class="fas fa-download me-2"></i>Export
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_delete' pk=verpachtung.pk %}" class="btn btn-danger btn-sm w-100">
|
||||
<i class="fas fa-trash me-2"></i>Löschen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Informationen -->
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h6 class="card-title mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>Informationen
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p><strong>ID:</strong> <small class="text-muted">{{ verpachtung.pk }}</small></p>
|
||||
<p><strong>Erstellt:</strong> <small class="text-muted">{{ verpachtung.created_at|date:"d.m.Y H:i" }}</small></p>
|
||||
<p><strong>Zuletzt aktualisiert:</strong> <small class="text-muted">{{ verpachtung.updated_at|date:"d.m.Y H:i" }}</small></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,334 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ title }} - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<!-- Header -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-handshake text-primary me-2"></i>
|
||||
{{ title }}
|
||||
</h1>
|
||||
<div>
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left me-2"></i>Zurück zur Liste
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Form -->
|
||||
<div class="card shadow">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-edit me-2"></i>Verpachtungsdaten eingeben
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
|
||||
<!-- Error Messages -->
|
||||
{% if form.non_field_errors %}
|
||||
<div class="alert alert-danger">
|
||||
<ul class="mb-0">
|
||||
{% for error in form.non_field_errors %}
|
||||
<li>{{ error }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Vertragsdaten -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="fas fa-file-contract me-2"></i>Vertragsdaten
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.vertragsnummer.id_for_label }}" class="form-label">
|
||||
{{ form.vertragsnummer.label }} *
|
||||
</label>
|
||||
{{ form.vertragsnummer }}
|
||||
{% if form.vertragsnummer.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.vertragsnummer.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.status.id_for_label }}" class="form-label">
|
||||
{{ form.status.label }} *
|
||||
</label>
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.status.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Länderei und Pächter -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="fas fa-map me-2"></i>Länderei und Pächter
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.land.id_for_label }}" class="form-label">
|
||||
{{ form.land.label }} *
|
||||
</label>
|
||||
{{ form.land }}
|
||||
{% if form.land.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.land.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.paechter.id_for_label }}" class="form-label">
|
||||
{{ form.paechter.label }} *
|
||||
</label>
|
||||
{{ form.paechter }}
|
||||
{% if form.paechter.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.paechter.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Zeitraum -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="fas fa-calendar me-2"></i>Zeitraum
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.pachtbeginn.id_for_label }}" class="form-label">
|
||||
{{ form.pachtbeginn.label }} *
|
||||
</label>
|
||||
<input type="date"
|
||||
name="{{ form.pachtbeginn.name }}"
|
||||
value="{% if form.pachtbeginn.value %}{{ form.pachtbeginn.value|date:'Y-m-d' }}{% endif %}"
|
||||
class="form-control"
|
||||
id="{{ form.pachtbeginn.id_for_label }}">
|
||||
{% if form.pachtbeginn.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.pachtbeginn.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.pachtende.id_for_label }}" class="form-label">
|
||||
{{ form.pachtende.label }} *
|
||||
</label>
|
||||
<input type="date"
|
||||
name="{{ form.pachtende.name }}"
|
||||
value="{% if form.pachtende.value %}{{ form.pachtende.value|date:'Y-m-d' }}{% endif %}"
|
||||
class="form-control"
|
||||
id="{{ form.pachtende.id_for_label }}">
|
||||
{% if form.pachtende.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.pachtende.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.verlaengerung.id_for_label }}" class="form-label">
|
||||
{{ form.verlaengerung.label }}
|
||||
</label>
|
||||
<input type="date"
|
||||
name="{{ form.verlaengerung.name }}"
|
||||
value="{% if form.verlaengerung.value %}{{ form.verlaengerung.value|date:'Y-m-d' }}{% endif %}"
|
||||
class="form-control"
|
||||
id="{{ form.verlaengerung.id_for_label }}">
|
||||
{% if form.verlaengerung.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.verlaengerung.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Finanzielle Bedingungen -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="fas fa-euro-sign me-2"></i>Finanzielle Bedingungen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.pachtzins_pro_qm.id_for_label }}" class="form-label">
|
||||
{{ form.pachtzins_pro_qm.label }} *
|
||||
</label>
|
||||
{{ form.pachtzins_pro_qm }}
|
||||
{% if form.pachtzins_pro_qm.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.pachtzins_pro_qm.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.pachtzins_jaehrlich.id_for_label }}" class="form-label">
|
||||
{{ form.pachtzins_jaehrlich.label }} *
|
||||
</label>
|
||||
{{ form.pachtzins_jaehrlich }}
|
||||
{% if form.pachtzins_jaehrlich.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.pachtzins_jaehrlich.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.verpachtete_flaeche.id_for_label }}" class="form-label">
|
||||
{{ form.verpachtete_flaeche.label }} *
|
||||
</label>
|
||||
{{ form.verpachtete_flaeche }}
|
||||
{% if form.verpachtete_flaeche.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.verpachtete_flaeche.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dokumentation -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="fas fa-file-alt me-2"></i>Dokumentation
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.verwendungsnachweis.id_for_label }}" class="form-label">
|
||||
{{ form.verwendungsnachweis.label }}
|
||||
</label>
|
||||
{{ form.verwendungsnachweis }}
|
||||
{% if form.verwendungsnachweis.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.verwendungsnachweis.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.bemerkungen.id_for_label }}" class="form-label">
|
||||
{{ form.bemerkungen.label }}
|
||||
</label>
|
||||
{{ form.bemerkungen }}
|
||||
{% if form.bemerkungen.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{% for error in form.bemerkungen.errors %}
|
||||
{{ error }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Submit Buttons -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<hr class="my-4">
|
||||
<div class="d-flex justify-content-between">
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-times me-2"></i>Abbrechen
|
||||
</a>
|
||||
<button type="submit" class="btn btn-success">
|
||||
<i class="fas fa-save me-2"></i>
|
||||
{% if verpachtung %}Aktualisieren{% else %}Erstellen{% endif %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
// Auto-calculate annual rent from area and per-square-meter rate
|
||||
function calculateAnnualRent() {
|
||||
const area = parseFloat(document.getElementById('{{ form.verpachtete_flaeche.id_for_label }}').value) || 0;
|
||||
const ratePerSqm = parseFloat(document.getElementById('{{ form.pachtzins_pro_qm.id_for_label }}').value) || 0;
|
||||
|
||||
if (area > 0 && ratePerSqm > 0) {
|
||||
const annualRent = area * ratePerSqm;
|
||||
document.getElementById('{{ form.pachtzins_jaehrlich.id_for_label }}').value = annualRent.toFixed(2);
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-calculate per-square-meter rate from annual rent and area
|
||||
function calculateRatePerSqm() {
|
||||
const area = parseFloat(document.getElementById('{{ form.verpachtete_flaeche.id_for_label }}').value) || 0;
|
||||
const annualRent = parseFloat(document.getElementById('{{ form.pachtzins_jaehrlich.id_for_label }}').value) || 0;
|
||||
|
||||
if (area > 0 && annualRent > 0) {
|
||||
const ratePerSqm = annualRent / area;
|
||||
document.getElementById('{{ form.pachtzins_pro_qm.id_for_label }}').value = ratePerSqm.toFixed(4);
|
||||
}
|
||||
}
|
||||
|
||||
// Add event listeners
|
||||
document.getElementById('{{ form.verpachtete_flaeche.id_for_label }}').addEventListener('input', calculateAnnualRent);
|
||||
document.getElementById('{{ form.pachtzins_pro_qm.id_for_label }}').addEventListener('input', calculateAnnualRent);
|
||||
document.getElementById('{{ form.pachtzins_jaehrlich.id_for_label }}').addEventListener('input', calculateRatePerSqm);
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -1,238 +0,0 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Verpachtungen - Stiftungsverwaltung{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<!-- Header -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3">
|
||||
<i class="fas fa-handshake text-primary me-2"></i>Verpachtungen
|
||||
</h1>
|
||||
<a href="{% url 'stiftung:verpachtung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Neue Verpachtung
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Cards -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-primary text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Aktive Verpachtungen</h5>
|
||||
<h3 class="card-text">{{ aktive_verpachtungen|default:"0" }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-success text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Gesamtfläche</h5>
|
||||
<h3 class="card-text">{{ gesamt_flaeche|default:"0"|floatformat:0 }} qm</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-info text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Jährlicher Pachtzins</h5>
|
||||
<h3 class="card-text">€{{ jaehrlicher_pachtzins|default:"0"|floatformat:0 }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card bg-warning text-white">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Anzahl</h5>
|
||||
<h3 class="card-text">{{ page_obj.paginator.count|default:"0" }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filters -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-filter me-2"></i>Filter
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="get" class="row g-3">
|
||||
<div class="col-md-3">
|
||||
<label for="search" class="form-label">Suche</label>
|
||||
<input type="text" name="search" id="search" class="form-control" value="{{ search_query }}" placeholder="Vertragsnummer, Gemeinde, Pächter">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label for="status" class="form-label">Status</label>
|
||||
<select name="status" id="status" class="form-select">
|
||||
<option value="">Alle Status</option>
|
||||
{% for status in status_choices %}
|
||||
<option value="{{ status.0 }}" {% if status_filter == status.0 %}selected{% endif %}>{{ status.1 }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="gemeinde" class="form-label">Gemeinde</label>
|
||||
<select name="gemeinde" id="gemeinde" class="form-select">
|
||||
<option value="">Alle Gemeinden</option>
|
||||
{% for gemeinde in gemeinden %}
|
||||
<option value="{{ gemeinde }}" {% if gemeinde_filter == gemeinde %}selected{% endif %}>{{ gemeinde }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary me-2">
|
||||
<i class="fas fa-search me-2"></i>Filtern
|
||||
</button>
|
||||
<a href="{% url 'stiftung:verpachtung_list' %}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-times me-2"></i>Zurücksetzen
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Verpachtungen Table -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-list me-2"></i>Verpachtungen
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if page_obj %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<a href="?sort=vertragsnummer&dir={% if sort == 'vertragsnummer' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Vertragsnummer</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=land&dir={% if sort == 'land' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Länderei</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=paechter&dir={% if sort == 'paechter' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Pächter</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=beginn&dir={% if sort == 'beginn' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Beginn</a>/<a href="?sort=ende&dir={% if sort == 'ende' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Ende</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=flaeche&dir={% if sort == 'flaeche' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Fläche</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=pachtzins&dir={% if sort == 'pachtzins' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Pachtzins</a>
|
||||
</th>
|
||||
<th>
|
||||
<a href="?sort=status&dir={% if sort == 'status' and dir != 'desc' %}desc{% else %}asc{% endif %}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}">Status</a>
|
||||
</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for verpachtung in page_obj %}
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ verpachtung.vertragsnummer }}</strong>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'stiftung:land_detail' verpachtung.land.pk %}">
|
||||
{{ verpachtung.land.gemeinde }}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'stiftung:paechter_detail' verpachtung.paechter.pk %}">
|
||||
{{ verpachtung.paechter.get_full_name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{{ verpachtung.pachtbeginn|date:"d.m.Y" }} - {{ verpachtung.pachtende|date:"d.m.Y" }}
|
||||
{% if verpachtung.verlaengerung %}
|
||||
<br><small class="text-muted">Verlängert bis: {{ verpachtung.verlaengerung|date:"d.m.Y" }}</small>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ verpachtung.verpachtete_flaeche|floatformat:2 }} qm
|
||||
<br>
|
||||
<small class="text-muted">({{ verpachtung.verpachtete_flaeche_hektar|floatformat:2 }} ha)</small>
|
||||
</td>
|
||||
<td>€{{ verpachtung.pachtzins_jaehrlich|floatformat:2 }}/Jahr</td>
|
||||
<td>
|
||||
<span class="badge bg-{% if verpachtung.status == 'aktiv' %}success{% elif verpachtung.status == 'beendet' %}secondary{% elif verpachtung.status == 'gekuendigt' %}danger{% else %}warning{% endif %}">
|
||||
{{ verpachtung.get_status_display }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group" role="group">
|
||||
<a href="{% url 'stiftung:verpachtung_detail' verpachtung.pk %}" class="btn btn-sm btn-outline-primary">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_update' verpachtung.pk %}" class="btn btn-sm btn-outline-warning">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'stiftung:verpachtung_delete' verpachtung.pk %}" class="btn btn-sm btn-outline-danger">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
{% if page_obj.has_other_pages %}
|
||||
<nav aria-label="Verpachtungen Pagination">
|
||||
<ul class="pagination justify-content-center">
|
||||
{% if page_obj.has_previous %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ page_obj.previous_page_number }}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}{% if sort %}&sort={{ sort }}&dir={{ dir }}{% endif %}">
|
||||
<i class="fas fa-chevron-left"></i>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% for num in page_obj.paginator.page_range %}
|
||||
{% if page_obj.number == num %}
|
||||
<li class="page-item active">
|
||||
<span class="page-link">{{ num }}</span>
|
||||
</li>
|
||||
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ num }}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}{% if sort %}&sort={{ sort }}&dir={{ dir }}{% endif %}">{{ num }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if page_obj.has_next %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ page_obj.next_page_number }}{% if search_query %}&search={{ search_query }}{% endif %}{% if status_filter %}&status={{ status_filter }}{% endif %}{% if gemeinde_filter %}&gemeinde={{ gemeinde_filter }}{% endif %}{% if sort %}&sort={{ sort }}&dir={{ dir }}{% endif %}">
|
||||
<i class="fas fa-chevron-right"></i>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
<div class="text-center py-5">
|
||||
<i class="fas fa-handshake fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine Verpachtungen gefunden</h5>
|
||||
<p class="text-muted">Erstellen Sie Ihre erste Verpachtung oder passen Sie die Filter an.</p>
|
||||
<a href="{% url 'stiftung:verpachtung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Neue Verpachtung erstellen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
126
app/templates/stiftung/wiederkehrende_unterstuetzungen.html
Normal file
126
app/templates/stiftung/wiederkehrende_unterstuetzungen.html
Normal file
@@ -0,0 +1,126 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
{% block content %}
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:dashboard' %}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'stiftung:unterstuetzungen_all' %}">Unterstützungen</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h2>{{ title }}</h2>
|
||||
<div class="btn-group">
|
||||
<a href="{% url 'stiftung:unterstuetzungen_all' %}" class="btn btn-outline-primary">
|
||||
<i class="fas fa-list me-2"></i>Alle Unterstützungen
|
||||
</a>
|
||||
<a href="?cleanup=1" class="btn btn-outline-warning"
|
||||
onclick="return confirm('Möchten Sie wirklich alle verwaisten Zahlungsvorlagen löschen? Dies können Vorlagen sein, deren zugehörige Unterstützungen bereits gelöscht wurden.')">
|
||||
<i class="fas fa-broom me-2"></i>Verwaiste bereinigen
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-sync-alt me-2"></i>Wiederkehrende Zahlungsvorlagen
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if templates %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Destinatär</th>
|
||||
<th>Betrag</th>
|
||||
<th>Intervall</th>
|
||||
<th>Nächste Generierung</th>
|
||||
<th>Status</th>
|
||||
<th>Zahlungen</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for template in templates %}
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ template.destinataer.get_full_name }}</strong>
|
||||
{% if template.beschreibung %}
|
||||
<br><small class="text-muted">{{ template.beschreibung }}</small>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-success fw-bold">€{{ template.betrag|floatformat:2 }}</td>
|
||||
<td>
|
||||
<span class="badge bg-secondary">{{ template.get_intervall_display }}</span>
|
||||
</td>
|
||||
<td>{{ template.naechste_generierung|date:"d.m.Y" }}</td>
|
||||
<td>
|
||||
{% if template.aktiv %}
|
||||
<span class="badge bg-success">Aktiv</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">Inaktiv</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if template.aktive_zahlungen > 0 %}
|
||||
<span class="badge bg-info">{{ template.aktive_zahlungen }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-warning text-dark">0</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="{% url 'stiftung:destinataer_detail' pk=template.destinataer.pk %}"
|
||||
class="btn btn-outline-primary" title="Destinatär anzeigen">
|
||||
<i class="fas fa-user"></i>
|
||||
</a>
|
||||
{% if template.empfaenger_iban %}
|
||||
<button class="btn btn-outline-info" title="IBAN kopieren"
|
||||
onclick="navigator.clipboard.writeText('{{ template.empfaenger_iban }}'); alert('IBAN kopiert!');">
|
||||
<i class="fas fa-copy"></i>
|
||||
</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center py-5">
|
||||
<i class="fas fa-sync-alt fa-3x text-muted mb-3"></i>
|
||||
<h5 class="text-muted">Keine wiederkehrenden Zahlungen vorhanden</h5>
|
||||
<p class="text-muted">
|
||||
Erstellen Sie eine neue Unterstützung mit der Option "Wiederkehrende Zahlung"
|
||||
um automatische Zahlungen zu generieren.
|
||||
</p>
|
||||
<a href="{% url 'stiftung:unterstuetzung_create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Neue Unterstützung erstellen
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if templates %}
|
||||
<div class="mt-4">
|
||||
<div class="alert alert-info">
|
||||
<h6><i class="fas fa-info-circle me-2"></i>Hinweise zu wiederkehrenden Zahlungen:</h6>
|
||||
<ul class="mb-0">
|
||||
<li>Wiederkehrende Zahlungen werden automatisch basierend auf dem eingestellten Intervall generiert</li>
|
||||
<li>Die nächste Generierung erfolgt am angegebenen Datum</li>
|
||||
<li>Deaktivierte Vorlagen generieren keine neuen Zahlungen</li>
|
||||
<li>Jede generierte Zahlung kann individual bearbeitet werden</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user