Commit pending finance and Power BI work

This commit is contained in:
2026-05-13 07:33:00 +02:00
parent 1cd0ad998f
commit 001e2a73d5
44 changed files with 3210 additions and 104 deletions
@@ -0,0 +1,237 @@
# 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 | Hauswaehrung `GBP` verwenden. Die aktuell geladene Zahl wirkt wie eine Teilmenge und muss gegen vollstaendige Jahresquelle geprueft werden. |
| 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-Excel/CSV; Serien, Gutschriften und Datumsbasis bleiben Kontrollpunkte bis fachlich final bestaetigt. |
## 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 ca. `395'605.82 GBP` bei `1'881` Zeilen gegen Soll `3'749'865.00`; Ursache ist primaer das fehlende UK-Manual-Mapping, weil `Sales Price/Value` als Stueckpreis statt als Positionswert gelesen wurde.
- 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: Serien und Gutschriften fachlich final bestaetigen.
## 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:
- Quelle bleibt `UK_B1`.
- 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-B1-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-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.
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.
+46 -1
View File
@@ -9,6 +9,10 @@ Fuer das Programm bieten sich zwei Diagrammarten an:
## Dateien
- `docs/FINANCE_ENTSCHEIDE.md`
- dokumentiert die verbindlichen Financechef-Entscheide fuer Waehrung, Budgetkurse, Nettofakturawert, Buchungsdatum, Gutschriften und Intercompany
- ist die fachliche Grundlage fuer FinanceProbe und den Soll/Ist-Abgleich
- `docs/program-user-stories.svg`
- zeigt Finance, Power User/Admin und IT/SAP als Rollen
- ordnet Stories nach Quellenpflege, Mapping, Import, Konsolidierung, Finance-Abgleich und Betrieb
@@ -20,6 +24,11 @@ Fuer das Programm bieten sich zwei Diagrammarten an:
- zeigt den zentralen Weg ueber grafisches Mapping, `MappedSalesRecordComposer`, `CentralSalesRecords`, Finance-Abgleich und Export
- markiert bewusste Rest-Doppelspuren wie HANA-B1-Legacy und den offenen Ausbau fuer Finance-Regelpflege
- `docs/finance-land-algorithms.svg`
- zeigt fuer Finance den buchhalterischen Fluss je Land
- beschreibt Quelle, Mapping, Hauswaehrung, Nettofakturawert, Buchungsdatum, IC-Ausweis und Sollvergleich
- macht sichtbar, dass der Algorithmus regelbasiert ist und nicht auf einzelne Testzahlen frisiert wurde
## Abgleich gegen Quellcode
Die Diagramme wurden gegen folgende Codebereiche abgeglichen:
@@ -37,9 +46,45 @@ Die Diagramme wurden gegen folgende Codebereiche abgeglichen:
Wichtige Praezisierung aus dem Code:
- `SalesPriceValue` wird im Finance-Abgleich positionsweise summiert.
- Belegkopfwerte wie `DocTotal - VatSum` werden vor der Summierung pro Beleg dedupliziert.
- `PostingDate` ist die fuehrende Jahresabgrenzung. Falls eine Quelle kein Buchungsdatum liefert, faellt der Code auf `InvoiceDate` und danach `ExtractionDate` zurueck.
- Hauswaehrung ist fuehrend. CHF wird als Budgetkurs-Kandidat gerechnet, nicht als Tageskurs-Standard.
- Belegkopfwerte wie `DocTotal - VatSum` werden nicht blind pro Position multipliziert. Der Code erkennt wiederholte Headerwerte und zeigt Positionswert sowie deduplizierten Belegwert als Kandidaten.
- Der ausgewaehlte Finance-Wert ist daher ein Ist-Kandidat, nicht pauschal immer eine Positionssumme.
## FinanceProbe starten
Normale Ansicht:
```powershell
dotnet run --project .\Tools\FinanceProbe\FinanceProbe.csproj --urls http://127.0.0.1:5099
```
Danach im Browser:
```text
http://127.0.0.1:5099/finance
```
Export-/Prueflaeufe:
```text
http://127.0.0.1:5099/run/export-all
http://127.0.0.1:5099/run/consolidated
http://127.0.0.1:5099/run/export/TRUK
```
Wenn der Build-Output durch ein laufendes Programm gesperrt ist, zuerst den alten `dotnet`-Prozess beenden oder ohne Rebuild die vorhandene DLL starten:
```powershell
dotnet .\Tools\FinanceProbe\bin\Debug\net8.0\FinanceProbe.dll --urls http://127.0.0.1:5099
```
Hinweis fuer das Testprogramm:
- FinanceProbe verwendet Console-Logging, damit lokale Windows-EventLog-Rechte den Prueflauf nicht abbrechen.
- Falls Visual Studio oder ein alter `dotnet`-Prozess DLLs sperrt, den Prozess beenden und danach neu bauen/starten.
- Der aktuelle Entwicklungs-Pruefstand wurde zusaetzlich mit einem separaten Output unter `.codex\memories\financeprobe_check\out` gebaut, um Build-Locks zu umgehen.
## Einsatz
Die SVG-Dateien koennen direkt im Browser geoeffnet, in Markdown verlinkt oder in Praesentationen eingefuegt werden.
@@ -0,0 +1,259 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1800" height="1450" viewBox="0 0 1800 1450" role="img" aria-labelledby="title desc">
<title id="title">Finance-Fluss je Land</title>
<desc id="desc">Blockdiagramm fuer den buchhalterischen Finanzfluss je Land vom Quellsystem bis zum Soll-Ist-Abgleich.</desc>
<defs>
<style>
.bg { fill: #f6f7f9; }
.panel { fill: #ffffff; stroke: #d8dee8; stroke-width: 1.4; rx: 8; }
.head { fill: #22324a; }
.source { fill: #e9f1fb; stroke: #8eb3df; }
.mapping { fill: #eef8f0; stroke: #8bc790; }
.finance { fill: #fff4e3; stroke: #e1a84d; }
.check { fill: #f4eefb; stroke: #b497d6; }
.warn { fill: #fff7cc; stroke: #d5b53b; }
.line { stroke: #7b8798; stroke-width: 1.5; fill: none; marker-end: url(#arrow); }
.title { font: 700 28px "Segoe UI", Arial, sans-serif; fill: #17202a; }
.subtitle { font: 400 15px "Segoe UI", Arial, sans-serif; fill: #667085; }
.h2 { font: 700 17px "Segoe UI", Arial, sans-serif; fill: #ffffff; }
.country { font: 700 16px "Segoe UI", Arial, sans-serif; fill: #17202a; }
.txt { font: 400 13px "Segoe UI", Arial, sans-serif; fill: #17202a; }
.small { font: 400 12px "Segoe UI", Arial, sans-serif; fill: #667085; }
.mono { font: 600 12px "Consolas", "Segoe UI", monospace; fill: #17202a; }
</style>
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto" markerUnits="strokeWidth">
<path d="M0,0 L8,3 L0,6 Z" fill="#7b8798"/>
</marker>
</defs>
<rect class="bg" x="0" y="0" width="1800" height="1450"/>
<text class="title" x="48" y="58">Finance-Fluss je Land: was buchhalterisch im Hintergrund passiert</text>
<text class="subtitle" x="48" y="86">Zielbild fuer Finance: je Land wird der Nettofakturawert in Hauswaehrung pro Position gelesen, per Buchungsdatum abgegrenzt und gegen check.xlsx verglichen.</text>
<rect class="panel" x="48" y="118" width="1704" height="130"/>
<rect class="head" x="48" y="118" width="1704" height="34" rx="8"/>
<text class="h2" x="68" y="141">Globale Finance-Regeln</text>
<text class="txt" x="70" y="176">1. Datumsabgrenzung: Buchungsdatum. Technischer Fallback, falls Quelle kein Buchungsdatum liefert: Fakturadatum, danach Extraktionsdatum.</text>
<text class="txt" x="70" y="200">2. Waehrung: Hauswaehrung ist fuehrend. CHF wird nur als eigener Kandidat ueber Budgetkurs gerechnet, nicht mit Tageskurs.</text>
<text class="txt" x="70" y="224">3. Wertbasis: Nettofakturawert pro Belegposition. Wiederholte B1-Belegkopfwerte werden erkannt, damit DocTotal nicht pro Position multipliziert wird.</text>
<text class="txt" x="945" y="176">4. Gutschriften/Storno: eigene Beleg-/Positionszeilen bleiben sichtbar und laufen ueber Artikel/Position.</text>
<text class="txt" x="945" y="200">5. Intercompany: 2nd/3rd Party wird separat ausgewiesen; der Abzug ist Kontrollsicht, nicht stiller Standardabzug.</text>
<text class="txt" x="945" y="224">6. Sollwert: FinanceReferences/check.xlsx je Jahr; gleiche Logik funktioniert fuer andere Jahre mit passenden Sollwerten und Budgetkursen.</text>
<rect class="panel" x="48" y="278" width="1704" height="148"/>
<rect class="head" x="48" y="278" width="1704" height="34" rx="8"/>
<text class="h2" x="68" y="301">Zentraler Algorithmus im Programm</text>
<g transform="translate(78 332)">
<rect class="source" x="0" y="0" width="245" height="64" rx="6"/>
<text class="txt" x="16" y="25">Landesquelle lesen</text>
<text class="small" x="16" y="46">SAP OData, HANA, Excel/CSV</text>
<path class="line" d="M245 32 H305"/>
<rect class="mapping" x="305" y="0" width="250" height="64" rx="6"/>
<text class="txt" x="321" y="25">Grafisches Mapping</text>
<text class="small" x="321" y="46">Zielmodell SalesRecord</text>
<path class="line" d="M555 32 H615"/>
<rect class="mapping" x="615" y="0" width="250" height="64" rx="6"/>
<text class="txt" x="631" y="25">Zentrale Tabelle</text>
<text class="small" x="631" y="46">CentralSalesRecords</text>
<path class="line" d="M865 32 H925"/>
<rect class="finance" x="925" y="0" width="285" height="64" rx="6"/>
<text class="txt" x="941" y="25">FinanceReconciliationService</text>
<text class="small" x="941" y="46">Jahr, Hauswaehrung, Netto, IC</text>
<path class="line" d="M1210 32 H1270"/>
<rect class="check" x="1270" y="0" width="285" height="64" rx="6"/>
<text class="txt" x="1286" y="25">Vergleich gegen Soll</text>
<text class="small" x="1286" y="46">FinanceReferences / check.xlsx</text>
</g>
<g transform="translate(48 466)">
<rect class="head" x="0" y="0" width="1704" height="34" rx="8"/>
<text class="h2" x="20" y="23">Landesspezifische Fluesse</text>
<!-- row helper coordinates: x source 20, map 310, finance 600, check 965, note 1270 -->
<g transform="translate(0 54)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">CH / AT</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">SAP ZSCHWEIZ OData</text>
<text class="small" x="151" y="55">BUKRS 1100=CH, 1200=AT</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Mapping ZSCHWEIZSet</text>
<text class="small" x="451" y="55">LAND1/TSC trennt CH und AT</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">NETWR_HC pro Position</text>
<text class="small" x="761" y="55">Hauswaehrung CHF/EUR, FKDAT aktuell als Datum</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Soll je Land</text>
<text class="small" x="1161" y="55">CH und AT separat in FinanceReferences</text>
<rect class="warn" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Offen</text>
<text class="small" x="1456" y="55">echtes SAP-BUDAT noch klaeren/mappen</text>
</g>
<g transform="translate(0 158)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">FR</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">BI1 / SAP B1 HANA</text>
<text class="small" x="151" y="55">OINV/INV1, ORIN/RIN1</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Legacy B1 oder grafisches HANA</text>
<text class="small" x="451" y="55">DocDate=PostingDate, TaxDate=InvoiceDate</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Positions-Netto in Hauswaehrung EUR</text>
<text class="small" x="761" y="55">keine DocTotal-Multiplikation</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll FR</text>
<text class="small" x="1161" y="55">bisher nahe an check.xlsx</text>
<rect class="mapping" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">IC sichtbar</text>
<text class="small" x="1456" y="55">2nd/3rd Party Kandidat</text>
</g>
<g transform="translate(0 262)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">IT</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">BI1 / SAP B1 HANA</text>
<text class="small" x="151" y="55">Italien ist B1</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Hauswaehrung EUR</text>
<text class="small" x="451" y="55">B1-Headerwerte werden erkannt</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Netto nach Position, IC separat</text>
<text class="small" x="761" y="55">Trafag/Magnetic Sense usw. als 2nd Party</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll IT</text>
<text class="small" x="1161" y="55">mit und ohne IC-Deduction sichtbar</text>
<rect class="warn" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Kontrollpunkt</text>
<text class="small" x="1456" y="55">IC-Kundenliste finalisieren</text>
</g>
<g transform="translate(0 366)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">UK</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">SharePoint Excel</text>
<text class="small" x="151" y="55">neueste Datei ddMMyy_TRUK.xlsx</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Manual Excel Mapper</text>
<text class="small" x="451" y="55">Hauswaehrung GBP fuehrend</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Delta/neueste Datei lesen</text>
<text class="small" x="761" y="55">Netto pro Position, Jahr nach Buchungsdatum</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll UK</text>
<text class="small" x="1161" y="55">Reporting in GBP, CHF nur Kandidat</text>
<rect class="mapping" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Quelle bleibt Ordner</text>
<text class="small" x="1456" y="55">Export in gleichen SharePoint-Ort</text>
</g>
<g transform="translate(0 470)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">IN</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">SAGE / HANA</text>
<text class="small" x="151" y="55">Indien wird als INR gefuehrt</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Waehrung normalisieren</text>
<text class="small" x="451" y="55">Hauswaehrung INR statt Belegmix</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Nettofakturawert INR</text>
<text class="small" x="761" y="55">Budget-CHF nur Kontrollkandidat</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll IN</text>
<text class="small" x="1161" y="55">bisher nahe an check.xlsx</text>
<rect class="warn" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Kontrollpunkt</text>
<text class="small" x="1456" y="55">keine gemischten Belegwaehrungen summieren</text>
</g>
<g transform="translate(0 574)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">ES</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">SAGE Export Excel/CSV</text>
<text class="small" x="151" y="55">SharePoint oder lokales File</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Manual Excel/CSV Mapper</text>
<text class="small" x="451" y="55">LineRegistrationDate als Buchungsdatum</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Netto pro Position in EUR</text>
<text class="small" x="761" y="55">CSV und XLSX technisch erlaubt</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll ES</text>
<text class="small" x="1161" y="55">Differenz fachlich klaeren</text>
<rect class="warn" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Kontrollpunkt</text>
<text class="small" x="1456" y="55">Serien/Gutschriften bestaetigen</text>
</g>
<g transform="translate(0 678)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">DE</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">Alphaplan Excel</text>
<text class="small" x="151" y="55">Jahresfile von Deutschland</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">Manual Excel Mapper</text>
<text class="small" x="451" y="55">NettoPreisGesamtX, Belegdatum</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Netto pro Position in EUR</text>
<text class="small" x="761" y="55">Sample nicht als Jahres-Ist verwenden</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll DE</text>
<text class="small" x="1161" y="55">erst nach finalem Jahresfile</text>
<rect class="warn" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">Offen</text>
<text class="small" x="1456" y="55">vollstaendiger 2025-Export fehlt</text>
</g>
<g transform="translate(0 782)">
<rect class="panel" x="0" y="0" width="1704" height="92"/>
<text class="country" x="20" y="30">US</text>
<rect class="source" x="135" y="14" width="250" height="58" rx="6"/>
<text class="txt" x="151" y="35">BI1 / SAP B1 HANA</text>
<text class="small" x="151" y="55">US B1 Schema</text>
<path class="line" d="M385 43 H435"/>
<rect class="mapping" x="435" y="14" width="260" height="58" rx="6"/>
<text class="txt" x="451" y="35">B1-Positionsdaten</text>
<text class="small" x="451" y="55">DocDate=PostingDate</text>
<path class="line" d="M695 43 H745"/>
<rect class="finance" x="745" y="14" width="350" height="58" rx="6"/>
<text class="txt" x="761" y="35">Netto pro Position in USD</text>
<text class="small" x="761" y="55">CHF Budget als Kandidat</text>
<path class="line" d="M1095 43 H1145"/>
<rect class="check" x="1145" y="14" width="270" height="58" rx="6"/>
<text class="txt" x="1161" y="35">Vergleich Soll US</text>
<text class="small" x="1161" y="55">FinanceReferences je Jahr</text>
<rect class="mapping" x="1440" y="14" width="235" height="58" rx="6"/>
<text class="txt" x="1456" y="35">IC sichtbar</text>
<text class="small" x="1456" y="55">gleiche Regel wie B1-Laender</text>
</g>
</g>
<rect class="panel" x="48" y="1382" width="1704" height="44"/>
<text class="small" x="68" y="1409">Stand: 2026-05-11. Abgeleitet aus Services/DataSources, MappedSalesRecordComposer, CentralSalesRecords, DatabaseSeedService und FinanceReconciliationService. Das Diagramm beschreibt die Buchhaltungslogik, nicht einzelne Testzahlen.</text>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB