From 74bf1abad803d637a1b930aec6f3742d41cdeffc Mon Sep 17 00:00:00 2001 From: Gabriel Date: Wed, 4 Mar 2026 16:35:38 -0300 Subject: [PATCH] add product detail query --- src/products/products.module.ts | 618 +++++++++++++++++++++++++++++++- 1 file changed, 617 insertions(+), 1 deletion(-) diff --git a/src/products/products.module.ts b/src/products/products.module.ts index da9e441..a0d2b38 100644 --- a/src/products/products.module.ts +++ b/src/products/products.module.ts @@ -23,6 +23,214 @@ export default moduleFactory }, params: ["filtro", "ean"], }, + detalhe: { + name: "Detalhes do Produto", + display: { + type: "detail", + stores: [ + { + store_id: "idempresa", + store_name: "nomeempresa", + category: "categoria", + last_entry: "dataultimaentrada", + last_sale: "dataultimavenda", + sections: [ + { + label: "Preço Atacado", + column: "precoatacado", + format: "currency_short", + }, + { + label: "Preço Varejo", + column: "precovarejo", + format: "currency_short", + }, + { + label: "MDV", + column: "mdv", + format: "currency_short", + }, + { + label: "Margem", + column: "margem", + format: "number", + }, + { + label: "Margem Atacado", + column: "margematacado", + format: "number", + }, + { + label: "Classe Abastecimento", + column: "classeabastecimento", + format: "string", + }, + { + label: "Descrição Embalagem", + column: "descricaoembalagem", + format: "string", + }, + { + label: "Quantidade Embalagem", + column: "quantidadeembalagem", + format: "number", + }, + { + label: "Estoque Disponível", + column: "estoqueDisponivel", + format: "number", + }, + { + label: "Estoque Troca", + column: "estoquetroca", + format: "number", + }, + { + label: "Estoque Trânsito", + column: "estoquetransito", + format: "number", + }, + { + label: "Estoque Futuro", + column: "estoquefuturo", + format: "number", + }, + { + label: "Estoque Reservado", + column: "estoquereservado", + format: "number", + }, + { + label: "DDV", + column: "ddv", + format: "currency_short", + }, + { + label: "DDV Mínimo", + column: "ddvminimo", + format: "currency_short", + }, + { + label: "DDV Máximo", + column: "ddvmaximo", + format: "currency_short", + }, + { + label: "Forma Abastecimento", + column: "formaabastecimento", + format: "string", + }, + { + label: "Situação", + column: "situacao", + format: "string", + }, + { + label: "Estoque Disponível CD", + column: "estoquedisponivelcd", + format: "number", + }, + { + label: "Estoque Futuro CD", + column: "estoquefuturocd", + format: "number", + }, + { + label: "Custo Líquido", + column: "custoliquido", + format: "currency_short", + }, + { + label: "Status Venda", + column: "statusvenda", + format: "string", + }, + { + label: "Status Compra", + column: "statuscompra", + format: "string", + }, + { + label: "Qtde Atacado", + column: "qtdeatacado", + format: "number", + }, + { + label: "ID Base", + column: "idbase", + format: "number", + }, + { + label: "Tipo Troca", + column: "tipotroca", + format: "string", + }, + { + label: "Quantidade Compra", + column: "quantidadecompra", + format: "number", + }, + { + label: "Reserva", + column: "reserva", + format: "number", + }, + { + label: "Validade Dias", + column: "validadedias", + format: "number", + }, + { + label: "Margem Lucro Divisão", + column: "margemlucrodivisao", + format: "percentage", + }, + { + label: "Preço Promoção", + column: "precopromoc", + format: "currency_short", + }, + { + label: "Preço Normal", + column: "preconormal", + format: "currency_short", + }, + { + label: "Preço Meu Mambo", + column: "precomeuMambo", + format: "currency_short", + }, + { + label: "Margem Meu Mambo", + column: "margemmeuMambo", + format: "percentage", + }, + { + label: "Margem Normal", + column: "margemnormal", + format: "percentage", + }, + { + label: "MDV Promoção", + column: "mdvpromoc", + format: "currency_short", + }, + { + label: "Preço Vencimento Próximo", + column: "vlrprecovenctoprox", + format: "currency_short", + }, + { + label: "Data Validade", + column: "dtavalidade", + format: "date", + }, + ], + }, + ], + }, + params: ["codproduto"], + }, }, entrypoint: "consulta", }) @@ -46,7 +254,7 @@ export default moduleFactory FROM CONSINCO.MAP_PRODCODIGO A WHERE A.SEQPRODUTO = p.SEQPRODUTO AND ISNUMERIC(A.CODACESSO) = 'S' - AND CAST(A.CODACESSO AS NUMBER) = CAST(${args.ean} AS NUMBER) + AND A.CODACESSO = ${args.ean} ) ) ) @@ -54,5 +262,413 @@ export default moduleFactory `, }; }, + detalhe: (args) => { + return { + sql: /*sql*/ ` + select 200 nroempresa, + tcomp.comprador, + nvl(mff.fornecedor, 'N/A') fornecedor, + consinco.gmgbfcategoriafamilian1(pro.seqfamilia, me.nrodivisao, 1) categoria, + pro.seqproduto, + initcap(pro.desccompleta) Descricao, + nvl(mapi.urlecommerceimg,'') ImagemUrl, + 0 PrecoAtacado, + + 0 PrecoVarejo, + + round(sum(pemp.medvdiaforapromoc),3) MDV, + 0 Margem, + + 0 MargemAtacado, + 'Sem valor' ClasseAbastecimento, + 'UN' DescricaoEmbalagem, + 1 QuantidadeEmbalagem, + sum(pemp.estqloja) EstoqueDisponivel, + + sum(NVL(pemp.estqtroca,0)) EstoqueTroca, + sum(NVL(pemp.qtdpedrectransito,0)) EstoqueTransito, + sum(pemp.qtdpendpedcompra) EstoqueFuturo, + sum(NVL(pemp.qtdreservadavda,0)) + sum(nvl(pemp.estqoutro,0)) EstoqueReservado, + case + when round(sum(pemp.medvdiaforapromoc),3) = 0 then 1 + else trunc(sum(pemp.estqloja) / round(sum(pemp.medvdiaforapromoc),3),3) + end DDV, + + 0 DDVMinimo, + 0 DDVMaximo, + 'GERAL' FormaAbastecimento, + + 'GERAL' Situacao, + pempcd.estqdeposito - nvl(pempcd.qtdreservadavda,0) EstoqueDisponivelCD, + pempcd.qtdpendpedcompra EstoqueFuturoCD, + + null DATAULTIMAENTRADA, + null DATAULTIMAVENDA, + 0 custoliquido, + 'A' STATUSVENDA, + --case when (pemp.statuscompra='A') then 1 else 0 end STATUSCOMPRA, + 'A' statuscompra, + 0 QtdeAtacado, + 0 IdBase, + 'GERAL' TIPOTROCA, + 0 QUANTIDADECOMPRA, + 0 RESERVA, + 0 VALIDADEDIAS, + 0 margemlucrodivisao, + 0 PrecoPromoc, + 0 PrecoNormal, + 0 PrecoMeuMambo, + 0 MargemMeuMambo, + 0 MargemNormal, + 0 MdvPromoc, + 0 VLRPRECOVENCTOPROX, + NULL dtavalidade + +from max_divisao md + +inner join max_empresa me + on me.nrodivisao = md.nrodivisao + and me.status = 'A' + and me.dtainiciomovestoque <= trunc(sysdate)-1 + and me.nrodivisao in (2) + and me.nroempresa >= 202 + and me.nroempresa < 290 + and me.nroempresa not in (291,298,910,911,920,930,931,940,980) + +inner join mad_segmento seg + on md.nrodivisao = me.nrodivisao +and me.nrosegmentoprinc = seg.nrosegmento + +inner join mrl_produtoempresa pemp + on pemp.nroempresa = me.nroempresa + +left join mrl_produtoempresa pempcd + on pempcd.seqproduto = pemp.seqproduto +and pempcd.nroempresa in (979) + +left join map_classeabastec mcab +on mcab.classeabastqtd = pemp.classeabastqtd +and mcab.nroempresa = pemp.nroempresa +and mcab.classeabastvlr = pemp.classeabastvlr + +inner join map_produto pro + on pro.seqproduto = pemp.seqproduto + +inner join map_famdivisao mfdv + on mfdv.seqfamilia = pro.seqfamilia +and mfdv.nrodivisao = me.nrodivisao + +inner join max_comprador mco + on mco.seqcomprador = mfdv.seqcomprador + +left join tb_comprador tcomp + on tcomp.COMPRADOR = mco.comprador + +left join map_produtoimagem mapi + on mapi.seqproduto = pro.seqproduto +and mapi.indpricipal = 'S' + +inner join mrl_prodempseg pes + on pes.seqproduto = pemp.seqproduto +and pes.nroempresa = pemp.nroempresa +and pes.nrosegmento = seg.nrosegmento +and pes.qtdembalagem = 1 + +inner join mrl_prodempseg pes2 + on pes2.nroempresa = pes.nroempresa +and pes2.seqproduto = pes.seqproduto +and pes2.nrosegmento = pes.nrosegmento + +left join mrl_prodempseg pes3 + on pes3.seqproduto = pemp.seqproduto +and pes3.nroempresa = pemp.nroempresa +and pes3.nrosegmento = 15 +and pes3.qtdembalagem = 1 + +inner join map_famembalagem emb + on emb.seqfamilia = pro.seqfamilia +and emb.qtdembalagem = 1 + +left join (select mffTemp.Seqfamilia, + mfdvTemp.Nrodivisao, + mffTemp.indindenizavaria, + mfdvTemp.pzomedvisitarep, + mfdvTemp.pzomedentrega, + mfdvTemp.pzomedatraso, + gp.fantasia fornecedor + + from map_famfornec mffTemp + + inner join ge_pessoa gp + on gp.seqpessoa = mffTemp.Seqfornecedor + + left join maf_fornecdivisao mfdvTemp + on mfdvTemp.Seqfornecedor = mffTemp.Seqfornecedor + and mffTemp.Principal = 'S' + + ) mff + on mff.seqfamilia = pro.seqfamilia +and mff.nrodivisao = md.nrodivisao + +where 1=1 +--and pemp.SEQPRODUTO = 136011 +--and pemp.nroempresa = 202 +and md.nrodivisao in (2,4) +and (${args.codproduto} is null or pemp.seqproduto = ${args.codproduto}) + +and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1) + from mrl_prodempseg pes3 + where pes3.nroempresa = pes.nroempresa + and pes3.seqproduto = pes.seqproduto + and pes3.nrosegmento = pes.nrosegmento + and pes3.statusvenda = 'A') + +group by tcomp.comprador, + nvl(mff.fornecedor, 'N/A'), + consinco.gmgbfcategoriafamilian1(pro.seqfamilia, me.nrodivisao, 1), + pro.seqproduto, + initcap(pro.desccompleta), + nvl(mapi.urlecommerceimg,''), + pempcd.estqdeposito, + nvl(pempcd.qtdreservadavda,0), + pempcd.qtdpendpedcompra + +union all + +select pemp.nroempresa, + tcomp.comprador, + nvl(mff.fornecedor, 'N/A') fornecedor, + consinco.gmgbfcategoriafamilian1(pro.seqfamilia, me.nrodivisao, 1) categoria, + pro.seqproduto, + initcap(pro.desccompleta) Descricao, + nvl(mapi.urlecommerceimg,'') ImagemUrl, + case when trunc(case + when pes2.precovalidpromoc > 0.00 then nvl(pes2.precovalidpromoc,0) + when pes2.precovalidpromoc = 0.00 then nvl(pes2.precovalidnormal,0) + end / pes2.qtdembalagem,2) = 0 then + trunc(case + when pes.precovalidpromoc > 0.00 then nvl(pes.precovalidpromoc,0) + when pes.precovalidpromoc = 0.00 then nvl(pes.precovalidnormal,0) + end, 2) + else + trunc(case + when pes2.precovalidpromoc > 0.00 then nvl(pes2.precovalidpromoc,0) + when pes2.precovalidpromoc = 0.00 then nvl(pes2.precovalidnormal,0) + end / pes2.qtdembalagem,2) + end PrecoAtacado, + + trunc(case + when pes.precovalidpromoc > 0.00 then nvl(pes.precovalidpromoc,0) + when pes.precovalidpromoc = 0.00 then nvl(pes.precovalidnormal,0) + end, 2) PrecoVarejo, + + trunc(nvl(pemp.medvdiaforapromoc,0),4) MDV, + nvl(gmgb_fn_buscamargemproduto(pemp.nroempresa,pemp.seqproduto),0) Margem, + + case + when trunc(case + when pes.precovalidpromoc > 0.00 then nvl(pes.precovalidpromoc,0) + when pes.precovalidpromoc = 0.00 then nvl(pes.precovalidnormal,0) + end, 2) = trunc(case + when pes2.precovalidpromoc > 0.00 then nvl(pes2.precovalidpromoc,0) + when pes2.precovalidpromoc = 0.00 then nvl(pes2.precovalidnormal,0) + end / pes2.qtdembalagem,2 + ) then nvl(gmgb_fn_buscamargemproduto(pemp.nroempresa,pemp.seqproduto),0) + else + nvl(CONSINCO.GMGB_FN_BUSCAMARGEMPRODUTO_AT2(pemp.nroempresa,pemp.seqproduto),0) + end MargemAtacado, + nvl(pemp.codclassifpreco,'Sem valor') ClasseAbastecimento, + emb.embalagem DescricaoEmbalagem, + trunc(nvl(emb.qtdembalagem,0)) QuantidadeEmbalagem, + case + when pemp.nroempresa in (979, 980, 981) then trunc(nvl(pemp.estqdeposito - pemp.qtdreservadavda,0),3) + else trunc(nvl(pemp.estqloja,0), 3) - (NVL(pemp.qtdreservadavda,0)) + end EstoqueDisponivel, + + NVL(pemp.estqtroca,0) EstoqueTroca, + NVL(pemp.qtdpedrectransito,0) EstoqueTransito, + pemp.qtdpendpedcompra EstoqueFuturo, + NVL(pemp.qtdreservadavda,0) + nvl(pemp.estqoutro,0) EstoqueReservado, --24/05/2024 - cfreitas - Inclu�do estqoutro para n�o ser necess�rio utilizar MADV_COMPOSICAORESERVASELINV + ROUND(nvl(case + when NVL(pemp.medvdiaforapromoc, 0) = 0 then 0 + when NVL(pemp.medvdiaforapromoc,0) > 0 then (nvl(case when me.nroempresa in (979, 980, 981) then trunc(nvl(pemp.estqdeposito,0), 3) else trunc(nvl(pemp.estqloja,0), 3) end,0) - NVL(pemp.qtdreservadavda,0) ) / trunc(nvl(pemp.medvdiaforapromoc,1),4) + end, 0), 3) DDV, + + nvl(pemp.estqminimodv,0) DDVMinimo, + nvl(pemp.estqmaximodv, 0) DDVMaximo, + case + WHEN (select count(1) from mlo_prodembwm w where w.nroempresa = 979 and w.seqproduto = pemp.seqproduto and w.codlinhasepar = 'FR') > 0 THEN 'FRACIONADO' + when pemp.formaabastecimento = 'I' then 'ARMAZENAGEM' + when pemp.formaabastecimento = 'C' then 'CROSS' + when pemp.formaabastecimento = 'N' then 'CENTRAL-EDL' + when pemp.formaabastecimento = 'E' then 'LOJA-EDL' + when pemp.formaabastecimento is null then gmgb_fn_busca_forma_abastecfam(pro.seqfamilia, md.nrodivisao) + end FormaAbastecimento, + + case + when pes.precovalidpromoc > 0.00 then 'PROMOCAO' + when pes.precovalidpromoc = 0.00 then 'NORMAL' + end Situacao, + pempcd.estqdeposito - nvl(pempcd.qtdreservadavda,0) EstoqueDisponivelCD, + pempcd.qtdpendpedcompra EstoqueFuturoCD, + + consinco.gmgb_fn_busca_dtult_entrada(pemp.nroempresa,pemp.seqproduto) DATAULTIMAENTRADA, + pemp.dtaultvenda DATAULTIMAVENDA, + consinco.fmrl_custoprodempatual(pro.seqproduto, pemp.nroempresa, 'L') custoliquido, + CASE WHEN (select count(*) from mrl_prodempseg pest where pest.seqproduto = pemp.seqproduto and pest.nroempresa = pemp.nroempresa and pest.nrosegmento = seg.nrosegmento and pest.statusvenda = 'A' ) > 0 then 'A' ELSE 'I' end STATUSVENDA, + --case when (pemp.statuscompra='A') then 1 else 0 end STATUSCOMPRA, + pemp.statuscompra, + nvl((select min(qtdembalagem) from mrl_prodempseg where nroempresa=me.nroempresa and nrosegmento=me.nrosegmentoprinc and seqproduto=pro.seqproduto and statusvenda='A' and qtdembalagem>1), 1) QtdeAtacado, + nvl(pro.seqprodutobase,0) IdBase, + case + when mfdv.indnegavariacentral = 'S' THEN 'TROCA FISICA' + ELSE + + case when mff.indindenizavaria = 'S' then + case when (me.nroempresa >= 400 and me.nroempresa <=499) or (me.nroempresa >= 600 and me.nroempresa <= 699) then + 'SEM TROCA' + else + 'TROCA FINANC' + end + when mff.indindenizavaria = 'N' then + 'NF DEVOL' + else + 'SEM TROCA' + end + END TIPOTROCA, + mfdv.padraoembcompra QUANTIDADECOMPRA, + pemp.qtdreservadavda RESERVA, + NVL(pro.pzovalidadedia, 0) VALIDADEDIAS, + mfdv.margemlucrodivisao, + nvl(pes.precovalidpromoc,0) PrecoPromoc, + nvl(pes.precovalidnormal,0) PrecoNormal, + nvl(pes3.precovalidpromoc,0) PrecoMeuMambo, + case when pes3.precovalidpromoc > 0 then + nvl(consinco.mbo_fn_buscamargemprodutoseg(pemp.nroempresa,pemp.seqproduto,15),0) + else + 0 + end MargemMeuMambo, + nvl(consinco.mbo_fn_buscamargemprodutoseg(pemp.nroempresa,pemp.seqproduto,2,'S'),0) MargemNormal, + trunc(nvl(pemp.medvdiapromoc,0),4) MdvPromoc, + NVL(vncto.vlrprecovenctoprox,0) VLRPRECOVENCTOPROX, + vncto.dtavalidade + +from max_divisao md + +inner join max_empresa me + on me.nrodivisao = md.nrodivisao +and me.nroempresa not in (104,200,291,298,910,911,920,930,931,940,980) +and me.dtainiciomovestoque <= trunc(sysdate) +and me.status = 'A' + +inner join mad_segmento seg + on md.nrodivisao = me.nrodivisao +and me.nrosegmentoprinc = seg.nrosegmento + +inner join mrl_produtoempresa pemp + on pemp.nroempresa = me.nroempresa + +left join mrl_produtoempresa pempcd + on pempcd.seqproduto = pemp.seqproduto +and pempcd.nroempresa in (979) + +left join map_classeabastec mcab +on mcab.classeabastqtd = pemp.classeabastqtd +and mcab.nroempresa = pemp.nroempresa +and mcab.classeabastvlr = pemp.classeabastvlr + +inner join map_produto pro + on pro.seqproduto = pemp.seqproduto + +inner join map_famdivisao mfdv + on mfdv.seqfamilia = pro.seqfamilia +and mfdv.nrodivisao = me.nrodivisao + +inner join max_comprador mco + on mco.seqcomprador = mfdv.seqcomprador + +left join tb_comprador tcomp + on tcomp.COMPRADOR = mco.comprador + +left join map_produtoimagem mapi + on mapi.seqproduto = pro.seqproduto +and mapi.indpricipal = 'S' + +inner join mrl_prodempseg pes + on pes.seqproduto = pemp.seqproduto +and pes.nroempresa = pemp.nroempresa +and pes.nrosegmento = seg.nrosegmento +and pes.qtdembalagem = 1 + +inner join mrl_prodempseg pes2 + on pes2.nroempresa = pes.nroempresa +and pes2.seqproduto = pes.seqproduto +and pes2.nrosegmento = pes.nrosegmento + +left join mrl_prodempseg pes3 + on pes3.seqproduto = pemp.seqproduto +and pes3.nroempresa = pemp.nroempresa +and pes3.nrosegmento = 15 +and pes3.qtdembalagem = 1 + +inner join map_famembalagem emb + on emb.seqfamilia = pro.seqfamilia +and emb.qtdembalagem = 1 + +left join (select mffTemp.Seqfamilia, + mfdvTemp.Nrodivisao, + mffTemp.indindenizavaria, + mfdvTemp.pzomedvisitarep, + mfdvTemp.pzomedentrega, + mfdvTemp.pzomedatraso, + gp.fantasia fornecedor + + from map_famfornec mffTemp + + inner join ge_pessoa gp + on gp.seqpessoa = mffTemp.Seqfornecedor + + left join maf_fornecdivisao mfdvTemp + on mfdvTemp.Seqfornecedor = mffTemp.Seqfornecedor + and mffTemp.Principal = 'S' + + ) mff + on mff.seqfamilia = pro.seqfamilia +and mff.nrodivisao = md.nrodivisao + +left join (select pvencto.nroempresa, + pvencto.seqproduto, + min(pvencto.vlrpreco) vlrprecovenctoprox, + min(pvencto.dtavalidade) dtavalidade + from consinco.mrl_prodempvencimento pvencto + where 1=1 + and pvencto.dtavalidade >= trunc(sysdate) + and pvencto.qtdembalagem = 1 + group by pvencto.nroempresa, + pvencto.seqproduto + ) vncto + ON vncto.nroempresa = pemp.nroempresa +and vncto.seqproduto = pemp.seqproduto + +where 1=1 +--and pemp.SEQPRODUTO = 136011 +--and pemp.nroempresa = 202 +and md.nrodivisao in (2,4) +and (${args.codproduto} is null or pemp.seqproduto = ${args.codproduto}) +and (${args.ctx_user_companies} is null or me.nroempresa in ( + select to_number(regexp_substr(:${args.ctx_user_companies}, '[^,]+', 1, level)) + from dual + connect by regexp_substr(:${args.ctx_user_companies}, '[^,]+', 1, level) is not null +)) + +and pes2.qtdembalagem = (select nvl(max(pes3.qtdembalagem), 1) + from mrl_prodempseg pes3 + where pes3.nroempresa = pes.nroempresa + and pes3.seqproduto = pes.seqproduto + and pes3.nrosegmento = pes.nrosegmento + and pes3.statusvenda = 'A') + ` + } + } }, });