This commit is contained in:
seb
2026-06-24 09:37:34 +02:00
parent 977ece3099
commit 185b68fe52
16 changed files with 1312 additions and 89 deletions

View File

@@ -0,0 +1,4 @@
export const LOAD_KAT_MAP = `
SELECT kKategorie, kOberKategorie
FROM dbo.tkategorie
`;

248
src/db/mssql/getArticle.js Normal file
View File

@@ -0,0 +1,248 @@
export const FIND_ARTICLE = `
SELECT TOP 1
tArtikelBeschreibung.cBeschreibung,
tArtikelBeschreibung.cKurzBeschreibung,
b.kVersandklasse,
(SELECT cName FROM dbo.tVersandklasse WHERE tVersandklasse.kVersandklasse = b.kVersandklasse) AS tVersandklassecName,
nIstVater,
kStueckliste,
kVaterArtikel,
b.kEigenschaftKombi,
b.kArtikel,
fUVP,
fGewicht,
tHersteller.cName AS cHersteller,
cBarcode,
fBestand,
b.cArtNr,
b.cAktiv,
tArtikelBeschreibung.cName,
b.fVKNEtto,
b.kSteuerklasse,
nVPE,
kMassEinheit,
fMassMenge,
kGrundPreisEinheit,
cAnmerkung,
tEigenschaftSprache.kEigenschaft,
tEigenschaftSprache.cName AS cEigenschaftName,
tEigenschaftWertSprache.kEigenschaftWert,
tEigenschaftWertSprache.cName AS cEigenschaftWertName,
(
SELECT c.cArtNr
FROM tArtikel c
WHERE c.kArtikel = (
SELECT tArtikel_kArtikel
FROM tliefartikel
WHERE cLiefArtNr = b.cArtNr AND tlieferant_klieferant = 96
)
) AS cLiefArtNr96
FROM tArtikelBeschreibung
INNER JOIN tArtikel b ON b.kArtikel = tArtikelBeschreibung.kArtikel
LEFT JOIN dbo.vLagerbestandProLager ON (
dbo.vLagerbestandProLager.kArtikel = b.kArtikel
AND vLagerbestandProLager.kWarenlager = 1
)
LEFT JOIN tGebinde ON b.kArtikel = tGebinde.kArtikel
LEFT JOIN tHersteller ON b.kHersteller = tHersteller.kHersteller
LEFT JOIN tEigenschaftKombiWert ON b.kEigenschaftKombi = tEigenschaftKombiWert.kEigenschaftKombi
LEFT JOIN tEigenschaftSprache ON (
tEigenschaftKombiWert.kEigenschaft = tEigenschaftSprache.kEigenschaft
AND tEigenschaftSprache.kSprache = 1
)
LEFT JOIN tEigenschaftWertSprache ON (
tEigenschaftWertSprache.kEigenschaftWert = tEigenschaftKombiWert.kEigenschaftWert
AND tEigenschaftWertSprache.kSprache = 1
)
WHERE b.cArtNr = @target OR tGebinde.cEAN = @target OR b.cBarcode = @target
`;
export const CHILDREN_BY_VATER = `
SELECT
tArtikel.cArtNr,
tArtikelBeschreibung.cName,
tArtikel.kEigenschaftKombi,
tEigenschaftSprache.kEigenschaft,
tEigenschaftSprache.cName AS cEigenschaftName,
tEigenschaftWertSprache.kEigenschaftWert,
tEigenschaftWertSprache.cName AS cEigenschaftWertName
FROM tArtikelBeschreibung
INNER JOIN tArtikel ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
LEFT JOIN tEigenschaftKombiWert ON tArtikel.kEigenschaftKombi = tEigenschaftKombiWert.kEigenschaftKombi
LEFT JOIN tEigenschaftSprache ON (
tEigenschaftKombiWert.kEigenschaft = tEigenschaftSprache.kEigenschaft
AND tEigenschaftSprache.kSprache = 1
)
LEFT JOIN tEigenschaftWertSprache ON (
tEigenschaftWertSprache.kEigenschaftWert = tEigenschaftKombiWert.kEigenschaftWert
AND tEigenschaftWertSprache.kSprache = 1
)
WHERE tArtikel.kVaterArtikel = @kArtikel
`;
export const VATER_BY_ID = `
SELECT tArtikel.cArtNr
FROM tArtikelBeschreibung
INNER JOIN tArtikel ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
WHERE tArtikel.kArtikel = @kArtikel
`;
export const STUECKLISTE = `
SELECT
tArtikelBeschreibung.cName,
tArtikel.cArtNr,
tStueckliste.fAnzahl,
tArtikel.fVKNEtto,
tArtikel.kSteuerklasse,
vLagerbestandProLager.fBestand
FROM dbo.tStueckliste
INNER JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tStueckliste.kArtikel
LEFT JOIN dbo.vLagerbestandProLager ON (
vLagerbestandProLager.kArtikel = tStueckliste.kArtikel
AND vLagerbestandProLager.kWarenlager = 1
)
INNER JOIN dbo.tArtikel ON tArtikel.kArtikel = tStueckliste.kArtikel
WHERE tStueckliste.kStueckliste = @kStueckliste
ORDER BY tStueckliste.nSort
`;
export const ANDERE_LAGER = `
SELECT SUM(fBestand) AS fSumme
FROM dbo.vLagerbestandProLager
WHERE dbo.vLagerbestandProLager.kArtikel = @kArtikel
AND vLagerbestandProLager.kWarenlager != 1
GROUP BY dbo.vLagerbestandProLager.kArtikel
`;
export const EANS = `
SELECT cEAN
FROM tGebinde
WHERE kArtikel = @kArtikel
`;
export function categoriesQuery(katSkipClause, katLists) {
return `
SELECT kKategorie
FROM dbo.tkategorieartikel
WHERE kArtikel = @kArtikel
AND ${katSkipClause}kKategorie NOT IN (
SELECT kKategorie
FROM tKategorie
WHERE kOberKategorie = ${katLists}
)
`;
}
export const SUPPLIERS = `
SELECT
tlieferant.kLieferant,
cFirma,
tliefartikel.cLiefArtNr,
nStandard,
fLagerbestand,
cVPEEinheit,
nVPEMenge,
fMwSt,
fEKNetto,
tShopKorb.nMenge,
tlieferant.cEmail,
tlieferant.cAnmerkung
FROM tliefartikel
INNER JOIN tlieferant ON tlieferant.kLieferant = tliefartikel.tLieferant_kLieferant
LEFT JOIN tShopKorb ON (
tShopKorb.kLieferant = tlieferant.kLieferant
AND tliefartikel.cLiefArtNr = tShopKorb.cLiefArtNr
)
WHERE tArtikel_kArtikel = @kArtikel
ORDER BY nStandard DESC, tlieferant.kLieferant
`;
export const INCOMING_ORDERS = `
SELECT
tLieferantenBestellung.kLieferant,
tLieferantenBestellungPos.kLieferantenBestellungPos,
tLieferantenBestellungPos.kLieferantenBestellung,
cEigeneBestellnummer,
tLieferantenBestellungPos.kLieferantenBestellung + 1 AS kLieferantenBestellung2,
cFirma,
tLieferantenBestellungPos.dLieferdatum,
cFremdbelegnummer,
cInternerKommentar,
fAnzahlOffen
FROM tLieferantenBestellung
INNER JOIN tlieferant ON tlieferant.kLieferant = tLieferantenBestellung.kLieferant
INNER JOIN tLieferantenBestellungPos ON (
tLieferantenBestellungPos.kLieferantenBestellung = tLieferantenBestellung.kLieferantenBestellung
)
WHERE fAnzahlOffen > 0 AND kArtikel = @kArtikel
ORDER BY tLieferantenBestellungPos.kLieferantenBestellung
`;
export const OPEN_INCIDENTS = `
SELECT cType, cNote, kIncident, cEmployeeIssuer, cEmployeeMap
FROM dbo.tIncident
WHERE kRef1 = @kArtikel
AND cState = 'new'
AND cType IN ('order_count', 'order_label', 'order_free')
`;
export const MERKMALE = `
SELECT
tArtikelMerkmal.kMerkmal,
tArtikelMerkmal.kMerkmalWert,
tMerkmalSprache.cName,
tMerkmalWertSprache.cWert
FROM dbo.tArtikelMerkmal
INNER JOIN dbo.tMerkmalSprache ON tMerkmalSprache.kMerkmal = tArtikelMerkmal.kMerkmal
INNER JOIN dbo.tMerkmalWertSprache ON tMerkmalWertSprache.kMerkmalWert = tArtikelMerkmal.kMerkmalWert
WHERE tArtikelMerkmal.kArtikel = @kArtikel
ORDER BY tArtikelMerkmal.kMerkmal
`;
export const ATTRIBUTES = `
SELECT
tArtikelAttribut.kAttribut,
tArtikelAttributSprache.cWertVarchar,
tArtikelAttributSprache.nWertInt,
tArtikelAttributSprache.fWertDecimal
FROM dbo.tArtikelAttribut
INNER JOIN dbo.tArtikelAttributSprache ON (
tArtikelAttributSprache.kArtikelAttribut = tArtikelAttribut.kArtikelAttribut
AND kSprache = 0
)
WHERE kShop = 0 AND tArtikelAttribut.kArtikel = @kArtikel
`;
export const STAFFEL = `
SELECT nAnzahlAb, fNEttoPreis
FROM tPreis
INNER JOIN tPreisDetail ON tPreisDetail.kPreis = tPreis.kPreis
WHERE kArtikel = @kArtikel AND kKundenGruppe = 2 AND kShop = 0
`;
export const EXTRA_LAGER = `
SELECT nMenge
FROM tExtraLager
WHERE kArtikel = @kArtikel AND nLager = @nLager
`;
export const SHOP_SUM = `
SELECT SUM(kShop) AS kShop
FROM tArtikelShop
WHERE kArtikel = @kArtikel
`;
export const HERSTELLER_GPSR = `
SELECT
tHersteller.cBeschreibung AS cHerstellerGPSR,
b.bVorschauBild AS herstellerBild
FROM tArtikel
INNER JOIN tHersteller ON tArtikel.kHersteller = tHersteller.kHersteller
LEFT JOIN tHerstellerBildPlattform hbp ON (
hbp.kHersteller = tHersteller.kHersteller
AND hbp.kPlattform = 1
AND hbp.kShop = 0
)
LEFT JOIN tBild b ON b.kBild = hbp.kBild
WHERE tArtikel.kArtikel = @kArtikel
`;

