Files
dashlibstorage/src/store/articlesupplier/listByEntityAndSkus.js

131 lines
4.7 KiB
JavaScript

import { LIST_BY_ENTITY_AND_SKUS } from '../../sql/articlesupplier.js';
import resolveSelectedCompanyAccess from '../companyuser/resolveSelectedCompanyAccess.js';
import { assertSupplier } from './helpers.js';
function parseJsonArray(raw) {
if (!raw) return [];
try {
const val = typeof raw === 'string' ? JSON.parse(raw) : raw;
return Array.isArray(val) ? val : [];
} catch {
return [];
}
}
export default function listByEntityAndSkus(pool) {
const resolveAccess = resolveSelectedCompanyAccess(pool);
/**
* Lists article-supplier assignments for a given supplier (entityId) and SKU list,
* including linked article details (name, slug, photos/articlepic, eans/articleean).
*
* @param {number} googleAuthId - The id of the Google auth user.
* @param {number|{entityId?: number, supplierId?: number, skus?: string[]|string}} entityIdOrOptions - The supplier entity id or an options object.
* @param {string[]|string} [maybeSkus] - The list of SKUs to filter by (or single SKU string).
* @returns {Promise<Array<{id: number, articleId: number, entityId: number, supplierName: string|null, sku: string|null, pu: number, stock: number|null, sort: number, priceId: number|null, price: {net: number, taxId: number, taxRate?: number}|null, article: {id: number, sku: string, name: string|null, slug: string|null, photos: Array<{sort: number, thumbhash: string, hash: string, thumbw: number, thumbh: number}>, articlepic: Array<{sort: number, thumbhash: string, hash: string, thumbw: number, thumbh: number}>, eans: string[], articleean: string[]}}>>} The supplier assignments with article details.
* @throws {Error} If user is not authorized, entityId is missing, or supplier does not exist.
*
* @example
* const items = await store.articlesupplier.listByEntityAndSkus(42, 5, ['SKU-1', 'SKU-2']);
* // => [{ id, articleId, entityId, supplierName, sku, pu, stock, sort, price, article: { id, sku, name, slug, photos, eans } }]
*/
return async (googleAuthId, entityIdOrOptions, maybeSkus) => {
let entityId;
let skus;
if (
typeof entityIdOrOptions === 'object' &&
entityIdOrOptions !== null &&
!Array.isArray(entityIdOrOptions)
) {
entityId = entityIdOrOptions.entityId ?? entityIdOrOptions.supplierId;
skus = entityIdOrOptions.skus;
} else {
entityId = entityIdOrOptions;
skus = maybeSkus;
}
if (entityId == null || !Number.isFinite(Number(entityId))) {
throw new Error('Supplier required');
}
const parsedEntityId = Number(entityId);
// Fast return if an empty array of skus was explicitly requested
if (Array.isArray(skus) && skus.length === 0) {
return [];
}
let skusJson = null;
if (skus != null) {
const rawList = Array.isArray(skus) ? skus : [skus];
const cleanList = rawList
.map((s) => (s == null ? '' : String(s).trim()))
.filter(Boolean);
if (cleanList.length === 0) {
return [];
}
skusJson = JSON.stringify(Array.from(new Set(cleanList)));
}
const { companyId, languageId } = await resolveAccess(googleAuthId);
await assertSupplier(pool, null, companyId, parsedEntityId);
const result = await pool
.request()
.input('entityId', parsedEntityId)
.input('companyId', companyId)
.input('languageId', languageId)
.input('skusJson', skusJson)
.query(LIST_BY_ENTITY_AND_SKUS);
return result.recordset.map((row) => {
const rawPhotos = parseJsonArray(row.photosJson);
const photos = rawPhotos.map((p) => ({
sort: p.sort,
thumbhash: p.thumbhash,
hash: p.hash,
thumbw: p.thumbw,
thumbh: p.thumbh,
thumbHash: p.thumbhash,
fullHash: p.hash,
thumbW: p.thumbw,
thumbH: p.thumbh,
}));
const eans = parseJsonArray(row.eansJson).map((r) => r.ean);
return {
id: row.id,
articleId: row.articleId,
entityId: row.entityId,
supplierName: row.supplierName ?? null,
sku: row.sku ?? null,
pu: row.pu,
stock: row.stock ?? null,
sort: row.sort,
priceId: row.priceId ?? null,
price:
row.priceId != null && row.priceNet != null
? {
net: row.priceNet,
taxId: row.priceTaxId,
...(row.priceTaxRate != null ? { taxRate: row.priceTaxRate } : {}),
}
: null,
article: {
id: row.a_id,
sku: row.a_sku,
name: row.a_name ?? null,
slug: row.a_slug ?? null,
photos,
articlepic: photos,
eans,
articleean: eans,
},
};
});
};
}