feat(erp): Gutschrift-Rückschreibung per Config togglen
Neues Flag [erp] gutschrift_writeback_enabled (Default true): steuert, ob die Geld-Gutschrift (GUTSCHRIFT10-Belegzeile) beim Abschluss ins ERP zurückgeschrieben wird. Gutschriften sind bestandsneutral (keine Bestandsführung) → unkritisch, daher standardmäßig an, aber abschaltbar. Die Belegzeilen-Menge wird weiterhin generell NICHT zurückgeschrieben (Bestands-Inkonsistenz); geänderte Belege gehen in die Vier-Augen-Prüfung. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -53,6 +53,10 @@ 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,
|
||||||
|
# daher unkritisch. true = Gutschriften werden ins ERP geschrieben.
|
||||||
|
# (Mengen-Reduktion wird generell NICHT mehr zurückgeschrieben.)
|
||||||
|
gutschrift_writeback_enabled = true
|
||||||
|
|
||||||
# --- ERP-Import-Scheduler -------------------------------------------------
|
# --- ERP-Import-Scheduler -------------------------------------------------
|
||||||
[import]
|
[import]
|
||||||
|
|||||||
@ -86,6 +86,7 @@ impl Config {
|
|||||||
password = %mask(&self.erp.password),
|
password = %mask(&self.erp.password),
|
||||||
trust_cert = self.erp.trust_cert,
|
trust_cert = self.erp.trust_cert,
|
||||||
writeback_enabled = self.erp.writeback_enabled,
|
writeback_enabled = self.erp.writeback_enabled,
|
||||||
|
gutschrift_writeback_enabled = self.erp.gutschrift_writeback_enabled,
|
||||||
"cfg.erp"
|
"cfg.erp"
|
||||||
);
|
);
|
||||||
tracing::info!(
|
tracing::info!(
|
||||||
@ -205,6 +206,12 @@ pub struct ErpConfig {
|
|||||||
/// dann bleibt der Abschluss rein lokal (Dev/Seed ohne ERP-Beleg).
|
/// dann bleibt der Abschluss rein lokal (Dev/Seed ohne ERP-Beleg).
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub writeback_enabled: bool,
|
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 {
|
impl Default for ErpConfig {
|
||||||
@ -217,6 +224,7 @@ impl Default for ErpConfig {
|
|||||||
password: String::new(),
|
password: String::new(),
|
||||||
trust_cert: default_true(),
|
trust_cert: default_true(),
|
||||||
writeback_enabled: false,
|
writeback_enabled: false,
|
||||||
|
gutschrift_writeback_enabled: default_true(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -348,7 +348,10 @@ pub(crate) async fn run_app(
|
|||||||
// ERP-Rückschreiben beim Lieferabschluss. Der Push-Use-Case wird IMMER
|
// ERP-Rückschreiben beim Lieferabschluss. Der Push-Use-Case wird IMMER
|
||||||
// gebaut (Admin-Retry-Endpunkt nutzt ihn manuell). Ob der normale
|
// gebaut (Admin-Retry-Endpunkt nutzt ihn manuell). Ob der normale
|
||||||
// Abschluss-Pfad automatisch pusht, steuert `ERP_WRITEBACK_ENABLED`.
|
// 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(
|
let push_completion_to_erp = Arc::new(PushCompletionToErpUseCase::new(
|
||||||
delivery_completion_repository.clone(),
|
delivery_completion_repository.clone(),
|
||||||
erp_writeback,
|
erp_writeback,
|
||||||
|
|||||||
@ -60,11 +60,17 @@ fn erp_zahlbed_code(pg_code: &str) -> Option<&'static str> {
|
|||||||
|
|
||||||
pub struct MssqlErpDeliveryWriteback {
|
pub struct MssqlErpDeliveryWriteback {
|
||||||
config: MssqlErpConfig,
|
config: MssqlErpConfig,
|
||||||
|
/// Gutschrift-Belegzeile (GUTSCHRIFT10) mit zurückschreiben? Per Config
|
||||||
|
/// abschaltbar (bestandsneutral, daher unkritisch).
|
||||||
|
gutschrift_enabled: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MssqlErpDeliveryWriteback {
|
impl MssqlErpDeliveryWriteback {
|
||||||
pub fn new(config: MssqlErpConfig) -> Self {
|
pub fn new(config: MssqlErpConfig, gutschrift_enabled: bool) -> Self {
|
||||||
Self { config }
|
Self {
|
||||||
|
config,
|
||||||
|
gutschrift_enabled,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn tiberius_config(&self) -> Config {
|
fn tiberius_config(&self) -> Config {
|
||||||
@ -337,6 +343,7 @@ impl MssqlErpDeliveryWriteback {
|
|||||||
async fn run(
|
async fn run(
|
||||||
client: &mut TiberiusClient,
|
client: &mut TiberiusClient,
|
||||||
cmd: &ErpFinishDeliveryCommand,
|
cmd: &ErpFinishDeliveryCommand,
|
||||||
|
gutschrift_enabled: bool,
|
||||||
) -> 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?;
|
||||||
|
|
||||||
@ -346,8 +353,11 @@ impl MssqlErpDeliveryWriteback {
|
|||||||
// Stattdessen bleibt der ERP-Beleg im Original; die Lieferung wird im
|
// Stattdessen bleibt der ERP-Beleg im Original; die Lieferung wird im
|
||||||
// Backend zur Vier-Augen-Prüfung markiert (siehe ReviewRepository) und
|
// Backend zur Vier-Augen-Prüfung markiert (siehe ReviewRepository) und
|
||||||
// die Fakturierung entscheidet manuell. Die Geld-Gutschrift wird
|
// die Fakturierung entscheidet manuell. Die Geld-Gutschrift wird
|
||||||
// weiterhin geschrieben (unkritisch, nur Vier-Augen-Bestätigung).
|
// (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::upsert_gutschrift(client, bk, cmd.credit_amount_cents).await?;
|
||||||
|
}
|
||||||
|
|
||||||
Self::recalc_head(client, bk).await?;
|
Self::recalc_head(client, bk).await?;
|
||||||
|
|
||||||
@ -381,7 +391,7 @@ impl ErpDeliveryWriteback for MssqlErpDeliveryWriteback {
|
|||||||
.await
|
.await
|
||||||
.map_err(repo)?;
|
.map_err(repo)?;
|
||||||
|
|
||||||
match Self::run(&mut client, &cmd).await {
|
match Self::run(&mut client, &cmd, self.gutschrift_enabled).await {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
client.simple_query("COMMIT").await.map_err(repo)?;
|
client.simple_query("COMMIT").await.map_err(repo)?;
|
||||||
tracing::info!(
|
tracing::info!(
|
||||||
|
|||||||
Reference in New Issue
Block a user