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, 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, }, }; }); }; }