This commit is contained in:
seb
2026-07-13 02:55:43 +02:00
parent 8d55da79b0
commit 03dde8eff8
2 changed files with 353 additions and 36 deletions

View File

@@ -51,16 +51,6 @@ function toNumber(value, fallback = 0) {
return Number.isFinite(n) ? n : fallback;
}
function parseCreationDate(value) {
if (value) {
const d = new Date(String(value).replace(' ', 'T'));
if (!Number.isNaN(d.getTime())) {
return d;
}
}
return new Date();
}
// JTL maps VAT rates to Steuerklassen: 19% => 1 (voller Satz), 7% => 2 (ermäßigt)
function steuerklasseForVat(vat) {
if (vat >= 15) return 1;
@@ -441,27 +431,13 @@ async function createLieferscheinPos(transaction, kLieferschein, kAuftragPositio
await request.execute('Versand.spLieferscheinPosErstellen');
}
async function setVersanddatum(transaction, kAuftrag, orderDate) {
await new sql.Request(transaction)
.input('kBestellung', sql.Int, kAuftrag)
.input('dVersanddatum', sql.DateTime, orderDate)
.query(`
MERGE dbo.tVersandInfo AS target
USING (SELECT @kBestellung AS kBestellung) AS src
ON target.kBestellung = src.kBestellung
WHEN MATCHED THEN
UPDATE SET dVersanddatum = @dVersanddatum
WHEN NOT MATCHED THEN
INSERT (kBestellung, dVersanddatum, nAnzahlVersendetePakete, nAnzahlPakete)
VALUES (@kBestellung, @dVersanddatum, 0, 0);
`);
}
/**
* Delivers the full ordered quantity of every position (no partial delivery),
* mirroring DeliveryStep's non-voucher path.
* mirroring DeliveryStep's non-voucher path. Uses the server's current time
* throughout (see createOrder), so there is never a past order date to
* backdate Versanddatum against.
*/
async function deliverOrder(transaction, kAuftrag, orderDate, deliveredItems) {
async function deliverOrder(transaction, kAuftrag, deliveredItems) {
if (!deliveredItems.length) {
return;
}
@@ -469,19 +445,16 @@ async function deliverOrder(transaction, kAuftrag, orderDate, deliveredItems) {
for (const { kAuftragPosition, quantity } of deliveredItems) {
await createLieferscheinPos(transaction, kLieferschein, kAuftragPosition, quantity);
}
if (orderDate < new Date(new Date().toDateString())) {
await setVersanddatum(transaction, kAuftrag, orderDate);
}
}
async function insertPayment(transaction, kAuftrag, payment, order, zahlungsartCache) {
async function insertPayment(transaction, kAuftrag, payment, order, orderDate, zahlungsartCache) {
const zahlungsart = await resolveZahlungsart(transaction, payment.paymentMethodName || order.paymentMethodName, zahlungsartCache);
const kZahlung = await allocatePk(transaction, 'tZahlung');
await new sql.Request(transaction)
.input('kZahlung', sql.Int, kZahlung)
.input('cName', sql.NVarChar, zahlungsart.cName)
.input('dDatum', sql.DateTime, parseCreationDate(order.creationDate))
.input('dDatum', sql.DateTime, orderDate)
.input('fBetrag', sql.Float, toNumber(payment.amount, 0))
.input('kBestellung', sql.Int, kAuftrag)
.input('kBenutzer', sql.Int, config.kBenutzer)
@@ -504,7 +477,10 @@ export async function createOrder(order) {
try {
const zahlungsartCache = new Map();
const orderDate = parseCreationDate(order.creationDate);
// Always use the server's current time for stored timestamps (dErstellt,
// number-sequence date placeholders, payment date) rather than trusting
// the client-supplied order.creationDate.
const orderDate = new Date();
const { kKunde, kKundengruppe } = await resolveCustomer(transaction, order, defaults);
const zahlungsart = await resolveZahlungsart(transaction, order.paymentMethodName, zahlungsartCache);
const cAuftragsNr = await nextOrderNumber(transaction, orderDate);
@@ -559,11 +535,11 @@ export async function createOrder(order) {
}
for (const payment of order.payments || []) {
await insertPayment(transaction, kAuftrag, payment, order, zahlungsartCache);
await insertPayment(transaction, kAuftrag, payment, order, orderDate, zahlungsartCache);
}
if (isOrderDelivered(order)) {
await deliverOrder(transaction, kAuftrag, orderDate, deliveredItems);
await deliverOrder(transaction, kAuftrag, deliveredItems);
}
await new sql.Request(transaction).input('kAuftrag', sql.Int, kAuftrag).query(`