fix(delivery): deliver orders with father-articles and no-payment orders

- Treat an article that has become a father (nIstVater=1) as a free
  position (kArtikel=0) with the name kept: VersandIntern.vBestellPosOffen
  joins tArtikel with nIstVater=0, so such positions could never be
  reserved and failed with "insufficient stock after POS shortage
  booking" (e.g. Becks 42000030).
- Recalculate tAuftragPositionEckdaten before deliverOrder so orders
  without payments get their positions reserved too (previously only
  insertPayment triggered the recalculation).

Also adds debug logging across the delivery pipeline (reserve, commit,
deliver, session, stock-shortage, create-order).
This commit is contained in:
seb
2026-08-13 13:19:47 +02:00
parent 538ecf7a80
commit 5951e10ea5
14 changed files with 211 additions and 10 deletions

View File

@@ -1,5 +1,6 @@
import sql from 'mssql';
import { xmlTag, xmlElement } from './xml.js';
import { logger } from '../../logger.js';
/**
* Commits this session's reservations into "real" Picklisten (bumps
@@ -16,6 +17,8 @@ import { xmlTag, xmlElement } from './xml.js';
export async function commitPicklists(transaction, kBenutzer, kSessionId, kAuftrag) {
const bestellungen = xmlElement('Bestellung', [xmlTag('kBestellung', kAuftrag)]);
logger.info(`commit: kSessionId=${kSessionId} kAuftrag=${kAuftrag} nTeillieferung=false bestellungen=${bestellungen}`);
await new sql.Request(transaction)
.input('Bestellungen', sql.NVarChar(sql.MAX), bestellungen)
.input('kBenutzer', sql.Int, kBenutzer)
@@ -31,4 +34,6 @@ export async function commitPicklists(transaction, kBenutzer, kSessionId, kAuftr
@kSessionId = @kSessionId,
@xResult = @xResult OUTPUT;
`);
logger.info(`commit: done kSessionId=${kSessionId} kAuftrag=${kAuftrag}`);
}