# Finance-Entscheide fuer Net Sales Actuals Stand: 2026-06-01 ## Nachtrag 2026-06-01 Finance-Sitzung Umgesetzt: - ES-Referenz 2025 ist auf `3'082'320.18 EUR` korrigiert; alter Sollwert `3'102'333.61 EUR` war Referenz-/Excel-Fehler. - `Management Analyse > Laender` zeigt IC/2nd-party und `Ist ohne IC` als Diagnosewerte. - Wechselkurs-Anwendungsdatum ist in den Settings konfigurierbar und wird in der Rohdaten-Diagnose angezeigt. - Sparten-Materialabgleich normalisiert fuehrende Nullen; bei >=90% nicht zugeordnet / nicht im TR-AG-Stamm wird ein Warnhinweis angezeigt. Weiter fachlich zu klaeren: - Pro Standort bestaetigen, ob Intercompany bereits in der gelieferten Quelle herausgerechnet ist. - Fuer Wechselkurse final bestaetigen, ob `PostingDate`, `InvoiceDate` oder ein anderes Datum fuehrend ist. - Spartenanalyse fachlich pruefen, falls die ungeklaerte Abdeckung weiterhin extrem hoch bleibt. ## Nachtrag 2026-05-20 Finance Summary / Management Analyse Aktueller Produktstand: - Das zentrale Excel enthaelt das Blatt `Finance Summary`. - `Management Analyse` hat einen fuehrenden Reiter `Finance Summary`. - Dieser Reiter nutzt dieselbe `FinanceRuleEngine` wie das zentrale Excel. - Filter fuer Jahr, Land und Waehrung wirken auf das Finance-Endergebnis. - Die alte Management-/Rohdatenansicht bleibt nur als Diagnose-/Plausibilitaetssicht erhalten. - DE 2026 zeigt keinen Fehler mehr, sondern wegen DE/Alphaplan-2025-Zwang einen leeren Zustand mit Hinweis. Anwenderdoku: - `docs/FINANCE_COCKPIT_ANLEITUNG_FINANZ_2026-05-20.docx` - `docs/finance_cockpit_preview.png` Validierung: - `dotnet test TrafagSalesExporter.sln --verbosity minimal` - Ergebnis: `77/77` Tests gruen. Dieses Dokument haelt die fachlichen Entscheide fuer den Finance-Abgleich fest. Es ist die verbindliche Grundlage fuer das Testprogramm, die zentrale Tabelle und den Soll/Ist-Abgleich gegen `check.xlsx`. ## Grundsatz Net Sales Actuals werden pro Land aus dem Landessystem gelesen, in der fachlich fuehrenden Hauswaehrung bewertet und gegen die Sollwerte aus `check.xlsx` verglichen. Die Logik darf nicht auf einzelne Testzahlen optimiert werden. Sie muss je Jahr gleich funktionieren, sofern Sollwerte und Budgetkurse fuer das jeweilige Jahr gepflegt sind. ## Entscheide | Thema | Entscheid | | --- | --- | | Fuehrende Waehrung | Immer Hauswaehrung des Landessystems. | | CHF-Umrechnung | Nur als separater Kontroll-/Reporting-Kandidat ueber Budgetkurse. Keine SNB-Tageskurse fuer den Standardabgleich. | | Aggregation | Pro Artikel bzw. Belegposition rechnen und summieren. | | Wertbasis | Nettofakturawert. | | Jahresabgrenzung | Buchungsdatum. | | Gutschriften/Storno | Separat als eigene Beleg-/Positionszeilen ausweisen. Immer ueber Artikelnummer/Positionslogik behandeln. | | Intercompany | In einem zweiten Schritt als 2nd-party/IC ausweisen. Nicht still aus dem Standard-Ist entfernen. | ## Landesspezifische Praezisierungen | Land | Entscheid / Regel | | --- | --- | | IN | Immer indische Rupien (`INR`) als Hauswaehrung. Gemischte Belegwaehrungen duerfen nicht als fachliche Summenwaehrung ausgewiesen werden. | | IT | Hauswaehrung verwenden. Intercompany separat ausweisen und weiter fachlich abgrenzen. | | UK | Sage/Manual-Excel. Hauswaehrung `GBP` verwenden. Netto ohne VAT; Credit Notes muessen negativ in die Summe laufen. | | CH / AT | SAP-ZSCHWEIZ liefert Schweiz und Oesterreich aus gleichem System; Trennung ueber Buchungskreis bzw. Reporting-Land. | | DE | Alphaplan-Excel; finaler Jahresfile `docs/2025_DataExport_DE.xlsx` liegt vor. Provisorisches Mapping nutzt `NettoPreisGesamtX` als SalesPriceValue. Fachlich offen bleibt, welche Kundenlaender fuer den Sollwert eingeschlossen werden. | | ES | Sage-CSV. `ImporteNeto` als Nettozeile ohne VAT verwenden; Credit Notes/REC negativ; Datumsbasis ist `FechaFactura`, solange Finance nichts anderes vorgibt. | ## Intercompany / 2nd Party Intercompany wird ueber stabile Kundenregeln klassifiziert. Aktuelle fachliche Marker: - `TRAFAG` - `MAGNETIC SENSE` - `MAGNETS SENSE` - `GESELLSCHAFT FUER SENSORIK` - `GESELLSCHAFT FUR SENSORIK` Weitere Uebersetzungen, Kundennummern oder lokale Schreibweisen muessen bei Bedarf ergaenzt werden. Ergebnis im Reporting: - Standard-Ist bleibt inklusive aller Positionen. - 2nd-party/IC wird als separater Betrag und als Sicht "ohne 2nd-party" gezeigt. - Finance entscheidet danach, ob und wo IC fuer offizielle Abgrenzungen ausgeschlossen wird. ## Technische Umsetzung im Programm | Regel | Umsetzung | | --- | --- | | Buchungsdatum | `PostingDate` in `SalesRecord` und `CentralSalesRecord`; Finance-Abgleich filtert nach `PostingDate`. | | Fallback Datum | Nur falls Quelle kein Buchungsdatum liefert: `InvoiceDate`, danach `ExtractionDate`. | | Hauswaehrung | Finance-Abgleich weist bekannte Land-Hauswaehrungen aus, z. B. `INR` fuer Indien und `GBP` fuer UK. | | Nettofakturawert | Kandidat `Nettofakturawert Hauswaehrung pro Position`. | | B1-Belegkopfwerte | Wiederholte `DocTotal - VatSum`-Werte werden erkannt, damit Belegkopfwerte nicht pro Position multipliziert werden. | | Budget-CHF | Budgetkurs-Kandidat wird aus Hauswaehrung pro Position gerechnet. | | IC | `FinanceIntercompanyRules` klassifizieren 2nd-party/IC. | ## Aktuelle Kontrollpunkte - UK: Aktuell `3'533'710.09 GBP` bei `1'880` Zeilen gegen Soll LC `3'538'972.00 GBP`; Differenz `-5'261.91 GBP`. UK wird gegen Local Currency/GBP geprueft; der fruehere `CheckValue 3'749'865.00` ist fuer UK entfernt. Mapping ist Sage-Netto: `Sales Price/Value * Quantity`, Credit Notes werden bei erkennbarem Sage-Typ negativ erzwungen. - IN: Anzeige muss fachlich `INR` zeigen, auch wenn Quellzeilen verschiedene Belegwaehrungen enthalten. - IT: IC-Kundenliste final bestaetigen. - CH / AT: echtes SAP-Buchungsdatum pruefen, falls `ZSCHWEIZ` aktuell nur Fakturadatum liefert. - DE: finaler Alphaplan-Jahresfile liegt vor und ist technisch mappbar. Rohsumme `NettoPreisGesamtX` komplett ist `4'154'690.05 EUR`; nur `Land Kunde = Deutschland` ist `3'455'276.64 EUR`; Sollwert ist `3'635'923.00 EUR`. Offene Fachfrage: welche Kundenlaender/Abgrenzungen gehoeren offiziell zu DE? - ES: `3'082'320.18 EUR` ist laut Sitzung fachlich plausibel und entspricht der korrigierten Referenz. CSV nutzt `ImporteNeto`; Credit Notes/REC sind negativ. Der fruehere Sollwert `3'102'333.61` war ein Referenz-/Excel-Fehler. ## Pruefstand 2026-05-11 Die Finance-Regeln wurden im Code abgesichert und mit Tests geprueft. Geprueft: - Finance-Abgleich nutzt `PostingDate` fuer die Jahresabgrenzung. - FinanceProbe-Coverage nutzt ebenfalls `PostingDate`. - Indien wird in der Finance-Logik als `INR`-Hauswaehrung ausgewiesen, auch wenn die Quellzeilen verschiedene Belegwaehrungen enthalten. - UK wird als `GBP`-Hauswaehrung ausgewiesen. - Wiederholte B1-Belegkopfwerte werden erkannt, damit `DocTotal - VatSum` nicht pro Position multipliziert wird. - 2nd-party/IC bleibt separat sichtbar. Testergebnis: ```text dotnet test .\TrafagSalesExporter.Tests\TrafagSalesExporter.Tests.csproj --no-restore -p:UseAppHost=false --verbosity minimal ``` Ergebnis: ```text 58/58 Tests gruen ``` Bekannte Warnungen: - MudBlazor Analyzer meldet bestehende `Dense`-Attribute in einzelnen Razor-Komponenten. - NuGet-Sicherheitsdaten konnten lokal nicht von `api.nuget.org` geladen werden. ## UK / England Befund England/UK ist im System vorhanden und wird im FinanceProbe-Abgleich angezeigt. Aktueller Befund aus der Probe: | Kennzahl | Wert | | --- | ---: | | Land | UK / England | | TSC | `TRUK` | | Hauswaehrung | `GBP` | | Geladene Zeilen | `1'881` | | Ist-Wert | `395'605.82 GBP` | | Sollwert check.xlsx | `3'749'865.00` | | Differenz | `-3'354'259.18` | Interpretation: - Die UK-Zahl ist fachlich nicht plausibel als Jahreswert. - Wahrscheinlich wurde nur eine Teilmenge bzw. eine Monatsdatei geladen. - Der SharePoint-Ordner `Import/Finance/UK_B1` enthaelt Dateien nach Muster `ddMMyy_TRUK.xlsx`, z. B. `010426_TRUK.xlsx` und `010526_TRUK.xlsx`. - Die App soll die neueste passende Datei lesen. Fuer einen Jahresvergleich muss geklaert werden, ob die neueste Datei kumulierte Jahresdaten oder nur Monatsdaten enthaelt. Naechster fachlicher Check fuer UK: - Bestaetigen, ob `010526_TRUK.xlsx` kumuliert Januar bis Mai oder nur Mai enthaelt. - Falls Monatsdateien geliefert werden, muss Finance entscheiden: - alle Monatsdateien 2025 aufsummieren, oder - nur einen kumulierten Jahresfile lesen. ## Nachtrag 2026-05-11: UK_B1 Mapping Der UK-Befund wurde nachtraeglich technisch untersucht. Wichtige Feststellungen: - Korrektur 2026-05-18: England / UK ist fachlich Sage, nicht SAP B1. - `UK_B1` ist im aktuellen Projektstand der SharePoint-Ordner- bzw. Quellreferenzname, aber keine Aussage, dass UK ueber SAP Business One / B1-HANA gelesen wird. - Der Standort ist `England`, `TSC = TRUK`, `SourceSystem = MANUAL_EXCEL`. - Der korrekte SharePoint-Ordner ist: ```text https://trafagag.sharepoint.com/sites/WorldwideBIPlatform/Import/Finance/UK_B1 ``` - Lokal war fuer `TRUK` kein grafisches Manual-Excel-Mapping vorhanden. - Dadurch hat der Fallback-Importer `Sales Price/Value` direkt als Positionswert uebernommen. - In der UK-Sage-Datei ist `Sales Price/Value` aber ein Stueckpreis. - Der fachliche Positionswert muss pro Belegposition berechnet werden: ```text Positionswert = [Sales Price/Value] * [Quantity] ``` Technische Probe auf den bereits importierten UK-Zeilen: | Variante | Wert | | --- | ---: | | Bisherige Summe `SalesPriceValue` | `395'605.82 GBP` | | Rekonstruierte Summe `SalesPriceValue * Quantity` | `3'533'348.89 GBP` | | Sollwert check.xlsx | `3'749'865.00 GBP` | | Restdifferenz nach Multiplikation | ca. `-216'516.11 GBP` | Bewertung: - Die grosse UK-Abweichung war hauptsaechlich ein Mapping-Fehler. - Nach korrekter Multiplikation bleibt eine relevante Restdifferenz. - Diese Restdifferenz muss gegen UK-/Sage-spezifische Netto-/Discount-/Fracht-/Nebenpositionsspalten oder eine andere Abgrenzung im UK-Export geprueft werden. - Die bisherige Interpretation "nur Monatsfile/Teilmenge" ist nicht mehr die wahrscheinlichste Hauptursache, bleibt aber als Datenvollstaendigkeitscheck offen. - UK darf nicht mit B1-Belegkopfregeln von FR/IT verwechselt werden. Ziel-Mapping fuer `TRUK`: | Zielfeld | Quelle | | --- | --- | | `Tsc` | `TSC` | | `Land` | `Land` | | `InvoiceNumber` | `Invoice Number` | | `PositionOnInvoice` | `Position on invoice` | | `Material` | `Material` | | `Name` | `Name` | | `ProductGroup` | `Product Group` | | `Quantity` | `Quantity` | | `CustomerNumber` | `Customer number` | | `CustomerName` | `Customer name` | | `CustomerCountry` | `Customer country` | | `SalesPriceValue` | `=[Sales Price/Value]*[Quantity]` | | `SalesCurrency` | `=GBP` | | `DocumentCurrency` | `=GBP` | | `CompanyCurrency` | `=GBP` | | `PostingDate` | `invoice date` | | `InvoiceDate` | `invoice date` | | `DocumentType` | `=Manual Excel` | Code-Stand dazu: - `ManualExcelImportService` unterstuetzt im grafischen Manual-Excel-Mapping einfache Multiplikationsausdruecke mit Excel-Headern: ```text =[Header A]*[Header B] ``` - Konstanten wie `=GBP` funktionieren unveraendert. - `DatabaseSeedService` repariert den alten/falschen England-Pfad auf `UK_B1` und seedet das `TRUK`-Mapping. - Ein Unit-Test prueft, dass `SalesPriceValue = [Sales Price/Value] * [Quantity]` korrekt gelesen wird. Aktueller Verifikationsstand: - Die neue UK-Mapping-Logik ist implementiert. - `DatabaseSeedService` seedet das UK-Mapping nur, wenn `ManualExcelColumnMappings` sauber auf `Sites` referenziert. - Damit blockieren alte SQLite-Reparaturreferenzen wie `Sites_repair_old` den Initialisierungslauf nicht mehr. - Der volle Testlauf ist gruen: ```text 59/59 Tests gruen ``` Naechster praktischer Schritt: - App oder FinanceProbe starten, damit die lokale DB den Seed/Repair bekommt. - Danach UK per `/run/export/TRUK` gegen SharePoint `UK_B1` neu laden. - Anschliessend `/finance` erneut gegen `check.xlsx` pruefen. Praktischer Nachtrag: - Lokale DB ist aktualisiert: `TRUK` hat den `UK_B1`-Pfad und `18` aktive Mapping-Zeilen. - FinanceProbe laeuft auf `http://127.0.0.1:5099` und `/finance` antwortet. - Der neue `/run/export/TRUK`-Lauf konnte noch nicht abgeschlossen werden, weil die lokale SharePoint-/Graph-Authentifizierung scheitert: ```text ClientSecretCredential authentication failed 127.0.0.1:9 connection refused ``` - Bis dieser Zugriff funktioniert, bleibt `CentralSalesRecords` fuer UK auf dem alten Importstand.