Skip to content

Commit 35ad020

Browse files
lukischclaude
andcommitted
fix: IMAP MSN→UID-Bug (kritisch), NIL-Guard, MIME-Charset + Invoice-Bundle-Feature
Bugsweep IMAP/Mail-Abruf: - fix(KRITISCH): _search_imap verwendet jetzt uid('search') und uid('fetch') statt search()/fetch() — UIDs bleiben stabil auch wenn andere Clients gleichzeitig Mails verschieben/löschen (RFC 3501 §2.3.1.1, MSN/UID-Bug). - fix: NIL-Guard für uid('fetch')-Antwort vor msg_data[0][1]-Zugriff (Server liefert bei gelöschten UIDs leere/fehlerhafte Strukturen). - fix: _get_imap_message_body liest Charset aus Content-Type-Header (get_content_charset) statt blind UTF-8 anzunehmen; Fallback auf UTF-8 bei unbekanntem Charset-Label. Verhindert Mojibake bei ISO-8859-1-Mails. - test: Regressionstests für alle drei Bugs in test_integration.py; bestehende FakeMail-Tests auf uid()-Schnittstelle umgestellt. Invoice-Bundle-Feature (lokale Vorentwicklung): - feat: Neues Modul invoice_bundle.py (Build/Write/Load/Apply) - feat: Bundle-Export und Bundle-Import in MainWindow - feat: Neue Invoice-Felder profile_id, currency, review_status, notes, account_name, message_id_hash, mail_folder - test: test_invoice_bundle.py + test_ui_accessibility.py (Bundle-Buttons) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent ec9b495 commit 35ad020

9 files changed

Lines changed: 989 additions & 41 deletions

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@ Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert
1616

1717
### Changed
1818
- README, README-DE und `llms.txt` mit Startpunkten, local-first Invoice-Archive-/Gmail-/IMAP-/DATEV-Suchkontext und klarer Privacy-Abgrenzung geschärft.
19+
- `EXPORTFORMAT.md` und `AUFGABEN.txt` auf den realen Bundle-Export/-Import-Stand gehoben; Companion-Rückfluss ist jetzt klar auf Betrag, Prüfflag und Notiz begrenzt.
20+
- Die kompakte Rechnungs-Aktionsleiste exponiert jetzt klare Accessible Names, Descriptions und Tooltips für Auswahl-, Export-, Bundle- und DATEV-Aktionen, ohne die UI sichtbar aufzublähen.
1921

2022
### Added
2123
- macOS/Linux platform smoke `tests/source_platform_smoke.py` (renamed from `tests/linux_platform_smoke.py` via `git mv`, history preserved) for offscreen PySide6 start, missing-keyring fallback, LibreOffice SOFFICE_PATH env-override detection and CSV export.
2224
- GitHub Actions workflow `.github/workflows/source-platform-smoke.yml` on `ubuntu-latest` + `macos-latest`; installs PySide6 only (avoids pywin32/google-auth build failures on non-Windows).
25+
- Neues Hilfsmodul `invoice_bundle.py` für redigierten Bundle-Export/-Import samt UI-Aktionen `Bundle Export` und `Bundle Import`.
26+
- Neue Regressionstests `tests/test_invoice_bundle.py` für Exportvertrag, Hash-Konflikte und UI-Roundtrip.
2327

2428
### CI
2529
- Source-platform smoke workflow now uses verified `actions/checkout@v6` and `actions/setup-python@v6`, matching the main test workflow, and forces UTF-8 Python output.
@@ -54,7 +58,7 @@ Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert
5458

5559
### Verified
5660
- DATEV-Export als bereits vorhandene Migration gegen Code, Dialog, Doku und Regressionstests nachgezogen; `AUFGABEN.txt` entsprechend korrigiert
57-
- Lokaler Teststand auf 101 grüne Tests aktualisiert
61+
- Lokaler Teststand auf 104 grüne Tests aktualisiert
5862

5963
## [2.3.0] - 2026-05-02
6064
### Added

EXPORTFORMAT.md

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Exportformat - UniversalInvoiceMail
22

3-
Stand: 2026-06-01
3+
Stand: 2026-06-12
44

