mahnung/CHANGELOG.md
Eduard Wisch bb610a7594
Some checks failed
Deploy mahnung / deploy (push) Failing after 4s
Versand-Erfassung + Sendebeleg-Upload pro Mahnung [deploy]
Datenmodell (llx_mahnung_mahnung):
- Neue Spalten: date_versand, versandweg, tracking_nr, tracking_provider.
- Idempotente Migration via modMahnung::migrateVersandFelder() — laeuft
  automatisch beim ersten Setup-Aufruf nach dem Deploy (SHOW COLUMNS-Check,
  fehlende Spalten werden per ALTER TABLE ergaenzt).

Mahnung-Klasse:
- setVersand() — speichert Datum + Weg + optional Tracking + setzt Status
  automatisch auf VERSENDET wenn vorher <= ERSTELLT.
- defaultProviderForWeg() — Mapping versandweg → tracking_provider
  (dhl→dhl, einschreiben→dpag, dpd→dpd, hermes→hermes, ups→ups).
- trackingUrl() — Deep-Link-Helper fuer DHL, Deutsche Post, DPD, Hermes, UPS.
- getVersandwegLabel() — lokalisiertes Label aus versandweg-Slug.
- fetch/update um die neuen Felder erweitert.

card.php:
- Neuer Block "Versand & Belege" nach den generierten Dokumenten.
- Erfassungs-Formular: Datepicker + Versandweg-Dropdown (10 Optionen) +
  Sendungsnummer + Provider-Override.
- Anzeige nach Erfassung mit "Sendung verfolgen"-Button zum Provider.
- "Versand bearbeiten" und "Versand zuruecksetzen" Buttons.
- Beleg-Upload via formfile->showdocuments('mahnung', ...) — Dateien
  landen in DOL_DATA_ROOT/mahnung/<MAHN-Ref>/.
- Modulpart "mahnung" funktioniert ohne Custom-Setup: Dolibarr's
  conf.class.php:744 setzt $conf->mahnung->dir_output automatisch.

Lang-Keys: 22 neue (de_DE + en_US) fuer Versand-Block.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:59:08 +02:00

7.1 KiB
Raw Blame History

Changelog

[Unreleased]

Versand & Belege (Mahnungs-Karte)

  • Neue Felder date_versand, versandweg, tracking_nr, tracking_provider an llx_mahnung_mahnung — idempotente Migration laeuft beim ersten Setup-Aufruf nach dem Deploy.
  • Neuer Block "Versand & Belege" auf der Mahnungs-Karte:
    • Erfassung Versanddatum + Versandweg (Brief/Einschreiben/DHL/DPD/Hermes/UPS/Fax/Mail/Persoenlich/Eigen).
    • Optionale Sendungsnummer + Anbieter — Mahnung-Klasse liefert Deep-Link zur Sendungsverfolgung (DHL, Deutsche Post, DPD, Hermes, UPS).
    • "Sendung verfolgen"-Button oeffnet die Provider-Seite mit eingesetzter Sendungsnummer.
  • Beleg-Upload via Dolibarrs formfile->showdocuments() — Dateien landen in DOL_DATA_ROOT/mahnung/<MAHN-Ref>/, voll integriert mit ECM/document.php.
  • Status springt automatisch auf STATUS_VERSENDET sobald ein Versanddatum gesetzt wird (sofern vorher <= ERSTELLT).
  • Neue Methoden Mahnung::setVersand(), Mahnung::trackingUrl(), Mahnung::defaultProviderForWeg(), Mahnung::getVersandwegLabel().

Vorschlagsliste — UX

  • Kunden-Filter: rowid-Input ersetzt durch Dolibarr-Standard select_company() (Ajax-Suche bzw. klassisches Dropdown, je nach Dolibarr-Konfiguration). Direkt-Links ?search_socid=74 bleiben funktional.
  • Neuer Filter "Mindestbetrag" (in EUR, Komma erlaubt).
  • Neuer Filter "Kundentyp" (B2B / B2C).
  • Neue Spalte "Kontakt" mit Telefon- und Mail-Direktlink-Icons.

