16 KiB
Last Change 2026-05-04
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.xlsxvergleichen
Wichtiges fachliches Verstaendnis nach Klaerung im Chat:
check.xlsxkommt 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.
Commit
Rollback-Commit fuer die Finance-Probe wurde erstellt:
15dec06 Add finance reconciliation probe
Dieser Commit enthaelt gezielt:
Services/FinanceReconciliationService.csTools/FinanceProbe/FinanceProbe.csprojTools/FinanceProbe/Program.cs- DI-Registrierung in
Program.cs - Dashboard nutzt den ausgelagerten Finance-Service
TrafagSalesExporter.csprojschliesstTools/**aus dem Hauptprojekt ausTrafagSalesExporter.slnenthaelt das neue Tool-Projekt
Andere bereits vorhandene Worktree-Aenderungen wurden nicht mitcommitted.
Neues Tool
Neues separates Probe-GUI:
Tools/FinanceProbe
Start:
dotnet run --project Tools\FinanceProbe\FinanceProbe.csproj --urls http://localhost:55417
URL:
http://localhost:55417/finance
Aktueller Start im Chat:
- Probe-GUI wurde auf
localhost:55417gestartet - HTTP
200bestaetigt
Hinweis Netzwerk:
- Start mit
localhostist 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:55417noetig. - Probe-GUI hat aktuell keine Authentifizierung, daher nicht unkontrolliert im Netzwerk freigeben.
FinanceReconciliationService
Neue wiederverwendbare Logik:
Services/FinanceReconciliationService.cs
Interface:
IFinanceReconciliationService
Aktuelle Funktion:
Task<List<NetSalesReferenceRow>> BuildNetSalesReferenceRowsAsync(int year = 2025)
Logik:
- liest
CentralSalesRecords - filtert Jahr ueber
InvoiceDate, fallbackExtractionDate - gruppiert pro Referenz-Key/Land
- berechnet Kandidaten:
SalesPriceValueDocTotalFC - VatSumFCDocTotal - VatSum
- Belegkopfwerte werden vor Summierung dedupliziert:
- bevorzugt
TSC + DocumentType + DocumentEntry - fallback
TSC + DocumentType + InvoiceNumber
- bevorzugt
- erkennt aktuell Intercompany nur pragmatisch fuer IT/TRIT anhand bekannter Kunden
- liefert pro Kandidat Wert, Waehrung, IC-Wert, Differenzen
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 BIist in der Probe-Oberflaeche noch sichtbar, weilcheck.xlsxdiese 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 SollwertoderRhino Sollwertumzubenennen.
Probe-Output vom 2026-05-04 09:55
Zusammenfassung:
8 Standorte
4 OK
1 Pruefen
3 Keine Daten
Excel-Referenzen gelesen: 17
Befunde:
CH
- Keine Ist-Daten
- keine sichtbare Soll-Zahl
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
- Referenz ca.
Offen:
- Quelle fuer DE klaeren
- evtl. MANUAL_EXCEL oder noch nicht exportiert
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
- Referenz ca.
Offen:
- Quelle fuer ES klaeren
- evtl. MANUAL_EXCEL oder noch nicht exportiert
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/Valuein EUR.
Offene Frage an Andreas:
- Ist
Sales Price/Valuein EUR fuer FR fachlich korrekt?
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?
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?
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/Valuein USD.
Offene Frage an Andreas:
- Ist USD fuer UK korrekt?
- Oder muss fuer offizielles Reporting nach CHF umgerechnet werden?
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?
Word-Datei fuer Andreas
Erstellt:
FINANZ_OFFENE_FRAGEN_ANDREAS.docx
Inhalt:
- kurze Mail an Andreas
check.xlsxals 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
Markdown-Datei fuer Andreas
Erstellt/angepasst:
FINANZ_FRAGEN_ANDREAS.md
Aktuelle Formulierung:
check.xlsxkommt 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.
Verifikation
Ausgefuehrt:
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/48Tests gruen
Bekannte Warnungen:
NU1900im Probe-Build, weil NuGet-Sicherheitsdaten wegen Netzwerk/nuget.org nicht geladen werden konnten- bekannte MudBlazor Analyzer-Warnungen zu
Dense
Offene sinnvolle naechste Schritte
- In der Probe-UI
Power BI-Labels fachlich bereinigen:- z. B.
Excel Sollwert/Rhino Sollwert
- z. B.
- Andreas' Antworten in eine Konfiguration ueberfuehren:
- Land/System
- Summenlogik
- System-Waehrung
- CHF-Umrechnung ja/nein
- Periodendatum
- IC-Regel
- DE/ES Quelle klaeren:
- aktuell keine Ist-Daten
- US/UK Doppelwert pruefen:
- US zeigt denselben Ist-Wert wie UK
- IT Intercompany-Regel fachlich bestaetigen
- Wenn Regeln bestaetigt sind:
- Finance-Probe erweitert anzeigen
- spaeter produktiv ins Hauptprogramm uebernehmen
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-DatumFirmaBelegnummerPositionArtikelBezeichnungWarengruppen-BezeichnungAnz. VELieferanten NummerName LieferantLand LieferantAdressNummer-KundeName KundeLand KundeBrancheEinstandsPreisWährungBestellNummerNettoPreisEinzelXNettoPreisGesamtXVersandbedingungAdressNummer_VBelegdatum-RechnungBelegDatum AuftragArtikelNummer
Wichtige fachliche/technische Interpretation fuer Deutschland:
NettoPreisGesamtXwird alsSalesPriceValueverwendet.Währungwird fuerSalesCurrency,DocumentCurrency,CompanyCurrencyundStandardCostCurrencyverwendet.Belegdatum-Rechnungwird alsInvoiceDateverwendet.BelegDatum Auftragwird alsOrderDateverwendet.ArtikelNummerwird alsMaterialverwendet.- Kommentar-/Info-Zeilen ohne echte Position und ohne Betrag werden beim Import ignoriert.
Neue Datenstruktur
Neue Tabelle / neues Model:
ManualExcelColumnMappings
Models/ManualExcelColumnMapping.cs
Felder:
SiteIdTargetFieldSourceHeaderIsRequiredIsActiveSortOrder
Zweck:
- Pro Standort kann festgelegt werden, welche Excel-Spalte auf welches internes
SalesRecord-Feld gemappt wird. - Konstanten sind moeglich, wenn
SourceHeadermit=beginnt, z. B.=Manual Excel.
Geaenderte Hauptlogik
Geaendert:
Services/ManualExcelImportService.cs
Neue Logik:
- Beim manuellen Excel-Import werden zuerst aktive
ManualExcelColumnMappingsdes 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.
Geaenderte Standort-UI
Geaendert:
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.
Config-Export / Import
Geaendert:
Services/ConfigTransferService.cs
Models/ConfigTransferPackage.cs
Neu:
ManualExcelColumnMappingswerden im Konfigurationspaket mit exportiert.- Beim Import werden die Mapping-Zeilen wieder hergestellt.
Damit kann die Konfiguration spaeter zwischen Umgebungen mitgenommen werden.
Datenbank-Schema
Geaendert:
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.
Deutschland lokal eingerichtet
Am 2026-05-04 wurde Deutschland in der lokalen Datenbank direkt ohne UI eingerichtet.
Lokale DB:
C:\Users\koi\source\repos\Ai\TrafagSalesExporter\trafag_exporter.db
Gefundener/konfigurierter Standort:
Id=8
TSC=TRDE
Land=Deutschland
SourceSystem=MANUAL_EXCEL
Aktive Mapping-Zeilen:
26
Konkrete Zuordnung fuer DE:
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.dbgespeichert. - 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.
Tests
Ergaenzt:
TrafagSalesExporter.Tests/ManualExcelImportServiceTests.cs
Neuer Test:
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
NettoPreisGesamtXmit Schweizer Tausenderzeichen wird korrekt als Dezimalzahl gelesen- Waehrung
EURwird in Sales-/Document-/Company-Currency uebernommen - Rechnungsdatum und Auftragsdatum werden korrekt gelesen
Letzter bekannter Teststand nach Mapper-Arbeit:
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/49Tests gruen
Bekannte Warnung:
NU1900, weil NuGet-Sicherheitsdaten wegen Netzwerk/nuget.org nicht geladen werden konnten
Aktueller Laufstand
Die Haupt-App war nach der DE-Konfiguration erreichbar:
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.
Noch offen nach Excel-Spaltenmapper
- Mapper-Code committen, sobald der aktuelle Stand als Rollback-Punkt gesichert werden soll.
- In der Standort-UI Deutschland oeffnen und visuell pruefen, ob die 26 Mapping-Zeilen angezeigt werden.
- Mit echtem DE-Excel einen Importlauf testen.
- Danach Finance-Probe erneut pruefen:
- ob DE nicht mehr
Keine Datenist - ob
SalesPriceValuegegen Soll auscheck.xlsxpasst
- ob DE nicht mehr
- Falls weitere Laender eigene Excel-Formate liefern:
- nicht statischen Code bauen
- neues Mapping pro Standort pflegen
- Klaeren, ob DE fachlich
NettoPreisGesamtXin EUR als Ist-Wert verwenden soll oder ob CHF-Umrechnung noetig ist.