revert(erp): Belegzeilen-Mengen wieder ins ERP zurückschreiben
Rücknahme der Entkernung: set_line_menge + die Schleife in run() sind wieder aktiv, d. h. die tatsächlich ausgelieferte Menge wird pro Belegzeile gesetzt. Das umgeht bewusst die ERPframe-Engine (keine Lagerbuchung) — das Lager verbucht den Bestand jetzt MANUELL nach Rückgabe des Geräts. Gutschrift-Toggle + Vier-Augen-Review bleiben unverändert bestehen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -53,9 +53,9 @@ user = "sa"
|
|||||||
password = "<erp-passwort>"
|
password = "<erp-passwort>"
|
||||||
trust_cert = true
|
trust_cert = true
|
||||||
writeback_enabled = false
|
writeback_enabled = false
|
||||||
# Gutschrift-Rückschreibung (GUTSCHRIFT10-Belegzeile) — bestandsneutral,
|
# Gutschrift-Rückschreibung (GUTSCHRIFT10-Belegzeile) separat togglebar.
|
||||||
# daher unkritisch. true = Gutschriften werden ins ERP geschrieben.
|
# true = Gutschriften werden ins ERP geschrieben. Die Belegzeilen-Mengen
|
||||||
# (Mengen-Reduktion wird generell NICHT mehr zurückgeschrieben.)
|
# werden ohnehin zurückgeschrieben (Lager verbucht den Bestand manuell).
|
||||||
gutschrift_writeback_enabled = true
|
gutschrift_writeback_enabled = true
|
||||||
|
|
||||||
# --- ERP-Import-Scheduler -------------------------------------------------
|
# --- ERP-Import-Scheduler -------------------------------------------------
|
||||||
|
|||||||
@ -8,15 +8,15 @@
|
|||||||
//!
|
//!
|
||||||
//! Reihenfolge:
|
//! Reihenfolge:
|
||||||
//! 1. `Belegkopf.row_id` aus (BelegartId, Belegnummer) auflösen.
|
//! 1. `Belegkopf.row_id` aus (BelegartId, Belegnummer) auflösen.
|
||||||
//! 2. Gutschrift-Zeile (`GUTSCHRIFT10`) anlegen/aktualisieren.
|
//! 2. Je Belegzeile die `Menge` auf die ausgelieferte Menge setzen.
|
||||||
//! 3. Belegsummen neu berechnen (`Σ Einzelpreis × Menge`, `Σ Brutto × Menge`).
|
//! 3. Gutschrift-Zeile (`GUTSCHRIFT10`) anlegen/aktualisieren.
|
||||||
//! 4. `_SV_DELIVERY_DELIVERED_AT` + `_SV_DELIVERY_STATE='geliefert'`.
|
//! 4. Belegsummen neu berechnen (`Σ Einzelpreis × Menge`, `Σ Brutto × Menge`).
|
||||||
|
//! 5. `_SV_DELIVERY_DELIVERED_AT` + `_SV_DELIVERY_STATE='geliefert'`.
|
||||||
//!
|
//!
|
||||||
//! **Bewusst NICHT mehr:** das Setzen der Belegzeilen-`Menge`. Eine reduzierte
|
//! Hinweis: Das Setzen der Menge per Raw-`UPDATE` umgeht die ERPframe-Engine,
|
||||||
//! Liefermenge (entfernter Artikel) per Raw-`UPDATE` würde die ERPframe-Engine
|
//! erzeugt also KEINE Lagerbuchung. Das ist gewollt — das Lager verbucht den
|
||||||
//! umgehen und den Lagerbestand inkonsistent machen (keine Gegenbuchung). Der
|
//! Bestand **manuell** nach Rückgabe des Geräts. Geänderte Lieferungen werden
|
||||||
//! ERP-Beleg bleibt daher im Original; geänderte Lieferungen werden im Backend
|
//! zusätzlich zur Vier-Augen-Prüfung markiert.
|
||||||
//! zur Vier-Augen-Prüfung markiert, die Fakturierung entscheidet manuell.
|
|
||||||
//!
|
//!
|
||||||
//! TODO (bewusst hardcoded, später konfigurierbar/aus Stammdaten):
|
//! TODO (bewusst hardcoded, später konfigurierbar/aus Stammdaten):
|
||||||
//! Gutschrift-Artikel `GUTSCHRIFT10`, Konto `8726`, Steuerschlüssel `M19`,
|
//! Gutschrift-Artikel `GUTSCHRIFT10`, Konto `8726`, Steuerschlüssel `M19`,
|
||||||
@ -125,6 +125,25 @@ impl MssqlErpDeliveryWriteback {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Setzt die Menge einer Belegzeile (absolut, idempotent) auf die
|
||||||
|
/// tatsächlich ausgelieferte Menge.
|
||||||
|
async fn set_line_menge(
|
||||||
|
client: &mut TiberiusClient,
|
||||||
|
bk_row_id: i64,
|
||||||
|
belegzeilen_nr: i32,
|
||||||
|
menge: i32,
|
||||||
|
) -> Result<(), ApplicationError> {
|
||||||
|
client
|
||||||
|
.execute(
|
||||||
|
r#"UPDATE Belegzeilen SET Menge = @P1
|
||||||
|
WHERE ParentID = @P2 AND BelegzeilenNr = @P3"#,
|
||||||
|
&[&menge, &bk_row_id, &belegzeilen_nr],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(repo)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Gutschrift-Upsert als EINE Belegzeile mit dem **tatsächlichen Betrag**
|
/// Gutschrift-Upsert als EINE Belegzeile mit dem **tatsächlichen Betrag**
|
||||||
/// (keine 10-€-Einheiten mehr → beliebige Beträge ≤ 150 € exakt abbildbar).
|
/// (keine 10-€-Einheiten mehr → beliebige Beträge ≤ 150 € exakt abbildbar).
|
||||||
/// `amount_cents` = Geld-Gutschrift in Cent (Brutto; 0 = keine).
|
/// `amount_cents` = Geld-Gutschrift in Cent (Brutto; 0 = keine).
|
||||||
@ -347,14 +366,15 @@ impl MssqlErpDeliveryWriteback {
|
|||||||
) -> Result<(), ApplicationError> {
|
) -> Result<(), ApplicationError> {
|
||||||
let bk = Self::resolve_belegkopf(client, cmd.belegart_id, &cmd.belegnummer).await?;
|
let bk = Self::resolve_belegkopf(client, cmd.belegart_id, &cmd.belegnummer).await?;
|
||||||
|
|
||||||
// BEWUSST KEIN Setzen der Belegzeilen-Mengen mehr: eine reduzierte
|
// Je Belegzeile die Menge auf die ausgelieferte Menge setzen. Umgeht
|
||||||
// Liefermenge (entfernter Artikel) würde im ERP eine Bestands-
|
// die ERPframe-Engine (keine Lagerbuchung) — das Lager verbucht den
|
||||||
// Inkonsistenz erzeugen (die Engine bucht beim Raw-UPDATE nicht mit).
|
// Bestand manuell nach Rückgabe des Geräts. Geänderte Lieferungen sind
|
||||||
// Stattdessen bleibt der ERP-Beleg im Original; die Lieferung wird im
|
// zusätzlich per Vier-Augen-Prüfung markiert.
|
||||||
// Backend zur Vier-Augen-Prüfung markiert (siehe ReviewRepository) und
|
for line in &cmd.lines {
|
||||||
// die Fakturierung entscheidet manuell. Die Geld-Gutschrift wird
|
Self::set_line_menge(client, bk, line.belegzeilen_nr, line.delivered_quantity).await?;
|
||||||
// (sofern per Config aktiviert) weiterhin geschrieben — bestandsneutral,
|
}
|
||||||
// daher unkritisch, nur Vier-Augen-Bestätigung.
|
|
||||||
|
// Geld-Gutschrift (sofern per Config aktiviert).
|
||||||
if gutschrift_enabled {
|
if gutschrift_enabled {
|
||||||
Self::upsert_gutschrift(client, bk, cmd.credit_amount_cents).await?;
|
Self::upsert_gutschrift(client, bk, cmd.credit_amount_cents).await?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user