All checks were successful
Deploy mahnung / deploy (push) Has been skipped
README:
- Feature-Tabelle um Phase 1-6 erweitert: Select2-Filter, Versand-Erfassung,
Sendebeleg-Upload, Tracking-Patterns + Live-Vorschau, Beleg-Scan,
Versand-Reminder Cron, Bonitaets-Workflow.
- Neue Sektionen Datenbank, AJAX-Endpoints, Hooks & Trigger.
- MAHNUNG_VERSAND_REMINDER_DAYS zu Konstanten ergaenzt.
- Workflow-ASCII-Diagramm aktualisiert: Filter + Versand-Block + Belege-Scan
+ Uneinbringlich-Pfad + Steuer-Modul-Kompatibilitaet.
- Dateibaum: neue Files (mahnungtrackingpattern, tracking_patterns admin,
regex_preview ajax) + Methoden in actions_mahnung dokumentiert.
CLAUDE.md:
- Schema-Migration-Sektion (migrateVersandFelder beim Setup-Aufruf).
- Hooks-Stolperfallen: completeTabsHead mehrfach-Trigger.
- Filter-Syntax-Stolperfallen: USC-Syntax bei select_company,
search_socid=-1 als "nichts ausgewaehlt".
- Pipeline-Stolperfallen: ${{ commit_message }} via env: durchreichen.
- Versand & Bonitaet Sektion mit Kreuzverweisen auf KB #601-#609.
- Dolibarr-Versionshinweise um formconfirm-Textarea ergaenzt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
56 lines
3.8 KiB
Markdown
56 lines
3.8 KiB
Markdown
# CLAUDE.md — Mahnung-Modul
|
|
|
|
## Projekt
|
|
Dolibarr Custom-Modul: 3-stufiges Mahnwesen nach BGB §288 + Versand-Tracking + Forderungsausfall-Workflow.
|
|
|
|
## Technisches
|
|
- **numero**: 500038 (NICHT ändern — 500037 ist Eplan)
|
|
- **Deploy**: nur via Pipeline (`[deploy]` in Commit-Message), NIEMALS manuell kopieren
|
|
- **Prod-Pfad**: /mnt/appdata/firma/dolibarr-202509/modules/mahnung/
|
|
- **Lokal**: Symlink /var/www/dolibarr/custom/mahnung → repo/
|
|
- **Test-DB**: dolibarr_test auf 192.168.155.11
|
|
- **Forgejo-Repo**: data/mahnung (NICHT data-it/ — historisch, soll bleiben)
|
|
|
|
## Schema-Migration
|
|
- `modMahnung::migrateVersandFelder()` läuft automatisch beim Setup-Page-Aufruf
|
|
- Idempotent via `SHOW COLUMNS LIKE` → fehlende Spalten via `ALTER TABLE ADD COLUMN`
|
|
- Default-Tracking-Patterns werden via `MahnungTrackingPattern::seedDefaults()` geseedet (Check: `COUNT(*) > 0` → skip)
|
|
- **Nach Deploy: User muss Setup-Page einmal aufrufen**, sonst fehlen die neuen Spalten
|
|
|
|
## Dokumentenmodell-System
|
|
- `commonGenerateDocument()` fügt automatisch `doc_`/`pdf_` Prefix hinzu
|
|
- DB-Einträge in `llx_document_model.nom` OHNE Prefix speichern
|
|
- `actions_setmoduleoptions.inc.php` MUSS vor `llxHeader()` stehen (Upload)
|
|
- ODT-Templates: mahnung_stufe1.odt, mahnung_stufe2.odt, mahnung_stufe3.odt, mahnung.odt (Fallback)
|
|
|
|
## Widget
|
|
- `box_mahnung_offen` basiert 1:1 auf `box_factures_imp.php` (Standard-Widget)
|
|
- Zeigt ALLE offenen Rechnungen, nicht nur überfällige
|
|
- Mahnstufe-Badge nur wenn Mahnung existiert, sonst Strich
|
|
|
|
## Hooks-Stolperfallen
|
|
- **`completeTabsHead`** wird bei jedem Aufruf von `complete_head_from_modules()` getriggert — pro Karte mehrfach (core + external + remove). Filter auf `mode=add` + `filterorigmodule=external`, sonst doppelter Tab. (KB #601)
|
|
- Hook-Kontexte: `invoicecard`, `thirdpartycard`, `ordercard` — letztere für Bonitäts-Warnings.
|
|
|
|
## Filter-Syntax-Stolperfallen
|
|
- **`$form->select_company($selected, $htmlname, $filter, ...)`**: der `$filter`-Parameter erwartet **USC-Syntax** `(feld:operator:wert)`, NICHT plain SQL. Beispiel B2C: `(s.tva_intra:is:NULL) OR (s.tva_intra:=:'')`. Sonst SQL-Syntax-Error + 500. (KB #602)
|
|
- **`search_socid=-1`** wird von `select_company` als "nichts ausgewählt" geliefert → im Filter-Check `> 0` statt `!empty()` nutzen.
|
|
|
|
## Pipeline-Stolperfallen
|
|
- **`${{ github.event.head_commit.message }}` NIE direkt in `run:`-Skript interpolieren** — bei Sonderzeichen (Klammern, Backticks) bricht Bash. Immer via `env:` durchreichen. (KB #603)
|
|
- `[deploy]`-Tag im Commit nötig, sonst kein Auto-Deploy.
|
|
|
|
## Versand & Bonität (Phase 6)
|
|
- Versand-Felder: `date_versand`, `versandweg`, `tracking_nr`, `tracking_provider` an `llx_mahnung_mahnung`
|
|
- Tracking-URLs aus DB (`llx_mahnung_trackingpattern`) via `MahnungTrackingPattern::urlFor()`, Fallback: `Mahnung::trackingUrl()` (hardcoded)
|
|
- Beleg-Upload: `formfile->showdocuments('mahnung', $ref, $filedir, ...)` — `$conf->mahnung->dir_output` wird von Dolibarr automatisch gesetzt (KB #605), kein Custom-Setup nötig
|
|
- Beleg-Scan: `pdftotext` ist im `90-Dolibarr-Prod-Custom`-Container drin (`/usr/bin/pdftotext`); Pattern-Match via `MahnungTrackingPattern::detectFromText()`
|
|
- Uneinbringlich-Klassifikation: `Facture::setCanceled($user, CommonInvoice::CLOSECODE_BADDEBT, $note)` → setzt `fk_statut=3` + `close_code='badcustomer'` (KB #606)
|
|
- Steuer-Modul kompatibel: EÜR ignoriert (liest nur `llx_paiement`), UStVA filtert `fk_statut IN (1,2)` automatisch (KB #607)
|
|
|
|
## Dolibarr-Versionshinweise
|
|
- `f.fk_statut` statt `f.statut` (seit Dolibarr 22.x)
|
|
- `verifCsrf()` existiert nicht — CSRF via `newToken()` + GETPOST('token')
|
|
- `dol_mkdir()` gibt 0 zurück wenn Verzeichnis bereits existiert (nicht false)
|
|
- `dol_dir_list()` gibt `fullname` zurück (nicht `fullpath`)
|
|
- `$form->formconfirm()` unterstützt textarea-Feld via `$formquestion`-Array (KB #609)
|