Files
Ai/TrafagSalesExporter/docs/FINANCE_ENTSCHEIDE.md
T

240 lines
10 KiB
Markdown

# Finance-Entscheide fuer Net Sales Actuals
Stand: 2026-05-11
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 erforderlich. Sample darf nicht als Jahres-Ist verwendet 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 `3'749'865.00`; Differenz `-216'154.91 GBP`. Mapping ist nun 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: finalen Jahresfile laden.
- ES: Aktuell `3'082'320.18 EUR` gegen Soll `3'102'333.61`; Differenz `-20'013.43 EUR`. CSV nutzt `ImporteNeto`; Credit Notes/REC sind negativ. Offen bleiben Perioden-/Serienabgrenzung und ob Rhino eine andere Sage-Auswertung nutzt.
## 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.