feat: Implement quarterly confirmation system with automatic support payments
- Add VierteljahresNachweis model for quarterly document tracking - Remove studiennachweis_erforderlich field (now always required) - Fix modal edit view to include studiennachweis section - Implement automatic DestinataerUnterstuetzung creation when requirements met - Set payment due dates to exact quarter end dates (Mar 31, Jun 30, Sep 30, Dec 31) - Add quarterly confirmation CRUD views with modal and full-screen editing - Update templates with comprehensive quarterly management interface - Include proper validation, status tracking, and progress indicators
This commit is contained in:
@@ -25,6 +25,71 @@
|
||||
--orange-dark: #e8590c;
|
||||
}
|
||||
|
||||
/* Global Typography - More Compact */
|
||||
html {
|
||||
font-size: 14px; /* Reduced from default 16px */
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 0.875rem; /* 12.25px */
|
||||
line-height: 1.4;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.h1, .h2, .h3, .h4, .h5, .h6,
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: 600;
|
||||
line-height: 1.3;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.h1, h1 { font-size: 2rem; }
|
||||
.h2, h2 { font-size: 1.65rem; }
|
||||
.h3, h3 { font-size: 1.4rem; }
|
||||
.h4, h4 { font-size: 1.15rem; }
|
||||
.h5, h5 { font-size: 1rem; }
|
||||
.h6, h6 { font-size: 0.875rem; }
|
||||
|
||||
/* Compact spacing */
|
||||
.container, .container-fluid, .container-lg {
|
||||
padding-left: 0.75rem;
|
||||
padding-right: 0.75rem;
|
||||
}
|
||||
|
||||
.row {
|
||||
margin-left: -0.5rem;
|
||||
margin-right: -0.5rem;
|
||||
}
|
||||
|
||||
.col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6,
|
||||
.col-7, .col-8, .col-9, .col-10, .col-11, .col-12,
|
||||
.col-auto, .col-sm, .col-sm-auto, .col-md, .col-md-auto,
|
||||
.col-lg, .col-lg-auto, .col-xl, .col-xl-auto {
|
||||
padding-left: 0.5rem;
|
||||
padding-right: 0.5rem;
|
||||
}
|
||||
|
||||
/* Compact margins */
|
||||
.mb-1 { margin-bottom: 0.25rem !important; }
|
||||
.mb-2 { margin-bottom: 0.4rem !important; }
|
||||
.mb-3 { margin-bottom: 0.75rem !important; }
|
||||
.mb-4 { margin-bottom: 1rem !important; }
|
||||
.mb-5 { margin-bottom: 1.5rem !important; }
|
||||
|
||||
.mt-1 { margin-top: 0.25rem !important; }
|
||||
.mt-2 { margin-top: 0.4rem !important; }
|
||||
.mt-3 { margin-top: 0.75rem !important; }
|
||||
.mt-4 { margin-top: 1rem !important; }
|
||||
.mt-5 { margin-top: 1.5rem !important; }
|
||||
|
||||
.py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; }
|
||||
.py-2 { padding-top: 0.4rem !important; padding-bottom: 0.4rem !important; }
|
||||
.py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; }
|
||||
|
||||
.px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; }
|
||||
.px-2 { padding-left: 0.4rem !important; padding-right: 0.4rem !important; }
|
||||
.px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; }
|
||||
|
||||
.border-left-primary {
|
||||
border-left: 0.25rem solid var(--racing-green) !important;
|
||||
}
|
||||
@@ -47,7 +112,27 @@
|
||||
background-image: linear-gradient(180deg, var(--racing-green-light) 10%, var(--racing-green-dark) 100%);
|
||||
}
|
||||
|
||||
/* Navigation styling */
|
||||
/* Navigation styling - More Compact */
|
||||
.navbar {
|
||||
padding: 0.375rem 0;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-weight: 700;
|
||||
font-size: 1.1rem;
|
||||
color: white !important;
|
||||
padding: 0.375rem 0;
|
||||
}
|
||||
|
||||
.navbar-nav .nav-link,
|
||||
.navbar-nav .nav-link.dropdown-toggle {
|
||||
padding: 0.375rem 0.5rem !important;
|
||||
display: inline-flex !important;
|
||||
align-items: center !important;
|
||||
white-space: nowrap !important;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.navbar-dark .navbar-nav .nav-link {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
@@ -56,31 +141,46 @@
|
||||
color: var(--orange-light);
|
||||
}
|
||||
|
||||
/* Ensure all nav links have consistent alignment */
|
||||
.navbar-nav .nav-link,
|
||||
.navbar-nav .nav-link.dropdown-toggle {
|
||||
padding: 0.5rem 0.75rem !important;
|
||||
display: inline-flex !important;
|
||||
align-items: center !important;
|
||||
white-space: nowrap !important;
|
||||
/* Dropdown menus - More Compact */
|
||||
.dropdown-menu {
|
||||
border: 1px solid #dee2e6;
|
||||
box-shadow: 0 0.25rem 0.5rem rgba(0, 66, 37, 0.15);
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-weight: 700;
|
||||
font-size: 1.5rem;
|
||||
color: white !important;
|
||||
.dropdown-item {
|
||||
padding: 0.375rem 0.75rem;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
/* Cards and content */
|
||||
.dropdown-item:hover {
|
||||
background-color: rgba(0, 66, 37, 0.1);
|
||||
color: var(--racing-green-dark);
|
||||
}
|
||||
|
||||
.dropdown-header {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.75rem;
|
||||
}
|
||||
|
||||
/* Cards and content - More Compact */
|
||||
.card {
|
||||
border: 1px solid #e9ecef;
|
||||
box-shadow: 0 0.15rem 1.75rem 0 rgba(0, 66, 37, 0.1);
|
||||
box-shadow: 0 0.125rem 1rem 0 rgba(0, 66, 37, 0.08);
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding: 0.75rem;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
background-color: var(--grey-light);
|
||||
border-bottom: 1px solid #dee2e6;
|
||||
color: var(--racing-green-dark);
|
||||
padding: 0.5rem 0.75rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.card-header.bg-primary {
|
||||
@@ -103,7 +203,107 @@
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.card-title {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Tables - More Compact */
|
||||
.table {
|
||||
font-size: 0.8rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.table th {
|
||||
border-top: none;
|
||||
font-weight: 600;
|
||||
color: var(--racing-green-dark);
|
||||
background-color: var(--grey-light);
|
||||
padding: 0.5rem;
|
||||
font-size: 0.75rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.025em;
|
||||
}
|
||||
|
||||
.table td {
|
||||
padding: 0.5rem;
|
||||
border-top: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.table-sm th,
|
||||
.table-sm td {
|
||||
padding: 0.375rem;
|
||||
}
|
||||
|
||||
.table-light {
|
||||
background-color: var(--grey-light);
|
||||
}
|
||||
|
||||
/* Buttons - More Compact */
|
||||
.btn {
|
||||
font-size: 0.8rem;
|
||||
padding: 0.375rem 0.75rem;
|
||||
border-radius: 0.25rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 0.2rem;
|
||||
}
|
||||
|
||||
.btn-lg {
|
||||
font-size: 0.9rem;
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 0.3rem;
|
||||
}
|
||||
|
||||
/* Form Controls - More Compact */
|
||||
.form-control, .form-select {
|
||||
font-size: 0.8rem;
|
||||
padding: 0.375rem 0.5rem;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.form-control-sm, .form-select-sm {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.375rem;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
font-size: 0.8rem;
|
||||
font-weight: 500;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
.form-text {
|
||||
font-size: 0.7rem;
|
||||
margin-top: 0.15rem;
|
||||
}
|
||||
|
||||
.form-check-label {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
/* Badges - More Compact */
|
||||
.badge {
|
||||
font-size: 0.7rem;
|
||||
padding: 0.25em 0.5em;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Progress bars */
|
||||
.progress {
|
||||
height: 1rem;
|
||||
font-size: 0.65rem;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
line-height: 1rem;
|
||||
}
|
||||
.btn-primary {
|
||||
background-color: var(--racing-green);
|
||||
border-color: var(--racing-green);
|
||||
@@ -156,14 +356,70 @@
|
||||
border-color: var(--grey-medium);
|
||||
}
|
||||
|
||||
/* Table styling */
|
||||
.table th {
|
||||
border-top: none;
|
||||
font-weight: 600;
|
||||
color: var(--racing-green-dark);
|
||||
background-color: var(--grey-light);
|
||||
/* Alerts - More Compact */
|
||||
.alert {
|
||||
padding: 0.5rem 0.75rem;
|
||||
margin-bottom: 0.75rem;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.alert-success {
|
||||
background-color: rgba(0, 104, 55, 0.1);
|
||||
border-color: var(--racing-green-light);
|
||||
color: var(--racing-green-dark);
|
||||
}
|
||||
|
||||
.alert-warning {
|
||||
background-color: rgba(253, 126, 20, 0.1);
|
||||
border-color: var(--orange-accent);
|
||||
color: var(--orange-dark);
|
||||
}
|
||||
|
||||
/* Responsive adjustments for very compact design */
|
||||
@media (max-width: 768px) {
|
||||
html {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.navbar-nav .nav-link {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.375rem !important;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.5rem;
|
||||
}
|
||||
|
||||
.table {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.table th,
|
||||
.table td {
|
||||
padding: 0.375rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1400px) {
|
||||
.container-lg {
|
||||
max-width: 1400px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Table styling */
|
||||
.table-light {
|
||||
background-color: var(--grey-light);
|
||||
}
|
||||
@@ -190,6 +446,8 @@
|
||||
.pagination .page-link {
|
||||
color: var(--racing-green);
|
||||
border-color: #dee2e6;
|
||||
font-size: 0.8rem;
|
||||
padding: 0.375rem 0.5rem;
|
||||
}
|
||||
|
||||
.pagination .page-item.active .page-link {
|
||||
@@ -214,42 +472,20 @@
|
||||
/* Form controls */
|
||||
.form-control:focus {
|
||||
border-color: var(--racing-green-light);
|
||||
box-shadow: 0 0 0 0.2rem rgba(0, 66, 37, 0.25);
|
||||
box-shadow: 0 0 0 0.15rem rgba(0, 66, 37, 0.25);
|
||||
}
|
||||
|
||||
.form-select:focus {
|
||||
border-color: var(--racing-green-light);
|
||||
box-shadow: 0 0 0 0.2rem rgba(0, 66, 37, 0.25);
|
||||
}
|
||||
|
||||
/* Alerts */
|
||||
.alert-success {
|
||||
background-color: rgba(0, 104, 55, 0.1);
|
||||
border-color: var(--racing-green-light);
|
||||
color: var(--racing-green-dark);
|
||||
}
|
||||
|
||||
.alert-warning {
|
||||
background-color: rgba(253, 126, 20, 0.1);
|
||||
border-color: var(--orange-accent);
|
||||
color: var(--orange-dark);
|
||||
box-shadow: 0 0 0 0.15rem rgba(0, 66, 37, 0.25);
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.sticky-footer {
|
||||
background-color: var(--grey-light) !important;
|
||||
border-top: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
/* Dropdown menus */
|
||||
.dropdown-menu {
|
||||
border: 1px solid #dee2e6;
|
||||
box-shadow: 0 0.5rem 1rem rgba(0, 66, 37, 0.15);
|
||||
}
|
||||
|
||||
.dropdown-item:hover {
|
||||
background-color: rgba(0, 66, 37, 0.1);
|
||||
color: var(--racing-green-dark);
|
||||
padding: 0.75rem 0;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
/* Custom accent colors for specific elements */
|
||||
@@ -416,12 +652,12 @@
|
||||
<!-- Content Wrapper -->
|
||||
<div id="content-wrapper" class="d-flex flex-column">
|
||||
<!-- Main Content -->
|
||||
<div id="content" style="padding-top: 80px;">
|
||||
<div id="content" style="padding-top: 60px;">
|
||||
<!-- Messages -->
|
||||
{% if messages %}
|
||||
<div class="container-lg mx-auto mt-3" style="max-width: 1200px;">
|
||||
<div class="container-lg mx-auto mt-2" style="max-width: 1400px;">
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{% if message.tags == 'error' %}danger{% else %}{{ message.tags }}{% endif %} alert-dismissible fade show" role="alert">
|
||||
<div class="alert alert-{% if message.tags == 'error' %}danger{% else %}{{ message.tags }}{% endif %} alert-dismissible fade show" role="alert" style="padding: 0.5rem 0.75rem; font-size: 0.8rem;">
|
||||
{{ message }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
@@ -430,7 +666,7 @@
|
||||
{% endif %}
|
||||
|
||||
<!-- Page Content -->
|
||||
<div class="container-lg mx-auto" style="max-width: 1200px; padding: 20px;">
|
||||
<div class="container-lg mx-auto" style="max-width: 1400px; padding: 15px;">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user