docs: CHANGELOG und CLAUDE.md aktualisiert
- CHANGELOG.md: Version 3.0 und 3.1 dokumentiert - CLAUDE.md: Projektspezifische Entwicklernotizen erstellt Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
463e7bdf0d
commit
e3687f0d34
3 changed files with 152 additions and 1 deletions
33
CHANGELOG.md
33
CHANGELOG.md
|
|
@ -2,6 +2,39 @@
|
||||||
|
|
||||||
Alle wesentlichen Änderungen an diesem Projekt werden in dieser Datei dokumentiert.
|
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
|
## [2.9] - 2026-02-23
|
||||||
|
|
||||||
### Entfernt
|
### Entfernt
|
||||||
|
|
|
||||||
118
CLAUDE.md
Normal file
118
CLAUDE.md
Normal file
|
|
@ -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;
|
||||||
|
```
|
||||||
|
|
@ -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'
|
$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'
|
// 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
|
// Url to the file with your last numberversion of this module
|
||||||
//$this->url_last_version = 'http://www.example.com/versionmodule.txt';
|
//$this->url_last_version = 'http://www.example.com/versionmodule.txt';
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue