u
This commit is contained in:
@@ -26,6 +26,8 @@ LANGUAGE_ID=1
|
|||||||
|
|
||||||
# Product sync (tSteuerzone.cName used to look up tax rates per tSteuerklasse)
|
# Product sync (tSteuerzone.cName used to look up tax rates per tSteuerklasse)
|
||||||
TAX_ZONE_NAME=Zone-EU
|
TAX_ZONE_NAME=Zone-EU
|
||||||
|
# Warehouse ID for inventory stock (vLagerbestandProLager)
|
||||||
|
WARENLAGER_ID=1
|
||||||
|
|
||||||
# Shop filter: active shop is queried from tShopSubshop at startup
|
# Shop filter: active shop is queried from tShopSubshop at startup
|
||||||
|
|
||||||
|
|||||||
4
API.md
4
API.md
@@ -247,10 +247,12 @@ Notable fields:
|
|||||||
| `prices` | One entry per customer group |
|
| `prices` | One entry per customer group |
|
||||||
| `isCompositeProduct` | `"1"` if the article is a Stückliste parent |
|
| `isCompositeProduct` | `"1"` if the article is a Stückliste parent |
|
||||||
| `imghash` | Pass to `/v1/pimage?path=...` |
|
| `imghash` | Pass to `/v1/pimage?path=...` |
|
||||||
|
| `use_stock` | `"1"` if `cLagerAktiv = 'Y'`, otherwise `"0"` |
|
||||||
|
| `quantity` | Stock quantity from `dbo.vLagerbestandProLager` for configured `WARENLAGER_ID` |
|
||||||
| Deposit fields | Present when JTL-POS Pfand attributes are set |
|
| Deposit fields | Present when JTL-POS Pfand attributes are set |
|
||||||
| `attributes` | Article attributes from `tArtikelAttribut` (incl. Pfand) |
|
| `attributes` | Article attributes from `tArtikelAttribut` (incl. Pfand) |
|
||||||
|
|
||||||
Many other product fields are filled with static defaults (`sort`, `use_stock`, `unit`, etc.) for JTL-POS compatibility.
|
Many other product fields are filled with static defaults (`sort`, `unit`, `PLU`, etc.) for JTL-POS compatibility.
|
||||||
|
|
||||||
**Node only:** `prices[]` applies per–customer-group net overrides from `tPreis` / `tPreisDetail`. C++ currently fills every group with the base gross price.
|
**Node only:** `prices[]` applies per–customer-group net overrides from `tPreis` / `tPreisDetail`. C++ currently fills every group with the base gross price.
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { getActiveShopId } from '../shop.js';
|
|||||||
|
|
||||||
const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1;
|
const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1;
|
||||||
const TAX_ZONE_NAME = process.env.TAX_ZONE_NAME || 'Zone-EU';
|
const TAX_ZONE_NAME = process.env.TAX_ZONE_NAME || 'Zone-EU';
|
||||||
|
const WARENLAGER_ID = Number(process.env.WARENLAGER_ID) || Number(process.env.JTL_KWARENLAGER) || 1;
|
||||||
|
|
||||||
const PRODUCT_LIST_SQL = `
|
const PRODUCT_LIST_SQL = `
|
||||||
WITH TaxRates AS (
|
WITH TaxRates AS (
|
||||||
@@ -53,11 +54,14 @@ SELECT TOP (@limit)
|
|||||||
FROM Pos.vProductVariant pv
|
FROM Pos.vProductVariant pv
|
||||||
WHERE pv.kProduct = a.kArtikel
|
WHERE pv.kProduct = a.kArtikel
|
||||||
) AS variantName,
|
) AS variantName,
|
||||||
a.cBarcode AS barcode
|
a.cBarcode AS barcode,
|
||||||
|
a.cLagerAktiv,
|
||||||
|
ISNULL(v.fBestand, 0) AS fBestand
|
||||||
FROM dbo.tArtikel a
|
FROM dbo.tArtikel a
|
||||||
INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId
|
INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId
|
||||||
LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse
|
LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse
|
||||||
LEFT JOIN ImageRV ir ON ir.kArtikel = a.kArtikel
|
LEFT JOIN ImageRV ir ON ir.kArtikel = a.kArtikel
|
||||||
|
LEFT JOIN dbo.vLagerbestandProLager v ON v.kArtikel = a.kArtikel AND v.kWarenlager = @warenlagerId
|
||||||
WHERE a.cAktiv = 'Y'
|
WHERE a.cAktiv = 'Y'
|
||||||
AND (@kShop = 0 OR EXISTS (
|
AND (@kShop = 0 OR EXISTS (
|
||||||
SELECT 1 FROM dbo.tKategorieArtikel ka
|
SELECT 1 FROM dbo.tKategorieArtikel ka
|
||||||
@@ -129,6 +133,7 @@ export async function getProductList({ cursor = 0, limit = 20 } = {}) {
|
|||||||
.input('languageId', sql.Int, LANGUAGE_ID)
|
.input('languageId', sql.Int, LANGUAGE_ID)
|
||||||
.input('taxZoneName', sql.NVarChar, TAX_ZONE_NAME)
|
.input('taxZoneName', sql.NVarChar, TAX_ZONE_NAME)
|
||||||
.input('kShop', sql.Int, getActiveShopId())
|
.input('kShop', sql.Int, getActiveShopId())
|
||||||
|
.input('warenlagerId', sql.Int, WARENLAGER_ID)
|
||||||
.query(PRODUCT_LIST_SQL),
|
.query(PRODUCT_LIST_SQL),
|
||||||
getCustomerGroupIds(),
|
getCustomerGroupIds(),
|
||||||
]);
|
]);
|
||||||
@@ -209,6 +214,8 @@ export async function getProductList({ cursor = 0, limit = 20 } = {}) {
|
|||||||
variants: product.variantName ?? '',
|
variants: product.variantName ?? '',
|
||||||
isCompositeProduct: product.isCompositeProduct,
|
isCompositeProduct: product.isCompositeProduct,
|
||||||
attributes: articleAttributes?.attributes ?? [],
|
attributes: articleAttributes?.attributes ?? [],
|
||||||
|
use_stock: product.cLagerAktiv === 'Y' || product.cLagerAktiv === '1' ? '1' : '0',
|
||||||
|
quantity: String(product.fBestand ?? 0),
|
||||||
...(articleAttributes?.deposit ?? {}),
|
...(articleAttributes?.deposit ?? {}),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user