From 146960fa42ad0ccc00527aa740e4e49a3a6f15a5 Mon Sep 17 00:00:00 2001 From: Vitor Date: Wed, 4 Feb 2026 10:45:04 -0300 Subject: [PATCH 1/2] considering tiny product price list --- .../src/integration/after-tiny-queue.ts | 4 +-- .../integration/import-product-from-tiny.ts | 29 +++++++++++++++++-- .../integration/parsers/product-from-tiny.ts | 11 +++++-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts b/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts index 621770367..be62127f7 100644 --- a/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts +++ b/packages/apps/tiny-erp/src/integration/after-tiny-queue.ts @@ -70,7 +70,7 @@ export default async ( if (!action) { return null; } - let queueList = appData[action][queue]; + let queueList = appData[action] && appData[action][queue]; if (Array.isArray(queueList)) { const idIndex = queueList.indexOf(nextId); if (idIndex > -1) { @@ -81,7 +81,7 @@ export default async ( } const data = { [action]: { - ...appData[action], + ...(appData[action] || {}), [queue]: queueList, }, }; diff --git a/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts b/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts index ec3fc487c..1d66a7211 100644 --- a/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +++ b/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts @@ -5,6 +5,28 @@ import updateAppData from '@cloudcommerce/firebase/lib/helpers/update-app-data'; import postTiny from './post-tiny-erp'; import parseProduct from './parsers/product-from-tiny'; +const getPriceListData = async (productId: number) => { + const priceListId = process.env.TINY_PRICE_LIST_ID; + if (!priceListId) return undefined; + + try { + const { registros } = await postTiny('/listas.precos.excecoes.php', { + idListaPreco: Number(priceListId), + idProduto: productId, + }); + if (Array.isArray(registros) && registros.length > 0) { + const registro = registros[0]; + return { + preco: registro.preco, + preco_promocional: registro.preco_promocional, + }; + } + } catch (err) { + logger.warn(`Failed to get price list data for product ${productId}`, err); + } + return undefined; +}; + const importProduct = async ( apiDoc, queueEntry, @@ -100,7 +122,7 @@ const importProduct = async ( if (!tinyProduct) return null; return postTiny('/produto.obter.php', { id: (tinyProduct.id || produtoSaldo.id) }) - .then(({ produto }) => { + .then(async ({ produto }) => { let method; let endpoint; let productId = product && product._id; @@ -113,8 +135,9 @@ const importProduct = async ( } else { return null; } - // @ts-ignore - return parseProduct(produto, tipo, method === 'POST').then((parsedProduct: Products) => { + const priceListData = await getPriceListData(produto.id); + return parseProduct(produto, appData, tipo, method === 'POST', priceListData) + .then((parsedProduct: Products) => { if (!Number.isNaN(quantity)) { parsedProduct.quantity = quantity >= 0 ? quantity : 0; } diff --git a/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts b/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts index 289693650..06c1283c7 100644 --- a/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +++ b/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts @@ -92,6 +92,7 @@ export default ( appData: Record, tipo?: string, isNew = true, + priceListData?: { preco?: number; preco_promocional?: number }, ): Promise => new Promise((resolve) => { const sku = tinyProduct.codigo || String(tinyProduct.id); const name = (tinyProduct.nome || sku).trim(); @@ -99,14 +100,18 @@ export default ( const fixToNumber = (shouldBeNumber: any) => { return Number(shouldBeNumber) > 0 ? Number(shouldBeNumber) : 0; }; - const price = fixToNumber(tinyProduct.preco_promocional || tinyProduct.precoPromocional) - || fixToNumber(tinyProduct.preco); + const listPrice = priceListData?.preco; + const listPromoPrice = priceListData?.preco_promocional; + const basePrice = fixToNumber(listPrice) || fixToNumber(tinyProduct.preco); + const price = fixToNumber(listPromoPrice) + || fixToNumber(tinyProduct.preco_promocional || tinyProduct.precoPromocional) + || basePrice; const product: ProductSet = { available: tinyProduct.situacao === 'A', sku, name, price, - base_price: fixToNumber(tinyProduct.preco), + base_price: basePrice, body_html: tinyProduct.descricao_complementar || tinyProduct.descricaoComplementar, }; const costPrice = fixToNumber(tinyProduct.preco_custo || tinyProduct.precoCusto); From d25d1c9219970ffbc91d3d528f7821d8492bd40d Mon Sep 17 00:00:00 2001 From: Vitor Date: Wed, 25 Feb 2026 18:20:08 -0300 Subject: [PATCH 2/2] ignoring freebies quantities and prices on kits discounts --- .../apps/discounts/lib-mjs/apply-discount.mjs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/apps/discounts/lib-mjs/apply-discount.mjs b/packages/apps/discounts/lib-mjs/apply-discount.mjs index 46a5611c4..b3f88ccbe 100644 --- a/packages/apps/discounts/lib-mjs/apply-discount.mjs +++ b/packages/apps/discounts/lib-mjs/apply-discount.mjs @@ -280,7 +280,25 @@ export default async ({ params, application }) => { return kitDiscount; }); } - const kitDiscounts = getValidDiscountRules(config.product_kit_discounts, params, params.items) + const freebieProductIds = []; + if (Array.isArray(config.freebies_rules)) { + config.freebies_rules.forEach((rule) => { + if ( + validateDateRange(rule) + && validateCustomerId(rule, params) + && Array.isArray(rule.product_ids) + && matchFreebieRule(rule, params) + ) { + rule.product_ids.forEach((id) => { + if (!freebieProductIds.includes(id)) freebieProductIds.push(id); + }); + } + }); + } + const kitEligibleItems = freebieProductIds.length + ? params.items.filter((item) => !freebieProductIds.includes(item.product_id)) + : params.items; + const kitDiscounts = getValidDiscountRules(config.product_kit_discounts, params, kitEligibleItems) .sort((a, b) => { if (!Array.isArray(a.product_ids) || !a.product_ids.length) { if (Array.isArray(b.product_ids) && b.product_ids.length) { @@ -332,7 +350,9 @@ export default async ({ params, application }) => { } // eslint-disable-next-line no-loop-func kitItems = kitItems.filter((item) => { - return item.quantity && discountedItemIds.indexOf(item.product_id) === -1; + return item.quantity + && discountedItemIds.indexOf(item.product_id) === -1 + && !freebieProductIds.includes(item.product_id); }); if (!kitItems.length) { continue;