5-
Dieses Dokument beschreibt das geplante dateibasierte Austauschformat für Portierung, Companion-Nutzung und Buchhaltungsübergabe. Das Format ist ein Planungs- und Kompatibilitätsvertrag; die Desktop-App muss den Export/Reimport noch umsetzen.
5+
Dieses Dokument beschreibt das implementierte dateibasierte Austauschformat für Portierung, Companion-Nutzung und Buchhaltungsübergabe. Die Desktop-App exportiert und reimportiert das Bundle jetzt direkt über `Bundle Export` und `Bundle Import` im Rechnungs-Tab.
66

77
## Formatname
88

@@ -46,6 +46,8 @@ Belegdateien werden im Standard nur über relative Pfade, Dateinamen, MIME-Typen
4646
{
4747
"id": "profile-amazon",
4848
"name": "Amazon",
49+
"account_id": "acc-1",
50+
"account_label": "Gmail Hauptkonto",
4951
"sender_filter": "@amazon.de",
5052
"subject_filter": "Rechnung, Bestellung",
5153
"gmail_query": "from:amazon has:attachment",
@@ -56,15 +58,16 @@ Belegdateien werden im Standard nur über relative Pfade, Dateinamen, MIME-Typen
5658
{
5759
"id": "sha256:...",
5860
"profile_id": "profile-amazon",
61+
"profile_name": "Amazon",
5962
"date": "2026-05-31",
6063
"sender": "billing@example.org",
6164
"subject": "Rechnung 12345",
62-
"provider": "Amazon",
65+
"filename": "2026-05-31_Rechnung_12345.pdf",
6366
"amount": "19.99",
6467
"currency": "EUR",
65-
"datev_status": "ready",
6668
"review_status": "unchecked",
6769
"notes": "",
70+
"datev_status": "ready",
6871
"files": [
6972
{
7073
"relative_path": "Amazon/2026-05-31_Rechnung_12345.pdf",
@@ -74,6 +77,7 @@ Belegdateien werden im Standard nur über relative Pfade, Dateinamen, MIME-Typen
7477
"size_bytes": 123456
7578
}
7679
],
80+
"local_hash": "...",
7781
"mail_reference": {
7882
"account_label": "Gmail Hauptkonto",
7983
"message_id_hash": "sha256:...",
@@ -84,6 +88,12 @@ Belegdateien werden im Standard nur über relative Pfade, Dateinamen, MIME-Typen
8488
"datev": {
8589
"berater_nr": "100000",
8690
"mandant_nr": "10000",
91+
"wj_beginn": "20260101",
92+
"waehrung": "EUR",
93+
"sachkontenlaenge": 4,
94+
"konten_mapping": {
95+
"Amazon": [70001, 4930]
96+
},
8797
"export_encoding": "cp1252",
8898
"last_export_at": null
8999
},
@@ -99,10 +109,8 @@ Belegdateien werden im Standard nur über relative Pfade, Dateinamen, MIME-Typen
99109
Ein Companion-Reimport darf nur fachliche Ergänzungen ändern:
100110

101111
- `amount`
102-
- `currency`
103112
- `review_status`
104113
- `notes`
105-
- optional `datev_status`, wenn der Desktop dies ausdrücklich erlaubt
106114

107115
Nicht überschrieben werden dürfen:
108116

@@ -112,13 +120,14 @@ Nicht überschrieben werden dürfen:
112120
- Dateipfade ohne Hash-Abgleich
113121
- Original-Metadaten wie Sender, Betreff, Datum und Message-ID-Hash
114122

115-
Konflikte müssen über `id` und Datei-Hash sichtbar gemacht werden. Wenn eine Rechnung lokal gelöscht oder die Datei verändert wurde, darf ein Reimport nicht still ein altes Companion-Feld übernehmen.
123+
Konflikte werden über `id` und Datei-Hash geprüft. Wenn eine Rechnung lokal gelöscht oder die Datei verändert wurde, übernimmt der Desktop keine Companion-Felder stillschweigend, sondern meldet den Konflikt im Importergebnis.
116124

117125
## Companion-Usecases
118126

119127
- Rechnungsliste mobil oder im Browser prüfen.
120128
- Beträge ergänzen, wenn sie nach dem Abruf noch fehlen.
121129
- Prüfflags setzen: `unchecked`, `checked`, `needs_question`, `ready`.
130+
- Notizen für Rückfragen oder Korrekturen ergänzen.
122131
- Übergabe an Steuerberatung mit reduziertem Bestand ermöglichen.
123132

124133
## Nicht-Ziele

0 commit comments

Comments
 (0)