Resolve Eulanda Price Row
Zuletzt geändert: 27.05.2026 20:40

Übersicht

Resolve-EulandaPriceRow #

ÜBERSICHT #

Übersetzt Excel-/CSV-/Datanorm-Eingabe-Felder in das EULANDA-Preis- Schema (Vk + BruttoFlg).

SYNTAX #

Resolve-EulandaPriceRow [-Row] <hashtable> [<CommonParameters>]

BESCHREIBUNG #

Das EULANDA-Preis-Datenmodell speichert pro Artikel/KrArtikel nur ZWEI echte Spalten:

• Vk          — der gespeicherte Preis (numeric(18,2))
• BruttoFlg   — Bit-Flag, 0 = Vk ist netto, 1 = Vk ist brutto

VkNetto und VkBrutto sind dagegen COMPUTED-COLUMNS, die der SQL-Server aus Vk + BruttoFlg + MwstSatz selbst rechnet:

VkNetto  = case when BruttoFlg = 0 then Vk
else Vk / (100 + MwstSatz) * 100 end
VkBrutto = case when BruttoFlg = 1 then Vk
else Vk * (100 + MwstSatz) / 100 end

Konsequenz: ein Plugin (Excel-Import, Datanorm, CSV, BMEcat, ZUGFeRD) darf NIE direkt VkNetto/VkBrutto in die DB schreiben — das sind keine Update-Targets. Es muss immer auf Vk + BruttoFlg abgebildet werden, den Rest macht der Computed-Mechanismus automatisch korrekt mit dem in derselben Zeile gespeicherten MwstSatz.

Diese Funktion ist die zentrale Übersetzungs-Regel für alle Plugins. Sie nimmt eine Roh-Zeile (Hashtable mit beliebigen Excel-/CSV- Spalten) und liefert die normalisierten Felder Vk + BruttoFlg zurück. Vorrang-Regeln:

Pfad 1: Vk + BruttoFlg sind beide explizit gesetzt
→ werden 1:1 übernommen. VkNetto/VkBrutto in der Zeile
spielen keine Rolle (absolute Vorfahrt).

Pfad 2: nur Vk gesetzt, BruttoFlg leer/ungültig
→ Vk = Vk, BruttoFlg = 0 (Netto-Default — EULANDA-Konvention).

Pfad 3: Vk leer, VkNetto gesetzt (mit oder ohne VkBrutto)
→ Vk = VkNetto, BruttoFlg = 0. VkBrutto-Wert verfällt;
der SQL-Computed-Mechanismus rechnet VkBrutto neu aus
dem MwstSatz dieser Zeile.

Pfad 4: Vk leer, VkNetto leer, nur VkBrutto gesetzt
→ Vk = VkBrutto, BruttoFlg = 1. SQL rechnet VkNetto.

Pfad 5: nichts gesetzt
→ HasPrice = $false. Aufrufer entfernt alle vier Felder
aus der Update-Row, sodass die DB-Werte unangetastet
bleiben.

Caller-Pattern: vor dem Upsert die VkNetto/VkBrutto-Felder aus dem Row-Hashtable entfernen (sonst würde Invoke-EulUpsert sie als Computed-Spalten zwar still ausfiltern, der DryRun-Diff aber fälschlich auf ihnen vergleichen). Mit HasPrice = $true Vk und BruttoFlg auf die zurückgegebenen Werte setzen.

Bewusste Nicht-Ziele:

  • Keine MwstSatz-Ableitung aus VkNetto/VkBrutto-Paaren. Wenn der User beide liefert, gewinnt VkNetto und VkBrutto wird verworfen — der MwstSatz aus der DB-Zeile (oder der Excel-MwstSatz-Spalte wenn mit übergeben) gilt.
  • Keine Plausibilitäts-Prüfung auf negative Preise oder Limits.

PARAMETER #

-Row #

Type: hashtable

