Phase 13/14 abgeschlossen. Der Mailversand war zuvor KAPUTT: ajax/sendmail.php
war bereits zur Funktionsbibliothek umgebaut, card.php postete aber weiterhin
per JS dagegen.
Mailformular (FormMail)
- card.php nutzt jetzt Dolibarrs Standard-Mailformular (action=presend/send):
Empfaenger (Firma + alle Ansprechpartner), Betreff, Text und Anhang sichtbar
und aenderbar. Gesendet wird ausschliesslich ueber mahnungSendeErinnerungsMail().
- Anhang = unveraenderte Original-Rechnungs-PDF, wird bei Bedarf nacherzeugt.
Eigener Parameter mailinit statt mode=init, weil get_form() bei mode=init die
Anhangsliste selbst leert.
- HTML-Mails: DolEditor im Setup + withfckeditor=-1 im Formular (folgt
FCKEDITOR_ENABLE_MAIL wie Dolibarrs eigene Mailvorlagen).
- Klartext bleibt Klartext: GETPOST('restricthtml') jagt jeden Nicht-HTML-Text
durch dol_nl2br() — mahnungBodyEntkleiden() nimmt nur dieses Artefakt zurueck
und laesst echte Formatierung unangetastet.
- Platzhalter jetzt auch in Dolibarr-Schreibweise (__REF__, __DATE_YMD__,
__AMOUNT_FORMATED__, __DATE_DUE_YMD__, __FRIST_TAGE__ ...), Liste sichtbar im Setup.
- Absender-Adresse und -Name konfigurierbar (MAHNUNG_EMAIL_SENDER[_NAME]).
- Erneuter Versand moeglich (force aus dem Status abgeleitet, nicht aus dem
Request — Doppelversand-Schutz bleibt wirksam).
Versandprotokoll (neue Tabelle llx_mahnung_mailprotokoll)
- Jede versendete Erinnerung wird mit Empfaenger, Kopie, Betreff, Text und
Anhangsnamen festgehalten, einsehbar unter Versandstatus. Historie statt
Spalten am Vorgang, weil erneut gesendet werden kann.
- Lazy-Migration legt die Tabelle an (DB_VERSION 0.4.0), kein Reaktivieren noetig.
Haertung nach Code-Review (21 bestaetigte Funde)
- Anhang liess sich nicht abwaehlen (wurde sofort wieder eingehaengt)
- Upload/Entfernen ohne Rechtepruefung; Temp-Verzeichnis pro Vorgang getrennt
- Teilzahlung zwischen Oeffnen und Senden fuehrt zurueck ins Formular
- Empfaenger: Semikolon-Trenner, keine stillen Verwerfungen, Dubletten, CR/LF
- CSRF: presend + Core-Dateiaktionen (confirm_deletefile, renamefile, sendit,
linkit) token-pflichtig
- Externe Benutzer sehen nur eigene Vorgaenge; Abschreiben verlangt facture.creer
UI
- Mahnstufe nur noch EINE Darstellung (Badge), Farbskala zentral in
lib/mahnung_ui.lib.php statt doppelt gepflegt
- Zahnrad oben rechts in die Einstellungen (nur mit Recht mahnung.setup)
- Original-Rechnung unter Verknuepfte Dokumente mit Vorschau, Groesse in KB
- PDF-Einleitungstext nur noch, wo ueberhaupt ein PDF entsteht
Sprachdateien de_DE/en_US deckungsgleich, 9 tote Keys entfernt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
1.9 KiB
SQL
42 lines
1.9 KiB
SQL
-- Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
|
|
--
|
|
-- This program is free software: you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation, either version 3 of the License, or
|
|
-- (at your option) any later version.
|
|
|
|
-- Mahnvorgaenge zu Kundenrechnungen
|
|
|
|
CREATE TABLE llx_mahnung_mahnung (
|
|
rowid INTEGER AUTO_INCREMENT PRIMARY KEY,
|
|
entity INTEGER DEFAULT 1 NOT NULL,
|
|
ref VARCHAR(30) NOT NULL,
|
|
fk_facture INTEGER NOT NULL,
|
|
fk_soc INTEGER NOT NULL,
|
|
stufe TINYINT NOT NULL,
|
|
date_mahnung DATE NOT NULL,
|
|
date_lim_reglement_alt DATE,
|
|
date_lim_reglement_neu DATE,
|
|
betrag_offen DOUBLE(24,8) DEFAULT 0,
|
|
mahngebuehr DOUBLE(10,2) DEFAULT 0,
|
|
pauschale_b2b DOUBLE(10,2) DEFAULT 0,
|
|
verzugszinsen DOUBLE(10,2) DEFAULT 0,
|
|
-- Kumulierte Gebuehren/Pauschalen der Vorstufen zu derselben Rechnung
|
|
kosten_vorstufen DOUBLE(10,2) DEFAULT 0,
|
|
summe_mahnung DOUBLE(24,8) DEFAULT 0,
|
|
versandart VARCHAR(20) DEFAULT 'pdf',
|
|
customertype VARCHAR(3),
|
|
-- DECIMAL(6,3): das alte DECIMAL(5,4) konnte max. 9,9999 abbilden
|
|
basiszins_snapshot DECIMAL(6,3),
|
|
pdf_path VARCHAR(255),
|
|
note_private TEXT,
|
|
status TINYINT DEFAULT 0 NOT NULL,
|
|
date_versand DATETIME,
|
|
versandweg VARCHAR(30),
|
|
tracking_nr VARCHAR(50),
|
|
tracking_provider VARCHAR(20),
|
|
datec DATETIME,
|
|
tms TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
fk_user_creat INTEGER,
|
|
fk_user_modif INTEGER
|
|
) ENGINE=InnoDB;
|