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

341
order.md Normal file
View File

@@ -0,0 +1,341 @@
socket.on("sendOrder", async (customerOrder, paymentNote, customerNote, delivery, employee, article, articleAmount, customerId, orderType, callback) => {
logger.info([socket.id, 'sendOrder', JSON.stringify(customerOrder, null, 2), paymentNote, customerNote, delivery, employee, article, articleAmount, customerId, orderType]);
if (article) {
paymentNote = "[AZ] " + paymentNote;
}
let transaction;
let rolledBack = false;
try {
transaction = new sql.Transaction(pool);
await transaction.begin(sql.ISOLATION_LEVEL.READ_UNCOMMITTED);
transaction.on("rollback", () => {
rolledBack = true;
});
let kKunde;
const resultNum = await new sql.Request(transaction).input("cKundenNr", customerId).query("SELECT 1 as collision,tKunde.kKunde FROM dbo.tKunde WHERE cKundenNr = @cKundenNr");
if (resultNum.recordset[0] && resultNum.recordset[0].collision == 1) {
kKunde = resultNum.recordset[0].kKunde;
} else {
throw new Error('falsche Kundennummer');
}
if (orderType != 'offer') orderType = 'order';
const resultNumA = await new sql.Request(transaction).query("DECLARE @Number int; " + "UPDATE dbo.tLaufendeNummern SET nNummer = nNummer + 1 , @Number = nNummer WHERE kLaufendeNummer = " + ((orderType == 'order') ? 3 : 4) + "; " + "SELECT @Number as auftragNummer;");
const auftragNummer = resultNumA.recordset[0].auftragNummer;
const resultAuftrag = await new sql.Request(transaction)
.input("cAuftragsNr", ((orderType == 'order') ? 'A-' : 'AN-') + auftragNummer)
.input("kKunde", kKunde)
.input("nType", (orderType == 'order') ? 1 : 0)
.input("cKundenNr", customerId)
.input("dVoraussichtlichesLieferdatum", sql.DateTime2, new Date(delivery))
.query(
`DECLARE @t table([kAuftrag] int); INSERT INTO [eazybusiness].[Verkauf].[tAuftrag]
(cAuftragsNr,dVoraussichtlichesLieferdatum,nKomplettAusgeliefert,kBenutzer,kKunde,kBenutzerErstellt,nType,fFaktor,kFirmaHistory,kSprache,cVersandlandWaehrung,fVersandlandWaehrungFaktor,fFinanzierungskosten,cWaehrung,kPlattform,cKundenNr,cVersandlandISO,kVersandArt,kZahlungsart,kKundengruppe)
OUTPUT inserted.kAuftrag INTO @t values (@cAuftragsNr,@dVoraussichtlichesLieferdatum,0,1,@kKunde,1,@nType,1.0,5,1,'EUR',1.0,0.0,'EUR',1,@cKundenNr,'DE',2,11,1);SELECT * FROM @t`
);
const kAuftrag = resultAuftrag.recordset[0].kAuftrag;
await new sql.Request(transaction).input("kAuftrag", kAuftrag).input("kKunde", kKunde).query(
`insert into Verkauf.tAuftragAdresse (kAuftrag,kKunde,cFirma,cAnrede,cTitel,cVorname,cName,cStrasse,cPLZ,cOrt,cLand,cTel,cZusatz,cAdressZusatz,cMobil,cMail,cFax,cBundesland,cISO,nTyp,nZolldokumenteErforderlich)
values (@kAuftrag,@kKunde,'','','','','-','-','','-','Deutschland','','','','','','','','DE',0,0)`
);
await new sql.Request(transaction).input("kAuftrag", kAuftrag).input("kKunde", kKunde).query(
`insert into Verkauf.tAuftragAdresse (kAuftrag,kKunde,cFirma,cAnrede,cTitel,cVorname,cName,cStrasse,cPLZ,cOrt,cLand,cTel,cZusatz,cAdressZusatz,cMobil,cMail,cFax,cBundesland,cISO,nTyp,nZolldokumenteErforderlich)
values (@kAuftrag,@kKunde,'','','','','-','-','','-','Deutschland','','','','','','','','DE',1,0)`
);
for (const item of customerOrder) {
if (item.price == null) item.price = 0;
const mwst = ((parseInt(item.kSteuerklasse) === 1) ? 19 : ((parseInt(item.kSteuerklasse) === 2) ? 7 : 0));
if (item.type == "free") {
const res_a = await new sql.Request(transaction)
.input("kAuftrag", kAuftrag)
.input("fVkNetto", parseFloat(item.price) / ((mwst + 100) / 100))
.input("cName", item.cName)
.input("fRabatt", parseFloat(item.rabatt.toString().replace(/,/, '.')))
.input("fAnzahl", item.count)
.input("fMwSt", mwst)
.input("kSteuerklasse", item.kSteuerklasse)
.query(
`INSERT INTO Verkauf.tAuftragPosition (kArtikel,kAuftrag,cArtNr,nReserviert,cName,cHinweis,fAnzahl,fVkNetto,fMwSt,cNameStandard,kSteuerklasse,nType,cEinheit,fFaktor,kSteuerschluessel,fRabatt)
VALUES (NULL,@kAuftrag,NULL,1,@cName,'',@fAnzahl,@fVkNetto,@fMwSt,@cName,@kSteuerklasse,0,NULL,1.0,3,@fRabatt); SELECT SCOPE_IDENTITY() AS kAuftragPosition`
);
await new sql.Request(transaction)
.input("kRef1", kAuftrag)
.input("cRef1", 'kAuftrag')
.input("kRef2", res_a.recordset[0].kAuftragPosition)
.input("cRef2", 'kAuftragPosition')
.input("cType", "handle_freePos_order")
.input("cState", "new")
.query(
`INSERT INTO dbo.tIncident (cType,cState,cRef1,kRef1,cRef2,kRef2)
VALUES (@cType,@cState,@cRef1,@kRef1,@cRef2,@kRef2)`
);
} else if (item.type == "article") {
await new sql.Request(transaction)
.input("kAuftrag", kAuftrag)
.input("fVkNetto", parseFloat(item.price) / ((mwst + 100) / 100))
.input("fAnzahl", item.count)
.input("cName", item.cName)
.input("fRabatt", parseFloat(item.rabatt.toString().replace(/,/, '.')))
.input("cArtNr", item.cArtNr)
.input("fMwSt", mwst)
.input("kSteuerklasse", item.kSteuerklasse)
.input("kArtikel", item.kArtikel)
.query(
`INSERT INTO Verkauf.tAuftragPosition (kArtikel,kAuftrag,cArtNr,nReserviert,cName,cHinweis,fAnzahl,fVkNetto,fMwSt,cNameStandard,kSteuerklasse,nType,cEinheit,fFaktor,kSteuerschluessel,fRabatt)
VALUES (@kArtikel,@kAuftrag,@cArtNr,1,@cName,'',@fAnzahl,@fVkNetto,@fMwSt,@cName,@kSteuerklasse,1,'',1.0,3,@fRabatt)`
);
}
}
await pool.request().input("kAuftrag", kAuftrag).query(
`declare @p1 Verkauf.TYPE_spAuftragEckdatenBerechnen
insert into @p1 values(@kAuftrag)
exec Verkauf.spAuftragEckdatenBerechnen @auftrag=@p1`
);
await transaction.commit();
SELECT TOP (1000) [kZahlungsart]
,[cName]
,[cPrtString]
,[nLastschrift]
,[cPrtStringVor]
,[cPaymentOption]
,[cKonto]
,[nAusliefernVorZahlung]
,[nPrioritaet]
,[nMahnwesenAktiv]
,[fSkontoWert]
,[nSkontoZeitraum]
,[bRowversion]
,[nMatchingOptionen]
,[nIstStandard]
,[nAktiv]
FROM [eazybusiness].[dbo].[tZahlungsart]
kZahlungsart cName cPrtString nLastschrift cPrtStringVor cPaymentOption cKonto nAusliefernVorZahlung nPrioritaet nMahnwesenAktiv fSkontoWert nSkontoZeitraum bRowversion nMatchingOptionen nIstStandard nAktiv
1 Bar NULL NULL NULL 0 0 0 NULL NULL 0x00000000000019D8 0 1 1
2 Überweisung NULL NULL NULL 0 0 0 NULL NULL 0x00000000000019D9 0 0 1
3 Scheck NULL NULL NULL 0 0 0 NULL NULL 0x00000000000019DA 0 0 1
4 Kreditkarte NULL NULL NULL 0 0 0 NULL NULL 0x00000000000019DB 0 0 1
5 eBay Rechnungskauf NULL 0 NULL NULL NULL 0 0 NULL NULL 0x00000000000019DC 0 0 1
6 eBay Managed Payments NULL NULL NULL NULL NULL NULL 0 0 NULL NULL 0x00000000000019DD 0 0 1
7 Karte 0 0 0 0 0.0000000000000 0 0x00000000000387CA 0 0 0
8 k2 0 0 0 0 0.0000000000000 0 0x0000000000038ABD 0 0 0
SELECT TOP (1000) [kZahlung]
,[cName]
,[dDatum]
,[fBetrag]
,[kBestellung]
,[kBenutzer]
,[nAnzahlung]
,[cHinweis]
,[kZahlungsart]
,[nKeinExport]
,[cSKRManuell]
,[cExternalTransactionId]
,[kZahlungsabgleichUmsatz]
,[nZuweisungstyp]
,[nZahlungstyp]
,[cZuweisungsinfo]
,[nZuweisungswertung]
,[kRechnung]
,[bRowversion]
,[kGutschrift]
,[kEingangsrechnung]
FROM [eazybusiness].[dbo].[tZahlung]
kZahlung cName dDatum fBetrag kBestellung kBenutzer nAnzahlung cHinweis kZahlungsart nKeinExport cSKRManuell cExternalTransactionId kZahlungsabgleichUmsatz nZuweisungstyp nZahlungstyp cZuweisungsinfo nZuweisungswertung kRechnung bRowversion kGutschrift kEingangsrechnung
187 Bar 2026-07-11 19:08:10.000 14.3000000000000 1152 1 0 1 0 NULL R00178 NULL 0 0 0 NULL 0x0000000000045A6A NULL NULL
188 Bar 2026-07-11 19:10:07.000 2.2000000000000 1153 1 0 1 0 NULL R00179 NULL 0 0 0 NULL 0x0000000000045B1E NULL NULL
189 Karte 2026-07-11 19:26:52.000 9.9500000000000 1154 1 0 7 0 R00180 NULL 0 0 0 NULL 0x0000000000045C55 NULL NULL
190 Bar 2026-07-11 19:45:29.000 12.0000000000000 1155 1 0 1 0 NULL R00181 NULL 0 0 0 NULL 0x0000000000045DB2 NULL NULL
191 Bar 2026-07-11 19:47:45.000 12.7500000000000 1156 1 0 1 0 NULL R00182 NULL 0 0 0 NULL 0x0000000000045E8B NULL NULL
192 Karte 2026-07-11 19:59:29.000 18.4500000000000 1157 1 0 7 0 R00183 NULL 0 0 0 NULL 0x0000000000045F62 NULL NULL
193 Bar 2026-07-11 20:01:38.000 19.0000000000000 1158 1 0 1 0 NULL R00184 NULL 0 0 0 NULL 0x0000000000045FF7 NULL NULL
194 Karte 2026-07-11 20:02:56.000 2.3000000000000 1159 1 0 7 0 R00185 NULL 0 0 0 NULL 0x0000000000046068 NULL NULL
195 Karte 2026-07-11 20:03:35.000 1.0000000000000 1160 1 0 7 0 R00186 NULL 0 0 0 NULL 0x00000000000460D9 NULL NULL
196 Bar 2026-07-11 20:15:51.000 33.6000000000000 1161 1 0 1 0 NULL R00187 NULL 0 0 0 NULL 0x00000000000461DB NULL NULL
197 Karte 2026-07-11 20:25:56.000 14.0000000000000 1162 1 0 7 0 R00188 NULL 0 0 0 NULL 0x0000000000046299 NULL NULL
198 Karte 2026-07-11 20:27:25.000 6.7000000000000 1163 1 0 7 0 R00189 NULL 0 0 0 NULL 0x0000000000046307 NULL NULL
199 Karte 2026-07-11 20:28:02.000 6.9500000000000 1164 1 0 7 0 R00190 NULL 0 0 0 NULL 0x000000000004635F NULL NULL
SELECT TOP (1000) [cName]
,[nummer]
,[dChanged]
,[bRowversion]
FROM [eazybusiness].[dbo].[tpk]
cName nummer dChanged bRowversion
tZahlung 200 2026-07-11 0x0000000000046358
cName nummer dChanged bRowversion
tZahlungsart 9 2026-07-07 0x0000000000038ABC
SELECT TOP (1000) [kVersand]
,[kLieferschein]
,[kBenutzer]
,[kLogistik]
,[cIdentCode]
,[dErstellt]
,[cHinweis]
,[fGewicht]
,[kVersandArt]
,[cLogistiker]
,[cFulfillmentCenter]
,[dAnkunftszeit]
,[nVerpackZeitSek]
,[dVersendet]
,[nStatus]
,[cShipmentId]
,[cReference]
,[cShipmentOrderId]
,[kKartonAuftragPos]
,[bRowversion]
,[cEnclosedReturnIdentCode]
,[nViaAmazonMWS]
,[kReturnVersandart]
FROM [eazybusiness].[dbo].[tVersand]
kVersand kLieferschein kBenutzer kLogistik cIdentCode dErstellt cHinweis fGewicht kVersandArt cLogistiker cFulfillmentCenter dAnkunftszeit nVerpackZeitSek dVersendet nStatus cShipmentId cReference cShipmentOrderId kKartonAuftragPos bRowversion cEnclosedReturnIdentCode nViaAmazonMWS
1149 1149 1 0 2026-07-11 16:45:43.380 0.0000000000000 2 NULL 0 2026-07-11 16:45:43.380 0 NULL NULL NULL NULL 0x00000000000458FB 0
1150 1150 1 0 2026-07-11 17:07:56.030 0.0000000000000 2 NULL 0 2026-07-11 17:07:56.030 0 NULL NULL NULL NULL 0x0000000000045A19 0
1151 1151 1 0 2026-07-11 17:10:04.430 0.0000000000000 2 NULL 0 2026-07-11 17:10:04.430 0 NULL NULL NULL NULL 0x0000000000045AD4 0
1152 1152 1 0 2026-07-11 17:11:14.023 0.0000000000000 2 NULL 0 2026-07-11 17:11:14.023 0 NULL NULL NULL NULL 0x0000000000045B43 0
1153 1153 1 0 2026-07-11 17:27:14.687 0.0000000000000 2 NULL 0 2026-07-11 17:27:14.687 0 NULL NULL NULL NULL 0x0000000000045C7A 0
1154 1154 1 0 2026-07-11 17:47:24.573 0.0000000000000 2 NULL 0 2026-07-11 17:47:24.570 0 NULL NULL NULL NULL 0x0000000000045E1C 0
1155 1155 1 0 2026-07-11 17:52:59.990 0.0000000000000 2 NULL 0 2026-07-11 17:52:59.990 0 NULL NULL NULL NULL 0x0000000000045ECE 0
1156 1156 1 0 2026-07-11 18:01:31.267 0.0000000000000 2 NULL 0 2026-07-11 18:01:31.267 0 NULL NULL NULL NULL 0x0000000000045FAF 0
1157 1157 1 0 2026-07-11 18:02:07.393 0.0000000000000 2 NULL 0 2026-07-11 18:02:07.393 0 NULL NULL NULL NULL 0x0000000000046026 0
1158 1158 1 0 2026-07-11 18:03:15.873 0.0000000000000 2 NULL 0 2026-07-11 18:03:15.873 0 NULL NULL NULL NULL 0x000000000004609F 0
1159 1159 1 0 2026-07-11 18:03:50.530 0.0000000000000 2 NULL 0 2026-07-11 18:03:50.530 0 NULL NULL NULL NULL 0x0000000000046102 0
1160 1160 1 0 2026-07-11 18:19:57.820 0.0000000000000 2 NULL 0 2026-07-11 18:19:57.817 0 NULL NULL NULL NULL 0x0000000000046233 0
1161 1161 1 0 2026-07-11 18:26:14.487 0.0000000000000 2 NULL 0 2026-07-11 18:26:14.487 0 NULL NULL NULL NULL 0x00000000000462C7 0
1162 1162 1 0 2026-07-11 18:27:55.337 0.0000000000000 2 NULL 0 2026-07-11 18:27:55.337 0 NULL NULL NULL NULL 0x000000000004632C 0
1163 1163 1 0 2026-07-11 18:28:26.020 0.0000000000000 2 NULL 0 2026-07-11 18:28:26.017 0 NULL NULL NULL NULL 0x0000000000046384 0
SELECT TOP (1000) [kAuftrag]
,[kBenutzer]
,[kKunde]
,[cAuftragsNr]
,[nType]
,[dErstellt]
,[kShopauftrag]
,[nBeschreibung]
,[cInet]
,[cWaehrung]
,[fFaktor]
,[kShop]
,[kFirmaHistory]
,[kPlattform]
,[kSprache]
,[cExterneAuftragsnummer]
,[nSteuereinstellung]
,[cEbayUsername]
,[cShopZahlungsmodul]
,[nHatUpload]
,[fZusatzGewicht]
,[cVersandlandISO]
,[cVersandlandBundeslandKuerzel]
,[cVersandlandWaehrung]
,[fVersandlandWaehrungFaktor]
,[kVersandArt]
,[nZahlungszielTage]
,[dVoraussichtlichesLieferdatum]
,[dAuslieferdatum]
,[fSkonto]
,[nSkontoTage]
,[kVorgangsstatus]
,[nStorno]
,[nKomplettAusgeliefert]
,[nLieferPrioritaet]
,[nPremiumVersand]
,[kRueckhaltegrund]
,[kZahlungsart]
,[kWarenlager]
,[nIstExterneRechnung]
,[nIstReadOnly]
,[nMaxLiefertage]
,[cOutboundId]
,[kFulfillmentLieferant]
,[cUstId]
,[nArchiv]
,[nReserviert]
,[nDebitorennr]
,[nAuftragStatus]
,[cKundenAuftragsnummer]
,[cAmazonServiceLevel]
,[dExternesErstelldatum]
,[kFarbe]
,[fFinanzierungskosten]
,[kAuftragQuelle]
,[nAuftragQuelleAktion]
,[kArtikelKarton]
,[bRowversion]
,[cKundenNr]
,[kKundengruppe]
,[dErstelltWawi]
,[dAuslieferungAb]
,[kAmazonUser]
,[cKundeUstId]
,[nPending]
,[kBenutzerErstellt]
,[nSteuersonderbehandlung]
FROM [eazybusiness].[Verkauf].[tAuftrag]
kAuftrag kBenutzer kKunde cAuftragsNr nType dErstellt kShopauftrag nBeschreibung cInet cWaehrung fFaktor kShop kFirmaHistory kPlattform kSprache cExterneAuftragsnummer nSteuereinstellung cEbayUsername cShopZahlungsmodul nHatUpload fZusatzGewicht cVersandlandISO cVersandlandBundeslandKuerzel cVersandlandWaehrung fVersandlandWaehrungFaktor kVersandArt nZahlungszielTage dVoraussichtlichesLieferdatum dAuslieferdatum fSkonto nSkontoTage kVorgangsstatus nStorno nKomplettAusgeliefert nLieferPrioritaet nPremiumVersand kRueckhaltegrund kZahlungsart kWarenlager nIstExterneRechnung nIstReadOnly nMaxLiefertage cOutboundId kFulfillmentLieferant cUstId nArchiv nReserviert nDebitorennr nAuftragStatus cKundenAuftragsnummer cAmazonServiceLevel dExternesErstelldatum kFarbe fFinanzierungskosten kAuftragQuelle nAuftragQuelleAktion kArtikelKarton bRowversion cKundenNr kKundengruppe dErstelltWawi dAuslieferungAb kAmazonUser cKundeUstId nPending kBenutzerErstellt nSteuersonderbehandlung
1148 1 1 A10182 1 2026-07-11 18:39:30.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00174 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045814 0 1 2026-07-11 16:39:55.640 NULL NULL 0 0 0
1149 1 1 A10183 1 2026-07-11 18:43:51.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00175 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045894 0 1 2026-07-11 16:44:08.557 NULL NULL 0 0 0
1150 1 1 A10184 1 2026-07-11 18:45:08.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00176 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x000000000004590B 0 1 2026-07-11 16:45:42.850 NULL NULL 0 0 0
1151 1 1 A10185 1 2026-07-11 18:47:54.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00177 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045A2A 0 1 2026-07-11 17:07:55.803 NULL NULL 0 0 0
1152 1 1 A10186 1 2026-07-11 19:08:10.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00178 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045AF1 0 1 2026-07-11 17:10:04.070 NULL NULL 0 0 0
1153 1 1 A10187 1 2026-07-11 19:10:07.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00179 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045B51 0 1 2026-07-11 17:11:13.527 NULL NULL 0 0 0
1154 1 1 A10188 1 2026-07-11 19:26:52.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00180 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045C88 0 1 2026-07-11 17:27:14.490 NULL NULL 0 0 0
1155 1 1 A10189 1 2026-07-11 19:45:29.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00181 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045E2D 0 1 2026-07-11 17:47:23.770 NULL NULL 0 0 0
1156 1 1 A10190 1 2026-07-11 19:47:45.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00182 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045EE2 0 1 2026-07-11 17:52:59.733 NULL NULL 0 0 0
1157 1 1 A10191 1 2026-07-11 19:59:29.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00183 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000045FC3 0 1 2026-07-11 18:01:30.943 NULL NULL 0 0 0
1158 1 1 A10192 1 2026-07-11 20:01:38.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00184 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000046034 0 1 2026-07-11 18:02:07.167 NULL NULL 0 0 0
1159 1 1 A10193 1 2026-07-11 20:02:56.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00185 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x00000000000460B0 0 1 2026-07-11 18:03:15.633 NULL NULL 0 0 0
1160 1 1 A10194 1 2026-07-11 20:03:35.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00186 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000046110 0 1 2026-07-11 18:03:50.343 NULL NULL 0 0 0
1161 1 1 A10195 1 2026-07-11 20:15:51.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00187 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 1 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x000000000004624A 0 1 2026-07-11 18:19:57.537 NULL NULL 0 0 0
1162 1 1 A10196 1 2026-07-11 20:25:56.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00188 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x00000000000462D5 0 1 2026-07-11 18:26:14.297 NULL NULL 0 0 0
1163 1 1 A10197 1 2026-07-11 20:27:25.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00189 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x000000000004633A 0 1 2026-07-11 18:27:55.140 NULL NULL 0 0 0
1164 1 1 A10198 1 2026-07-11 20:28:02.000 0 0 Y EUR 1.0000000000000 2 2 7 1 R00190 0 0 0.0000000000000 DE EUR 1.0000000000000 2 0 NULL NULL 0.0000000000000 NULL NULL 0 1 10 0 NULL 7 NULL 1 2 NULL NULL DE453945359 0 1 NULL 0 NULL NULL 0.0000000000000 NULL NULL NULL 0x0000000000046392 0 1 2026-07-11 18:28:25.833 NULL NULL 0 0 0

View File

@@ -51,16 +51,6 @@ function toNumber(value, fallback = 0) {
return Number.isFinite(n) ? n : fallback; 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) // JTL maps VAT rates to Steuerklassen: 19% => 1 (voller Satz), 7% => 2 (ermäßigt)
function steuerklasseForVat(vat) { function steuerklasseForVat(vat) {
if (vat >= 15) return 1; if (vat >= 15) return 1;
@@ -441,27 +431,13 @@ async function createLieferscheinPos(transaction, kLieferschein, kAuftragPositio
await request.execute('Versand.spLieferscheinPosErstellen'); 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), * 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) { if (!deliveredItems.length) {
return; return;
} }
@@ -469,19 +445,16 @@ async function deliverOrder(transaction, kAuftrag, orderDate, deliveredItems) {
for (const { kAuftragPosition, quantity } of deliveredItems) { for (const { kAuftragPosition, quantity } of deliveredItems) {
await createLieferscheinPos(transaction, kLieferschein, kAuftragPosition, quantity); 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 zahlungsart = await resolveZahlungsart(transaction, payment.paymentMethodName || order.paymentMethodName, zahlungsartCache);
const kZahlung = await allocatePk(transaction, 'tZahlung'); const kZahlung = await allocatePk(transaction, 'tZahlung');
await new sql.Request(transaction) await new sql.Request(transaction)
.input('kZahlung', sql.Int, kZahlung) .input('kZahlung', sql.Int, kZahlung)
.input('cName', sql.NVarChar, zahlungsart.cName) .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('fBetrag', sql.Float, toNumber(payment.amount, 0))
.input('kBestellung', sql.Int, kAuftrag) .input('kBestellung', sql.Int, kAuftrag)
.input('kBenutzer', sql.Int, config.kBenutzer) .input('kBenutzer', sql.Int, config.kBenutzer)
@@ -504,7 +477,10 @@ export async function createOrder(order) {
try { try {
const zahlungsartCache = new Map(); 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 { kKunde, kKundengruppe } = await resolveCustomer(transaction, order, defaults);
const zahlungsart = await resolveZahlungsart(transaction, order.paymentMethodName, zahlungsartCache); const zahlungsart = await resolveZahlungsart(transaction, order.paymentMethodName, zahlungsartCache);
const cAuftragsNr = await nextOrderNumber(transaction, orderDate); const cAuftragsNr = await nextOrderNumber(transaction, orderDate);
@@ -559,11 +535,11 @@ export async function createOrder(order) {
} }
for (const payment of order.payments || []) { for (const payment of order.payments || []) {
await insertPayment(transaction, kAuftrag, payment, order, zahlungsartCache); await insertPayment(transaction, kAuftrag, payment, order, orderDate, zahlungsartCache);
} }
if (isOrderDelivered(order)) { 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(` await new sql.Request(transaction).input('kAuftrag', sql.Int, kAuftrag).query(`