Files

8360 lines
264 KiB
Plaintext

# History Canonical
Stand: 2026-05-27
Diese Datei ist die kanonische Roh-Historie fuer Detail-/Auditbedarf.
Sie wurde aus docs/raw_md_archive/*.raw erzeugt und entfernt exakt gleiche Markdown-Abschnitte nach Normalisierung von Whitespace und Stand-Zeilen.
Nicht exakt gleiche, aber fachlich aehnliche Abschnitte bleiben erhalten, damit keine Information verloren geht.
## Quellen
- lastchange.md.raw (84859 bytes)
- NEXT_STEPS_2026-04-15.md.raw (48631 bytes)
- HANDOFF_2026-04-15.md.raw (65523 bytes)
- LLM_SYSTEM_GUIDE.md.raw (26020 bytes)
- FINANCE_HANDOFF_2026-05-18.md.raw (12491 bytes)
- FINANCE_DASHBOARD_TODO_2026-05-15.md.raw (3242 bytes)
- FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw (2519 bytes)
- FINANCE_ES_MAIL_ABWEICHUNG_2026-05-15.md.raw (1338 bytes)
- FINANCE_IT_MAIL_ABWEICHUNG_2026-05-15.md.raw (1576 bytes)
- FINANCE_UK_MAIL_ABWEICHUNG_2026-05-15.md.raw (1999 bytes)
## Deduplizierung
- Behaltene eindeutige Abschnitte: 323
- Entfernte exakt doppelte Abschnitte: 0
## Kanonische Abschnitte
## H1 - Last Change 2026-05-04
Quelle: lastchange.md.raw
# Last Change 2026-05-04
## H2 - In-App-Schulungen und Finance-Detaildoku 2026-05-21
Quelle: lastchange.md.raw
## In-App-Schulungen und Finance-Detaildoku 2026-05-21
Geaendert:
- Neue HTML-/Razor-Schulungsseite `HR KPI Schulung` unter `/hr-kpi/schulung`.
- Neue HTML-/Razor-Schulungsseite `Finance Schulung` unter `/finance-cockpit/schulung`.
- Navigation erweitert:
- `Finance Cockpit` enthaelt jetzt `Finance Schulung`.
- `HR KPI (Login)` ist jetzt eine Gruppe mit `HR Dashboard` und `HR KPI Schulung`.
- Finance-Schulung ist wie die restlichen Finance-Seiten ueber die Finance-Cockpit-Entsperrung geschuetzt.
- Schulungsseiten enthalten Tabellen, Checklisten, Prozessablauf und eingebettete Grafiken aus `wwwroot/training`.
- Sprachtexte fuer die neuen Menuepunkte in Englisch, Spanisch, Italienisch und Hindi ergaenzt.
- Word-Schulungsdokumente fuer HR und Finance neu erzeugt und Umlaut-Schreibweisen korrigiert.
- Neue Markdown-Doku `docs/MANUAL_IMPORT_DELTA_STAND_2026-05-21.md` beschreibt den aktuellen Delta-/Vollfile-Stand:
- UK kann Basis plus Deltas lesen.
- Spanien und Deutschland muessen vollstaendige Dateien liefern.
- Manual-Importe ersetzen pro Standort den aktuellen Stand in `CentralSalesRecords`.
Verifiziert:
- `dotnet test TrafagSalesExporter.sln --verbosity minimal --no-restore -p:BaseOutputPath=.tmp_build\bin\ -p:BaseIntermediateOutputPath=.tmp_build\obj\`
- Normaler Debug-Build war lokal durch eine von Visual Studio/.NET Host gesperrte `bin\Debug\net8.0\BiDashboard.dll` blockiert.
## H3 - Lokaler Uebergangsserver bis IIS-Fix 2026-05-21
Quelle: lastchange.md.raw
## Lokaler Uebergangsserver bis IIS-Fix 2026-05-21
Zweck:
- Falls der zentrale IIS-Server noch nicht erreichbar ist, kann die App voruebergehend auf dem Entwicklungs-PC laufen.
- Andere Mitarbeitende greifen dann im Firmennetz ueber die IP des PCs zu.
- Ausfuehrliche Betriebsdoku: `docs/LOCAL_DEV_SERVER_UEBERGANG_2026-05-21.md`.
Start auf dem Entwicklungs-PC:
```powershell
dotnet run --urls "http://0.0.0.0:5000"
```
Nachtrag:
- `Properties/launchSettings.json` wurde so angepasst, dass das Entwicklungsprofil zusaetzlich auf `http://0.0.0.0:5000` lauscht.
- Bei Start aus Visual Studio bzw. ueber das Projektprofil bleibt `https://localhost:55415` lokal verfuegbar, Port `5000` ist aber zusaetzlich fuer andere PCs erreichbar.
- Falls bereits eine alte Visual-Studio-Instanz laeuft, App stoppen und neu starten, damit die geaenderte URL-Bindung aktiv wird.
Zugriff von anderen PCs:
```text
http://<PC-IP>:5000
```
Aktueller Stand vom 2026-05-21:
```text
PC-IP im WLAN/Firmennetz: 172.16.9.185
Lokale Test-URL: http://172.16.9.185:5000
```
IP des PCs ermitteln:
```powershell
ipconfig
```
Firewall-Regel einmalig in einer PowerShell "Als Administrator" anlegen:
```powershell
netsh advfirewall firewall add rule name="TrafagSalesExporter local web 5000" dir=in action=allow protocol=TCP localport=5000 profile=domain,private
```
Am 2026-05-21 wurde eine allgemeine Port-5000-Regel angelegt und danach auf alle Firewall-Profile erweitert:
```text
Regelname: Local Dev Web Port 5000
Aktiviert: Ja
Profile: Domaene, Privat, Oeffentlich
Protokoll: TCP
Lokaler Port: 5000
Aktion: Zulassen
```
Damit koennen spaeter auch andere lokale Entwicklungsprogramme auf Port 5000 von anderen Firmen-PCs erreicht werden, sofern sie an `0.0.0.0:5000` oder die konkrete PC-IP binden.
Pruefen:
```powershell
netsh advfirewall firewall show rule name="TrafagSalesExporter local web 5000"
```
Spaeter wieder entfernen:
```powershell
netsh advfirewall firewall delete rule name="TrafagSalesExporter local web 5000"
```
Hinweise:
- Die Firewall-Regel bleibt nach einem Windows-Neustart aktiv.
- Die Firewall-Regel bleibt normalerweise auch nach Windows-Updates aktiv.
- Da die Regel auf Domaene, Privat und Oeffentlich gilt, ist Port 5000 auch abgedeckt, wenn AlwaysOnVPN oder Windows das Netzwerk nicht als Domaenenprofil erkennt.
- Die App selbst startet nach einem Neustart nicht automatisch; `dotnet run ...` muss erneut gestartet werden.
- Die PC-IP kann sich nach Neustart, WLAN-Wechsel oder DHCP-Erneuerung aendern; dann `ipconfig` ausfuehren und die neue URL weitergeben.
- Der PC muss eingeschaltet bleiben und das PowerShell-Fenster muss offen bleiben.
- Nur im Firmennetz verwenden, nicht oeffentlich freigeben.
- Die lokale Uebergangs-URL ist bewusst HTTP, nicht HTTPS. Fuer diesen temporaeren internen Betrieb reicht das; lokales HTTPS waere moeglich, wuerde aber Zertifikats-/Trust-Aufwand fuer andere PCs verursachen.
- Finance Cockpit und HR KPI bleiben ueber ihre App-internen Logins geschuetzt.
- Wenn ein Finance-User im Buero die App ueber die VPN-IP des Entwicklungs-PCs trotzdem nicht erreicht, liegt es wahrscheinlich am AlwaysOnVPN-/Firmennetz-Routing. Das kann lokal auf dem PC nicht sicher freigeschaltet werden.
Serverbefund:
- Der IIS-Server fordert beim HTTPS/TLS-Handshake ein Client-Zertifikat (`RequestedClientCert=True`).
- Dadurch erreichen Requests weder `diag.txt` noch `BiDashboard.dll`.
- Marco/IT muss in IIS die SSL Settings pruefen und Client Certificates auf `Ignore` oder hoechstens `Accept` setzen, nicht `Require`.
## H4 - Adminbereich und Passwortwechsel 2026-05-21
Quelle: lastchange.md.raw
## Adminbereich und Passwortwechsel 2026-05-21
Geaendert:
- Finance Cockpit und HR KPI Login-Masken haben einen Bereich `Passwort ändern`.
- Passwortaenderung verlangt Benutzername, aktuelles Passwort, neues Passwort und Wiederholung.
- Neue Passwoerter muessen mindestens 8 Zeichen haben.
- Gespeichert wird ein SHA-256-Hash in `appsettings.json`, kein Klartext.
- Neuer interner Adminbereich `/admin/sessions`.
- Der Adminbereich hat eine eigene App-interne Sperre `AdminAccess`.
- Adminseite `Aktive Logins` zeigt App-interne HR-/Finance-Entsperrungen seit dem letzten App-Start:
- Bereich
- Login-Name
- IP-Adresse, soweit aus dem Request verfuegbar
- Entsperrt seit
- Zuletzt gesehen
- Hinweis: Da HR und Finance gemeinsame App-Logins verwenden, zeigt die Seite nicht zwingend die echte Person, sondern die verwendete App-Session.
- Standorte-Tabelle zeigt jetzt Icons fuer den Quellentyp:
- Upload-Datei = Manual Excel / CSV
- Cloud Sync = SAP OData
- Storage = HANA / Server
Initialer Adminzugang:
```text
Username: admin
Initialpasswort: TrafagAdmin2026!
```
Nach erster Nutzung sollte das Adminpasswort ueber die Admin-Loginmaske geaendert werden.
Verifiziert:
- `dotnet build .\TrafagSalesExporter.csproj --no-restore --verbosity minimal -p:OutDir=C:\TMP\trafag_out\`
- Ergebnis: Build erfolgreich, nur bestehende MudBlazor-Analyzer-Warnungen zu `Dense` auf vorhandenen Controls.
## H5 - Markdown-Doku und Anwenderdokus nachgezogen 2026-05-20
Quelle: lastchange.md.raw
## Markdown-Doku und Anwenderdokus nachgezogen 2026-05-20
Geaendert:
- Neue zentrale Markdown-Uebersicht `docs/MD_DOKUMENTENSTATUS_2026-05-20.md` erstellt.
- Markdown-Dateien werden dort als aktuell fuehrend, Detaildoku oder historisch eingeordnet.
- Alte Markdown-Dateien wurden nicht geloescht, weil sie Pruefwerte, Zwischenentscheide und Audit-Spuren enthalten.
- HR- und Finance-Word-Anleitungen wurden visuell ueberarbeitet:
- Titelbereich
- Tabellen
- Hinweisboxen
- eingebettete neutrale Cockpit-Vorschaugrafiken
- Neue Bilddateien:
- `docs/hr_kpi_cockpit_preview.png`
- `docs/finance_cockpit_preview.png`
Commits:
- `0bff161 Document HR cockpit feature list`
- `a044040 Improve cockpit user guide documents`
## H6 - Management Analyse auf Finance Summary ausgerichtet 2026-05-20
Quelle: lastchange.md.raw
## Management Analyse auf Finance Summary ausgerichtet 2026-05-20
Geaendert:
- `Management Analyse` hat jetzt einen fuehrenden Reiter `Finance Summary`.
- Die Kennzahlen in diesem Reiter verwenden dieselbe `FinanceRuleEngine` wie das zentrale Excel-Blatt `Finance Summary`.
- Filter fuer Jahr, Land und Waehrung wirken auf das Endergebnis, nicht nur auf eine Rohdatenansicht.
- Die bisherige Management-Tabelle bleibt als separater Rohdaten-/Diagnose-Reiter erhalten.
- Fuer DE 2026 wird kein Fehler mehr geworfen. Da DE/Alphaplan fachlich auf 2025 gezwungen ist, zeigt das Dashboard fuer DE 2026 einen leeren Zustand mit Hinweis.
Verifiziert:
- Lokale Probe gegen DB und Excel zeigte, dass die alte `Management Analyse` wegen Rohwerten, anderem Datum und EUR-Umrechnung nicht mit der Finance Summary uebereinstimmte.
- Tests: `dotnet test TrafagSalesExporter.sln --verbosity minimal` mit `77/77` bestanden.
Commit:
- `610e771 Add finance summary view and HR guide`
## H7 - HR KPI Cockpit erweitert und Anwenderdokus erstellt 2026-05-20
Quelle: lastchange.md.raw
## HR KPI Cockpit erweitert und Anwenderdokus erstellt 2026-05-20
Geaendert:
- `HR KPI Cockpit` hat einen neuen Reiter `Anleitung` fuer HR-Anwenderinnen.
- Der Datenordner fuer Rexx-/SAP-Dateien ist im Cockpit sichtbar und je Lauf anpassbar; dauerhaft ueber `HrKpi:DataFolder` in `appsettings.json`.
- Dateistatus zeigt jetzt letzte Aenderung, Dateialter und Frischebewertung.
- Neue Auswertungen: Ampeln, Periodenvergleich, Datenqualitaets-Hinweise, Austritte nach Typ/Organisation und Absenzen nach Organisation.
- Managementsicht anonymisiert personenbezogene Details und reduziert die Anzeige auf aggregierte Kennzahlen.
- Print-/PDF-Funktion im Cockpit ergaenzt.
Anwenderdokus:
- `docs/HR_KPI_ANLEITUNG_HR_2026-05-20.docx`
- `docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx`
Verifiziert:
- Word-Dateien als gueltige DOCX-Pakete geprueft.
- Tests: `dotnet test TrafagSalesExporter.sln --verbosity minimal` mit `77/77` bestanden.
Commit:
- `06fb560 Expand HR KPI cockpit and add user guides`
## H8 - Workflow-Konsistenz fuer Keyuser verbessert 2026-05-20
Quelle: lastchange.md.raw
## Workflow-Konsistenz fuer Keyuser verbessert 2026-05-20
Geaendert:
- Export Dashboard zeigt jetzt Warnungen, wenn aktive Manual-Excel-Standorte noch keine Datei/Pfad hinterlegt haben.
- Nach einem Einzelstandortexport wird darauf hingewiesen, dass die zentrale Excel separat neu erzeugt werden muss.
- Dashboard markiert, wenn seit der letzten zentralen Excel ein Standortexport gelaufen ist.
- Neuer Keyuser-Menuepunkt `Manuelle Importe` fuer DE/UK/ES-artige Excel-/CSV-Quellen:
- Pfad/SharePoint-Referenz pflegen
- Datei hochladen
- Standort aktiv/inaktiv setzen
- Pfad pruefen
- Live-Status startet nicht mehr pauschal mit `HANA Abfrage...`, sondern quellenneutral bzw. fuer Manual Excel/SAP passender.
- Zentrale Excel enthaelt ein neues Blatt `Finance Summary` mit Summen nach Jahr, Land und Waehrung.
- `Management Analyse` ist klarer als Rohdaten-/Plausibilitaetssicht markiert.
- `Soll/Ist Vergleich` ist klarer als verbindliche Finance-Sicht markiert.
Nachtrag:
- Unter `Manuelle Importe` gibt es jetzt einen zweiten Reiter `Anleitung`.
- Der Reiter zeigt den Keyuser-Ablauf grafisch:
- Excel bereitstellen
- speichern und aktivieren
- Standort exportieren
- zentrale Excel erzeugen
- Finance pruefen
- Zusatzhinweise markieren die richtige Reihenfolge, den offenen DE-Fachentscheid und dass auf dem Server kein Microsoft Excel benoetigt wird.
Bewusst nicht geaendert:
- DE-Fachregel bleibt offen, bis Munir/Finance bestaetigt, welche Kundenlaender/Filter zum offiziellen DE-Ist gehoeren.
## H9 - Keyuser Prozessdoku SVG 2026-05-20
Quelle: lastchange.md.raw
## Keyuser Prozessdoku SVG 2026-05-20
Erstellt:
- `docs/KEYUSER_PROZESSDOKU_2026-05-20.svg`
Inhalt:
- Prozess von Vorbereitung ueber Standortexport, zentrale Excel und Finance-Soll/Ist bis Fehlerbehandlung.
- Fokus auf Keyuser-Aktionen in der App: Settings, Standorte, Export Dashboard, Management Analyse, Soll/Ist Vergleich, Logs.
- Enthaltene Fachpunkte: Manual Excel fuer UK/ES/DE, DE Alphaplan, IT-Sonderregel, Finance-Spalten im Endexcel.
- Technische Implementierungsdetails und Testprogramme sind bewusst ausgeklammert.
## H10 - Technische Systemarchitektur SVG 2026-05-20
Quelle: lastchange.md.raw
## Technische Systemarchitektur SVG 2026-05-20
Erstellt:
- `docs/SYSTEMARCHITEKTUR_TECHNISCH_2026-05-20.svg`
Inhalt:
- Laufzeit und IIS-Publish als `BiDashboard.dll` ohne EXE/AppHost.
- Blazor-UI, Authentisierung, Start-/Background-Services.
- Applikationskern: Export-Orchestrierung, Standortexport, Adapter, Transformationen, zentrale Tabelle.
- Datenquellen: SAP HANA/BI1/SAGE, SAP Gateway/OData, Manual Excel/CSV, SharePoint.
- Persistenzmodell mit wichtigsten SQLite-Tabellen.
- Output-/SharePoint-Pfade, Finance-Sonderregeln, HR/Finance-Zugriff und Betriebspruefpunkte.
- Test-/Probeprogramme sind bewusst nicht enthalten.
## H11 - IT Finance-Methode fachlich bestaetigt 2026-05-20
Quelle: lastchange.md.raw
## IT Finance-Methode fachlich bestaetigt 2026-05-20
Entscheid:
- Fuer Italien gilt die vom Finance-Leiter bestaetigte Methode.
- `CustomerName` enthaelt `Trafag Italia` wird aus dem IT-Finance-Ist ausgeschlossen.
- Doppelte IT-Zeilen mit leerem `Supplier country` werden nur einmal gezaehlt.
- Diese Regel gilt nur fuer IT.
Wichtig:
- Die bisherige Kundenausschluss-Kombination passte 2025 numerisch naeher an den Sollwert, ist aber nicht die belastbare Methode fuer Folgejahre.
- Der 2025-Zufallstreffer wird deshalb nicht als fachliche Regel weiterverwendet.
Gegen aktuelle DB getestet:
```text
Soll IT: 7'669'840.00
Bisherige IT-Summe: 7'669'641.47
Bisherige Differenz: -198.53
Trafag Italia Abzug in DB: 6'495.71
Dubletten-Abzug SupplierCountry leer: 0.00
Neue fachliche Methode: 7'663'145.76
Neue Differenz: -6'694.24
```
Umsetzung:
- `Services/FinanceReconciliationService.cs`
- `Services/ExcelExportService.cs`
- Tests in `TrafagSalesExporter.Tests/FinanceReconciliationServiceTests.cs`
## H12 - IIS Deployment Handoff 2026-05-19
Quelle: lastchange.md.raw
## IIS Deployment Handoff 2026-05-19
Aktueller Deployment-/IIS-Stand wurde hier dokumentiert:
```text
docs/DEPLOYMENT_IIS_HANDOFF_2026-05-19.md
```
Kurzstand:
- `TrafagSalesExporter` veroeffentlicht jetzt als `BiDashboard.dll`.
- Keine EXE im Publish.
- Publish-Ziel: `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\`.
- Wahrscheinliche URL: `https://trch-webapp-bidashboard.trafagch.local/BiDashboard/`.
- Diagnose-`web.config` ist aktiv mit `httpErrors Detailed` und `stdoutLogEnabled=true`.
- `logs`-Ordner existiert auf dem Share, blieb nach dem 500 aber leer.
- ACL-Befund: `IIS_IUSRS` hat nur `ReadAndExecute`; App braucht fuer SQLite/logs wahrscheinlich `Modify`.
- Rechte konnten lokal nicht gesetzt werden: `icacls` auf dem Share endete mit `Zugriff verweigert`.
Naechster Schritt:
- Server-Spezialist muss App-Pool-Identity bzw. `IIS_IUSRS` mit `Modify` auf Publish-Ordner, `logs` und `trafag_exporter.db*` berechtigen und danach App-Pool neu starten.
## H13 - ASP.NET Publish direkt aus TrafagSalesExporter 2026-05-19
Quelle: lastchange.md.raw
## ASP.NET Publish direkt aus TrafagSalesExporter 2026-05-19
Entscheid:
- `TrafagSalesExporter` bleibt das fuehrende Projekt.
- Das separate `BiDashboard`-Projekt wird fuer den aktuellen Stand nicht benoetigt.
- `TrafagSalesExporter` ist bereits eine ASP.NET/Blazor-Webanwendung (`Microsoft.NET.Sdk.Web`) und kann direkt veroeffentlicht werden.
Umsetzung:
- `OutputType=WinExe` wurde aus `TrafagSalesExporter.csproj` entfernt.
- Der `BiDashboard`-Verweis wurde aus `TrafagSalesExporter.sln` entfernt.
- Das Publish-Profil `Properties/PublishProfiles/FolderProfile.pubxml` zeigt auf den Server-Publish-Pfad:
```text
\\trch-webapp-bidashboard.trafagch.local\BiDashboard$
```
Wichtig fuer Deployment:
- Die Anwendung wird nicht durch Doppelklick auf eine EXE gestartet.
- Der Server-Spezialist soll die publish-Ausgabe als ASP.NET-Webanwendung/IIS-App betreiben.
- Publish lokal:
```powershell
dotnet publish .\TrafagSalesExporter.csproj -c Release
```
## H14 - Finance Cockpit Login und Vergleichsnachtrag 2026-05-19
Quelle: lastchange.md.raw
## Finance Cockpit Login und Vergleichsnachtrag 2026-05-19
Nach dem Finance-Handoff vom 2026-05-18 wurden noch mehrere Schritte umgesetzt:
- Haupt-App-Seite `/finance-cockpit/vergleich` wurde an die Logik und Darstellung der FinanceProbe angeglichen.
- Leere Ist-Zeilen ohne belastbaren Ist-Wert werden im Finance-Vergleich ausgefiltert.
- Die verwendeten Berechnungsformeln je Land wurden dokumentiert:
```text
docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md
```
- Finance Cockpit erhielt einen separaten Login, unabhaengig vom HR-KPI-Login.
Technischer Stand Finance-Cockpit-Login:
- Konfiguration: `FinanceCockpitAccess` in `appsettings.json`
- Benutzer im aktuellen Stand: `finance`
- Passwort ist als SHA-256-Hash gespeichert.
- Finance nutzt ein eigenes Passwort: `Trafag-Finance-Cockpit-2026!`.
- HR-KPI nutzt weiterhin seine eigene `HrKpiAccess`-Konfiguration.
- Umsetzung:
- `Services/FinanceCockpitAccessService.cs`
- `Security/FinanceCockpitAccessOptions.cs`
- `Components/FinanceCockpit/FinanceCockpitUnlockPanel.razor`
- `Components/Routes.razor`
- `Components/Layout/NavMenu.razor`
- Registrierung in `Program.cs`
AD-/Rollenstand:
- `Security.Enabled = false` deaktiviert die globale AD-/Rollenpruefung fuer den Moment.
- Die vorhandenen `AccessGroups` und `AdminGroups` bleiben in `appsettings.json` stehen und wurden nicht geloescht.
- Wenn AD/Rollen wieder gelten sollen, `Security.Enabled` auf `true` setzen.
- Finance- und HR-KPI-Sperren bleiben auch bei deaktivierter AD-Pruefung aktiv.
Relevante Commits:
```text
8f1b1b8 Align main finance comparison with probe
f855e06 Filter empty actual finance rows
5c654ad Document finance formulas by country
9c544af Protect finance cockpit with login
```
## H15 - Zentrale Excel Finance-Filter 2026-05-19
Quelle: lastchange.md.raw
## Zentrale Excel Finance-Filter 2026-05-19
Die zentrale Laenderdatei `Sales_All_yyyy-MM-dd.xlsx` wurde fuer den CFO-/Finance-Abgleich erweitert.
Im Blatt `Sales` gibt es rechts einen zusammengehoerigen Finance-Spaltenblock:
```text
Finance | Year
Finance | Country Key
Finance | Date
Finance | Net Sales Actual
Finance | Currency
Finance | Include
Finance | Source Value Field
```
Ziel:
- Finance kann im zentralen Excel dieselben Ist-Summen erzeugen wie im Testprogramm.
- Es muss nicht geraten werden, ob `Land`, `TSC`, `Sales Price/Value`, `Document Total LC`, `posting date` oder `invoice date` zu verwenden ist.
Filterregel fuer Finance:
```text
Finance | Year = 2025
Finance | Country Key = gewuenschtes Land
Finance | Include = TRUE
Summe ueber Finance | Net Sales Actual
```
Nur in der zentralen Datei wird ein zweites Blatt erzeugt:
```text
Finance Filter Hilfe
```
Dieses Hilfsblatt beschreibt die zusammengehoerigen Finance-Spalten und die konkrete Filter-/Summenlogik.
Verifikation:
- Build erfolgreich:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_finance_help_sheet\ --verbosity minimal
```
- Preview-Excel erzeugt und geprueft:
```text
.tmp_tools\GenerateConsolidatedPreview\out\Sales_All_2026-05-19.xlsx
```
- Gepruefte Blaetter:
```text
Sales | Finance Filter Hilfe
```
- Finance-Spaltenblock im Blatt `Sales`:
```text
36: Finance | Year
37: Finance | Country Key
38: Finance | Date
39: Finance | Net Sales Actual
40: Finance | Currency
41: Finance | Include
42: Finance | Source Value Field
```
- Summenvergleich gegen `FinanceReconciliationService` fuer 2025:
| Key | Finance-Service | Excel-Finance-Spalten | Status |
| --- | ---: | ---: | --- |
| AT | `3'438'121.37` | `3'438'121.37` | MATCH |
| CH | `43'521'390.82` | `43'521'390.82` | MATCH |
| ES | `3'082'320.18` | `3'082'320.18` | MATCH |
| FR | `1'471'218.44` | `1'471'218.44` | MATCH |
| IN | `750'936'591.38` | `750'936'591.38` | MATCH |
| IT | `7'669'641.47` | `7'669'641.47` | MATCH |
| UK | `3'533'710.09` | `3'533'710.09` | MATCH |
| US | `3'749'865.33` | `3'749'865.33` | MATCH |
Relevante Commits:
```text
ebbc5a1 Add finance filter columns to consolidated export
b23f73e Add finance filter help sheet
```
## H16 - UK_B1 Mapping / FinanceProbe Nachtrag 2026-05-11
Quelle: lastchange.md.raw
## UK_B1 Mapping / FinanceProbe Nachtrag 2026-05-11
Anlass:
- In der FinanceProbe zeigte UK/England fuer `TRUK` nur `395'605.82 GBP` Ist gegen `3'749'865.00 GBP` Soll.
- In den Varianten fehlten weitere sinnvolle Abgrenzungen; sichtbar war nur `Positions-Netto (Sales Price/Value)`.
- Der Standort soll weiterhin `UK_B1` verwenden.
Technischer Befund:
- Standort:
- `Land = England`
- `TSC = TRUK`
- `SourceSystem = MANUAL_EXCEL`
- Korrekte Quelle:
```text
https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1
```
- Lokal waren fuer `TRUK` keine `ManualExcelColumnMappings` vorhanden.
- Der Import lief deshalb ueber die Header-Automatik.
- Die Header-Automatik behandelte `Sales Price/Value` als fertigen Positionswert.
- In der UK-B1-Datei ist `Sales Price/Value` nach aktuellem Befund aber ein Stueckpreis.
- Der Finance-Positionswert muss deshalb berechnet werden:
```text
[Sales Price/Value] * [Quantity]
```
Probe auf den bereits geladenen UK-Daten:
| Berechnung | Wert |
| --- | ---: |
| Bisher importiert: Summe `SalesPriceValue` | `395'605.82 GBP` |
| Rekonstruiert: Summe `SalesPriceValue * Quantity` | `3'533'348.89 GBP` |
| Soll `check.xlsx` | `3'749'865.00 GBP` |
| Restdifferenz nach Multiplikation | ca. `216'516.11 GBP` |
Umgesetzte Codeaenderung:
- `Services/ManualExcelImportService.cs`
- grafische Manual-Excel-Mappings koennen jetzt einfache berechnete Quellen auswerten
- aktuell benoetigte Syntax:
```text
=[Header A]*[Header B]
```
- Konstanten wie `=GBP` bleiben unveraendert gueltig
- `Services/DatabaseSeedService.cs`
- England/TRUK wird auf den SharePoint-Ordner `Import/Finance/UK_B1` repariert, wenn der alte/falsche Pfad `Import/Finance/England` oder ein leerer Pfad vorhanden ist
- fuer `TRUK` wird ein grafisches Manual-Excel-Mapping geseedet
- wichtigste Zuordnung:
```text
SalesPriceValue <- =[Sales Price/Value]*[Quantity]
SalesCurrency <- =GBP
DocumentCurrency<- =GBP
CompanyCurrency <- =GBP
PostingDate <- invoice date
InvoiceDate <- invoice date
```
- `TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs`
- neuer Test fuer Multiplikationsausdruck im Manual-Excel-Mapping
- prueft, dass `123.45 * 7 = 864.15` als `SalesPriceValue` importiert wird
Aktueller Verifikationsstand:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal
```
Ergebnis:
- Tests erfolgreich.
- `59/59` Tests gruen.
- Bekannte Warnungen bleiben die bestehenden MudBlazor-Analyzerwarnungen zu `Dense`.
Zusatzfix:
- `DatabaseSeedService` wurde gehaertet.
- Der UK-Mapping-Seed wird nur ausgefuehrt, wenn `ManualExcelColumnMappings` sauber auf `Sites` referenziert.
- Dadurch wird der Initialisierungslauf nicht blockiert, wenn eine bestehende SQLite-DB gerade noch aus alten Reparaturtabellen wie `Sites_repair_old` bereinigt wird.
Naechster praktischer Schritt:
- Lokale DB wurde direkt aktualisiert:
- `TRUK` zeigt auf `https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1`
- `TRUK` hat `18` aktive Manual-Excel-Mapping-Zeilen
- `SalesPriceValue <= =[Sales Price/Value]*[Quantity]`
- FinanceProbe wurde auf `http://127.0.0.1:5099` neu gestartet.
- `/finance` antwortet mit HTTP `200`.
- `/run/export/TRUK` wurde angestossen, konnte aber wegen lokaler SharePoint-/Graph-Authentifizierung nicht neu laden:
```text
ClientSecretCredential authentication failed
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte. (127.0.0.1:9)
```
Damit gilt:
- Code, Seed und lokale Mapping-Konfiguration sind vorbereitet.
- Die zentrale Tabelle `CentralSalesRecords` enthaelt fuer UK noch den alten Importstand, bis der SharePoint-Zugriff wieder funktioniert und `TRUK` neu exportiert wird.
- Aktueller alter Zentralstand bleibt deshalb:
- `1'882` Zeilen
- `395'605.82 GBP` Summe `SalesPriceValue`
- rekonstruiert `3'533'348.89 GBP` ueber `SalesPriceValue * Quantity`
Offen fachlich fuer UK:
- Nach neuem Export mit Mapping muss die Restdifferenz gegen `check.xlsx` erneut gemessen werden.
- Wenn der Wert bei ca. `3.53 Mio. GBP` liegt, UK-Datei auf Rabatte, Fracht, Nebenpositionen oder eine andere Netto-Spalte pruefen.
- Wenn der Wert auf `3.75 Mio. GBP` steigt, war das Mapping die Hauptursache.
## H17 - Manual Excel/CSV SharePoint-Ordner und Quellordner-Export 2026-05-08
Quelle: lastchange.md.raw
## Manual Excel/CSV SharePoint-Ordner und Quellordner-Export 2026-05-08
Umgesetzte Anpassungen:
- Manual Excel/CSV Quellen erzeugen nun immer eine neue Exportdatei; die Quelldatei wird nicht als Exportdatei weitergereicht.
- Lokale Manual-Dateien schreiben die neue Exportdatei in denselben lokalen Ordner wie die Quelldatei.
- SharePoint-Manual-Dateien schreiben die neue Exportdatei in denselben SharePoint-Ordner wie die Quelldatei.
- SharePoint-Referenzen ohne Dateiendung werden als Ordner behandelt.
- Bei SharePoint-Ordnern sucht die App die neueste passende Excel-/CSV-Datei fuer den Standort.
- Fuer datierte Dateien wird das Muster `ddMMyy_TSC.xlsx` bzw. `ddMMyy_TSC.csv` ausgewertet.
- Beispiel England/UK:
- Ordner: `https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1`
- `010526_TRUK.xlsx` wird vor `010426_TRUK.xlsx` gewaehlt.
- Falls kein Datum aus dem Dateinamen gelesen werden kann, faellt die Auswahl auf das SharePoint-Aenderungsdatum zurueck.
Technischer Befund aus den Logs:
- Spanien konnte die SharePoint-Datei lesen (`4'341` Zeilen), fiel danach aber auf einen ungueltigen lokalen Pfad, weil die URL als lokale Exportdatei behandelt wurde.
- Fehlerpfad war sinngemaess `...\https:\trafagag.sharepoint.com\...\Spain_Sales_2025.csv`.
- Deutschland hatte keinen manuellen Dateipfad hinterlegt.
- England/TRUK zeigte lokal versehentlich auf die Deutschland-Alphaplan-Datei; die lokale DB wurde auf den UK_B1-Ordner korrigiert.
Codeaenderungen:
- `DataSourceFetchResult` enthaelt optionale Overrides fuer lokalen Output-Ordner und SharePoint-Zielordner.
- `ManualExcelDataSourceAdapter` erkennt SharePoint-Dateien vs. SharePoint-Ordner und waehlt bei Ordnern die neueste passende Datei.
- `SharePointUploadService` kann den neuesten passenden Datei-Eintrag in einem SharePoint-Ordner aufloesen.
- `SiteExportService` nutzt fuer Manual-Quellen den Quellordner als Zielordner.
- `StandortePageService` erlaubt fuer Manual-Importe nun auch SharePoint-Ordnerreferenzen.
- Standort-UI-Hilfetext wurde entsprechend angepasst.
- `DatabaseSeedService` repariert England/TRUK auf den UK_B1-Ordner, wenn der Manual-Pfad leer ist.
Letzte technische Verifikation:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore --verbosity minimal
```
Ergebnis:
- Tests erfolgreich, `55/55`
- Bekannte MudBlazor-Analyzerwarnungen zu `Dense` bleiben bestehen.
## H18 - FinanceProbe erweitert fuer alle Finance-Referenzen 2026-05-08
Quelle: lastchange.md.raw
## FinanceProbe erweitert fuer alle Finance-Referenzen 2026-05-08
Umgesetzte Anpassungen:
- FinanceProbe zeigt nun alle aktiven `FinanceReferences` fuer 2025, auch wenn noch kein aktiver/importierter Standort dazu Daten liefert.
- Damit werden auch Laender wie AT, CH, CN, CZ, GFS, JP, MS, MSA, PL und RU sichtbar als `Keine Daten`, bis Ist-Daten vorhanden sind.
- Zusaetzliche Sektion `Datenabdeckung je Standort`:
- Standort / TSC
- Quellsystem und Anschlussart
- Manual-Datei- oder SharePoint-Pfad
- Aktivstatus
- Anzahl 2025-Zeilen in `CentralSalesRecords`
- Summe `SalesPriceValue`
- Waehrungen
- importierte Periode
- letzter Exportstatus und Hinweis
- Referenzschluessel-Erkennung wurde fuer CH/AT praezisiert:
- `AT`, `AUT`, `Oesterreich`/`Austria` -> `AT`
- `CH`, `CHE`, `Schweiz`/`Switzerland` -> `CH`
- Damit koennen Zeilen aus `ZSCHWEIZ` mit `LAND1 = AT` fachlich Oesterreich zugeordnet werden.
Verifikation:
- `Tools/FinanceProbe` Build erfolgreich.
- Haupttests wurden mit separatem Output/Obj-Pfad ausgefuehrt, damit die laufende App nicht stoert.
## H19 - FinanceProbe als KI-Steuerprogramm 2026-05-11
Quelle: lastchange.md.raw
## FinanceProbe als KI-Steuerprogramm 2026-05-11
Die FinanceProbe ist bewusst als temporaeres Test-/KI-Steuerprogramm erweitert worden. Die produktive Blazor-App bleibt davon getrennt.
Neue Routen:
- `/run/export/{siteKey}`
- startet einen Standortexport nach `Id`, `TSC` oder `Land`
- Beispiele: `/run/export/TRUK`, `/run/export/Spanien`, `/run/export/7`
- `/run/export-all`
- startet Export aller aktiven Standorte
- erzeugt danach die zentrale Datei
- `/run/consolidated`
- erzeugt nur die zentrale Datei aus `CentralSalesRecords`
Nach jedem Lauf zeigt die FinanceProbe eine Run Summary:
- neue Exportlogs seit Start
- Finance-Abgleich gegen `check.xlsx`
- Datenabdeckung je Standort
Zweck:
- Exporte und Finance-Abgleich koennen fuer Tests von der KI per HTTP angestossen werden.
- Die Funktion ist nicht als produktive Bedienoberflaeche gedacht und kann spaeter wieder entfernt werden.
## H20 - Mapper-/Finance-Konfiguration konsolidiert 2026-05-07
Quelle: lastchange.md.raw
## Mapper-/Finance-Konfiguration konsolidiert 2026-05-07
Umgesetzte Aufraeumarbeiten:
- Die doppelte SAP-OData/HANA-Mapping-Engine wurde entfernt.
- Neuer gemeinsamer Service: `MappedSalesRecordComposer`.
- `SapCompositionService` und `HanaQueryService.GetMappedSalesRecordsAsync` laden ihre Quellen weiterhin separat, nutzen danach aber denselben Composer fuer:
- Primaerquelle
- Left Joins
- `SapFieldMapping` nach `SalesRecord`
- Konstanten wie `=SAP` / `=HANA`
- Datums-/Zahlenkonvertierung
- Der alte HANA-B1-Pfad fuer `OINV/INV1/ORIN/RIN1` bleibt bewusst bestehen, damit BI1/SAGE ohne grafisches Mapping weiter laufen.
- Die SAP-Mapping-Normalisierung liegt nur noch in `StandorteSapEditorService`; `StandortePageService` ruft diesen Service beim Speichern auf.
- Der tote Parameter im konsolidierten Export wurde entfernt. `ConsolidatedExportService.ExportAsync()` liest eindeutig aus `CentralSalesRecords`.
- Manueller Import erlaubt in UI und Service jetzt `.xlsx` und `.csv`.
Finance-Konfiguration:
- Neue Tabelle `FinanceReferences` fuer Soll-/check.xlsx-Referenzen je Jahr.
- Neue Tabelle `FinanceIntercompanyRules` fuer 2nd-party/IC-Erkennung nach `ScopeKey`, Kundennummer oder Namensmarker.
- Budgetkurse 2025 werden in `CurrencyExchangeRates` mit `Notes = Budget 2025` geseedet.
- `FinanceReconciliationService` liest Sollwerte, Budgetkurse und IC-Regeln aus der DB.
- Config-Export/-Import enthaelt jetzt `FinanceReferences` und `FinanceIntercompanyRules`.
Noch bewusst offen:
- HANA-B1-Spezialpfad und generischer HANA-Mapper laufen parallel. Das ist aktuell noetig fuer bestehende BI1/SAGE-Standorte ohne Mapping.
- Manual Excel hat weiterhin Header-Automatik und grafisches Mapping. Naechster Aufraeumpunkt waere eine gemeinsame Import-Mapping-Engine.
Letzte technische Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich, `52/52`
- Bekannte MudBlazor-Analyzerwarnungen zu `Dense` bleiben bestehen.
## H21 - SAP OData / ZSCHWEIZ / HANA Mapping 2026-05-07
Quelle: lastchange.md.raw
## SAP OData / ZSCHWEIZ / HANA Mapping 2026-05-07
Aktueller Entscheid:
- `ZSCHWEIZ` wird nicht direkt als SAP-HANA-Spezialfall gelesen.
- `ZSCHWEIZ` wird ueber den bestehenden SAP-OData/Gateway-Pfad gelesen.
- Der grafische Quellen- und Feldmapper bleibt dafuer aktiv.
- Feldinfos muessen nicht hart codiert werden, solange der Gateway-Service `$metadata` fuer das EntitySet liefert.
Quellsystem-Namen wurden zur Entwirrung geschaerft:
- Code `SAP` bleibt technisch bestehen, DisplayName ist jetzt `SAP OData`.
- Code `SAP_HANA` bleibt fuer direkte HANA-Tabellen/Views bestehen, DisplayName ist jetzt `SAP HANA Tables/Views`.
- Bestehende Konfigurationen bleiben dadurch kompatibel.
Seed / Vorkonfiguration:
- Standort `ZSCHWEIZ` / Land `Schweiz/Oesterreich` wird als inaktiver Standort angelegt bzw. repariert.
- `SourceSystem = SAP`.
- Quelle: Alias `Z`, EntitySet `ZSCHWEIZSet`.
- Mapping ist grafisch editierbar und wird auf die Felder der Tabelle `ZSCHWEIZ` gesetzt.
- Die Seed-/Repair-Logik zieht Quelle und Mapping auch bei bereits vorhandener ZSCHWEIZ-Konfiguration nach; manuelles Mapping ist nur noetig, wenn die Gateway-Feldnamen vom erwarteten `ZSCHWEIZ`-Layout abweichen.
Wichtig fuer die UI:
1. App neu starten, damit Seed/Repair laeuft.
2. `Settings -> Quellsysteme`: `SAP` sollte als `SAP OData` erscheinen.
3. `Standorte -> ZSCHWEIZ`:
- Quellsystem `SAP OData (SAP)`
- SAP Service URL Override auf den finalen OData-Service fuer `ZSCHWEIZ` setzen, falls die zentrale SAP-URL noch auf `ZPOWERBI_EINKAUF_SRV` zeigt.
- `Entity Sets refreshen`.
- Quelle `Z` soll auf `ZSCHWEIZSet` zeigen.
- `Felder aus Quellen laden`.
- Mapping kontrollieren.
ABAP / SAP:
- ABAP-Report liegt in `report.abap`.
- Report fuellt Tabelle `ZSCHWEIZ` aus Buchungskreis `1100` = Schweiz und `1200` = Oesterreich.
- `LAND1` ist Reporting-Land aus Buchungskreis.
- `CUSTOMER_LAND` ist Kundenland aus `KNA1-LAND1`.
- Upsert erfolgt per `MODIFY zschweiz FROM TABLE`.
Letzte technische Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich, `50/50`
## H22 - Finance-Abgrenzung: Antworten Andreas 2026-05-07
Quelle: lastchange.md.raw
## Finance-Abgrenzung: Antworten Andreas 2026-05-07
Fachliche Vorgabe nach Rueckmeldung:
- Net Sales Actuals werden in Hauswaehrung gerechnet.
- Massgebend ist der Nettofakturawert.
- Umrechnung nach CHF erfolgt mit Budgetkursen, nicht mit Tageskursen.
- Umrechnung/Summierung soll pro Artikel bzw. Belegposition erfolgen.
- Indien wird in INR betrachtet.
- Italien wird in Hauswaehrung betrachtet; Intercompany-/2nd-party-Abgrenzung wird separat angeschaut.
- UK wird in GBP betrachtet.
- Gutschriften haben eigene Rechnungsnummern/Rechnungspositionen und sollen ueber Artikelnummern/Positionen behandelt werden.
- Intercompany soll im zweiten Schritt als 2nd-party/3rd-party-Klassifikation pflegbar werden.
- Genannte 2nd-party/Intercompany-Indikatoren: Trafag, Magnetic Sense/Magnets Sense, Gesellschaft fuer Sensorik; Nummern/Uebersetzungen koennen je Land abweichen.
Budgetkurse 2025 fuer CHF-Ausweis:
```text
USD/CHF = 0.85
EUR/CHF = 0.95
GBP/CHF = 1.13
CHF/INR = 90.91
CHF/CZK = 25.64
PLN/CHF = 0.22
CHF/JPY = 156.25
```
Umsetzung in der FinanceProbe:
- Auswahl der Ist-Variante bevorzugt nun `Nettofakturawert Hauswaehrung` (`DocTotal - VatSum`).
- `Sales Price/Value` bleibt als Vergleichsvariante sichtbar.
- Zusaetzlicher Kandidat `Nettofakturawert Hauswaehrung -> CHF Budget 2025`.
- Referenz in der Oberflaeche wird als `check.xlsx Sollwert` bezeichnet, nicht mehr als fuehrende Power-BI-Referenz.
- Intercompany-Anzeige wurde fachlich als `2nd-party/IC` beschriftet; Regeln werden jetzt in `FinanceIntercompanyRules` geseedet und per Config exportiert/importiert.
## H23 - Finance Probe / Sales-Abgrenzung
Quelle: lastchange.md.raw
## Finance Probe / Sales-Abgrenzung
Ziel der heutigen Arbeit:
- separate kleine Pruef-GUI fuer Finanz-/Sales-Abgrenzungen bauen
- moeglichst viel Logik aus dem Hauptprogramm wiederverwenden
- verschiedene Summenlogiken pro Land nebeneinander sichtbar machen
- gegen `check.xlsx` vergleichen
Wichtiges fachliches Verstaendnis nach Klaerung im Chat:
- `check.xlsx` kommt von Rhino und enthaelt die Soll-Zahlen von Andreas.
- Aus den Landessystemen kommt der Ist-Wert.
- Power BI soll in der fachlichen Kommunikation nicht als fuehrende Referenz genannt werden.
- Ziel ist nicht, zufaellig die passendste technische Variante zu nehmen, sondern je Land/System die fachlich korrekte Abgrenzungslogik zu klaeren.
## H24 - Commit
Quelle: lastchange.md.raw
## Commit
Rollback-Commit fuer die Finance-Probe wurde erstellt:
```text
15dec06 Add finance reconciliation probe
```
Dieser Commit enthaelt gezielt:
- `Services/FinanceReconciliationService.cs`
- `Tools/FinanceProbe/FinanceProbe.csproj`
- `Tools/FinanceProbe/Program.cs`
- DI-Registrierung in `Program.cs`
- Dashboard nutzt den ausgelagerten Finance-Service
- `TrafagSalesExporter.csproj` schliesst `Tools/**` aus dem Hauptprojekt aus
- `TrafagSalesExporter.sln` enthaelt das neue Tool-Projekt
Andere bereits vorhandene Worktree-Aenderungen wurden nicht mitcommitted.
## H25 - Neues Tool
Quelle: lastchange.md.raw
## Neues Tool
Neues separates Probe-GUI:
```text
Tools/FinanceProbe
```
Start:
```powershell
dotnet run --project Tools\FinanceProbe\FinanceProbe.csproj --urls http://localhost:55417
```
URL:
```text
http://localhost:55417/finance
```
Aktueller Start im Chat:
- Probe-GUI wurde auf `localhost:55417` gestartet
- HTTP `200` bestaetigt
Hinweis Netzwerk:
- Start mit `localhost` ist nur lokal auf dem Laptop erreichbar.
- Andere im Trafag-Netz koennen es so normalerweise nicht ueber Laptop-IP oeffnen.
- Fuer Netzwerkzugriff waere `http://0.0.0.0:55417` noetig.
- Probe-GUI hat aktuell keine Authentifizierung, daher nicht unkontrolliert im Netzwerk freigeben.
## H26 - FinanceReconciliationService
Quelle: lastchange.md.raw
## FinanceReconciliationService
Neue wiederverwendbare Logik:
```text
Services/FinanceReconciliationService.cs
```
Interface:
```csharp
IFinanceReconciliationService
```
Aktuelle Funktion:
```csharp
Task<List<NetSalesReferenceRow>> BuildNetSalesReferenceRowsAsync(int year = 2025)
```
Logik:
- liest `CentralSalesRecords`
- filtert Jahr ueber `InvoiceDate`, fallback `ExtractionDate`
- gruppiert pro Referenz-Key/Land
- berechnet Kandidaten:
- `SalesPriceValue`
- `DocTotalFC - VatSumFC`
- `DocTotal - VatSum`
- Belegkopfwerte werden vor Summierung dedupliziert:
- bevorzugt `TSC + DocumentType + DocumentEntry`
- fallback `TSC + DocumentType + InvoiceNumber`
- erkennt aktuell Intercompany nur pragmatisch fuer IT/TRIT anhand bekannter Kunden
- liefert pro Kandidat Wert, Waehrung, IC-Wert, Differenzen
## H27 - FinanceProbe Darstellung
Quelle: lastchange.md.raw
## FinanceProbe Darstellung
Die Tabelle zeigt aktuell:
- Status
- Firma
- gewaehlte Abgrenzung
- Ist-Waehrung
- Ist 2025
- Referenz-Waehrung
- Referenz
- Excel LC
- Excel CHF
- Excel Power BI
- Excel Status
- Differenz
- Differenz ohne IC
- Waehrung
- Zeilen
- Varianten aufklappbar
Wichtig:
- Die Bezeichnung `Power BI` ist in der Probe-Oberflaeche noch sichtbar, weil `check.xlsx` diese Spalte enthaelt.
- Fachlich soll in Kommunikation gegen Andreas aber `check.xlsx` / Soll-Zahl genannt werden, nicht Power BI als fuehrende Referenz.
- Eine sinnvolle naechste UI-Bereinigung waere, die Spalte/Labels in der Probe auf `Excel Sollwert` oder `Rhino Sollwert` umzubenennen.
## H28 - Probe-Output vom 2026-05-04 09:55
Quelle: lastchange.md.raw
## Probe-Output vom 2026-05-04 09:55
Zusammenfassung:
```text
8 Standorte
4 OK
1 Pruefen
3 Keine Daten
Excel-Referenzen gelesen: 17
```
Befunde:
## H29 - CH
Quelle: lastchange.md.raw
### CH
- Keine Ist-Daten
- keine sichtbare Soll-Zahl
## H30 - DE
Quelle: lastchange.md.raw
### DE
- Keine Ist-Zeilen aus Systemdaten
- Soll/LC aus Excel vorhanden:
- Referenz ca. `3'635'923`
- Excel LC `3'635'922.91`
- Excel CHF `3'407'000.00`
Offen:
- Quelle fuer DE klaeren
- evtl. MANUAL_EXCEL oder noch nicht exportiert
## H31 - ES
Quelle: lastchange.md.raw
### ES
- Keine Ist-Zeilen aus Systemdaten
- Soll/LC aus Excel vorhanden:
- Referenz ca. `3'102'334`
- Excel LC `3'102'333.61`
- Excel CHF `2'907'000.00`
Offen:
- Quelle fuer ES klaeren
- evtl. MANUAL_EXCEL oder noch nicht exportiert
## H32 - FR
Quelle: lastchange.md.raw
### FR
- Status OK
- gewaehlte Abgrenzung: `Sales Price/Value`
- Ist-Waehrung: `EUR`
- Ist: `1'471'218.44`
- Soll/Referenz: `1'471'218.00`
- Differenz: `0.44`
- Zeilen: `1649`
Befund:
- FR passt praktisch exakt mit `Sales Price/Value` in EUR.
Offene Frage an Andreas:
- Ist `Sales Price/Value` in EUR fuer FR fachlich korrekt?
## H33 - IN
Quelle: lastchange.md.raw
### IN
- Status OK
- gewaehlte Abgrenzung: `Sales Price/Value`
- Ist-Waehrungen: `CHF, EUR, GBP, INR, JPY, USD`
- Ist: `750'936'591.38`
- Soll/Referenz: `750'936'591.00`
- Differenz: `0.38`
- Zeilen: `4000`
Befund:
- IN passt rechnerisch fast exakt, aber Waehrungen sind gemischt.
Offene Frage an Andreas:
- Ist diese gemischte Summe fachlich korrekt?
- Oder muss nach CHF umgerechnet bzw. nach Waehrung getrennt werden?
## H34 - IT
Quelle: lastchange.md.raw
### IT
- Status Pruefen
- gewaehlte Abgrenzung: `DocTotal - VatSum`
- Ist-Waehrung: `EUR`
- Ist: `11'866'896.53`
- Soll/Referenz LC: `7'669'840.00`
- Differenz: `4'197'056.53`
- Differenz ohne IC: `3'733.67`
- Zeilen: `15883`
Befund:
- IT liegt ohne IC-Abzug stark daneben.
- Mit erkanntem IC-Abzug ist die Differenz sehr klein.
Offene Frage an Andreas:
- Soll IT mit Intercompany-Abzug gerechnet werden?
- Falls ja: nach welchen Kunden/Kriterien erkennt Finance Intercompany?
## H35 - UK
Quelle: lastchange.md.raw
### UK
- Status OK
- gewaehlte Abgrenzung: `Sales Price/Value`
- Ist-Waehrung: `USD`
- Ist: `3'749'865.33`
- Soll/Referenz: `3'749'865.00`
- Differenz: `0.33`
- Zeilen: `942`
Befund:
- UK passt praktisch exakt mit `Sales Price/Value` in USD.
Offene Frage an Andreas:
- Ist USD fuer UK korrekt?
- Oder muss fuer offizielles Reporting nach CHF umgerechnet werden?
## H36 - US
Quelle: lastchange.md.raw
### US
- Status OK
- gewaehlte Abgrenzung: `Sales Price/Value`
- Ist-Waehrung: `USD`
- Ist: `3'749'865.33`
- Soll/Referenz: `3'749'865.00`
- Differenz: `0.33`
- Zeilen: `942`
Befund:
- US zeigt denselben Ist-Wert wie UK.
- Das wirkt auffaellig und sollte fachlich/technisch geprueft werden.
Offene Frage:
- Welche Quelle und Logik ist fuer US korrekt?
- Ist US im aktuellen System richtig zugeordnet?
## H37 - Word-Datei fuer Andreas
Quelle: lastchange.md.raw
## Word-Datei fuer Andreas
Erstellt:
```text
FINANZ_OFFENE_FRAGEN_ANDREAS.docx
```
Inhalt:
- kurze Mail an Andreas
- `check.xlsx` als Soll-Zahl von Andreas/Rhino formuliert
- Power BI fachlich nicht als Referenz genannt
- bisherige Befunde pro Land:
- FR
- IN
- IT
- UK
- US
- DE / ES
- offene Fragen zu:
- Waehrung und CHF-Umrechnung
- Umsatzdefinition
- Periodenabgrenzung
- Gutschriften/Storno
- Intercompany
- Entscheid-Tabelle pro Land
## H38 - Markdown-Datei fuer Andreas
Quelle: lastchange.md.raw
## Markdown-Datei fuer Andreas
Erstellt/angepasst:
```text
FINANZ_FRAGEN_ANDREAS.md
```
Aktuelle Formulierung:
- `check.xlsx` kommt von Rhino und enthaelt Soll-Zahlen von Andreas.
- Landessysteme liefern Ist-Werte.
- offen ist, welche fachliche Logik pro Land/System zur Soll-Zahl fuehren soll.
- Power BI ist nicht mehr als fuehrende Referenz formuliert.
## H39 - Verifikation
Quelle: lastchange.md.raw
## Verifikation
Ausgefuehrt:
```powershell
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Hauptprojekt baut erfolgreich
- FinanceProbe baut erfolgreich
- Tests erfolgreich
- `48/48` Tests gruen
Bekannte Warnungen:
- `NU1900` im Probe-Build, weil NuGet-Sicherheitsdaten wegen Netzwerk/nuget.org nicht geladen werden konnten
- bekannte MudBlazor Analyzer-Warnungen zu `Dense`
## H40 - Offene sinnvolle naechste Schritte
Quelle: lastchange.md.raw
## Offene sinnvolle naechste Schritte
1. In der Probe-UI `Power BI`-Labels fachlich bereinigen:
- z. B. `Excel Sollwert` / `Rhino Sollwert`
2. Andreas' Antworten in eine Konfiguration ueberfuehren:
- Land/System
- Summenlogik
- System-Waehrung
- CHF-Umrechnung ja/nein
- Periodendatum
- IC-Regel
3. DE/ES Quelle klaeren:
- aktuell keine Ist-Daten
4. US/UK Doppelwert pruefen:
- US zeigt denselben Ist-Wert wie UK
5. IT Intercompany-Regel fachlich bestaetigen
6. Wenn Regeln bestaetigt sind:
- Finance-Probe erweitert anzeigen
- spaeter produktiv ins Hauptprogramm uebernehmen
---
## H41 - Nachtrag 2026-05-04: Excel-Spaltenmapper fuer manuelle Land-Excel-Dateien
Quelle: lastchange.md.raw
## Nachtrag 2026-05-04: Excel-Spaltenmapper fuer manuelle Land-Excel-Dateien
Ausloeser:
- Deutschland hat ein eigenes Excel-Beispiel geliefert.
- Das Format entspricht nicht dem bisherigen Standard-Excel-Import.
- Ziel war, nicht fuer jedes Land statischen Spezialcode zu schreiben, sondern die Spaltenzuordnung konfigurierbar zu machen.
Beispielhafte deutsche Spalten:
- `Export-Datum`
- `Firma`
- `Belegnummer`
- `Position`
- `ArtikelBezeichnung`
- `Warengruppen-Bezeichnung`
- `Anz. VE`
- `Lieferanten Nummer`
- `Name Lieferant`
- `Land Lieferant`
- `AdressNummer-Kunde`
- `Name Kunde`
- `Land Kunde`
- `Branche`
- `EinstandsPreis`
- `Währung`
- `BestellNummer`
- `NettoPreisEinzelX`
- `NettoPreisGesamtX`
- `Versandbedingung`
- `AdressNummer_V`
- `Belegdatum-Rechnung`
- `BelegDatum Auftrag`
- `ArtikelNummer`
Wichtige fachliche/technische Interpretation fuer Deutschland:
- `NettoPreisGesamtX` wird als `SalesPriceValue` verwendet.
- `Währung` wird fuer `SalesCurrency`, `DocumentCurrency`, `CompanyCurrency` und `StandardCostCurrency` verwendet.
- `Belegdatum-Rechnung` wird als `InvoiceDate` verwendet.
- `BelegDatum Auftrag` wird als `OrderDate` verwendet.
- `ArtikelNummer` wird als `Material` verwendet.
- Kommentar-/Info-Zeilen ohne echte Position und ohne Betrag werden beim Import ignoriert.
## H42 - Neue Datenstruktur
Quelle: lastchange.md.raw
## Neue Datenstruktur
Neue Tabelle / neues Model:
```text
ManualExcelColumnMappings
Models/ManualExcelColumnMapping.cs
```
Felder:
- `SiteId`
- `TargetField`
- `SourceHeader`
- `IsRequired`
- `IsActive`
- `SortOrder`
Zweck:
- Pro Standort kann festgelegt werden, welche Excel-Spalte auf welches internes `SalesRecord`-Feld gemappt wird.
- Konstanten sind moeglich, wenn `SourceHeader` mit `=` beginnt, z. B. `=Manual Excel`.
## H43 - Geaenderte Hauptlogik
Quelle: lastchange.md.raw
## Geaenderte Hauptlogik
Geaendert:
```text
Services/ManualExcelImportService.cs
```
Neue Logik:
- Beim manuellen Excel-Import werden zuerst aktive `ManualExcelColumnMappings` des Standorts geladen.
- Wenn Mapping-Zeilen vorhanden sind, wird dieses Mapping verwendet.
- Wenn kein Mapping vorhanden ist, laeuft weiterhin die bisherige statische Standarderkennung.
- Damit bleiben bestehende manuelle Excel-Imports abwaertskompatibel.
Wichtig:
- Der Mapper ersetzt nicht die fachliche Finanzlogik.
- Er sorgt nur dafuer, dass fremde Excel-Spalten korrekt in die internen Felder geschrieben werden.
- Welche Summe spaeter fuer Finance gilt, muss weiterhin fachlich entschieden werden.
## H44 - Geaenderte Standort-UI
Quelle: lastchange.md.raw
## Geaenderte Standort-UI
Geaendert:
```text
Components/Pages/Standorte.razor
Services/StandortePageService.cs
```
In der Standortbearbeitung fuer manuelle Excel-Standorte gibt es neu:
- Bereich `Excel-Spaltenmapping`
- Button `Spalten aus Excel laden`
- Button `Auto-Match`
- Button `Mapping hinzufuegen`
- Tabelle mit:
- Zielfeld
- Excel-Spalte / Konstante
- Pflicht
- Aktiv
- Loeschen
Auto-Match erkennt aktuell u. a. die deutschen Spalten und schlaegt passende Zuordnungen vor.
## H45 - Config-Export / Import
Quelle: lastchange.md.raw
## Config-Export / Import
Geaendert:
```text
Services/ConfigTransferService.cs
Models/ConfigTransferPackage.cs
```
Neu:
- `ManualExcelColumnMappings` werden im Konfigurationspaket mit exportiert.
- Beim Import werden die Mapping-Zeilen wieder hergestellt.
Damit kann die Konfiguration spaeter zwischen Umgebungen mitgenommen werden.
## H46 - Datenbank-Schema
Quelle: lastchange.md.raw
## Datenbank-Schema
Geaendert:
```text
Data/AppDbContext.cs
Services/DatabaseInitializationService.SchemaSql.cs
Services/DatabaseSchemaMaintenanceService.cs
```
Neu:
- `DbSet<ManualExcelColumnMapping>`
- `CREATE TABLE ManualExcelColumnMappings`
- Schema-Wartung legt die Tabelle nachtraeglich an, falls sie in einer bestehenden DB fehlt.
- Beim Loeschen eines Standorts werden dessen manuelle Excel-Mappings mit geloescht.
## H47 - Deutschland lokal eingerichtet
Quelle: lastchange.md.raw
## Deutschland lokal eingerichtet
Am 2026-05-04 wurde Deutschland in der lokalen Datenbank direkt ohne UI eingerichtet.
Lokale DB:
```text
C:\Users\koi\source\repos\Ai\TrafagSalesExporter\trafag_exporter.db
```
Gefundener/konfigurierter Standort:
```text
Id=8
TSC=TRDE
Land=Deutschland
SourceSystem=MANUAL_EXCEL
```
Aktive Mapping-Zeilen:
```text
26
```
Konkrete Zuordnung fuer DE:
```text
ExtractionDate <- Export-Datum
InvoiceNumber <- Belegnummer
PositionOnInvoice <- Position
Material <- ArtikelNummer
Name <- ArtikelBezeichnung
ProductGroup <- Warengruppen-Bezeichnung
Quantity <- Anz. VE
SupplierNumber <- Lieferanten Nummer
SupplierName <- Name Lieferant
SupplierCountry <- Land Lieferant
CustomerNumber <- AdressNummer-Kunde
CustomerName <- Name Kunde
CustomerCountry <- Land Kunde
CustomerIndustry <- Branche
StandardCost <- EinstandsPreis
StandardCostCurrency <- Währung
PurchaseOrderNumber <- BestellNummer
SalesPriceValue <- NettoPreisGesamtX
SalesCurrency <- Währung
DocumentCurrency <- Währung
CompanyCurrency <- Währung
Incoterms2020 <- Versandbedingung
SalesResponsibleEmployee <- AdressNummer_V
InvoiceDate <- Belegdatum-Rechnung
OrderDate <- BelegDatum Auftrag
DocumentType <- =Manual Excel
```
Wichtig fuer Rollback/Umzug:
- Diese DE-Einrichtung wurde direkt in `trafag_exporter.db` gespeichert.
- Die DB-Aenderung ist kein Git-Commit-Inhalt, weil SQLite-Datenbankdaten normalerweise nicht sauber versioniert werden.
- Der Code fuer den Mapper ist aktuell im Worktree vorhanden, aber noch nicht committed.
- Wenn die DB zurueckgerollt oder neu erstellt wird, muss das DE-Mapping erneut ueber die UI, Config-Import oder ein Hilfsskript eingerichtet werden.
## H48 - Tests
Quelle: lastchange.md.raw
## Tests
Ergaenzt:
```text
TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs
```
Neuer Test:
```text
ReadSalesRecordsAsync_Uses_Configured_Manual_Excel_Mapping_For_German_Headers
```
Der Test prueft:
- deutsches Excel-Headerformat
- Kommentarzeile ohne echte Position wird ignoriert
- echte Belegposition wird importiert
- `NettoPreisGesamtX` mit Schweizer Tausenderzeichen wird korrekt als Dezimalzahl gelesen
- Waehrung `EUR` wird in Sales-/Document-/Company-Currency uebernommen
- Rechnungsdatum und Auftragsdatum werden korrekt gelesen
Letzter bekannter Teststand nach Mapper-Arbeit:
```text
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal --no-restore
```
Ergebnis:
- Hauptprojekt baut erfolgreich
- FinanceProbe baut erfolgreich
- Tests erfolgreich
- `49/49` Tests gruen
Bekannte Warnung:
- `NU1900`, weil NuGet-Sicherheitsdaten wegen Netzwerk/nuget.org nicht geladen werden konnten
## H49 - Aktueller Laufstand
Quelle: lastchange.md.raw
## Aktueller Laufstand
Die Haupt-App war nach der DE-Konfiguration erreichbar:
```text
http://localhost:55416/standorte
HTTP 200
```
Hinweis:
- Der Browser kann geschlossen sein, waehrend der Serverprozess weiterlaeuft.
- Wenn ein Build wegen gesperrter Dateien fehlschlaegt, zuerst den laufenden `TrafagSalesExporter`-Prozess beenden.
## H50 - Noch offen nach Excel-Spaltenmapper
Quelle: lastchange.md.raw
## Noch offen nach Excel-Spaltenmapper
1. Mapper-Code committen, sobald der aktuelle Stand als Rollback-Punkt gesichert werden soll.
2. In der Standort-UI Deutschland oeffnen und visuell pruefen, ob die 26 Mapping-Zeilen angezeigt werden.
3. Mit echtem DE-Excel einen Importlauf testen.
4. Danach Finance-Probe erneut pruefen:
- ob DE nicht mehr `Keine Daten` ist
- ob `SalesPriceValue` gegen Soll aus `check.xlsx` passt
5. Falls weitere Laender eigene Excel-Formate liefern:
- nicht statischen Code bauen
- neues Mapping pro Standort pflegen
6. Klaeren, ob DE fachlich `NettoPreisGesamtX` in EUR als Ist-Wert verwenden soll oder ob CHF-Umrechnung noetig ist.
---
## H51 - Nachtrag 2026-05-05: FinanceProbe Ampel, Spanien v2 und Deutschland-Beispielfile
Quelle: lastchange.md.raw
## Nachtrag 2026-05-05: FinanceProbe Ampel, Spanien v2 und Deutschland-Beispielfile
## H52 - FinanceProbe Management-Ansicht
Quelle: lastchange.md.raw
### FinanceProbe Management-Ansicht
Das Testprogramm `Tools/FinanceProbe` wurde fuer das Finance-Meeting erweitert.
URL lokal:
```text
http://localhost:55417/finance
```
Neue Ansicht:
- `Meeting Ampel 2025`
- Ampel pro Land:
- Gruen: Zahl passt rechnerisch gegen Referenz
- Gelb: Differenz oder fachliche Abgrenzung offen
- Grau: keine belastbaren Importdaten
- Anzeige pro Land:
- Ist
- Soll / Referenz
- Differenz
- passender technischer Wert
- Waehrung / CHF-Hinweis
- kurze fachliche Begruendung
Wichtig zur Waehrung:
- Wenn Quelle `CHF` liefert, kann CHF direkt gezeigt werden.
- Wenn Quelle `EUR`, `USD`, `GBP`, `INR` usw. liefert, ist es Mandanten-/Originalwaehrung.
- CHF-Ausweis braucht dann eine separate FX-Regel bzw. offiziellen Umrechnungskurs.
## H53 - Spanien v2 im Testprogramm
Quelle: lastchange.md.raw
### Spanien v2 im Testprogramm
Spanien wird im FinanceProbe nicht mehr nur als normaler Zentralimport betrachtet.
Direkter CSV-Check:
```text
sagespain/v2/Spain_Sales_2025.csv
```
Gelesene Werte:
- Zeilen: `4'341`
- Ist 2025 / `SalesPriceValue`: `3'082'320.18`
- Waehrung: `EUR`
- Soll aus `check.xlsx`: `3'102'333.61`
- Differenz: `-20'013.43`
Status:
- Ampel: Gelb / Pruefen
- Grund: Export technisch lesbar, aber Differenz zu `check.xlsx` offen.
Offen fuer Spanien:
- korrekte Datumsabgrenzung (`FechaFactura` vs. Alternativen)
- Serien `REG`, `LAT`, `PRO`, `REC`
- Behandlung von Gutschriften / `REC`
- offizielle Sage-Auswertung mit identischem Filter zur Sollzahl
## H54 - Deutschland-Beispielfile
Quelle: lastchange.md.raw
### Deutschland-Beispielfile
Neues File im Projektordner:
```text
DE_Beispiel_Export_Daten.xlsx
```
Hinweis:
- Der Benutzer hatte zuerst `.xls` genannt, vorhanden ist `.xlsx`.
- Das File ist als Beispielfile zu behandeln, nicht als finale Jahresdatei.
Technischer Check:
- relevante Spalte: `NettoPreisGesamtX`
- Mapping-Ziel: `SalesPriceValue`
- Betragszeilen: `2`
- Summe `NettoPreisGesamtX`: `8'290.70`
- Waehrung: `EUR`
Einbau im FinanceProbe:
- eigener Abschnitt `Germany Excel sample check`
- zeigt Datei, Zeilenzahl, Summe und Referenz aus `check.xlsx`
- markiert explizit, dass die Differenz nur Sample-Charakter hat
- in der Management-Ampel wird Deutschland weiter nicht als OK gewertet, solange kein finaler DE-Jahresexport/import vorliegt
Fachliche Interpretation fuer Deutschland:
- Das Mapping funktioniert technisch.
- `NettoPreisGesamtX` kann als Kandidat fuer `SalesPriceValue` gelesen werden.
- Das Beispielfile darf nicht gegen die Jahresreferenz `3'635'922.91` als finale Ist-Zahl verwendet werden.
- Fuer das Meeting ist die Aussage:
- Deutschland-Format ist technisch verstanden.
- Finale DE-Zahl fehlt noch.
- Benoetigt wird ein vollstaendiger DE-Jahresfile 2025 oder ein bestaetigter Importlauf.
## H55 - Verifikation 2026-05-05
Quelle: lastchange.md.raw
### Verifikation 2026-05-05
Ausgefuehrt:
```text
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal --no-restore
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal --no-restore
```
Ergebnis:
- FinanceProbe Build erfolgreich
- Tests erfolgreich
- `50/50` Tests gruen
- Web UI liefert `HTTP 200`
- FinanceProbe enthaelt:
- `Meeting Ampel 2025`
- `Spain CSV direct check`
- `Germany Excel sample check`
## H56 - Financechef-Regeln abgesichert 2026-05-11
Quelle: lastchange.md.raw
## Financechef-Regeln abgesichert 2026-05-11
Umgesetzt:
- `PostingDate` als eigenes Feld in `SalesRecord` und `CentralSalesRecord`.
- Zentrale SQLite-Tabelle erhaelt `PostingDate` automatisch per Schema-Maintenance.
- HANA-B1 liest `DocDate` als Buchungsdatum und `TaxDate` als Fakturadatum.
- Excel/CSV-Import erkennt `posting date`, `Buchungsdatum` und `LineRegistrationDate`.
- Finance-Abgleich filtert das Jahr nach `PostingDate`, mit Fallback auf `InvoiceDate` und danach `ExtractionDate`.
- Finance-Abgleich bevorzugt Nettofakturawert in Hauswaehrung positionsweise.
- Wenn lokale Belegkopfwerte pro Position wiederholt wirken, wird die Ueberzaehlung erkannt:
- B1-Positionswert `SalesPriceValue` wird dann als Positions-Netto bevorzugt.
- deduplizierter Belegkopfwert bleibt als Kandidat sichtbar.
- Intercompany wird weiterhin separat ausgewiesen und nicht still entfernt.
Verifikation:
```text
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\verify_probe_out\ --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal
```
Ergebnis:
- FinanceProbe Build erfolgreich.
- Tests erfolgreich: `57/57`.
- Bekannte externe Warnung: NuGet-Sicherheitsdaten konnten wegen fehlendem Zugriff auf `api.nuget.org` nicht geladen werden.
- Lokaler Smoke-Test `/finance`: `HTTP 200`.
- Hinweis: Ein bestehender `dotnet`-Prozess sperrt den normalen FinanceProbe-Build-Output. Der Smoke-Test wurde deshalb ohne Rebuild direkt aus dem vorhandenen Output gestartet.
## H57 - Finance-Entscheide dokumentiert 2026-05-11
Quelle: lastchange.md.raw
## Finance-Entscheide dokumentiert 2026-05-11
Neue Doku:
```text
docs/FINANCE_ENTSCHEIDE.md
```
Enthaelt die verbindlichen Financechef-Entscheide:
- Hauswaehrung ist fuehrend.
- CHF-Umrechnung ueber Budgetkurse.
- Aggregation pro Artikel/Belegposition.
- Net Sales Actuals = Nettofakturawert.
- Jahresabgrenzung ueber Buchungsdatum.
- Gutschriften separat ueber Beleg-/Positionslogik.
- Intercompany/2nd-party separat ausweisen.
- Indien fachlich immer in `INR`.
## H58 - FinanceProbe / UK Nachdokumentation 2026-05-11
Quelle: lastchange.md.raw
## FinanceProbe / UK Nachdokumentation 2026-05-11
Ergaenzt in `docs/FINANCE_ENTSCHEIDE.md`:
- Pruefstand der Finance-Regeln.
- Testergebnis `58/58`.
- UK/England-Befund:
- `TRUK`
- `1'881` geladene Zeilen
- `395'605.82 GBP` Ist
- `3'749'865.00` Soll
- Differenz `-3'354'259.18`
- Interpretation: vermutlich Teilmenge/Monatsfile statt Jahreswert.
- Offener UK-Entscheid: Monatsdateien aufsummieren oder kumulierten Jahresfile lesen.
Ergaenzt in `docs/PROGRAMM_DIAGRAMME.md`:
- FinanceProbe-Start und Hinweis zu Console-Logging.
- Hinweis zu DLL-Sperren durch Visual Studio bzw. alte `dotnet`-Prozesse.
## H59 - HR KPI Cockpit und Filterkorrektur 2026-05-13
Quelle: lastchange.md.raw
## HR KPI Cockpit und Filterkorrektur 2026-05-13
Ergaenzt:
- Separater HR-KPI-Reiter `/hr-kpi`.
- Dashboard-Tabs fuer Ueberblick, Fluktuation, Absenzen, Zeit/Ferien, Mitarbeitende und Datenstatus.
- Fluktuationsvisuals: Gauge, Funnel, Donut, Organisation-Balken und Monatsbalken.
- Architektur-Cleanup: `HrKpiService` als Fassade, Build-Pipeline in `Services/HrKpi/HrKpiDashboardBuilder.cs`, UI-Tabs in `Components/HrKpi/HrKpiDashboardTabs.razor`.
- Konfigurierbare HR-Dateiquellen ueber `HrKpi` in `appsettings.json`.
- HR-KPI-Regressionstests.
Korrigiert:
- `Austrittsjahr` ist jetzt optional.
- Leeres Austrittsjahr bedeutet: alle Austritte.
- Von/Bis-Austritt hat Vorrang vor Austrittsjahr.
- Die Austrittsjahr-Auswahl wird aus den vorhandenen Austrittsdaten aufgebaut.
- `Austrittsjahr` ist beim Start leer statt automatisch aktuelles Jahr.
- Fluktuation nutzt nur vergleichbare Filter auf Mitarbeitenden- und Austrittsdaten.
- Kostenstelle, GLZ und Restferien filtern nicht die Fluktuation, weil die Austrittsdatei diese Felder nicht stabil enthaelt; das Cockpit zeigt dazu einen Hinweis.
- Bei Mehrjahresauswahl wird die Fluktuation als Auswahlwert statt als Jahreswert gefuehrt.
- Fluktuationsvisuals zaehlen distinct nach Personalnummer.
- Fluktuationsraten nutzen nun durchschnittlichen Headcount statt Stichtags-Headcount: Monat, Quartal und Jahr folgen `formeln.docx`.
- Krankenquote nutzt den FTE-Nenner: `Krankheitstage / (FTE * 21 Tage)`.
- Rexx-Austrittsarten mit Umlaut werden korrekt normalisiert: `Kündigung AN` zaehlt als Arbeitnehmerkuendigung, `Kündigung AG` als Arbeitgeberkuendigung-Ausschluss, `Ruhestand` als Pensionierung.
Nachdokumentation:
```text
docs/HR_KPI_NACHDOKU_2026-05-13.md
```
Verifikation:
- `dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_app\ --verbosity minimal`
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_tests\ --verbosity minimal`
- Ergebnis: `69/69` Tests bestanden.
- Kontrollwert `C:\temp\Personalausgeschieden.xlsx`: `104` Austritte total, `42` `Kündigung AN`, `34` `Kündigung AG`, `33` fluktuationsrelevant.
- Kontrollwert neuer Nenner: Avg Headcount 2025 `211.3`, Fluktuation Jahr effektiv `15.6%`.
## H60 - FinanceProbe Finanzchef-Uebersicht 2026-05-13
Quelle: lastchange.md.raw
## FinanceProbe Finanzchef-Uebersicht 2026-05-13
Ergaenzt:
- Neuer Reiter `Finanzchef Uebersicht` in `Tools/FinanceProbe`.
- Kompakte Soll/Ist-Sicht nur fuer offene Laender.
- Spalten reduziert auf Status, Land, Waehrung, Ist, Soll, Abweichung und Pruefgrund.
- Bestehende Detailtabellen bleiben unveraendert fuer Analyse/Nachvollzug.
Verifikation:
- `dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_financeprobe\ --verbosity minimal`
- Ergebnis: Build erfolgreich, `0` Fehler.
- Hinweis: `NU1900` wegen nicht erreichbarer NuGet-Sicherheitsdaten im eingeschraenkten Netzwerk.
## H61 - Finance CFO Word-Kurzbericht 2026-05-13
Quelle: lastchange.md.raw
## Finance CFO Word-Kurzbericht 2026-05-13
Erstellt:
- `docs/FINANCE_CHEF_SUMMARY_2026-05-13.docx`
- Kurzbericht fuer Finance/CFO mit Kernaussagen und Massnahmen.
- Enthalten: FR, IN, US, AT, ES, UK/EN, DE, CH, IT.
- Ausgeschlossen: GFS und reine 0-/Leer-Faelle ohne operative Aussage.
Inhaltlicher Fokus:
- Freigabefaehige Laender: FR, IN, US.
- Kleine/mittlere Klaerung: AT, ES.
- Hohe Prioritaet: UK/EN, DE, CH.
- Kritisch: IT wegen groesster Abweichung und offener Berechnungsart.
## H62 - Finance CFO Word-Kurzbericht Erweiterung 2026-05-15
Quelle: lastchange.md.raw
## Finance CFO Word-Kurzbericht Erweiterung 2026-05-15
Ergaenzt:
- Aktuelle Fassung: `docs/FINANCE_CHEF_SUMMARY_2026-05-15.docx`
- Erweiterte Tabellenansicht mit Status, Ist, Soll/Rhino, Abweichung, Pruefquelle, Massnahme und Prioritaet.
- Grafische Ampel-Uebersicht fuer OK/Klaeren/Hoch/Kritisch.
- Prioritaetsgrafik fuer IT, DE, UK/EN, CH, AT/ES.
- Abschnitt `Geprueft gegen` mit Rhino/Andreas `check.xlsx`, FinanceProbe/CentralSalesRecords, Spain CSV, Deutschland-Beispielfile und UK_B1.
Verifikation:
- DOCX enthaelt `word/document.xml`.
- Inhalte `Rhino / Andreas check.xlsx`, `Management-Ampel`, `Prioritaetsgrafik` und `Laendertabelle mit Massnahmen` wurden im Dokumentpaket geprueft.
## H63 - Finance Spanien Mailentwurf 2026-05-15
Quelle: lastchange.md.raw
## Finance Spanien Mailentwurf 2026-05-15
Erstellt:
- `docs/FINANCE_ES_MAIL_ABWEICHUNG_2026-05-15.md`
- Spanischer Mailentwurf zur Abweichung Spanien Net Sales 2025.
- Enthaltene Pruefpunkte: Zeitraum, Serien `REG/LAT/PRO/REC`, Abonos/Credit Notes, Datumslogik und verwendetes Netto-Umsatzfeld.
## H64 - Finance IT und UK Mailentwuerfe 2026-05-15
Quelle: lastchange.md.raw
## Finance IT und UK Mailentwuerfe 2026-05-15
Erstellt:
- `docs/FINANCE_IT_MAIL_ABWEICHUNG_2026-05-15.md`
- `docs/FINANCE_UK_MAIL_ABWEICHUNG_2026-05-15.md`
Inhalt:
- Italien: grosse Abweichung `+7.034.496,29 EUR`, Fokus Berechnungsart, Beleg/Position-Deduplizierung, Intercompany, Credit Notes, Datumslogik und Waehrung.
- UK/England: Restdifferenz `-216,154.91 GBP`, Fokus Jahresvollstaendigkeit, Periodenbereich, Credit Notes, Nettofeld, Discounts/Freight/Charges, 2nd-/3rd-party und Waehrung.
## H65 - Finance Entscheide Extraktion 2026-05-15
Quelle: lastchange.md.raw
## Finance Entscheide Extraktion 2026-05-15
Erstellt:
- `entscheide.md`
Inhalt:
- Fragen und Entscheide aus der Finance-Abstimmung extrahiert.
- Festgehaltene Kernentscheide: Hauswaehrung je Land, Budgetkurse fuer CHF-Sicht, Berechnung pro Artikel/Belegposition, Nettofakturawert, Buchungsdatum, separate Gutschriftenausweisung und Intercompany/2nd-party als eigenes Auswahlfeld.
- Intercompany-Marker dokumentiert: `MAGNETS SENSE`, `MAGNETIC SENSE`, `TRAFAG`, `GESELLSCHAFT FUER SENSORIK`, `GESELLSCHAFT FUR SENSORIK`.
## H66 - Finance Dokumentgueltigkeit 2026-05-15
Quelle: lastchange.md.raw
## Finance Dokumentgueltigkeit 2026-05-15
Erstellt:
- `docs/FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md`
Festgelegt:
- Fuehrendes CFO-Dokument: `docs/FINANCE_CHEF_SUMMARY_2026-05-15.docx`
- Alte CFO-Version `docs/FINANCE_CHEF_SUMMARY_2026-05-13.docx` entfernt, weil sie durch die Version vom 2026-05-15 ersetzt wurde.
- Entscheidbasis: `entscheide.md` und `docs/FINANCE_ENTSCHEIDE.md`.
## H67 - Finance Dashboard Todo 2026-05-15
Quelle: lastchange.md.raw
## Finance Dashboard Todo 2026-05-15
Erstellt:
- `docs/FINANCE_DASHBOARD_TODO_2026-05-15.md`
Inhalt:
- Todo-Liste fuer Group Sales Reporting Intranet-Dashboard.
- Priorisierte Punkte fuer CFO-Dokument, offene Laenderabweichungen, Intercompany, Budgetkurse und Berechtigungskonzept.
## H68 - Navigation und HR-KPI-Zugriff 2026-05-15
Quelle: lastchange.md.raw
## Navigation und HR-KPI-Zugriff 2026-05-15
Geaendert:
- Linke Navigation reduziert:
- Hauptgruppe `Finance Cockpit`
- eigener Hauptpunkt `HR KPI (Login)`
- Bisherige Finance-Seiten liegen als Unterpunkte unter `Finance Cockpit`:
- Dashboard
- Management Cockpit
- Standorte
- Transformationen
- Settings
- Logs
- HR KPI hat eine separate zweite Zugriffssperre mit Name und Passwort.
- HR-Daten werden erst geladen und angezeigt, wenn die HR-KPI-Sperre erfolgreich entsperrt wurde.
Konfiguration:
- Abschnitt `HrKpiAccess` in `appsettings.json`
- Benutzer: `hr`
- Passwortvorschlag: `Trafag-HR-KPI-2026!`
- Im Repo ist nur der SHA-256-Hash gespeichert, nicht das Klartextpasswort.
Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_hrlogin\ --verbosity minimal
```
Ergebnis:
- Build erfolgreich.
- 3 bestehende MudBlazor-Analyzer-Warnungen in `Logs.razor`, `Transformations.razor` und `Standorte.razor`.
## H69 - IIS 500 Diagnose und Hosting-Modell 2026-05-20
Quelle: lastchange.md.raw
## IIS 500 Diagnose und Hosting-Modell 2026-05-20
Geaendert:
- `web.config` fuer IIS auf `hostingModel="outofprocess"` umgestellt.
- `stdoutLogEnabled="true"` bleibt aktiv, Logziel bleibt `.\logs\stdout`.
- `ASPNETCORE_DETAILEDERRORS=true` fuer die temporaere IIS-Fehlerdiagnose gesetzt.
- Ziel: Wenn IIS/ASP.NET Core vor dem App-Start scheitert, sollen eher verwertbare Startlogs entstehen; ausserdem wird die App nicht mehr direkt im IIS Worker-Prozess gehostet.
Aktueller Stand:
- Publish-Ordner `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\` enthaelt `BiDashboard.dll`, `web.config`, `wwwroot`, `runtimes`, `trafag_exporter.db` und `logs`.
- `logs` war trotz aktivem stdout-Logging leer.
- Die veroeffentlichte DLL liess sich vom Publish-Ordner aus starten und brach nicht sofort mit einer Exception ab.
- Remote-Pruefung der installierten .NET-Runtimes per WinRM war nicht moeglich; der Serveradmin muss deshalb am Server pruefen, ob das .NET 8 Hosting Bundle installiert ist.
Naechste Server-Pruefpunkte:
- URL `https://trch-webapp-bidashboard.trafagch.local/BiDashboard/diag.txt` testen.
- Wenn `diag.txt` nicht erreichbar ist, stimmt IIS-Anwendung/virtueller Pfad/Binding nicht.
- Wenn `diag.txt` erreichbar ist, aber die App 500 liefert, Windows Event Viewer pruefen:
- Windows Logs > Application
- Quellen: `IIS AspNetCore Module V2`, `.NET Runtime`, `Application Error`
- App Pool pruefen:
- .NET CLR Version: `No Managed Code`
- Pipeline: `Integrated`
- 32-bit Applications: `False`
- Identity muss Modify-Rechte auf Publish-Ordner und `logs` haben.
## H70 - Architekturreview Static/Hardcoding 2026-05-15
Quelle: lastchange.md.raw
## Architekturreview Static/Hardcoding 2026-05-15
Erstellt:
- `docs/ARCHITEKTUR_REVIEW_STATICS_HARDCODING_2026-05-15.md`
Inhalt:
- Bewertung der vielen `static`-Methoden im Code.
- Ergebnis: `static` ist fuer kleine zustandslose Helper akzeptabel; problematisch sind fachliche Regeln und grosse Klassen mit zu vielen Verantwortungen.
- Dokumentierte Befunde:
- HR-Testpersonen sind aktuell Code-Regel und sollten in Konfiguration/DB.
- Finance Vergleich ist aktuell fix auf `2025` und Referenztext.
- Hauswaehrungen je Land sollten langfristig in Finance-/Standortkonfiguration.
- Finance-Sollwerte, Budgetkurse und IC-Regeln sind als Seed okay, aber produktiv pflegbar machen.
- Empfehlung: nicht blind alle `static`-Methoden entfernen, sondern zuerst fachlich veraenderbare Regeln auslagern.
## H71 - CFO-Bericht IT/Intercompany Diagnose 2026-05-15
Quelle: lastchange.md.raw
## CFO-Bericht IT/Intercompany Diagnose 2026-05-15
Ergaenzt:
- `docs/CFO_Kurzbericht_270515.docx`
- `docs/FINANCE_DASHBOARD_TODO_2026-05-15.md`
Inhalt:
- IT/Intercompany-Diagnose fuer die grosse Italien-Abweichung.
- Marker dokumentiert: `TRAFAG`, `MAGNETIC SENSE`, `MAGNETS SENSE`, `GESELLSCHAFT FUER SENSORIK`, `GESELLSCHAFT FUR SENSORIK`.
- Zahlen:
- IT Ist vor IC-Abzug: `14.704.336,29 EUR`
- IC-/2nd-party-Abzug: `4.397.746,90 EUR`
- IT Ist exkl. IC: `10.306.589,39 EUR`
- Rhino/check.xlsx Soll: `7.669.840,00 EUR`
- Restabweichung nach IC: `+2.636.749,39 EUR`
Bewertung:
- Intercompany/2nd-party erklaert einen grossen Teil der IT-Abweichung.
- Restabweichung bleibt offen und muss ueber Summenlogik, Beleg/Position-Deduplizierung, Gutschriften/Storno und weitere lokale IC-Kunden oder Schreibweisen geprueft werden.
## H72 - HR KPI Testpersonen-Ausschluss 2026-05-15
Quelle: lastchange.md.raw
## HR KPI Testpersonen-Ausschluss 2026-05-15
Geaendert:
- Folgende Testpersonen werden zentral aus dem HR-KPI-Dashboard ausgeschlossen:
- Angelina Jolie
- Brad Pitt
- Peter Muster
- ICT Trafag
- Empfanger Reminder / Empfaenger Reminder
- Der Ausschluss erfolgt vor KPI-, Filter- und Tabellenberechnung.
- Betroffen sind aktive Mitarbeitende, Absenzen und Austritte.
- Im Dashboard erscheint eine Notice, wie viele Testpersonen-Zeilen ausgeschlossen wurden.
Verifikation:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_hr_exclusions\ --verbosity minimal
```
Ergebnis:
- 70/70 Tests erfolgreich.
- 3 bestehende MudBlazor-Analyzer-Warnungen in `Logs.razor`, `Transformations.razor` und `Standorte.razor`.
## H73 - KI-Arbeitsanweisung 2026-05-15
Quelle: lastchange.md.raw
## KI-Arbeitsanweisung 2026-05-15
Erstellt:
- `persona.md`
Inhalt:
- Rolle der KI als Entwicklungs-, Analyse- und Dokumentationswerkzeug.
- Grenzen der KI bei fachlicher Verantwortung, Finance, HR, Datenschutz und Freigaben.
- Arbeitsprinzipien fuer dieses Projekt: bestehende Architektur nutzen, kritisch testen, sauber dokumentieren und offene fachliche Punkte als Pruefpunkte markieren.
## H74 - Navigation in Finance/HR/Admin gegliedert 2026-05-15
Quelle: lastchange.md.raw
## Navigation in Finance/HR/Admin gegliedert 2026-05-15
Geaendert:
- Linke Navigation neu gegliedert:
- `Finance Cockpit`
- `HR KPI (Login)`
- `Admin`
- Unter `Finance Cockpit` stehen:
- `Export Dashboard`
- `Management Analyse`
- `Soll/Ist Vergleich`
- Unter `Admin` stehen:
- `Standorte`
- `Transformationen`
- `Settings`
- `Logs`
- Seitentitel wurden an die neuen Menuebezeichnungen angepasst.
Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_nav_groups\ --verbosity minimal
```
Ergebnis:
- Build erfolgreich.
- 3 bestehende MudBlazor-Analyzer-Warnungen in `Logs.razor`, `Transformations.razor` und `Standorte.razor`.
## H75 - DE Alphaplan-Excel provisorisch vorbereitet 2026-05-20
Quelle: lastchange.md.raw
## DE Alphaplan-Excel provisorisch vorbereitet 2026-05-20
Geaendert:
- Deutschland wird beim Start als manueller Excel-Standort vorbereitet:
- `TSC = TRDE`
- `Land = Deutschland`
- `SourceSystem = MANUAL_EXCEL`
- `IsActive = false`, damit der Gesamtexport ohne gesetzte Datei nicht scheitert.
- Alphaplan-Mapping wird fuer Deutschland geseedet:
- `NettoPreisGesamtX` -> `SalesPriceValue`
- `Belegnummer`, `Position`, `ArtikelNummer`, `ArtikelBezeichnung`
- `Warengruppen-Bezeichnung`, `Anz. VE`
- Lieferant/Kunde/Land/Branche
- `Waehrung`, `Versandbedingung`, `AdressNummer_V`
- `Belegdatum-Rechnung` fuer Posting-/Invoice-Date
- `DocumentType = Alphaplan Excel`
- Testdatei erhalten und eingeordnet:
- `docs/2025_DataExport_DE.xlsx`
Erster Befund:
- `NettoPreisGesamtX` komplett: `4'154'690.05 EUR`
- `Land Kunde = Deutschland`: `3'455'276.64 EUR`
- `Land Kunde = Deutschland + China`: `3'647'592.44 EUR`
- Sollwert DE: `3'635'923.00 EUR`
Offen:
- Finance/Munir muss bestaetigen, welche Kundenlaender und Filter in Alphaplan fuer den offiziellen DE-Istwert gelten.
- Manager-Input nennt Warengruppen- und Versandbedingungs-Codes; im Excel sind aktuell vor allem Bezeichnungen/Texte sichtbar.
Verifikation:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_de_alphaplan\ --verbosity minimal
```
Ergebnis:
- 75/75 Tests erfolgreich.
- Bestehende Warnungen: NU1900 wegen lokaler Paket-Sicherheitsdatenabfrage, sowie bekannte MudBlazor-Analyzer-Warnungen zu `Dense`.
## H76 - Management Cockpit zentrale Filterkopplung 2026-05-15
Quelle: lastchange.md.raw
## Management Cockpit zentrale Filterkopplung 2026-05-15
Geaendert:
- Die untere `Zentrale Roh-Auswertung` im Management Cockpit ist nicht mehr nur global.
- Neue Filterfelder: `Landfilter` und `TSC`.
- Wenn oben eine Einzeldatei analysiert wird, uebernimmt die zentrale Auswertung automatisch Land und TSC aus dieser Datei.
- Beispiel: Auswahl `USA | TRUS | Sales_TRUS_2026-05-08.xlsx` setzt unten automatisch `USA / TRUS`.
- Button `Global` leert die Filter, falls wieder alle Laender/Standorte ausgewertet werden sollen.
- Jahres-, Monats-, Jahreswerte-, Monatswerte-, Tageswerte-, Quellen- und Laendertabellen verwenden denselben Land/TSC-Filter.
Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_management_scope2\ --verbosity minimal
```
Ergebnis:
- Build erfolgreich.
- 3 bestehende MudBlazor-Analyzer-Warnungen in `Logs.razor`, `Transformations.razor` und `Standorte.razor`.
## H77 - Finance Vergleich als eigener Reiter 2026-05-15
Quelle: lastchange.md.raw
## Finance Vergleich als eigener Reiter 2026-05-15
Geaendert:
- `Net Sales Actuals 2025 Referenz` aus dem Start-Dashboard entfernt.
- Neue Seite `Finance Vergleich` unter `Finance Cockpit` angelegt.
- Route: `/finance-cockpit/vergleich`
- Die Seite zeigt den Soll/Ist-Vergleich gegen `check.xlsx` separat, inklusive IC-Abzug, Referenzwert, Summenfeld, Differenz, Waehrung, Zeilen und Status.
- `DashboardPageService` laedt die Finance-Referenzdaten nicht mehr automatisch mit dem operativen Dashboard.
Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_finance_compare_tab\ --verbosity minimal
```
Ergebnis:
- Build erfolgreich.
- 3 bestehende MudBlazor-Analyzer-Warnungen in `Logs.razor`, `Transformations.razor` und `Standorte.razor`.
## H78 - Finance-Regeln und Dashboard-Basis-Spalte 2026-05-20
Quelle: lastchange.md.raw
## Finance-Regeln und Dashboard-Basis-Spalte 2026-05-20
Geaendert:
- Neuer Admin-Reiter `Finance Regeln` angelegt.
- Route: `/finance-rules`
- Navigation: `Admin -> Finance Regeln`
- Zugriff wie andere Admin-Seiten ueber `AdminOnly`.
- Neue Tabelle/Model `FinanceRules`.
- Finance-Regeln werden beim Start geseedet und sind danach in der UI pflegbar.
- Die Regeln wirken auf die Finance-Sicht, nicht auf Rohdaten und nicht auf das technische Spaltenmapping.
- DE- und IT-Sonderlogik wurde aus dem zentralen Excel-Export in eine generische Regel-Engine verschoben.
- `ConfigTransferService` exportiert/importiert `FinanceRules` mit.
- `FinanceReconciliationService` nutzt dieselbe Regel-Engine wie das zentrale Excel, damit Soll/Ist-Vergleich und Endexcel dieselbe Finance-Sicht verwenden.
- Export Dashboard:
- neue Spalte `Basis` direkt nach `Land`
- zeigt Datenbasis mit Icon und Text:
- `Excel-Datei`
- `CSV-Datei`
- `SAP Service`
- `Server`
- `Manuelle Datei`
Aktuelle Default-Finance-Regeln:
- `DE`
- Jahr auf `2025` erzwingen fuer das Alphaplan-Jahresfile.
- `CustomerName = Trafag AG` ausschliessen.
- `CustomerName contains Magnetic Sense` ausschliessen.
- `InvoiceNumber = GS2510095` ausschliessen, weil bereits 2024 erfasst.
- `InvoiceNumber starts with GS` als negativer Betrag zaehlen.
- `IT`
- `CustomerName contains Trafag Italia` ausschliessen.
- doppelte Zeilen ohne `SupplierCountry` deduplizieren.
DE-Fachabgleich nach Rueckmeldung Deutschland:
```text
Gesamtumsatz NettoPreisGesamtX: 4'154'690.05
- Weiterberechnungen Trafag AG: 391'655.88
- Weiterberechnungen Magnetic Sense 2025: 55'648.21
- Gutschriften GS als negativ statt positiv: 28'205.60 doppelte Wirkung
- GS2510095 nicht in 2025: 1'419.70
= DE Jahresabschluss-Umsatz: 3'652'394.46
```
Verifikation:
```text
dotnet test TrafagSalesExporter.sln --verbosity minimal
```
Ergebnis:
- 76/76 Tests erfolgreich.
Echter DE-Import und zentrale Excel erneut geprueft:
```text
CentralSalesRecords DE 2025 rows: 4'430
CentralSalesRecords DE 2025 SalesPriceValue: 3'652'394.46
Central Excel Sales sheet Finance DE 2025 sum: 3'652'394.46
Central Excel Finance Summary DE 2025 sum: 3'652'394.46
```
Technische Hauptdateien:
- `Models/FinanceRule.cs`
- `Services/FinanceRuleEngine.cs`
- `Services/FinanceRulesPageService.cs`
- `Components/Pages/FinanceRules.razor`
- `Services/ExcelExportService.cs`
- `Services/FinanceReconciliationService.cs`
- `Services/DashboardPageService.cs`
- `Components/Pages/Dashboard.razor`
- `Data/AppDbContext.cs`
- `Services/DatabaseInitializationService.SchemaSql.cs`
- `Services/DatabaseSchemaMaintenanceService.cs`
- `Services/DatabaseSeedService.cs`
- `Services/ConfigTransferService.cs`
## H79 - Finales zentralisiertes Excel `finall.xlsx` geprueft 2026-05-20
Quelle: lastchange.md.raw
## Finales zentralisiertes Excel `finall.xlsx` geprueft 2026-05-20
Gepruefte Datei:
- `C:\Users\koi\Downloads\finall.xlsx`
Ergebnis:
- Datei ist als zentralisierter Export lesbar.
- Blaetter:
- `Finance Summary`
- `Sales`
- `Finance Filter Hilfe`
- `Sales` enthaelt 67'247 Datenzeilen.
- `Finance Summary` stimmt gegen die Finance-Spalten im Blatt `Sales` exakt:
- Differenz je Land/Jahr/Waehrung: `0.00`
- Die Summen entsprechen der lokal erzeugten zentralen Datei `output\Sales_All_2026-05-20.xlsx`.
- Deutschland 2025 bleibt korrekt:
- `DE 2025 EUR = 3'652'394.46`
Finance-Summen 2025 aus `finall.xlsx`:
```text
AT EUR 3'438'121.37
CH CHF 43'521'390.82
DE EUR 3'652'394.46
ES EUR 3'082'320.18
FR EUR 1'471'218.44
IN INR 750'936'591.38
IT EUR 7'663'145.76
UK GBP 3'533'710.09
US USD 3'749'865.33
```
Hinweis:
- Der direkte Vergleich gegen die lokale SQLite-Datei `trafag_exporter.db` war nicht aussagekraeftig, weil diese lokale DB keine passenden `CentralSalesRecords` fuer diesen Stand enthaelt.
- Die Excel-interne Summenpruefung und der Vergleich gegen `output\Sales_All_2026-05-20.xlsx` waren konsistent.
## H80 - Admin Bereich und Startseite aktualisiert 2026-05-21
Quelle: lastchange.md.raw
## Admin Bereich und Startseite aktualisiert 2026-05-21
Admin Bereich:
- `/admin/sessions` ist nicht mehr durch den Finance-Cockpit-Login vorgeschaltet.
- Der Admin Bereich nutzt weiterhin ein eigenes Admin-Passwort über `AdminAccess`.
- Initialer Benutzer: `admin`
- Initiales Passwort: `TrafagAdmin2026!`
- Das Admin-Passwort ist unabhängig vom Finance-Cockpit-Passwort.
- Dokumentation ergänzt: `docs/ADMIN_BEREICH_STARTSEITE_2026-05-21.md`
Startseite:
- Corporate-Schrift auf `Open Sans` mit Trafag-nahen Fallbacks angepasst.
- Manometer-Startgrafik bleibt auf weißem Hintergrund, schwarz gezeichnet und mit Trafag-Schriftzug.
- Willkommenstext ist sprachabhängig.
- Optionales Strichmännchen mit Kittel unter dem Willkommenstext ergänzt.
- Das Strichmännchen ist standardmäßig deaktiviert.
- Aktivierung über `Admin Bereich` -> `Strichmännchen anzeigen`.
- Einstellung wird in `appsettings.json` unter `LandingPage.ShowWalkingLabFigure` gespeichert.
Technische Dateien:
- `Components/Routes.razor`
- `Components/App.razor`
- `wwwroot/css/app.css`
- `Components/Pages/Dashboard.razor`
- `Components/Pages/AdminSessions.razor`
- `Program.cs`
- `Security/LandingPageOptions.cs`
- `Services/LandingPageSettingsService.cs`
- `Services/UiTextService.cs`
- `appsettings.json`
## H81 - Nachtrag 2026-05-26: Publish-Fixes, HR-KPI-Upload, Varianten und PDF
Quelle: lastchange.md.raw
## Nachtrag 2026-05-26: Publish-Fixes, HR-KPI-Upload, Varianten und PDF
Deployment / Blazor:
- Interaktive Blazor-Server-Render-Mode-Deklarationen fuer die routbaren Seiten ergaenzt, damit Buttons und Formulare auf der publizierten IIS-Seite reagieren.
- Navigation auf relative Links umgestellt, damit die Anwendung unter `/BiDashboard` nicht auf Root-URLs ohne PathBase springt.
- Admin-, Finance- und HR-KPI-Login auf serverseitige POST-Endpunkte mit Unlock-Cookies umgestellt, damit Login auch auf der publizierten Seite ohne Blazor-Click-Event funktioniert.
- SAP-HANA Native DLL `libadonetHDB.dll` wird mitpubliziert und `HDBDOTNETCORE` im `web.config` auf den Publish-Ordner gesetzt.
HR-KPI:
- Massenupload fuer die fuenf HR-KPI-Dateien direkt im HR-KPI-Cockpit eingebaut.
- Upload-Ziel auf dem Server: `C:\inetpub\wwwcust\BiDashboard\hrdata`.
- Erwartete Dateien:
- `Saldiperstichdatum.xlsx`
- `Exportkommengehen.xlsx`
- `HR_KPI_Export.xlsx`
- `Abwesenheitinstunden.xlsx`
- `Personalausgeschieden.xlsx`
- Allgemeiner Zeitraumfilter `Von Datum` / `Bis Datum` ersetzt die reine Austrittsbeschriftung.
- Fluktuation nutzt den Zeitraum ueber `Austrittsdatum`.
- Absenzquote nutzt den Zeitraum als Nenner mit Arbeitstagen statt fix `21 Tage`.
- Wenn die Rexx-Absenzen selbst Datumsfelder enthalten, werden Absenzen auf den Zeitraum gefiltert.
- Wenn die Rexx-Absenzen keine Datumsfelder enthalten, wird angenommen, dass `Abwesenheitinstunden.xlsx` bereits fuer den gewaehlten Zeitraum exportiert wurde.
- `MudDatePicker` nutzt explizit `de-CH`, damit Eingaben wie `31.03.2026` auf Server und Browser stabil geparst werden.
- PDF-/Druckbuttons je HR-KPI-Reiter ergaenzt, z. B. fuer `Fluktuation`, `Absenzen`, `Ampel`, `Mitarbeitende` und `Datenstatus`.
- Der Druck/PDF-Export rendert nur den jeweiligen Reiterinhalt inkl. Titel, Datenordner und Filterzusammenfassung.
- Serverseitige HR-KPI-Varianten eingefuehrt:
- Speicherdatei: `C:\inetpub\wwwcust\BiDashboard\hrdata\hr-kpi-variants.json`
- letzte Selektion wird serverseitig gespeichert und beim Oeffnen wieder geladen
- Varianten sind fuer alle Benutzer sichtbar
- Varianten koennen gespeichert, geladen, aktualisiert, umbenannt und geloescht werden
- Initiale Testvarianten fuer HR wurden auf dem Server angelegt:
- `Fluktuation Q1 2026`
- `Fluktuation Jahr 2026`
- `Absenzquote Q1 2026`
Firewall / Betrieb:
- Aktueller HANA-Fehler nach DLL-Fix ist Netzwerk/Firewall, nicht mehr SAP-DLL:
- Webserver: `10.120.1.17`
- HANA Internal: `10.194.65.22:30015`
- India HANA: `20.197.20.60:30015`
- SAP OData: `10.194.64.29:8000`
- SharePoint: `trafagag.sharepoint.com:443`
- Support-Mail an externen Support vorbereitet; Freigabe muss vom Webserver zu den Zielsystemen erfolgen.
Validierung:
- `dotnet build .\TrafagSalesExporter.csproj --no-restore --verbosity minimal` erfolgreich.
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore --verbosity minimal` erfolgreich mit `78/78` Tests.
- Mehrfach erfolgreich nach `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\` publiziert.
## H82 - Nachtrag 2026-05-26: Nachdokumentation Remote-/Refactoring-Commits
Quelle: lastchange.md.raw
## Nachtrag 2026-05-26: Nachdokumentation Remote-/Refactoring-Commits
Beim Rebase auf `origin/main` wurden zusaetzliche lokal noch nicht vorhandene Commits integriert. Der lokale Stand und `origin/main` sind danach synchron.
Finance Details / Export:
- Finanzdetail-Export und erweiterte Uebersetzungen wurden ergaenzt.
- Betroffene Bereiche:
- `Services/ExcelExportService.cs`
- `Services/ConsolidatedExportService.cs`
- `Services/SharePointUploadService.cs`
- `Services/UiTextService.cs`
- `Components/Layout/MainLayout.razor`
- `Components/Layout/NavMenu.razor`
- Tests fuer Excel-Export und UI-Texte wurden erweitert.
- SharePoint-Upload-Schnittstelle wurde leicht angepasst.
In-App-Training / Anwenderdoku:
- Neue Trainingsseiten in der Anwendung:
- `Components/Pages/FinanceTraining.razor`
- `Components/Pages/HrKpiTraining.razor`
- `Components/TrainingSection.razor`
- Navigation um Trainingseintraege ergaenzt.
- Neue Trainingsassets:
- `wwwroot/training/systemarchitektur.svg`
- `wwwroot/training/keyuser-prozess.svg`
- `wwwroot/training/finance_cockpit_preview.png`
- `wwwroot/training/hr_kpi_cockpit_preview.png`
- Aktualisierte Anwenderdokumente:
- `docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx`
- `docs/HR_KPI_ANLEITUNG_HR_2026-05-20.docx`
- `docs/MANUAL_IMPORT_DELTA_STAND_2026-05-21.md`
Lokaler Dev-Server / Uebergang:
- `launchSettings.json` wurde fuer den lokalen Uebergang angepasst.
- Doku ergaenzt:
- `docs/LOCAL_DEV_SERVER_UEBERGANG_2026-05-21.md`
- `docs/MD_DOKUMENTENSTATUS_2026-05-20.md`
- Ziel: lokal lauffaehige Umgebung dokumentieren, falls IIS/Publish nicht erreichbar ist.
Admin / Startseite:
- Admin-Bereich wurde von Finance-Login getrennt.
- Startseite/Landing-Dashboard und Admin-Sessions wurden erweitert.
- Doku:
- `docs/ADMIN_BEREICH_STARTSEITE_2026-05-21.md`
- Relevante technische Bereiche:
- `Components/AdminAccessPanel.razor`
- `Components/Pages/AdminSessions.razor`
- `Security/AdminAccessOptions.cs`
- `Services/AdminAccessService.cs`
- `Services/AccessSessionTracker.cs`
- `Services/AccessPasswordSettingsWriter.cs`
- `Security/LandingPageOptions.cs`
- `Services/LandingPageSettingsService.cs`
Trading Engine:
- Ein Python-Trading-Engine-Paket wurde unter `trade_web` ergaenzt.
- Dateien:
- `trade_web/trading_engine.py`
- `trade_web/trading_engine/__init__.py`
- Zweck laut Commit-Historie: Trading-Cockpit-Engine als importierbares Paket bereitstellen.
- Dieser Bereich ist separat vom TrafagSalesExporter/.NET-BI-Dashboard zu betrachten.
Aktueller Git-Stand:
- Rebase auf `origin/main` erfolgreich.
- Neuer Head nach Rebase und Push: `d853f53 Add published HR KPI workflow fixes`.
- `HEAD` und `origin/main` sind synchron.
- Lokal unversioniert bleiben nur Arbeitsartefakte/Screenshots:
- `../BiDashboard/`
- `error.png`
- `it_export_result.html`
- `italien.png`
## H83 - Next Steps
Quelle: NEXT_STEPS_2026-04-15.md.raw
# Next Steps
Stand: 2026-05-20
RAG-Hinweis: Fuer tokenarme Weiterarbeit zuerst `docs/RAG_ROUTER.md` laden. Diese Datei nur lesen, wenn die Kurzdatei `docs/rag/PROJECT.md` nicht reicht.
## H84 - Nachtrag 2026-05-20 Dokumentation bereinigt
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 Dokumentation bereinigt
Erledigt:
- Markdown-Bestand eingeordnet in `docs/MD_DOKUMENTENSTATUS_2026-05-20.md`.
- HR-Anwenderdoku als Word-Datei optisch ueberarbeitet:
- `docs/HR_KPI_ANLEITUNG_HR_2026-05-20.docx`
- inklusive 10 neuer HR-Cockpit-Punkte, Tabellen, Hinweisboxen und Vorschaugrafik.
- Finance-Anwenderdoku als Word-Datei optisch ueberarbeitet:
- `docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx`
- inklusive Finance Summary Workflow, Filterregeln und Pruefpunkten.
- Neue neutrale Vorschaubilder fuer die Word-Dokus:
- `docs/hr_kpi_cockpit_preview.png`
- `docs/finance_cockpit_preview.png`
Bewusst nicht geloescht:
- Alte Markdown-Dateien und alte Eintraege bleiben erhalten, wenn sie Pruefwerte, Zwischenentscheide, Mailkontext oder Audit-Spuren enthalten.
- Nicht mehr fuehrende Dateien sind in `docs/MD_DOKUMENTENSTATUS_2026-05-20.md` als historisch markiert.
## H85 - Nachtrag 2026-05-20 Workflow-Fixes nach Review
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 Workflow-Fixes nach Review
Umgesetzt:
- Dashboard warnt vor aktiven manuellen Standorten ohne Datei.
- Nach Einzelstandortexport wird sichtbar, dass die zentrale Excel neu erzeugt werden muss.
- Dashboard erkennt eine veraltete zentrale Excel nach neuem Standortexport.
- Neuer Menuepunkt `Manuelle Importe` fuer Keyuser.
- `Manuelle Importe` hat jetzt die Reiter `Importdateien` und `Anleitung`.
- Der Reiter `Anleitung` zeigt den Upload-/Export-/Zentraldatei-/Finance-Pruefprozess grafisch.
- Zentrale Excel hat ein Blatt `Finance Summary`.
- `Management Analyse` ist als Rohdaten-/Plausibilitaetssicht markiert.
- `Soll/Ist Vergleich` ist als verbindliche Finance-Sicht markiert.
- Export-Live-Status ist nicht mehr pauschal `HANA Abfrage...`.
Weiterhin offen:
- DE Alphaplan-Fachabgrenzung: Kundenlaender/Filter muessen von Munir/Finance bestaetigt werden.
## H86 - Nachtrag 2026-05-20 Keyuser Prozess-SVG
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 Keyuser Prozess-SVG
Erstellt:
```text
docs/KEYUSER_PROZESSDOKU_2026-05-20.svg
```
Zielgruppe:
- Finance Keyuser / Poweruser.
Inhalt:
- Vorbereitung in Settings und Standorte.
- Manual-Excel-Dateien fuer UK/ES/DE.
- Einzelstandortexport, Export aller Standorte und zentrale Excel.
- Finance-Filter im Endexcel.
- Soll/Ist Vergleich, Management Analyse, Logs.
- Fehlerbehandlung und fachliche Freigabe.
## H87 - Nachtrag 2026-05-20 Technische Architektur-SVG
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 Technische Architektur-SVG
Erstellt:
```text
docs/SYSTEMARCHITEKTUR_TECHNISCH_2026-05-20.svg
```
Zielgruppe:
- Systemarchitekt / Serveradmin / technischer Projektkontext.
Abgrenzung:
- Nur produktive Applikation.
- Keine Testapp, Probe-Tools oder temporaeren Analyseprogramme.
Status:
- Keyuser-Prozessdoku wurde als separate SVG erstellt.
## H88 - Nachtrag 2026-05-20 DE Alphaplan-Excel provisorisch eingebaut
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 DE Alphaplan-Excel provisorisch eingebaut
Erledigt:
- Deutschland wird als manueller Excel-Standort vorbereitet:
- `TSC = TRDE`
- `Land = Deutschland`
- `SourceSystem = MANUAL_EXCEL`
- neuer Standort ist standardmaessig inaktiv, damit Export-All nicht ohne Datei scheitert
- Alphaplan-Mapping wird automatisch geseedet:
- `NettoPreisGesamtX` -> `SalesPriceValue`
- `Belegnummer` -> `InvoiceNumber`
- `Position` -> `PositionOnInvoice`
- `ArtikelNummer` -> `Material`
- `ArtikelBezeichnung` -> `Name`
- `Warengruppen-Bezeichnung` -> `ProductGroup`
- `Anz. VE` -> `Quantity`
- `Name/Land Lieferant`, `Name/Land Kunde`, `Branche`, `Versandbedingung`
- `Belegdatum-Rechnung` -> `PostingDate` und `InvoiceDate`
- `DocumentType = Alphaplan Excel`
- Datei erhalten:
```text
docs/2025_DataExport_DE.xlsx
```
Bedienung:
1. App starten.
2. `Standorte` oeffnen.
3. Deutschland / `TRDE` oeffnen.
4. Alphaplan-Excel hochladen oder Pfad setzen.
5. Standort aktivieren.
6. Standortexport fuer DE ausfuehren.
7. Danach zentrale Excel erzeugen; DE ist dann in `CentralSalesRecords` und im Endexcel enthalten.
Offen fachlich:
- Komplette Summe `NettoPreisGesamtX`: `4'154'690.05 EUR`.
- Nur `Land Kunde = Deutschland`: `3'455'276.64 EUR`.
- Sollwert DE: `3'635'923.00 EUR`.
- Finance/Munir muss bestaetigen, welche Kundenlaender oder Filter zum offiziellen DE-Ist gehoeren.
## H89 - Nachtrag 2026-05-20 IIS 500 aktueller Stand
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 IIS 500 aktueller Stand
Vollstaendige Doku:
```text
docs/DEPLOYMENT_IIS_HANDOFF_2026-05-19.md
```
Was sicher bewiesen ist:
- `https://trch-webapp-bidashboard.trafagch.local/BiDashboard/diag.txt` ist erreichbar.
- Browser zeigt dort:
```text
BiDashboard publish folder reached 2026-05-20T08:19:14.2667783+02:00
```
- Damit stimmt IIS-URL `/BiDashboard` und der Physical Path zum Publish-Ordner.
- Der verbleibende `500` ist kein falscher Pfad und kein HTTP/HTTPS-Verwechslungsproblem.
Was umgesetzt wurde:
- Publish weiterhin aus `TrafagSalesExporter`.
- Ausgabe weiterhin `BiDashboard.dll`, keine EXE.
- `web.config` auf `hostingModel="outofprocess"` umgestellt.
- `stdoutLogEnabled="true"` bleibt aktiv.
- `ASPNETCORE_DETAILEDERRORS=true` fuer Diagnose gesetzt.
- Neu publiziert auf `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\`.
Offen fuer Server-Spezialist:
- .NET 8 Hosting Bundle / AspNetCoreModuleV2 pruefen.
- App Pool pruefen:
- `.NET CLR Version = No Managed Code`
- `Managed Pipeline Mode = Integrated`
- `Enable 32-bit Applications = False`
- Event Viewer lesen:
- `IIS AspNetCore Module V2`
- `.NET Runtime`
- `Application Error`
- App-Pool-Identity mit `Modify` auf Publish-Ordner, `logs` und `trafag_exporter.db*` bestaetigen.
Wichtig:
- Der Server braucht kein installiertes Microsoft Excel.
- XLSX wird ueber ClosedXML/OpenXML gelesen.
- CSV-Umstellung ist fuer diesen 500-Fehler nicht noetig.
## H90 - Nachtrag 2026-05-20 IT Finance-Methode
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-20 IT Finance-Methode
Erledigt:
- IT-Methode gemaess Finance-Leiter umgesetzt.
- `CustomerName` enthaelt `Trafag Italia` wird fuer IT ausgeschlossen.
- Doppelte IT-Zeilen mit leerem `Supplier country` werden nur einmal gezaehlt.
- Regel greift im Finance-Vergleich/Testprogramm und in den Finance-Spalten der zentralen Excel.
Bewusster Entscheid:
- Die alte 2025-Kombination ist naeher am Soll, aber fachlich nicht zukunftssicher.
- Fuer 2026+ gilt die neue Methode, auch wenn sie 2025 in der aktuellen DB weiter vom Sollwert abweicht.
Naechster Check:
- Nach neuem IT-Export pruefen, ob die vollstaendige `Trafag Italia`-Summe aus den neuen Rohdaten sichtbar wird.
- Zentrale Excel fuer `Finance | Country Key = IT`, `Finance | Include = TRUE` filtern und gegen Finance-Vergleich kontrollieren.
## H91 - Nachtrag 2026-05-19 IIS Deployment / 500 Fehler
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-19 IIS Deployment / 500 Fehler
Vollstaendige Doku:
```text
docs/DEPLOYMENT_IIS_HANDOFF_2026-05-19.md
```
Aktueller Stand:
- Publish erfolgt direkt aus `TrafagSalesExporter`.
- Publish-Ausgabe ist an das alte `BiDashboard` angepasst:
- `BiDashboard.dll`
- keine EXE
- `web.config` startet `.\BiDashboard.dll`
- Diagnose aktiv mit `stdoutLogEnabled=true`
- URL mit App-Pfad liefert laut Browser `500`:
```text
https://trch-webapp-bidashboard.trafagch.local/BiDashboard/
```
Wahrscheinlichstes offenes Thema:
- App-Pool/IIS hat auf dem Publish-Ordner nur Lesen/Ausfuehren.
- Die App schreibt beim Start in SQLite (`trafag_exporter.db`, `db-shm`, `db-wal`) und in `logs`.
- `icacls`-Versuch von lokal wurde vom Server mit `Zugriff verweigert` abgelehnt.
Naechster Schritt fuer Server-Spezialist:
- App-Pool-Identity ermitteln.
- `Modify` auf Publish-Ordner, `logs` und `trafag_exporter.db*` setzen.
- App-Pool neu starten.
- Danach URL neu testen und bei weiterem `500` stdout-Log/Event Viewer lesen.
## H92 - Nachtrag 2026-05-19 Finance-Cockpit-Login finalisieren
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-19 Finance-Cockpit-Login finalisieren
Aktueller Stand:
- Finance Cockpit hat einen separaten Login.
- HR-KPI-Login und Finance-Cockpit-Login sind technisch getrennte Services/Konfigurationen.
- Finance-Konfiguration liegt in `appsettings.json` unter `FinanceCockpitAccess`.
- Aktueller Benutzer: `finance`.
- Finance nutzt ein eigenes Passwort: `Trafag-Finance-Cockpit-2026!`.
- Globale AD-/Rollenpruefung ist fuer den Moment mit `Security.Enabled = false` deaktiviert.
- Die AD-Gruppen sind nicht geloescht und bleiben in `AccessGroups`/`AdminGroups` dokumentiert.
Wichtig:
- Finance- und HR-KPI-Sperren laufen weiter ueber eigene Passwortabfragen.
- AD/Rollen koennen spaeter durch `Security.Enabled = true` wieder aktiviert werden.
Noch offen:
1. Entscheiden, wann AD-/Rollenpruefung wieder aktiviert wird.
2. Bei Reaktivierung `Security.Enabled` auf `true` setzen und Gruppen pruefen.
3. Pruefen, ob direkte Run-/Export-/FinanceProbe-Endpunkte ebenfalls geschuetzt werden muessen.
4. In Browser testen:
```text
http://127.0.0.1:5099/finance-cockpit/vergleich
```
5. Nach Entsperren pruefen, dass Navigation und `Finance sperren` korrekt funktionieren.
## H93 - Nachtrag 2026-05-19 Finance-Vergleich / Formeldoku
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-19 Finance-Vergleich / Formeldoku
Erledigt:
- `/finance-cockpit/vergleich` nutzt dieselbe `FinanceReconciliationService`-Logik wie die FinanceProbe.
- Leere Ist-Zeilen werden in der Haupt-App ausgefiltert.
- Berechnungslogik pro Land wurde dokumentiert:
```text
docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md
```
Naechster Check:
- Bei neuer Datenladung `/finance-cockpit/vergleich` und `/finance` gegeneinander vergleichen.
- Besonders ES, AT, UK und IT weiter fachlich klaeren.
## H94 - Nachtrag 2026-05-19 Zentrale Excel fuer Finance-Filter
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-19 Zentrale Excel fuer Finance-Filter
Erledigt:
- Die zentrale Excel `Sales_All_yyyy-MM-dd.xlsx` enthaelt im Blatt `Sales` einen Finance-Spaltenblock:
```text
Finance | Year
Finance | Country Key
Finance | Date
Finance | Net Sales Actual
Finance | Currency
Finance | Include
Finance | Source Value Field
```
- Die zentrale Excel enthaelt ein Hilfsblatt `Finance Filter Hilfe`.
- Das Hilfsblatt erklaert, wie Finance dieselben Ist-Summen wie im Testprogramm erhaelt:
```text
Finance | Year = 2025
Finance | Country Key = Land
Finance | Include = TRUE
Summe Finance | Net Sales Actual
```
Geprueft:
- Excel-Finance-Spalten wurden gegen `FinanceReconciliationService` fuer 2025 verglichen.
- AT, CH, ES, FR, IN, IT, UK und US ergaben jeweils `MATCH` mit Differenz `0.00`.
Naechster praktischer Check:
- Nach dem naechsten echten Export die SharePoint-Datei `Sales_All_yyyy-MM-dd.xlsx` oeffnen und mit Finance die Filter-/Summenlogik einmal gemeinsam durchgehen.
- Dabei darauf achten, dass nicht versehentlich alte Spalten wie `Land`, `TSC`, `Document Total LC` oder `Sales Price/Value` direkt fuer CFO-Summen verwendet werden.
## H95 - Nachtrag 2026-05-11 UK_B1 Mapping fertigstellen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-11 UK_B1 Mapping fertigstellen
Aktueller Stand:
- UK/England bleibt auf Quelle `UK_B1`.
- Korrekte Quelle:
```text
https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1
```
- Ursache der grossen UK-Abweichung:
- kein grafisches Mapping fuer `TRUK`
- `Sales Price/Value` wurde als Positionswert gelesen
- in UK_B1 ist es nach aktuellem Befund ein Stueckpreis
- korrekte Formel ist `=[Sales Price/Value]*[Quantity]`
Bereits im Worktree umgesetzt:
- `ManualExcelImportService` kann berechnete Mapping-Quellen `=[Header A]*[Header B]`.
- `DatabaseSeedService` seedet/repariert UK_B1-Pfad und `TRUK`-Mapping.
- `DatabaseSeedService` ueberspringt den UK-Mapping-Seed, solange `ManualExcelColumnMappings` noch auf eine alte SQLite-Reparaturtabelle wie `Sites_repair_old` zeigt.
- Unit-Test fuer berechnetes Manual-Excel-Mapping ist vorhanden.
- Doku wurde in `docs/FINANCE_ENTSCHEIDE.md`, `lastchange.md` und `HANDOFF_2026-04-15.md` ergaenzt.
- Tests sind gruen: `59/59`.
Verifizierter Testlauf:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal
```
Noch offen fuer den praktischen UK-Check:
1. SharePoint-/Graph-Zugriff reparieren.
- letzter Fehler bei `/run/export/TRUK`:
```text
ClientSecretCredential authentication failed
127.0.0.1:9 connection refused
```
2. UK neu exportieren:
```text
http://127.0.0.1:5099/run/export/TRUK
```
3. Finance pruefen:
```text
http://127.0.0.1:5099/finance
```
4. Ergebnis bewerten:
- wenn UK nahe `3'749'865 GBP` liegt: Mapping war Hauptursache.
- wenn UK bei ca. `3'533'349 GBP` bleibt: Restdifferenz gegen weitere UK-Netto-/Discount-/Frachtspalten pruefen.
Nicht vergessen:
- Keine harte Spezialkorrektur fuer genau 2025 einbauen.
- Die Loesung muss ueber Mapping und allgemeine Positionslogik laufen, damit andere Jahre ebenfalls korrekt funktionieren.
## H96 - Nachtrag 2026-05-08 Manual Excel/CSV SharePoint-Automatik
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-08 Manual Excel/CSV SharePoint-Automatik
Erledigt:
- SharePoint-Ordner koennen bei Manual Excel/CSV als Quelle hinterlegt werden.
- Bei Ordnern wird automatisch die neueste passende `.xlsx`/`.csv` ausgewaehlt.
- Dateinamenmuster fuer bevorzugte Auswahl: `ddMMyy_TSC.xlsx` bzw. `ddMMyy_TSC.csv`.
- Manual-Export schreibt die erzeugte Exportdatei in den Quellordner zurueck:
- lokal: gleicher lokaler Ordner
- SharePoint: gleicher SharePoint-Ordner
- England/TRUK ist lokal auf den SharePoint-Ordner `Import/Finance/UK_B1` korrigiert.
- Spanien-Fehler nach erfolgreichem Einlesen der SharePoint-CSV ist behoben.
Naechste konkrete Schritte:
1. App neu starten, damit die Seed-/Repair-Logik aktiv ist.
2. England/TRUK exportieren und pruefen, ob die App `010526_TRUK.xlsx` statt `010426_TRUK.xlsx` auswaehlt.
3. Im SharePoint-Ordner `Import/Finance/UK_B1` pruefen, ob die neue Exportdatei dort wieder abgelegt wird.
4. Deutschland/Alphaplan: im Standort den korrekten Alphaplan-Excel- oder SharePoint-Pfad hinterlegen.
5. Deutschland exportieren und Mapping gegen die Alphaplan-Datei validieren.
6. Falls UK-Dateinamen spaeter ein anderes Muster bekommen, Auswahlregel erweitern.
## H97 - Nachtrag 2026-05-08 FinanceProbe
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-08 FinanceProbe
Erledigt:
- FinanceProbe zeigt alle Finance-Referenzen 2025.
- Datenabdeckung je Standort wurde ergaenzt.
- CH/AT-Zuordnung wurde fuer `ZSCHWEIZ` geschaerft.
Naechste fachliche Schritte:
1. Nach Export von England, Schweiz/Oesterreich, Spanien und Deutschland die FinanceProbe neu laden.
2. In der Sektion `Datenabdeckung je Standort` pruefen, ob Zeilen 2025 und Periode plausibel sind.
3. Fuer Laender mit `Keine Daten` entscheiden:
- Datenquelle fehlt
- Standort deaktiviert
- Mapping/Export noch nicht gelaufen
- Referenz ist nur zukuenftig relevant
4. Fuer AT/CH nach `ZSCHWEIZ`-Export pruefen, ob `LAND1` korrekt `AT` bzw. `CH` liefert.
## H98 - Nachtrag 2026-05-11 FinanceProbe KI-Steuerung
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-11 FinanceProbe KI-Steuerung
Neue Test-Routen:
- `/run/export/{siteKey}` fuer Einzelstandortexporte
- `/run/export-all` fuer alle aktiven Standorte plus zentrale Datei
- `/run/consolidated` fuer nur zentrale Datei
Naechster sinnvoller Prueflauf:
1. FinanceProbe starten.
2. `/run/export/TRUK` fuer England testen.
3. `/run/export/Spanien` testen.
4. `/run/export/Deutschland` testen, sobald Alphaplan-Pfad korrekt ist.
5. `/run/export/ZSCHWEIZ` testen.
6. Danach `/finance` und `docs/finance_status_2025.svg` aktualisieren.
## H99 - Nachtrag 2026-05-07 nach Mapper-/Finance-Aufraeumung
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-07 nach Mapper-/Finance-Aufraeumung
Erledigt:
- SAP-OData- und HANA-Mapping laufen ueber `MappedSalesRecordComposer`.
- Doppelte SAP-Mapping-Normalisierung wurde entfernt.
- Konsolidierter Export liest eindeutig aus `CentralSalesRecords`.
- Manuelle Standortdateien duerfen `.xlsx` oder `.csv` sein.
- Finance-Sollwerte, Budgetkurse und Intercompany-Regeln sind DB-Konfiguration mit Seed.
Naechste technische Schritte:
1. App neu starten, damit Schema/Seed fuer `FinanceReferences`, `FinanceIntercompanyRules` und Budgetkurse laeuft.
2. In Settings Konfiguration exportieren und pruefen, ob Finance-Referenzen und IC-Regeln enthalten sind.
3. Fuer produktive Pflege spaeter eine kleine UI fuer `FinanceReferences` und `FinanceIntercompanyRules` bauen.
4. Manual Excel als naechsten Aufraeumpunkt vereinheitlichen: Header-Automatik und grafisches Mapping in eine gemeinsame Mapping-Engine ziehen.
5. Bestehende BI1/SAGE-Standorte mittelfristig auf grafisches HANA-Mapping migrieren; erst danach den alten B1-Spezialpfad entfernen.
## H100 - Nachtrag 2026-05-07 ZSCHWEIZ ueber SAP OData
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-07 ZSCHWEIZ ueber SAP OData
Finaler Stand fuer Schweiz/Oesterreich:
- ABAP-Report `report.abap` fuellt SAP-Tabelle `ZSCHWEIZ`.
- Buchungskreis `1100` = Schweiz, `1200` = Oesterreich.
- `LAND1` in `ZSCHWEIZ` ist Reporting-Land aus Buchungskreis.
- `CUSTOMER_LAND` ist Kundenland aus `KNA1-LAND1`.
- Die App liest `ZSCHWEIZ` ueber SAP OData, nicht ueber direkten HANA-Spezialcode.
In der App:
- Quellsystem-Code `SAP` bleibt bestehen, DisplayName jetzt `SAP OData`.
- `SAP_HANA` ist nur fuer direkte HANA-Tabellen/Views und heisst `SAP HANA Tables/Views`.
- Der grafische Mapper funktioniert fuer SAP OData und fuer HANA-Tabellen/Views.
- Vorkonfigurierter Standort:
- `TSC = ZSCHWEIZ`
- `Land = Schweiz/Oesterreich`
- `SourceSystem = SAP`
- Quelle `Z`
- EntitySet `ZSCHWEIZSet`
- Quelle und Feldmapping werden beim App-Start per Seed-/Repair-Logik nachgezogen, auch wenn der Standort bereits existiert.
Naechste Schritte:
1. App neu starten, damit die Seed-/Repair-Logik laeuft.
2. In `Settings -> Quellsysteme` pruefen, ob `SAP` als `SAP OData` angezeigt wird.
3. In `Standorte` den Standort `ZSCHWEIZ` oeffnen.
4. Falls die zentrale SAP-Service-URL noch auf `ZPOWERBI_EINKAUF_SRV` zeigt, beim Standort `SAP Service URL Override` auf den finalen OData-Service fuer `ZSCHWEIZ` setzen.
5. `Entity Sets refreshen`.
6. Quelle `Z` auf `ZSCHWEIZSet` kontrollieren.
7. `Felder aus Quellen laden`.
8. Grafisches Mapping kontrollieren; manuell mappen musst du nur, wenn Gateway-Feldnamen vom erwarteten `ZSCHWEIZ`-Layout abweichen.
9. Standort aktivieren und Export testen.
Keine manuelle Feldliste ist noetig, wenn der Gateway-Service `$metadata` korrekt liefert.
## H101 - Nachtrag 2026-05-05 Abschlussstand FinanceProbe / Spanien / Deutschland
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-05-05 Abschlussstand FinanceProbe / Spanien / Deutschland
Aktueller lokaler Testpunkt:
```text
http://localhost:55417/finance
```
FinanceProbe enthaelt jetzt:
- `Meeting Ampel 2025` fuer alle Laender aus `check.xlsx`
- Ampel:
- Gruen: rechnerisch passend
- Gelb: Differenz oder fachliche Abgrenzung offen
- Grau: keine belastbaren Ist-Daten
- `Detail alle Laender`
- `Spain CSV direct check`
- `Germany Excel sample check`
Spanien:
- finale v2-Datei liegt unter `sagespain/v2/Spain_Sales_2025.csv`
- Zeilen: `4'341`
- Ist `SalesPriceValue`: `3'082'320.18` EUR
- Soll aus `check.xlsx`: `3'102'333.61`
- Differenz: `-20'013.43`
- Status: Gelb / Pruefen
- Export technisch lesbar, Differenz fachlich mit Spanien/Finance klaeren
Deutschland:
- Beispielfile liegt im Projektordner:
```text
DE_Beispiel_Export_Daten.xlsx
```
- relevante Spalte: `NettoPreisGesamtX`
- Mapping-Ziel: `SalesPriceValue`
- Betragszeilen: `2`
- Summe: `8'290.70` EUR
- das ist nur ein Sample, keine finale DE-Jahreszahl
- Deutschland bleibt fuer die finale Ampel offen/grau, bis ein vollstaendiger DE-Jahresfile 2025 oder ein bestaetigter Importlauf vorliegt
Offen fuer das Finance-Meeting / danach:
1. Spanien Differenz `-20'013.43` klaeren:
- Periodendatum
- Serien `REG`, `LAT`, `PRO`, `REC`
- Gutschriften / `REC`
- offizielle Sage-Auswertung mit identischem Filter
2. Deutschland finalen Jahresfile 2025 anfordern oder Importlauf mit finaler Datei ausfuehren.
3. Fuer Laender mit Grau pruefen, ob Exportdaten fehlen oder Standort deaktiviert/ohne Datei ist.
4. Fuer CHF-Aussage beachten:
- CHF nur direkt, wenn Quelle CHF liefert
- sonst Mandanten-/Originalwaehrung und separate FX-Regel noetig
Letzte Verifikation:
```text
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal --no-restore
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal --no-restore
```
Ergebnis:
- FinanceProbe Build erfolgreich
- Tests erfolgreich
- `50/50` Tests gruen
- Web UI `HTTP 200`
## H102 - Nachtrag 2026-04-29 Dashboard-Referenzcheck
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-29 Dashboard-Referenzcheck
Das Dashboard enthaelt jetzt oben einen `Net Sales Actuals 2025`-Referenzcheck gegen die Zahlen aus `check.xlsx` / Power BI Stand 2026-04-29.
Technischer Stand:
- Ist-Wert wird automatisch aus dem besten Kandidaten gegen die Referenz gewaehlt:
- `SalesPriceValue`
- `DocumentTotalForeignCurrency - VatSumForeignCurrency`
- `DocumentTotalLocalCurrency - VatSumLocalCurrency`
- Belegkopfwerte werden per `TSC` + `DocumentType` + `DocumentEntry` dedupliziert; Fallback ist `InvoiceNumber`
- Jahr 2025 ueber `InvoiceDate`, fallback `ExtractionDate`
- Vergleich gegen Power-BI-Wert, falls vorhanden, sonst LC-Referenz
- Dashboard zeigt das verwendete `Summenfeld`
Noch fachlich zu pruefen:
- IT bleibt als bekannter `not ok`-Fall offen
- UK/US bleiben offen, bis die richtige Quelle bzw. Config geklaert ist
- bei weiteren Standorten erst Referenzwert und Datenquelle bestaetigen
- bestehende zentrale Altdaten enthalten fuer die neuen B1-Felder noch `0`; fuer den echten Feldvergleich ist ein neuer Export/Rebuild noetig
Konkreter Ablauf nach Neustart/PC-Absturz:
1. App starten und Dashboard oeffnen: `http://localhost:55416`
2. `Alle exportieren` ausfuehren oder betroffene Standorte einzeln exportieren.
3. Danach `Zentrale Datei neu erzeugen` ausfuehren.
4. Im oberen Dashboard-Block `Net Sales Actuals 2025 Referenz` die Spalte `Summenfeld` kontrollieren.
5. Wenn `Status = OK`, passt die Summe zur hinterlegten Referenz.
6. Wenn `Status = Pruefen`, zuerst kontrollieren:
- richtige Standortquelle/Config
- richtiges Jahr
- ob nach der Codeaenderung wirklich neu exportiert wurde
- ob das gewaehlte Summenfeld fachlich Sinn macht
Naechster technischer Schritt fuer neue Jahre:
- Jahresauswahl im Dashboard einbauen.
- Fuer Jahre ohne Referenz trotzdem Ist-Summen und verwendetes Summenfeld anzeigen.
- Sobald eine neue Referenzdatei fuer 2026/2027 vorliegt, Referenzwerte ergaenzen.
Export-all-Abbruch am 2026-04-29:
- Fehler war SQLite-Schema: `ExportLogs`, `AppEventLogs`, `CentralSalesRecords` zeigten noch auf `"Sites_repair_old"`
- Schema-Reparatur wurde erweitert und beim App-Start erfolgreich angewendet
- gepruefter Zustand danach: alle drei Tabellen referenzieren wieder `Sites`
- Export kann jetzt erneut getestet werden
- falls erneut Fehler kommt, sollte die Snackbar die Inner Exception anzeigen und die Logs sollten nicht mehr selbst den Export abbrechen
Nachtest Export all:
- HANA-Schema-Fehler fuer Frankreich/Italien/USA wurde auf HANA-Quoting zurueckgefuehrt und korrigiert
- Indien bleibt Auth-/Credential-Thema
- England, Spanien und Deutschland sind aktuell `MANUAL_EXCEL` ohne hinterlegte Datei
- Fuer einen sauberen Export-all-Lauf:
- HANA-Standorte mit korrigierter Query nochmals testen
- Indien Credentials pruefen
- manuelle Standorte entweder Datei hinterlegen oder deaktivieren, falls sie nicht im Export-all laufen sollen
## H103 - Nachtrag 2026-04-29 B1-Belegwaehrungsfelder
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-29 B1-Belegwaehrungsfelder
Der HANA/B1-Export zieht jetzt zusaetzliche Belegwaehrungsfelder:
- `DocEntry`
- `DocCur`
- `DocTotalFC`
- `DocTotal`
- `VatSumFC`
- `VatSum`
- `DocRate`
- `OADM.MainCurncy`
Neue Zielfelder:
- `DocumentEntry`
- `DocumentCurrency`
- `DocumentTotalForeignCurrency`
- `DocumentTotalLocalCurrency`
- `VatSumForeignCurrency`
- `VatSumLocalCurrency`
- `DocumentRate`
- `CompanyCurrency`
Zusaetzlich gilt jetzt:
- `StandardCostCurrency` kommt im HANA-Pfad aus `OADM.MainCurncy`
- `Sales_All_*.xlsx` enthaelt die neuen Spalten
- `CentralSalesRecords` enthaelt die neuen Spalten
- bestehende SQLite-DBs werden beim Start um die Spalten erweitert
- Manual-Excel-Import kann die neuen Spalten lesen
## H104 - Wichtig fuer Auswertungen
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Wichtig fuer Auswertungen
Die neuen `DocumentTotal*`- und `VatSum*`-Werte sind Belegkopfwerte und werden in der positionsbasierten Datei pro Position wiederholt.
Power BI:
- nicht positionsweise summieren
- zuerst nach Beleg deduplizieren, bevorzugt `TSC` + `DocumentType` + `DocumentEntry`
- danach Belegkopfwerte summieren
Positionswerte wie `Sales Price/Value`, `Quantity` und `Standard cost` bleiben fuer positionsbasierte Summen geeignet.
## H105 - Verifikation
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Verifikation
Geprueft:
```text
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich
- `48/48` Tests gruen
## H106 - Nachtrag 2026-04-29 Clean-Code-/DI-Befund
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-29 Clean-Code-/DI-Befund
Aktueller Architektur- und DI-Zustand nach den letzten Umbauten:
Gesamturteil:
- die App ist deutlich besser strukturiert als zu Beginn
- die Grundarchitektur ist brauchbar bis gut und fuer pragmatischen produktiven Einsatz geeignet
- Dependency Injection wird grundsaetzlich sinnvoll genutzt
- Clean Code ist mittel bis gut, aber noch nicht durchgehend konsequent
Was positiv ist:
- Kernservices laufen weitgehend ueber Interfaces und DI
- `DataSourceAdapter`-Pattern trennt `HANA`, `SAP_GATEWAY` und `MANUAL_EXCEL`
- `SiteExportService` ist dadurch deutlich schlanker als frueher
- UI-nahe Page-Services wurden eingefuehrt
- viele Razor-Seiten sind nicht mehr direkt `DbContext`-lastig
- `Scoped` fuer Page-Services und `Singleton` fuer gemeinsame Infrastruktur/Orchestrierung ist bewusst gewaehlt
- Tests decken wichtige Fachlogik ab, u. a. Transformationen, ConfigTransfer, DatabaseInitialization und ManagementCockpit
Was noch nicht ideal ist:
- `DatabaseInitializationService` bleibt ein produktiver Reparatur-/Migrationsblock und ist kein sauberes versioniertes Migrationssystem
- `Settings.razor` und `Standorte.razor` enthalten weiterhin relativ viel UI-/Workflow-Logik
- `ManagementCockpitService`, `ConfigTransferService` und Teile der Initialisierung sind noch sehr breit
- konsolidierter Export hat historisch noch Semantikreste zwischen Live-Snapshot und `CentralSalesRecords`
- Secrets/Zugangsdaten sind noch nicht ideal geloest
- zentraler Retry-/Resilience-Layer fuer SAP/HANA/SharePoint fehlt
- Auth ist jetzt pragmatisch mit User/Admin geschnitten, aber noch nicht fein nach `Viewer`, `Exporter`, `Admin`, `Finance`
Sinnvolle spaetere Clean-Code-Schritte:
1. `ManagementCockpitService` in kleinere Query-, Aggregation- und Currency-Komponenten teilen
2. `Settings.razor` und `Standorte.razor` weiter Richtung Page-/Application-Services entlasten
3. `DatabaseInitializationService` langfristig durch versionierte Migrationen ersetzen
4. Auth-Policies fachlich feiner schneiden, z. B. `Viewer`, `Exporter`, `Admin`, `Finance`
5. Retry/Timeout/Failure-Handling fuer externe Systeme zentralisieren
6. Secret-Store-Konzept umsetzen
## H107 - Nachtrag 2026-04-29 Authentifizierung / AD
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-29 Authentifizierung / AD
Die App wurde nach IT-Rueckmeldung gegen anonymen Zugriff abgesichert.
Neuer Stand:
- globale Authentifizierungspflicht
- produktiv vorgesehen: Windows Authentication / Active Directory
- Zugriff und Adminrechte ueber AD-Gruppen
- kein eigener App-Login
- kein versteckter produktiver Backdoor
- lokaler Development-Bypass nur bei `ASPNETCORE_ENVIRONMENT=Development`
Neue/angepasste Dateien:
- `Program.cs`
- `Security/SecurityOptions.cs`
- `Security/SecurityPolicies.cs`
- `Security/DevelopmentAuthenticationHandler.cs`
- `Components/Routes.razor`
- `Components/_Imports.razor`
- `Components/Layout/NavMenu.razor`
- `Components/Layout/MainLayout.razor`
- `Components/Pages/Settings.razor`
- `Components/Pages/Standorte.razor`
- `Components/Pages/Transformations.razor`
- `appsettings.json`
- `appsettings.Development.json`
Aktuelle Default-Gruppen:
- `TRAFAG\TrafagSalesExporter-Users`
- `TRAFAG\TrafagSalesExporter-Admins`
## H108 - Noch mit IT zu klaeren
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Noch mit IT zu klaeren
1. Exakte AD-Domain-/Gruppennamen bestaetigen
2. AD-Gruppen anlegen oder bestehende Gruppen verwenden
3. IIS-Zielumgebung festlegen
4. Auf IIS Windows Authentication aktivieren
5. Auf IIS Anonymous Authentication deaktivieren
6. Sicherstellen, dass produktiv nicht `ASPNETCORE_ENVIRONMENT=Development` gesetzt ist
7. Test mit einem normalen User und einem Admin-User durchfuehren
## H109 - Fachliche Rollenentscheidung
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Fachliche Rollenentscheidung
Aktuell:
- Admin:
- `Settings`
- `Standorte`
- `Transformations`
- berechtigter User:
- Dashboard
- Management Cockpit
- Logs
Noch zu entscheiden:
- ob `Logs` ebenfalls Admin-only sein soll
- ob Export-Buttons im Dashboard nur fuer eine eigene Rolle `Exporter` sichtbar sein sollen
- ob Management Cockpit fuer alle berechtigten User oder nur fuer Management/Finance-Gruppen sichtbar sein soll
## H110 - Verifikation
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Verifikation
Geprueft:
```text
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich
- `48/48` Tests gruen
- Auth-Policy-Tests fuer AccessGroup, AdminGroup und Development-Admin vorhanden
- lokaler Development-Auth-Start geprueft: `http://localhost:55416` antwortet mit HTTP `200`
## H111 - Nachtrag 2026-04-29 Management Cockpit
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-29 Management Cockpit
Seit dem 2026-04-17 wurden im `Management Cockpit` weitere Auswertmoeglichkeiten umgesetzt und nachtraeglich aus dem aktuellen Code rekonstruiert.
Aktueller neuer Stand:
- Summenfeld ist waehbar statt fest auf Umsatz:
- `Sales Price/Value`
- `Quantity`
- `Standard cost`
- `Quantity * Standard cost`
- Anzeige-Waehrung ist waehbar:
- `EUR`
- `USD`
- `Original`
- betragliche Werte werden ueber `CurrencyExchangeRateService` umgerechnet
- nicht-betragliche Werte wie `Quantity` bleiben ohne Waehrung
- fehlende Wechselkurse werden gezaehlt und in der UI/Hinweisen sichtbar
- zentrale Roh-Auswertung kann weitere Summenfelder als Zusatzspalten in Jahres-, Monats- und Tageswerten anzeigen
- dateibasierte Excel-Analyse nutzt ebenfalls Summenfeld und Anzeige-Waehrung
Betroffene Dateien:
- `Components/Pages/ManagementCockpit.razor`
- `Models/ManagementCockpitModels.cs`
- `Services/IManagementCockpitService.cs`
- `Services/ManagementCockpitPageService.cs`
- `Services/ManagementCockpitService.cs`
- `TrafagSalesExporter.Tests/ManagementCockpitServiceTests.cs`
Neue Tests:
- Umrechnung zentraler Werte in EUR
- Wechselkurs-Cache pro Waehrung/Ziel/Datum
- Mengen-Auswertung ohne Waehrungsumrechnung
- Zusatzwerte in Zeitreihen
## H112 - Jetzt sinnvoll zu pruefen
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Jetzt sinnvoll zu pruefen
1. `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal`
2. Management Cockpit in der App oeffnen
3. zentrale Auswertung mit `Sales Price/Value` in `EUR` pruefen
4. zentrale Auswertung mit `Quantity` pruefen und bestaetigen, dass keine Waehrung angezeigt wird
5. Zusatzfelder `Quantity` und `Quantity * Standard cost` in Jahres-/Monatswerten pruefen
6. Dateianalyse einer exportierten Excel mit unterschiedlichen Summenfeldern pruefen
7. fachlich klaeren, ob `CHF` neben `EUR` und `USD` als Anzeige-Waehrung angeboten werden soll
8. fachlich klaeren, ob fehlende Wechselkurse als `0` in Zielwaehrung korrekt sind oder separat ausgewiesen werden sollen
## H113 - Nachtrag 2026-04-17 Refactoring-Fortschritt
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-17 Refactoring-Fortschritt
Mehrere frueher als hoch priorisiert markierte Architekturpunkte sind inzwischen bereits umgesetzt.
Erledigt:
- DataSourceAdapter-Pattern fuer `HANA`, `SAP_GATEWAY`, `MANUAL_EXCEL`
- `SiteExportService` deutlich verschlankt
- Page-Services auf `Scoped`
- `DatabaseInitializationService` in Schema-/Seed-/Orchestrator-Bloecke getrennt
- `Dashboard`, `Logs` und `Transformations` von direktem `DbContext`-Zugriff befreit
- HANA-SQL-Injection-Pfad geschlossen
- blockierende `.GetAwaiter().GetResult()`-Aufrufe im HANA-Pfad entfernt
Neuer verifizierter Stand:
- `dotnet build .\TrafagSalesExporter.csproj --verbosity minimal` erfolgreich
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal`
- `36/36` Tests gruen
## H114 - Neue Top-Prioritaeten ab jetzt
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Neue Top-Prioritaeten ab jetzt
## H115 - 1. Adapter- und Resolver-Tests nachziehen
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 1. Adapter- und Resolver-Tests nachziehen
Prio hoch.
Warum:
- das neue `DataSourceAdapter`-Pattern ist architektonisch wichtig
- genau dieser neue Schnitt hat aktuell noch keine gezielten Unit-Tests
Sinnvoll waeren:
- `DataSourceAdapterResolver`-Tests
- `HanaDataSourceAdapter`-Tests
- `SapGatewayDataSourceAdapter`-Tests
- `ManualExcelDataSourceAdapter`-Tests
## H116 - 2. Retry-/Robustheitslayer
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 2. Retry-/Robustheitslayer
Prio hoch.
Vor allem fuer:
- SharePoint
- SAP Gateway
- HANA-nahe Netzpfade
Aktuell brechen diese Integrationen bei transienten Problemen zu direkt ab.
## H117 - 3. Secret-Store-Konzept
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 3. Secret-Store-Konzept
Prio hoch bis mittel.
Aktuell liegen Zugangsdaten weiterhin in der App-/DB-Konfiguration.
Langfristig sollte entschieden werden:
- Windows Credential Manager
- DPAPI / verschluesselte Ablage
- externer Secret Store
## H118 - 4. `DatabaseInitializationService` weiter haerten, aber nicht mehr blind gross refactoren
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 4. `DatabaseInitializationService` weiter haerten, aber nicht mehr blind gross refactoren
Prio mittel.
Der schlimmste Architekturteil ist deutlich besser als vorher.
Weitere Arbeit dort sollte jetzt nur noch zielgerichtet passieren:
- Regressionstests fuer konkrete Legacy-/Repair-Zustaende
- spaeter moeglichst versionierte Migrationen
## H119 - 5. MudBlazor-Analyzer-Warnungen bereinigen
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 5. MudBlazor-Analyzer-Warnungen bereinigen
Prio mittel.
Nicht kritisch fuer Produktion, aber sinnvoll fuer sauberen Build:
- `Logs.razor`
- `Transformations.razor`
- `Standorte.razor`
## H120 - Was im Vergleich zu frueher nicht mehr Top-Prioritaet ist
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Was im Vergleich zu frueher nicht mehr Top-Prioritaet ist
Nicht mehr ganz oben:
- generisches weiteres Page-Service-Refactoring um des Refactorings willen
- noch mehr strukturelles Verschieben ohne Risikoreduktion
Der wirtschaftlich sinnvolle Fokus liegt jetzt eher auf:
- Absicherung
- Robustheit
- Integrationsstabilitaet
## H121 - Nachtrag 2026-04-17
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-17
Der Punkt `CHF-Umrechnung / Wechselkurse` ist nicht mehr komplett offen.
Der aktuelle Ist-Stand ist:
- `CurrencyExchangeRateService` ist implementiert
- `ExchangeRateImportService` importiert ECB-Kurse
- `NormalizeCurrencyCode` und `ConvertCurrency` sind im Transformationssystem registriert
- fehlende Unit-Tests dafuer wurden am 2026-04-17 ergaenzt
Neuer Teststand:
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal`
- erfolgreich
- `31/31` Tests gruen
Was fuer Waehrungen trotzdem noch offen bleibt:
- fachlicher Einsatz der `ConvertCurrency`-Regeln in echten Standortkonfigurationen pruefen
- UI-Flow fuer Wechselkurspflege in `Settings.razor` manuell gegenpruefen
- ECB-Import einmal real ueber die UI bzw. App-Funktion pruefen
- bestaetigen, fuer welche Sichten CHF die Zielwaehrung sein soll
- Management-Cockpit-Rohsicht nur dann auf CHF umstellen, wenn fachlich gewuenscht
## H122 - Architektur-Nachtrag 2026-04-17
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Architektur-Nachtrag 2026-04-17
Nach einer separaten Architekturpruefung wurden die naechsten Schritte neu priorisiert.
Wichtig:
- neue Fachfeatures sind aktuell **nicht** der erste Engpass
- zuerst muessen die Architektur-Risiken in Initialisierung, Config-Import und UI-Service-Schnitt bereinigt werden
## H123 - Neue Top-Prioritaeten
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Neue Top-Prioritaeten
## H124 - 1. `DatabaseInitializationService` absichern
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 1. `DatabaseInitializationService` absichern
Prio sehr hoch.
Gruende:
- Startlogik enthaelt manuelle Schema-Migrationen
- FK-Reparaturen laufen produktiv beim App-Start
- dort wurde ein konkretes Risiko fuer verschobene Spaltenwerte beim `Sites_old`-Kopierpfad erkannt
Vor weiterer Fachentwicklung:
- Initialisierungspfad genau pruefen
- SQL-Kopierlogik validieren
- moeglichst Richtung versionierte Migrationen bewegen
## H125 - 2. `ConfigTransferService.ImportJsonAsync` neu denken
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 2. `ConfigTransferService.ImportJsonAsync` neu denken
Prio sehr hoch.
Aktuelles Problem:
- Import loescht sehr viel und baut danach stueckweise neu auf
- nicht atomar
- potenziell teilzerstoerter Zustand bei Fehlern
- `CentralSalesRecords` werden mitimportiert/mitgeloescht, obwohl sie eher Laufzeitdaten als Konfiguration sind
Ziel:
- atomarer Import
- saubere Trennung zwischen Konfiguration und Betriebsdaten
## H126 - 3. Razor-Seiten entlasten
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 3. Razor-Seiten entlasten
Prio hoch.
Betroffen vor allem:
- `Components/Pages/Settings.razor`
- `Components/Pages/Standorte.razor`
Ziel:
- DB- und Fachlogik aus UI-Code in Services / Application-Layer verschieben
- Seiten nur noch fuer Interaktion und Formularzustand
## H127 - 4. Konsolidierten Export semantisch klaeren
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 4. Konsolidierten Export semantisch klaeren
Prio mittel.
Offene Frage:
- zentrale Datei aus laufendem Snapshot
oder
- zentrale Datei immer aus `CentralSalesRecords`
Aktuell ist die Verantwortung unscharf.
## H128 - 5. Reporting verallgemeinern
Quelle: NEXT_STEPS_2026-04-15.md.raw
#### 5. Reporting verallgemeinern
Prio mittel.
Erst nach den Infrastrukturthemen:
- hartcodierte Jahreslogik im Cockpit entfernen
- fachlich entscheiden, ob und wo CHF-Rohsicht gebraucht wird
## H129 - Praktische Reihenfolge fuer den naechsten Wiedereinstieg
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Praktische Reihenfolge fuer den naechsten Wiedereinstieg
Wenn nach erneutem Absturz oder Kontextverlust weitergemacht wird:
1. `HANDOFF_2026-04-15.md` lesen, speziell die Architekturpruefung vom 2026-04-17
2. `DatabaseInitializationService` als ersten Risikoblock ansehen
3. `ConfigTransferService.ImportJsonAsync` als zweiten Risikoblock ansehen
4. erst danach wieder an Cockpit / CHF / weitere Fachfeatures gehen
## H130 - Nachtrag HANA-/Standort-Workflow 2026-04-17
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag HANA-/Standort-Workflow 2026-04-17
Der doppelte HANA-Workflow wurde inzwischen bereits bereinigt.
Neuer Stand:
- oben zentrale HANA-Konfiguration pro Quellsystem `BI1` / `SAGE`
- unten im Standort keine eigene wirksame Voll-HANA-Konfiguration mehr
- HANA-basierte Standorte ziehen ihre technische Verbindung aus der zentralen Quellsystem-Konfiguration
- Standort bleibt fuer fachliche Daten und optionale Credential-Overrides zustaendig
- die frueher doppelte HANA-UI im Standortdialog ist inzwischen auch sichtbar entfernt
- der Verbindungstest in `Settings.razor` prueft und meldet jetzt die zentrale HANA-Verbindung klar
## H131 - Was dazu noch praktisch geprueft werden sollte
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Was dazu noch praktisch geprueft werden sollte
- `Standorte`-Seite im UI manuell durchklicken
- pruefen, ob `BI1`- und `SAGE`-Standort beim Speichern sauber auf die zentrale HANA-Konfiguration zeigen
- pruefen, ob Aenderung oben bei zentraler HANA-Konfiguration in nachfolgenden Exporten wirklich greift
## H132 - Anschlussarbeiten
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Anschlussarbeiten
- `ConfigTransferService` spaeter auf das neue zentrale HANA-Modell fachlich nachziehen und kritisch pruefen
- `DatabaseInitializationService` weiter konsolidieren, damit die Zuordnung alter HANA-Daten langfristig robuster wird
## H133 - Nachtrag Quellsystem-Verwaltung 2026-04-17
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag Quellsystem-Verwaltung 2026-04-17
Die bisher hart codierten Quellsystem-Listen wurden ersetzt.
Neuer Stand:
- `SourceSystemDefinition` ist jetzt die zentrale Stammdatenquelle fuer Quellsysteme
- `Settings.razor` hat jetzt eine GUI zur Pflege von Quellsystemen
- `Standorte.razor` zieht seine Quellsystem-Auswahl aus diesen Stammdaten
- `Transformations.razor` zieht die Systemauswahl ebenfalls aus diesen Stammdaten
- zentrale Credentials haengen jetzt am Quellsystem selbst
- HANA-Zentralverbindungen werden nur noch fuer Quellsysteme mit Anschlussart `HANA` gezeigt
- alte zentrale Credential-Felder in `ExportSettings` sind aus dem aktiven Codepfad entfernt
- `ExportSettings` wird beim Start auch schematisch auf das neue Feldset bereinigt
- HANA speichert zentral keine eigenen Credentials mehr; dort bleiben nur technische Verbindungsdaten
- `HanaServer.Username` / `Password` sind nur noch Laufzeitfelder und nicht mehr im EF-Schema gemappt
- SAP Service URL wird jetzt zentral im Quellsystem gepflegt; der Standort haelt nur noch ein optionales Override
- Quellsysteme werden jetzt per Dialog bearbeitet statt nur ueber Inline-Tabellenfelder
## H134 - Was dazu noch praktisch geprueft werden sollte
Quelle: NEXT_STEPS_2026-04-15.md.raw
### Was dazu noch praktisch geprueft werden sollte
- in `Settings` ein neues Quellsystem per GUI anlegen
- pruefen, ob es danach in `Standorte` und `Transformations` sofort auswählbar ist
- pruefen, ob deaktivierte Quellsysteme in neuen Standort-/Regelanlagen nicht mehr normal angeboten werden
- pruefen, ob Aenderung der Anschlussart von `HANA` auf `SAP_GATEWAY` oder `MANUAL_EXCEL` fachlich sauber wirkt
- pruefen, ob bestehende BI1/SAGE/SAP-Daten nach Startmigration korrekt in `SourceSystemDefinitions` stehen
- pruefen, ob Konfiguration-Export/Import ohne die alten Credential-Felder sauber mit `SourceSystemDefinitions` arbeitet
- pruefen, ob zentrale SAP Service URL ohne Override sauber fuer Refresh, Export und Dashboard greift
- pruefen, ob SAP Service URL Override am Standort die zentrale URL erwartungsgemaess uebersteuert
## H135 - Nachtrag 2026-04-16
Quelle: NEXT_STEPS_2026-04-15.md.raw
## Nachtrag 2026-04-16
Seit dem letzten Stand kamen mehrere groessere Erweiterungen dazu. Die offenen Punkte unten muessen deshalb im neuen Kontext gelesen werden.
## H136 - 0. Neuer Ist-Stand
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 0. Neuer Ist-Stand
Zusaetzlich zum alten Stand ist jetzt vorhanden:
- manueller Standort-Import ueber `MANUAL_EXCEL`
- Dashboard mit `Alle exportieren`, `Zentrale Datei neu erzeugen` und zentralem `Excel oeffnen`
- Roh-Auswertung im `Management Cockpit` direkt aus `CentralSalesRecords`
- erweitertes Transformationssystem mit `Value`- und `Record`-Regeln
- HANA-Schema-Lookup im Standortdialog
- Testprojekt mit aktuell 18 gruenden Tests
## H137 - 1. Status
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 1. Status
Der Export geht jetzt wieder durch.
Die zuletzt gefundene Hauptursache war nicht mehr ein reiner SQLite-Lock beim Batch-Insert, sondern ein kaputter FK-Schemazustand in der bestehenden DB:
- SQLite referenzierte in mindestens einer Tabelle noch `main.Sites_old`
- dadurch scheiterte `SaveChangesAsync()` beim Schreiben z. B. in `AppEventLogs` oder `ExportLogs`
- sichtbarer Effekt: Export blieb nach `Zentrale Tabelle: ... Datensaetze gespeichert.` haengen
## H138 - 2. Umgesetzter Fix
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 2. Umgesetzter Fix
Umgesetzt wurde:
- Dashboard-Live-Status liest waehrend laufendem Export nicht mehr staendig aus `AppEventLogs`, sondern nutzt den In-Memory-Status des `ExportOrchestrationService`
- SQLite `Default Timeout` in `Program.cs` auf `60` erhoeht
- `CentralSalesRecordService` setzt nach den Batches explizit `Zentrale Tabelle aktualisiert`
- `DatabaseInitializationService` repariert beim App-Start automatisch Tabellen, deren FK-SQL noch `Sites_old` referenziert
Betroffene Dateien:
- `Program.cs`
- `Components/Pages/Dashboard.razor`
- `Services/CentralSalesRecordService.cs`
- `Services/DatabaseInitializationService.cs`
## H139 - 3. Was noch getestet werden sollte
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 3. Was noch getestet werden sollte
Kurz gegenpruefen:
- Export eines Standorts erneut
- `Excel oeffnen` nach erfolgreichem Export
- `Export erfolgreich` inkl. `Pfad=...`
- Dashboard-Live-Status setzt sich nach Abschluss sauber zurueck
- `Alle exportieren`
- `Zentrale Datei neu erzeugen`
- zentrale Datei im Dashboard oeffnen
## H140 - 3a. Manuellen Excel-Import pruefen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 3a. Manuellen Excel-Import pruefen
Zu testen:
- Standort auf `MANUAL_EXCEL` stellen
- Excel im Standort hochladen
- Standort exportieren
- pruefen, ob `CentralSalesRecords` fuer diesen Standort ersetzt wurden
- pruefen, ob der zentrale Export den Standort korrekt enthaelt
Dateien:
- `Components/Pages/Standorte.razor`
- `Services/ManualExcelImportService.cs`
- `Services/SiteExportService.cs`
## H141 - 3b. HANA-Schema-Lookup pruefen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 3b. HANA-Schema-Lookup pruefen
Zu testen:
- bei `BI1`-Standort `Schemas laden`
- bei `SAGE`-Standort `Schemas laden`
- wird ein plausibles B1-Schema angeboten?
- funktioniert danach Export ohne manuelle Schema-Eingabe?
- zeigt England / Spezialstandort jetzt schneller, wenn Schema oder Rechte nicht passen?
Dateien:
- `Components/Pages/Standorte.razor`
- `Services/HanaQueryService.cs`
## H142 - 4. Falls wieder ein Fehler auftritt
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 4. Falls wieder ein Fehler auftritt
In dieser Reihenfolge pruefen:
1. Exakte Fehlermeldung aus `AppEventLogs` bzw. Console notieren
2. Pruefen, ob die Reparaturlogik beim Start gelaufen ist
3. Pruefen, ob noch weitere Tabellen mit veralteter FK-Referenz existieren
4. Erst danach wieder am Batch-/Commit-Pfad der zentralen Speicherung arbeiten
## H143 - 5. SAP-Funktionalitaet kurz gegenpruefen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 5. SAP-Funktionalitaet kurz gegenpruefen
Zu testen:
- `Quellen refreshen`
- `Felder aus Quellen laden`
- `Auto-Match`
- SAP-Export eines Standorts
Dateien:
- `Components/Pages/Standorte.razor`
- `Services/SapGatewayService.cs`
- `Services/SapCompositionService.cs`
## H144 - 6. Management Cockpit pruefen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 6. Management Cockpit pruefen
Zu testen:
- vorhandene Excel-Datei auswaehlbar
- Analyse laeuft
- Kennzahlen plausibel
- Roh-Auswertung aus `CentralSalesRecords` laeuft
- Jahr/Monat-Filter funktionieren
- Summen nach Quelle / Land plausibel
Dateien:
- `Components/Pages/ManagementCockpit.razor`
- `Services/ManagementCockpitService.cs`
## H145 - 6a. Fachlich bewusst noch offen
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 6a. Fachlich bewusst noch offen
Noch nicht final umsetzen ohne Rueckmeldung Fachseite:
- Intercompany-Filter
- fachliche Nutzung der CHF-Umrechnung in Cockpit / Reports
- Budgetvergleich
- Gruppenlogik
- Spartenlogik
- Margenlogik
Diese Punkte sollen spaeter moeglichst dynamisch auf dem neuen Transformations-/Mapping-Ansatz aufsetzen, aber aktuell nicht hart geraten werden.
## H146 - 6b. Naechste sinnvolle Testkandidaten
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 6b. Naechste sinnvolle Testkandidaten
Wenn weiter in Tests investiert wird, sind die naechsten Kandidaten:
- `ExportOrchestrationService`
- spaeter End-to-End-Tests fuer den Wechselkurs-/Transformationspfad
- spaeter evtl. SQLite-nahe Integrationstests fuer `DatabaseInitializationService`
Aktueller Teststatus:
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal`
- erfolgreich
- `31/31` Tests gruen
## H147 - 7. Referenzdatei
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 7. Referenzdatei
Fuer den vollstaendigen Kontext zuerst lesen:
- `HANDOFF_2026-04-15.md`
## H148 - 8. Letzte bereinigte UI-Irritation
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 8. Letzte bereinigte UI-Irritation
Stand 2026-04-17:
- In `Standorte` wurde die obere Box auf `Zentrale HANA-Technik` geklaert.
- Dort gibt es keinen `Server hinzufuegen`-Pfad mehr.
- Grund: zentrale HANA-Eintraege werden aus `Quellsystemen` mit Anschlussart `HANA` abgeleitet.
- `SAP` gehoert fachlich nicht in diese Box, sondern in `Settings -> Quellsysteme`.
Wichtig fuer den naechsten Wiedereinstieg:
- Wenn ein Benutzer fragt `wo ist SAP?`, ist die richtige Antwort: nicht in der HANA-Box, sondern in der zentralen Quellsystem-Verwaltung.
- Wenn ein HANA-System oben fehlt, zuerst `Settings -> Quellsysteme` pruefen und dort Anschlussart `HANA` setzen.
## H149 - 9. Config-Transfer erneut geprueft
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 9. Config-Transfer erneut geprueft
Stand 2026-04-17:
- Der aktuelle Config-Import/-Export passt zum neuen Datenmodell.
- Zentral verwaltete Quellsysteme, SAP-Zentral-URL, HANA-Technik ohne HANA-Credentials und Standort-Overrides werden korrekt im Transferformat abgebildet.
- Die vorhandenen `ConfigTransferServiceTests` bestaetigen den aktuellen Rundlauf.
Fuer den naechsten Wiedereinstieg wichtig:
- Das aktuelle Format ist fuer heutige Exporte konsistent.
- `ImportJsonAsync` ist aber weiterhin nicht atomar und loescht zuerst produktive Konfiguration.
- Zusaetzlich gibt es ein Altformat-Risiko:
- aeltere JSONs mit `SourceSystemDefinitions`, aber ohne `ConnectionKind`, koennen wegen DTO-Default falsch als `HANA` interpretiert werden.
Naechste saubere Haertung fuer dieses Thema:
- Config-Import transaktional machen
- Legacy-Fallback fuer fehlendes `ConnectionKind` einbauen
## H150 - 10. Nachtrag 2026-05-20: Finance-Regeln statt harte Laenderlogik
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 10. Nachtrag 2026-05-20: Finance-Regeln statt harte Laenderlogik
Aktueller Stand:
- Es gibt jetzt `Admin -> Finance Regeln`.
- Die fachliche Abgrenzung fuer Finance wird dort als Regel gepflegt:
- Land/Scope
- Jahr
- Regeltyp
- Feld
- Vergleich
- Wert
- Notiz
- Sortierung/Aktiv
- Diese Regeln wirken auf:
- zentrales Excel (`Finance | ...` und `Finance Summary`)
- Soll/Ist Vergleich
- Sie veraendern nicht:
- Rohdatenimport
- Mapping in `Admin -> Standorte`
- technische Transformationen in `Admin -> Transformationen`
UI-Logik fuer Keyuser:
```text
Admin -> Standorte = Quelle und Spaltenmapping
Admin -> Transformationen = technische Feldnormalisierung/-berechnung
Admin -> Finance Regeln = CFO-/Finance-Abgrenzung
```
Wichtige Default-Regeln:
- DE:
- Alphaplan-Jahresfile -> Finance-Jahr 2025
- Trafag AG ausschliessen
- Magnetic Sense ausschliessen
- GS2510095 ausschliessen
- GS-Gutschriften negativ
- IT:
- Trafag Italia ausschliessen
- doppelte Blank-Supplier-Country-Zeilen deduplizieren
Nach jedem Regelwechsel testen:
1. passenden Standort exportieren
2. zentrale Datei neu erzeugen
3. im Endexcel `Finance Summary` kontrollieren
4. `Soll/Ist Vergleich` kontrollieren
Letzter DE-Pruefstand:
```text
DE 2025 im zentralen Excel: 3'652'394.46
```
## H151 - 11. Nachtrag 2026-05-20: Export Dashboard Datenbasis
Quelle: NEXT_STEPS_2026-04-15.md.raw
## 11. Nachtrag 2026-05-20: Export Dashboard Datenbasis
Im Export Dashboard steht direkt nach `Land` die Spalte `Basis`.
Angezeigt wird:
- `Excel-Datei` mit Tabellen-Icon
- `CSV-Datei` mit Datei-Icon
- `SAP Service` mit Cloud-Sync-Icon
- `Server` mit Storage-Icon
- `Manuelle Datei`, falls manuelle Quelle ohne erkennbaren Pfad
Die Spalte kommt aus `DashboardPageService.ResolveDataBasis`.
## H152 - TrafagSalesExporter Handoff
Quelle: HANDOFF_2026-04-15.md.raw
# TrafagSalesExporter Handoff
Stand: 2026-05-20
## H153 - Aktueller Handoff-Zusatz 2026-05-20
Quelle: HANDOFF_2026-04-15.md.raw
## Aktueller Handoff-Zusatz 2026-05-20
Seit den aelteren Handoff-Eintraegen wurden folgende Punkte umgesetzt und dokumentiert:
- `Management Analyse` hat einen fuehrenden Reiter `Finance Summary`.
- Finance Summary nutzt dieselbe `FinanceRuleEngine` wie das zentrale Excel-Blatt `Finance Summary`.
- Filter fuer Jahr, Land und Waehrung wirken auf das Finance-Endergebnis.
- DE 2026 wirft keinen Fehler mehr, sondern zeigt wegen DE/Alphaplan-2025-Zwang einen leeren Zustand mit Hinweis.
- HR KPI Cockpit wurde erweitert:
- Anleitung-Reiter
- Datenordner anpassbar
- Dateifrische / Datenstatus
- Ampeln
- Periodenvergleich
- Datenqualitaet
- Austritte nach Typ/Organisation
- Absenzen nach Organisation / Top-Absenzen
- Managementsicht
- Drucken/PDF
- Anwenderdokus:
- `docs/HR_KPI_ANLEITUNG_HR_2026-05-20.docx`
- `docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx`
- Markdown-Dokumentenstatus:
- `docs/MD_DOKUMENTENSTATUS_2026-05-20.md`
Validierung:
- `dotnet test TrafagSalesExporter.sln --verbosity minimal`
- Ergebnis am 2026-05-20: `77/77` Tests gruen.
Hinweis:
- Aeltere Abschnitte in diesem Handoff bleiben als Historie erhalten. Fuer aktuellen Status immer zuerst diesen Zusatz, `NEXT_STEPS_2026-04-15.md`, `lastchange.md` und `docs/MD_DOKUMENTENSTATUS_2026-05-20.md` lesen.
## H154 - Nachtrag 2026-05-11 UK_B1 Mapping / aktueller Arbeitsstand
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-11 UK_B1 Mapping / aktueller Arbeitsstand
Letzter Benutzerwunsch:
- UK/England soll weiter ueber `UK_B1` laufen.
- Das Mapping soll so angepasst werden, dass die Finance-Zahl plausibel wird.
- Danach soll alles nachvollziehbar dokumentiert sein.
Wichtiger Befund:
- FinanceProbe zeigte fuer UK/England:
- `TSC = TRUK`
- `1'881` Zeilen
- Ist `395'605.82 GBP`
- Soll `3'749'865.00 GBP`
- In der lokalen DB waren fuer `TRUK` keine `ManualExcelColumnMappings` vorhanden.
- Der Fallback-Importer hat `Sales Price/Value` direkt als Positionswert importiert.
- Im UK-B1-Export ist `Sales Price/Value` aber ein Stueckpreis.
- Korrekte Positionslogik:
```text
SalesPriceValue = [Sales Price/Value] * [Quantity]
```
Probe auf existierenden Zentraldaten:
```text
Summe SalesPriceValue bisher: 395'605.82 GBP
Summe SalesPriceValue * Quantity: 3'533'348.89 GBP
check.xlsx Soll: 3'749'865.00 GBP
Restdifferenz: -216'516.11 GBP
```
Geaenderte Dateien im aktuellen Worktree:
- `Services/ManualExcelImportService.cs`
- grafische Manual-Excel-Mappings koennen einfache Multiplikationsausdruecke lesen:
```text
=[Header A]*[Header B]
```
- Konstanten wie `=GBP` funktionieren weiterhin.
- `Services/DatabaseSeedService.cs`
- repariert England/TRUK auf:
```text
https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1
```
- seedet fuer `TRUK` ein grafisches Mapping, insbesondere:
```text
SalesPriceValue <- =[Sales Price/Value]*[Quantity]
SalesCurrency <- =GBP
DocumentCurrency<- =GBP
CompanyCurrency <- =GBP
PostingDate <- invoice date
InvoiceDate <- invoice date
```
- `TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs`
- neuer Test fuer berechnetes Manual-Excel-Mapping.
Aktueller Teststand:
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal`
- Tests erfolgreich: `59/59`.
- Bekannte Warnungen: bestehende MudBlazor-Analyzerwarnungen zu `Dense`.
Zusatzfix:
- `DatabaseSeedService` prueft vor `EnsureUkManualExcelMapping(...)`, ob `ManualExcelColumnMappings` sauber auf `Sites` referenziert.
- Falls die Tabelle noch auf `Sites_repair_old` oder eine andere `Sites_*`-Reparaturtabelle zeigt, wird der UK-Mapping-Seed fuer diesen Start uebersprungen.
- Dadurch kann die Schema-Reparatur sauber durchlaufen.
Naechster praktischer Schritt:
1. SharePoint-/Graph-Zugriff reparieren.
2. FinanceProbe ist bereits auf `http://127.0.0.1:5099` gestartet.
3. `/run/export/TRUK` erneut ausfuehren.
4. `/finance` erneut pruefen.
Praktischer Stand:
- Lokale DB ist aktualisiert:
- `TRUK` Pfad = `UK_B1`
- `18` aktive Manual-Excel-Mapping-Zeilen
- `/finance` antwortet mit HTTP `200`.
- `/run/export/TRUK` scheitert aktuell an Auth/Netzwerk:
```text
ClientSecretCredential authentication failed
127.0.0.1:9 connection refused
```
- Deshalb enthaelt `CentralSalesRecords` fuer UK noch den alten Importstand, bis SharePoint wieder erreichbar ist.
Wichtig:
- Das ist keine Sonderlogik, die UK-Zahlen schoenrechnet.
- Der Mapper setzt die allgemeine fachliche Regel "pro Artikel / Belegposition" um.
- Die Formel ist im grafischen Mapping sichtbar und nicht hart als UK-Spezialberechnung im Importcode versteckt.
- Falls nach neuem Export noch eine Restdifferenz bleibt, muss die UK-Datei auf weitere Netto-/Discount-/Frachtspalten geprueft werden.
## H155 - Nachtrag 2026-05-08 Manual Excel/CSV / SharePoint-Ordner
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-08 Manual Excel/CSV / SharePoint-Ordner
Aktueller Stand fuer manuelle Quellen:
- `MANUAL_EXCEL` ist fachlich Manual Excel/CSV.
- Unterstuetzt werden `.xlsx` und `.csv`; altes `.xls` ist nicht der Zielpfad.
- Lokale Datei als Quelle:
- App liest die Datei.
- App erzeugt eine neue Exportdatei im selben lokalen Ordner.
- SharePoint-Datei als Quelle:
- App laedt die Datei temporaer herunter.
- App erzeugt eine neue Exportdatei und laedt sie in denselben SharePoint-Ordner hoch.
- SharePoint-Ordner als Quelle:
- App waehlt automatisch die neueste passende `.xlsx`/`.csv` fuer den Standort.
- Primaeres Muster: `ddMMyy_TSC.xlsx` oder `ddMMyy_TSC.csv`.
- Fallback: SharePoint `LastModifiedDateTime`.
England / UK:
- Standort `England`, `TSC = TRUK`, `SourceSystem = MANUAL_EXCEL`.
- Quelle ist ein SharePoint-Ordner:
```text
https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1
```
- Beispielauswahl:
- `010526_TRUK.xlsx` ist neuer als `010426_TRUK.xlsx`.
- Exportdateien werden wieder in `Import/Finance/UK_B1` geschrieben.
- Befund am 2026-05-08: England zeigte lokal faelschlich auf die Deutschland-Alphaplan-Datei; lokale DB wurde korrigiert.
- `DatabaseSeedService` repariert kuenftig einen leeren England/TRUK-Manual-Pfad auf den UK_B1-Ordner.
Spanien / Sage:
- Spanien nutzt `MANUAL_EXCEL` als technischen Importpfad fuer den Sage-Export.
- Die Datei `Spain_Sales_2025.csv` konnte gelesen werden (`4'341` Zeilen).
- Fehler war danach der Exportpfad: die SharePoint-URL wurde als lokaler Dateipfad interpretiert.
- Fix: SharePoint-Manual-Quellen liefern keinen `ReferenceFilePath` mehr, sondern erzeugen eine neue Exportdatei im Quellordner.
Deutschland / Alphaplan:
- Deutschland nutzt `MANUAL_EXCEL` als technischen Importpfad fuer Alphaplan-Excel.
- Grafisches Mapping ist vorhanden.
- Offener Punkt: konkreter Alphaplan-Datei-/SharePoint-Pfad muss im Standort hinterlegt sein, sonst kommt `Standort 'Deutschland' hat keine manuelle Excel-Datei.`
Verifikation:
- Tests `55/55` erfolgreich.
## H156 - Nachtrag 2026-05-08 FinanceProbe fuer mehr Laender
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-08 FinanceProbe fuer mehr Laender
FinanceProbe wurde erweitert:
- `FinanceReferences` werden vollstaendig angezeigt, nicht nur bei aktivem Standort oder vorhandenen Ist-Daten.
- Dadurch sind alle Soll-Laender aus der Finance-Konfiguration im Meeting sichtbar.
- Neue Sektion `Datenabdeckung je Standort` zeigt je Standort:
- Quelle/System
- Manual-/SharePoint-Pfad
- Aktivstatus
- Anzahl 2025-Zeilen in `CentralSalesRecords`
- Summe `SalesPriceValue`
- Waehrungen und Datumsbereich
- letzter Exportstatus/Fehler
- CH/AT-Erkennung im Finance-Service wurde geschaerft, damit `ZSCHWEIZ`-Zeilen mit Land `AT` Oesterreich zugeordnet werden koennen.
Wichtig:
- `Keine Daten` bedeutet jetzt nicht zwingend fehlende Referenz, sondern oft: Referenz ist vorhanden, aber Ist-Daten wurden noch nicht exportiert/importiert.
- Fuer neue Laender reicht es, `FinanceReferences` zu pflegen und Daten nach `CentralSalesRecords` zu bringen; die Probe zeigt sie dann automatisch.
## H157 - Nachtrag 2026-05-11 FinanceProbe KI-Steuerung
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-11 FinanceProbe KI-Steuerung
FinanceProbe kann jetzt nicht nur vergleichen, sondern im Testkontext auch Exporte ausloesen:
- `/run/export/{siteKey}`: einzelner Standort nach `Id`, `TSC` oder `Land`
- `/run/export-all`: alle aktiven Standorte plus zentrale Datei
- `/run/consolidated`: zentrale Datei aus `CentralSalesRecords`
Die Routen liefern eine HTML-Run-Summary mit Exportlogs, Finance-Abgleich und Datenabdeckung.
Wichtig:
- Das ist eine temporaere Test-/KI-Steuerung.
- Nicht als produktive API betrachten.
- Echte SAP/HANA/SharePoint-Zugriffe funktionieren nur mit vorhandenen Credentials und Netzverbindung auf dem Rechner.
## H158 - Nachtrag 2026-05-07 Mapper-Konsolidierung / Finance-Konfiguration
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-07 Mapper-Konsolidierung / Finance-Konfiguration
Architekturstand:
- `MappedSalesRecordComposer` ist die gemeinsame Engine fuer grafisches Mapping.
- SAP OData und generisches HANA-Mapping nutzen denselben Composer fuer Joins und Zielfeldmapping.
- SAP OData laedt weiter ueber `SapGatewayService`.
- HANA-Tabellen/Views laden weiter ueber `HanaQueryService`.
- Der alte B1-HANA-Pfad ohne Mapping bleibt als Legacy-Pfad fuer bestehende BI1/SAGE-Standorte erhalten.
- `ConsolidatedExportService.ExportAsync()` erzeugt die zentrale Datei nur noch aus `CentralSalesRecords`; es gibt keinen zweiten Records-Parameter mehr.
- Manual Excel/CSV akzeptiert im Standort-Editor und Upload `.xlsx` und `.csv`.
Neue Konfigurationstabellen:
- `FinanceReferences`: Soll-/check.xlsx-Referenzen je Jahr und Land/Key.
- `FinanceIntercompanyRules`: IC-/2nd-party-Regeln nach Scope, Kundennummer oder Namensbestandteil.
- Budgetkurse 2025 liegen als `CurrencyExchangeRates` mit `Notes = Budget 2025`.
- Config-Export/-Import nimmt `FinanceReferences` und `FinanceIntercompanyRules` mit.
Offen:
- Manual-Excel-Import hat noch zwei Modi: Header-Automatik und grafisches Mapping.
- Der alte B1-HANA-Spezialpfad ist bewusst noch vorhanden, sollte aber mittelfristig durch gepflegte HANA-Mappings abgeloest werden.
Verifikation:
- Hauptprojekt Build erfolgreich.
- Tests `52/52` erfolgreich.
## H159 - Nachtrag 2026-05-07 SAP OData / ZSCHWEIZ / Schweiz-Oesterreich
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-07 SAP OData / ZSCHWEIZ / Schweiz-Oesterreich
Aktueller Architekturentscheid:
- `ZSCHWEIZ` wird ueber SAP OData/Gateway gelesen.
- Direkter HANA-Spezialcode fuer `ZSCHWEIZ` wurde vermieden.
- Der grafische Quellen- und Feldmapper wird fuer SAP OData verwendet.
- Fuer direkte HANA-Tabellen/Views gibt es ebenfalls grafisches Mapping; das ist aber nicht der geplante Pfad fuer `ZSCHWEIZ`.
Quellsysteme:
- `SAP` = `SAP OData`, Anschlussart `SAP_GATEWAY`.
- `SAP_HANA` = `SAP HANA Tables/Views`, Anschlussart `HANA`.
- `BI1` und `SAGE` bleiben HANA-basierte Quellsysteme.
- `MANUAL_EXCEL` bleibt Excel/CSV.
ABAP/SAP:
- Datei `report.abap` enthaelt Report `ZTRAFAG_SCHWEIZ_EXPORT`.
- Ziel-Tabelle in SAP: `ZSCHWEIZ`.
- `BUKRS 1100` wird als Schweiz (`TRCH`, `CH`) geschrieben.
- `BUKRS 1200` wird als Oesterreich (`TRAT`, `AT`) geschrieben.
- `CUSTOMER_LAND` enthaelt das urspruengliche Kundenland.
- Der Report schreibt paketweise per Upsert.
App-Seed:
- Standort `ZSCHWEIZ` / `Schweiz/Oesterreich` wird inaktiv angelegt bzw. repariert.
- `SourceSystem = SAP`.
- Quelle `Z`, EntitySet `ZSCHWEIZSet`.
- Quelle und Feldmapping werden beim App-Start per Upsert nachgezogen; eine teilweise vorhandene ZSCHWEIZ-Konfiguration bleibt dadurch nicht leer.
- Initiales Mapping:
- `Tsc <- Z.TSC`
- `Land <- Z.LAND1`
- `InvoiceNumber <- Z.VBELN`
- `PositionOnInvoice <- Z.POSNR`
- `SalesPriceValue <- Z.NETWR_HC`
- `SalesCurrency <- Z.HWAER`
- `CustomerCountry <- Z.CUSTOMER_LAND`
Wichtig fuer naechsten Einstieg:
- Wenn die zentrale SAP-Service-URL noch auf `ZPOWERBI_EINKAUF_SRV` zeigt, muss beim Standort `ZSCHWEIZ` ein Service-URL-Override fuer den `ZSCHWEIZ`-OData-Service gesetzt werden.
- Feldinfos kommen ueber `$metadata`; manuelle Feldliste ist nur noetig, wenn Gateway/Metadata nicht funktioniert.
- Nach URL-Setzung: `Entity Sets refreshen`, `Felder aus Quellen laden`, Mapping kontrollieren, Standort aktivieren, Export testen.
Verifikation:
- Hauptprojekt Build erfolgreich.
- Tests `52/52` erfolgreich.
## H160 - Nachtrag 2026-05-05 Aktueller Handoff FinanceProbe / Laenderabgleich
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-05-05 Aktueller Handoff FinanceProbe / Laenderabgleich
Der aktuelle Arbeitsstand fuer den naechsten Einstieg ist der lokale FinanceProbe:
```text
http://localhost:55417/finance
```
Der FinanceProbe wurde als Meeting-Ansicht erweitert:
- `Meeting Ampel 2025`
- `Detail alle Laender`
- `Germany Excel sample check`
- `Spain CSV direct check`
Ampel-Bedeutung:
- Gruen: Ist/Soll passt rechnerisch gegen Referenz.
- Gelb: technische Daten vorhanden, aber Differenz oder fachliche Abgrenzung offen.
- Grau: keine belastbaren Ist-Daten im aktuellen Import.
Wichtige Waehrungsregel fuer Management-Aussage:
- Wenn die Quelle CHF liefert, kann CHF direkt als CHF gezeigt werden.
- Wenn die Quelle EUR/USD/GBP/INR usw. liefert, ist es Mandanten- bzw. Originalwaehrung.
- CHF-Ausweis braucht dann eine separate FX-Regel oder einen offiziell bestaetigten Kurs.
## H161 - Spanien
Quelle: HANDOFF_2026-04-15.md.raw
### Spanien
Vorhandene finale Kandidatendatei:
```text
sagespain/v2/Spain_Sales_2025.csv
```
FinanceProbe liest diese Datei direkt.
Aktueller Stand:
- Zeilen: `4'341`
- Ist `SalesPriceValue`: `3'082'320.18` EUR
- Soll aus `check.xlsx`: `3'102'333.61`
- Differenz: `-20'013.43`
- Status: Gelb / Pruefen
Technisch:
- `ManualExcelImportService` kann jetzt semikolongetrennte CSV-Dateien lesen.
- Spanien-v2-CSV kann damit als `MANUAL_EXCEL` importiert werden.
- In der Detailtabelle wird Spanien nicht mehr als `Keine Daten` gezeigt, sondern als `Pruefen` mit dem v2-CSV-Wert.
Offen fachlich:
- Periodenlogik: `FechaFactura` vs. andere Datumsfelder
- Serien: `REG`, `LAT`, `PRO`, `REC`
- Behandlung von Gutschriften / `REC`
- offizielle Sage-Auswertung mit identischem Filter zur Sollzahl
## H162 - Deutschland
Quelle: HANDOFF_2026-04-15.md.raw
### Deutschland
Vorhandenes Beispielfile:
```text
DE_Beispiel_Export_Daten.xlsx
```
Wichtig:
- Das File ist ein Beispielfile, keine finale DE-Jahresdatei.
- Es darf nicht als finale Ist-Zahl gegen die Jahresreferenz verwendet werden.
Technischer Check:
- relevante Spalte: `NettoPreisGesamtX`
- Mapping-Ziel: `SalesPriceValue`
- Betragszeilen: `2`
- Summe: `8'290.70` EUR
- Waehrung: `EUR`
Interpretation:
- Deutschland-Format ist technisch verstanden.
- Mapping funktioniert.
- Finale DE-Zahl fehlt noch.
- Fuer Abschluss/Meeting wird ein vollstaendiger DE-Jahresfile 2025 oder ein bestaetigter Importlauf benoetigt.
## H163 - Geaenderte wichtige Dateien
Quelle: HANDOFF_2026-04-15.md.raw
### Geaenderte wichtige Dateien
- `Tools/FinanceProbe/Program.cs`
- Management-Ampel
- Spanien-v2-CSV-Direktcheck
- Deutschland-Beispielfile-Check
- `Services/ManualExcelImportService.cs`
- CSV-Support fuer manuelle Quellen
- `Services/DatabaseSeedService.cs`
- deaktivierter Spanien-Standort als Seed/Fallback
- `TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs`
- Tests fuer CSV/Mapping
- `SAGE_SPAIN_EXPORT_2026-05-05.md`
- Spanien-Doku
- `lastchange.md`
- chronologischer Abschlussstand
## H164 - Letzte Verifikation
Quelle: HANDOFF_2026-04-15.md.raw
### Letzte Verifikation
```text
dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal --no-restore
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal --no-restore
```
Ergebnis:
- FinanceProbe Build erfolgreich
- Tests erfolgreich
- `50/50` Tests gruen
- FinanceProbe liefert `HTTP 200`
## H165 - Nachtrag 2026-04-29 Dashboard-Referenzcheck Net Sales 2025
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 Dashboard-Referenzcheck Net Sales 2025
Das Dashboard zeigt jetzt oberhalb der Exportaktionen einen Referenzcheck fuer `Net Sales Actuals 2025`.
Zweck:
- schnelle Gegenpruefung, ob die gezogenen Werte gegen `check.xlsx` / Power-BI-Referenz plausibel sind
- automatische Ermittlung des Summenfelds, das am besten zum Referenzwert passt
- sichtbar machen, ob aktuell `SalesPriceValue`, `DocTotalFC - VatSumFC` oder `DocTotal - VatSum` als Vergleichsbasis genutzt wird
- `DocumentTotal*` wird nur dedupliziert pro Beleg verwendet, weil es ein Belegkopfwert ist und in der positionsbasierten Datei pro Position wiederholt wird
Logik:
- Ist-Wert = bester Kandidat aus:
- Summe `CentralSalesRecords.SalesPriceValue`
- Summe `DocumentTotalForeignCurrency - VatSumForeignCurrency`
- Summe `DocumentTotalLocalCurrency - VatSumLocalCurrency`
- Belegkopfwerte werden vor dem Summieren per `TSC` + `DocumentType` + `DocumentEntry` dedupliziert; falls `DocumentEntry` fehlt, per `InvoiceNumber`
- Jahr = `InvoiceDate`, falls vorhanden, sonst `ExtractionDate`
- Vergleichsjahr = `2025`
- Referenzwerte sind aus `check.xlsx` / Power BI Stand 2026-04-29 im Code hinterlegt
- wenn ein Power-BI-Referenzwert vorhanden ist, wird dieser als Vergleich verwendet
- sonst wird der LC-Referenzwert verwendet
Angezeigt werden:
- Firma
- Ist 2025
- Referenz
- Summenfeld
- Referenzquelle (`Power BI` oder `LC`)
- Differenz
- Waehrungen
- Zeilen
- Status `OK`, `Pruefen` oder `Keine Daten`
Verifikation:
- `dotnet build .\TrafagSalesExporter.csproj --verbosity minimal` erfolgreich
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal` erfolgreich
- lokaler Dashboard-Start geprueft: `http://localhost:55416` antwortet mit HTTP `200`
Naechster Bedienablauf, damit die korrekten Summen kommen:
1. App starten bzw. offen lassen: `http://localhost:55416`
2. Im Dashboard neue Daten ziehen:
- entweder `Alle exportieren`
- oder einzelne Standorte per `Export`
3. Danach `Zentrale Datei neu erzeugen` ausfuehren.
4. Oben im Dashboard den Block `Net Sales Actuals 2025 Referenz` pruefen.
5. Entscheidend ist die Spalte `Summenfeld`:
- `Sales Price/Value` = Positionssumme
- `DocTotalFC - VatSumFC` = Netto-Belegsumme in Belegwaehrung, dedupliziert pro Beleg
- `DocTotal - VatSum` = Netto-Belegsumme in Hauswaehrung, dedupliziert pro Beleg
6. `Status = OK` bedeutet: Abweichung zur Referenz maximal 1.
7. `Status = Pruefen` bedeutet: Feld, Datenquelle, Zeitraum oder Standortkonfiguration fachlich kontrollieren.
Wichtig:
- Mit alten zentralen Daten bleiben die neuen B1-Felder leer bzw. `0`.
- Fuer die echte Pruefung von `DocEntry`, `DocTotal*`, `VatSum*`, `DocRate` und `OADM.MainCurncy` muss zuerst neu exportiert werden.
- Fuer neue Jahre ist aktuell noch kein dynamischer Referenzjahres-Schalter eingebaut; der harte Referenzcheck ist Stand jetzt auf `2025`, weil `check.xlsx` die 2025-Referenzen enthaelt.
## H166 - Nachtrag 2026-04-29 Export-all-Abbruch / SQLite-FK-Reparatur
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 Export-all-Abbruch / SQLite-FK-Reparatur
Beim Klick auf `Export all` kam:
- `An error occurred while saving the entity changes. See the inner exception for details.`
Ursache:
- die bestehende SQLite-DB hatte in `ExportLogs`, `AppEventLogs` und `CentralSalesRecords` noch Foreign Keys auf `"Sites_repair_old"`
- diese Reparatur-Zwischentabelle existiert nicht mehr
- beim Speichern neuer Logs oder zentraler Datensaetze konnte SQLite deshalb nicht mehr korrekt speichern
Korrektur:
- `DatabaseSchemaMaintenanceService` erkennt jetzt nicht nur `Sites_old`, sondern auch alte Reparaturtabellen wie `Sites_repair_old`
- betroffene Tabellen werden beim App-Start automatisch neu aufgebaut
- `AppEventLogService` und `ExportLogService` fangen eigene Log-Speicherfehler ab, damit Logging-Probleme nicht den ganzen Export abbrechen
- Dashboard-Fehlerausgaben zeigen jetzt auch die Inner Exception, falls vorhanden
Verifikation:
- App neu gestartet
- DB-Schema direkt geprueft:
- `AppEventLogs` -> `FOREIGN KEY (SiteId) REFERENCES Sites (Id)`
- `ExportLogs` -> `FOREIGN KEY (SiteId) REFERENCES Sites (Id)`
- `CentralSalesRecords` -> `FOREIGN KEY (SiteId) REFERENCES Sites (Id)`
- `dotnet build .\TrafagSalesExporter.csproj --verbosity minimal` erfolgreich
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal` erfolgreich
Direkt danach beobachtete Exportfehler:
- Frankreich/Italien/USA: `invalid schema name ... line 40` durch HANA-Query-Quoting
- Ursache: Query nutzte `"schema"."Tabelle"`
- Korrektur: wieder `schema."Tabelle"` wie im alten funktionierenden Stand
- Indien: `authentication failed`
- Konfiguration/Credentials pruefen, kein Codefehler aus dieser Aenderung
- England/Spanien/Deutschland: `MANUAL_EXCEL`, aber keine manuelle Excel-Datei hinterlegt
- entweder Datei hinterlegen oder Standort deaktivieren/Quellsystem korrigieren
## H167 - Nachtrag 2026-04-29 B1-Belegwaehrungsfelder aus HANA
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 B1-Belegwaehrungsfelder aus HANA
Der HANA/B1-Export wurde um Beleg- und Hauswaehrungsfelder erweitert.
Grund:
- `p.StockPrice` muss fachlich in der B1-Hauswaehrung bewertet werden
- die Hauswaehrung kommt aus `OADM.MainCurncy`
- bisher wurde `StandardCostCurrency` aus `p.Currency` bzw. `h.DocCur` abgeleitet
- fuer Power-BI-/Cockpit-Gegenpruefung muessen Belegwaehrung, Hauswaehrung, Netto-/Steuerbetraege und Kurs sichtbar sein
Neue Felder in `SalesRecord` und `CentralSalesRecord`:
- `DocumentEntry`
- `DocumentCurrency`
- `DocumentTotalForeignCurrency`
- `DocumentTotalLocalCurrency`
- `VatSumForeignCurrency`
- `VatSumLocalCurrency`
- `DocumentRate`
- `CompanyCurrency`
B1-Feldmapping:
- `DocumentEntry` = `OINV/ORIN.DocEntry`
- `DocumentCurrency` = `OINV/ORIN.DocCur`
- `DocumentTotalForeignCurrency` = `OINV/ORIN.DocTotalFC`
- `DocumentTotalLocalCurrency` = `OINV/ORIN.DocTotal`
- `VatSumForeignCurrency` = `OINV/ORIN.VatSumFC`
- `VatSumLocalCurrency` = `OINV/ORIN.VatSum`
- `DocumentRate` = `OINV/ORIN.DocRate`
- `CompanyCurrency` = `OADM.MainCurncy`
- `StandardCostCurrency` = `OADM.MainCurncy`
Technische Umsetzung:
- `HanaQueryService` liest `OADM` jetzt per `CROSS JOIN`
- Invoice- und Credit-Note-Query liefern die neuen Felder
- bei Gutschriften werden Dokument- und Steuerbetraege mit negativem Vorzeichen uebernommen
- `CentralSalesRecords`-Schema wurde erweitert
- bestehende SQLite-DBs erhalten die neuen Spalten per `DatabaseSchemaMaintenanceService`
- `CentralSalesRecordService` persistiert und liest die neuen Felder
- `ExcelExportService` schreibt die neuen Spalten in Standort- und `Sales_All_*.xlsx`-Dateien
- `ManualExcelImportService` kann die neuen Spalten wieder einlesen
- `ConfigTransferService` erhaelt die neuen Felder beim Remapping zentraler Laufzeitdaten
Wichtig fuer Power BI:
- die neuen `DocumentTotal*`- und `VatSum*`-Felder sind Belegkopfwerte
- sie werden in der positionsbasierten Excel pro Positionszeile wiederholt
- diese Felder duerfen daher nicht blind positionsweise summiert werden
- fuer Belegkopfsummen in Power BI zuerst nach `DocumentType`, `Invoice Number`, `TSC` und ggf. `Land` deduplizieren
- besser: nach `TSC` + `DocumentType` + `DocumentEntry` deduplizieren, weil `DocEntry` aus B1 jetzt mitgezogen wird
- positionsbasierte Auswertungen sollen weiterhin mit positionsbezogenen Feldern wie `Sales Price/Value`, `Quantity` oder `Standard cost` arbeiten
Wichtig zum aktuellen Datenbestand:
- alte zentrale Daten wurden vor der Erweiterung exportiert und haben fuer die neuen B1-Felder noch `0`
- nach einem neuen Export/Rebuild der zentralen Daten koennen `DocEntry`, `DocTotal*`, `VatSum*`, `DocRate` und `OADM.MainCurncy` fachlich verglichen werden
Verifikation:
- `dotnet build .\TrafagSalesExporter.csproj --verbosity minimal` erfolgreich
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal` erfolgreich
- `48/48` Tests gruen
- `ManualExcelImportServiceTests` pruefen die neuen Excel-Spalten
- `CentralSalesRecordServiceTests` pruefen Persistenz und Ruecklesen der neuen B1-Felder
## H168 - Nachtrag 2026-04-29 Clean-Code-/DI-Befund
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 Clean-Code-/DI-Befund
Der aktuelle Code ist DI-orientiert und deutlich besser strukturiert als zu Beginn des Refactorings, aber noch nicht durchgehend ein Clean-Code-Ideal.
Positiv:
- Services werden weitgehend ueber Interfaces und DI verdrahtet
- `DataSourceAdapter` trennt die Quellsysteme
- Page-Services reduzieren direkte DB-Logik in mehreren Razor-Seiten
- `Scoped` fuer UI-nahe Services und `Singleton` fuer gemeinsame Infrastruktur/Orchestrierung ist bewusst gewaehlt
- Testabdeckung fuer zentrale Fachlogik ist vorhanden und waechst
Weiterhin offene Clean-Code-Risiken:
- `DatabaseInitializationService` ist weiterhin produktiver Reparatur-/Migrationspfad
- `Settings.razor` und `Standorte.razor` enthalten noch viel Workflow-/UI-Logik
- `ManagementCockpitService` und `ConfigTransferService` sind breit und sollten spaeter weiter aufgeteilt werden
- Retry-/Robustheitslayer fuer externe Systeme fehlt
- Secret-Store fehlt
- Auth-Rollenmodell ist aktuell pragmatisch, aber noch grob
Bewertung:
- Architektur: brauchbar bis gut
- DI: grundsaetzlich sauber
- Clean Code: mittel bis gut, mit klaren Altlasten
Dieser Befund wurde bewusst nur dokumentiert. Die strukturelle Bereinigung wird spaeter priorisiert.
## H169 - Nachtrag 2026-04-29 Authentifizierung / AD-Zugriffsschutz
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 Authentifizierung / AD-Zugriffsschutz
Nach Rueckmeldung der IT wurde ein Zugriffsschutz fuer die Blazor-App eingebaut.
Vorher konnte jeder Benutzer mit Netzwerkzugriff auf die App-URL die Anwendung oeffnen. Das war kritisch, weil die App Verkaufsdaten, Standort-/Quellsystemkonfiguration, SharePoint-Konfiguration, Config Import/Export und Secrets bzw. Zugangsdatenfelder beruehrt.
Neuer Stand:
- die App ist grundsaetzlich authentifizierungspflichtig
- produktives Ziel ist Windows Authentication / Active Directory
- Berechtigungen laufen ueber AD-Gruppen
- es gibt keine eigene Benutzer-/Passwortverwaltung in der App
- es gibt keinen versteckten produktiven Backdoor
Neue Security-Dateien:
- `Security/SecurityOptions.cs`
- `Security/SecurityPolicies.cs`
- `Security/DevelopmentAuthenticationHandler.cs`
Geaenderte zentrale Dateien:
- `Program.cs`
- `Components/Routes.razor`
- `Components/_Imports.razor`
- `Components/Layout/NavMenu.razor`
- `Components/Layout/MainLayout.razor`
- `appsettings.json`
- `appsettings.Development.json`
Aktuelles Rollenmodell:
- `Security:AccessGroups` steuert Zugriff auf die App
- `Security:AdminGroups` steuert Admin-Berechtigung
- Default-Gruppen sind `TRAFAG\\TrafagSalesExporter-Users` und `TRAFAG\\TrafagSalesExporter-Admins`
- echte Gruppennamen muessen von der IT bestaetigt oder angepasst werden
Admin-geschuetzte Seiten:
- `Settings`
- `Standorte`
- `Transformations`
Dashboard, Management Cockpit und Logs bleiben fuer berechtigte angemeldete Benutzer sichtbar.
Development:
- `appsettings.Development.json` aktiviert bei `ASPNETCORE_ENVIRONMENT=Development` einen lokalen Development-Auth-Handler
- Default-User: `DEV\\TrafagDeveloper`
- `DevelopmentUserIsAdmin=true`, damit lokal weiter programmiert werden kann
- produktiv darf die App nicht mit `Development` laufen
IIS-/IT-Hinweise:
1. Windows Authentication aktivieren
2. Anonymous Authentication deaktivieren
3. `ASPNETCORE_ENVIRONMENT` produktiv nicht auf `Development` setzen
4. AD-Gruppen fuer Benutzer und Admins anlegen oder bestehende Gruppen eintragen
5. `Security:AccessGroups` und `Security:AdminGroups` in produktiver Konfiguration korrekt setzen
Aktueller IIS-Deployment-Nachtrag 2026-05-20:
- Vollstaendige Detaildoku: `docs/DEPLOYMENT_IIS_HANDOFF_2026-05-19.md`
- Fuehrendes Projekt bleibt `TrafagSalesExporter`.
- Publish-Ausgabe heisst fuer IIS weiterhin `BiDashboard.dll`, ohne EXE/AppHost.
- Publish-Ziel: `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\`
- Browser-URL: `https://trch-webapp-bidashboard.trafagch.local/BiDashboard/`
- `diag.txt` unter `/BiDashboard/diag.txt` ist erreichbar und beweist, dass IIS auf den richtigen Publish-Ordner zeigt.
- Der verbleibende `500` entsteht beim ASP.NET-Core-Start oder im ASP.NET-Core-IIS-Modul.
- `web.config` steht aktuell auf `hostingModel="outofprocess"`, `stdoutLogEnabled="true"` und `ASPNETCORE_DETAILEDERRORS=true`.
- Wenn `logs` leer bleibt, muss der Serveradmin im Event Viewer pruefen: `IIS AspNetCore Module V2`, `.NET Runtime`, `Application Error`.
- Server muss kein Microsoft Excel installiert haben; XLSX wird ueber ClosedXML/OpenXML gelesen.
Verifikation:
```text
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich
- `48/48` Tests gruen
- Auth-Policy-Tests fuer AccessGroup, AdminGroup und Development-Admin vorhanden
- lokaler Development-Auth-Start geprueft: `http://localhost:55416` antwortet mit HTTP `200`
- bekannte MudBlazor-Analyzer-Warnungen zu `Dense` bleiben
## H170 - Nachtrag 2026-04-29 Management-Cockpit-Auswertung
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-29 Management-Cockpit-Auswertung
Seit dem letzten dokumentierten Stand vom 2026-04-17 wurde das `Management Cockpit` weiter ausgebaut. Dieser Abschnitt rekonstruiert den aktuellen Stand aus dem Code, weil die Aenderungen nach einem PC-Absturz nicht direkt nachdokumentiert wurden.
## H171 - Neue Auswertlogik
Quelle: HANDOFF_2026-04-15.md.raw
### Neue Auswertlogik
Das Cockpit ist nicht mehr nur auf Umsatz als feste Kennzahl beschraenkt.
Neu gibt es auswählbare Summenfelder:
- `Sales Price/Value`
- `Quantity`
- `Standard cost`
- `Quantity * Standard cost`
Diese Auswahl gilt fuer:
- dateibasierte Analyse vorhandener Excel-Exporte
- zentrale Roh-Auswertung aus `CentralSalesRecords`
## H172 - Anzeige-Waehrung und Wechselkurse
Quelle: HANDOFF_2026-04-15.md.raw
### Anzeige-Waehrung und Wechselkurse
Fuer betragliche Summenfelder kann jetzt eine Anzeige-Waehrung gewaehlt werden:
- `EUR`
- `USD`
- `Original`
Die Umrechnung nutzt `CurrencyExchangeRateService`.
Wichtig:
- nicht-betragliche Werte wie `Quantity` werden nicht umgerechnet
- bei `Original` bleiben Werte in der jeweiligen Quellwaehrung
- bei fehlendem Wechselkurs wird der betroffene Wert mit `0` in die Zielwaehrung eingerechnet
- fehlende Kurse werden als Anzahl `Nicht umgerechnet` bzw. in Hinweisen/Finding sichtbar gemacht
- Wechselkurse werden pro Quellwaehrung, Zielwaehrung und Datum gecacht, damit grosse Auswertungen nicht unnoetig oft die gleiche Rate aufloesen
## H173 - Zusätzliche Summenfelder in der zentralen Sicht
Quelle: HANDOFF_2026-04-15.md.raw
### Zusätzliche Summenfelder in der zentralen Sicht
Die zentrale Roh-Auswertung kann neben dem Haupt-Summenfeld weitere Summenfelder anzeigen.
Diese Zusatzwerte werden aktuell in den Zeitreihen ausgegeben:
- Jahreswerte
- Monatswerte
- Tageswerte im gewaehlten Monat
Beispiel:
- Hauptwert: `Sales Price/Value`
- Zusatzwerte: `Quantity`, `Quantity * Standard cost`
Damit kann die zentrale Sicht Umsatz, Mengen und Kostennaeherung nebeneinander darstellen.
## H174 - UI-Stand
Quelle: HANDOFF_2026-04-15.md.raw
### UI-Stand
`Components/Pages/ManagementCockpit.razor` hat neue Controls:
- Summenfeld fuer Excel-Dateianalyse
- Anzeige-Waehrung fuer Excel-Dateianalyse
- Summenfeld fuer zentrale Roh-Auswertung
- weitere Summenfelder fuer zentrale Roh-Auswertung per Mehrfachauswahl
- Anzeige-Waehrung fuer zentrale Roh-Auswertung
Die Tabellen wurden von festem Text `Umsatz` auf generische `Werte` / `Jahreswerte` / `Monatswerte` umgestellt.
Die vorher dokumentierte Manometer-/Gauge-Sicht ist im aktuellen Arbeitsstand nicht mehr aktiv sichtbar. Stattdessen liegt der Fokus wieder auf Kennzahlen, Hinweisen und tabellarischen Auswertungen.
## H175 - Technische Umsetzung
Quelle: HANDOFF_2026-04-15.md.raw
### Technische Umsetzung
Betroffene Dateien:
- `Components/Pages/ManagementCockpit.razor`
- `Models/ManagementCockpitModels.cs`
- `Services/IManagementCockpitService.cs`
- `Services/ManagementCockpitPageService.cs`
- `Services/ManagementCockpitService.cs`
- `TrafagSalesExporter.Tests/ManagementCockpitServiceTests.cs`
Neue bzw. erweiterte Modelle:
- `ManagementCockpitValueFieldKeys`
- `ManagementCockpitCurrencyOptions`
- `ManagementCockpitValueFieldOption`
- `ManagementCockpitAnalysisOptions`
- `ManagementCockpitAggregatedFieldValue`
Neue Felder in Ergebnissen:
- gewaehltes Summenfeld
- Anzeige-Waehrung
- Anzahl fehlender Wechselkurse
- Zusatzwerte pro Zeitreihe
## H176 - Testabdeckung
Quelle: HANDOFF_2026-04-15.md.raw
### Testabdeckung
Die `ManagementCockpitServiceTests` wurden erweitert um Tests fuer:
- Umrechnung zentraler Werte in EUR
- Caching von Wechselkursauflösungen
- Mengen-Summe ohne Waehrungsumrechnung
- Zusatz-Summenfelder in Jahres- und Monatswerten
Noch offen:
- UI manuell pruefen
- genaue fachliche Zielwaehrung fuer Standardberichte bestaetigen
- entscheiden, ob `CHF` ebenfalls als direkte Anzeige-Waehrung angeboten werden soll
- klaeren, ob fehlende Wechselkurse langfristig mit `0`, Originalwert oder separater Fehlergruppe dargestellt werden sollen
## H177 - Nachtrag 2026-04-17 Refactoring- und HANA-Stand
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-17 Refactoring- und HANA-Stand
Der Stand aus den frueheren Nachtraegen ist fuer Architektur und HANA-Zugriff nicht mehr vollstaendig.
Inzwischen gilt zusaetzlich:
## H178 - 1. DataSourceAdapter-Pattern ist eingefuehrt
Quelle: HANDOFF_2026-04-15.md.raw
### 1. DataSourceAdapter-Pattern ist eingefuehrt
Die Quellsysteme `HANA`, `SAP_GATEWAY` und `MANUAL_EXCEL` laufen nicht mehr ueber einen grossen `if/else`-Block im `SiteExportService`.
Neu:
- `Services/DataSources/IDataSourceAdapter.cs`
- `Services/DataSources/IDataSourceAdapterResolver.cs`
- `Services/DataSources/DataSourceAdapterResolver.cs`
- `Services/DataSources/DataSourceFetchContext.cs`
- `Services/DataSources/DataSourceFetchResult.cs`
- `Services/DataSources/DataSourceCredentials.cs`
- `Services/DataSources/HanaDataSourceAdapter.cs`
- `Services/DataSources/SapGatewayDataSourceAdapter.cs`
- `Services/DataSources/ManualExcelDataSourceAdapter.cs`
Neuer Zuschnitt:
- `SiteExportService` ist jetzt deutlich schlanker und nur noch Export-Pipeline
- Adapter loesen Quellsystem-spezifisches Laden auf
- fuer ein weiteres Quellsystem ist kein Umbau im `SiteExportService` mehr noetig
## H179 - 2. Page-Services sind nicht mehr Singleton
Quelle: HANDOFF_2026-04-15.md.raw
### 2. Page-Services sind nicht mehr Singleton
UI-nahe Services laufen jetzt pro Blazor-Circuit als `Scoped`.
Betroffen:
- `ISettingsPageService`
- `IStandortePageService`
- `IStandorteSapEditorService`
- `IManagementCockpitPageService`
- `IDashboardPageService`
- `ILogsPageService`
- `ITransformationsPageService`
Wichtig:
- `ExportOrchestrationService` bleibt bewusst `Singleton`, weil Exportstatus ueber Circuits geteilt werden muss
- stateless Infrastruktur-Services bleiben weiter `Singleton`
## H180 - 3. Datenbank-Initialisierung ist aufgeteilt
Quelle: HANDOFF_2026-04-15.md.raw
### 3. Datenbank-Initialisierung ist aufgeteilt
Der fruehere monolithische `DatabaseInitializationService` ist inzwischen in grobe Verantwortungsbloecke getrennt:
- `DatabaseInitializationService` als Orchestrator
- `DatabaseSchemaMaintenanceService` fuer Schema-/Repair-Logik
- `DatabaseSeedService` fuer Defaultdaten und Stammdaten-Seeding
- `DatabaseInitializationService.SchemaSql.cs` als SQL-Definitionsblock
Das reduziert das groesste Architektur-Risiko deutlich, auch wenn die Startmigrationen weiterhin ein sensibler Teil des Systems bleiben.
## H181 - 4. Weitere Razor-Seiten sind entlastet
Quelle: HANDOFF_2026-04-15.md.raw
### 4. Weitere Razor-Seiten sind entlastet
Neben den frueher bereits entlasteten Seiten laufen jetzt auch diese Seiten ueber Page-Services statt direkten `DbContext`-Zugriffen:
- `Dashboard.razor` ueber `DashboardPageService`
- `Logs.razor` ueber `LogsPageService`
- `Transformations.razor` ueber `TransformationsPageService`
Der Rest an direkter Persistenzlogik in Razor ist damit deutlich kleiner geworden.
## H182 - 5. Kritische HANA-Risiken wurden entschärft
Quelle: HANDOFF_2026-04-15.md.raw
### 5. Kritische HANA-Risiken wurden entschärft
## H183 - SQL-Injection-Schutz
Quelle: HANDOFF_2026-04-15.md.raw
#### SQL-Injection-Schutz
Im `HanaQueryService` wurden die kritischen interpolierten SQL-Stellen bereinigt:
- `tsc` und `dateFilter` laufen jetzt parametriert in `HanaCommand`
- `schema` wird als Identifier streng validiert und gequotet
Damit ist der akute Injection-Pfad in den HANA-Verkaufsabfragen geschlossen.
## H184 - Async statt `.GetAwaiter().GetResult()`
Quelle: HANDOFF_2026-04-15.md.raw
#### Async statt `.GetAwaiter().GetResult()`
Die blockierenden HANA-Aufrufe wurden auf echte Async-Methoden umgestellt:
- `IHanaQueryService` ist jetzt async-basiert
- `HanaQueryService` nutzt `OpenAsync`, `ExecuteReaderAsync`, `ReadAsync`, `ExecuteScalarAsync`
- Aufrufer wie `HanaDataSourceAdapter`, `StandortePageService` und `SettingsPageService` verwenden keine `Task.Run`-Workarounds mehr fuer HANA
Damit ist das fruehere Deadlock-/Blocking-Risiko in diesem Pfad deutlich reduziert.
## H185 - 6. Test- und Build-Stand
Quelle: HANDOFF_2026-04-15.md.raw
### 6. Test- und Build-Stand
Verifiziert wurde zuletzt mit:
```text
dotnet build .\TrafagSalesExporter.csproj --verbosity minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Projekt-Build erfolgreich
- `36/36` Tests gruen
Bekannt:
- `dotnet build .\TrafagSalesExporter.sln` endet in dieser Umgebung weiterhin mit Exitcode `1` ohne konkrete Compilerfehler
- das Hauptprojekt und das Testprojekt bauen aber erfolgreich
- bekannte Warnungen bleiben:
- `MSB3270` wegen HANA-Assembly-Architektur
- MudBlazor-Analyzer zu `Dense`
## H186 - 7. Aktuelles Architektururteil
Quelle: HANDOFF_2026-04-15.md.raw
### 7. Aktuelles Architektururteil
Der Zustand ist jetzt deutlich professioneller als zu Beginn des Refactorings:
- Datenquellen sauberer getrennt
- UI konsistenter ueber Page-Services geschnitten
- groesster Start-/Schema-Block zerlegt
- HANA-Pfad sicherer und sauberer asynchron
Aber noch nicht vollendet:
- keine gezielten Adapter-/Resolver-Unit-Tests
- keine Retry-Strategie fuer SharePoint / SAP / HANA-Netzpfade
- kein Secret-Store
- `DatabaseInitializationService` bleibt trotz Zerlegung ein sensibler produktiver Migrationspfad
## H187 - Nachtrag 2026-04-17
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-17
Der dokumentierte Stand in diesem Handoff war bei der Waehrungslogik nicht mehr aktuell.
Inzwischen gilt:
- Kurstabellen fuer `CurrencyExchangeRates` sind im System vorhanden
- `Settings` enthaelt bereits eine Pflegeoberflaeche fuer Wechselkurse
- `ExchangeRateImportService` importiert ECB-Tageskurse nach `CurrencyExchangeRates`
- `NormalizeCurrencyCode` ist als Value-Transformation vorhanden
- `ConvertCurrency` ist als Record-Transformation vorhanden
- `Program.cs` registriert beide Strategien sowie `CurrencyExchangeRateService` und `ExchangeRateImportService`
Wichtig:
- die Roh-Auswertung im `Management Cockpit` rechnet Stand heute weiterhin bewusst **nicht** in CHF um
- dort bleibt der Umsatz weiterhin in `Sales Currency`
- die Waehrungsumrechnung ist aktuell Teil des allgemeinen Transformations-/Mapping-Systems, nicht der Cockpit-Rohsicht
Zusatzlich wurden am 2026-04-17 fehlende Unit-Tests fuer die Waehrungslogik nachgezogen:
- `CurrencyExchangeRateServiceTests`
- `ExchangeRateImportServiceTests`
- Erweiterungen in
- `TransformationStrategiesTests`
- `RecordTransformationServiceTests`
- `TransformationCatalogTests`
Aktueller Teststatus nach diesem Nachtrag:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- erfolgreich
- `31/31` Tests gruen
- bekannte Warnung bleibt:
- SAP HANA Architekturwarnung `MSB3270`
## H188 - Architekturpruefung 2026-04-17
Quelle: HANDOFF_2026-04-15.md.raw
## Architekturpruefung 2026-04-17
Es wurde eine erneute Gesamtpruefung der Architektur gemacht, ausdruecklich ohne neue Implementierung.
## H189 - Gesamturteil
Quelle: HANDOFF_2026-04-15.md.raw
### Gesamturteil
Die Grundrichtung ist weiterhin sinnvoll:
- klare Trennung der Quellsysteme `SAP`, `BI1`, `SAGE`, `MANUAL_EXCEL`
- zentrales fachliches Zielschema ueber `SalesRecord`
- zentrale technische Ablage ueber `CentralSalesRecords`
- separater Orchestrator fuer Standort- und Konsolidierungsexport
- Transformationssystem als eigener Layer
Aber:
- die Architektur ist **noch nicht stabil genug**, um sie als "fertig sauber" zu betrachten
- die groessten Risiken liegen aktuell nicht in SAP oder Waehrungen, sondern in
- Start-/Schema-Initialisierung
- Config-Import
- Verteilung von Logik zwischen Razor-Seiten und Services
## H190 - Wichtigste Architektur-Risiken
Quelle: HANDOFF_2026-04-15.md.raw
### Wichtigste Architektur-Risiken
## H191 - 1. Start-/Schema-Initialisierung ist fragil
Quelle: HANDOFF_2026-04-15.md.raw
#### 1. Start-/Schema-Initialisierung ist fragil
`DatabaseInitializationService` mischt derzeit:
- `EnsureCreated`
- manuelle `ALTER TABLE`-Pflege
- FK-Reparaturlogik
- Seeding
- empfohlenes Regel-Seeding
Das ist funktional hilfreich, aber architektonisch gefaehrlich, weil:
- die App-Initialisierung dadurch viel implizite Datenmigration enthaelt
- Verhalten schwer vorhersehbar wird
- Fehler im Migrationspfad sofort produktive Daten treffen
Wichtiger konkreter Befund aus der Pruefung:
- beim Kopieren von `Sites_old` nach `Sites` ist die Spaltenreihenfolge im SQL inkonsistent
- dadurch koennen Werte wie `ManualImportFilePath`, `SapServiceUrl`, `SapEntitySet` verschoben gespeichert werden
- das ist eine reale Datenkorruptionsgefahr und kein reines Architekturthema
## H192 - 2. Config-Import ist destruktiv und nicht atomar
Quelle: HANDOFF_2026-04-15.md.raw
### 2. Config-Import ist destruktiv und nicht atomar
`ConfigTransferService.ImportJsonAsync` loescht aktuell zuerst grosse Teile der Konfiguration und Daten:
- Sites
- HanaServers
- Transformation Rules
- SAP-Konfiguration
- Wechselkurse
- sogar `CentralSalesRecords`
und baut danach mit mehreren `SaveChangesAsync()`-Zwischenschritten neu auf.
Risiko:
- wenn der Import in der Mitte scheitert, bleibt das System teilweise geloescht zurueck
- `CentralSalesRecords` gehoeren fachlich ohnehin nicht sauber in einen normalen Config-Import
## H193 - 3. Zu viel Fach- und Persistenzlogik in Razor-Seiten
Quelle: HANDOFF_2026-04-15.md.raw
### 3. Zu viel Fach- und Persistenzlogik in Razor-Seiten
`Settings.razor` und `Standorte.razor` machen aktuell sehr viel direkt:
- `DbContext` oeffnen
- Daten laden und speichern
- Konfigurationsimport/-export anstossen
- SAP-Refresh
- Upload-Handling
- Teile der Validierung / Persistenzlogik
Das funktioniert momentan, fuehrt aber langfristig zu:
- schwer testbarer UI-Logik
- verstreuten Regeln
- hoeherem Seiteneffekt-Risiko bei Erweiterungen
## H194 - 4. Vertrag zwischen Orchestrator und konsolidiertem Export ist unscharf
Quelle: HANDOFF_2026-04-15.md.raw
### 4. Vertrag zwischen Orchestrator und konsolidiertem Export ist unscharf
`ExportOrchestrationService` sammelt bei `ExportAllAsync` bereits `consolidatedRecords`, uebergibt sie weiter, aber `ConsolidatedExportService` ignoriert diesen Parameter und liest erneut aus `CentralSalesRecords`.
Das zeigt ein offenes Architekturthema:
- Soll die zentrale Datei aus dem Live-Exportlauf gebaut werden?
- oder immer nur aus dem persistenten Read Model `CentralSalesRecords`?
Aktuell ist beides halb vorhanden.
## H195 - 5. Reporting-/Cockpit-Logik ist noch nicht voll verallgemeinert
Quelle: HANDOFF_2026-04-15.md.raw
### 5. Reporting-/Cockpit-Logik ist noch nicht voll verallgemeinert
Bei der Pruefung wurde gesehen:
- `ManagementCockpitService` enthaelt noch hartcodierte Jahreslogik fuer `2025` und `2026`
- die Rohsicht bleibt bewusst ohne CHF-Umrechnung
Das ist fuer den aktuellen Stand akzeptabel, zeigt aber:
- Reporting ist noch kein voll abstrahierter fachlicher Layer
## H196 - Empfohlenes Sollbild
Quelle: HANDOFF_2026-04-15.md.raw
## Empfohlenes Sollbild
Die naechste Architektur-Stufe sollte in diese Richtung gehen:
## H197 - 1. Klare Schichten
Quelle: HANDOFF_2026-04-15.md.raw
### 1. Klare Schichten
- UI:
- Razor nur fuer Interaktion, Anzeige, Formularzustand
- Application:
- Use Cases / Commands / Queries fuer Export, Config, SAP-Refresh, Wechselkurse, Standortpflege
- Domain / Fachlogik:
- Transformationen, Mappingregeln, Waehrungsumrechnung, Cockpit-Berechnungen
- Infrastructure:
- HANA, SAP Gateway, SQLite, SharePoint, Dateisystem
## H198 - 2. Versionierte Migrationen statt manueller Start-Reparaturen
Quelle: HANDOFF_2026-04-15.md.raw
### 2. Versionierte Migrationen statt manueller Start-Reparaturen
Statt immer mehr Reparaturlogik beim App-Start:
- Schema-Aenderungen versionieren
- Migrationspfade testbar machen
- Startlogik nur noch fuer minimale Bootstrap-Aufgaben behalten
## H199 - 3. Config-Import als atomarer Vorgang
Quelle: HANDOFF_2026-04-15.md.raw
### 3. Config-Import als atomarer Vorgang
Ziel:
- alles in einer Transaktion oder bewusst in klar getrennten Phasen
- kein halb geloeschter Zustand bei Fehlern
- `CentralSalesRecords` aus normalem Config-Import eher herausnehmen
## H200 - 4. Zentrale Export-Semantik entscheiden
Quelle: HANDOFF_2026-04-15.md.raw
### 4. Zentrale Export-Semantik entscheiden
Explizit festlegen:
- zentrale Datei immer aus `CentralSalesRecords`
oder
- zentrale Datei aus dem aktuellen Export-Snapshot
Danach die doppelte Semantik entfernen.
## H201 - Priorisierung aus Architektursicht
Quelle: HANDOFF_2026-04-15.md.raw
## Priorisierung aus Architektursicht
Wenn nach Stabilitaet priorisiert wird, dann in dieser Reihenfolge:
1. `DatabaseInitializationService` / Migrationspfad absichern
2. `ConfigTransferService.ImportJsonAsync` atomar und weniger destruktiv machen
3. Logik aus `Settings.razor` und `Standorte.razor` in Anwendungsservices verschieben
4. Export-Semantik fuer Konsolidierung vereinheitlichen
5. erst danach weitere Fachfeatures wie Cockpit-CHF, Budget, Gruppenlogik
## H202 - Kurzfazit
Quelle: HANDOFF_2026-04-15.md.raw
## Kurzfazit
Die Architektur ist nicht schlecht. Das Grundmodell traegt.
Aber:
- sie ist noch nicht robust genug fuer ruhigen weiteren Ausbau ohne technische Konsolidierung
- die aktuelle Hauptgefahr liegt in Infrastruktur- und Persistenzlogik, nicht in den Fachfeatures
Fuer den naechsten Einstieg nach Absturz gilt daher:
1. zuerst diesen Architektur-Nachtrag lesen
2. dann `DatabaseInitializationService` und `ConfigTransferService` als Risikobloecke ansehen
3. neue Fachfeatures erst nach dieser technischen Konsolidierung beginnen
## H203 - Nachtrag HANA-/Standort-Workflow 2026-04-17
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag HANA-/Standort-Workflow 2026-04-17
Nach der Architekturpruefung wurde der doppelte HANA-Workflow bereinigt.
## H204 - Altes Problem
Quelle: HANDOFF_2026-04-15.md.raw
### Altes Problem
Vorher gab es zwei konkurrierende Stellen fuer HANA-Konfiguration:
- oben eine eigene `HANA Server`-Verwaltung
- unten im Standortdialog noch einmal eine fast vollstaendige HANA-Verbindung
Dadurch war unklar:
- was die zentrale Wahrheit ist
- wann ein zentraler Server geaendert wird
- wann still ein separater Server pro Standort entsteht
## H205 - Neue Logik
Quelle: HANDOFF_2026-04-15.md.raw
### Neue Logik
Oben gilt jetzt:
- `HANA Server` ist zentrale HANA-Konfiguration pro Quellsystem
- aktuell relevant fuer:
- `BI1`
- `SAGE`
Unten im Standort gilt jetzt:
- Standort pflegt nur noch standortspezifische Daten
- `Schema`
- `TSC`
- `Land`
- `SourceSystem`
- optionale Username-/Password-Overrides
- die technische HANA-Verbindung kommt aus der zentralen Konfiguration des Quellsystems
## H206 - Technische Umsetzung
Quelle: HANDOFF_2026-04-15.md.raw
### Technische Umsetzung
- `HanaServer` hat jetzt zusaetzlich `SourceSystem`
- `DatabaseInitializationService` stellt zentrale Eintraege fuer `BI1` und `SAGE` sicher
- bestehende verknuepfte HANA-Server werden dabei moeglichst auf `BI1` / `SAGE` gemappt
- `SiteExportService` baut HANA-Verbindungen jetzt aus der zentralen HANA-Konfiguration des Quellsystems
- `Settings.razor` testet BI1/SAGE nicht mehr ueber einen Beispiel-Standort, sondern ueber die zentrale HANA-Konfiguration
- `Standorte.razor` speichert im Standort fuer HANA-basierte Systeme keine eigene Vollverbindung mehr
## H207 - Wichtige Konsequenz
Quelle: HANDOFF_2026-04-15.md.raw
### Wichtige Konsequenz
Fachlich gilt jetzt:
- oben = Standardkonfiguration pro Quellsystem
- unten = Standort + optionale Credential-Overrides
Das entspricht der gewuenschten Logik:
- gleiche BI1-/SAGE-Standorte koennen zentrale Verbindungswerte teilen
- Ausnahmen koennen weiter ueber Username-/Password-Overrides reagieren
## H208 - UI-Nachtrag
Quelle: HANDOFF_2026-04-15.md.raw
### UI-Nachtrag
Die frueher doppelte und dadurch verwirrende UI wurde danach auch sichtbar bereinigt.
Aktueller UI-Stand:
- oben heisst der Bereich jetzt klar `Zentrale HANA-Konfiguration`
- im Standortdialog gibt es fuer HANA keine zweite technische Eingabestrecke mehr
- dort wird nur noch die aktive Zentralverbindung angezeigt
- Host, Port, SSL und technische Parameter werden explizit nach oben verwiesen
- der zentrale Verbindungstest in `Settings.razor` meldet jetzt sauber die zentrale HANA-Verbindung
## H209 - Nachtrag Quellsystem-Verwaltung 2026-04-17
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag Quellsystem-Verwaltung 2026-04-17
Die bisher noch hart codierten Quellsystem-Listen wurden entfernt und durch echte Stammdaten ersetzt.
## H210 - Neuer Stand
Quelle: HANDOFF_2026-04-15.md.raw
### Neuer Stand
- neues Modell `SourceSystemDefinition`
- Quellsysteme werden jetzt zentral in der DB gehalten statt in Razor-Arrays
- pro Quellsystem werden gepflegt:
- `Code`
- `DisplayName`
- `ConnectionKind`
- `IsActive`
- `CentralUsername`
- `CentralPassword`
## H211 - Neue GUI-Logik
Quelle: HANDOFF_2026-04-15.md.raw
### Neue GUI-Logik
- `Settings.razor` enthaelt jetzt eine pflegbare Quellsystem-Tabelle
- dort koennen Quellsysteme per GUI angelegt, bearbeitet und gespeichert werden
- Anschlussart ist nicht mehr implizit im Code, sondern pro Quellsystem konfigurierbar
- zentrale Zugangsdaten haengen jetzt am Quellsystem selbst
## H212 - Anschlussarten
Quelle: HANDOFF_2026-04-15.md.raw
### Anschlussarten
Aktuell technisch vorgesehen:
- `HANA`
- `SAP_GATEWAY`
- `MANUAL_EXCEL`
Damit gilt:
- HANA-Konfiguration oben in `Standorte.razor` nur noch fuer Quellsysteme mit Anschlussart `HANA`
- Standort-Dropdown zieht seine Quellsysteme jetzt aus `SourceSystemDefinitions`
- Transformationsregeln ziehen ihre Quellsystem-Auswahl ebenfalls aus `SourceSystemDefinitions`
## H213 - Technische Umsetzung
Quelle: HANDOFF_2026-04-15.md.raw
### Technische Umsetzung
- `AppDbContext` hat jetzt `DbSet<SourceSystemDefinition>`
- `DatabaseInitializationService` erzeugt und seedet `SourceSystemDefinitions`
- `SiteExportService` loest zentrale Credentials jetzt ueber `SourceSystemDefinition`
- `ConfigTransferService` exportiert/importiert jetzt auch `SourceSystemDefinitions`
## H214 - Verifikation
Quelle: HANDOFF_2026-04-15.md.raw
### Verifikation
Nach dieser Umstellung geprueft:
```text
dotnet build .\TrafagSalesExporter.csproj -v minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich
- `31/31` Tests gruen
## H215 - Bereinigung der Legacy-Credentials
Quelle: HANDOFF_2026-04-15.md.raw
### Bereinigung der Legacy-Credentials
Danach wurden auch die alten zentralen Credential-Felder technisch bereinigt.
Aktueller Stand:
- `ExportSettings` enthaelt keine alten Felder mehr fuer `SapUsername`, `Bi1Username`, `SageUsername` usw.
- der Config-Export schreibt zentrale Zugangsdaten nur noch ueber `SourceSystemDefinitions`
- `ConfigTransferService` hat keinen aktiven Legacy-Credential-Pfad mehr
- die fruehere Temp-Datei `standorte_numbered.tmp` wurde entfernt
Wichtig:
- bestehende DB-Spalten koennen physisch noch vorhanden sein, sind aber kein aktiver Codepfad mehr
- fuehrende Wahrheit fuer zentrale Zugangsdaten ist jetzt ausschliesslich `SourceSystemDefinition`
## H216 - Schema-Bereinigung
Quelle: HANDOFF_2026-04-15.md.raw
### Schema-Bereinigung
Danach wurde auch die SQLite-Schemabereinigung nachgezogen.
Aktueller Stand:
- `DatabaseInitializationService` erkennt alte Credential-Spalten in `ExportSettings`
- wenn diese Legacy-Spalten noch existieren, wird `ExportSettings` beim Start auf das neue Schema rekonstruiert
- erhalten bleiben nur die noch gueltigen Felder:
- `DateFilter`
- `TimerHour`
- `TimerMinute`
- `TimerEnabled`
- `DebugLoggingEnabled`
- `LocalSiteExportFolder`
- `LocalConsolidatedExportFolder`
Damit gilt jetzt:
- alte zentrale SAP/BI1/SAGE-Credentials sind nicht nur logisch entfernt
- sie werden bei bestehender DB auch aktiv aus dem `ExportSettings`-Schema entfernt
## H217 - Letzte Bereinigung HANA-Credentials
Quelle: HANDOFF_2026-04-15.md.raw
### Letzte Bereinigung HANA-Credentials
Danach wurde auch die letzte doppelte Credential-Stelle in der HANA-Verwaltung entfernt.
Aktueller Stand:
- zentrale HANA-Konfiguration speichert nur noch technische Verbindungsdaten
- `Host`
- `Port`
- `DatabaseName`
- `UseSsl`
- `ValidateCertificate`
- `AdditionalParams`
- Username/Password werden nicht mehr in der zentralen HANA-UI gepflegt
- HANA-Verbindungstests in `Standorte.razor` verwenden jetzt die zentralen Credentials aus `SourceSystemDefinition`
- `SiteExportService` faellt bei HANA nicht mehr auf in `HanaServer` gespeicherte Credentials zurueck
- `ConfigTransferService` exportiert/importiert fuer `HanaServer` keine Username-/Password-Werte mehr
- `DatabaseInitializationService` bereinigt bei bestehender DB auch das `HanaServers`-Schema und entfernt die Altspalten `Username` / `Password`
Die fachliche Reihenfolge ist jetzt eindeutig:
1. zentrale Credentials aus `SourceSystemDefinition`
2. optionale Override-Credentials am `Site`
3. technische HANA-Verbindung aus der zentralen HANA-Konfiguration
## H218 - EF-/SQLite-Fix
Quelle: HANDOFF_2026-04-15.md.raw
### EF-/SQLite-Fix
Beim ersten Lauf nach der Schema-Bereinigung trat noch ein Mapping-Fehler auf:
- `SQLite Error 1: 'no such column: h.Password'`
Ursache:
- `HanaServers`-Schema war bereits ohne `Username` / `Password`
- das EF-Modell `HanaServer` hat diese Properties aber noch als normale Spalten behandelt
Fix:
- `HanaServer.Username` und `HanaServer.Password` sind jetzt `[NotMapped]`
- damit bleiben sie fuer Laufzeit-Verbindungsaufbau und Tests nutzbar
- EF erwartet sie aber nicht mehr als Datenbankspalten
## H219 - Nachtrag Zentrale SAP-Steuerung 2026-04-17
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag Zentrale SAP-Steuerung 2026-04-17
Der verbleibende Architekturbruch bei SAP wurde ebenfalls bereinigt.
## H220 - Neuer Stand
Quelle: HANDOFF_2026-04-15.md.raw
### Neuer Stand
- `SourceSystemDefinition` enthaelt jetzt auch `CentralServiceUrl`
- zentrale SAP-Service-URL wird damit am Quellsystem gepflegt, nicht mehr primaer am Standort
- `Standorte.razor` behandelt `SapServiceUrl` jetzt als Override
- wenn kein Override gesetzt ist, zieht SAP die URL zentral aus dem Quellsystem
## H221 - UI
Quelle: HANDOFF_2026-04-15.md.raw
### UI
- `Settings.razor` hat fuer Quellsysteme jetzt eine Dialogbearbeitung statt nur Inline-Tabellenfelder
- dadurch ist das Quellsystem sauber editierbar
- fuer `SAP_GATEWAY` wird dort die zentrale SAP-Service-URL gepflegt
- `Standorte.razor` zeigt bei SAP jetzt:
- zentrale SAP Service URL
- optionales `SAP Service URL Override`
## H222 - Laufzeitlogik
Quelle: HANDOFF_2026-04-15.md.raw
### Laufzeitlogik
- `SiteExportService` verwendet bei SAP die effektive URL aus
- Standort-Override
- sonst `SourceSystemDefinition.CentralServiceUrl`
- SAP-Verbindungstest in `Settings.razor` testet die zentrale URL direkt aus dem Quellsystem
- Dashboard zeigt fuer SAP jetzt ebenfalls die effektive zentrale bzw. ueberschriebene URL
## H223 - Verifikation
Quelle: HANDOFF_2026-04-15.md.raw
### Verifikation
Nach der Umstellung geprueft:
```text
dotnet build .\TrafagSalesExporter.csproj -v minimal
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal
```
Ergebnis:
- Build erfolgreich
- Tests erfolgreich
- `31/31` Tests gruen
## H224 - Nachtrag 2026-04-16
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-16
Seit dem letzten Handoff wurden weitere Funktionen umgesetzt, die unten im alten Stand noch nicht voll enthalten sind.
## H225 - Zielbild
Quelle: HANDOFF_2026-04-15.md.raw
## Zielbild
Die App wurde von einem reinen BI1/HANA-Exporter zu einer kombinierten Plattform erweitert:
- `BI1` und `SAGE` bleiben auf direktem HANA-Zugriff
- `SAP` laeuft separat ueber SAP Gateway / OData
- SAP-Quellen koennen gelesen, gejoint und auf das zentrale `SalesRecord`-Schema gemappt werden
- Standort-Exporte werden lokal als Excel geschrieben
- zusaetzlich werden Datensaetze in eine zentrale SQLite-Tabelle geschrieben
- ein konsolidierter Export liest aus dieser zentralen Tabelle
## H226 - Wichtigste umgesetzte Funktionen
Quelle: HANDOFF_2026-04-15.md.raw
## Wichtigste umgesetzte Funktionen
## H227 - 1. Zentrale Credentials pro Quellsystem
Quelle: HANDOFF_2026-04-15.md.raw
### 1. Zentrale Credentials pro Quellsystem
Es gibt zentrale Zugangsdaten in `ExportSettings` fuer:
- `SAP`
- `BI1`
- `SAGE`
Zusaetzlich gibt es pro Standort optionale Overrides:
- `UsernameOverride`
- `PasswordOverride`
Aufloesungsreihenfolge:
1. Standort-Override
2. zentrale Credentials des Quellsystems
3. bei HANA zusaetzlich Fallback auf alten `HanaServer.Username/Password`
## H228 - 2. SAP von BI1/HANA getrennt
Quelle: HANDOFF_2026-04-15.md.raw
### 2. SAP von BI1/HANA getrennt
`SAP` nutzt nicht mehr den HANA-Pfad, sondern eine eigene Gateway/OData-Strecke.
Pro SAP-Standort gibt es:
- `SapServiceUrl`
- `SapEntitySet`
- `SapEntitySetsCache`
- `SapEntitySetsRefreshedAtUtc`
Refresh der SAP-Quellen erfolgt nur auf Knopfdruck.
Beispiel Service URL:
```text
http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/
```
Wichtig:
- Service URL immer nur bis zum Service
- Entity Set separat auswaehlen
## H229 - 3. SAP-Quellen, Joins und Feldmappings
Quelle: HANDOFF_2026-04-15.md.raw
### 3. SAP-Quellen, Joins und Feldmappings
Fuer SAP gibt es mehrere neue Modelle:
- `SapSourceDefinition`
- `SapJoinDefinition`
- `SapFieldMapping`
Unterstuetzt wird:
- mehrere SAP-Quellen pro Standort
- Alias pro Quelle
- Primaerquelle
- Join-Definitionen
- Mapping von `Alias.Feldname` auf zentrales Schema
UI-Erweiterungen:
- `Quellen refreshen`
- `Felder aus Quellen laden`
- Join-Key-Auswahl aus Metadaten
- `Auto-Match` fuer gleiche Feldnamen zwischen Primaerquelle und anderen Quellen
## H230 - 4. Zentrale Datenspeicherung
Quelle: HANDOFF_2026-04-15.md.raw
### 4. Zentrale Datenspeicherung
Neue Tabelle:
- `CentralSalesRecords`
Verwendung:
- pro Standort werden alte zentrale Saetze dieses Standorts ersetzt
- konsolidierte Excel liest aus `CentralSalesRecords`
Wichtig:
- zentrale Excel wird nicht appendet
- sie wird aus dem aktuellen Zustand der zentralen Tabelle neu erstellt
## H231 - 5. Exportpfade
Quelle: HANDOFF_2026-04-15.md.raw
### 5. Exportpfade
Neue Konfigurationsmoeglichkeiten:
Zentral in `Settings`:
- `LocalSiteExportFolder`
- `LocalConsolidatedExportFolder`
Pro Standort:
- `LocalExportFolderOverride`
Fallback wenn leer:
```text
./output
```
relativ zum App-Verzeichnis.
## H232 - 6. SharePoint
Quelle: HANDOFF_2026-04-15.md.raw
### 6. SharePoint
SharePoint-Upload ist optional.
Wenn keine vollstaendige SharePoint-Konfiguration vorhanden ist:
- Excel wird trotzdem lokal erzeugt
- kein Upload nach SharePoint
Benoetigte SharePoint-Werte:
- `Tenant ID`
- `Client ID`
- `Client Secret`
Das sind Entra App Registration Werte, nicht normale Benutzer-Credentials.
## H233 - 7. Config Import/Export
Quelle: HANDOFF_2026-04-15.md.raw
### 7. Config Import/Export
Es gibt JSON-Import/Export der Konfiguration mit Checkbox:
- mit Secrets
- ohne Secrets
Enthalten sind u. a.:
- SharePoint Config
- ExportSettings
- HanaServers
- Sites
- Transformation Rules
- SAP-Quellen
- SAP-Joins
- SAP-Mappings
## H234 - 8. Logging und Live-Status
Quelle: HANDOFF_2026-04-15.md.raw
### 8. Logging und Live-Status
Neue technische Logs ueber `AppEventLogs`.
Sichtbar:
- auf `/logs`
- im Dashboard als `Live-Status`
Geloggt werden u. a.:
- HANA-Query Start
- SAP Refresh
- SAP Reads
- Transformationen
- Excel-Erstellung
- zentrale Tabellenspeicherung
- Export erfolgreich / fehlgeschlagen
## H235 - 9. Excel oeffnen
Quelle: HANDOFF_2026-04-15.md.raw
### 9. Excel oeffnen
Im Dashboard gibt es neben `Export` den Button:
- `Excel oeffnen`
Dieser nutzt `ExportLogs.FilePath`.
Voraussetzungen:
- letzter Export erfolgreich
- `FilePath` gespeichert
- Datei existiert lokal
## H236 - 10. Management Cockpit
Quelle: HANDOFF_2026-04-15.md.raw
### 10. Management Cockpit
Es gibt einen neuen Menuepunkt:
- `Management Cockpit`
Funktion:
- Auswahl vorhandener Excel-Dateien
- Analyse einer exportierten Standort-Datei
- Kennzahlen fuer Geschaeftsinhaber / Management
Aktuell enthalten:
- Umsatz
- geschaetzte Kosten
- geschaetzte Marge
- Rechnungsanzahl
- Kundenanzahl
- Top Kunden
- Top Produktgruppen
- Top Sales Owner
- Datenqualitaetshinweise
- automatische Management-Aussagen
## H237 - 11. Manueller Excel-Import pro Standort
Quelle: HANDOFF_2026-04-15.md.raw
### 11. Manueller Excel-Import pro Standort
Es gibt jetzt einen vierten `SourceSystem`-Typ:
- `MANUAL_EXCEL`
Gedanke:
- Standort ohne Netz-/Systemanbindung liefert nur Excel
- Datei wird im Standort hochgeladen
- Export liest diese Datei statt SAP/HANA
- Daten werden in `CentralSalesRecords` fuer diesen Standort ersetzt
- der zentrale Export liest weiter nur aus `CentralSalesRecords`
Neue Site-Felder:
- `ManualImportFilePath`
- `ManualImportLastUploadedAtUtc`
Wichtig:
- das ist kein Excel-zu-Excel-Merge
- die App importiert ins zentrale Schema und erzeugt danach die zentrale Datei neu
## H238 - 12. Dashboard erweitert
Quelle: HANDOFF_2026-04-15.md.raw
### 12. Dashboard erweitert
Im Dashboard gibt es jetzt zusaetzlich:
- separaten Bereich `Zentrale Datei`
- `Excel oeffnen` fuer die neueste zentrale Datei `Sales_All_*.xlsx`
- Button `Alle exportieren`
- Button `Zentrale Datei neu erzeugen`
Bedeutung:
- `Alle exportieren` liest alle Quellen neu und erzeugt danach die zentrale Datei
- `Zentrale Datei neu erzeugen` schreibt nur aus `CentralSalesRecords` eine neue zentrale Excel
## H239 - 13. Management Cockpit Roh-Auswertung aus Zentraldaten
Quelle: HANDOFF_2026-04-15.md.raw
### 13. Management Cockpit Roh-Auswertung aus Zentraldaten
Zusaetzlich zur dateibasierten Cockpit-Analyse gibt es jetzt eine Roh-Auswertung direkt aus `CentralSalesRecords`.
Aktuell umgesetzt:
- Auswahl Jahr
- optional Auswahl Monat
- Jahresumsatz
- Monatsumsatz
- Tagesumsatz im gewaehlten Monat
- Umsatz nach Quelle
- Umsatz nach Land
- Periodenabdeckung / Zeilen / Rechnungen / Standorte / Laender / Waehrungen
Bewusst noch nicht enthalten:
- kein Intercompany-Filter
- keine CHF-Umrechnung
- kein Budgetvergleich
- keine Spartenlogik
- keine Gruppenlogik
- keine Margenlogik
## H240 - 14. Transformationssystem erweitert
Quelle: HANDOFF_2026-04-15.md.raw
### 14. Transformationssystem erweitert
Das Transformationssystem kann jetzt zwei Ebenen:
- `Value` fuer einfache feldweise Regeln aus der GUI
- `Record` fuer komplexere C#-Strategien per Strategy Pattern
Umgesetzt:
- neues Feld `RuleScope` auf `FieldTransformationRule`
- dynamischer Strategiekatalog
- GUI liest verfuegbare Typen aus dem Katalog
- erste `Record`-Strategie: `FirstNonEmpty`
Beispiel:
- `TargetField = CustomerName`
- `TransformationType = FirstNonEmpty`
- `Argument = CustomerName|SupplierName|Name`
## H241 - 15. Schema-Lookup fuer HANA-Standorte
Quelle: HANDOFF_2026-04-15.md.raw
### 15. Schema-Lookup fuer HANA-Standorte
Im Standortdialog fuer HANA-basierte Standorte gibt es jetzt:
- Button `Schemas laden`
- Lookup mit gueltigen Schemas aus HANA
Die Liste wird nicht blind aus allen Schemas gelesen, sondern auf typische B1-Schemas eingeschraenkt, in denen z. B. Tabellen wie
- `OINV`
- `INV1`
- `ORIN`
- `RIN1`
- `OCRD`
- `OITM`
vorhanden sind.
Wichtig:
- manuelle Eingabe bleibt moeglich
- fuer `BI1` und `SAGE` werden beim Lookup die effektiven Credentials inkl. zentraler Zugangsdaten / Overrides verwendet
- das reduziert Fehler wie `invalid schema name`
## H242 - 16. Testabdeckung ausgebaut
Quelle: HANDOFF_2026-04-15.md.raw
### 16. Testabdeckung ausgebaut
Es gibt jetzt ein separates Testprojekt:
- `TrafagSalesExporter.Tests`
Automatisiert getestet werden aktuell:
- Transformationsstrategien
- `RecordTransformationService`
- `TransformationCatalog`
- `ManualExcelImportService`
- `ManagementCockpitService`
- `ConfigTransferService`
Wichtiger bereits gefundener Bug:
- deutsches Dezimalformat wie `1,50` wurde im manuellen Excel-Import falsch interpretiert
- Parsing wurde korrigiert
## H243 - Wichtige Dateien
Quelle: HANDOFF_2026-04-15.md.raw
## Wichtige Dateien
## H244 - Modelle
Quelle: HANDOFF_2026-04-15.md.raw
### Modelle
- `Models/Site.cs`
- `Models/ExportSettings.cs`
- `Models/ExportLog.cs`
- `Models/CentralSalesRecord.cs`
- `Models/SapSourceDefinition.cs`
- `Models/SapJoinDefinition.cs`
- `Models/SapFieldMapping.cs`
- `Models/ManagementCockpitModels.cs`
- `Models/ConfigTransferPackage.cs`
- `Models/FieldTransformationRule.cs`
## H245 - Services
Quelle: HANDOFF_2026-04-15.md.raw
### Services
- `Services/SiteExportService.cs`
- `Services/ConsolidatedExportService.cs`
- `Services/CentralSalesRecordService.cs`
- `Services/SapGatewayService.cs`
- `Services/SapCompositionService.cs`
- `Services/ConfigTransferService.cs`
- `Services/AppEventLogService.cs`
- `Services/ManagementCockpitService.cs`
- `Services/DatabaseInitializationService.cs`
- `Services/ExportOrchestrationService.cs`
- `Services/ManualExcelImportService.cs`
- `Services/TransformationCatalog.cs`
- `Services/RecordTransformationService.cs`
- `Services/TransformationStrategies.cs`
## H246 - UI
Quelle: HANDOFF_2026-04-15.md.raw
### UI
- `Components/Pages/Standorte.razor`
- `Components/Pages/Settings.razor`
- `Components/Pages/Dashboard.razor`
- `Components/Pages/Logs.razor`
- `Components/Pages/ManagementCockpit.razor`
- `Components/Pages/Transformations.razor`
- `Components/Layout/NavMenu.razor`
## H247 - Tests
Quelle: HANDOFF_2026-04-15.md.raw
### Tests
- `TrafagSalesExporter.Tests/TransformationStrategiesTests.cs`
- `TrafagSalesExporter.Tests/RecordTransformationServiceTests.cs`
- `TrafagSalesExporter.Tests/TransformationCatalogTests.cs`
- `TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs`
- `TrafagSalesExporter.Tests/ManagementCockpitServiceTests.cs`
- `TrafagSalesExporter.Tests/ConfigTransferServiceTests.cs`
## H248 - Datenbank / Migrationen
Quelle: HANDOFF_2026-04-15.md.raw
## Datenbank / Migrationen
Viele Aenderungen laufen ueber `DatabaseInitializationService`.
Wichtige neue oder erweiterte Tabellen/Felder:
- `Sites`
- `UsernameOverride`
- `PasswordOverride`
- `SapServiceUrl`
- `SapEntitySet`
- `SapEntitySetsCache`
- `SapEntitySetsRefreshedAtUtc`
- `LocalExportFolderOverride`
- `ManualImportFilePath`
- `ManualImportLastUploadedAtUtc`
- `ExportSettings`
- zentrale SAP/BI1/SAGE Credentials
- `LocalSiteExportFolder`
- `LocalConsolidatedExportFolder`
- `DebugLoggingEnabled`
- `FieldTransformationRules`
- `RuleScope`
- `ExportLogs`
- `FilePath`
- neue Tabellen:
- `AppEventLogs`
- `CentralSalesRecords`
- SAP-Konfigtabellen
## H249 - Letztes Hauptproblem und Loesung
Quelle: HANDOFF_2026-04-15.md.raw
## Letztes Hauptproblem und Loesung
## H250 - Export hing nach zentraler Speicherung
Quelle: HANDOFF_2026-04-15.md.raw
### Export hing nach zentraler Speicherung
Der Export blieb zuletzt nach
- `Zentrale Tabelle: 20106 Datensaetze gespeichert.`
haengen.
Die eigentliche Ursache war am Ende nicht mehr der Batch-Insert selbst, sondern ein kaputter SQLite-Schemazustand:
- mindestens eine Tabelle referenzierte per FK noch `main.Sites_old`
- dadurch scheiterte `SaveChangesAsync()` spaeter beim Schreiben in `AppEventLogs` oder `ExportLogs`
- die alte Tabelle `Sites_old` existierte nicht mehr
Beobachteter Fehler:
- `SQLite Error 1: 'no such table: main.Sites_old'`
## H251 - Umgesetzte Korrekturen
Quelle: HANDOFF_2026-04-15.md.raw
## Umgesetzte Korrekturen
- `Components/Pages/Dashboard.razor`
- Live-Status pollt waehrend laufendem Export nicht mehr permanent `AppEventLogs`
- stattdessen Anzeige ueber den In-Memory-Status aus `ExportOrchestrationService`
- `Program.cs`
- SQLite `Default Timeout` von `10` auf `60` erhoeht
- `Services/CentralSalesRecordService.cs`
- nach abgeschlossenem Batch-Insert wird explizit `Zentrale Tabelle aktualisiert` gesetzt
- `Services/DatabaseInitializationService.cs`
- automatische Reparaturlogik fuer Tabellen, deren `CREATE TABLE`-SQL noch `Sites_old` referenziert
- betroffene Tabellen werden beim Start neu aufgebaut und Daten rueberkopiert
Danach wurde der Export erfolgreich getestet und geht jetzt wieder durch.
## H252 - Was bei einer naechsten Stoerung zuerst zu pruefen ist
Quelle: HANDOFF_2026-04-15.md.raw
## Was bei einer naechsten Stoerung zuerst zu pruefen ist
1. Tritt beim App-Start die Schema-Reparatur sauber durch?
2. Gibt es noch weitere Tabellen mit FK-Referenz auf `Sites_old`?
3. Erst danach wieder Insert-/Commit-Batches der zentralen Speicherung untersuchen
## H253 - Build-Status
Quelle: HANDOFF_2026-04-15.md.raw
## Build-Status
Letzter Build:
```text
dotnet build TrafagSalesExporter.sln
```
Ergebnis:
- erfolgreich
- bekannte Warnungen bleiben:
- SAP HANA Architekturwarnung `MSB3270`
- MudBlazor Analyzer `Dense`
## H254 - Nachtrag 2026-04-17 UI-Klarstellung HANA vs. SAP
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-17 UI-Klarstellung HANA vs. SAP
- `Components/Pages/Standorte.razor`
- Bereich oben heisst jetzt bewusst `Zentrale HANA-Technik`
- Hinweistext stellt klar: dort erscheinen nur Quellsysteme mit Anschlussart `HANA`
- `SAP` wird zentral unter `Settings -> Quellsysteme` gepflegt und gehoert nicht in diese Box
- der irrefuehrende Button `Server hinzufuegen` wurde entfernt
- neue HANA-Zeilen entstehen aus den Quellsystem-Stammdaten, nicht mehr aus einer zweiten UI-Erfassung
- Dialogtitel fuer HANA wurde auf reine Bearbeitung der zentralen Technik reduziert
Fachliche Regel jetzt:
- `Quellsysteme` verwalten die zentralen Systeme und deren Anschlussart
- `Standorte` zeigen fuer HANA nur noch die technische Zentralverbindung
- `SAP` wird nicht mehr implizit in der HANA-Box erwartet
## H255 - Nachtrag 2026-04-17 Pruefung Config-Import/Export
Quelle: HANDOFF_2026-04-15.md.raw
## Nachtrag 2026-04-17 Pruefung Config-Import/Export
Der aktuelle Config-Transfer wurde nach den Umbauten nochmals geprueft.
Status:
- Das aktuelle Import-/Exportformat passt zum neuen Modell.
- `SourceSystemDefinitions` werden mit `ConnectionKind`, `CentralServiceUrl`, `CentralUsername`, `CentralPassword` importiert/exportiert.
- `HanaServers` enthalten nur noch technische HANA-Verbindungsdaten und keine Credentials mehr.
- Standort-Overrides fuer Username/Password sowie SAP Service URL gehen weiterhin mit.
- Die vorhandenen `ConfigTransferServiceTests` laufen grün.
Weiterhin offene Architekturpunkte:
- `ConfigTransferService.ImportJsonAsync` ist weiterhin destruktiv und nicht atomar.
- Erst werden bestehende Daten geloescht, danach wird in mehreren Schritten neu aufgebaut.
- Wenn der Import in der Mitte scheitert, bleibt ein teilweiser Zustand zurueck.
- Altformat-Risiko bei `ConnectionKind`:
- Wenn ein aelteres JSON bereits `SourceSystemDefinitions` enthaelt, aber noch ohne `ConnectionKind`, faellt der DTO-Default auf `HANA`.
- Dadurch koennte ein altes `SAP` beim Import falsch als `HANA` landen.
Fazit:
- Fuer Exporte aus dem aktuellen Stand ist der Config-Transfer konsistent.
- Fuer aeltere JSON-Staende braucht der Import noch eine explizite Migrations-/Fallback-Logik.
## H256 - TrafagSalesExporter LLM System Guide
Quelle: LLM_SYSTEM_GUIDE.md.raw
# TrafagSalesExporter LLM System Guide
Stand: 2026-05-05
RAG-Hinweis: Fuer minimale Kontextladung zuerst `docs/RAG_ROUTER.md` lesen. Danach standardmaessig nur die passende Kurzdatei unter `docs/rag/` laden; Original-MDs nur bei Detail-/Auditbedarf.
## H257 - Aktueller Projektstand 2026-05-05
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Aktueller Projektstand 2026-05-05
Fuer den aktuellen Finance-/Laenderabgleich zuerst diese Dateien lesen:
- [HANDOFF_2026-04-15.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/HANDOFF_2026-04-15.md)
- [NEXT_STEPS_2026-04-15.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/NEXT_STEPS_2026-04-15.md)
- [lastchange.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/lastchange.md)
- [SAGE_SPAIN_EXPORT_2026-05-05.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/SAGE_SPAIN_EXPORT_2026-05-05.md)
Lokaler FinanceProbe:
```text
http://localhost:55417/finance
```
## H258 - Aktueller Zusatzstand 2026-05-07 SAP OData / ZSCHWEIZ
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Aktueller Zusatzstand 2026-05-07 SAP OData / ZSCHWEIZ
Schweiz/Oesterreich werden ueber eine neue SAP-Tabelle `ZSCHWEIZ` bereitgestellt.
Wichtige Punkte:
- ABAP-Report: `report.abap`
- SAP-Tabelle: `ZSCHWEIZ`
- OData EntitySet: `ZSCHWEIZSet`
- App-Standort: `ZSCHWEIZ` / `Schweiz/Oesterreich`
- Geplanter App-Pfad: `SAP` = `SAP OData`, nicht direkter HANA-Spezialcode
Quellsystem-Codes:
- `SAP`: SAP OData/Gateway, DisplayName `SAP OData`
- `SAP_HANA`: direkte HANA-Tabellen/Views, DisplayName `SAP HANA Tables/Views`
- `BI1`: HANA
- `SAGE`: HANA
- `MANUAL_EXCEL`: Excel/CSV
Mapper:
- SAP OData nutzt `SapSourceDefinition`, `SapJoinDefinition`, `SapFieldMapping`.
- Direkte HANA-Tabellen/Views koennen dieselben Mapping-Tabellen ebenfalls nutzen.
- Gemeinsame Mapping-Engine ist `MappedSalesRecordComposer`.
- `SapCompositionService` und `HanaQueryService.GetMappedSalesRecordsAsync` unterscheiden sich nur noch in der Quellenbeschaffung; Join und `SalesRecord`-Mapping sind zentral.
- Bei HANA mit gepflegten Quellen/Mappings nutzt `HanaDataSourceAdapter` den generischen Mapping-Pfad.
- Ohne HANA-Mapping bleibt der alte B1-HANA-Standardpfad fuer `OINV/INV1/ORIN/RIN1` aktiv.
Finance-Konfiguration:
- `FinanceReferences` enthaelt Soll-/check.xlsx-Referenzen.
- `FinanceIntercompanyRules` enthaelt 2nd-party/IC-Regeln.
- Budgetkurse werden als `CurrencyExchangeRates` mit `Notes = Budget 2025` gepflegt.
- Config-Export/-Import umfasst Finance-Referenzen und IC-Regeln.
ZSCHWEIZ-Seed:
- Quelle Alias `Z`
- EntitySet `ZSCHWEIZSet`
- Mapping auf `SalesRecord` ist vorbefuellt und grafisch editierbar.
- Beim App-Start wird die ZSCHWEIZ-Quelle samt Feldmapping per Upsert angelegt oder repariert.
- Wenn Gateway `$metadata` liefert, koennen Felder in der UI per `Felder aus Quellen laden` gelesen werden.
ABAP-Fachlogik:
- `BUKRS 1100` = Schweiz, `TSC TRCH`, `LAND1 CH`
- `BUKRS 1200` = Oesterreich, `TSC TRAT`, `LAND1 AT`
- `CUSTOMER_LAND` = Kundenland aus `KNA1-LAND1`
- Netto-/Steuerwerte werden in Belegwaehrung und Hauswaehrung geschrieben.
Aktuelle FinanceProbe-Funktionen:
- `Meeting Ampel 2025` fuer alle Laender aus `check.xlsx`
- `Detail alle Laender`
- `Spain CSV direct check`
- `Germany Excel sample check`
Spanien:
- Datei: `sagespain/v2/Spain_Sales_2025.csv`
- Ist: `3'082'320.18` EUR
- Soll: `3'102'333.61`
- Differenz: `-20'013.43`
- Status: Gelb / Pruefen
- Technisch lesbar, fachliche Differenz noch offen
Deutschland:
- Datei: `DE_Beispiel_Export_Daten.xlsx`
- Sample-Summe `NettoPreisGesamtX`: `8'290.70` EUR
- Nur Beispielfile, keine finale Jahreszahl
- Mapping technisch verstanden, finaler DE-Jahresfile fehlt
Letzte Verifikation:
- `dotnet build .\Tools\FinanceProbe\FinanceProbe.csproj --verbosity minimal --no-restore`
- `dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --verbosity minimal --no-restore`
- Ergebnis: Build OK, Tests `50/50`, FinanceProbe `HTTP 200`
Diese Datei ist fuer andere LLMs gedacht, die das Projekt schnell verstehen und daraus Architekturtexte, Visualisierungen, Ablaufdiagramme oder UI-/Datenflussgrafiken erzeugen sollen.
## H259 - Zweck des Systems
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Zweck des Systems
`TrafagSalesExporter` ist eine Blazor Server App auf `.NET 8`, die Verkaufsdaten aus mehreren Quellsystemen in ein gemeinsames Zielschema ueberfuehrt.
Quellsysteme:
- `HANA`-basierte Systeme wie `BI1` und `SAGE`
- `SAP_GATEWAY` ueber OData
- `MANUAL_EXCEL` aus hochgeladenen oder referenzierten Excel-Dateien
Zielbild:
- jede Quelle wird in `SalesRecord` normalisiert
- Standortdaten koennen lokal als Excel exportiert werden
- alle Datensaetze werden in `CentralSalesRecords` gespeichert
- eine zentrale konsolidierte Datei wird aus dem zentralen Datenbestand erzeugt
- ein `Management Cockpit` analysiert sowohl exportierte Dateien als auch zentrale Rohdaten
## H260 - Technologie-Stack
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Technologie-Stack
- UI: Blazor Server + MudBlazor
- Authentifizierung: ASP.NET Core Authentication/Authorization, produktiv Windows Authentication / Active Directory
- Datenbank: SQLite (`trafag_exporter.db`)
- Excel lesen/schreiben: ClosedXML
- SAP HANA Zugriff: `Sap.Data.Hana.Core.v2.1.dll`
- SAP Gateway / OData: eigener Service ueber HTTP
- SharePoint Upload/Download: Microsoft Graph + Azure Identity
- Tests: xUnit
## H261 - Einstiegspunkte
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Einstiegspunkte
Wichtige Dateien:
- [Program.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Program.cs)
- [Data/AppDbContext.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Data/AppDbContext.cs)
- [Components/Layout/NavMenu.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Layout/NavMenu.razor)
`Program.cs` registriert fast die komplette Architektur ueber DI und fuehrt beim Start `DatabaseInitializationService.InitializeAsync()` aus.
Zusaetzlich registriert `Program.cs` den Zugriffsschutz:
- `AddCascadingAuthenticationState`
- Windows Authentication fuer produktive Umgebungen
- Development-Authentication-Handler nur bei `ASPNETCORE_ENVIRONMENT=Development` und `Security:DevelopmentBypass=true`
- globale Fallback-Policy fuer authentifizierte/berechtigte User
- Policy `AdminOnly` fuer administrative Seiten
## H262 - Hauptseiten
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Hauptseiten
Navigation:
- `/` Dashboard
- `/standorte`
- `/transformations`
- `/management-cockpit`
- `/settings`
- `/logs`
Dateien:
- [Components/Pages/Dashboard.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/Dashboard.razor)
- [Components/Pages/Standorte.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/Standorte.razor)
- [Components/Pages/Transformations.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/Transformations.razor)
- [Components/Pages/ManagementCockpit.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/ManagementCockpit.razor)
- [Components/Pages/Settings.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/Settings.razor)
- [Components/Pages/Logs.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Pages/Logs.razor)
Kurzrollen:
- `Dashboard`: Einzel-Export, Alle exportieren, zentrale Datei neu erzeugen, Live-Status
- `Standorte`: Standortpflege, zentrale HANA-Technik, SAP-Konfiguration pro Standort, manueller Excel-Import
- `Transformations`: feldweise und record-basierte Regeln
- `Management Cockpit`: Dateianalyse und Rohanalyse aus `CentralSalesRecords`
- `Settings`: SharePoint, Exportpfade, Quellsysteme, Wechselkurse, Config Import/Export
- `Logs`: technische Ereignisprotokolle
Security:
- alle Routen erfordern Authentifizierung
- `Settings`, `Standorte` und `Transformations` sind `AdminOnly`
- Admin-Navigation wird nur fuer Admins angezeigt
- eingeloggter Benutzer wird im App-Bar angezeigt
## H263 - Kernmodelle
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Kernmodelle
Wichtige Entity-Klassen:
- [Models/Site.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/Site.cs)
- [Models/SourceSystemDefinition.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SourceSystemDefinition.cs)
- [Models/HanaServer.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/HanaServer.cs)
- [Models/SalesRecord.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SalesRecord.cs)
- [Models/CentralSalesRecord.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/CentralSalesRecord.cs)
- [Models/FieldTransformationRule.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/FieldTransformationRule.cs)
- [Models/SapSourceDefinition.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SapSourceDefinition.cs)
- [Models/SapJoinDefinition.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SapJoinDefinition.cs)
- [Models/SapFieldMapping.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SapFieldMapping.cs)
- [Models/SharePointConfig.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/SharePointConfig.cs)
- [Models/ExportSettings.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/ExportSettings.cs)
- [Models/ExportLog.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/ExportLog.cs)
- [Models/AppEventLog.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/AppEventLog.cs)
- [Models/CurrencyExchangeRate.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/CurrencyExchangeRate.cs)
`SalesRecord` / `CentralSalesRecord` enthalten neben den positionsnahen Feldern auch B1-Belegwaehrungsfelder:
- `DocumentCurrency` aus `DocCur`
- `DocumentTotalForeignCurrency` aus `DocTotalFC`
- `DocumentTotalLocalCurrency` aus `DocTotal`
- `VatSumForeignCurrency` aus `VatSumFC`
- `VatSumLocalCurrency` aus `VatSum`
- `DocumentRate` aus `DocRate`
- `CompanyCurrency` aus `OADM.MainCurncy`
Wichtig: diese Dokumentwerte sind Belegkopfwerte und werden in der positionsbasierten Excel pro Position wiederholt. Fuer Belegkopfsummen muessen Auswertungen nach Beleg deduplizieren.
Wichtige Relationen:
- `Site -> HanaServer` optional
- `Site -> SapSourceDefinitions`
- `Site -> SapJoinDefinitions`
- `Site -> SapFieldMappings`
- `Site -> CentralSalesRecords`
- `SourceSystemDefinition` ist zentrale Stammdatenquelle fuer Quellsysteme
## H264 - Datenbanktabellen
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Datenbanktabellen
`AppDbContext` enthaelt:
- `HanaServers`
- `SourceSystemDefinitions`
- `Sites`
- `SharePointConfigs`
- `ExportSettings`
- `ExportLogs`
- `AppEventLogs`
- `FieldTransformationRules`
- `CurrencyExchangeRates`
- `SapSourceDefinitions`
- `SapJoinDefinitions`
- `SapFieldMappings`
- `CentralSalesRecords`
## H265 - Architekturrollen der Services
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Architekturrollen der Services
## H266 - Export / Orchestrierung
Quelle: LLM_SYSTEM_GUIDE.md.raw
### Export / Orchestrierung
- [Services/ExportOrchestrationService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ExportOrchestrationService.cs)
- [Services/SiteExportService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/SiteExportService.cs)
- [Services/ConsolidatedExportService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ConsolidatedExportService.cs)
- [Services/CentralSalesRecordService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/CentralSalesRecordService.cs)
- [Services/ExportLogService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ExportLogService.cs)
Rollen:
- `ExportOrchestrationService` steuert UI-nahe Exportlaeufe und Live-Status
- `SiteExportService` entscheidet anhand des Quellsystems, wie ein Standort gelesen wird
- `CentralSalesRecordService` ersetzt zentrale Saetze pro Standort
- `ConsolidatedExportService` erzeugt die zentrale Datei
## H267 - Datenquellen
Quelle: LLM_SYSTEM_GUIDE.md.raw
### Datenquellen
- [Services/HanaQueryService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/HanaQueryService.cs)
- [Services/SapGatewayService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/SapGatewayService.cs)
- [Services/SapCompositionService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/SapCompositionService.cs)
- [Services/ManualExcelImportService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ManualExcelImportService.cs)
- [Services/SharePointUploadService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/SharePointUploadService.cs)
Rollen:
- `HanaQueryService`: SQL gegen SAP B1/HANA-nahe Schemata
- `SapGatewayService`: OData-Metadaten und Reads
- `SapCompositionService`: Mehrquellen-/Join-/Mapping-Aufbau fuer SAP
- `ManualExcelImportService`: Import im Exportformat aus `.xlsx`
- `SharePointUploadService`: Upload fuer Exportdateien und Download fuer manuelle Excel-Dateien
## H268 - Transformation / Mapping
Quelle: LLM_SYSTEM_GUIDE.md.raw
### Transformation / Mapping
- [Services/TransformationCatalog.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/TransformationCatalog.cs)
- [Services/TransformationStrategies.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/TransformationStrategies.cs)
- [Services/RecordTransformationService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/RecordTransformationService.cs)
- [Services/CurrencyExchangeRateService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/CurrencyExchangeRateService.cs)
- [Services/ExchangeRateImportService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ExchangeRateImportService.cs)
Rollen:
- `Value`-Transformationen fuer einzelne Felder
- `Record`-Transformationen fuer zeilenweite Regeln
- Wechselkursimport und -umrechnung
## H269 - Reporting / Monitoring / Infrastruktur
Quelle: LLM_SYSTEM_GUIDE.md.raw
### Reporting / Monitoring / Infrastruktur
- [Services/ManagementCockpitService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ManagementCockpitService.cs)
- [Services/AppEventLogService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/AppEventLogService.cs)
- [Services/ConfigTransferService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ConfigTransferService.cs)
- [Services/DatabaseInitializationService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/DatabaseInitializationService.cs)
- [Services/TimerBackgroundService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/TimerBackgroundService.cs)
## H270 - Der wichtigste technische Ablauf
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Der wichtigste technische Ablauf
## H271 - 1. Standort-Export
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 1. Standort-Export
Pfad:
`Dashboard/Standorte -> ExportOrchestrationService -> SiteExportService`
`SiteExportService` unterscheidet drei Modi:
1. `SAP_GATEWAY`
- SAP-Quellen lesen
- SAP-Joins anwenden
- SAP-Feldmappings auf `SalesRecord`
- Transformationen anwenden
- Standort-Excel erzeugen
- `CentralSalesRecords` ersetzen
- optional SharePoint-Upload
2. `HANA`
- effektive zentrale HANA-Konfiguration laden
- optionale Standort-Credential-Overrides anwenden
- SQL in HANA ausfuehren
- `SalesRecord` erzeugen
- Transformationen anwenden
- Standort-Excel erzeugen
- `CentralSalesRecords` ersetzen
- optional SharePoint-Upload
3. `MANUAL_EXCEL`
- `ManualImportFilePath` auswerten
- wenn lokal/UNC vorhanden: lokal lesen
- wenn SharePoint-Referenz: via Graph temp herunterladen
- Excel in `SalesRecord` lesen
- Transformationen anwenden
- keine neue Standortdatei erzeugen, bestehende Excel dient als Eingabe
- `CentralSalesRecords` ersetzen
## H272 - 2. Konsolidierter Export
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 2. Konsolidierter Export
Pfad:
`Dashboard -> ExportOrchestrationService -> ConsolidatedExportService`
Semantik aktuell:
- die zentrale Datei basiert fachlich auf `CentralSalesRecords`
- `ExportAllAsync()` sammelt zwar auch `consolidatedRecords`, aber die zentrale Exportsemantik ist historisch noch nicht vollkommen bereinigt
## H273 - 3. Management Cockpit
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 3. Management Cockpit
Zwei Betriebsarten:
1. Dateibasiert
- vorhandene `.xlsx` waehlen
- Datei mit ClosedXML lesen
- Summenfeld waehlen
- Anzeige-Waehrung waehlen
- Kennzahlen, Top-Listen, Datenqualitaet, Findings erzeugen
2. Zentraldatenbasiert
- direkt aus `CentralSalesRecords`
- Jahr/Monat Filter
- Summenfeld waehlen
- optionale weitere Summenfelder fuer Zeitreihen waehlen
- Anzeige-Waehrung waehlen
- Rohsicht ohne Intercompany-, Budget- oder Spartelogik
Aktuelle Summenfelder:
- `Sales Price/Value`
- `Quantity`
- `Standard cost`
- `Quantity * Standard cost`
Aktuelle Anzeige-Waehrungen:
- `EUR`
- `USD`
- `Original`
Die Waehrungsumrechnung nutzt `CurrencyExchangeRateService`. Bei `Original` bleiben Werte in Quellwaehrungen gruppiert. Nicht-betragliche Summenfelder wie `Quantity` haben keine Waehrung. Fehlende Wechselkurse werden gezaehlt und in Hinweisen bzw. Findings sichtbar; betroffene Werte werden in der Zielwaehrung mit `0` einbezogen.
## H274 - Quellsystemlogik
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Quellsystemlogik
## H275 - SourceSystemDefinition
Quelle: LLM_SYSTEM_GUIDE.md.raw
### SourceSystemDefinition
`SourceSystemDefinition` ist die fuehrende Wahrheit fuer:
- `Code`
- `DisplayName`
- `ConnectionKind`
- `IsActive`
- `CentralUsername`
- `CentralPassword`
- `CentralServiceUrl` fuer SAP
Anschlussarten:
- `HANA`
- `SAP_GATEWAY`
- `MANUAL_EXCEL`
## H276 - HANA
Quelle: LLM_SYSTEM_GUIDE.md.raw
### HANA
Fachliche Logik:
- zentrale technische HANA-Konfiguration pro Quellsystem
- keine separaten Vollverbindungen pro Standort
- Standort speichert nur Fachdaten plus optionale Username-/Password-Overrides
Schema-Lookup:
- in `Standorte` gibt es jetzt `Schemas laden`
- Lookup fragt `sys.tables` in HANA ab
- eingeschraenkt auf typische B1-Schemas mit Tabellen wie `OINV`, `INV1`, `ORIN`, `RIN1`, `OCRD`, `OITM`
## H277 - SAP
Quelle: LLM_SYSTEM_GUIDE.md.raw
### SAP
Fachliche Logik:
- zentrale SAP Service URL in `SourceSystemDefinition.CentralServiceUrl`
- Standort kann `SapServiceUrl` als Override pflegen
- pro Standort gibt es SAP-Quellen, Joins und Feldmappings
## H278 - Manual Excel
Quelle: LLM_SYSTEM_GUIDE.md.raw
### Manual Excel
Fachliche Logik:
- `Site.ManualImportFilePath` kann sein:
- lokaler Windows-Pfad
- UNC-Pfad
- SharePoint-URL
- SharePoint-Pfad unterhalb der konfigurierten Site
- Standortdaten werden aus der Excel eingelesen und in `CentralSalesRecords` uebernommen
- SharePoint dient hier als Eingangsquelle, nicht nur als Exportziel
## H279 - Transformationen
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Transformationen
Das System unterscheidet:
- `Value`-Transformationen
- `Record`-Transformationen
Beispiele:
- `Copy`
- `Uppercase`
- `Lowercase`
- `Prefix`
- `Suffix`
- `Replace`
- `Constant`
- `NormalizeCurrencyCode`
- `FirstNonEmpty`
- `ConvertCurrency`
Technischer Ablauf:
- Regeln liegen in `FieldTransformationRules`
- `TransformationCatalog` meldet verfuegbare Strategien an die UI
- `RecordTransformationService` wendet record-basierte Strategien an
## H280 - Wechselkurse
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Wechselkurse
Vorhanden:
- `CurrencyExchangeRates`
- `ExchangeRateImportService` fuer ECB-Tageskurse
- `NormalizeCurrencyCode`
- `ConvertCurrency`
- `ManagementCockpitService` kann betragliche Cockpit-Kennzahlen in `EUR` oder `USD` umrechnen
Wichtig:
- die Rohsicht im `Management Cockpit` kann jetzt Anzeige-Waehrungen nutzen
- `CHF` ist im Cockpit aktuell nicht als direkte Anzeige-Waehrung in der UI angeboten
- CHF bleibt weiterhin Teil des allgemeinen Transformationssystems
- fachlich ist noch zu klaeren, ob CHF als Standard- oder zusaetzliche Cockpit-Anzeige-Waehrung gebraucht wird
## H281 - SharePoint-Rolle im Gesamtsystem
Quelle: LLM_SYSTEM_GUIDE.md.raw
## SharePoint-Rolle im Gesamtsystem
`SharePointConfig` enthaelt:
- `SiteUrl`
- `ExportFolder`
- `CentralExportFolder`
- `TenantId`
- `ClientId`
- `ClientSecret`
Verwendung:
- Upload von Standort-Exporten
- Upload der zentralen Datei
- Download von manuellen Excel-Dateien fuer `MANUAL_EXCEL`
Wichtig:
- die App arbeitet gegen dieselbe SharePoint-Site, die in `Settings` konfiguriert ist
- fuer `MANUAL_EXCEL` muessen Referenzen auf derselben Site aufloesbar sein
## H282 - Startinitialisierung / Migrationen
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Startinitialisierung / Migrationen
Kritische Datei:
- [Services/DatabaseInitializationService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/DatabaseInitializationService.cs)
Aktuelle Rolle:
- `EnsureCreated`
- Schema-Ergaenzungen per `ALTER TABLE`
- Tabellen-Rebuilds bei Legacy-Schemas
- FK-Reparaturen
- Stammdaten-Seeding
- empfohlene Transformationsregeln
Bekannte Architekturrealitaet:
- das ist funktional hilfreich, aber kein sauberes Migrationssystem
- die Startlogik traegt produktive Schema-Reparaturverantwortung
- das ist einer der wichtigsten technischen Risikobloecke
Bereits gehaertete Fehlerbilder:
- kaputte FK-Referenzen auf `Sites_old`
- kaputte FK-Referenzen auf `HanaServers_repair_old`
- Legacy-Credential-Spalten in `ExportSettings`
- Legacy-Credential-Spalten in `HanaServers`
- verschobene Spalten im `Sites_old -> Sites`-Kopierpfad
## H283 - Authentifizierung / Autorisierung
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Authentifizierung / Autorisierung
Dateien:
- [Security/SecurityOptions.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Security/SecurityOptions.cs)
- [Security/SecurityPolicies.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Security/SecurityPolicies.cs)
- [Security/DevelopmentAuthenticationHandler.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Security/DevelopmentAuthenticationHandler.cs)
- [Components/Routes.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Routes.razor)
- [Components/Layout/NavMenu.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Layout/NavMenu.razor)
- [Components/Layout/MainLayout.razor](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Components/Layout/MainLayout.razor)
Produktives Ziel:
- Windows Authentication / Active Directory
- keine eigene Benutzerverwaltung
- Zugriff ueber AD-Gruppen
- Adminrechte ueber separate AD-Gruppe
Konfiguration in `appsettings.json`:
- `Security:AccessGroups`
- `Security:AdminGroups`
- `Security:DevelopmentBypass`
- `Security:DevelopmentUserIsAdmin`
- `Security:DevelopmentUserName`
Default-Gruppen:
- `TRAFAG\\TrafagSalesExporter-Users`
- `TRAFAG\\TrafagSalesExporter-Admins`
Development:
- `appsettings.Development.json` aktiviert einen lokalen Development-Auth-Handler
- dieser ist nur fuer lokale Entwicklung gedacht
- produktiv darf `ASPNETCORE_ENVIRONMENT` nicht `Development` sein
IIS-Betrieb:
- Windows Authentication aktivieren
- Anonymous Authentication deaktivieren
- AD-Gruppennamen in produktiver Konfiguration setzen
## H284 - Config Import / Export
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Config Import / Export
Dateien:
- [Services/ConfigTransferService.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Services/ConfigTransferService.cs)
- [Models/ConfigTransferPackage.cs](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/Models/ConfigTransferPackage.cs)
Aktueller Stand:
- JSON Export/Import fuer Konfiguration
- Secrets optional
- `SourceSystemDefinitions` im aktuellen Modell enthalten
- HANA-Technik ohne HANA-Credentials
- Standort-Overrides bleiben erhalten
Wichtige Punkte:
- Import laeuft jetzt transaktional
- alte `ConnectionKind`-lose Formate bekommen Fallbacks
- `CentralSalesRecords` werden nicht mehr blind geloescht
- bestehende zentrale Laufzeitdaten werden fuer weiterhin vorhandene Standorte remappt
## H285 - Logging
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Logging
Es gibt zwei Log-Ebenen:
- `ExportLogs` fuer fachliche Exporthistorie
- `AppEventLogs` fuer technische und UI-nahe Ereignisse
Die `Logs`-Seite liest vor allem `AppEventLogs`.
## H286 - Tests
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Tests
Testprojekt:
- [TrafagSalesExporter.Tests](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/TrafagSalesExporter.Tests)
Aktuell vorhandene Schwerpunkte:
- Transformationen
- Record-Transformationen
- TransformationCatalog
- CurrencyExchangeRateService
- ExchangeRateImportService
- ManualExcelImportService
- ManagementCockpitService
- ConfigTransferService
- DatabaseInitializationService
`ManagementCockpitServiceTests` decken inzwischen auch ab:
- zentrale Analyse nach Jahr/Monat
- Tages-, Monats-, Jahres-, Quellen- und Laenderwerte
- waehlbare Summenfelder
- Waehrungsumrechnung in EUR
- Wechselkurs-Caching
- Mengen-Auswertung ohne Waehrungsumrechnung
- Zusatz-Summenfelder in Zeitreihen
`SecurityPolicyFactoryTests` decken inzwischen ab:
- App-Zugriff fuer User in `AccessGroups`
- Ablehnung fuer User ausserhalb der Access-Gruppen
- Development-Auth-Zugriff im lokalen Modus
- Admin-Zugriff fuer User in `AdminGroups`
- Ablehnung normaler User fuer `AdminOnly`
- Development-Admin-Claim
`CentralSalesRecordServiceTests` decken inzwischen ab:
- Persistenz und Ruecklesen der B1-Belegwaehrungsfelder in `CentralSalesRecords`
Wichtig:
- es gibt aktuell keine echten UI-Komponententests mit `bUnit`
- es gibt keine Browser-E2E-Tests mit `Playwright`
- viele Button-Aktionen sind nur indirekt ueber Services und Persistenz getestet
## H287 - Bekannte offene Architekturfragen
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Bekannte offene Architekturfragen
Fuer andere LLMs wichtig, damit Visualisierungen nicht zu glatt oder zu idealisiert werden:
1. `DatabaseInitializationService` ist ein produktiver Reparatur-/Migrationslayer, nicht nur Bootstrap.
2. `Settings.razor` und `Standorte.razor` enthalten weiterhin relativ viel Anwendungslogik.
3. Die Semantik der konsolidierten Datei ist historisch teilweise doppelt angelegt.
4. Das `Management Cockpit` ist noch kein voll generalisierter Reporting-Layer.
5. SharePoint ist sowohl Exportziel als auch bei `MANUAL_EXCEL` mittlerweile moegliche Eingangsquelle.
## H288 - Empfohlene Diagramme fuer andere LLMs
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Empfohlene Diagramme fuer andere LLMs
## H289 - 1. Kontextdiagramm
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 1. Kontextdiagramm
Zeige:
- Benutzer
- Blazor App
- SQLite
- SAP HANA
- SAP Gateway
- lokale Dateisystempfade
- SharePoint
## H290 - 2. Komponenten-/Service-Diagramm
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 2. Komponenten-/Service-Diagramm
Gruppiere:
- UI
- Orchestrierung
- Quelladapter
- Transformation
- Persistenz
- Reporting
## H291 - 3. Datenflussdiagramm pro Quelltyp
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 3. Datenflussdiagramm pro Quelltyp
Je ein separater Flow fuer:
- HANA
- SAP Gateway
- Manual Excel lokal
- Manual Excel SharePoint
## H292 - 4. ER-Diagramm
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 4. ER-Diagramm
Fokussiere auf:
- `SourceSystemDefinition`
- `HanaServer`
- `Site`
- `SapSourceDefinition`
- `SapJoinDefinition`
- `SapFieldMapping`
- `CentralSalesRecord`
- `FieldTransformationRule`
## H293 - 5. Sequenzdiagramm fuer Export
Quelle: LLM_SYSTEM_GUIDE.md.raw
### 5. Sequenzdiagramm fuer Export
Wichtige Stationen:
- Dashboard
- ExportOrchestrationService
- SiteExportService
- spezifischer Quellservice
- Transformation
- CentralSalesRecordService
- Excel/SharePoint
- ExportLog/AppEventLog
## H294 - Prompt-Vorlage fuer ein anderes LLM
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Prompt-Vorlage fuer ein anderes LLM
Wenn ein anderes LLM daraus Visualisierungen erzeugen soll, funktioniert diese Anweisung gut:
> Lies `LLM_SYSTEM_GUIDE.md` als primaeren Systemkontext. Erzeuge daraus ein Architekturdiagramm, ein Datenflussdiagramm fuer HANA/SAP/MANUAL_EXCEL, ein ER-Diagramm der wichtigsten Tabellen und ein Sequenzdiagramm fuer `ExportAsync`. Achte darauf, dass `DatabaseInitializationService` produktive Reparaturlogik enthaelt und dass `MANUAL_EXCEL` sowohl lokal als auch ueber SharePoint gelesen werden kann.
## H295 - Weitere Kontextdateien
Quelle: LLM_SYSTEM_GUIDE.md.raw
## Weitere Kontextdateien
Zusatzkontext fuer Verlauf und Risiken:
- [HANDOFF_2026-04-15.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/HANDOFF_2026-04-15.md)
- [NEXT_STEPS_2026-04-15.md](C:/Users/koi/source/repos/Ai/TrafagSalesExporter/NEXT_STEPS_2026-04-15.md)
Diese beiden Dateien sind wichtig, wenn ein anderes LLM nicht nur Struktur, sondern auch historische Umbauten, Risiken und Prioritaeten verstehen soll.
## H296 - Finance Handoff 2026-05-18
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
# Finance Handoff 2026-05-18
Dieses Dokument fasst den aktuellen Stand der Finance-Abstimmung zusammen, damit die Arbeit ohne Wissensverlust fortgesetzt werden kann.
## H297 - Aktueller Stand
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Aktueller Stand
Testprogramm:
```text
http://127.0.0.1:5099/finance
```
Die App laeuft lokal auf `127.0.0.1:5099`. Der letzte Check der Seite ergab HTTP `200`.
Aktuelle Excel:
```text
docs/FINANCE_AMPEL_LAENDER_2026-05-18_21-27.xlsx
```
Aktuelle Cache-Dateien:
```text
docs/it_cache_2025.csv
docs/spain_cache_2025.csv
```
## H298 - Nachtrag 2026-05-19
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Nachtrag 2026-05-19
Nach diesem Handoff wurden noch vier relevante Schritte umgesetzt und committed:
1. Haupt-App-Finance-Vergleich an FinanceProbe angeglichen.
2. Leere Ist-Zeilen ohne belastbaren Ist-Wert aus dem Finance-Vergleich gefiltert.
3. Berechnungsformeln je Land dokumentiert.
4. Finance Cockpit mit separatem Login technisch geschuetzt; fachliche/produktive Abnahme noch offen.
Wichtige neue Doku:
```text
docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md
```
Diese Datei beschreibt die aktuell verwendete Soll/Ist-Logik fuer `/finance-cockpit/vergleich` und `/finance`, inklusive Jahresfilter, Kandidatenberechnung, Deduplizierung, bevorzugter Ist-Variante und landesspezifischer Quellen/Formeln.
Neue Finance-Cockpit-Sperre, Stand technisch:
- `FinanceCockpitAccessService`
- `FinanceCockpitAccessOptions`
- `FinanceCockpitUnlockPanel`
- Konfiguration in `appsettings.json` unter `FinanceCockpitAccess`
- DI-Registrierung in `Program.cs`
- Route-/Navigation-Schutz in `Routes.razor` und `NavMenu.razor`
Wichtig: Der HR-KPI-Login bleibt separat. Die neue Sperre betrifft das Finance Cockpit und laeuft wie HR-KPI ueber Benutzername plus SHA-256-Passwort-Hash. Finance hat ein eigenes Passwort:
```text
Benutzer: finance
Passwort: Trafag-Finance-Cockpit-2026!
```
AD-/Rollenpruefung ist fuer den Moment nicht geloescht, sondern in `appsettings.json` mit `Security.Enabled = false` deaktiviert. Die vorhandenen `AccessGroups` und `AdminGroups` bleiben in der Konfiguration stehen und koennen spaeter wieder aktiviert werden. Die Finance-Sperre bleibt davon unabhaengig aktiv.
## H299 - Zentrale Excel fuer CFO-/Finance-Filter
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
### Zentrale Excel fuer CFO-/Finance-Filter
Die zentrale Datei `Sales_All_yyyy-MM-dd.xlsx` enthaelt am rechten Ende einen zusammengehoerigen Finance-Spaltenblock:
```text
Finance | Year
Finance | Country Key
Finance | Date
Finance | Net Sales Actual
Finance | Currency
Finance | Include
Finance | Source Value Field
```
Zusaetzlich wird nur in der zentralen Datei ein Hilfsblatt erzeugt:
```text
Finance Filter Hilfe
```
Damit soll Finance dieselben Ist-Summen aus Excel filtern koennen wie im Testprogramm bzw. auf `/finance-cockpit/vergleich`.
Vorgehen im Excel:
1. `Finance | Year` auf das gewuenschte Jahr filtern, z. B. `2025`.
2. `Finance | Country Key` auf Land filtern, z. B. `IT`, `UK`, `ES`, `AT`.
3. `Finance | Include = TRUE` filtern.
4. `Finance | Net Sales Actual` summieren.
Gepruefter Vergleich gegen `FinanceReconciliationService` fuer 2025:
| Key | Finance-Service | Excel-Finance-Spalten | Differenz |
| --- | ---: | ---: | ---: |
| AT | `3'438'121.37` | `3'438'121.37` | `0.00` |
| CH | `43'521'390.82` | `43'521'390.82` | `0.00` |
| ES | `3'082'320.18` | `3'082'320.18` | `0.00` |
| FR | `1'471'218.44` | `1'471'218.44` | `0.00` |
| IN | `750'936'591.38` | `750'936'591.38` | `0.00` |
| IT | `7'669'641.47` | `7'669'641.47` | `0.00` |
| UK | `3'533'710.09` | `3'533'710.09` | `0.00` |
| US | `3'749'865.33` | `3'749'865.33` | `0.00` |
Hinweis: Fuer AT/CH waehlt der Finance-Service intern `Nettofakturawert Hauswaehrung pro Position`; in den aktuellen Daten ist dieser Wert identisch mit `SalesPriceValue`, daher stimmen die Excel-Finance-Spalten exakt.
## H300 - Aktuelle Soll/Ist-Werte
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Aktuelle Soll/Ist-Werte
| Land | Ist | Soll | Differenz | Waehrung | Status |
| --- | ---: | ---: | ---: | --- | --- |
| FR | `1'471'218.44` | `1'471'218.00` | `0.44` | EUR | OK |
| IN | `750'936'591.38` | `750'936'591.00` | `0.38` | INR | OK |
| US | `3'749'865.33` | `3'749'865.00` | `0.33` | USD | OK |
| IT | `7'669'641.47` | `7'669'840.00` | `-198.53` | EUR | Fast passend, Filter fachlich bestaetigen |
| UK | `3'533'710.09` | `3'538'972.00` | `-5'261.91` | GBP | Kleine Restdifferenz |
| AT | `3'438'121.37` | `3'443'863.00` | `-5'741.63` | EUR | Kleine Restdifferenz |
| ES | `3'082'320.18` | `3'102'333.61` | `-20'013.43` | EUR | Groesste Restdifferenz |
Prioritaet fuer Folgearbeit:
1. ES pruefen: vermutlich Zuschlaege/Fracht/Nebenkosten/Rhino-Auswertungslogik.
2. AT und UK Restdifferenzen klaeren.
3. IT fachlich bestaetigen, weil der aktuelle Filter noch provisorisch ist.
## H301 - Grundregeln
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Grundregeln
- Net Sales Actuals werden in der Hauswaehrung des Landes verglichen.
- CHF ist nur Kontroll-/Reporting-Sicht ueber Budgetkurse, nicht Standardvergleich.
- Fuehrend ist Netto ohne VAT/MwSt.
- Gutschriften/Credit Notes muessen negativ in die Summe laufen.
- Standard-Ist bleibt inklusive Intercompany; IC/2nd-party wird separat gezeigt, ausser ein Land hat fachlich bestaetigte Ausschluesse.
- Jahresabgrenzung: bevorzugt Buchungsdatum/PostingDate. Wenn Quelle kein PostingDate liefert: InvoiceDate, danach ExtractionDate.
## H302 - Italien
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Italien
Quelle:
- `BI1` / SAP B1 via HANA
- TSC `TRIT`
- Schema `it01_p`
Wichtige Erkenntnisse:
- Italien ist B1, nicht Sage.
- Frankreich und Italien kommen beide aus BI1/B1; FR passt mit `SalesPriceValue`.
- Screenshot `italien.png` zeigte fuer Italien die relevante B1-/Finance-Sicht auf Konto:
```text
47005 - Ricavi vendite e prestazioni
```
Aktueller technischer Arbeitsfilter in `Services/HanaQueryService.cs` fuer `it01_p`:
```sql
AcctCode LIKE '47005%'
AcctCode NOT LIKE '4700504%'
CardCode NOT IN (
'C_IT01_0022987',
'C_IT01_0306928',
'C_IT01_0306138',
'C_IT01_0309653',
'C_IT01_0304885',
'C_IT01_0306475'
)
```
Aus Cache berechnete Herleitung:
```text
10'603'550.59 - 2'933'909.12 = 7'669'641.47 EUR
Soll/Rhino = 7'669'840.00 EUR
Differenz = -198.53 EUR
```
Die sechs provisorisch ausgeschlossenen Kunden:
| Kunde | Betrag |
| --- | ---: |
| FAIVELEY TRANSPORT ITALIA S.P.A. | `1'689'857.70` |
| SYSTEM CERAMICS S.P.A. | `323'409.00` |
| WABTEC MZT | `282'647.40` |
| FINCANTIERI NEXTECH S.P.A | `268'166.37` |
| METAL WORK SERVICE S.R.L. | `203'425.15` |
| ELEMASTER S.P.A. | `166'403.50` |
Wichtig: Dieser IT-Filter ist ein Arbeits-/Prueffilter, noch nicht fachlich final bestaetigt.
Nachtrag 2026-05-20:
- Finance-Leiter bestaetigt als fachliche Methode: `Trafag Italia` aus dem externen IT-Finance-Ist ausschliessen.
- Identische IT-Zeilen mit leerem `Supplier country` nur einmal zaehlen.
- Die alte Kundenausschluss-Kombination bleibt als 2025-Analyse dokumentiert, ist aber nicht die fuehrende Methode fuer Folgejahre.
Detaildokument:
```text
docs/FINANCE_IT_VORGEHEN_2026-05-18.md
```
## H303 - UK
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## UK
Quelle:
- Fachlich Sage, nicht SAP B1.
- TSC `TRUK`.
- App-Anschluss: `MANUAL_EXCEL`.
- SharePoint-Ordner heisst technisch `Import/Finance/UK_B1`, aber das bedeutet nicht B1.
Aktuelle Berechnung:
```text
SageNetSales([Sales Price/Value], [Quantity], [Document Type], [DocumentType], [Type])
```
Bedeutung:
- `Sales Price/Value * Quantity`
- Credit Notes werden bei erkennbarem Sage-Typ negativ erzwungen.
- Waehrung ist GBP.
Wichtige Korrektur:
- UK wird gegen Local Currency/GBP geprueft.
- Der fruehere `CheckValue 3'749'865.00` war fuer UK falsch und wurde entfernt.
- Korrektes Soll fuer UK ist `LocalCurrencyValue = 3'538'972.00 GBP`.
Aktueller Stand:
```text
Ist = 3'533'710.09 GBP
Soll = 3'538'972.00 GBP
Differenz = -5'261.91 GBP
```
Detaildokument:
```text
docs/FINANCE_UK_QUELLE_KORREKTUR_2026-05-18.md
```
## H304 - Spanien
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Spanien
Quelle:
- Sage CSV
- TSC `TRES`
- Datei: `sageSpain/v2/Spain_Sales_2025.csv`
- Cache: `docs/spain_cache_2025.csv`
Berechnung:
- `SalesPriceValue` aus `LineasAlbaranCliente.ImporteNeto`
- Credit Notes/REC negativ
- Datumsbasis: `FechaFactura`
- Waehrung: EUR
Aktuelle Zerlegung:
```text
Zeilen = 4'341
Invoice = 3'140'921.50 EUR
Credit Notes = -58'601.32 EUR
Ist = 3'082'320.18 EUR
Soll/Rhino = 3'102'333.61 EUR
Differenz = -20'013.43 EUR
```
Nach Serie:
| Serie | Zeilen | Betrag |
| --- | ---: | ---: |
| REG | `3'079` | `2'407'451.30` |
| LAT | `1'118` | `480'199.20` |
| PRO | `43` | `253'271.00` |
| REC | `101` | `-58'601.32` |
Bewertung:
- Differenz ist ca. `0.65%`.
- Gutschriften sind nicht das Problem, sie sind bereits negativ.
- Wahrscheinlich fehlen oder unterscheiden sich kleinere Sage-/Rhino-Bestandteile: Fracht, Portes, Zuschlaege, Rundungen, Versicherung, Finanzierung, nicht-artikelbezogene Belegpositionen oder eine andere Sage-Auswertung.
- Nicht einfach auf Belegkopf `DocumentNetAmount` wechseln: deduplizierter Belegkopf liegt bei `2'907'901.79` und passt schlechter.
## H305 - Geaenderte Programmteile
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Geaenderte Programmteile
Wichtige Dateien:
```text
Services/HanaQueryService.cs
Services/ManualExcelImportService.cs
Services/DatabaseSeedService.cs
scripts/Export-SageSpainSalesCsv.ps1
SageSpainFinalExportPackage/Export-SageSpainSalesCsv.ps1
TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs
```
Wichtige technische Aenderungen:
- IT: provisorischer B1-Konto-/Kundenausschlussfilter fuer `it01_p`.
- UK: `SageNetSales(...)` im Manual-Excel-Importer.
- UK: `FinanceReference` nutzt fuer UK nur `LocalCurrencyValue = 3'538'972`, kein `CheckValue`.
- ES: Sage-Spain-SQL erzwingt Credit Notes mit `-ABS(...)`.
- Test ergaenzt, der positive Credit-Note-Rohbetraege negativ macht.
## H306 - Validierung
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Validierung
Build:
```text
dotnet build .\TrafagSalesExporter.csproj --no-restore -p:UseAppHost=false -p:OutDir=.\obj\verify_uk_reference\ --verbosity minimal
```
Ergebnis: erfolgreich.
Tests:
```text
dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal
```
Ergebnis:
```text
71/71 Tests gruen
```
FinanceProbe:
```text
http://127.0.0.1:5099/finance
```
Ergebnis: HTTP `200`.
## H307 - Commits
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Commits
Relevante Commits:
| Commit | Inhalt |
| --- | --- |
| `fb85e2e` | Sage-Berechnungen korrigiert, IT/UK-Doku und Ampel ergaenzt |
| `3d40d76` | UK auf GBP Local Currency als Referenz umgestellt |
| `f721d95` | Aktuelle Excel und Spanien-Cache ergaenzt |
| `bc6bfdf` | Finance-Handoff dokumentiert |
| `8f1b1b8` | Haupt-Finance-Vergleich an Probe angeglichen |
| `f855e06` | Leere Ist-Zeilen im Finance-Vergleich gefiltert |
| `5c654ad` | Finance-Berechnungsformeln je Land dokumentiert |
| `9c544af` | Finance Cockpit mit Login technisch geschuetzt |
| `ebbc5a1` | Finance-Filterspalten in zentrale Excel ergaenzt |
| `b23f73e` | Finance-Hilfsblatt in zentrale Excel ergaenzt |
Dieses Handoff wurde danach als weiterer Commit hinzugefuegt.
## H308 - Nicht aufraeumen ohne Ruecksprache
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Nicht aufraeumen ohne Ruecksprache
Es gibt noch untracked/temporaere Arbeitsdateien und alte Word-/Excel-Backups. Diese wurden bewusst nicht committed, weil sie entweder temporär, defekt, Logdateien oder Zwischenstaende sind.
Bekannt uncommitted:
```text
.tmp_tools/
Tools/FinanceProbe/.tmp_tools/
verify_probe_out*/
financeprobe.*.log
docs/CFO_Kurzbericht_270515.docx
docs/CFO_Kurzbericht_270515*.bak.docx
docs/CFO_Kurzbericht_270515_NEU*.docx
docs/FINANCE_AMPEL_LAENDER_2026-05-18.xlsx
docs/FINANCE_AMPEL_LAENDER_2026-05-18_20-32.xlsx
docs/FINANCE_AMPEL_LAENDER_2026-05-19.xlsx
docs/it_cache_2025.csv
italien.png
financeprobe.*.log
mainapp.*.log
```
Wenn weitergearbeitet wird, zuerst `git status --short` pruefen und keine fremden/alten Dateien blind loeschen.
## H309 - Naechste sinnvolle Schritte
Quelle: FINANCE_HANDOFF_2026-05-18.md.raw
## Naechste sinnvolle Schritte
1. ES: Sage-/Rhino-Unterschied von `20'013.43 EUR` gegen Fracht/Zuschlaege/Nebenkosten pruefen.
2. AT: Differenz `-5'741.63 EUR` analysieren.
3. UK: Restdifferenz `-5'261.91 GBP` klaeren, aber UK ist jetzt nahe am LC-Soll.
4. IT: provisorischen Kundenausschluss fachlich bestaetigen oder durch offizielle B1/Rhino-Filterregel ersetzen.
5. AD-/Rollenpruefung spaeter wieder aktivieren, sobald geklaert ist, welche Gruppen produktiv gelten. Dazu `Security.Enabled` wieder auf `true` setzen; Gruppen sind nicht geloescht.
6. `/finance-cockpit/vergleich` und `/finance` nebeneinander pruefen, wenn neue Daten geladen wurden; beide sollen dieselbe `FinanceReconciliationService`-Logik nutzen.
## H310 - Finance Dashboard Todo
Quelle: FINANCE_DASHBOARD_TODO_2026-05-15.md.raw
# Finance Dashboard Todo
Stand: 2026-05-20
Hinweis:
Dieses Dokument ist eine historische Todo-Liste vom 2026-05-15 und wurde am 2026-05-20 nachgezogen. Fuer den aktuell fuehrenden Dokumentenstatus siehe:
```text
docs/MD_DOKUMENTENSTATUS_2026-05-20.md
```
Ziel: Aufbau eines modernen, uebersichtlichen Intranet-Dashboards fuer das Group Sales Reporting, zugaenglich fuer alle freigegebenen Benutzer.
## H311 - Todo
Quelle: FINANCE_DASHBOARD_TODO_2026-05-15.md.raw
## Todo
| Prio | Aufgabe | Status |
| --- | --- | --- |
| 1 | Fuehrendes CFO-Dokument verwenden: `FINANCE_CHEF_SUMMARY_2026-05-15.docx` | Historisch; neue Anwenderdoku `FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx` ergaenzt |
| 1 | Offene Finance-Entscheide mit Andreas/Finance durchgehen | Offen |
| 1 | Italien-Abweichung klaeren: Berechnungsart, Deduplizierung, Intercompany | Teilweise geklaert; Finance-Leiter bestaetigte Methode, Restdifferenz dokumentiert |
| 1 | Italien IC-Diagnose besprechen: Trafag, Magnetic Sense/Magnets Sense und Gesellschaft fuer Sensorik erklaeren einen grossen Teil, aber nicht die ganze Abweichung | Historisch; neue IT-Methode verwendet `CustomerName` Trafag Italia und Dublettenregel |
| 1 | Deutschland: finalen Jahresfile 2025 beschaffen | Erledigt technisch; DE Alphaplan ist eingebaut, Fachabgrenzung Kundenlaender bleibt offen |
| 2 | UK/England: Jahresvollstaendigkeit und Restdifferenz pruefen | Teilweise erledigt; UK ist Sage/Manual Excel, Mapping korrigiert, Restdifferenz klein/offen |
| 2 | CH/AT: Sollzuordnung und Trennung final bestaetigen | Offen |
| 2 | Spanien und Oesterreich: kleinere Differenzen klaeren | Offen |
| 2 | Intercompany-/2nd-party-Kundenliste final definieren | Offen |
| 3 | Budgetkurse je Jahr als Quelle festlegen | Offen |
| 3 | Dashboard-Sicht fuer CFO: nur Laender mit Abweichung und Handlungsbedarf anzeigen | In Arbeit; Finance Summary und Soll/Ist Sicht vorhanden |
| 3 | Detailansicht je Land mit Berechnungsart und Pruefspur behalten | In Arbeit; Rohdaten-/Diagnosereiter bleibt erhalten |
| 3 | Freigabe-/Berechtigungskonzept fuer Intranet-Dashboard klaeren | Offen |
## H312 - Naechster Termin
Quelle: FINANCE_DASHBOARD_TODO_2026-05-15.md.raw
## Naechster Termin
Ziel im Termin:
- Deutschland und Spanien muss finales Excel schicken (Rohali 2 mal nachgehakt warte auf finales File)
- Grundlogik bestaetigen: Hauswaehrung, Nettofakturawert, Buchungsdatum, Berechnung pro Belegposition.
- Offene Laenderabweichungen priorisieren.
- Pro Land festlegen, welche Datenquelle und Berechnungslogik final gilt.
## H313 - IT / Intercompany Diagnose
Quelle: FINANCE_DASHBOARD_TODO_2026-05-15.md.raw
## IT / Intercompany Diagnose
Aktuelle Diagnose fuer Italien:
| Kennzahl | Wert |
| --- | ---: |
| IT Ist vor IC-Abzug | 14.704.336,29 EUR |
| Rhino/check.xlsx Soll | 7.669.840,00 EUR |
| Abweichung vor IC | +7.034.496,29 EUR |
| Erkannter IC-/2nd-party-Abzug | 4.397.746,90 EUR |
| IT Ist exkl. IC | 10.306.589,39 EUR |
| Restabweichung nach IC | +2.636.749,39 EUR |
Verwendete IC-/2nd-party-Marker:
- `TRAFAG`
- `MAGNETIC SENSE`
- `MAGNETS SENSE`
- `GESELLSCHAFT FUER SENSORIK`
- `GESELLSCHAFT FUR SENSORIK`
Bewertung:
- Intercompany/2nd-party erklaert einen grossen Teil der IT-Abweichung.
- Die Summe passt dadurch deutlich besser, aber noch nicht vollstaendig.
- Restabweichung weiter pruefen: Summenlogik, Beleg/Position-Deduplizierung, Gutschriften/Storno und weitere lokale IC-Kunden oder Schreibweisen.
## H314 - Finance: Welches Dokument gilt?
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
# Finance: Welches Dokument gilt?
Stand: 2026-05-20
## H315 - Aktueller Nachtrag 2026-05-20
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Aktueller Nachtrag 2026-05-20
Zum alten CFO-/Finance-Termin-Dokument ist eine neue Anwenderdoku fuer das Cockpit hinzugekommen:
```text
docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx
```
Diese neue Word-Datei ist die bessere Anleitung fuer Finance-Anwender im Cockpit. Das CFO-Dokument vom 2026-05-15 bleibt historische Termin-/Entscheidgrundlage.
Technisch/fachlich aktuell fuehrend:
- `Management Analyse` Reiter `Finance Summary`
- zentrale Excel `Finance Summary`
- `FinanceRuleEngine`
- `docs/FINANCE_ENTSCHEIDE.md`
- `docs/MD_DOKUMENTENSTATUS_2026-05-20.md`
## H316 - Fuehrendes Dokument
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Fuehrendes Dokument
Fuer den CFO-/Finance-Termin vom 2026-05-15 galt:
```text
docs/FINANCE_CHEF_SUMMARY_2026-05-15.docx
```
Dieses Dokument ist die aktuellste CFO-Kurzfassung mit Ampel, Laendertabelle, Pruefquellen, Prioritaeten und empfohlenen Massnahmen.
## H317 - Geloeschte alte Fassung
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Geloeschte alte Fassung
Die alte Fassung `docs/FINANCE_CHEF_SUMMARY_2026-05-13.docx` wurde entfernt, weil sie durch die Version vom 2026-05-15 ersetzt ist.
## H318 - Entscheidbasis
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Entscheidbasis
Die fachlichen Entscheide stehen separat hier:
```text
entscheide.md
docs/FINANCE_ENTSCHEIDE.md
```
Kurzfassung der wichtigsten Entscheide:
| Thema | Entscheid |
| --- | --- |
| Fuehrende Waehrung | Hauswaehrung je Land |
| CHF-Sicht | Nur separat mit Budgetkursen |
| Aggregation | Pro Artikel bzw. Belegposition |
| Wertbasis | Nettofakturawert |
| Jahresabgrenzung 2025 | Buchungsdatum |
| Gutschriften / Storno | Separat ausweisen, positionsbasiert behandeln |
| Intercompany / 2nd-party | Separat klassifizieren und als Auswahl/Sicht fuehren |
| Indien | INR ist fuehrend |
| Italien | Hauswaehrung, Intercompany separat pruefen |
## H319 - Wichtig fuer Rueckfragen
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Wichtig fuer Rueckfragen
Falls im Termin gefragt wird, ob die Berechnungslogik schon entschieden ist:
> Ja. Die Grundlogik ist entschieden: Hauswaehrung, Nettofakturawert, Buchungsdatum und Berechnung pro Belegposition. Offen sind vor allem Datenvollstaendigkeit, Intercompany-Abgrenzung, Budgetkursquelle und die fachliche Freigabe einzelner Laenderabweichungen.
## H320 - Was noch nicht final ist
Quelle: FINANCE_WELCHES_DOKUMENT_GILT_2026-05-15.md.raw
## Was noch nicht final ist
| Thema | Status |
| --- | --- |
| IT | Kritisch; grosse Abweichung, Berechnungsart/IC/Deduplizierung pruefen |
| UK / EN | Hoch; Restdifferenz und Jahresvollstaendigkeit pruefen |
| DE | Hoch; finaler Jahresfile fehlt, Sample nicht verwenden |
| CH / AT | Hoch; Sollzuordnung und Trennung finalisieren |
| ES / AT | Mittel; kleinere Differenzen klaeren |
| FR / IN / US | Rechnerisch freigabefaehig |
## H321 - Email an Spanien: Abweichung Net Sales 2025
Quelle: FINANCE_ES_MAIL_ABWEICHUNG_2026-05-15.md.raw
# Email an Spanien: Abweichung Net Sales 2025
**Asunto:** Revision diferencia Net Sales 2025 - Espana
Hola,
En la reconciliacion de Net Sales 2025 para Espana hemos identificado una diferencia pendiente de aclarar contra el valor de referencia de Rhino / `check.xlsx`.
Resumen:
- Actual Espana: `3.082.320,18 EUR`
- Referencia Rhino: `3.102.333,61 EUR`
- Diferencia: `-20.013,43 EUR`
La diferencia no parece muy grande, pero antes de cerrar el dato necesitamos confirmar la causa.
Por favor, podeis revisar los siguientes puntos?
1. Periodo incluido en el fichero
Confirmar que el fichero `Spain_Sales_2025.csv` contiene todo el ano 2025 completo.
2. Series incluidas
Confirmar que las series `REG`, `LAT`, `PRO` y `REC` deben incluirse en el calculo de Net Sales 2025.
3. Abonos / Credit Notes
Confirmar que los abonos estan incluidos correctamente y con signo negativo.
4. Criterio de fecha
Confirmar que fecha debe utilizarse para la delimitacion del ano 2025: fecha de factura, fecha contable u otra fecha.
5. Importe correcto
Confirmar si el campo utilizado como importe neto de ventas es el correcto para comparar contra Rhino / `check.xlsx`.
Objetivo: aclarar si la diferencia de `-20.013,43 EUR` se explica por periodo, series, abonos o por el campo de importe utilizado.
Gracias y saludos,
## H322 - Email an Italien: Abweichung Net Sales 2025
Quelle: FINANCE_IT_MAIL_ABWEICHUNG_2026-05-15.md.raw
# Email an Italien: Abweichung Net Sales 2025
**Oggetto:** Verifica differenza Net Sales 2025 - Italia
Ciao,
nella riconciliazione dei Net Sales 2025 per l'Italia abbiamo identificato una differenza significativa rispetto al valore di riferimento Rhino / `check.xlsx`.
Riepilogo:
- Actual Italia: `14.704.336,29 EUR`
- Riferimento Rhino: `7.669.840,00 EUR`
- Differenza: `+7.034.496,29 EUR`
La differenza e molto rilevante. Prima di chiudere il dato dobbiamo confermare quale logica di calcolo e corretta per l'Italia.
Potete per favore verificare i seguenti punti?
1. Base di calcolo corretta
Confermare quale valore deve essere usato per i Net Sales 2025: valore netto per riga/posizione, totale documento deduplicato oppure un'altra logica.
2. Totali documento vs. posizioni
Verificare se i totali documento sono ripetuti su piu righe e quindi devono essere conteggiati una sola volta per documento.
3. Intercompany / 2nd-party
Confermare quali clienti o transazioni devono essere esclusi come Intercompany o 2nd-party.
4. Note di credito / Credit Notes
Confermare che le note di credito sono incluse correttamente e con segno negativo.
5. Criterio data
Confermare quale data deve essere utilizzata per delimitare il 2025: data registrazione, data fattura o altra data.
6. Valuta
Confermare che la valuta di confronto per l'Italia e `EUR`.
Obiettivo: capire se la differenza di `+7.034.496,29 EUR` deriva da doppio conteggio dei documenti, trattamento Intercompany, criteri data o dal campo importo utilizzato.
Grazie e saluti,
## H323 - Email an UK / England: Abweichung Net Sales 2025
Quelle: FINANCE_UK_MAIL_ABWEICHUNG_2026-05-15.md.raw
# Email an UK / England: Abweichung Net Sales 2025
**Subject:** Review difference Net Sales 2025 - UK
Hi,
In the Net Sales 2025 reconciliation for UK / England, we identified a difference against the Rhino / `check.xlsx` reference value.
Summary:
- Actual UK: `3,533,710.09 GBP`
- Rhino reference: `3,749,865.00 GBP`
- Reference UK LC/GBP: `3,538,972.00 GBP`
- Difference: `-5,261.91 GBP`
The mapping has already been reviewed technically, but we still need to clarify the remaining difference before closing the 2025 value.
Important clarification: UK / England is treated as a Sage source. The current SharePoint folder name `UK_B1` is only a technical folder/source reference and does not mean that UK is read from SAP Business One.
Could you please check the following points?
1. Full-year completeness
Confirm that the UK source file/import contains the full year 2025 and not only a partial period.
2. Period included
We currently see data from approximately `03.01.2025` to `22.12.2025`. Please confirm whether this is complete for 2025 or if transactions outside this range are missing.
3. Credit notes
Confirm that credit notes are included correctly and with the correct negative sign.
4. Net sales field
Confirm which column should be used as the net sales amount for comparison with Rhino / `check.xlsx`.
5. Discounts, freight or additional charges
Please check whether discounts, freight, additional charges or other adjustments are included in the Rhino reference but not in the current import value, or vice versa.
6. 2nd-party / 3rd-party / Intercompany
Confirm whether any customers or transactions should be excluded from the Net Sales 2025 value.
7. Currency
Confirm that the correct comparison currency for UK is `GBP`.
Goal: clarify whether the difference of `-216,154.91 GBP` is caused by an incomplete period, credit notes, a different net sales field, adjustments, or 2nd-party/3rd-party handling.
Thanks and best regards,