Fixes

  • Kundenkarte: Tab "Mahnwesen" erschien doppelt, weil complete_head_from_modules() pro Karte mehrfach (core + external + remove) feuert. Hook filtert jetzt auf mode=add + filterorigmodule=external.

[0.2.0] — 2026-05-10 — ODT-Template-System, Widget, Dokumentenmodelle

ODT-Template-System

  • Abstrakte Basis-Klasse ModelePDFMahnung extends CommonDocGenerator (core/modules/mahnung/modules_mahnung.php)
  • ODT-Generator doc_generic_mahnung_odt mit Stufen-spezifischer Template-Auswahl (mahnung_stufe1/2/3.odt, Fallback mahnung.odt)
  • TCPDF-Generator pdf_standard_mahnung (refactored aus mahnungpdf.class.php)
  • mahnung.class.php: generateDocument() Methode via commonGenerateDocument()
  • Template-Variablen: Mahnung, Rechnung, Kunde, Bankverbindung, Dolibarr-Standard
  • ODT-Template-Upload auf Setup-Seite mit Benennungskonvention-Hinweis

Widget

  • box_mahnung_offen: Offene Kundenrechnungen mit Mahnstufe-Badge (basiert auf box_factures_imp)
  • Alle offenen Rechnungen (nicht nur überfällige), Status-Icon wie Original
  • Farbige Mahnstufe-Badges (blau/orange/rot) mit Link zur Mahnung-Detailseite
  • Strich (—) bei Rechnungen ohne Mahnung

Dokumentenliste auf card.php

  • Generierte Dokumente zur Mahnung auflisten (aus Rechnungsordner)
  • PDF-Vorschau (Lupe), Download-Button
  • Modellauswahl-Dropdown bei mehreren aktiven Dokumentenmodellen

Setup-Erweiterungen

  • Dokumentenmodell-Verwaltung (aktivieren/deaktivieren, Default setzen)
  • admin/templatevars.php: Referenzseite aller verfügbaren ODT-Template-Variablen
  • Link von Setup zur Variablen-Referenz

Modul-Descriptor

  • module_parts['models'] = 1
  • Neue Konstanten: MAHNUNG_ADDON_PDF, MAHNUNG_ADDON_PDF_ODT_PATH
  • Document-Model-Registrierung in init() (standard_mahnung + generic_mahnung_odt)
  • Widget box_mahnung_offen@mahnung registriert
  • Picto korrigiert: fa-envelope-open-text (FA5-Free)

Bugfixes

  • numero 500037 → 500038 (Kollision mit Eplan behoben)
  • verifCsrf() entfernt (existiert nicht in Dolibarr, CSRF via newToken())
  • f.statutf.fk_statut (Dolibarr 22.x Spaltenname)
  • actions_setmoduleoptions.inc.php vor llxHeader() verschoben (ODT-Upload)
  • Widget: require_once mahnung.class.php an Dateianfang (Fatal Error bei Klassen-Konstanten in SQL)

Entfernt

  • class/mahnungpdf.class.php — Logik in core/modules/mahnung/doc/pdf_standard_mahnung.modules.php

[0.1.0] — 2026-05-07 — Erstveröffentlichung (Phase 110)

DB-Schema (Phase 1)

  • llx_mahnung_mahnung — Mahnvorgänge mit Stufe, Beträgen, Zinsen, Status, Snapshot des Basiszinses für Reproduzierbarkeit
  • llx_mahnung_stufe — pro Stufe konfigurierbar: Frist, neue Frist, Gebühren B2C/B2B, optional Zinssatz-Override, Versandart, E-Mail-/PDF-Templates
  • 3 Default-Stufen werden bei Aktivierung idempotent eingefügt

