mahnung/README.md
Eduard Wisch d49bd9ebda
All checks were successful
Deploy mahnung / deploy (push) Has been skipped
Docs: README, CHANGELOG, CLAUDE.md aktualisiert, Version 0.2.0
- README.md: ODT-Template-System, Widget, Dokumentenmodelle, Template-Variablen, aktualisierter Dateibaum
- CHANGELOG.md: Neuer Block [0.2.0] mit allen Aenderungen seit Erstrelease
- CLAUDE.md: Projektanweisungen fuer zukuenftige Sessions
- modMahnung: Version 0.1.0 → 0.2.0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-10 21:37:44 +02:00

171 lines
7.5 KiB
Markdown

# Modul Mahnung — 3-stufiges Mahnwesen für Dolibarr
Mahnwesen-Modul für Dolibarr ERP: tägliche Vorschlagsliste überfälliger Rechnungen, 3-stufiger Workflow (Erinnerung → Mahnung → Letzte Mahnung), Mahngebühren + tagesgenaue Verzugszinsen nach **BGB §288**, PDF- und ODT-Mahnschreiben, E-Mail-Versand, Sammelbrief, Trigger auf Zahlungseingang.
## Status
Version **0.2.0** — ODT-Template-System, Widget, Dokumentenmodell-Verwaltung.
## Features
| Feature | Implementierung |
|---|---|
| Tägliche Vorschlagsliste überfälliger Rechnungen | Cron `MahnungCronBuildVorschlag` (default deaktiviert) |
| Push-Benachrichtigung mit Anzahl je Stufe | Ntfy + GlobalNotify |
| 3 Stufen pflegbar (Frist, neue Frist, Gebühr B2C/B2B, Versandart, E-Mail-Template, PDF-Intro) | `admin/setup.php` |
| B2C / B2B-Erkennung | über `llx_societe.tva_intra` |
| Verzugszinsen | tagesgenau, B2C: Basiszins +5 %, B2B: +9 %; Override pro Stufe möglich |
| §288 Abs. 5 Pauschale 40 € | nur bei B2B, einmalig pro Rechnung |
| PDF-Mahnschreiben (DIN 5008) | Standard-TCPDF-Generator `pdf_standard_mahnung` |
| ODT-Mahnschreiben (je Stufe) | ODT-Template-Generator `doc_generic_mahnung_odt` mit Stufen-Auswahl |
| Dokumentenmodell-Verwaltung | Setup-Seite: Modelle aktivieren, Default wählen, ODT-Templates hochladen |
| Template-Variablen-Referenz | `admin/templatevars.php` — alle verfügbaren ODT-Variablen |
| Dokumentenliste auf Mahnungs-Karte | Vorschau (Lupe), Download, Modellauswahl |
| Bulk-Erstellung + Sammelbrief | TCPDI-basiert |
| E-Mail-Versand mit PDF-Anhang | `CMailFile`, Subject/Body mit Platzhaltern |
| Auto-Erledigung bei Zahlungseingang | Trigger `BILL_PAYED` + `PAYMENT_CUSTOMER_CREATE` |
| Tab "Mahnungen (n)" auf Rechnungs- + Kundenkarte | Hook `completeTabsHead` |
| Widget: Offene Rechnungen mit Mahnstufe | `box_mahnung_offen` — wie Standard-Widget, plus Mahnstufe-Badge mit Link |
## Voraussetzungen
- Dolibarr ≥ 19
- PHP ≥ 7.4
- TCPDF (Dolibarr-Standard) für PDF
- Optional: ODTPHP (Dolibarr-Standard) für ODT-Templates
- Optional: TCPDI (Dolibarr `includes/tcpdf/tcpdi.php`) für Sammelbrief-Konkatenation
- Optional: `GlobalNotify` für In-App-Notification-Badges
- Empfohlen: `BankImport` (automatischer Zahlungseingang via FinTS triggert die Mahnungs-Erledigung sauber)
## Installation
```bash
git clone https://git.data-it-solution.de/data/mahnung.git \
/pfad/zu/dolibarr/htdocs/custom/mahnung
```
Dann **Startseite → Setup → Module → Finanzwesen → Mahnung** aktivieren.
Bei Aktivierung werden `llx_mahnung_mahnung` und `llx_mahnung_stufe` angelegt; drei Default-Stufen werden idempotent eingefügt. Dokumentenmodelle (`standard_mahnung`, `generic_mahnung_odt`) werden in `llx_document_model` registriert.
Nach Aktivierung in **Setup → Mahnwesen Einstellungen**:
1. Basiszins prüfen
2. Stufen-Texte (PDF-Intro, E-Mail-Body) anpassen
3. Dokumentenmodell wählen und ggf. ODT-Templates hochladen
4. Cron-Job `MahnungCronBuildVorschlag` aktivieren
## ODT-Templates
Templates werden unter **Setup → Mahnwesen Einstellungen → Dokumentenmodelle** hochgeladen.
### Dateinamen-Konvention
| Dateiname | Verwendung |
|---|---|
| `mahnung_stufe1.odt` | Zahlungserinnerung (Stufe 1) |
| `mahnung_stufe2.odt` | 1. Mahnung (Stufe 2) |
| `mahnung_stufe3.odt` | Letzte Mahnung (Stufe 3) |
| `mahnung.odt` | Fallback für alle Stufen |
### Verfügbare Template-Variablen (Auswahl)
| Variable | Beispiel |
|---|---|
| `{mahnung_ref}` | MAHN2026-0001 |
| `{mahnung_stufe}` | 1 |
| `{mahnung_stufe_label}` | Zahlungserinnerung |
| `{mahnung_date}` | 10.05.2026 |
| `{mahnung_betrag_offen}` | 131,34 |
| `{mahnung_mahngebuehr}` | 5,00 |
| `{mahnung_verzugszinsen}` | 1,23 |
| `{mahnung_summe}` | 137,57 |
| `{mahnung_kundentyp}` | B2C |
| `{facture_ref}` | IN2604-0036 |
| `{facture_total_ttc}` | 131,34 |
| `{company_name}` | Kundenname |
| `{mycompany_name}` | Eigene Firma |
| `{mahnung_bank_iban}` | DE89... |
Vollständige Liste: **Setup → Mahnwesen → Verfügbare Template-Variablen**
## Rechte
| Recht | Standard | Bedeutung |
|---|---|---|
| `mahnung.read` | aktiv | Mahnungen einsehen |
| `mahnung.write` | inaktiv | Mahnungen erstellen / bearbeiten |
| `mahnung.send` | inaktiv | Mahnungen versenden (E-Mail / Druck) |
| `mahnung.delete` | inaktiv | Mahnungen stornieren |
| `mahnung.setup` | inaktiv | Stufen, Basiszins, Versand konfigurieren |
## Modul-Konstanten
| Name | Default | Bedeutung |
|---|---|---|
| `MAHNUNG_BASISZINS` | `1.27` | BGB-Basiszins (%) — halbjährlich pflegen (1.1./1.7.) |
| `MAHNUNG_AUFSCHLAG_B2C` | `5.0` | Verzugszins-Aufschlag B2C (BGB §288 Abs. 1) |
| `MAHNUNG_AUFSCHLAG_B2B` | `9.0` | Verzugszins-Aufschlag B2B (BGB §288 Abs. 2) |
| `MAHNUNG_PAUSCHALE_B2B` | `40.00` | Pauschale B2B (EUR, BGB §288 Abs. 5, einmalig) |
| `MAHNUNG_ADDON_PDF` | `standard_mahnung` | Standard-Dokumentenmodell |
| `MAHNUNG_ADDON_PDF_ODT_PATH` | `DOL_DATA_ROOT/doctemplates/mahnung` | ODT-Template-Verzeichnis |
| `MAHNUNG_NTFY_TOPIC` | `vk-builds` | Ntfy-Topic für Vorschlags-Push |
## Workflow
```
Cron 06:00
|
|--> ueberfaellige Rechnungen einsammeln
|--> Stufe ermitteln (Stufe 1 ab frist_tage Verzug,
| Folgestufen nach neue_frist_tage seit Vor-Mahnung)
|--> Ntfy-Push mit Anzahl je Stufe + Gesamt-EUR
|--> GlobalNotify "actionRequired" (wenn Modul aktiv)
|
v
list.php (Vorschlagsliste)
|
|--> User waehlt aus + klickt "Mahnungen erzeugen"
| -> ajax/createmahnung.php berechnet Gebuehr + Verzugszinsen,
| persistiert llx_mahnung_mahnung, generiert PDF/ODT
|
|--> Alternativ "Sammelbrief erzeugen"
| -> ajax/sammelbrief.php generiert + konkateniert PDFs
|
Zahlungseingang (BankImport / Manual)
|
v Trigger BILL_PAYED / PAYMENT_CUSTOMER_CREATE
|--> alle offenen Mahnvorgaenge zur Rechnung -> status=erledigt
```
## Dateibaum
```
mahnung/
├── core/modules/modMahnung.class.php Descriptor, Rechte, Cron, Hooks, Models
├── core/modules/mahnung/
│ ├── modules_mahnung.php Abstrakte Basis ModelePDFMahnung
│ └── doc/
│ ├── pdf_standard_mahnung.modules.php TCPDF-Generator (DIN 5008)
│ └── doc_generic_mahnung_odt.modules.php ODT-Template-Generator
├── core/triggers/interface_99_modMahnung_MahnungTriggers.class.php
├── core/boxes/box_mahnung_offen.php Widget: Offene Rechnungen + Mahnstufe
├── class/mahnung.class.php CRUD Mahnvorgang + generateDocument()
├── class/mahnungstufe.class.php CRUD Stufen-Konfig
├── class/mahnungvorschlag.class.php Vorschlags-Service (Stufenermittlung)
├── class/mahnungcron.class.php Cron-Job
├── class/mahnungntfy.class.php Ntfy-Wrapper
├── class/actions_mahnung.class.php Hook-Klasse (invoicecard + thirdpartycard)
├── admin/setup.php Setup + Dokumentenmodell-Verwaltung
├── admin/templatevars.php Template-Variablen-Referenz
├── ajax/createmahnung.php Bulk-Mahnung-Erzeugung
├── ajax/sammelbrief.php Sammelbrief-PDF-Konkatenation
├── ajax/sendmail.php E-Mail-Versand
├── list.php Vorschlagsliste / Archiv
├── card.php Detailansicht + Dokumentenliste
├── sql/llx_mahnung_*.sql Schema + Seed
└── langs/{de_DE,en_US}/mahnung.lang
```
## Lizenz
GPL-3.0