diff --git a/config.example.toml b/config.example.toml index 2534cd0..bd8bd5e 100644 --- a/config.example.toml +++ b/config.example.toml @@ -53,6 +53,10 @@ user = "sa" password = "" trust_cert = true writeback_enabled = false +# Gutschrift-Rückschreibung (GUTSCHRIFT10-Belegzeile) — bestandsneutral, +# daher unkritisch. true = Gutschriften werden ins ERP geschrieben. +# (Mengen-Reduktion wird generell NICHT mehr zurückgeschrieben.) +gutschrift_writeback_enabled = true # --- ERP-Import-Scheduler ------------------------------------------------- [import] diff --git a/crates/api/src/config.rs b/crates/api/src/config.rs index a50c1a9..d10886b 100644 --- a/crates/api/src/config.rs +++ b/crates/api/src/config.rs @@ -86,6 +86,7 @@ impl Config { password = %mask(&self.erp.password), trust_cert = self.erp.trust_cert, writeback_enabled = self.erp.writeback_enabled, + gutschrift_writeback_enabled = self.erp.gutschrift_writeback_enabled, "cfg.erp" ); tracing::info!( @@ -205,6 +206,12 @@ pub struct ErpConfig { /// dann bleibt der Abschluss rein lokal (Dev/Seed ohne ERP-Beleg). #[serde(default)] pub writeback_enabled: bool, + /// **Gutschrift**-Rückschreibung (GUTSCHRIFT10-Belegzeile) aktiv? Default + /// `true`. Gutschriften sind bestandsneutral (keine Bestandsführung) → + /// unkritisch, aber per Flag abschaltbar. Greift nur, wenn + /// `writeback_enabled = true`. + #[serde(default = "default_true")] + pub gutschrift_writeback_enabled: bool, } impl Default for ErpConfig { @@ -217,6 +224,7 @@ impl Default for ErpConfig { password: String::new(), trust_cert: default_true(), writeback_enabled: false, + gutschrift_writeback_enabled: default_true(), } } } diff --git a/crates/api/src/main.rs b/crates/api/src/main.rs index e8afa16..c66bd7e 100644 --- a/crates/api/src/main.rs +++ b/crates/api/src/main.rs @@ -348,7 +348,10 @@ pub(crate) async fn run_app( // ERP-Rückschreiben beim Lieferabschluss. Der Push-Use-Case wird IMMER // gebaut (Admin-Retry-Endpunkt nutzt ihn manuell). Ob der normale // Abschluss-Pfad automatisch pusht, steuert `ERP_WRITEBACK_ENABLED`. - let erp_writeback = Arc::new(MssqlErpDeliveryWriteback::new(erp_mssql_config)); + let erp_writeback = Arc::new(MssqlErpDeliveryWriteback::new( + erp_mssql_config, + cfg.erp.gutschrift_writeback_enabled, + )); let push_completion_to_erp = Arc::new(PushCompletionToErpUseCase::new( delivery_completion_repository.clone(), erp_writeback, diff --git a/crates/infrastructure/src/erp/mssql_delivery_writeback.rs b/crates/infrastructure/src/erp/mssql_delivery_writeback.rs index a908df7..5408081 100644 --- a/crates/infrastructure/src/erp/mssql_delivery_writeback.rs +++ b/crates/infrastructure/src/erp/mssql_delivery_writeback.rs @@ -60,11 +60,17 @@ fn erp_zahlbed_code(pg_code: &str) -> Option<&'static str> { pub struct MssqlErpDeliveryWriteback { config: MssqlErpConfig, + /// Gutschrift-Belegzeile (GUTSCHRIFT10) mit zurückschreiben? Per Config + /// abschaltbar (bestandsneutral, daher unkritisch). + gutschrift_enabled: bool, } impl MssqlErpDeliveryWriteback { - pub fn new(config: MssqlErpConfig) -> Self { - Self { config } + pub fn new(config: MssqlErpConfig, gutschrift_enabled: bool) -> Self { + Self { + config, + gutschrift_enabled, + } } fn tiberius_config(&self) -> Config { @@ -337,6 +343,7 @@ impl MssqlErpDeliveryWriteback { async fn run( client: &mut TiberiusClient, cmd: &ErpFinishDeliveryCommand, + gutschrift_enabled: bool, ) -> Result<(), ApplicationError> { let bk = Self::resolve_belegkopf(client, cmd.belegart_id, &cmd.belegnummer).await?; @@ -346,8 +353,11 @@ impl MssqlErpDeliveryWriteback { // Stattdessen bleibt der ERP-Beleg im Original; die Lieferung wird im // Backend zur Vier-Augen-Prüfung markiert (siehe ReviewRepository) und // die Fakturierung entscheidet manuell. Die Geld-Gutschrift wird - // weiterhin geschrieben (unkritisch, nur Vier-Augen-Bestätigung). - Self::upsert_gutschrift(client, bk, cmd.credit_amount_cents).await?; + // (sofern per Config aktiviert) weiterhin geschrieben — bestandsneutral, + // daher unkritisch, nur Vier-Augen-Bestätigung. + if gutschrift_enabled { + Self::upsert_gutschrift(client, bk, cmd.credit_amount_cents).await?; + } Self::recalc_head(client, bk).await?; @@ -381,7 +391,7 @@ impl ErpDeliveryWriteback for MssqlErpDeliveryWriteback { .await .map_err(repo)?; - match Self::run(&mut client, &cmd).await { + match Self::run(&mut client, &cmd, self.gutschrift_enabled).await { Ok(()) => { client.simple_query("COMMIT").await.map_err(repo)?; tracing::info!(