|
|
9394bab1fb
|
Big Sweep: Security + Race-Conditions + Tests + DSGVO + A11y, SW by-v1095
SECURITY (auth.py, routes/auth.py, database.py, main.py)
- JWT bekommt jti; Logout trägt in neue jwt_blacklist-Tabelle ein,
decode_token() prüft → server-side Invalidierung
- JWT-Expiry default 30 → 7 Tage (ENV JWT_EXPIRY_DAYS überschreibt)
- Sliding-Refresh-Middleware: erneuert Cookie wenn >50% verbraucht
(Schwelle via JWT_REFRESH_FRACTION, Default 2)
- Login-Lockout in DB-Tabelle login_attempts (5 Versuche / 15 Min,
überlebt Container-Restart) — alte In-Memory-Lockouts ersetzt
- SMTP-Versand: alle 'except: pass' durch logger.exception ersetzt;
Fehlversuche landen in failed_emails-Tabelle für späteres Retry
- Referral-Counter Race gefixt: UPDATE partner_codes SET uses=uses+1
... WHERE uses<max_uses RETURNING — atomar statt SELECT+UPDATE
RACE CONDITIONS (routes/invoices.py, database.py)
- Neue invoice_counters-Tabelle für atomare Nummernvergabe
- _next_invoice_number nutzt BEGIN IMMEDIATE + atomares UPDATE
- Funktioniert für RG- und ST-Prefixe (Stornorechnungen)
- Race-Test verifiziert (5 Threads × 20 Calls = 100 eindeutige Nummern)
VERSION + TESTS + ERROR-DIGEST (VERSION, Makefile, tests/, scheduler.py)
- Neue VERSION-Datei (Single Source of Truth) — main.py liest beim
Startup
- Makefile-Target 'make bump' propagiert in sw.js, app.js, index.html
- Makefile-Target 'make test' setzt venv auf, läuft pytest
- 19 Smoke-Tests in tests/ (health, auth, diary, invoice) — alle grün
- Scheduler: täglicher _job_error_digest um 06:30 → schickt Error-
Zusammenfassung an ADMIN_EMAIL (still wenn keine Errors)
DSGVO + A11Y + ERSTE-HILFE
- landing.html: 'HTML und ODS' → 'JSON' (tatsächlich implementiert)
- datenschutz.js: Sektion Account-Löschung erweitert (sofort gelöscht /
anonymisiert / 10 Jahre für Rechnungen)
- erste-hilfe.js: prominentes Warning-Banner oben (ersetzt keine
Tierarzt-Beratung); Notfallnummern gruppiert nach Land, TODO-Platz-
halter für AT-Uni-Klinik, CH Tox Info Suisse, CH Tierspital Zürich
- ui.js Modal: ESC schließt, Focus-Trap, Auto-Focus erstes Element,
Restore Focus auf vorigen Caller
- impressum.js Kontaktformular: Labels mit for=cf-name etc.
NEUE DB-TABELLEN (idempotent via CREATE TABLE IF NOT EXISTS)
- jwt_blacklist, login_attempts, failed_emails, invoice_counters
NEUE ENV-VARS
- JWT_REFRESH_FRACTION (Default 2)
- JWT_EXPIRY_DAYS Default geändert (30 → 7)
|
2026-05-26 20:12:01 +02:00 |
|
|
|
c59326af17
|
Fix+Polish: Phosphor-Icons Danke-Overlay, Quartalsbericht paid_amount
Giftköder Danke-Overlay (poison.js):
- Emoji 🚨/🐾/📡 durch Phosphor-Icons ersetzt: siren, paw-print, wifi-slash
Quartalsbericht (invoices.py + admin.js):
- Backend: _effective_gross() — für bezahlte Rechnungen wird paid_amount statt
amount_gross für die Quartalssumme verwendet (Kulanz/Teilzahlung korrekt)
- Admin-Preview: effectiveAmt in der Vorschau-Tabelle, bei Abweichung Hinweis
"(RG: xx,xx €)" für Nachvollziehbarkeit
- CSV: Spalte "Betrag (eingegangen)" + separate Spalte "Rechnungsbetrag"
- SW by-v995, APP_VER 995
|
2026-05-15 18:18:22 +02:00 |
|
|
|
e714580d77
|
Feat: Cashflow auf paid_amount, Differenz-Badge, Kulanz-Abschreibung im Bezahlt-Modal (SW by-v984)
|
2026-05-15 16:06:08 +02:00 |
|
|
|
0f6b5afd6a
|
Fix: Syntaxfehler in invoices.py — fehlende schließende Klammer bei _s()
|
2026-05-15 15:56:25 +02:00 |
|
|
|
68fd9c0e38
|
Fix: En-Dash in PDF durch Bindestrich ersetzen + _s() Sanitizer für alle Texteingaben (SW by-v982)
|
2026-05-15 15:50:02 +02:00 |
|
|
|
49e01683ad
|
Fix: 'Fällig bis' Umlaut korrigiert im PDF-Info-Block
|
2026-05-15 13:51:26 +02:00 |
|
|
|
ed6dd8da13
|
Fix: Quartalssumme korrekt (alle inkl. Storno), Netto ausgeblendet (SW by-v977)
|
2026-05-15 13:38:08 +02:00 |
|
|
|
6104132714
|
Feat: Quartalsbericht — Stornozeilen mit Minusbeträgen, nach Datum sortiert, Summen netten sich heraus (SW by-v976)
|
2026-05-15 13:27:05 +02:00 |
|
|
|
b10b3140eb
|
Fix: Stornorechnung referenziert Originalnummer + Datum (§14 UStG Pflicht)
|
2026-05-15 13:18:32 +02:00 |
|
|
|
cabb2fd6f7
|
Fix: iOS Modal scrollIntoView bei Tastatur; CSV Stornierte mit 0€ + Stornonummer (SW by-v975)
|
2026-05-15 13:15:49 +02:00 |
|
|
|
8f3d639e34
|
Fix: Stornierte/Entwurfs-Rechnungen aus Quartalsbericht und Cashflow-Summen ausgeschlossen
|
2026-05-15 12:49:04 +02:00 |
|
|
|
b14a251bdc
|
Feat: Entwurf bearbeiten (PATCH), erneut senden; SW by-v968
|
2026-05-15 11:33:48 +02:00 |
|
|
|
a2d089bce4
|
Fix: SMTP_SUPPORT_PASS Fallback in mailer, scaninput Logging
|
2026-05-15 11:29:16 +02:00 |
|
|
|
41a4808ad5
|
Fix: Storno sendet PDF+Mail+Scaninput; /scaninput Volume in staging ergänzt
|
2026-05-15 11:18:48 +02:00 |
|
|
|
8e36eb0611
|
Fix: PDF — breiter Header-Balken mit Logo, eine Seite, Hinweis-Prefix, Footer fix
|
2026-05-15 11:13:28 +02:00 |
|
|
|
95b70d5119
|
Fix: Rechnungs-PDF komplett neu — DIN-5008-Layout, Überlagerung behoben, Bankverbindung, Footer, Deutsche Formatierung
|
2026-05-15 10:45:49 +02:00 |
|
|
|
b68a12587a
|
Feature: Rechnungs-System (invoices) — Backend komplett
- DB-Migration: invoices + invoice_items Tabellen inkl. Indizes
- routes/invoices.py: vollständiger Admin-Router (prefix /api/admin/invoices)
- CRUD: Liste, Detail, Erstellen, Senden, Bezahlen, Stornieren
- PDF-Generierung via fpdf2 mit §14-UStG-Pflichtangaben (Kleinunternehmer-Hinweis)
- Cashflow-Übersicht und Quartalsbericht
- PDF-Download-Endpunkt
- Speicherung in /scaninput + optionaler Paperless-Upload
- mailer.py: send_email() + Backends um optionale PDF-Anhänge erweitert
(Brevo: base64, SMTP: MIMEApplication)
- main.py: invoices_router registriert
- docker-compose.yml: /volume1/scaninput:/scaninput Volume hinzugefügt
|
2026-05-15 10:04:23 +02:00 |
|