View File

@@ -0,0 +1,37 @@
export const SELECT_COLUMNS = `
(SELECT STRING_AGG(tk1.kKategorie, ',')
FROM dbo.tkategorieartikel AS tk1
WHERE tk1.kArtikel = tArtikel.kArtikel
GROUP BY tk1.kArtikel) AS katList,
MIN(fVerfuegbar) AS fVerfuegbar,
tArtikel.kArtikel,
MIN(fBestand) AS fBestand,
MIN(tArtikel.cArtNr) AS cArtNr,
MIN(tArtikelBeschreibung.cName) AS cName,
MIN(tArtikel.fVKNEtto) AS fVKNEtto,
MIN(tArtikel.kSteuerklasse) AS kSteuerklasse
`;
export const FROM_JOINS = `
FROM tArtikelBeschreibung
INNER JOIN tArtikel ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
LEFT JOIN tLiefArtikel ON tArtikel.kArtikel = tLiefArtikel.tArtikel_kArtikel
LEFT JOIN tGebinde ON tArtikel.kArtikel = tGebinde.kArtikel
LEFT JOIN dbo.tlagerbestand ON dbo.tlagerbestand.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.vLagerbestandProLager ON (
dbo.vLagerbestandProLager.kArtikel = tArtikel.kArtikel
AND vLagerbestandProLager.kWarenlager = 1
)
`;
export const GROUP_ORDER = `
GROUP BY tArtikel.kArtikel
ORDER BY MIN(tArtikelBeschreibung.cName)
`;
export const CATEGORY_JOIN = `
INNER JOIN dbo.tkategorieartikel ON (
tkategorieartikel.kArtikel = tArtikel.kArtikel
AND ({categoryFilter})
)
`;

64
src/db/mssqlClient.js Normal file
View File

@@ -0,0 +1,64 @@
import sql from 'mssql';
import env from '../config/env.js';
let pool;
let connecting;
function getMssqlConfig() {
const { server, database, user, password, port, encrypt, trustServerCertificate } = env.mssql;
if (!server || !database || !user || !password) {
throw new Error('MSSQL is not configured (MSSQL_SERVER, MSSQL_DATABASE, MSSQL_USER, MSSQL_PASSWORD required)');
}
return {
server,
database,
user,
password,
port,
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 30_000,
},
options: {
encrypt,
trustServerCertificate,
},
};
}
export async function getPool() {
if (pool) {
return pool;
}
if (!connecting) {
connecting = new sql.ConnectionPool(getMssqlConfig())
.connect()
.then((connectedPool) => {
pool = connectedPool;
return pool;
})
.finally(() => {
connecting = undefined;
});
}
return connecting;
}
export async function ensureConnection() {
const activePool = await getPool();
await activePool.request().query('SELECT 1 AS ok');
}
export async function closePool() {
if (pool) {
await pool.close();
pool = undefined;
}
}
export { sql };