u
This commit is contained in:
@@ -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(`
|
||||
|
||||
Reference in New Issue
Block a user