Rechnungen mit Positionen: gleiche Nummer ergibt eine Sammelrechnung ueber mehrere Laufzeiten. PDF-Upload mit Inhaltspruefung und Ablage unter der Pruefsumme, Haekchen direkt in der Tabelle, Filter nach Status, Kunde und Jahr. 78 Tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1.9 KiB
1.9 KiB
#008 Laufzeiten und Rechnungen
Status: erledigt Meilenstein: v0.5.0 Labels: ui, backend, buchhaltung Geschätzt: 10 h Tatsächlich: 0 h 35 min
Ziel
Lizenzjahre mit Proxmox-Einkaufsrechnung und Kundenrechnung erfassen und den Status schnell pflegen.
Aufgaben
- Laufzeitvorschlag bei neuem
nextduedatebestätigen/verwerfen - Laufzeit manuell anlegen/bearbeiten
- Proxmox-Rechnung erfassen (auch Sammelrechnung über mehrere Laufzeiten), PDF-Upload
- Kundenrechnung erfassen (auch Sammelrechnung), PDF-Upload
- Marge pro Laufzeit, Kunde und Jahr berechnen
- Rechnungsübersicht: alle Laufzeiten, Umschalter „Proxmox bezahlt“ / „Kundenrechnung erstellt“ direkt in der Zeile, Filter Offen/Erledigt/Alle, Kunde, Zeitraum
- Sidebar-Badge offene Rechnungspunkte
- Aufgaben-Card auf dem Dashboard mit echten Aktionen
Akzeptanzkriterien
- Umschalten in der Tabelle wirkt sofort und wird im Audit-Log protokolliert
- Summen Einkauf/Verkauf/Marge stimmen mit Einzelwerten überein (Tests)
- Nur PDF bis 10 MB wird angenommen
Abhängigkeiten
#007
Notizen / Entscheidungen
- Sammelrechnungen ohne Extraschritt: Wer bei einer zweiten Laufzeit dieselbe Rechnungsnummer einträgt, hängt sie als weitere Position an die bestehende Rechnung. Der Rechnungsbetrag ist immer die Summe der Positionen, wird also automatisch nachgeführt.
- Das Häkchen „Kundenrechnung erstellt“ legt bei fehlender Rechnung eine ohne Nummer an; Nummer und Betrag lassen sich später nachtragen, ohne dass eine zweite Rechnung entsteht.
- Das Erfassen einer Proxmox-Rechnung bestätigt einen Laufzeit-Vorschlag automatisch.
- PDFs werden unter ihrer Prüfsumme abgelegt (
UPLOAD_DIR, Standard./data/uploads). Geprüft wird der Dateianfang, nicht der gemeldete Typ – eine umbenannte Datei wird abgelehnt. Dieselbe Datei belegt nur einmal Platz.