Update finance training and dashboard UI

This commit is contained in:
2026-06-11 11:32:35 +02:00
parent 2444a01fc7
commit f751295449
18 changed files with 938 additions and 133 deletions
@@ -37,16 +37,26 @@
}
</MudText>
</MudStack>
<div class="dashboard-manometer" aria-label="Export activity manometer">
<div class="manometer-arc">
<span class="tick tick-0"></span>
<span class="tick tick-1"></span>
<span class="tick tick-2"></span>
<span class="tick tick-3"></span>
<span class="tick tick-4"></span>
<span class="needle"></span>
<span class="hub"></span>
</div>
<div class="dashboard-manometer">
<svg class="manometer-svg" viewBox="0 0 210 118" role="img" aria-label="Export activity manometer">
<path class="manometer-outer" d="M25 98 A80 80 0 0 1 185 98" />
<path class="manometer-inner" d="M47 98 A58 58 0 0 1 163 98" />
<line class="manometer-tick" x1="38" y1="98" x2="56" y2="98" />
<line class="manometer-tick" x1="61" y1="54" x2="74" y2="67" />
<line class="manometer-tick" x1="105" y1="34" x2="105" y2="52" />
<line class="manometer-tick" x1="149" y1="54" x2="136" y2="67" />
<line class="manometer-tick" x1="172" y1="98" x2="154" y2="98" />
<text class="manometer-label" x="43" y="89">0</text>
<text class="manometer-label" x="67" y="53">25</text>
<text class="manometer-label" x="105" y="28">50</text>
<text class="manometer-label" x="143" y="53">75</text>
<text class="manometer-label" x="167" y="89">100</text>
<text class="manometer-caption" x="105" y="113">EXPORT</text>
<g class="manometer-needle">
<line class="needle-line" x1="105" y1="98" x2="105" y2="38" />
</g>
<circle class="manometer-hub" cx="105" cy="98" r="11" />
</svg>
</div>
</div>
</MudPaper>
@@ -211,87 +221,80 @@
justify-self: end;
width: 210px;
height: 118px;
display: flex;
align-items: flex-end;
justify-content: center;
background: #fff;
border: 1px solid #111;
border-radius: 6px;
padding: 12px 14px 10px;
overflow: hidden;
}
.manometer-arc {
position: relative;
width: 170px;
height: 86px;
border: 8px solid #111;
border-bottom: 0;
border-radius: 170px 170px 0 0;
background: #fff;
overflow: visible;
.manometer-svg {
display: block;
width: 100%;
height: 100%;
}
.manometer-arc::before {
content: "";
position: absolute;
left: 14px;
right: 14px;
bottom: -1px;
height: 70px;
border: 2px solid #111;
border-bottom: 0;
border-radius: 140px 140px 0 0;
.manometer-outer,
.manometer-inner {
fill: none;
stroke: #111;
stroke-linecap: square;
}
.tick {
position: absolute;
left: 50%;
bottom: 0;
width: 3px;
height: 16px;
background: #111;
transform-origin: 50% 78px;
.manometer-outer {
stroke-width: 8;
}
.tick-0 { transform: translateX(-50%) rotate(-70deg); }
.tick-1 { transform: translateX(-50%) rotate(-35deg); }
.tick-2 { transform: translateX(-50%) rotate(0deg); }
.tick-3 { transform: translateX(-50%) rotate(35deg); }
.tick-4 { transform: translateX(-50%) rotate(70deg); }
.manometer-inner {
stroke-width: 2;
}
.needle {
position: absolute;
left: 50%;
bottom: 0;
width: 4px;
height: 72px;
background: #111;
border-radius: 4px;
transform-origin: 50% 100%;
.manometer-tick,
.needle-line {
stroke: #111;
stroke-width: 3;
stroke-linecap: square;
}
.manometer-needle {
transform-box: view-box;
transform-origin: 105px 98px;
animation: manometer-sweep 5.8s infinite cubic-bezier(.45, 0, .25, 1);
}
.hub {
position: absolute;
left: 50%;
bottom: -8px;
width: 22px;
height: 22px;
border-radius: 50%;
background: #111;
transform: translateX(-50%);
.manometer-hub {
fill: #111;
}
.manometer-label,
.manometer-caption {
fill: #111;
font-family: Arial, sans-serif;
text-anchor: middle;
dominant-baseline: middle;
user-select: none;
}
.manometer-label {
font-size: 10px;
font-weight: 600;
}
.manometer-caption {
font-size: 9px;
font-weight: 700;
letter-spacing: 0;
}
@@keyframes manometer-sweep {
0% { transform: translateX(-50%) rotate(-52deg); }
11% { transform: translateX(-50%) rotate(18deg); }
19% { transform: translateX(-50%) rotate(-8deg); }
33% { transform: translateX(-50%) rotate(63deg); }
48% { transform: translateX(-50%) rotate(4deg); }
61% { transform: translateX(-50%) rotate(38deg); }
74% { transform: translateX(-50%) rotate(-41deg); }
88% { transform: translateX(-50%) rotate(55deg); }
100% { transform: translateX(-50%) rotate(-52deg); }
0% { transform: rotate(-52deg); }
11% { transform: rotate(18deg); }
19% { transform: rotate(-8deg); }
33% { transform: rotate(63deg); }
48% { transform: rotate(4deg); }
61% { transform: rotate(38deg); }
74% { transform: rotate(-41deg); }
88% { transform: rotate(55deg); }
100% { transform: rotate(-52deg); }
}
@@media (max-width: 900px) {
@@ -51,7 +51,7 @@
@if (_financeResult is not null)
{
<MudTabs Elevation="1" Rounded="false" PanelClass="pt-4" @bind-ActivePanelIndex="_activeOverviewTabIndex">
<MudTabs Class="management-side-nav-tabs" Elevation="0" Rounded="false" PanelClass="pt-0" @bind-ActivePanelIndex="_activeOverviewTabIndex">
<MudTabPanel Text="@T("Schnelluebersicht", "Quick overview")" Icon="@Icons.Material.Filled.Speed">
<MudGrid Class="mb-4">
<MudItem xs="12" sm="6" md="3">
@@ -84,9 +84,7 @@
</MudItem>
</MudGrid>
<MudTabs Elevation="0" Rounded="false" PanelClass="pt-4">
<MudTabPanel Text="@T("Freigabe", "Approval")" Icon="@Icons.Material.Filled.FactCheck">
<MudPaper Class="pa-4" Elevation="1">
<MudPaper Class="pa-4 mb-4" Elevation="1">
<MudText Typo="Typo.h6" Class="mb-2">@T("Finance-Freigabe je Land", "Finance approval by country")</MudText>
<MudTable Items="_financeResult.CountryRows" Dense Hover Striped>
<HeaderContent>
@@ -109,9 +107,7 @@
</RowTemplate>
</MudTable>
</MudPaper>
</MudTabPanel>
<MudTabPanel Text="@T("Datenstand", "Data status")" Icon="@Icons.Material.Filled.Storage">
<MudPaper Class="pa-4" Elevation="1">
<MudPaper Class="pa-4 mb-4" Elevation="1">
<MudText Typo="Typo.h6" Class="mb-2">@T("Letzter Datenstand je Standort", "Latest data status by site")</MudText>
<MudTable Items="_financeResult.DataStatusRows" Dense Hover Striped>
<HeaderContent>
@@ -139,8 +135,6 @@
</RowTemplate>
</MudTable>
</MudPaper>
</MudTabPanel>
<MudTabPanel Text="@T("Sparten", "Divisions")" Icon="@Icons.Material.Filled.AccountTree">
<MudPaper Class="pa-4" Elevation="1">
<MudText Typo="Typo.h6" Class="mb-2">@T("Sparten-Abdeckung nach Land", "Division coverage by country")</MudText>
<MudTable Items="_financeResult.ProductFinanceCountryRows" Dense Hover Striped>
@@ -163,11 +157,9 @@
</MudTable>
</MudPaper>
</MudTabPanel>
</MudTabs>
</MudTabPanel>
<MudTabPanel Text="@T("Experten", "Experts")" Icon="@Icons.Material.Filled.Tune">
<MudTabs Elevation="0" Rounded="false" PanelClass="pt-4" @bind-ActivePanelIndex="_activeFinanceTabIndex">
<MudTabs Class="management-side-nav-tabs" Elevation="0" Rounded="false" PanelClass="pt-0" @bind-ActivePanelIndex="_activeFinanceTabIndex">
<MudTabPanel Text="@T("Finance Summary", "Finance summary")" Icon="@Icons.Material.Filled.Dashboard">
<MudGrid Class="mb-4">
<MudItem xs="12" sm="6" md="3">
@@ -409,7 +401,7 @@
</MudPaper>
</MudTabPanel>
<MudTabPanel Text="@T("Spartenanalyse", "Division analysis")" Icon="@Icons.Material.Filled.AccountTree">
<MudTabs Elevation="0" Rounded="false" PanelClass="pt-4" @bind-ActivePanelIndex="_activeDivisionTabIndex">
<MudTabs Class="management-side-nav-tabs" Elevation="0" Rounded="false" PanelClass="pt-0" @bind-ActivePanelIndex="_activeDivisionTabIndex">
<MudTabPanel Text="@T("Finanzanalyse", "Finance analysis")" Icon="@Icons.Material.Filled.PieChart">
<MudGrid Class="mb-4">
<MudItem xs="12" sm="6" md="3">
@@ -1108,6 +1100,12 @@
</MudTabs>
}
<style>
.management-side-nav-tabs .mud-tabs-toolbar {
display: none;
}
</style>
@code {
[Parameter]
[SupplyParameterFromQuery(Name = "section")]
@@ -0,0 +1,73 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1180" height="680" viewBox="0 0 1180 680" role="img" aria-labelledby="title desc">
<title id="title">Umschaltung zentrale Finance-Auswertungsquelle</title>
<desc id="desc">Zeigt, wie Finance-Auswertungen entweder aus CentralSalesRecords oder aus verarbeiteten Audit-CSV je Standort lesen.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#334155" />
</marker>
<style>
.title { font: 700 29px Arial, sans-serif; fill: #0f172a; }
.subtitle { font: 400 16px Arial, sans-serif; fill: #475569; }
.box-title { font: 700 16px Arial, sans-serif; fill: #0f172a; }
.box-text { font: 400 13px Arial, sans-serif; fill: #334155; }
.small { font: 400 12px Arial, sans-serif; fill: #64748b; }
.line { stroke: #334155; stroke-width: 2.2; fill: none; marker-end: url(#arrow); }
.muted-line { stroke: #94a3b8; stroke-width: 1.5; fill: none; marker-end: url(#arrow); }
.settings { fill: #e0f2fe; stroke: #0284c7; }
.db { fill: #eef2ff; stroke: #4f46e5; }
.csv { fill: #ecfdf5; stroke: #059669; }
.output { fill: #fff7ed; stroke: #ea580c; }
.guard { fill: #fef2f2; stroke: #dc2626; }
</style>
</defs>
<rect x="0" y="0" width="1180" height="680" fill="#ffffff" />
<text x="48" y="54" class="title">Zentrale Auswertungsquelle: DB oder verarbeitete Audit-CSV</text>
<text x="48" y="82" class="subtitle">Der Schalter liegt unter Einstellungen &gt; Export Einstellungen &gt; Audit-CSV / nachvollziehbarer Datenfluss.</text>
<rect x="60" y="132" width="270" height="150" rx="8" class="settings" />
<text x="84" y="166" class="box-title">Settings</text>
<text x="84" y="195" class="box-text">Audit-CSV je Standort schreiben</text>
<text x="84" y="220" class="box-text">Zentrale Auswertung aus Audit-CSV</text>
<text x="84" y="249" class="small">Pfad: Lokaler Standardpfad Standort-Dateien</text>
<line x1="330" y1="207" x2="406" y2="207" class="line" />
<rect x="414" y="86" width="270" height="140" rx="8" class="db" />
<text x="438" y="120" class="box-title">Standard-Modus</text>
<text x="438" y="149" class="box-text">UseAuditCsvAsCentralSource = false</text>
<text x="438" y="177" class="box-text">Auswertung liest CentralSalesRecords.</text>
<text x="438" y="202" class="small">Schnell und operativ</text>
<rect x="414" y="292" width="270" height="160" rx="8" class="csv" />
<text x="438" y="326" class="box-title">Audit-Modus</text>
<text x="438" y="355" class="box-text">UseAuditCsvAsCentralSource = true</text>
<text x="438" y="383" class="box-text">Je TSC wird die neueste</text>
<text x="438" y="404" class="box-text">Sales_ProcessedMergeInput_*.csv gelesen.</text>
<text x="438" y="431" class="small">Lesbar fuer Finance und Revision</text>
<line x1="684" y1="156" x2="760" y2="238" class="line" />
<line x1="684" y1="372" x2="760" y2="302" class="line" />
<rect x="768" y="214" width="300" height="136" rx="8" class="output" />
<text x="792" y="248" class="box-title">Gleiche Finance-Logik</text>
<text x="792" y="277" class="box-text">FinanceRuleEngine</text>
<text x="792" y="300" class="box-text">Spartenanalyse</text>
<text x="792" y="323" class="box-text">Waehrungsanalyse bei Zielwaehrung</text>
<line x1="918" y1="350" x2="918" y2="416" class="line" />
<rect x="730" y="424" width="376" height="124" rx="8" class="output" />
<text x="754" y="458" class="box-title">Ausgaben</text>
<text x="754" y="487" class="box-text">Dashboard / Management Analyse</text>
<text x="754" y="510" class="box-text">Soll/Ist-Vergleich</text>
<text x="754" y="533" class="box-text">Zentrale Excel Sales_All_&lt;Datum&gt;.xlsx</text>
<rect x="60" y="486" width="560" height="110" rx="8" class="guard" />
<text x="84" y="520" class="box-title">Pruefregel im Audit-Modus</text>
<text x="84" y="549" class="box-text">Fuer alle relevanten TSC muessen aktuelle Sales_ProcessedMergeInput_*.csv vorhanden sein.</text>
<text x="84" y="574" class="small">Fehlt die CSV, kann die zentrale Auswertung keine belastbare CSV-Sicht bilden.</text>
<line x1="195" y1="282" x2="195" y2="478" class="muted-line" />
<line x1="620" y1="541" x2="722" y2="501" class="muted-line" />
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

@@ -1,12 +1,13 @@
# Finance Berechnungsformeln pro Land
Stand: 2026-06-01
Stand: 2026-06-11
Nachtrag 2026-06-01:
Nachtrag 2026-06-11:
- ES-Referenz 2025 wurde nach Finance-Sitzung auf `3'082'320.18 EUR` korrigiert. Der alte Wert `3'102'333.61 EUR` war ein Referenz-/Excel-Fehler.
- In Management-Analysen ist das Wechselkurs-Anwendungsdatum konfigurierbar: `PostingDate`, `InvoiceDate` oder `ExtractionDate`.
- Sparten-Materialabgleich normalisiert fuehrende Nullen und warnt bei >=90% ungeklaerter Abdeckung.
- Zentrale Finance-Auswertungen koennen optional aus den neuesten `Sales_ProcessedMergeInput_*.csv` je TSC statt aus `CentralSalesRecords` lesen. Die Formel bleibt gleich; nur die Datenquelle wird per Setting umgeschaltet.
Zweck: Dieses Dokument beschreibt die aktuell im Programm verwendeten Formeln fuer den Soll/Ist-Vergleich 2025. Es ist fuer eine zweite KI oder eine fachliche Gegenpruefung geschrieben.
@@ -14,7 +15,12 @@ Zweck: Dieses Dokument beschreibt die aktuell im Programm verwendeten Formeln fu
Die echte Webseite `/finance-cockpit/vergleich` und das Testprogramm `/finance` verwenden beide `FinanceReconciliationService`.
Quelle fuer den Ist-Wert ist immer `CentralSalesRecords`. Die Jahresabgrenzung ist:
Quelle fuer den Ist-Wert ist die zentrale Auswertungsquelle:
- Standard: `CentralSalesRecords`.
- Audit-Modus: neueste `Sales_ProcessedMergeInput_*.csv` je TSC.
Die Jahresabgrenzung ist:
```text
Jahr = Year(PostingDate ?? InvoiceDate ?? ExtractionDate)
@@ -26,7 +32,7 @@ Pro Land berechnet das Programm mehrere Kandidaten:
```text
SalesPriceValue
= Sum(CentralSalesRecords.SalesPriceValue)
= Sum(SalesPriceValue aus zentraler Auswertungsquelle)
DocTotalFC - VatSumFC
= Sum(DocumentTotalForeignCurrency - VatSumForeignCurrency)
@@ -1,18 +1,28 @@
# Finance Datenfluss fuer Andreas
Stand: 2026-06-08
Stand: 2026-06-11
Zweck: Diese Notiz beschreibt den tatsaechlichen technischen Datenfluss im Finance Cockpit: wo Daten geholt werden, wann Felder veraendert werden, wann Wechselkurse wirken, wie die zentrale Excel entsteht und welche Quelle die Sparteninformationen liefert.
Fokus nur Wechselkurs/Kursanwendung: `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md`.
Aktuelle Finance-Schulung: `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md`.
Prozessgrafiken:
- `docs/FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg`
- `docs/FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg`
![Finance Prozessfluss](FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg)
![Audit-CSV als zentrale Auswertungsquelle](FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg)
## Kurzfazit
- Finance Summary, Management Analyse und Spartenanalyse lesen nicht aus dem SharePoint-Excel, sondern direkt aus der App-Datenbank `CentralSalesRecords`.
- Nachtrag 2026-06-11: Fuer Finance/Revision gibt es lokal einen Audit-CSV-Modus. Standortexporte koennen nach Mapping und Transformation je Standort eine CSV schreiben; per Setting koennen zentrale Excel, Finance Summary und Management-Analyse aus den neuesten Audit-CSV statt aus `CentralSalesRecords` lesen.
- Finance Summary, Management Analyse und Spartenanalyse lesen nicht aus dem SharePoint-Excel. Sie lesen entweder aus `CentralSalesRecords` oder, wenn aktiviert, aus den neuesten verarbeiteten Audit-CSV je Standort.
- Fuer Finance/Revision gibt es einen Audit-CSV-Modus. Standortexporte koennen nach Mapping und Transformation je Standort eine CSV schreiben; per Setting koennen zentrale Excel, Finance Summary, Soll/Ist und Management-Analyse aus diesen CSV statt aus `CentralSalesRecords` lesen.
- Die Audit-CSV heisst `Sales_ProcessedMergeInput_<TSC>_<yyyy-MM-dd>.csv`. Der Name markiert bewusst, dass es das verarbeitete Merge-Eingangsfile ist, nicht die originale Standortdatei.
- Das SharePoint-Excel `Sales_All_*.xlsx` ist ein Export-/Ablageergebnis, nicht die Live-Quelle der Cockpit-Anzeige.
- Jeder Standortexport ersetzt in `CentralSalesRecords` nur die Daten dieses Standorts.
- Die zentrale Excel wird danach aus dem aktuellen Stand von `CentralSalesRecords` erzeugt.
- Die zentrale Excel wird danach aus der aktuell gewaehlten zentralen Auswertungsquelle erzeugt: Standard `CentralSalesRecords`, optional Audit-CSV.
- Wechselkurse veraendern den Standortexport und `CentralSalesRecords` normalerweise nicht. Sie wirken in Analyse-/Anzeige-Sichten, wenn eine Zielwaehrung wie CHF/EUR/USD ausgewaehlt ist, oder in explizit konfigurierten Transformationen.
- Sparteninformationen kommen fuehrend aus SAP/TR-AG `ProductDivisionRefSet`. Aktuell werden sie beim ZSCHWEIZ-/CH-/AT-Export direkt mitgeladen. Andere Laender werden in der Analyse ueber ihre Materialnummer gegen diese TR-AG-Referenz gematcht.
@@ -33,13 +43,33 @@ Ablauf pro Standort:
- `ManualExcelDataSourceAdapter` fuer Excel/CSV/SharePoint-Dateien.
3. Rohdaten werden als `SalesRecord`-Liste aufgebaut.
4. Aktive `FieldTransformationRules` fuer das Quellsystem werden angewendet.
5. Eine lokale Standort-Excel `Sales_<TSC>_<Datum>.xlsx` wird erzeugt.
6. `CentralSalesRecords` wird fuer diesen Standort ersetzt:
5. Falls `Audit-CSV je Standort schreiben` aktiv ist, wird eine verarbeitete CSV geschrieben:
- Datei: `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv`.
- Ordner: gleicher lokaler Ordner wie die Standort-Excel.
- Inhalt: Daten nach Mapping und Transformation.
6. Eine lokale Standort-Excel `Sales_<TSC>_<Datum>.xlsx` wird erzeugt.
7. `CentralSalesRecords` wird fuer diesen Standort ersetzt:
- alte Saetze mit `SiteId = Standort` loeschen.
- neue Saetze einfuegen.
7. Falls SharePoint komplett konfiguriert ist, wird die Standort-Excel nach SharePoint hochgeladen.
8. Falls SharePoint komplett konfiguriert ist, werden Standort-Excel und Audit-CSV in den Landesordner hochgeladen.
Wichtig: Die Reihenfolge ist zuerst Daten holen, dann Transformationen, dann lokale Excel, dann zentrale Tabelle, dann SharePoint-Upload. Der SharePoint-Upload entscheidet nicht, was in der Cockpit-Anzeige erscheint.
Wichtig: Die Reihenfolge ist zuerst Daten holen, dann Transformationen, dann Audit-CSV, dann lokale Excel, dann zentrale Tabelle, dann SharePoint-Upload. Der SharePoint-Upload entscheidet nicht, was in der Cockpit-Anzeige erscheint.
## Zentrale Auswertungsquelle
Der Schalter liegt in der App unter:
```text
Einstellungen > Export Einstellungen > Audit-CSV / nachvollziehbarer Datenfluss
```
| Schalter | Wirkung |
| --- | --- |
| `Audit-CSV je Standort schreiben` | Standortexport schreibt `Sales_ProcessedMergeInput_*.csv` nach Mapping und Transformation. |
| `Zentrale Auswertung aus Audit-CSV` | Finance Summary, Management Analyse, Soll/Ist und zentrale Excel lesen die neuesten Audit-CSV je TSC statt `CentralSalesRecords`. |
| `Lokaler Standardpfad Standort-Dateien` | Ordner fuer Standort-Excel und Audit-CSV. |
Wenn `Zentrale Auswertung aus Audit-CSV` aktiv ist, sucht die App im Standort-Exportordner je TSC die neueste passende CSV. Wenn keine `Sales_ProcessedMergeInput_*.csv` vorhanden ist, ist der Audit-Modus nicht auswertbar.
## Datenquellen pro Quelltyp
@@ -315,7 +345,9 @@ Ausloeser:
Ablauf:
1. `ConsolidatedExportService` liest alle Saetze aus `CentralSalesRecords`.
1. `ConsolidatedExportService` liest alle Saetze aus der zentralen Auswertungsquelle:
- Standard: `CentralSalesRecords`.
- Audit-Modus: neueste `Sales_ProcessedMergeInput_*.csv` je TSC.
2. `ExcelExportService.CreateConsolidatedExcelFile(...)` erzeugt `Sales_All_<Datum>.xlsx`.
3. Die Datei wird lokal geschrieben.
4. Falls SharePoint konfiguriert ist, wird sie hochgeladen.
@@ -342,14 +374,16 @@ Wichtig:
- `Finance Summary` im Excel wird beim Schreiben aus den Records berechnet.
- Es liest nicht aus einem vorherigen SharePoint-Excel.
- Je nach Setting sind diese Records entweder DB-Eintraege oder die neuesten verarbeiteten Audit-CSV.
- Wechselkurs-Zielwaehrung aus der UI wird dabei nicht angewendet.
## Finance Summary und Spartenanalyse in der App
Die App-Anzeigen lesen direkt aus:
Die App-Anzeigen lesen direkt aus der zentralen Auswertungsquelle:
```text
CentralSalesRecords
Standard: CentralSalesRecords
Audit-Modus: neueste Sales_ProcessedMergeInput_*.csv je TSC
```
Nicht aus:
@@ -360,9 +394,9 @@ SharePoint Sales_All_*.xlsx
Das bedeutet:
- Lokal zeigt die App lokale DB-Daten.
- Publizierter Server zeigt Server-DB-Daten.
- Wenn lokale und Server-DB gleich sind, sehen beide gleich aus.
- Lokal zeigt die App lokale DB-Daten oder lokale Audit-CSV, je nach Setting.
- Publizierter Server zeigt Server-DB-Daten oder Server-Audit-CSV, je nach Setting.
- Wenn lokale und Server-Auswertungsquelle gleich sind, sehen beide gleich aus.
- Ein SharePoint-Upload veraendert die App-Anzeige nicht.
## Spartenanalyse: genaue Logik
@@ -433,21 +467,26 @@ SalesRecord-Liste
+-- FieldTransformationRules anwenden
| -> optional Feldkopien, FirstNonEmpty, ConvertCurrency
|
+-- optional Audit-CSV Sales_ProcessedMergeInput_<TSC>_<Datum>.csv schreiben
| -> verarbeitete Daten fuer Finance/Revision
|
+-- Standort-Excel Sales_<TSC>_<Datum>.xlsx lokal schreiben
|
+-- CentralSalesRecords fuer SiteId ersetzen
|
+-- Standort-Excel optional nach SharePoint hochladen
+-- Standort-Excel und Audit-CSV optional nach SharePoint hochladen
Finance Summary / Spartenanalyse
|
+-- liest CentralSalesRecords
+-- liest zentrale Auswertungsquelle
| -> Standard: CentralSalesRecords
| -> optional: neueste Sales_ProcessedMergeInput_*.csv je TSC
+-- FinanceRuleEngine rechnet Include/Exclude/Net Sales Actual
+-- Spartenanalyse matched lokale Materialien gegen TR-AG-Referenz aus CentralSalesRecords
+-- Spartenanalyse matched lokale Materialien gegen TR-AG-Referenz aus den Records
Zentrale Excel
|
+-- liest CentralSalesRecords
+-- liest zentrale Auswertungsquelle
+-- erzeugt Sales_All_<Datum>.xlsx lokal
+-- erzeugt Finance Summary / Finance Details im Excel
+-- laedt Datei optional nach SharePoint
@@ -456,10 +495,10 @@ Zentrale Excel
## Wichtige Klarstellungen fuer Finance
1. SharePoint ist Ablage und Quelle fuer manuelle Dateien, aber nicht Live-Quelle der Finance Summary.
2. `CentralSalesRecords` ist der operative zentrale Datenbestand der App.
2. `CentralSalesRecords` ist der operative zentrale Datenbestand der App, solange nicht Audit-CSV als zentrale Auswertungsquelle aktiv ist.
3. Sparten kommen fachlich aus TR-AG/SAP `ProductDivisionRefSet`, nicht aus lokalen ERP-Sparten.
4. CH/AT bekommen Spartenfelder direkt beim ZSCHWEIZ-Export.
5. Andere Laender bekommen Sparten in der Analyse nur, wenn ihre Materialnummern zur TR-AG-Referenz matchen.
6. Wechselkurse sind keine stille Vorverarbeitung fuer den Standard-Soll/Ist-Abgleich.
7. `Mixed` bedeutet: mehrere Waehrungen im Filter. Prozentwerte auf `Mixed` sind nur eingeschraenkt interpretierbar; fuer belastbare Spartenanteile nach Wert muss Land oder Waehrung gefiltert werden.
8. Die zentrale Excel wird nach den Standortexporten aus `CentralSalesRecords` erstellt. Sie ist Ergebnis, nicht Eingang.
8. Die zentrale Excel wird nach den Standortexporten aus der gewaehlten zentralen Auswertungsquelle erstellt. Sie ist Ergebnis, nicht Eingang.
@@ -1,17 +1,22 @@
# Finance Kurs-Workflow
Stand: 2026-06-09
Stand: 2026-06-11
Zweck: Diese Doku beschreibt isoliert den Weg eines Umrechnungskurses vom einzelnen Land bis zur Analyse eines zentralen Dashboard-Wertes. Sie ersetzt nicht die allgemeine Finance-Datenflussdoku, sondern schneidet nur das Thema Kurs/Waehrung heraus.
Aktuelle Finance-Schulung: `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md`.
Visualisierung: `docs/FINANCE_KURS_WORKFLOW_2026-06-09.svg`
Aktuelle Kurs-/Waehrungsgrafik: `docs/FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg`
![Finance Kurs-Workflow](FINANCE_KURS_WORKFLOW_2026-06-09.svg)
![Finance Waehrungs- und Kursfluss](FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg)
## Kurzfazit
- Der Standortimport rechnet Werte normalerweise nicht ueber die App-Kurstabelle um.
- `CentralSalesRecords` speichert die Werte und Waehrungen so, wie sie nach Import und optionalen Transformationen vorliegen.
- Wenn Audit-CSV als zentrale Auswertungsquelle aktiv ist, enthalten die `Sales_ProcessedMergeInput_*.csv` dieselben verarbeiteten Werte nach Mapping und Transformation.
- `DocumentRate` ist ein Quellfeld aus SAP/B1/OData, kein automatisch angewendeter App-Kurs.
- Die fuehrende `Finance Summary` und das zentrale Excel nutzen Hauswaehrung je Land. Die App-Kurstabelle wird dort nicht still angewendet.
- Eine echte App-Umrechnung passiert nur in Analyse-/Anzeige-Sichten mit Zielwaehrung, in einer expliziten `ConvertCurrency`-Transformation oder im separaten Budget-CHF-Kandidaten.
@@ -29,6 +34,7 @@ Visualisierung: `docs/FINANCE_KURS_WORKFLOW_2026-06-09.svg`
| App-Kurstabelle | Tabelle `CurrencyExchangeRates` mit `FromCurrency`, `ToCurrency`, `Rate`, `ValidFrom`, `ValidTo`, `Notes`, `IsActive`. |
| Anzeige-Waehrung | Zielwaehrung in Analyse-Sichten, aktuell `NATIVE`, `CHF`, `EUR`, `USD`. |
| Budgetkurs | Kurs mit `Notes = Budget <Jahr>`, z. B. `Budget 2025`, fuer separaten CHF-Kontrollkandidaten. |
| Audit-CSV | Verarbeitete Standort-CSV `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv`; optional zentrale Quelle fuer Dashboard und zentrale Excel. |
## Gesamtfluss
@@ -45,8 +51,15 @@ Land / Quellsystem
|
+-- Standort-Excel schreiben
|
+-- optional Audit-CSV schreiben
| Sales_ProcessedMergeInput_<TSC>_<Datum>.csv
|
+-- CentralSalesRecords fuer Standort ersetzen
|
+-- zentrale Auswertungsquelle
| Standard: CentralSalesRecords
| optional: neueste Audit-CSV je TSC
|
+-- zentrale Excel / Finance Summary
| Hauswaehrung, keine stille App-Kursumrechnung
|
@@ -111,6 +124,7 @@ Beim normalen Standortexport gilt:
```text
Daten holen
-> Transformationen anwenden
-> optional Audit-CSV Sales_ProcessedMergeInput_*.csv schreiben
-> Standort-Excel schreiben
-> CentralSalesRecords fuer diesen Standort ersetzen
-> optional SharePoint Upload
@@ -125,6 +139,8 @@ Ohne aktive `ConvertCurrency`-Transformation passiert keine App-Kursumrechnung.
Damit bleibt nachvollziehbar, ob ein Wert bereits vom Landessystem als Hauswaehrungswert geliefert wurde oder ob er spaeter nur in der Anzeige umgerechnet wurde.
Die Audit-CSV wird an derselben Stelle im Ablauf geschrieben: nach Mapping/Transformation und vor der zentralen Auswertung. Sie ist deshalb fuer Finance/Revision das lesbare Abbild des verarbeiteten Merge-Eingangs, nicht das originale Standortfile.
## Schritt 5: Fuehrende Finance Summary
Die fuehrende Finance Summary im Dashboard und das zentrale Excel-Blatt `Finance Summary` rechnen nicht automatisch in eine globale Zielwaehrung um.
@@ -132,7 +148,9 @@ Die fuehrende Finance Summary im Dashboard und das zentrale Excel-Blatt `Finance
Logik:
```text
CentralSalesRecords
zentrale Auswertungsquelle
Standard: CentralSalesRecords
optional: Sales_ProcessedMergeInput_*.csv
-> FinanceRuleEngine
-> Finance | Net Sales Actual
-> Gruppierung nach Jahr, Land, Finance-Waehrung
@@ -166,7 +184,7 @@ Die Kursanwendung fuer einen zentralen Dashboard-Wert passiert in der Management
Eingaben:
- Datenbasis: `CentralSalesRecords`.
- Datenbasis: zentrale Auswertungsquelle, also `CentralSalesRecords` oder bei aktivem Audit-Modus die neuesten `Sales_ProcessedMergeInput_*.csv` je TSC.
- Summenfeld: z. B. `SalesPriceValue`, `StandardCost`, `StandardCostTotal`, `Quantity`.
- Anzeige-Waehrung: `NATIVE`, `CHF`, `EUR` oder `USD`.
- Zeitraum/Filter: Jahr, Monat, Land, TSC.
@@ -296,6 +314,8 @@ ORDER BY FromCurrency, ToCurrency, ValidFrom DESC;
| ECB-Import | `Services/ExchangeRateImportService.cs` |
| Settings/Kurspflege | `Services/SettingsPageService.cs`, `Components/Pages/Settings.razor` |
| Standortexport-Reihenfolge | `Services/SiteExportService.cs` |
| Audit-CSV schreiben/lesen | `Services/ExportAuditCsvService.cs` |
| zentrale Quelle DB oder CSV | `Services/CentralSalesDataProvider.cs` |
| zentrale Speicherung | `Services/CentralSalesRecordService.cs` |
| zentrale Analyse mit Zielwaehrung | `Services/ManagementCockpitService.cs` |
| Finance Summary ohne stille Umrechnung | `Services/ManagementCockpitService.cs`, `Services/ExcelExportService.cs` |
@@ -0,0 +1,106 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="760" viewBox="0 0 1280 760" role="img" aria-labelledby="title desc">
<title id="title">Finance Prozessfluss vom Export bis Dashboard</title>
<desc id="desc">Uebersicht: Standortdaten werden gelesen, gemappt, transformiert, optional als Audit-CSV geschrieben und danach fuer Dashboard, Soll/Ist und zentrale Excel verwendet.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#334155" />
</marker>
<style>
.title { font: 700 30px Arial, sans-serif; fill: #0f172a; }
.subtitle { font: 400 16px Arial, sans-serif; fill: #475569; }
.lane-title { font: 700 15px Arial, sans-serif; fill: #334155; }
.box-title { font: 700 16px Arial, sans-serif; fill: #0f172a; }
.box-text { font: 400 13px Arial, sans-serif; fill: #334155; }
.small { font: 400 12px Arial, sans-serif; fill: #475569; }
.note { font: 700 13px Arial, sans-serif; fill: #7c2d12; }
.line { stroke: #334155; stroke-width: 2.2; fill: none; marker-end: url(#arrow); }
.thin { stroke: #94a3b8; stroke-width: 1.4; fill: none; marker-end: url(#arrow); }
.source { fill: #e0f2fe; stroke: #0284c7; }
.process { fill: #f1f5f9; stroke: #64748b; }
.audit { fill: #ecfdf5; stroke: #059669; }
.db { fill: #eef2ff; stroke: #4f46e5; }
.out { fill: #fff7ed; stroke: #ea580c; }
.sp { fill: #f8fafc; stroke: #94a3b8; stroke-dasharray: 7 5; }
</style>
</defs>
<rect x="0" y="0" width="1280" height="760" fill="#ffffff" />
<text x="48" y="54" class="title">Finance Prozessfluss: Export Dashboard bis zentrale Auswertung</text>
<text x="48" y="82" class="subtitle">Stand 2026-06-11: Audit-CSV ist das verarbeitete Merge-Eingangsfile und kann optional die zentrale Quelle sein.</text>
<text x="50" y="142" class="lane-title">1. Quelle lesen</text>
<rect x="48" y="158" width="190" height="118" rx="8" class="source" />
<text x="68" y="188" class="box-title">Quellsystem</text>
<text x="68" y="214" class="box-text">HANA / SAP B1</text>
<text x="68" y="235" class="box-text">SAP Gateway / OData</text>
<text x="68" y="256" class="box-text">Excel / CSV / SharePoint</text>
<line x1="238" y1="217" x2="294" y2="217" class="line" />
<text x="300" y="142" class="lane-title">2. Vereinheitlichen</text>
<rect x="300" y="158" width="210" height="118" rx="8" class="process" />
<text x="322" y="188" class="box-title">Mapping</text>
<text x="322" y="214" class="box-text">Spalten und ERP-Felder</text>
<text x="322" y="235" class="box-text">werden SalesRecord</text>
<text x="322" y="256" class="box-text">zugeordnet.</text>
<line x1="510" y1="217" x2="566" y2="217" class="line" />
<rect x="572" y="158" width="210" height="118" rx="8" class="process" />
<text x="594" y="188" class="box-title">Transformation</text>
<text x="594" y="214" class="box-text">Finance-Regeln noch nicht</text>
<text x="594" y="235" class="box-text">final summiert; Felder</text>
<text x="594" y="256" class="box-text">werden vorbereitet.</text>
<line x1="677" y1="276" x2="677" y2="332" class="line" />
<text x="300" y="337" class="lane-title">3. Nachvollziehbare Standortartefakte</text>
<rect x="300" y="354" width="230" height="128" rx="8" class="audit" />
<text x="322" y="384" class="box-title">Audit-CSV</text>
<text x="322" y="410" class="box-text">Sales_ProcessedMergeInput</text>
<text x="322" y="431" class="box-text">_&lt;TSC&gt;_&lt;Datum&gt;.csv</text>
<text x="322" y="456" class="small">Nach Mapping + Transformation</text>
<line x1="530" y1="418" x2="586" y2="418" class="line" />
<rect x="592" y="354" width="210" height="128" rx="8" class="out" />
<text x="614" y="384" class="box-title">Standort-Excel</text>
<text x="614" y="410" class="box-text">Sales_&lt;TSC&gt;_&lt;Datum&gt;.xlsx</text>
<text x="614" y="435" class="small">Ablage und manuelle Pruefung</text>
<line x1="782" y1="217" x2="850" y2="217" class="line" />
<line x1="415" y1="482" x2="415" y2="548" class="thin" />
<line x1="697" y1="482" x2="697" y2="548" class="thin" />
<text x="856" y="142" class="lane-title">4. Operative Datenbasis</text>
<rect x="856" y="158" width="220" height="118" rx="8" class="db" />
<text x="878" y="188" class="box-title">CentralSalesRecords</text>
<text x="878" y="214" class="box-text">Standort wird ersetzt</text>
<text x="878" y="235" class="box-text">und zentral gespeichert.</text>
<text x="878" y="256" class="small">Standard-Auswertungsquelle</text>
<line x1="966" y1="276" x2="966" y2="332" class="line" />
<rect x="856" y="354" width="220" height="128" rx="8" class="db" />
<text x="878" y="384" class="box-title">Zentrale Quelle</text>
<text x="878" y="410" class="box-text">Schalter in Settings:</text>
<text x="878" y="431" class="box-text">DB oder Audit-CSV</text>
<text x="878" y="456" class="small">je TSC neueste CSV</text>
<line x1="1076" y1="418" x2="1132" y2="418" class="line" />
<text x="1138" y="337" class="lane-title">5. Finance-Ergebnis</text>
<rect x="1138" y="354" width="96" height="128" rx="8" class="out" />
<text x="1154" y="384" class="box-title">Output</text>
<text x="1154" y="410" class="box-text">Dashboard</text>
<text x="1154" y="431" class="box-text">Soll/Ist</text>
<text x="1154" y="452" class="box-text">Sales_All</text>
<rect x="326" y="548" width="504" height="110" rx="8" class="sp" />
<text x="350" y="580" class="box-title">SharePoint-Ablage</text>
<text x="350" y="606" class="box-text">Standort-Excel und Audit-CSV werden in denselben Landesordner hochgeladen.</text>
<text x="350" y="630" class="note">SharePoint-Dateien sind Ablage/Pruefspur, nicht automatisch die Live-Quelle.</text>
<line x1="802" y1="418" x2="850" y2="418" class="thin" />
<line x1="830" y1="603" x2="966" y2="482" class="thin" />
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

@@ -0,0 +1,410 @@
# Finance Schulung fuer Finance-Anwender
Stand: 2026-06-11
Zweck: Diese Schulungsunterlage beschreibt den aktuellen Finance-Prozess vom Standortexport bis zu Dashboard, zentraler Excel und Soll/Ist-Vergleich. Sie ist fuer Finance, Finance Keyuser und Wirtschaftspruefung gedacht.
## Prozessgrafiken
Die folgenden Grafiken zeigen die wichtigsten Zusammenhaenge vor den Detailkapiteln:
![Finance Prozessfluss](FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg)
![Audit-CSV als zentrale Auswertungsquelle](FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg)
![Waehrungs- und Kursfluss](FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg)
## Kurzfazit
- Fuehrende Sicht fuer Soll/Ist ist `Finance Summary` bzw. der Soll/Ist-Vergleich.
- Das zentrale Excel ist ein Ergebnis des aktuellen Datenbestands, nicht die Live-Quelle des Dashboards.
- Standortexporte schreiben optional eine nachvollziehbare Audit-CSV nach Mapping und Transformation.
- Die Audit-CSV heisst `Sales_ProcessedMergeInput_<TSC>_<yyyy-MM-dd>.csv` und ist das verarbeitete Merge-Eingangsfile, nicht das originale Standortfile.
- Per Einstellung kann die zentrale Auswertung von `CentralSalesRecords` auf die neuesten Audit-CSV je Standort umgeschaltet werden.
- Waehrungsumrechnung passiert nicht still im Standard-Ist. Sie passiert nur in klaren Analyse-/Transformationsfaellen.
## Rollen
| Rolle | Aufgabe |
| --- | --- |
| Finance Anwender | Finance Summary, zentrale Excel und Soll/Ist pruefen |
| Finance Keyuser | Standortexporte starten, Audit-CSV kontrollieren, Freigabe vorbereiten |
| Wirtschaftspruefung | Datenfluss ueber verarbeitete CSV, zentrale Excel und Detailzeilen nachvollziehen |
| Admin / IT | Standorte, Quellen, Mappings, Kurse, SharePoint und Regeln pflegen |
## Prozessfluss: Export bis Dashboard
```text
Quellsystem oder Standortdatei
|
+-- Export Dashboard: Standort exportieren
|
+-- Adapter liest Daten
| HANA/B1, SAP Gateway/OData oder Manual Excel/CSV/SharePoint
|
+-- Mapping ins SalesRecord-Modell
|
+-- Transformationen anwenden
| z. B. Feldkopien, FirstNonEmpty, optional ConvertCurrency
|
+-- Audit-CSV schreiben, falls aktiv
| Sales_ProcessedMergeInput_<TSC>_<Datum>.csv
|
+-- Standort-Excel schreiben
| Sales_<TSC>_<Datum>.xlsx
|
+-- CentralSalesRecords fuer diesen Standort ersetzen
|
+-- Standort-Excel und Audit-CSV nach SharePoint hochladen, falls konfiguriert
Zentrale Auswertungsquelle
|
+-- Standard: CentralSalesRecords
|
+-- Optional: neueste Sales_ProcessedMergeInput_*.csv je TSC
|
+-- Finance Summary / Management Analyse
+-- Soll/Ist-Vergleich
+-- Zentrale Excel Sales_All_<Datum>.xlsx
```
Wichtig fuer Finance: Der Standortexport schreibt zuerst die verarbeiteten Daten. Danach entscheidet die Einstellung `Zentrale Auswertung aus Audit-CSV`, ob Dashboard und zentrale Excel aus der internen DB oder aus den neuesten verarbeiteten CSV-Dateien lesen.
## Schalter in der App
Die Schalter liegen unter:
```text
Einstellungen > Export Einstellungen > Audit-CSV / nachvollziehbarer Datenfluss
```
| Feld | Wirkung |
| --- | --- |
| `Lokaler Standardpfad Standort-Dateien` | Ordner fuer Standort-Excel und Audit-CSV. Wenn leer, wird `output` im App-Verzeichnis verwendet. |
| `Audit-CSV je Standort schreiben` | Schreibt beim Laenderexport je Standort eine verarbeitete CSV. |
| `Zentrale Auswertung aus Audit-CSV` | Dashboard, zentrale Excel und Finance-Auswertungen lesen die neuesten Audit-CSV statt der internen DB. |
| `Wechselkurse anwenden auf` | Datumsfeld fuer Kursgueltigkeit in Management-Analysen: `PostingDate`, `InvoiceDate` oder `ExtractionDate`. |
Es gibt keinen separaten sichtbaren Audit-CSV-Pfad. Die Audit-CSV liegt bewusst im gleichen Ordner wie die lokalen Standortdateien und wird beim Standortexport in den gleichen SharePoint-Landesordner hochgeladen.
## Dateinamen und Bedeutung
| Datei | Bedeutung |
| --- | --- |
| `Sales_<TSC>_<yyyy-MM-dd>.xlsx` | Standort-Excel fuer Menschen und Ablage. |
| `Sales_ProcessedMergeInput_<TSC>_<yyyy-MM-dd>.csv` | Verarbeitetes Standortfile nach Mapping und Transformation; Eingang fuer Merge/zentrale Auswertung, auditierbar. |
| `Sales_All_<yyyy-MM-dd>.xlsx` | Zentrale Excel mit Finance Summary, Finance Details und Sales-Blatt. |
Die Audit-CSV ist nicht das originale Standortfile aus Sage, Alphaplan, HANA oder SAP. Sie ist das bereits verarbeitete File, das fachlich erklaert, welche Zeilen in den zentralen Merge gehen.
## Zentrale Auswertungsquelle
### Standard: interne DB
Im Standard liest die App aus `CentralSalesRecords`.
```text
Standortexport
-> CentralSalesRecords fuer Standort ersetzen
-> Dashboard und zentrale Excel lesen CentralSalesRecords
```
Das ist die schnellste operative Variante.
### Audit-Modus: CSV als zentrale Quelle
Wenn `Zentrale Auswertung aus Audit-CSV` aktiv ist:
```text
Ordner mit Sales_ProcessedMergeInput_*.csv
-> je TSC die neueste Datei suchen
-> CSV lesen
-> Dashboard, zentrale Excel und Soll/Ist daraus bilden
```
Das ist die nachvollziehbare Variante fuer Finance/Revision. Finance kann die CSV-Dateien oeffnen, summieren und gegen die zentrale Excel pruefen.
Kontrollregel: Wenn der Audit-Modus aktiv ist, muessen fuer alle relevanten Standorte aktuelle `Sales_ProcessedMergeInput_*.csv` im Standort-Exportordner vorhanden sein.
## Waehrungsumrechnung
Die Kurstabelle liegt in der App unter:
```text
Einstellungen > Wechselkurse
```
Technisch ist das die Tabelle `CurrencyExchangeRates` mit:
| Feld | Bedeutung |
| --- | --- |
| `FromCurrency` | Quellwaehrung |
| `ToCurrency` | Zielwaehrung |
| `Rate` | Faktor: Betrag * Rate |
| `ValidFrom` / `ValidTo` | Gueltigkeitszeitraum |
| `Notes` | z. B. `Budget 2025`, `Budget 2026`, `ECB daily reference rate` |
| `IsActive` | nur aktive Kurse werden verwendet |
Die App sucht Kurse so:
1. gleiche Waehrung ergibt Faktor `1`.
2. direkter Kurs `Quelle -> Ziel`.
3. falls fehlt: inverser Kurs `Ziel -> Quelle`, gerechnet als `1 / Rate`.
4. falls fehlt: Kreuzkurs ueber `EUR`.
5. falls weiterhin fehlt: keine Umrechnung; die Anzeige zaehlt fehlende Kurse.
## Wo Kurse wirken
| Bereich | Kurswirkung |
| --- | --- |
| Standard `Finance Summary` | keine stille Umrechnung; Hauswaehrung je Land bleibt fuehrend |
| Zentrale Excel `Finance Summary` / `Finance Details` | keine stille globale Zielwaehrung |
| Management Analyse mit Zielwaehrung `CHF`, `EUR`, `USD` | App rechnet zur Anzeige ueber `CurrencyExchangeRates` um |
| Transformation `ConvertCurrency` | schreibt beim Standortexport dauerhaft ein Zielfeld um |
| Soll/Ist-Kandidat `Nettofakturawert Hauswaehrung -> CHF Budget <Jahr>` | nutzt Kurse mit `Notes = Budget <Jahr>` als separate Kontrollsicht |
| ERP-Feld `DocumentRate` | gespeicherte Quellinformation, nicht automatisch die App-Umrechnung |
Die Standardfreigabe erfolgt zuerst in lokaler Hauswaehrung. Eine CHF- oder EUR-Sicht ist eine separate Reporting-/Analysefrage.
## Datumsfeld fuer Kurse
In `Einstellungen > Export Einstellungen` bestimmt `Wechselkurse anwenden auf`, welches Datum fuer die Kursgueltigkeit verwendet wird:
| Einstellung | Kursdatum |
| --- | --- |
| `PostingDate` | `PostingDate`, sonst `InvoiceDate`, sonst `ExtractionDate` |
| `InvoiceDate` | `InvoiceDate`, sonst `PostingDate`, sonst `ExtractionDate` |
| `ExtractionDate` | `ExtractionDate` |
Diese Einstellung betrifft Management-Analysen mit Zielwaehrung. Sie aendert nicht die Rohdaten und nicht die normalen Standort-Exporte.
## Zentrale Excel
Die zentrale Excel wird ueber das Export Dashboard erzeugt:
```text
Export Dashboard > Zentrale Datei neu erzeugen
```
Sie enthaelt typischerweise:
| Blatt | Zweck |
| --- | --- |
| `Finance Summary` | Summen nach Jahr, Land und Waehrung |
| `Finance Details` | Detailzeilen, die in die Finance Summary eingehen |
| `Sales` | vollstaendige verarbeitete Exportdaten |
| `Finance Filter Hilfe` | Hinweise fuer Excel-Filter |
Wenn die zentrale Auswertungsquelle auf Audit-CSV steht, wird die zentrale Excel aus den neuesten Audit-CSV gebildet. Wenn die Auswertungsquelle auf DB steht, wird sie aus `CentralSalesRecords` gebildet.
## Soll/Ist-Vergleich
Der Soll/Ist-Vergleich nutzt dieselbe Finance-Logik wie Finance Summary und zentrale Excel.
| Feld | Bedeutung |
| --- | --- |
| `Ist` | aktueller Finance-Istwert |
| `Referenz` | Soll-/check.xlsx-Wert bzw. FinanceReference |
| `Differenz` | Ist minus Referenz |
| `Varianten` | alternative technische Berechnungskandidaten |
| `IC` | Intercompany-/2nd-party-Diagnose, nicht stiller Abzug |
Wenn im Expertenmodus Varianten angezeigt werden, muss der Sollwert weiterhin sichtbar bleiben, weil Finance die Differenz nur mit Referenzwert beurteilen kann.
## Laenderlogik kurz
| Land | Quelle / Logik |
| --- | --- |
| CH / AT | SAP Gateway/OData `ZSCHWEIZ`, `NetwrHc`, Spartenreferenz aus `ProductDivisionRefSet` |
| DE | Alphaplan Excel, `NettoPreisGesamtX`, Finance-Regeln fuer Ausschluesse und GS negativ |
| ES | Sage CSV, Basis plus Range-/Delta-Dateien, `ImporteNeto`, REC/Abono/Credit negativ |
| FR | SAP B1/HANA, Rechnungen und Gutschriften als Positions-Netto |
| IN | SAGE/HANA `TRIN`, Hauswaehrung INR |
| IT | SAP B1/HANA, IT-Abgrenzung mit `Trafag Italia` und Blank-Supplier-Deduplizierung |
| UK | Sage/Manual Excel, Jahresdatei plus Delta-Dateien, `[Sales Price/Value] * [Quantity]`, Credit Notes negativ |
| US | SAP B1/HANA, Positions-Netto in USD |
## Schulungsbeispiele: 4 Zeilen je Land
Die folgenden Zahlen sind bewusst kleine Schulungssamples, keine produktiven Ist-Werte. Sie zeigen den Fluss:
```text
Quellzeile
-> Mapping / Transformation beim Standortexport
-> Sales_ProcessedMergeInput_<TSC>_<Datum>.csv oder CentralSalesRecords
-> FinanceRuleEngine
-> Finance Summary / Finance Details im zentralen Excel
-> Dashboard / Soll-Ist
```
### Wo die Transformation wirkt
Transformationen wirken beim Standortexport, nachdem die Quelle gelesen und bevor Audit-CSV, Standort-Excel und zentrale Datenbasis geschrieben werden.
```text
Quelle lesen
-> Mapping in SalesRecord
-> FieldTransformationRules anwenden
-> Audit-CSV schreiben
-> Standort-Excel schreiben
-> CentralSalesRecords ersetzen
```
Wenn `Zentrale Auswertung aus Audit-CSV` aktiv ist, liest das Dashboard spaeter die bereits transformierten `Sales_ProcessedMergeInput_*.csv`. Wenn der Schalter aus ist, liest es die transformierten DB-Eintraege aus `CentralSalesRecords`. Die Summenlogik ist danach dieselbe.
### CH / Schweiz, TSC CH
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| CH-1 Rechnung | `NetwrHc = 1'000 CHF` | `Z.NetwrHc -> SalesPriceValue`, `Z.Hwaer -> SalesCurrency` | `1'000 CHF` | `1'000 CHF` |
| CH-2 Rechnung | `NetwrHc = 250 CHF` | Spartenfelder aus `ProductDivisionRefSet` angehaengt | `250 CHF` | `250 CHF` |
| CH-3 Gutschrift | `NetwrHc = -80 CHF` | Vorzeichen kommt aus Quelle/Beleglogik | `-80 CHF` | `-80 CHF` |
| CH-4 Service | `NetwrHc = 30 CHF` | Service bleibt normale Finance-Zeile | `30 CHF` | `30 CHF` |
Summe CH im zentralen Excel: `1'200 CHF`.
### AT / Oesterreich, TSC AT
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| AT-1 Rechnung | `NetwrHc = 800 EUR` | `Z.NetwrHc -> SalesPriceValue`, `Z.Hwaer -> SalesCurrency` | `800 EUR` | `800 EUR` |
| AT-2 Rechnung | `NetwrHc = 120 EUR` | Material wird gegen TR-AG-Referenz gemappt | `120 EUR` | `120 EUR` |
| AT-3 Gutschrift | `NetwrHc = -50 EUR` | negative Belegzeile bleibt negativ | `-50 EUR` | `-50 EUR` |
| AT-4 Rechnung | `NetwrHc = 40 EUR` | keine Kursumrechnung im Standard-Ist | `40 EUR` | `40 EUR` |
Summe AT im zentralen Excel: `910 EUR`.
### DE / Deutschland, TSC TRDE
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| DE-1 Rechnung | `NettoPreisGesamtX = 1'500 EUR` | Alphaplan-Spalte -> `SalesPriceValue` | `1'500 EUR` | `1'500 EUR` |
| DE-2 GS-Gutschrift | `NettoPreisGesamtX = 200 EUR`, `InvoiceNumber = GS...` | Finance-Regel rechnet GS negativ | `200 EUR` | `-200 EUR` |
| DE-3 Trafag AG | `500 EUR`, Kunde `Trafag AG` | Finance-Regel schliesst aus | `500 EUR` | `0 EUR` |
| DE-4 Magnetic Sense | `120 EUR`, Kunde enthaelt `Magnetic Sense` | Finance-Regel schliesst aus | `120 EUR` | `0 EUR` |
Summe DE im zentralen Excel: `1'300 EUR`.
### ES / Spanien, TSC TRSE/TRES
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| ES-1 Basisrechnung | `ImporteNeto = 700 EUR` | Sage `ImporteNeto -> SalesPriceValue` | `700 EUR` | `700 EUR` |
| ES-2 Range-Rechnung | `ImporteNeto = 180 EUR` | Range-Datei wird mit Basis zusammengesetzt | `180 EUR` | `180 EUR` |
| ES-3 REC/Abono | `ImporteNeto = 60 EUR`, Typ REC | Credit-/REC-Logik setzt negativ | `-60 EUR` | `-60 EUR` |
| ES-4 Duplikat | gleiche `SourceLineId` wie ES-2 | Dedupe entfernt zweite Zeile | `0 EUR` | `0 EUR` |
Summe ES im zentralen Excel: `820 EUR`.
### FR / Frankreich, TSC TRFR
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| FR-1 Rechnung | `INV1.LineTotal = 900 EUR` | B1-Positionswert -> `SalesPriceValue` | `900 EUR` | `900 EUR` |
| FR-2 Rechnung | `INV1.LineTotal = 100 EUR` | `OADM.MainCurncy -> SalesCurrency` | `100 EUR` | `100 EUR` |
| FR-3 Credit Note | `RIN1.LineTotal = 40 EUR` | HANA-Abfrage setzt Credit Note negativ | `-40 EUR` | `-40 EUR` |
| FR-4 Storno | `CANCELED = Y` | HANA-Filter laesst Storno weg | `0 EUR` | `0 EUR` |
Summe FR im zentralen Excel: `960 EUR`.
### IN / Indien, TSC TRIN
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| IN-1 Rechnung | `SalesValue = 90'000 INR` | SAGE/HANA-Wert -> `SalesPriceValue` | `90'000 INR` | `90'000 INR` |
| IN-2 Rechnung | `SalesValue = 10'000 INR` | Hauswaehrung INR bleibt fuehrend | `10'000 INR` | `10'000 INR` |
| IN-3 Gutschrift | `SalesValue = 5'000 INR` | Credit-Logik setzt negativ | `-5'000 INR` | `-5'000 INR` |
| IN-4 fehlende Sparte | `SalesValue = 2'000 INR` | Umsatz bleibt drin, Spartenstatus separat pruefen | `2'000 INR` | `2'000 INR` |
Summe IN im zentralen Excel: `97'000 INR`.
### IT / Italien, TSC TRIT
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| IT-1 Rechnung | `INV1.LineTotal = 1'100 EUR` | B1-Positionswert -> `SalesPriceValue` | `1'100 EUR` | `1'100 EUR` |
| IT-2 Trafag Italia | `300 EUR`, Kunde enthaelt `Trafag Italia` | IT-Finance-Regel schliesst aus | `300 EUR` | `0 EUR` |
| IT-3 Blank-Supplier-Duplikat | `150 EUR` | IT-Dedupe zaehlt Position nur einmal | `150 EUR` | `150 EUR` |
| IT-4 Credit Note | `RIN1.LineTotal = 70 EUR` | Credit Note negativ | `-70 EUR` | `-70 EUR` |
Summe IT im zentralen Excel: `1'180 EUR`.
### UK / England, TSC TRUK
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| UK-1 Rechnung | `Sales Price/Value = 100 GBP`, `Quantity = 5` | `SageNetSales = 100 * 5` | `500 GBP` | `500 GBP` |
| UK-2 Rechnung | `Sales Price/Value = 80 GBP`, `Quantity = 2` | Quantity-Multiplikation | `160 GBP` | `160 GBP` |
| UK-3 Credit Note | `50 GBP`, `Quantity = 1`, Credit Type | Credit Notes negativ | `-50 GBP` | `-50 GBP` |
| UK-4 Delta | neue Datei `ddMMyy_TRUK.xlsx` | Basis + Delta zusammen gelesen | `40 GBP` | `40 GBP` |
Summe UK im zentralen Excel: `650 GBP`.
### US / USA, TSC TRUS
| Sample | Quellwert | Mapping / Transformation | Wert fuer Merge | Finance-Beitrag |
| --- | ---: | --- | ---: | ---: |
| US-1 Rechnung | `INV1.LineTotal = 2'000 USD` | B1-Positionswert -> `SalesPriceValue` | `2'000 USD` | `2'000 USD` |
| US-2 Rechnung | `INV1.LineTotal = 350 USD` | Hauswaehrung USD bleibt fuehrend | `350 USD` | `350 USD` |
| US-3 Credit Note | `RIN1.LineTotal = 100 USD` | Credit Note negativ | `-100 USD` | `-100 USD` |
| US-4 Storno | `CANCELED = Y` | HANA-Filter laesst Storno weg | `0 USD` | `0 USD` |
Summe US im zentralen Excel: `2'250 USD`.
### Was im Dashboard sichtbar wird
| Schritt | Sichtbares Ergebnis |
| --- | --- |
| Standortexport | pro Land entsteht ein verarbeiteter Stand in Audit-CSV und/oder `CentralSalesRecords` |
| `Zentrale Datei neu erzeugen` | `Finance Summary` summiert die Finance-Beitraege je Jahr, Land und Waehrung |
| `Finance Details` | zeigt die einzelnen eingeschlossenen Detailzeilen hinter der Summe |
| Dashboard `Finance Summary` | zeigt dieselben Summen wie das zentrale Excel |
| Soll/Ist | vergleicht die Summe gegen `FinanceReference` / `check.xlsx` |
| Management Analyse mit Zielwaehrung | rechnet nur fuer die Anzeige ueber `CurrencyExchangeRates` um |
## Pruefung fuer Finance/Revision
1. In `Einstellungen` pruefen, ob `Audit-CSV je Standort schreiben` aktiv ist.
2. Fuer jedes relevante Land den Standortexport starten.
3. Im Standortordner pruefen:
- `Sales_<TSC>_<Datum>.xlsx`
- `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv`
4. Optional `Zentrale Auswertung aus Audit-CSV` aktivieren.
5. `Zentrale Datei neu erzeugen`.
6. In der zentralen Excel `Finance Summary` und `Finance Details` pruefen.
7. Soll/Ist-Vergleich gegen Referenzwerte pruefen.
8. Bei Abweichungen zuerst Audit-CSV und Finance Details nach TSC, Land, Jahr, Waehrung und Belegnummer filtern.
## Typische Fehlerbilder
| Symptom | Wahrscheinliche Ursache | Pruefung |
| --- | --- | --- |
| Audit-Modus aktiv, aber Dashboard leer/Fehler | keine `Sales_ProcessedMergeInput_*.csv` im Exportordner | Standortexport erneut starten, Pfad pruefen |
| CSV fehlt im SharePoint-Landesordner | Standortexport lief vor Audit-CSV-Upload-Stand oder SharePoint-Upload fehlgeschlagen | aktuellen Export erneut starten, Log pruefen |
| zentrale Excel wirkt alt | nach Standortexport nicht neu erzeugt oder falsche zentrale Quelle aktiv | Export Dashboard und Settings pruefen |
| `Mixed` bei Waehrung | mehrere native Waehrungen im Filter | Land/Waehrung filtern oder Zielwaehrung in Analyse waehlen |
| fehlende Kurse | kein aktiver gueltiger Kurs in `CurrencyExchangeRates` | Kurs, Gueltigkeit und `Wechselkurse anwenden auf` pruefen |
## Freigabe-Checkliste
| Nr. | Checkpunkt |
| --- | --- |
| 1 | Alle relevanten Standorte exportiert |
| 2 | Audit-CSV je Standort vorhanden, falls Revision/Finance den CSV-Fluss prueft |
| 3 | Zentrale Auswertungsquelle bewusst gewaehlt: DB oder Audit-CSV |
| 4 | Zentrale Excel nach den Standortexporten neu erzeugt |
| 5 | `Finance Summary` und `Finance Details` stimmen je Jahr/Land/Waehrung zusammen |
| 6 | Soll/Ist zeigt keine unerwarteten Abweichungen |
| 7 | Wechselkursfragen getrennt vom lokalen Hauswaehrungsvergleich beurteilt |
| 8 | offene Laenderpunkte dokumentiert |
## Abgleich gegen alte Schulungsaussagen
Diese Punkte waren in aelteren Schulungsunterlagen veraltet und sind mit Stand 2026-06-11 korrigiert:
- Spanien ist nicht mehr pauschal nur Vollfile; Basis plus Range-/Delta-Dateien sind unterstuetzt.
- Nach einem Standortexport kann zusaetzlich eine Audit-CSV entstehen und nach SharePoint hochgeladen werden.
- Dashboard und zentrale Excel koennen optional aus Audit-CSV lesen; frueher war nur `CentralSalesRecords` beschrieben.
- Die Audit-CSV hat den neuen Namen `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv`.
- Die Wechselkurstabelle wird nicht still fuer Standard-Finance-Soll/Ist angewendet.
- Die aktuellen Management-Reiter sind links erreichbar; doppelte obere Reiterbaender wurden reduziert.
@@ -0,0 +1,85 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1180" height="720" viewBox="0 0 1180 720" role="img" aria-labelledby="title desc">
<title id="title">Finance Waehrungs- und Kursfluss</title>
<desc id="desc">Zeigt, wo die App-Kurstabelle verwendet wird und wo keine stille Umrechnung stattfindet.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#334155" />
</marker>
<style>
.title { font: 700 29px Arial, sans-serif; fill: #0f172a; }
.subtitle { font: 400 16px Arial, sans-serif; fill: #475569; }
.box-title { font: 700 16px Arial, sans-serif; fill: #0f172a; }
.box-text { font: 400 13px Arial, sans-serif; fill: #334155; }
.small { font: 400 12px Arial, sans-serif; fill: #64748b; }
.warn { font: 700 13px Arial, sans-serif; fill: #991b1b; }
.line { stroke: #334155; stroke-width: 2.2; fill: none; marker-end: url(#arrow); }
.muted-line { stroke: #94a3b8; stroke-width: 1.5; fill: none; marker-end: url(#arrow); }
.source { fill: #e0f2fe; stroke: #0284c7; }
.standard { fill: #f1f5f9; stroke: #64748b; }
.rate { fill: #fef3c7; stroke: #d97706; }
.convert { fill: #ecfdf5; stroke: #059669; }
.budget { fill: #eef2ff; stroke: #4f46e5; }
.stop { fill: #fef2f2; stroke: #dc2626; }
</style>
</defs>
<rect x="0" y="0" width="1180" height="720" fill="#ffffff" />
<text x="48" y="54" class="title">Waehrungsumrechnung: wann wirkt die Kurstabelle?</text>
<text x="48" y="82" class="subtitle">Standard-Soll/Ist bleibt in Hauswaehrung. Die App-Kurstabelle wirkt nur in expliziten Pfaden.</text>
<rect x="56" y="128" width="260" height="140" rx="8" class="source" />
<text x="80" y="162" class="box-title">Quelle liefert Werte</text>
<text x="80" y="191" class="box-text">SalesPriceValue</text>
<text x="80" y="214" class="box-text">SalesCurrency / CompanyCurrency</text>
<text x="80" y="237" class="box-text">DocumentRate als Quellinfo</text>
<line x1="316" y1="198" x2="392" y2="198" class="line" />
<rect x="400" y="128" width="280" height="140" rx="8" class="standard" />
<text x="424" y="162" class="box-title">Standard Finance</text>
<text x="424" y="191" class="box-text">Finance Summary / Sales_All</text>
<text x="424" y="214" class="box-text">nutzt Hauswaehrung je Land.</text>
<text x="424" y="242" class="warn">Keine stille App-Kursumrechnung</text>
<line x1="540" y1="268" x2="540" y2="344" class="muted-line" />
<rect x="400" y="352" width="280" height="132" rx="8" class="stop" />
<text x="424" y="386" class="box-title">Nicht verwechseln</text>
<text x="424" y="415" class="box-text">DocumentRate kommt aus ERP.</text>
<text x="424" y="438" class="box-text">CurrencyExchangeRates ist</text>
<text x="424" y="461" class="box-text">die App-Kurstabelle.</text>
<rect x="772" y="92" width="308" height="160" rx="8" class="rate" />
<text x="796" y="126" class="box-title">CurrencyExchangeRates</text>
<text x="796" y="155" class="box-text">1. gleiche Waehrung = Faktor 1</text>
<text x="796" y="178" class="box-text">2. direkter Kurs</text>
<text x="796" y="201" class="box-text">3. inverser Kurs</text>
<text x="796" y="224" class="box-text">4. Kreuzkurs ueber EUR</text>
<line x1="926" y1="252" x2="926" y2="316" class="line" />
<rect x="760" y="324" width="332" height="120" rx="8" class="convert" />
<text x="784" y="358" class="box-title">Pfad A: Management Analyse</text>
<text x="784" y="387" class="box-text">Zielwaehrung CHF / EUR / USD</text>
<text x="784" y="410" class="box-text">Anzeige-Wert = Quellwert * Kurs</text>
<line x1="926" y1="444" x2="926" y2="494" class="line" />
<rect x="760" y="502" width="332" height="118" rx="8" class="convert" />
<text x="784" y="536" class="box-title">Pfad B: ConvertCurrency</text>
<text x="784" y="565" class="box-text">Transformation beim Standortexport</text>
<text x="784" y="588" class="box-text">schreibt Zielfeld dauerhaft um.</text>
<rect x="56" y="438" width="260" height="132" rx="8" class="budget" />
<text x="80" y="472" class="box-title">Pfad C: Budget-CHF</text>
<text x="80" y="501" class="box-text">separater Soll/Ist-Kandidat</text>
<text x="80" y="524" class="box-text">Notes = Budget &lt;Jahr&gt;</text>
<text x="80" y="547" class="small">Kontrollsicht, nicht Standard-Ist</text>
<line x1="316" y1="504" x2="392" y2="438" class="muted-line" />
<line x1="680" y1="198" x2="764" y2="172" class="muted-line" />
<line x1="680" y1="418" x2="752" y2="384" class="muted-line" />
<rect x="56" y="612" width="1036" height="62" rx="8" fill="#f8fafc" stroke="#cbd5e1" />
<text x="80" y="649" class="box-title">Kursdatum: Settings &gt; Export Einstellungen &gt; Wechselkurse anwenden auf = PostingDate, InvoiceDate oder ExtractionDate</text>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -1,6 +1,6 @@
# Manual-Import und Delta-Stand
Stand: 2026-06-05
Stand: 2026-06-11
Diese Datei beschreibt, wie manuelle Excel-/CSV-Importe aktuell behandelt werden und wie neue Eintraege bzw. Delta-Dateien verarbeitet werden.
@@ -28,6 +28,7 @@ UK ist aktuell am besten fuer laufende Delta-Lieferungen vorbereitet.
| Auswahl | Jahresdatei zuerst, danach alle spaeteren Delta-Dateien im gleichen Jahr |
| Import | App liest alle ausgewaehlten Dateien in einem Lauf zusammen |
| Persistenz | `CentralSalesRecords` fuer `TRUK` werden ersetzt, nicht blind additiv angehaengt |
| Audit-CSV | optional `Sales_ProcessedMergeInput_TRUK_<Datum>.csv` nach Mapping/Transformation |
| Nach Delta-Lieferung | Delta-Datei in den Ordner legen, `TRUK` exportieren, danach zentrale Excel neu erzeugen |
Wichtig:
@@ -51,6 +52,7 @@ Aktueller Implementierungsstand:
- primaer ueber `SourceLineId`.
- Fallback ueber `TSC + InvoiceNumber + PositionOnInvoice + Material`.
- Beim Standortexport ersetzt die App weiterhin den bisherigen Spanien-Stand in `CentralSalesRecords`, aber mit dem zuvor zusammengesetzten und deduplizierten Gesamtstand.
- Falls Audit-CSV aktiv ist, schreibt der Export zusaetzlich `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv` in den Standort-Exportordner und laedt sie in denselben SharePoint-Landesordner wie die Standort-Excel.
- Wenn nur eine einzelne Delta-Datei direkt als Dateipfad hinterlegt wird, kann weiterhin nur dieses Delta gelesen werden. Fuer Delta-Sync muss deshalb der Ordner hinterlegt sein.
Finance-Logik:
@@ -92,11 +94,18 @@ Offen:
1. Neue Datei oder Delta-Datei im richtigen Ordner bereitstellen.
2. In `Manuelle Importe` Pfad pruefen bzw. Standort aktiv lassen.
3. Standortexport fuer das betroffene Land ausfuehren.
4. Danach `Zentrale Datei neu erzeugen` starten.
5. Im zentralen Excel `Finance Summary` und `Finance Details` pruefen.
4. Falls Audit-CSV fuer Finance/Revision gebraucht wird, im Exportordner `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv` pruefen.
5. Falls die zentrale Auswertung aus CSV erfolgen soll, in `Einstellungen > Export Einstellungen` den Schalter `Zentrale Auswertung aus Audit-CSV` setzen.
6. Danach `Zentrale Datei neu erzeugen` starten.
7. Im zentralen Excel `Finance Summary` und `Finance Details` pruefen.
## Merksatz
Manual-Importe ersetzen pro Standort den aktuellen Stand in `CentralSalesRecords`. Delta-Dateien muessen daher beim Import zusammen mit der passenden Basisdatei gelesen werden. Das ist aktuell nur fuer UK vorgesehen. Spanien und Deutschland muessen immer Vollfiles liefern.
Manual-Importe ersetzen pro Standort den aktuellen Stand in `CentralSalesRecords`. Delta-Dateien muessen daher beim Import zusammen mit der passenden Basisdatei gelesen werden.
Wichtig: Fuer Spanien und Deutschland ist das fachlich/prozessual so vorgesehen und durch den Ersetzungsmechanismus praktisch erforderlich. Eine technische Validierung, die Delta-Dateien fuer ES/DE aktiv blockiert, ist aktuell noch nicht eingebaut.
Aktueller Stand:
- UK: Basis plus Delta-Dateien.
- Spanien: Basis plus `Spain_Sales_range_*.csv`, wenn ein Ordner hinterlegt ist.
- Deutschland: weiterhin Vollfile/Jahresfile, keine Delta-Logik.
- Audit-CSV ist ein zusaetzliches verarbeitetes Prueffile; es ersetzt nicht die originalen Standortdateien.
@@ -1,6 +1,6 @@
# Markdown-Dokumentenstatus
Stand: 2026-06-10
Stand: 2026-06-11
RAG-Hinweis: Fuer tokenarme Kontextauswahl zuerst `docs/RAG_ROUTER.md` laden. Standardmaessig nur die Kurzdateien unter `docs/rag/` laden; diese Datei und andere Original-MDs nur bei Detail-/Auditbedarf.
@@ -18,6 +18,7 @@ Diese Datei ordnet die vorhandenen Markdown-Dateien ein. Ziel ist, alte Arbeitsn
| `docs/FINANCE_ENTSCHEIDE.md` | Finance-Regeln und Kontrollpunkte | Aktuell fuehrend fuer Finance-Logik |
| `entscheide.md` | Kurzfassung der Finance-Fachentscheide | Aktuell als Kurzfassung |
| `docs/FINANCE_DATENFLUSS_ANDREAS_2026-06-08.md` | Technischer Finance-Datenfluss | Aktuell fuer End-to-end-Datenfluss |
| `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` | Aktuelle Finance-Schulung fuer Anwender, Keyuser und Revision | Fuehrend fuer Schulung; ersetzt den alten Word-Inhalt fachlich |
| `docs/PRODUCT_SPARTEN_MAPPING_2026-05-27.md` | Produktsparten-Mapping fuer Group Sales Report | Aktuell fuehrend fuer neues Produktmapping-Thema |
| `docs/HR_KPI_NACHDOKU_2026-05-13.md` | HR-KPI technische/fachliche Nachdoku | Aktualisiert um 2026-05-20 Erweiterungen |
| `docs/PROGRAMM_DIAGRAMME.md` | Uebersicht Diagramme und technische Einordnung | Aktualisiert um neue Anwenderdokus |
@@ -27,7 +28,7 @@ Diese Datei ordnet die vorhandenen Markdown-Dateien ein. Ziel ist, alte Arbeitsn
| Datei | Rolle | Status |
| --- | --- | --- |
| `docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md` | Detailregeln je Land | Behalten |
| `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md` | Isolierter Workflow fuer Kurs-/Waehrungsanwendung vom Land bis Dashboard | Aktuell fuer Kursfragen; SVG daneben |
| `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md` | Isolierter Workflow fuer Kurs-/Waehrungsanwendung vom Land bis Dashboard | Aktuell fuer Kursfragen; SVGs daneben |
| `docs/FINANCE_IT_VORGEHEN_2026-05-18.md` | Italien-Pruefpfad | Behalten |
| `docs/FINANCE_UK_QUELLE_KORREKTUR_2026-05-18.md` | UK-Quellkorrektur | Behalten |
| `docs/SAGE_SPAIN_RCLONE_UPLOAD_GUIDE_2026-06-03.md` | Aktueller Spanien-rclone-All-in-one-Workflow | Ersetzt alte deutsche Anleitung vom 2026-06-03 |
@@ -59,6 +60,14 @@ Diese Dateien wurden am 2026-06-09 aus der aktiven Markdown-Struktur entfernt, w
| `docs/hr_kpi_cockpit_preview.png` | neutrale HR-Cockpit-Vorschaugrafik fuer DOCX |
| `docs/finance_cockpit_preview.png` | neutrale Finance-Cockpit-Vorschaugrafik fuer DOCX |
## Neue Finance-Schulungsgrafiken seit 2026-06-11
| Datei | Zweck |
| --- | --- |
| `docs/FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg` | End-to-end-Prozess vom Standortexport bis Dashboard/zentrale Excel |
| `docs/FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg` | Umschaltung zentrale Quelle: DB oder verarbeitete Audit-CSV |
| `docs/FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg` | Wo die App-Kurstabelle wirkt und wo nicht |
## Bereinigung
Bereinigung 2026-06-09:
@@ -67,6 +76,7 @@ Bereinigung 2026-06-09:
- Die alte deutsche Spanien-rclone-Anleitung wurde entfernt, weil der aktuelle All-in-one-Workflow im Guide vom 2026-06-05 dokumentiert ist.
- Die Alphaplan-Konzept- und Anleitungsdateien vom 2026-06-08 wurden bewusst nicht veraendert.
- Delta 2026-06-10: Produktsparten-Fallback `ProductDivisionMapSet`, India/SAGE-HANA-Deploy und Server-DB-Seeds wurden in `docs/DEPLOYMENT_IIS_HANDOFF_2026-05-19.md`, `spartenlogic/UEBERGABE_PRODUKTSPARTEN_ZUORDNUNG.md`, `docs/rag/DEPLOYMENT.md`, `docs/rag/PROJECT.md` und `lastchange.md` nachdokumentiert.
- Delta 2026-06-11: Finance-Schulung, Audit-CSV-Prozessfluss, zentrale Auswertungsquelle und Kursfluss wurden in `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` und den neuen SVG-Grafiken dokumentiert.
Weiterhin gilt:
+26 -2
View File
@@ -1,6 +1,19 @@
# Programm-Diagramme
Stand: 2026-05-20
Stand: 2026-06-11
## Nachtrag Finance-Schulung 2026-06-11
Die aktuelle Finance-Schulung nutzt drei neue Prozessgrafiken:
- `docs/FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg`
- zeigt den End-to-end-Fluss von Quellsystem ueber Mapping, Transformation, Audit-CSV, Standort-Excel, DB/CSV-Auswertungsquelle bis Dashboard und zentraler Excel.
- `docs/FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg`
- zeigt den Schalter zwischen Standard-Auswertung aus `CentralSalesRecords` und Audit-Auswertung aus den neuesten `Sales_ProcessedMergeInput_*.csv` je TSC.
- `docs/FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg`
- zeigt, dass Standard-Soll/Ist in Hauswaehrung bleibt und die App-Kurstabelle nur in expliziten Analyse-/Transformationspfaden wirkt.
Die Markdown-Schulung dazu ist `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md`.
## Nachtrag Anwenderdokus 2026-05-20
@@ -42,6 +55,15 @@ Fuer das Programm bieten sich zwei Diagrammarten an:
- beschreibt Quelle, Mapping, Hauswaehrung, Nettofakturawert, Buchungsdatum, IC-Ausweis und Sollvergleich
- macht sichtbar, dass der Algorithmus regelbasiert ist und nicht auf einzelne Testzahlen frisiert wurde
- `docs/FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg`
- aktuelle Schulungsgrafik fuer Export Dashboard bis Finance-Ausgabe
- `docs/FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg`
- aktuelle Schulungsgrafik fuer DB-/Audit-CSV-Auswertungsquelle
- `docs/FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg`
- aktuelle Schulungsgrafik fuer Wechselkurs- und Waehrungspfad
## Abgleich gegen Quellcode
Die Diagramme wurden gegen folgende Codebereiche abgeglichen:
@@ -50,7 +72,9 @@ Die Diagramme wurden gegen folgende Codebereiche abgeglichen:
- `Services/DataSources/*`: HANA, SAP Gateway und Manual Excel/CSV Adapter
- `Services/SiteExportService.cs`: Standortexport, Transformation, Excel-Erzeugung, zentrale Speicherung, SharePoint-Upload
- `Services/ExportOrchestrationService.cs`: Export aller aktiven Standorte und anschliessender konsolidierter Export
- `Services/ConsolidatedExportService.cs`: zentrale Datei aus `CentralSalesRecords`
- `Services/ConsolidatedExportService.cs`: zentrale Datei aus der zentralen Auswertungsquelle
- `Services/CentralSalesDataProvider.cs`: Umschaltung zwischen `CentralSalesRecords` und Audit-CSV
- `Services/ExportAuditCsvService.cs`: Schreiben/Lesen von `Sales_ProcessedMergeInput_*.csv`
- `Services/MappedSalesRecordComposer.cs`: gemeinsame Mapping-Engine fuer SAP OData und generisches HANA-Mapping
- `Services/FinanceReconciliationService.cs`: Soll/Ist-Kandidaten, Budgetkurse, IC-Regeln und Ampelstatus
- `Services/DatabaseSeedService.cs`: Seed fuer Quellsysteme, ZSCHWEIZ, Finance-Referenzen, Budgetkurse und IC-Regeln
+5 -2
View File
@@ -1,6 +1,6 @@
# RAG Router
Stand: 2026-06-10
Stand: 2026-06-11
Zweck: Diese Datei zuerst laden. Danach nur die Dateien aus dem passenden Themenblock laden.
@@ -18,7 +18,7 @@ Zweck: Diese Datei zuerst laden. Danach nur die Dateien aus dem passenden Themen
| Aktueller Stand | Projektstatus, letzte Aenderungen, offene Punkte | `docs/rag/PROJECT.md` |
| Finance Cockpit | Soll/Ist, Finance Summary, Regeln, Laenderlogik | `docs/rag/FINANCE.md` |
| Finance Spezialfaelle | IT, UK, ES, Abweichungen | `docs/rag/FINANCE.md` |
| Manual Import | UK-Deltas, ES/DE Vollfiles, Importprozess | `docs/rag/MANUAL_IMPORT.md` |
| Manual Import | UK-Deltas, Spanien Basis+Range, DE Vollfile, Importprozess | `docs/rag/MANUAL_IMPORT.md` |
| HR KPI | HR Dashboard, Formeln, Datenqualitaet, Anwenderstand | `docs/rag/HR_KPI.md` |
| Deployment/IIS | Publish, Server, BiDashboard, TLS, lokaler Uebergang | `docs/rag/DEPLOYMENT.md` |
| Admin/Startseite | Admin Login, Sessions, Landing Page | `docs/rag/ADMIN.md` |
@@ -33,7 +33,9 @@ Zweck: Diese Datei zuerst laden. Danach nur die Dateien aus dem passenden Themen
| `docs/raw_md_archive/original_history_raws.zip` | exakte Originaldateien nur zur Wiederherstellung, nicht fuer RAG laden |
| `docs/MD_DOKUMENTENSTATUS_2026-05-20.md` | Einordnung alter Dokumente |
| `docs/FINANCE_ENTSCHEIDE.md` | Finance-Entscheide im Detail |
| `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` | aktuelle Finance-Schulung, Prozessgrafiken, Audit-CSV und Waehrungsfluss |
| `docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md` | Formeln pro Land |
| `docs/FINANCE_DATENFLUSS_ANDREAS_2026-06-08.md` | technischer Finance-Datenfluss inklusive Audit-CSV |
| `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md` | isolierter Kurs-/Umrechnungsworkflow vom Land bis Dashboard |
| `docs/MANUAL_IMPORT_DELTA_STAND_2026-05-21.md` | Manual-Import-Details |
| `docs/HR_KPI_NACHDOKU_2026-05-13.md` | HR-KPI-Details |
@@ -47,6 +49,7 @@ Zweck: Diese Datei zuerst laden. Danach nur die Dateien aus dem passenden Themen
| Suchwort | Thema |
| --- | --- |
| `Finance Summary`, `Soll/Ist`, `check.xlsx`, `FinanceRuleEngine` | Finance Cockpit |
| `Schulung`, `Training`, `Audit-CSV`, `Sales_ProcessedMergeInput`, `Auswertungsquelle`, `Wirtschaftspruefung` | `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` |
| `Wechselkurs`, `Umrechnungskurs`, `CurrencyExchangeRates`, `DocumentRate`, `ConvertCurrency`, `Anzeige-Waehrung` | `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md` |
| `TRUK`, `UK_B1`, `Delta`, `Manual Excel` | Manual Import / Finance Spezialfaelle |
| `TRDE`, `Alphaplan`, `NettoPreisGesamtX` | Finance Cockpit / Manual Import |
+15 -3
View File
@@ -1,11 +1,13 @@
# RAG Finance
Stand: 2026-06-10
Stand: 2026-06-11
## Kurzstand
- Fuehrende Sicht: `Finance Summary`.
- Neu lokal: `Finance Summary`, zentrale Excel und Management-Analyse koennen wahlweise aus Audit-CSV statt direkt aus `CentralSalesRecords` lesen. Die Audit-CSV werden nach Mapping und Transformation geschrieben und dienen der Nachvollziehbarkeit fuer Finance/Revision.
- Aktuelle Schulung: `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md`.
- `Finance Summary`, zentrale Excel, Soll/Ist und Management-Analyse koennen wahlweise aus Audit-CSV statt direkt aus `CentralSalesRecords` lesen. Die Audit-CSV werden nach Mapping und Transformation geschrieben und dienen der Nachvollziehbarkeit fuer Finance/Revision.
- Audit-CSV-Dateiname: `Sales_ProcessedMergeInput_<TSC>_<yyyy-MM-dd>.csv`; liegt im gleichen Ordner wie das Standort-Excel und wird beim Standortexport in denselben SharePoint-Landesordner hochgeladen.
- `Finance Summary` nutzt dieselbe `FinanceRuleEngine` wie das zentrale Excel.
- `Management Analyse` bleibt Diagnose-/Plausibilitaetssicht, nicht fuehrende Finance-Zahl.
- Nach UX-Vereinfachung gibt es links eine schnellere Finance-Uebersicht; tiefe Diagnosefunktionen sind unter `Experten` gebuendelt.
@@ -35,6 +37,7 @@ Stand: 2026-06-10
- Gutschriften/Storno laufen als negative Beleg-/Positionszeilen.
- Budget-CHF ist Kontroll-/Reporting-Kandidat, nicht Standardabgleich.
- `DocumentRate` aus dem ERP ist ein gespeichertes Quellfeld; die App-Kurstabelle wird nur bei Anzeige-Waehrung, expliziter `ConvertCurrency`-Transformation oder Budget-CHF-Kandidat verwendet.
- Schalter fuer Finance/Revision: `Einstellungen > Export Einstellungen > Audit-CSV / nachvollziehbarer Datenfluss`.
## Offene Fachpunkte
@@ -53,7 +56,15 @@ Stand: 2026-06-10
- `Datenqualitaet`: fehlende Materialnummern, ProductGroup, Waehrung, Kunde, Datum, Nullwerte und ausgeschlossene Zeilen.
- `Spartenanalyse > Finanzanalyse`: Umsatzabdeckung und Umsatz nach Produktsparte/Familie/PAPH1 auf Basis der TR-AG-Referenz.
- `Spartenanalyse > Zentrale Zuordnung`: Materialnummern aller Laender gegen TR-AG-Stamm pruefen.
- `Rohdaten Diagnose`: direkte Plausibilitaets-/Rohdatensicht auf `CentralSalesRecords`.
- `Rohdaten Diagnose`: direkte Plausibilitaets-/Rohdatensicht auf die zentrale Auswertungsquelle.
## Audit-CSV / Auswertungsquelle
- `Audit-CSV je Standort schreiben`: schreibt beim Laenderexport eine verarbeitete CSV nach Mapping und Transformation.
- `Zentrale Auswertung aus Audit-CSV`: zentrale Auswertungen lesen je TSC die neueste `Sales_ProcessedMergeInput_*.csv`.
- Der Pfad ist der `Lokaler Standardpfad Standort-Dateien`; ein separater sichtbarer Audit-Pfad wird nicht verwendet.
- Standard ohne CSV-Schalter: zentrale Auswertungen lesen `CentralSalesRecords`.
- Wenn der CSV-Schalter aktiv ist und keine passenden CSV vorhanden sind, ist die zentrale Auswertung nicht ausfuehrbar.
## Experten / 3D Datenanalyse
@@ -98,6 +109,7 @@ Stand: 2026-06-10
## Rohquellen Nur Bei Bedarf
- Entscheide: `docs/FINANCE_ENTSCHEIDE.md`, `entscheide.md`
- Finance-Schulung: `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md`
- Formeln je Land: `docs/FINANCE_BERECHNUNGSFORMELN_LAENDER_2026-05-19.md`
- Isolierter Kurs-Workflow: `docs/FINANCE_KURS_WORKFLOW_2026-06-09.md`
- IT Detail: `docs/FINANCE_IT_VORGEHEN_2026-05-18.md`
@@ -1,6 +1,6 @@
# RAG Manual Import
Stand: 2026-06-05
Stand: 2026-06-11
## Kurzstand
@@ -10,6 +10,8 @@ Stand: 2026-06-05
- ES/Spanien liest im Ordner alle `Spain_Sales*.csv`, also Basisdatei plus taegliche `Spain_Sales_range_YYYYMMDD_to_YYYYMMDD.csv`.
- Spanien-Deltas werden vor dem Speichern dedupliziert: zuerst `SourceLineId`, sonst Invoice/Position/Material.
- DE muss weiterhin Vollfiles liefern.
- Wenn Audit-CSV aktiv ist, schreibt der Standortexport nach Mapping/Transformation zusaetzlich `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv` in den Standort-Exportordner.
- Zentrale Auswertungen koennen per Setting aus den neuesten Audit-CSV je TSC statt direkt aus `CentralSalesRecords` lesen.
## Laender
@@ -24,8 +26,10 @@ Stand: 2026-06-05
1. Datei oder Delta im richtigen Ordner bereitstellen.
2. In `Manuelle Importe` Pfad/Standort pruefen.
3. Standortexport ausfuehren.
4. Zentrale Datei neu erzeugen.
5. `Finance Summary` und `Finance Details` pruefen.
4. Optional Audit-CSV im Standort-Exportordner pruefen.
5. Zentrale Auswertungsquelle bewusst setzen: DB oder Audit-CSV.
6. Zentrale Datei neu erzeugen.
7. `Finance Summary` und `Finance Details` pruefen.
## Spanien Delta-Sync
+3 -2
View File
@@ -1,11 +1,12 @@
# RAG Project
Stand: 2026-06-10
Stand: 2026-06-11
## Kurzstand
- Fuehrende App: `TrafagSalesExporter`, publiziert als `BiDashboard`.
- Neu lokal: Audit-CSV-Modus fuer Finance/Revision. Standortexporte schreiben optional nach Mapping/Transformation je Standort eine lesbare CSV; zentrale Excel, Finance Summary und Management-Analyse koennen per Setting aus den neuesten Standort-CSV statt aus der internen DB lesen.
- Neu lokal: Audit-CSV-Modus fuer Finance/Revision. Standortexporte schreiben optional nach Mapping/Transformation je Standort `Sales_ProcessedMergeInput_<TSC>_<Datum>.csv`; zentrale Excel, Finance Summary, Soll/Ist und Management-Analyse koennen per Setting aus den neuesten Standort-CSV statt aus der internen DB lesen.
- Aktuelle Finance-Schulung: `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` mit Prozessgrafiken fuer Exportfluss, Audit-CSV-Auswertungsquelle und Waehrungsumrechnung.
- Letzter dokumentierter Stand: CH/AT-Produktsparten-Fallback ueber `ProductDivisionMapSet` deployed; India/TRIN SAGE-HANA-Fix und Spanien-SharePoint-Pfad bleiben abgesichert.
- Validierung laut Doku: `87/87` Tests gruen fuer den Produktsparten-Fallback; fruehere UI-/Deploy-Schritte wurden einzeln umgesetzt und deployed.
- Letzter dokumentierter Deploy: 2026-06-10 auf `\\trch-webapp-bidashboard.trafagch.local\BiDashboard$\`.
+3 -1
View File
@@ -1,6 +1,6 @@
# Last Change
Stand: 2026-06-10
Stand: 2026-06-11
Diese Datei ist fuer tokenarme RAG-Nutzung komprimiert.
@@ -8,6 +8,8 @@ Diese Datei ist fuer tokenarme RAG-Nutzung komprimiert.
- Fuehrender Kurzkontext: `docs/rag/PROJECT.md`.
- Themenrouter: `docs/RAG_ROUTER.md`.
- Neu lokal dokumentiert: aktuelle Finance-Schulung `docs/FINANCE_SCHULUNG_FINANZ_2026-06-11.md` mit Prozessgrafiken fuer Export Dashboard, Audit-CSV-Auswertungsquelle und Waehrungs-/Kursfluss.
- Neue Schulungsgrafiken: `docs/FINANCE_PROZESS_EXPORT_DASHBOARD_2026-06-11.svg`, `docs/FINANCE_AUDIT_CSV_QUELLE_2026-06-11.svg`, `docs/FINANCE_WAEHRUNG_KURSFLUSS_2026-06-11.svg`.
- Neu lokal umgesetzt: Standortexporte koennen nach Mapping und Transformation eine lesbare Audit-CSV je Standort schreiben; zentrale Excel, Finance Summary und Management-Analyse koennen per Setting wahlweise aus den neuesten Audit-CSV statt aus `CentralSalesRecords` lesen.
- Letzter dokumentierter Code-Stand: CH/AT-Produktsparten-Fallback ueber `ProductDivisionMapSet` deployed; India/TRIN HANA-Route und Spanien-SharePoint-Pfad bleiben im Seed abgesichert.
- Letzte dokumentierte Validierung: `dotnet test TrafagSalesExporter.sln --verbosity minimal` mit `87/87` Tests gruen.