Files
dashlibstorage/src/providers/sqlite3/queries/article.js
2026-10-22 23:33:00 +02:00

356 lines
16 KiB
JavaScript

import * as source from '../../mssql/queries/article.js';
import { translateQueries } from './translate.js';
const queries = translateQueries(source, 'article');
export const {
ADD_CATEGORY, ADD_EAN, ARTICLE_LIST_COLUMNS, CHECK_ARTICLE_WAREHOUSE_STOCKS, CHECK_HAS_WAREHOUSE,
CLEAR_POSTERMINAL_OBITUARY, CREATE, CREATE_CHILD,
DELETE_CATEGORIES_BY_ARTICLE, DELETE_EANS_BY_ARTICLE, EAN_EXISTS, EAN_EXISTS_FOR_OTHER_ARTICLE,
GET_BRAND_BY_COMPANY_AND_ID,
GET_CATEGORY_ID_BY_SKU, GET_CATEGORY_TREE_FLAT, GET_ID_BY_SKU,
INSERT_POSTERMINAL_OBITUARY,
LIST_CHILDREN_BY_PARENT_ID, LIST_PAIRED_POSTERMINAL_IDS_BY_ARTICLE,
SET_PARENT_SORT,
SET_IS_PARENT, TOGGLE_PARENT, TOUCH_UPDATED_AT, UNLINK_CHILD, UPDATE_BRAND, UPDATE_PARENT_BY_SKU, UPDATE_TRACK_STOCK, UPDATE_UNIT,
UPDATE_UNITAMOUNT, UPDATE_UNIT_AND_AMOUNT, UPDATE_WEIGHT,
} = queries;
export const ARTICLE_LIST_JOINS = `
LEFT JOIN articletext at
ON at.article_id = a.id AND at.language_id = @languageId
LEFT JOIN price pr
ON pr.article_id = a.id
AND pr.customergroup_id = @posCustomerGroupId
AND pr.minmultiplier = 1
LEFT JOIN tax t ON t.id = pr.tax_id
LEFT JOIN pic ON pic.id = (
SELECT ap.pic_id FROM articlepic ap
WHERE ap.article_id = a.id ORDER BY ap.sort, ap.id LIMIT 1
)
LEFT JOIN brand b ON b.id = a.brand_id
LEFT JOIN pic brand_pic ON brand_pic.id = (
SELECT bp.pic_id FROM brandpic bp
WHERE bp.brand_id = b.id ORDER BY bp.sort, bp.id LIMIT 1
)
LEFT JOIN article parent ON parent.id = a.parentarticle_id
`;
export const RESOLVE_ARTICLE_ACCESS_BY_SKU = `
SELECT
a.id AS articleId,
ca.category_id AS categoryId,
co.root_category_id AS rootCategoryId,
co.id AS companyId,
co.default_language_id AS languageId,
co.poscustomergroup_id AS posCustomerGroupId,
cu.id AS companyuserId
FROM article a
INNER JOIN company co ON co.id = a.company_id
INNER JOIN google_auth ga ON ga.id = @googleAuthId
INNER JOIN companyuser cu
ON cu.company_id = a.company_id AND cu.google_auth_id = @googleAuthId
LEFT JOIN categoryarticle ca ON ca.article_id = a.id
WHERE a.sku = @sku
AND (ga.selected_company IS NULL OR a.company_id = ga.selected_company)
LIMIT 1
`;
const JSON_EANS = `(SELECT COALESCE(json_group_array(json_object('ean', ean)), '[]')
FROM (SELECT ean FROM articleean WHERE article_id = a.id ORDER BY ean))`;
const JSON_CATEGORIES = `(SELECT COALESCE(json_group_array(json_object('category_id', category_id)), '[]')
FROM (SELECT category_id FROM categoryarticle WHERE article_id = a.id ORDER BY category_id))`;
export const SEARCH_ARTICLES = `
WITH RECURSIVE category_tree AS (
SELECT id FROM category WHERE id = @rootCategoryId
UNION ALL SELECT c.id FROM category c
INNER JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT a.id, a.sku, at.name,
${JSON_EANS} AS eansJson,
${JSON_CATEGORIES} AS categoryIdsJson
FROM article a
LEFT JOIN articletext at ON at.article_id = a.id AND at.language_id = @languageId
WHERE EXISTS (
SELECT 1 FROM categoryarticle ca
INNER JOIN category_tree ct ON ct.id = ca.category_id
WHERE ca.article_id = a.id
)
ORDER BY a.id
`;
export const GET_ARTICLE_EXPORT = `
WITH RECURSIVE category_tree AS (
SELECT id FROM category WHERE id = @categoryId
UNION ALL SELECT c.id FROM category c
INNER JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT DISTINCT a.id, a.sku, at.name, at.slug, u.si AS unitSi,
ut.symbol AS unitSymbol, a.unitamount, a.track_stock, b.name AS brandName,
pr.net, t.rate AS taxRate,
${JSON_EANS} AS eansJson,
${JSON_CATEGORIES} AS categoryIdsJson,
(SELECT COALESCE(json_group_array(json_object('hash', hash)), '[]')
FROM (SELECT p.hash FROM articlepic ap INNER JOIN pic p ON p.id = ap.pic_id
WHERE ap.article_id = a.id ORDER BY ap.sort, ap.id)) AS fullHashesJson
FROM article a
INNER JOIN categoryarticle ca ON ca.article_id = a.id
INNER JOIN category_tree ct ON ct.id = ca.category_id
LEFT JOIN articletext at ON at.article_id = a.id AND at.language_id = @languageId
LEFT JOIN unit u ON u.id = a.unit_id
LEFT JOIN unittext ut ON ut.unit_id = u.id AND ut.language_id = @languageId
LEFT JOIN brand b ON b.id = a.brand_id
LEFT JOIN price pr ON pr.article_id = a.id
AND pr.customergroup_id = @posCustomerGroupId AND pr.minmultiplier = 1
LEFT JOIN tax t ON t.id = pr.tax_id
ORDER BY a.id
`;
export const GET_ARTICLE_BY_SKU_FULL = `
WITH auth AS (
SELECT a.id AS articleId, ca.category_id AS categoryId, co.root_category_id AS rootCategoryId,
co.id AS companyId, co.default_language_id AS languageId,
co.poscustomergroup_id AS posCustomerGroupId, cu.id AS companyuserId
FROM article a
INNER JOIN company co ON co.id = a.company_id
INNER JOIN google_auth ga ON ga.id = @googleAuthId
INNER JOIN companyuser cu
ON cu.company_id = a.company_id AND cu.google_auth_id = @googleAuthId
LEFT JOIN categoryarticle ca ON ca.article_id = a.id
WHERE a.sku = @sku
AND (ga.selected_company IS NULL OR a.company_id = ga.selected_company)
LIMIT 1
)
SELECT auth.*,
json_object(
'id', a.id, 'sku', a.sku, 'name', at.name, 'slug', at.slug,
'desc', at."desc", 'seo', at.seo,
'unitamount', a.unitamount, 'weight', a.weight,
'track_stock', a.track_stock,
'unitSi', u.si, 'unitBasesi', u.basesi,
'unitBasesifactor', u.basesifactor, 'unitSymbol', ut.symbol,
'unitName', ut.name,
'brandId', b.id, 'brandName', b.name,
'brandFullHash', bp.hash,
'brandThumbW', bp.thumbw, 'brandThumbH', bp.thumbh,
'brandThumbHash', bp.thumbhash,
'optionsCount', (SELECT COUNT(*) FROM optionslistarticle WHERE optionslist_id = a.optionslist_id),
'optionslistId', a.optionslist_id,
'optionslistItemsJson', json((SELECT COALESCE(json_group_array(json_object(
'id', ola.id,
'articleId', ola.article_id,
'sku', a_opt.sku,
'name', at_opt.name,
'count', ola.count,
'sort', ola.sort,
'mandated', ola.mandated
)), '[]') FROM optionslistarticle ola
INNER JOIN article a_opt ON a_opt.id = ola.article_id
LEFT JOIN articletext at_opt ON at_opt.article_id = a_opt.id AND at_opt.language_id = auth.languageId
WHERE ola.optionslist_id = a.optionslist_id
ORDER BY ola.sort ASC, ola.id ASC)),
'articleListCount', (SELECT COUNT(*) FROM articlelistarticle WHERE articlelist_id = a.articlelist_id),
'articlelistId', a.articlelist_id,
'articlelistItemsJson', json((SELECT COALESCE(json_group_array(json_object(
'id', ala.id,
'articleId', ala.article_id,
'sku', a_item.sku,
'name', at_item.name,
'count', ala.count,
'sort', ala.sort
)), '[]') FROM articlelistarticle ala
INNER JOIN article a_item ON a_item.id = ala.article_id
LEFT JOIN articletext at_item ON at_item.article_id = a_item.id AND at_item.language_id = auth.languageId
WHERE ala.articlelist_id = a.articlelist_id
ORDER BY ala.sort ASC, ala.id ASC)),
'childCount', (SELECT COUNT(*) FROM article WHERE parentarticle_id = a.id),
'isParent', a.is_parent,
'parentAttributeNameId', a.parentattributename_id,
'parentAttributeName', fan.name,
'parentAttributeExclusive', fan.exclusive,
'parentArticleId', a.parentarticle_id, 'parentSku', parent.sku,
'childrenJson', json((SELECT COALESCE(json_group_array(json_object(
'id', child.id,
'sku', child.sku,
'parentsort', child.parentsort,
'name', at_child.name,
'attributeValueId', av.id,
'attributeValue', av.value
)), '[]') FROM article child
LEFT JOIN articletext at_child ON at_child.article_id = child.id AND at_child.language_id = auth.languageId
LEFT JOIN (
articleattributevalue aav
INNER JOIN attributevalue av ON av.id = aav.attributevalue_id AND av.attribute_id = a.parentattributename_id
) ON aav.article_id = child.id
WHERE child.parentarticle_id = a.id
ORDER BY child.parentsort ASC, child.id ASC)),
'categoryIdsJson', json(${JSON_CATEGORIES}),
'photosJson', json((SELECT COALESCE(json_group_array(json_object(
'sort', sort, 'fullHash', hash, 'fullW', w, 'fullH', h,
'fullSize', size, 'thumbW', thumbw, 'thumbH', thumbh,
'thumbHash', thumbhash
)), '[]') FROM (
SELECT ap.sort, p.hash, p.w, p.h, p.size, p.thumbw, p.thumbh, p.thumbhash
FROM articlepic ap INNER JOIN pic p ON p.id = ap.pic_id
WHERE ap.article_id = a.id ORDER BY ap.sort, ap.id
))),
'eansJson', json(${JSON_EANS}),
'pricesJson', json((SELECT COALESCE(json_group_array(json_object(
'minmultiplier', minmultiplier, 'net', net, 'taxRate', rate,
'customergroupId', customergroup_id
)), '[]') FROM (
SELECT pr.minmultiplier, pr.net, t.rate, pr.customergroup_id
FROM price pr INNER JOIN tax t ON t.id = pr.tax_id
WHERE pr.article_id = a.id ORDER BY pr.customergroup_id, pr.minmultiplier
))),
'suppliersJson', json((SELECT COALESCE(json_group_array(json_object(
'id', id, 'articleId', article_id, 'entityId', entity_id,
'supplierName', supplier_name, 'sku', sku, 'pu', pu,
'stock', stock, 'sort', sort,
'price', CASE WHEN net IS NULL THEN NULL ELSE json_object(
'net', net, 'taxId', tax_id, 'taxRate', tax_rate
) END,
'incoming', json(incoming_json)
)), '[]') FROM (
SELECT s.id, s.article_id, s.entity_id, e.name AS supplier_name,
s.sku, s.pu, s.stock, s.sort,
s.net, s.tax_id, t.rate AS tax_rate,
COALESCE((
SELECT json_group_array(json_object(
'date', inc.date,
'amount', inc.amount
))
FROM (
SELECT
m.date AS date,
SUM(ma.amount - COALESCE(ma_ledger.booked_amount, 0)) AS amount
FROM manifest m
INNER JOIN manifestarticle ma ON ma.manifest_id = m.id
LEFT JOIN (
SELECT manifestarticle_id, SUM(amount) AS booked_amount
FROM ledger
WHERE warehouse_id IS NULL
GROUP BY manifestarticle_id
) ma_ledger ON ma_ledger.manifestarticle_id = ma.id
WHERE m.company_id = a.company_id
AND m.type = 'delivery'
AND m.entity_id = s.entity_id
AND s.sku IS NOT NULL
AND s.sku <> ''
AND ma.sku = s.sku
AND (ma.amount - COALESCE(ma_ledger.booked_amount, 0)) > 0
GROUP BY m.id, m.date
ORDER BY m.date ASC, m.id ASC
) inc
), '[]') AS incoming_json
FROM articlesupplier s INNER JOIN entity e ON e.id = s.entity_id
LEFT JOIN tax t ON t.id = s.tax_id
WHERE s.article_id = a.id ORDER BY s.sort, s.id
))),
'warehousesJson', json((SELECT COALESCE(json_group_array(json_object(
'id', w.id, 'name', w.name, 'sort', w.sort,
'stock', CASE
WHEN a.articlelist_id IS NOT NULL AND EXISTS (
SELECT 1 FROM articlelistarticle ala WHERE ala.articlelist_id = a.articlelist_id
) THEN COALESCE((
SELECT CASE
WHEN MIN(COALESCE(comp_stock.stock, 0) / ala.count) < 0 THEN 0
ELSE CAST(MIN(COALESCE(comp_stock.stock, 0) / ala.count) AS INTEGER)
END
FROM articlelistarticle ala
LEFT JOIN (
SELECT ca.id AS comp_id, SUM(l.amount) AS stock
FROM ledger l
INNER JOIN manifestarticle ma ON ma.id = l.manifestarticle_id
INNER JOIN manifest m ON m.id = ma.manifest_id
INNER JOIN article ca ON (
ma.sku = ca.sku
OR ma.sku IN (SELECT asup.sku FROM articlesupplier asup WHERE asup.article_id = ca.id)
)
WHERE m.company_id = a.company_id
AND l.warehouse_id = w.id
GROUP BY ca.id
) comp_stock ON comp_stock.comp_id = ala.article_id
WHERE ala.articlelist_id = a.articlelist_id
), 0)
WHEN a.articlelist_id IS NOT NULL THEN 0
ELSE COALESCE(stock_calc.stock, 0)
END
)), '[]') FROM warehouse w
LEFT JOIN (
SELECT l.warehouse_id, SUM(l.amount) AS stock
FROM ledger l
INNER JOIN manifestarticle ma ON ma.id = l.manifestarticle_id
INNER JOIN manifest m ON m.id = ma.manifest_id
WHERE m.company_id = a.company_id
AND (
ma.sku = a.sku
OR ma.sku IN (SELECT asup.sku FROM articlesupplier asup WHERE asup.article_id = a.id)
)
GROUP BY l.warehouse_id
) stock_calc ON stock_calc.warehouse_id = w.id
WHERE w.company_id = a.company_id
ORDER BY w.sort ASC, w.name ASC)),
'undeliveredOrdersJson', json((
SELECT COALESCE(json_group_array(json_object(
'orderId', uo.orderId,
'orderNumber', uo.orderNumber,
'date', uo.date,
'customerName', uo.customerName,
'amount', uo.amount
)), '[]')
FROM (
SELECT
m.id AS orderId,
m."number" AS orderNumber,
m."date" AS date,
COALESCE(os.customer_name, TRIM(COALESCE(e.first_name || ' ', '') || COALESCE(e.name, ''))) AS customerName,
ROUND(SUM(ma.amount) - COALESCE((
SELECT SUM(ma_s.amount)
FROM manifest m_s
INNER JOIN manifestarticle ma_s ON ma_s.manifest_id = m_s.id
LEFT JOIN shipmentsummary ss ON ss.manifest_id = m_s.id
WHERE m_s.company_id = m.company_id
AND m_s."type" = 'shipment'
AND COALESCE(ss.state, 'new') != 'cancelled'
AND m_s."number" NOT LIKE '%#cancelled#%'
AND ma_s.sku = a.sku
AND m_s."number" LIKE m."number" || COALESCE((SELECT prefix FROM numbers WHERE company_id = m.company_id AND "type" = 'shipment'), '-L-') || '%'
), 0), 3) AS amount
FROM manifest m
INNER JOIN manifestarticle ma ON ma.manifest_id = m.id
LEFT JOIN ordersummary os ON os.manifest_id = m.id
LEFT JOIN entity e ON e.id = m.entity_id
WHERE m.company_id = a.company_id
AND m."type" = 'order'
AND ma.sku = a.sku
AND COALESCE(os.is_shipped, 0) = 0
GROUP BY m.id, m."number", m."date", os.customer_name, e.first_name, e.name
HAVING (SUM(ma.amount) - COALESCE((
SELECT SUM(ma_s.amount)
FROM manifest m_s
INNER JOIN manifestarticle ma_s ON ma_s.manifest_id = m_s.id
LEFT JOIN shipmentsummary ss ON ss.manifest_id = m_s.id
WHERE m_s.company_id = m.company_id
AND m_s."type" = 'shipment'
AND COALESCE(ss.state, 'new') != 'cancelled'
AND m_s."number" NOT LIKE '%#cancelled#%'
AND ma_s.sku = a.sku
AND m_s."number" LIKE m."number" || COALESCE((SELECT prefix FROM numbers WHERE company_id = m.company_id AND "type" = 'shipment'), '-L-') || '%'
), 0)) > 0
ORDER BY m."date" ASC, m.id ASC
) uo
))
) AS articleJson
FROM auth
INNER JOIN article a ON a.id = auth.articleId
LEFT JOIN articletext at ON at.article_id = a.id AND at.language_id = auth.languageId
LEFT JOIN unit u ON u.id = a.unit_id
LEFT JOIN unittext ut ON ut.unit_id = u.id AND ut.language_id = auth.languageId
LEFT JOIN brand b ON b.id = a.brand_id
LEFT JOIN pic bp ON bp.id = (
SELECT pic_id FROM brandpic WHERE brand_id = b.id ORDER BY sort, id LIMIT 1
)
LEFT JOIN article parent ON parent.id = a.parentarticle_id
LEFT JOIN attributename fan ON fan.id = a.parentattributename_id
`;