Hashtable mit den Roh-Werten. Erwartete Schlüssel (case-insensitiv): Vk, BruttoFlg, VkNetto, VkBrutto. Fehlende Schlüssel werden als leer behandelt.

BruttoFlg-Werte werden geduldig interpretiert: 0/1/true/false/$true/$false/’netto’/‘brutto’ Alles andere zählt als “nicht gesetzt”.

AUSGABEN #

[hashtable] mit Eigenschaften:

HasPrice (bool) - $false wenn keiner der vier Eingabe-Werte gesetzt war (Aufrufer lässt Vk + BruttoFlg dann weg). Vk (object) - der zu schreibende Vk-Wert (numerisch oder string je nach Excel-Cell-Typ - der Aufrufer verarbeitet das per ConvertTo-SqlLiteral). BruttoFlg (int?) - 0 oder 1, $null wenn HasPrice = $false. Source (string) - Diagnose-Hinweis: ‘Vk+BruttoFlg’, ‘Vk-only’, ‘VkNetto’, ‘VkBrutto’ oder ‘None’. Hilft beim Trockenlauf-Log nachzuvollziehen, woher der Wert kam.

BEISPIELE #

# Beide explizit - 1:1 übernommen
Resolve-EulandaPriceRow -Row @{ Vk = 11.9; BruttoFlg = 1 }
# HasPrice=True, Vk=11.9, BruttoFlg=1, Source='Vk+BruttoFlg'
# Nur Vk - Netto-Default
Resolve-EulandaPriceRow -Row @{ Vk = 10 }
# HasPrice=True, Vk=10, BruttoFlg=0, Source='Vk-only'
# Excel-Roundtrip mit VkNetto+VkBrutto - VkNetto gewinnt
Resolve-EulandaPriceRow -Row @{ VkNetto = 10; VkBrutto = 11.9 }
# HasPrice=True, Vk=10, BruttoFlg=0, Source='VkNetto'
# Nur Brutto-Preis aus Datanorm
Resolve-EulandaPriceRow -Row @{ VkBrutto = 11.9 }
# HasPrice=True, Vk=11.9, BruttoFlg=1, Source='VkBrutto'
# Keine Preis-Spalte in der Zeile
Resolve-EulandaPriceRow -Row @{ ArtNummer = 'A1'; Kurztext1 = 'Test' }
# HasPrice=False, Vk=$null, BruttoFlg=$null, Source='None'

HINWEISE #

Zentrale Regel für alle EULANDA-Plugins, die Artikel- oder KrArtikel- Daten importieren. SQL-Definition der Computed-Columns siehe ErpXe elDbUpdateVersions10.pas:136-137.

TO-DO (offen, nicht trivial): Wenn der Anwender in Excel nur MwstSatz (z.B. 22) ohne passende MwStGr liefert, schreiben wir MwstSatz unverändert in die DB. MwStGr bleibt dann auf dem Bestandswert (z.B. 1 = Voll = 19%) - Resultat ist inkonsistent (Gruppe sagt 19, Satz sagt 22). Der EULANDA-Trigger TR_Ar_Upd (encrypted) könnte den Satz aus MwStGr zurücksetzen, was den User-Wert silent verwirft.

Mögliche Erweiterung: optionaler Parameter -MwstGroups @{ 1=19; 2=7; … } den der Aufrufer aus KonMwstGr einmal lädt. Bei MwstSatz ohne MwStGr wird die Gruppe mit dem kleinsten |Satz - MwstSatz| gewählt (Best-Effort-Closest-Match). Pure-Logic, testbar ohne DB, Domain-Wissen bleibt im Werkzeugkasten zentral.

Bisher nicht implementiert, weil der konkrete Trigger-Effekt erst am Kunden-Stand verifiziert werden muss. Mit Resolve-EulandaPriceRow in der heutigen Form sind wir ohnehin besser als der alte Delphi- Wizard, der VkNetto/VkBrutto komplett ignoriert hat.