Modul-Descriptor (Phase 1)

  • numero 500038, family financial, FA-Picto fa-envelope-open-text
  • Modul-Konstanten: MAHNUNG_BASISZINS, MAHNUNG_AUFSCHLAG_B2C, MAHNUNG_AUFSCHLAG_B2B, MAHNUNG_PAUSCHALE_B2B, MAHNUNG_NTFY_TOPIC
  • Rechte: read, write, send, delete, setup
  • Cron-Job MahnungCronBuildVorschlag (täglich, default deaktiviert)
  • Linkes Menü unter „Rechnungen" (mainmenu=billing) mit Vorschlagsliste / Archiv

CRUD + Setup (Phase 2)

  • class/mahnung.class.php — CRUD, Status-Konstanten, Verzugszinsen-Berechnung nach BGB §288
  • class/mahnungstufe.class.php — Stufen-Konfiguration, Override-Helfer für Zinsen/Gebühren
  • admin/setup.php — Stufen-Tabelle vollständig pflegbar, Konstanten persistent

Vorschlagsliste + Cron (Phase 3)

  • class/mahnungvorschlag.class.php — gemeinsamer Service: ermittelt pro überfälliger Rechnung die nächste vorgeschlagene Stufe, B2C/B2B-Erkennung via tva_intra, offener Betrag aus paiement_facture
  • class/mahnungcron.class.php — Cron sammelt Vorschläge, sendet Ntfy-Push (Topic aus Setup), schreibt zusätzlich GlobalNotify-Action wenn aktiv
  • class/mahnungntfy.class.php — schmaler Ntfy-Push-Wrapper
  • list.php — Vorschlagsliste-UI mit Multi-Select, Filter nach Stufe / Verzugstagen / Kunde, Buttons „Mahnungen erzeugen" und „Sammelbrief"

PDF-Generator + Erstellen (Phase 4)

  • TCPDF-basierter Generator (DIN-5008 Form A): Adressfenster, Bezugszeichenzeile, Tabelle, Gebührenblock, Verzugszinsen mit Snapshot-Zinssatz, neue Frist, Bankverbindungs-Footer
  • PDFs landen in documents/facture/{ref}/ und erscheinen automatisch im Dokumente-Tab der Rechnung
  • ajax/createmahnung.php — Bulk-Endpoint mit CSRF + Permission-Check, erzeugt Mahnung + PDF, behandelt §288 Abs. 5 Pauschale einmalig pro Rechnung

Hooks + Trigger (Phase 5)

  • core/triggers/interface_99_modMahnung_MahnungTriggers.class.phpBILL_PAYED und PAYMENT_CUSTOMER_CREATE setzen offene Mahnungen auf erledigt
  • class/actions_mahnung.class.php — Hook auf Rechnungs- und Kundenkarte: Tab „Mahnungen (n)" mit Badge, Button „Mahnung erstellen" wenn überfällig
  • card.php — Detailansicht eines Mahnvorgangs mit Storno-Aktion (formconfirm-Modal)

E-Mail + Sammelbrief (Phase 6)

  • ajax/sendmail.php — sendet Mahnung-PDF via CMailFile an die Kunden-Mail; Subject/Body mit Platzhaltern aus Stufen-Konfig
  • ajax/sammelbrief.php — erzeugt Mahnungen für Auswahl, konkateniert ihre PDFs via TCPDI in eine Datei, liefert Download

Integrationen (Phase 7 + 8)

  • GlobalNotify: Cron sendet zusätzlich actionRequired-Notification ins Dolibarr-UI (wenn Modul aktiv)
  • Tab „Mahnungen" auf Kundenkarte (thirdpartycard) zusätzlich zur Rechnungskarte

Pipeline (Phase 10)

  • .forgejo/workflows/deploy.yml — Deploy auf /mnt/appdata/firma/dolibarr-202509/modules/mahnung bei Push auf main mit [deploy] oder Tag v*, Ntfy-Notify auf Topic vk-builds