diff --git a/CHANGELOG.md b/CHANGELOG.md index aa38d79..cc6a613 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,39 @@ Alle wesentlichen Änderungen an diesem Projekt werden in dieser Datei dokumentiert. +## [3.1] - 2026-03-05 + +### Hinzugefügt +- **Skonto-Erkennung**: Multi-Invoice-Matching erkennt jetzt Skonto-Abzüge bis 3% +- **Automatische Skonto-Verarbeitung**: Zahlungen werden proportional auf Rechnungen verteilt +- **Skonto-Vermerk**: Rechnungen werden mit `close_code='discount_vat'` als bezahlt markiert +- **Skonto-Dokumentation**: Notiz zeigt Skonto-Betrag pro Rechnung + +### Verbessert +- **Match-Sortierung**: Matches mit näherem Betrag werden jetzt bevorzugt angezeigt +- **Multi-Match Score**: Von 90 auf 98 erhöht, damit Sammelzahlungen vor Einzelmatches erscheinen +- Sammelzahlungen mit Skonto werden jetzt korrekt als Gruppe erkannt (statt einzelner Rechnungen) + +### Beispiel +Transaktion -523,40€ mit 3 Rechnungen (Summe 529,69€): +- Erkennt 6,29€ Skonto-Abzug +- Verteilt proportional: 59,37€ + 206,72€ + 257,32€ +- Markiert alle 3 als "bezahlt mit Skonto" + +## [3.0] - 2026-03-05 + +### Hinzugefügt +- **Repair-Seite**: Neue Admin-Seite zum Reparieren verwaister Transaktionen + - Findet Transaktionen die als "Neu" markiert sind, obwohl Zahlung bereits existiert + - Ermöglicht manuelles oder Batch-Reparieren + - Erreichbar über Admin-Setup → Admin-Werkzeuge +- **Admin-Werkzeuge Sektion**: Neuer Bereich im Setup für Wartungsfunktionen + +### Geändert +- **Filter für bezahlte Rechnungen**: Zeigt jetzt alle bezahlten Rechnungen die noch nicht über BankImport verknüpft sind + - Prüft nur BankImport-Verknüpfung (nicht mehr payment.fk_bank) + - Ermöglicht nachträgliche Verknüpfung von extern bezahlten Rechnungen + ## [2.9] - 2026-02-23 ### Entfernt diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..bcdfd70 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,118 @@ +# BankImport Modul - Entwicklernotizen + +## Modul-Übersicht +- **Name**: BankImport +- **Version**: 3.1 +- **Pfad**: `/srv/http/dolibarr/custom/bankimport/` +- **Funktion**: FinTS/HBCI Kontoauszüge importieren und mit Dolibarr-Rechnungen abgleichen + +## Wichtige Dateien + +| Datei | Funktion | +|-------|----------| +| `class/banktransaction.class.php` | Hauptklasse für Transaktionen, findMatches(), confirmMultiplePayment() | +| `confirm.php` | Übersicht aller Matches zur Bestätigung | +| `card.php` | Einzelansicht einer Transaktion mit manueller Zuordnung | +| `repair.php` | Admin-Seite für verwaiste Transaktionen | +| `cron/bankimport.cron.php` | Cronjob für automatischen Import | +| `admin/cronmonitor.php` | Cron-Monitoring und Pause/Resume | + +## Multi-Invoice Matching (Sammelzahlungen) + +### Ablauf +1. `findMatches()` sucht Einzelmatches und Multi-Matches +2. `findSupplierForMultiMatch()` findet Lieferant über IBAN oder Name (Similarity > 70%) +3. `findMultipleSupplierInvoiceMatches()` kombiniert Rechnungen deren ref_supplier im Buchungstext steht +4. Toleranz: **3% des Betrags** (für Skonto) + +### Sortierung +Matches werden sortiert nach: +1. Betragsnähe (innerhalb 10% Threshold bevorzugt) +2. Score (Multi-Match: 98-100, Einzelmatch: variabel) + +### Skonto-Verarbeitung +In `confirmMultiplePayment()`: +1. Wenn gezahlter Betrag < Rechnungssumme (max 5% Abweichung) +2. Zahlungen werden proportional verteilt (`discountFactor = actualAmount / totalPayment`) +3. Rechnungen werden mit `setPaid($user, 'discount_vat', 'Skonto (X EUR)')` geschlossen + +## Datenbank-Struktur + +### llx_bankimport_transaction +| Feld | Bedeutung | +|------|-----------| +| `status` | 0=Neu, 1=Zugeordnet, 2=Abgestimmt, 9=Ignoriert | +| `fk_facture_fourn` | Verknüpfte Lieferantenrechnung (erste bei Multi) | +| `fk_paiementfourn` | Verknüpfte Zahlung | +| `fk_bank` | Verknüpfter Bank-Eintrag | +| `note_private` | Multi-invoice payment: SI..., SI..., SI... (Skonto: X EUR) | + +### Rechnung (close_code) +| Code | Bedeutung | +|------|-----------| +| `NULL` | Normal bezahlt | +| `discount_vat` | Mit Skonto bezahlt | +| `badsupplier` | Zahlungsausfall | +| `abandon` | Aufgegeben | + +## Bekannte Edge Cases + +### Problem: Nur 1 statt 3 Rechnungen bestätigt +- **Ursache**: Multi-Match hatte niedrigeren Score als Einzelmatch +- **Lösung**: Score auf 98 erhöht + Sortierung nach Betragsnähe + +### Problem: Skonto nicht erkannt +- **Ursache**: Toleranz war 5€ fix, Skonto war 6,29€ +- **Lösung**: Toleranz auf 3% des Betrags geändert + +### Problem: Bezahlte Rechnungen nicht in Liste +- **Ursache**: Filter prüfte payment.fk_bank statt BankImport-Verknüpfung +- **Lösung**: Nur `llx_bankimport_transaction.status > 0` prüfen + +## Test-Datenbank +- **Host**: 192.168.155.1 (Produktiv) / 192.168.155.11 (Test) +- **User**: dolibarr +- **Passwort**: 8715 + +## Typische Debug-Queries + +```sql +-- Transaktion mit Verknüpfungen +SELECT rowid, ref, amount, status, fk_facture_fourn, fk_paiementfourn, fk_bank, note_private +FROM llx_bankimport_transaction WHERE rowid = X; + +-- Zahlungsverteilung prüfen +SELECT pf.fk_paiementfourn, pf.fk_facturefourn, pf.amount, f.ref +FROM llx_paiementfourn_facturefourn pf +JOIN llx_facture_fourn f ON f.rowid = pf.fk_facturefourn +WHERE pf.fk_paiementfourn = X; + +-- Rechnungen mit Skonto-Status +SELECT rowid, ref, total_ttc, fk_statut, paye, close_code, close_note +FROM llx_facture_fourn WHERE rowid IN (X, Y, Z); +``` + +## Zurücksetzen einer Transaktion (für Tests) + +```sql +-- 1. Zahlung-Rechnung Verknüpfung löschen +DELETE FROM llx_paiementfourn_facturefourn WHERE fk_paiementfourn = X; + +-- 2. Bank-URL löschen +DELETE FROM llx_bank_url WHERE url_id = X AND type = 'payment_supplier'; + +-- 3. Zahlung löschen +DELETE FROM llx_paiementfourn WHERE rowid = X; + +-- 4. Bank-Eintrag löschen +DELETE FROM llx_bank WHERE rowid = Y; + +-- 5. Rechnung(en) auf offen setzen +UPDATE llx_facture_fourn SET fk_statut = 1, paye = 0, close_code = NULL, close_note = NULL WHERE rowid IN (...); + +-- 6. BankImport-Transaktion zurücksetzen +UPDATE llx_bankimport_transaction +SET status = 0, fk_facture_fourn = NULL, fk_paiementfourn = NULL, fk_bank = NULL, + fk_user_match = NULL, date_match = NULL +WHERE rowid = Z; +``` diff --git a/core/modules/modBankImport.class.php b/core/modules/modBankImport.class.php index c2bd408..8c4aa20 100755 --- a/core/modules/modBankImport.class.php +++ b/core/modules/modBankImport.class.php @@ -76,7 +76,7 @@ class modBankImport extends DolibarrModules $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@bankimport' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' - $this->version = '3.2'; + $this->version = '3.4'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt';