update conf set confrelease = '13205'; ------------------------------------------------------------------------------------------------ ALTER TABLE nf add COLUMN nfufsigla char(2); alter table nf add column nfmuncod int4; ------------------------------------------------------------------------------------------------ -- DROP FUNCTION public.f_realizar_faturamento(int4, int4, int4, int4, timestamptz, timestamptz, int4, int4, int4); CREATE OR REPLACE FUNCTION public.f_realizar_faturamento(integer, integer, integer, integer, timestamp with time zone, timestamp with time zone, integer, integer, integer) RETURNS TABLE(frfatnfcod integer, frfatnfnum integer, frfatnfserie text, frfatmens text) LANGUAGE plpgsql AS $function$ declare /* 10/01/13 - KAYTON: Criação da função f_faturar 15/03/13 - KAYTON: Alteracao select pvi pra so selecionar itens com pviqtdeatecar > 0 where pviqtdeatecar>0 and pvipvempparcod=p_empresa and pvipvcod=p_pedido 21/03/13 - KAYTON: Implementacao da f_seqnf para obter o proximo numero de nf por opnf e empresa 16/07/13 - KAYTON: Implementacao cesta básica (Configuração prevista para tratar 1 item CB por pedido) 05/08/13 - KAYTON: Implementacao controle de estoque 02/09/13 - KAYTON: Implementacao da qtde reservada 10/10/13 - KAYTON: Implementacao do campo opnfcfop e opnfgt e aproveitamento de cred PIS/COFINS 11/10/13 - KAYTON: Tratamento coalesce -> icms,v_vicms,percipi 05/11/13 - KAYTON: Tratamento custo 07/11/13 - KAYTON: Corrigir erro de update em cprpg 26/11/13 - KAYTON: Implementacao do Lote (NAO FINALIZADO) 29/11/13 - KAYTON: Corrigir insert do estmv 06/12/13 - KAYTON: Customização do campo obs nf. Puxando de confobsnf 16/12/13 - KAYTON: Corrigir cliultnfserie 03/01/14 - KAYTON: Informações sobre compra do cliente considerar VI (rec_pv.opnftopnfcod IN ('VE','VI','VV')) 03/01/14 - KAYTON: Tratamento da rotina de recalcular comissão e atualização de dados NFIDET 26/03/14 - KAYTON: Tratamento de tributacao por produto 28/03/14 - KAYTON: Desconsiderar vldesc para total da nf, pois o item ja vem com desconto aplicado 31/03/14 - KAYTON: Suspender temporariamente o tratamento do vldesc 02/04/14 - KAYTON: Substituir opnfpis_cst para opnfcofins_cst no cálculo da base de dados cofins coalesce nos campos opnfpiscofins para validar corretamento com conteudo 'S' quando vazio no calculo de bcpis/bccofins 17/04/14 - KAYTON: Considerar campo coalesce(opnftipoemissaonf,'P') as opnftipoemissaonf, para nftipoemissao 04/05/14 - KAYTON: Implementação dos campos referentes à embalagem principal 09/05/14 - KAYTON: Ativação da regra controle de lote 26/05/14 - KAYTON: Gravar campo nfnumvol com o conteúdo sum(nfiqtde) 01/06/14 - KAYTON: Implementar regra CLILP - usar f_livro_do_cliente para localizar trib 25/06/14 - KAYTON: Calcular custocompra e custoreal multiplicado por uvemult e pviqtdeatecar 07/07/14 - KAYTON: Substituir uvemult por pviuvemult 07/07/14 - KAYTON: Adicionar bloco para calcular ipi/st quando pedido com índice 11/08/14 - KAYTON: Tratamento de tributacao por benefício fiscal associado ao cliente 11/08/14 - KAYTON: Alterar cobrança de acordo com parâmetro informado (b_boleto) e flag no tc (tc_per_alt_fat) 15/08/14 - KAYTON: Implementação do coalesce coalesce(tribbenefufdest,tribproufdest,tribufdest) corrigindo erro quando pedido bonificação enviando cfop de venda 15/09/14 - KAYTON: Implementação das regras de impressão tributação para OPNF ECF - opnftopnfcod='CF' 18/11/14 - KAYTON: Corrigindo regras para gravacao do lote 07/12/14 - KAYTON: Round 4 para qtde e round 2 para valores - Base de cálculo se aliq icms > 0 08/12/14 - KAYTON: Inclusão do campo pvtipofrete e nftipofrete, pviseq e nfiseq. Gravar pvalthorario, ação e usuário 02/04/15 - KAYTON: Inclusão da regra de gerar cprpg a partir da pvplpg (plano negociado) 02/04/15 - KAYTON: Gravar pvvol em nfvol 03/05/15 - KAYTON: 1. Corrigir diferença no valor total das parcelas (cprpg) em relação à nf. antes: cprvt/rec_pv.num_parc,--cprpgv numeric(14,4), depois: trunc(cprvt/rec_pv.num_parc,2),--cprpgv numeric(14,4), 2. Gerar primeira parcela do cprpg com ST. 16/05/15 - KAYTON: Adicionar novos campos em f_insert_estmv: parceiro, opnf operacao. 02/06/15 - KAYTON: Implementar faturamento Produto KIT. 05/06/15 - KAYTON: Alimentar cprpgparc com cprpgcod 08/06/15 - KAYTON: Alimentar nfibasedebcred com pvibasedebcred 21/07/15 - KAYTON: Implementar lote pelo pvilote 01/12/15 - RAUL: Alimentar transportadora com base no tipo de frete do pedido caso nao alimente transportadora ao faturar (p_transportadora) 04/12/15 - RAUL: Corrigir bugs do CPR e CPRPG e NFIVLVEN 1.data de vencimento do CPRPG (cprpgdvenc) agora é com base no parametro: p_horariosaida (v_datahorasaida), --> antes estava fixo now() 2.update cpr set cprdocnum=rec_seqnf.numero,cprdocserie=rec_seqnf.serie,cpr_notafiscal, agora com "v_nfcod", pois estava alterando registros em outras empresas 3.Alterado de round 2 para round 4 ao inserir nfivlunit (pvivlven). -->Kayton orientou estudarmos mais! 31/03/16 - KAYTON: Alimentar campos nfvlfrete e nfivlfrete referente a frete que vem de pvvlfrete e pvivlfrete respectivamente 28/06/16 - KAYTON: Alimentar campos nfiqtdefalta e nfiqtdecorte 06/07/16 - KAYTON: clicontricms para parcontricms -csosn para não contribuinte -tratamento temporario do parametro transportadora para contemplar regra lemos e demais -round pvltabunit e pvlven de 2 para 4 casas -lança despesa de boleto (clidespbol) na base de calculo do primeiro item 07/07/16 - KAYTON: Regra DIFFAL 07/07/16 - KAYTON: Corrigir cálculo despbol quando produto ST 07/07/16 - KAYTON: Cobrar despesa de boleto somente qd cobrança boleto e cliente marcado 20/01/17 - KAYTON: Implementação de efetivação automática de acordo com parâmetro confefetivarauto 27/03/17 - KAYTON: Implementação regra ST para não contribuinte 12/05/17 - KAYTON: Implementação dos campos pvvol,pvpesobruto,pvpesoliq,pvtranspparcod,pvdtentrega Considerando campo confusadtentregaparagerarfin para setar dtvenc tanto de plano negociado, qt plano pagamento 18/05/17 - KAYTON: Gravando trasnportadora do pedido (pvtranspparcod) na nf (nftranspcod) 04/07/17 - KAYTON: Obter Modelo do documento a partir do laymodelo (01, 55, 65) 13/07/17 - KAYTON: Gravar Aliq IVA em nfi (nfialiqiva) 20/02/18 - DAVID: calcular difal apenas se se a aliq de ICMS for > que 0 28/02/18 - DAVID: Tratar informações adicionais do pedido 05/03/18 - DAVID: Alterar busca do peso, alterado para UVE*qtde 07/03/18 - DAVID: Alterar para não calcular IPI em opérações SR 08/03/18 - DAVID: Alterar para calcular IPI em opérações ISENTO 01/06/18 - DAVID: Alterar para calcular IPI para seguir o informado na OPNF caso seja 'S' ou no cadastro do PRODUTO caso seja <> 'S' 30/07/18 - DAVID: Tratar FCP e FCPST alimentando os campos na NFI 05/09/18 - DAVID: multiplicar despesa de boleto pela quantidade de boletos 12/09/18 - DAVID: Travar IVA no faturamento 12/07/19 - DAVID: Alimentar campo nfialiqicmsefet 03/04/20 - DAVID: Alimentar campos nfi nfibcicmsefet e nfivlicmsefet 18/06/20 - DAVID: tratar aliqicmsefet para receber valor do gtperccredicmsbenef caso ele esteja preenchido 17/07/20 - DAVID: tratar campo pvipedcli 20/07/20 - DAVID: tratar opnfusaentregafutura para alimentar a tabela estcli 31/08/20 - DAVID: tratar opnfusaipinoicms para calcular o valor da base de ICMS + IPI 16/10/20 - DAVID: tratar base de fcp nfidifalbcfcpdest 12/11/20 - DAVID: Adicionar tratamento de m³: nfimetrocubico e nfmetrocubico 05/01/21 - DAVID: Não movimentar estoque para operações de entrega futura 12/01/21 - DAVID: tratar campo cli_perc_fin para dar desconto no documento 28/01/21 - David: tratar cbenef pelo codigo do GT 23/09/21 - David: Tratar opnf_nao_mov_est 28/07/22 - David: Tratar nfibcfcp e nfibcfcpst e o somatório do nfifcpvlqicmsst no nfvl 30/07/22 - David: criação dos campos v_vbcfcp e v_vbcfcpST e tratativa na inserção da NFI 11/08/22 - David: correção do valor do FCP ST baseado no v_vlfcpST 11/08/22 - David: correção do valor do ST baseado no v_vlfcpST 18/08/22 - David: correção do da base de ST para não somar o valor da base de FCP ST 18/08/22 - David: retirar o FCP ST do valor da ST, fiz de forma facil de retornar caso o contador da EXXA queira alterar novamente 02/09/22 - David: utilizar uvedes e uveun do cadastro do produto e não o salvo no pedido. -- feito para evitar que o dado não seja preenchido. 08/09/22 - David: Alimentar cprpgdescv com o valor calculado do % de desconto do cliente 13/09/22 - David: Voltar a regra do valor da CPR para salvar o valor cheio da nota 15/09/22 - David: Alteração na regra de desconto financeiro para considerar a ST daprimeira parcela 20/09/22 - David: Alteração na regra de desconto financeiro para considerar a ST daprimeira parcela 07/11/22 - David: Correção do calculo do v_vlfcpST para subtrair o valor da v_vlfcp 19/12/22 - David: Tratar o v_vicms_efet para receber o valor de redução do beneficio quando ele estiver presente no cadastro da empresa 27/12/22 - David: Correção do beneficio fiscal, para tratar os campos do grupo de tributação 23/01/22 - David: Tratar parcontricms <> N para verificar qual bloco da tributação será utilizada 08/03/23 - David: Tratar despbol para ser rateado em todos os produtos e ser considerado na base de ST verifica diferenca de despbol e joga no ultimo produto 21/06/23 - David: Envio de mensagem para o vendedor sempre que um pedido for faturado 31/06/23 - David: Correção da soma de despesa de boleto na ST 30/09/23 - David: Correção do v_baseicms para tratar a redução corretamente 18/10/23 - David: Correção da redução da base de ST 03/11/23 - David: Correção do valor de outras despesas, comentar o bloco que recalcula elas visto que o valor esta sendo lançado corretamente 13/11/23 - David: usar o campo conf_div_st_parcelas para verificar se divide a ST ou se mantem o calculo atual 11/04/24 - David: alimentar nfibcipi no momento de faturar 23/04/24 - David: corrigir nfivloutrasdesp para 2 casas decimais 09/07/24 - David: Criação da varialvel v_vlfcp para alimentar o valor de FCP baseado em um calculo em tempo real da base de ICMS 18/07/24 - David: alimentar o campo nfrefnfcod com o pvrefnfcod para a referencia de NFce 02/08/24 - David: - Correção na identação - criar campo v_vpro - tratar calculo da ST baseado no campo conf_usa_desconta_st_do_preco para que o sistema calcule o valor dos produtos baseado na precificação como valor final 12/09/24 - David: recalcular o valor da base de calculo de acordo com o novo valor do produto para os casos de v_DescontaStdoPreco = 'S' 13/09/24 - David: verifica se existe uyma diferença no valor sum(nfivl+nfivlicmsst+nfifcpvlqicmsst)-sum(round(nfivl,2)+round(nfivlicmsst,2)+round(nfifcpvlqicmsst,2) , caso exista, joga essa diferença no ultimo produto 09/10/24 - David: correção da aliquota de destino do DIFAL para usar 100% da aliquota e não mais subtrair a aliq interna 11/10/24 - David: correção do valor da ST quando não descontata do preço, para 2 casas decimais -------------------------------------------------------------------------------------------------------------------------------------------------------- -- select * from f_realizar_faturamento(100,1,4223,0,cast(now() as date),now(),3,0,0) select * from pv where pvcod = 34484 update pv set pvsta = 'AA' where pvcod = 34484 select * from pvi where pvipvcod = 34484 select * from nfi where nfinfcod = 32977 */ p_usuario ALIAS for $1;--integer 1001 p_empresa ALIAS for $2;--integer 191 p_pedido ALIAS for $3;--integer 843 p_boleto ALIAS for $4;--integer 9 - CAIXA p_dtemissao ALIAS for $5;--date now() p_horariosaida ALIAS for $6;--timestamp p_transportadora ALIAS for $7;--integer p_veiculo ALIAS for $8;--integer p_motorista ALIAS for $9;--integer rec_pv RECORD; rec_plpg RECORD; rec_seqnf RECORD; rec_mens RECORD; rec_insert_estmv RECORD; rec_insert_estlotemv RECORD; rec_pv_insert_estmv RECORD; rec_pv_insert_estlotemv RECORD; rec_pv_usacontrolelote RECORD; rec_efetauto RECORD; v_nfidet RECORD; v_erro INTEGER; num_parc INTEGER; v_nfcod INTEGER; v_menscod INTEGER; v_res INTEGER; v_cprcod INTEGER; v_agora TIMESTAMP; v_datahorasaida TIMESTAMP; v_pedido INTEGER; v_vnf numeric(14, 4); v_visento numeric(14, 4); v_vbasecalc numeric(14, 4); v_vicms numeric(14, 4); v_voutros numeric(14, 4); v_vipi numeric(14, 4); v_vbasecalcST numeric(14, 4); v_vlicmsST numeric(14, 4); v_vdesc numeric(14, 4); v_vbcfcp numeric(14, 4); v_vbcfcpST numeric(14, 4); v_vlfcpST numeric(14, 4); v_vbasecalc_efet numeric(14, 4); v_vicms_efet numeric(14, 4); v_inseriuCab BOOLEAN; v_confobsnf text; v_obsnf text; v_VERSAO text; v_efetauto text; v_cliestprocod integer; v_DivSt text; v_vlfcp numeric(14, 4); v_DescontaStdoPreco text; v_vpro numeric(14, 4); v_vproFinal numeric(14, 4); v_indice_st numeric(14, 4); begin --************************************************************* -- VERSAO DA FUNCAO FATURAMENTO --************************************************************* v_VERSAO = 'FUNCAO DE FATURAMENTO v2024.09.18.1'; --************************************************************* -- VALIDAR DADOS ANTES DO FATURAMENTO --************************************************************* v_erro := 0; for rec_mens in select pedido, advertencia from f_validar_faturamento(p_empresa, p_pedido) loop return QUERY select 0::integer as nfcod, 0::integer as nfnum, ''::text as nfserie, rec_mens.advertencia; v_erro := 1; end loop; if v_erro > 0 then return; end if; --************************************************************* -- OBTER DATA HORA HOJE --************************************************************* select now() into v_agora; --************************************************************* -- OBTER DADOS PV --************************************************************* v_inseriuCab := false; /* Inserir nf somente 1 vez e não para cada item do laço. Dessa forma é possivel usar 1 sql. */ --************************************************************* -- OBTER DADOS PV/PVI --************************************************************* for rec_pv in select /* REGRA ESPECIFICA LEMOS - TEMPORARIA (07/06/2016) INI-------------*/ case when ( select parcnpjcpf from par where parcod = pvempparcod) in ('12941093000138', '00652008000213', '00652008000990', '00652008000302', '00652008000647', '00652008000132', '11476381000368', '12978703000178', '01623668000239', '11476381000287', '01623668000158', '00652008000728', '11476381000104') then case when coalesce(p_transportadora, 0)>0 then p_transportadora --se informar transportadora when coalesce(p_transportadora, 0)= 0 and pvtipofrete = '0' then pvempparcod --se nao informar, 0=EMITENTE when coalesce(p_transportadora, 0)= 0 and pvtipofrete = '1' then pvcliparcod --se nao informar, 1=DESTINATARIO else p_transportadora end else case when coalesce(pvtranspparcod, 0)>0 then pvtranspparcod else p_transportadora end end as transpcod, /* REGRA ESPECIFICA LEMOS - TEMPORARIA (07/06/2016) FIM-------------*/ --Lança despesa boleto no primeiro item e tipo de cobranca pedido igual boleto --case when ROW_NUMBER() OVER (ORDER BY pviseq)=1 and (select tctdoc from tc where tccod=pvtccod)='BO' then coalesce(clidespbol,0) else 0 end as despbol, /* 08/03/2023 * Alteração da regra de despesa para ratear entre todos os produtos * case when ROW_NUMBER() OVER (ORDER BY pviseq)=1 and (select tctdoc from tc where tccod=pvtccod)='BO' then coalesce((clidespbol*coalesce(plpgnumparc,1)),0) else 0 end as despbol, */ case when ( select tctdoc from tc where tccod = pvtccod)= 'BO' then coalesce(round((clidespbol * coalesce(plpgnumparc, 1))/ count(pviprocod) over (order by 1), 2), 0) else 0 end as despbol, pvempparcod, pvcod, pvsta, pvplpgcod, case when cast(p_boleto as integer)>0 and (select tc_per_alt_fat from tc where tccod = pvtccod)= 'S' then p_boleto else pvtccod end as pvtccod, pvcliparcod, pvopnfcod, pvrcaparcod, pvrcaauxparcod, pvsupparcod, pvcarcod, pvobsnf, pvindice, pvipvempparcod, pvipvcod, tipoproduto, kitprocod, pviprocod, --embalagem de venda pviuvecod, (select uvedes from uve where uveprocod = pviprocod and uvecod = pviuvecod) as pviuvedes, (select uveun from uve where uveprocod = pviprocod and uvecod = pviuvecod) as pviuveun, pviuvemult, pviqtde, pviqtdeate, pviqtdeatecar, pvivltab, pvibasedebcred, pvivlven, coalesce(pviqtde, 0)-coalesce(pviqtdeate, 0) as qtdefalta, coalesce(pviqtdeate, 0)-coalesce(pviqtdeatecar, 0) as qtdecorte, --embalagem principal (select uvecod from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1) as puvecod, (select uvedes from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1) as puvedes, (select uveun from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1) as puveun, (select uvemult from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1) as puvemult, --QT_PRINCIPAL=Qt.vendida*mult_venda/mult_principal round(pviqtdeatecar * pviuvemult /(select uvemult from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1), 4) as pqtde, round(pvivltab / pviuvemult *(select uvemult from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1), 4) as pvltabunit, round(pvivlven / pviuvemult *(select uvemult from uve where uvetipo = 'P' and uveprocod = pviprocod limit 1), 4) as pvlven, coalesce(prouvenf, 'V') as uvenf, pvivltotal, pviqtdeatecar *(pvivltab-pvivlven) as vldesc, parcontricms, regtribccsacod, opnfsta, opnf_conta_id, opnf_cc_id, opnfcpr, opnfesp, opnftopnfcod, coalesce(opnftipoemissaonf, 'P') as opnftipoemissaonf, case when opnfpiscofins = 'S' then opnfpis else cstpiscofins_aliq_pis end pisaliq, case when opnfpiscofins = 'S' then opnfpis_cst else estcstpiscofinscod end piscst, case when opnfpiscofins = 'S' then opnfpis_aliqvalor else estvlpautapis end pisvlpauta, --case when opnfpiscofins='S' then opnfpis_percred else gtfpispercred end pispercred, case when opnfpiscofins = 'S' then opnfcofins else cstpiscofins_aliq_cofins end cofinsaliq, case when opnfpiscofins = 'S' then opnfcofins_cst else estcstpiscofinscod end cofinscst, case when opnfpiscofins = 'S' then opnfcofins_aliqvalor else estvlpautacofins end cofinsvlpauta, --case when opnfpiscofins='S' then opnfcofins_percred else gtfcofinspercred end cofinspercred, --Valores PIS/COFINS (Base de calculo = Vl.Operacao - Vl.Desc) case when (coalesce(opnfpiscofins, '')= 'S' and coalesce(opnfpis_cst, '')= '01') then pvivltotal when (coalesce(opnfpiscofins, '')<> 'S' and coalesce(estcstpiscofinscod, '')= '01') then pvivltotal else 0 end as bcpis, case when (coalesce(opnfpiscofins, '')= 'S' and coalesce(opnfcofins_cst, '')= '01') then pvivltotal when (coalesce(opnfpiscofins, '')<> 'S' and coalesce(estcstpiscofinscod, '')= '01') then pvivltotal else 0 end as bccofins, 0 as bcqtpis,--pendente para produto com pauta 0 as bcqtcofins,--pendente para produto com pauta gtcod, gtdes, case when parcontricms <> 'N' then estvlpautaicms else estvlpautaicmsncontrib end as pauta, case when parcontricms <> 'N' then coalesce(gtpercredbc,0) else coalesce(gtncontribpercredbc,0) end as percrbcicms, case when opnftopnfcod = 'CF' then gtecfaliqicms else case when parcontricms = 'S' then gtaliqicms else gtncontribaliqicms end end as aliqicms, case when opnftopnfcod = 'CF' then gtecfaliqicms when gtperccredicmsbenef > 0 then gtperccredicmsbenef when parcontricms <> 'N' then gtaliqefet else gtncontribaliqefet end as aliqicmsefet, case when opnftopnfcod = 'CF' then gtecfcstcod else case when parcontricms <> 'N' then gtcstcod else gtncontribcstcod end end as cst, --case when parcontricms='S' then gtcfopcod else gtncontribcfopcod end as cfopcod, --se utilizar CFOP de OPNF case when opnftopnfcod = 'CF' then gtecfcfopcod else case when opnfcfop = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)= coalesce(tribbenefufdest, tribproufdest, tribufdest) then opnfcfopcode when opnfcfop = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)<> coalesce(tribbenefufdest, tribproufdest, tribufdest) and parcontricms = 'S' then opnfcfopcodi when opnfcfop = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)<> coalesce(tribbenefufdest, tribproufdest, tribufdest) and parcontricms <> 'S' then opnfcfopcodincontricms else case when parcontricms <> 'N' then gtcfopcod else gtncontribcfopcod end end end as cfopcod, case when parcontricms <> 'N' then gtmodalidbcicms else gtncontribmodalidbcicms end as modbcicms, case when parcontricms <> 'N' then gtisento else gtisento end as isento, case when coalesce(opnfipi, '')= 'S' then opnfcstipi else estcstipicod end as cstipi, case when coalesce(opnfipi, '')= 'S' then opnfaliqipi else estaliqipi end as percipi, --FCP case when coalesce(gtfcpaliqicms, 0) > 0 then gtfcpaliqicms else 0 end as fcpaliqicms, case when coalesce(gtfcpaliqicms, 0) > 0 then ((pvivltotal * gtfcpaliqicms)/ 100) else 0 end as fcpvlqicms, --FCP ST case when coalesce(gtfcpaliqicmsst, 0) > 0 then gtfcpaliqicmsst else 0 end as fcpaliqicmsst, case when coalesce(gtfcpaliqicmsst, 0) > 0 then ((pvivltotal * gtfcpaliqicmsst)/ 100) else 0 end as fcpvlqicmsst, --ST case when parcontricms <> 'N' then coalesce(estvlpautast, 0) else cast(0 as numeric) end as pautaret, case when parcontricms <> 'N' then coalesce(gtstaliqicms, 0) else cast(0 as numeric) end as aliqicmsret, case when parcontricms <> 'N' then coalesce(gtstpercredbc, 0) else cast(0 as numeric) end as percrbcicmsret, case when parcontricms <> 'N' then coalesce(gtstiva, 0) else cast(0 as numeric) end as aliqiva, case when parcontricms <> 'N' then coalesce(gtstmodalidbcicms, 0) else cast(0 as integer) end as modbcicmsret, gtmensagem, gtlegenda, gtpercdescisencaocond, -- NÃO CONTRIBUINTE case when parcontricms <> 'N' then gtcsosncod else gtncontribcsosncod end as gtcsosncod, case when parcontricms <> 'N' then gtperccredicmssn else gtncontribperccredicmssn end as gtpCredSN, --calculado round((pviqtdeatecar * pvivlven)*(case when parcontricms <> 'N' then gtperccredicmssn else gtncontribperccredicmssn end)/ 100, 2) as vCredICMSSN, (select fpeforparcod from fpe where fpeprocod = pviprocod and pvipvempparcod = fpeempparcod and fpetipo = 'P' limit 1) as fpeforparcod, plpgdes, plpgcondicao, (select count(*) from( select regexp_split_to_table(plpgcondicao, ';')) p) as num_parc, estcustocompra * pviuvemult * pviqtdeatecar as estcustocompra, estcustoreal * pviuvemult * pviqtdeatecar as estcustoreal, pvtipofrete, row_number() over (order by pviseq) as pviseq, (select count(distinct pvplpgpvcod) from pvplpg where pvplpgpvcod = pvcod) as qtparcplpgnegoc, pvvol, (pviqtdeatecar * uvepesobruto) as pvpesobruto, (pviqtdeatecar * uvepesoliq) as pvpesoliq, pvdtentrega, pvvlfrete, pvivlfrete, --Se é consumidor final e orig<>dest case when (parconsfinal = 'S' and gtaliqicms > 0 and (select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) <> (select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod))) then tribdifalpercfcp else 0 end as tribdifalpercfcp, case when (parconsfinal = 'S' and gtaliqicms > 0 and (select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) <> (select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod))) then tribdifalpercicms else 0 end as tribdifalpercicms, case when (parconsfinal = 'S' and gtaliqicms > 0 and (select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) <> (select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod))) then tribdifalpercpart else 0 end as tribdifalpercpart, ----------------------- --Modelo do Doc (01, 55 ,65) (select laymodelo from opnf join eol on eolopnfcod = opnfcod and eolempparcod = pvempparcod join lay on eollaycod = laycod where opnfcod = pvopnfcod) as modelo, pviinfadprod, pvipedcli, opnfusaentregafutura, opnfusaipinoicms, pvmetrocubico, pvimetrocubico, coalesce(cli_perc_fin, 0) as cli_perc_fin, coalesce(cli_tipo_perc_fin, 'P') as cli_tipo_perc_fin, ben_cbenef, opnf_nao_mov_est, coalesce(benefcod, 0) as benefcod, gtbenefredaliqsaida, pvrefnfcod from( select pvipvempparcod, pvipvcod, protipo as tipoproduto, case when protipo = 'KT' then prompprocod else 0 end as kitprocod, case when protipo = 'KT' then prompmpcod else pviprocod end as pviprocod, case when protipo = 'KT' then (select uvecod from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1) else pviuvecod end as pviuvecod, case when protipo = 'KT' then (select uvedes from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1) else pviuvedes end as pviuvedes, case when protipo = 'KT' then (select uveun from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1) else pviuveun end as pviuveun, case when protipo = 'KT' then (select uvemult from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1) else pviuvemult end as pviuvemult, case when protipo = 'KT' then cast(pviqtde * prompmpqtde as numeric(14, 4)) else pviqtde end as pviqtde, case when protipo = 'KT' then cast(pviqtde * prompmpqtde as numeric(14, 4)) else pviqtdeate end as pviqtdeate, case when protipo = 'KT' then cast(pviqtde * prompmpqtde as numeric(14, 4)) else pviqtdeatecar end as pviqtdeatecar, --Se Produto KIT round(case when protipo = 'KT' then (select fprvlven from f_preco(f_livro_do_cliente(pvcliparcod, pvempparcod), null, null, pvplpgcod, null, cast(prompmpcod as text)) where fprprocod = prompmpcod and fprembcod =(select uvecod from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1))else pvivltab end, 2) as pvivltab, --Se Produto KIT round(case when protipo = 'KT' then(select fprvlven from f_preco(f_livro_do_cliente(pvcliparcod, pvempparcod), null, null, pvplpgcod, null, cast(prompmpcod as text)) where fprprocod = prompmpcod and fprembcod =(select uvecod from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1))*(1-(round((pvivltab-pvivlven)/ pvivltab * 100, 2)/ 100)) else pvivlven end, 4) as pvivlven, --Se Produto KIT round(case when protipo = 'KT' then round((select fprvlven from f_preco(f_livro_do_cliente(pvcliparcod, pvempparcod), null, null, pvplpgcod, null, cast(prompmpcod as text)) where fprprocod = prompmpcod and fprembcod =(select uvecod from uve where uveprocod = prompmpcod and uvetipo = 'P' limit 1))*(1-(round((pvivltab-pvivlven)/ pvivltab * 100, 2)/ 100)), 2)*(prompmpqtde * pviqtdeatecar)::numeric else pvivltotal end, 2) as pvivltotal, pviseq, pvibasedebcred, pvivlfrete, pviinfadprod, coalesce (pvipedcli, 0) as pvipedcli, pvimetrocubico from pv join pvi on pvcod = pvipvcod join pro on pviprocod = procod join uve on procod = uveprocod and pviuvecod = uvecod left join promp on pviprocod = prompprocod and protipo = 'KT' ) as i ----------------------- join pv on pvipvcod = pvcod join cli on pvcliparcod = cliparcod join par on cliparcod = parcod join loc on cliloccod = loccod join opnf on pvopnfcod = opnfcod join plpg on pvplpgcod = plpgcod --join pvi on pvcod=pvipvcod and pvempparcod=pvipvempparcod join pro on pviprocod = procod join est on pviprocod = estprocod and pvipvempparcod = estempparcod join uve on uveprocod = pviprocod and uvecod = pviuvecod join emp on pvipvempparcod = empparcod join regtrib on empregtribcod = regtribcod left join benef on empbenefcod = benefcod --trib por benef left join tribbenef on regtribcod = tribbenefregtribcod and tribbenefuforig =(select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) and tribbenefufdest =(select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod)) and tribbenefbenefcod = clibenefcod and tribbenefprocod = procod --trib por produto left join tribpro on regtribcod = tribproregtribcod and tribprouforig =(select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) and tribproufdest =(select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod)) and tribproprocod = procod --trib por ncm left join trib on regtribcod = tribregtribcod and tribuforig =(select munufsigla from par join mun on parmuncod = muncod where parcod = pvempparcod) and tribufdest =(select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod)) and tribncm = proncm -- se utilizar GT de OPNF --left join gt on tribgtcod=gtcod --da prioridade para gt por opnf, depois por trib produto e por fim trib ncm left join gt on gtcod = case when opnfgt = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)= coalesce(tribbenefufdest, tribproufdest, tribufdest) then opnfgtcode when opnfgt = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)<> coalesce(tribbenefufdest, tribproufdest, tribufdest) then opnfgtcodi else coalesce(tribbenefgtcod, tribprogtcod, tribgtcod) end left join beneficios on ben_id = gt_ben_id --verificar PIS/COFINS left join cstpiscofins on regtribcod = cstpiscofins_regtribcod and estcstpiscofinscod = cstpiscofins_cod --REGRA DIFAL left join tribdifal on tribdifaluf =(select lpuf from lp where lpcod = f_livro_do_cliente(pvcliparcod, pvempparcod)) --where pviqtdeatecar>0 and pvipvempparcod=1 and pvipvcod=46984 where pviqtdeatecar>0 and pvipvempparcod = p_empresa and pvipvcod = p_pedido loop if not v_inseriuCab then --Verifica se cab nf já foi inserido --************************************************************* --INSERIR CAB NF --************************************************************* --OBTER OBS NF select trim(confobsnf) into v_confobsnf from conf where confempparcod = p_empresa; select coalesce(conf_usa_desconta_st_do_preco,'N') into v_DescontaStdoPreco from conf where confempparcod = p_empresa; select case when conffatdsaid = 'S' then coalesce(p_horariosaida, now()) else now() end into v_datahorasaida from conf where confempparcod = p_empresa; execute coalesce(v_confobsnf, 'select null') into v_obsnf using p_pedido; select nextval('nf_nfcod_seq') into v_nfcod; --OBTER PROX CODIGO/SEQ DE NF - CAMPO CHAVE --INSERT NF insert into nf (nfcadusuparcod, nfcadhorario, nfaltusuparcod, nfalthorario, nfcod, nfempparcod, nfparcod, nfnum, nfserie, nfsta, nfdtemi, nfdtsai, nfhrsai, nfopnfcod, nfespecie, nftipoemissao, nfmodelo, nfvl, nfvlpro, nftipofrete, nfpesobruto, nfpesoliq, nfvol, nfnumvol, nfobs, nfpvcod, nfplpgcod, nftccod, nfrcaparcod, nfsupparcod, nfrcaauxparcod, nfcarcod, nfcarcodorig, nfordcar, nftranspcod, nfveicod, nfmotparcod, nfconhecfretecod, nfpccod, nfdevolnum, nfdevolserie, nfmotivdevolnfcod, nfmetrocubico, nfrefnfcod ) values ( p_usuario,--nfcadusuparcod v_agora,--nfcadhorario null,--nfaltusuparcod null,--nfalthorario v_nfcod,--nfcod rec_pv.pvempparcod, rec_pv.pvcliparcod, v_nfcod,--update - Recebe v_nfcod/seq provisoriamente ate gravar nfi, cpr e cprpg '0',-- update - Recebe 0 provisoriamente ate gravar nfi, cpr e cprpg 'FT',--nfsta cast(p_dtemissao as date),--nfdtemi cast(v_datahorasaida as date),--nfdtsai cast(v_datahorasaida as time),--nfhrsai rec_pv.pvopnfcod, rec_pv.opnfesp,--nfopnfesp character(4) rec_pv.opnftipoemissaonf,--nftipoemissao rec_pv.modelo,--nfmodelo 0,--nfvl update - Recebe 0 provisoriamente ate gravar nfi 0,--nfvlpro update - Recebe 0 provisoriamente ate gravar nfi rec_pv.pvtipofrete,--nftipofrete coalesce(rec_pv.pvpesobruto, 0),--nfpesobruto update - Recebe 0 provisoriamente ate gravar nfi coalesce(rec_pv.pvpesoliq, 0),--nfpesoliq update - Recebe 0 provisoriamente ate gravar nfi coalesce(rec_pv.pvvol, 0),--nfvol 0,--nfnumvol update - Recebe 0 provisoriamente ate gravar nfi v_obsnf,--nfobs rec_pv.pvcod,--nfpvcod rec_pv.pvplpgcod,--nfplpgcod rec_pv.pvtccod, rec_pv.pvrcaparcod,--nfrcaparcod rec_pv.pvsupparcod,--nfsupparcod rec_pv.pvrcaauxparcod,--nfrcaauxparcod rec_pv.pvcarcod,--nfcarcod null,--nfcarcodorig null,--nfordcar rec_pv.transpcod,--nftranspcod p_veiculo,--nfveicod p_motorista,--nfmotparcod null,--nfconhecfretecod null,--nfpccod null,--nfdevolnum null,--nfdevolserie null,--nfmotivdevolnfcod rec_pv.pvmetrocubico,--nfmetrocubico rec_pv.pvrefnfcod ); --INSERIR REGISTRO EM NFE insert into nfe(nfecadusuparcod, nfecadhorario, nfealtusuparcod, nfealthorario, nfenfempparcod, nfenfparcod, nfenfnum, nfenfserie, nfenfcod ) values ( p_usuario,--nfecadusuparcod integer, v_agora,--nfecadhorario timestamp without time zone, null,--nfealtusuparcod integer, null,--nfealthorario timestamp without time zone, rec_pv.pvempparcod,--nfenfempparcod integer NOT NULL, rec_pv.pvcliparcod,--nfenfparcod integer NOT NULL, v_nfcod,--nfenfnum integer NOT NULL, update - Recebe v_nfcod/seq provisoriamente ate gravar nfi, cpr e cprpg '0',--nfenfserie character varying(4) NOT NULL, update - Recebe 0 provisoriamente ate gravar nfi, cpr e cprpg v_nfcod--nfenfcod integer NOT NULL, ); --INSERIR REGISTRO EM NFECF insert into nfecf (nfecfcadusuparcod, nfecfcadhorario, nfecfaltusuparcod, nfecfalthorario, nfecfnfempparcod, nfecfnfparcod, nfecfnfnum, nfecfnfserie, nfecfnfcod ) values ( p_usuario,--nfecfcadusuparcod integer, v_agora,--nfecfcadhorario timestamp without time zone, null,--nfecfaltusuparcod integer, null,--nfecfalthorario timestamp without time zone, rec_pv.pvempparcod,--nfecfnfempparcod integer NOT NULL, rec_pv.pvcliparcod,--nfecfnfparcod integer NOT NULL, v_nfcod,--nfecfnfnum integer NOT NULL, update - Recebe v_nfcod/seq provisoriamente ate gravar nfi, cpr e cprpg '0',--nfecfnfserie character varying(4) NOT NULL, update - Recebe 0 provisoriamente ate gravar nfi, cpr e cprpg v_nfcod--nfecfnfcod integer NOT NULL, ); v_inseriuCab := true; end if; --IF NOT inseriuCab THEN --************************************************************* --INSERIR ITEM - NFI --************************************************************* --ICMS NORMAL v_visento := 0; v_vbasecalc := 0; v_vicms := 0; v_voutros := 0; v_vipi := 0; v_vbasecalc_efet := 0; v_vicms_efet := 0; v_vpro := 0; v_vproFinal := 0; v_vpro := rec_pv.pvivltotal; v_vproFinal := rec_pv.pvivltotal; if rec_pv.isento = 'S' then v_visento := v_vpro; else --Obter base de calculo if rec_pv.pauta > 0 then v_vbasecalc := rec_pv.pviqtdeatecar * rec_pv.pauta; else if rec_pv.percrbcicms > 0 then v_vbasecalc := (v_vpro - round(v_vpro * rec_pv.percrbcicms / 100, 2)); else --Compor base de calculo se aliq icms > 0 if rec_pv.aliqicms > 0 then v_vbasecalc := v_vpro; else v_vbasecalc := 0; end if; end if; end if; -- VBaseCalc recebe despesa de boleto no primeiro item caso configurado no cliente v_vbasecalc := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(rec_pv.despbol, 0) else 0 end; v_vicms := round(v_vbasecalc * coalesce(rec_pv.aliqicms, 0)/ 100, 2); v_voutros := rec_pv.pvivltotal-v_vbasecalc; v_vbasecalc_efet := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(rec_pv.despbol, 0) else 0 end; if coalesce(rec_pv.gtbenefredaliqsaida, 0)>0 then v_vicms_efet := round(v_vicms-(v_vicms * rec_pv.gtbenefredaliqsaida / 100), 2); else v_vicms_efet := round(v_vbasecalc * coalesce(rec_pv.aliqicmsefet, 0)/ 100, 2); end if; end if; --SUBSTITUICAO v_vbasecalcST := 0; v_vlicmsST := 0; v_vbcfcp := 0; v_vbcfcpST := 0; v_vlfcpST := 0; v_vlfcp := 0; if rec_pv.opnfsta in ('GC', 'C') then v_vipi := round(rec_pv.pvivltotal * coalesce(rec_pv.percipi, 0)/ 100, 2); if rec_pv.aliqicmsret > 0 then if v_DescontaStdoPreco = 'N' then if rec_pv.pautaret > 0 then v_vbasecalcST := rec_pv.pviqtdeatecar * rec_pv.pautaret; else if rec_pv.percrbcicmsret > 0 then --v_vbasecalcST := round((rec_pv.pvivltotal+v_vipi+frete)*rec_pv.percrbcicmsret/100,4); v_vbasecalcST := (v_vpro - round((v_vpro + v_vipi)* rec_pv.percrbcicmsret / 100, 2)); else --v_vbasecalcST := rec_pv.pvivltotal+v_vipi+frete; v_vbasecalcST := v_vpro + v_vipi; end if; end if; v_vbasecalcST := round((v_vbasecalcST + (case when v_vbasecalcST>0 then coalesce(rec_pv.despbol, 0) else 0 end))*(1 +(coalesce(rec_pv.aliqiva, 0)/ 100)), 2); v_vlicmsST := round((v_vbasecalcST * rec_pv.aliqicmsret / 100)-coalesce(v_vicms, 0), 2); else --v_DescontaStdoPreco = 'S' if rec_pv.pautaret > 0 then v_vbasecalcST := rec_pv.pviqtdeatecar * rec_pv.pautaret; else if rec_pv.percrbcicmsret > 0 then v_vbasecalcST := (v_vpro - round((v_vpro + v_vipi)* rec_pv.percrbcicmsret / 100, 6)); else --= (R$1.050,00 * 100%) / 114,42% = R$ 917,67 -- select round(((1 + (66.65+0) / 100) * 20) - 20,4) -- select 100+9 -- select round(((15.65 * 100)) / 113.33 ,6) v_indice_st := round(((1 + (coalesce(rec_pv.aliqiva, 0)+coalesce(rec_pv.fcpaliqicmsst, 0)) / 100) * rec_pv.aliqicmsret) - rec_pv.aliqicms,6); v_indice_st := 100+v_indice_st; v_vpro := round((v_vpro * 100) / v_indice_st,6); --NECESSARIO RECALCULAR O ICMS if rec_pv.pauta > 0 then v_vbasecalc := rec_pv.pviqtdeatecar * rec_pv.pauta; else if rec_pv.percrbcicms > 0 then v_vbasecalc := (v_vpro - round(v_vpro * rec_pv.percrbcicms / 100, 2)); else --Compor base de calculo se aliq icms > 0 if rec_pv.aliqicms > 0 then v_vbasecalc := v_vpro; else v_vbasecalc := 0; end if; end if; end if; v_vbasecalc := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(v_vipi, 0) else 0 end; v_vicms := round(v_vbasecalc * coalesce(rec_pv.aliqicms, 0)/ 100, 2); v_voutros := case when rec_pv.pvivltotal-v_vbasecalc < 0 then 0 else rec_pv.pvivltotal-v_vbasecalc end; v_vbasecalc_efet := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(v_vipi, 0) else 0 end; v_vicms_efet := round(v_vbasecalc * coalesce(rec_pv.aliqicmsefet, 0)/ 100, 2); v_vbasecalcST := v_vpro + v_vipi; v_vbasecalcST := round((v_vbasecalcST + (case when v_vbasecalcST>0 then coalesce(rec_pv.despbol, 0) else 0 end))*(1 +(coalesce(rec_pv.aliqiva, 0)/ 100)), 6); v_vlicmsST := round((v_vbasecalcST * rec_pv.aliqicmsret / 100)-coalesce(v_vicms, 0), 6); end if; end if; end if; end if; if rec_pv.fcpaliqicms > 0 then v_vbcfcp := v_vbasecalc;--rec_pv.pvivltotal; v_vlfcp := round((v_vbcfcp * rec_pv.fcpaliqicms / 100), 2); end if; if rec_pv.fcpaliqicmsst > 0 then v_vbcfcpST := v_vbasecalcST; v_vlfcpST := round((v_vbcfcpST * rec_pv.fcpaliqicmsst / 100), 6); v_vlfcpST := round(v_vlfcpST-coalesce(v_vlfcp, 0), 6); end if; --corrige o valor final baseado na forma de calculo if v_DescontaStdoPreco = 'N' then v_vproFinal := v_vpro; else --v_DescontaStdoPreco = 'S' v_vproFinal := v_vproFinal - v_vlicmsST - v_vlfcpST; v_vbasecalc := coalesce(v_vproFinal, 0) + case when v_vproFinal>0 then coalesce(rec_pv.despbol, 0) else 0 end; v_vicms := round(v_vbasecalc * coalesce(rec_pv.aliqicms, 0)/ 100, 2); v_voutros := rec_pv.pvivltotal-v_vbasecalc; v_vbasecalc_efet := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(rec_pv.despbol, 0) else 0 end; end if; end if; --IPI/ST - QD PEDIDO POSSUI INDICE (TENDO COMO BASE O BLOCO ANTERIOR) if rec_pv.opnfsta in ('G') and rec_pv.pvindice > 0 then v_vipi := round(v_vpro * coalesce(rec_pv.percipi, 0)/ 100, 2); -- Linha específica para esse bloco v_vipi := round(v_vipi *(rec_pv.pvindice / 100.0), 2); if rec_pv.aliqicmsret > 0 then if rec_pv.pautaret > 0 then v_vbasecalcST := rec_pv.pviqtdeatecar * rec_pv.pautaret; else if rec_pv.percrbcicmsret > 0 then --v_vbasecalcST := round((rec_pv.pvivltotal+v_vipi+frete)*rec_pv.percrbcicmsret/100,4); v_vbasecalcST := round((v_vpro + v_vipi)* rec_pv.percrbcicmsret / 100, 4); else --v_vbasecalcST := rec_pv.pvivltotal+v_vipi+frete; v_vbasecalcST := v_vpro + v_vipi; end if; end if; v_vbasecalcST := round(v_vbasecalcST *(1 +(coalesce(rec_pv.aliqiva, 0)/ 100)), 6); v_vlicmsST := round((v_vbasecalcST * rec_pv.aliqicmsret / 100)-coalesce(v_vicms, 0), 6); -- Linhas específicas para esse bloco v_vbasecalcST := round((v_vbasecalcST + (case when v_vbasecalcST>0 then coalesce(rec_pv.despbol, 0) else 0 end))*(rec_pv.pvindice / 100.0), 6); v_vlicmsST := round(v_vlicmsST *(rec_pv.pvindice / 100.0), 6); end if; if rec_pv.opnfusaipinoicms = 'S' then v_vbasecalc := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(v_vipi, 0) else 0 end; v_vicms := round(v_vbasecalc * coalesce(rec_pv.aliqicms, 0)/ 100, 2); v_voutros := case when v_vpro-v_vbasecalc < 0 then 0 else rec_pv.pvivltotal - v_vbasecalc end; v_vbasecalc_efet := coalesce(v_vbasecalc, 0) + case when v_vbasecalc>0 then coalesce(v_vipi, 0) else 0 end; v_vicms_efet := round(v_vbasecalc * coalesce(rec_pv.aliqicmsefet, 0)/ 100, 2); end if; end if; insert into nfi (nficadusuparcod, nficadhorario, nfialtusuparcod, nfialthorario, nfinfempparcod, nfinfparcod, nfinfnum, nfinfserie, nfinfcod, nfiprocod, nfiuvecod, nfiuvedes, nfiuveun, nfiuvemult, nfiqtde, nfivltabunit, nfivlunit, nfivl, nficfopcod, nficstcod, nficsosncod, nfialiqcredsn, nfivlcredicmssn, nfibcicms, nfipercredbcicms, nfialiqicms, nfialiqicmsefet, nfivlicms, nfibcicmsst, nfipercredbcicmsst, nfialiqicmsst, nfivlicmsst, nfibcipi, nficstipicod, nfialiqipi, nfivlipi, nficstpiscofinscod, nfialiqpis, nfivlpautapis, nfivlpis, nfialiqcofins, nfivlpautacofins, nfivlcofins, nfivlfrete, nfivlseguro, nfivldesc, nfivloutrasdesp, nfivlisento, nfivloutros, nfivldesprat, nfivldespnrat, nficustocompra, nficustoreal, nfivlvensug, nfiforparcod, nfibcpis, nfibccofins, nfibcqtpis, nfibcqtcofins, nfipuvecod, nfipuvedes, nfipuveun, nfipuvemult, nfipqtde, nfipvltabunit, nfipvlunit, nfiuvenf, nfiseq, nfibasedebcred, nfiqtdefalta, nfiqtdecorte, --difal nfidifalbcfcpdest, nfidifalpercfcpdest, nfidifalpercicmsdest, nfidifalpercpartdest, nfidifalvlfcpdest, nfidifalvlicmsdest, nfidifalvlicms, nfiinfadprod, --FCP nfibcfcp, nfifcpaliqicms, nfifcpvlqicms, nfibcfcpst, nfifcpaliqicmsst, nfifcpvlqicmsst, nfialiqiva, nfibcicmsefet, nfivlicmsefet, nfipedcli, nfimetrocubico, nficbenef ) values ( p_usuario,--nficadusuparcod v_agora,--nficadhorario, null,--nfialtusuparcod, null,--nfialthorario, rec_pv.pvempparcod,--nfinfempparcod, rec_pv.pvcliparcod,--nfinfparcod, v_nfcod,--nfinfnum, Receber v_nfcod/seq provisoriamente ate gravar nfi, cpr e cprpg '0',--nfinfserie, Receber v_nfcod/seq provisoriamente ate gravar nfi, cpr e cprpg v_nfcod,--nfinfcod, rec_pv.pviprocod,--nfiprocod, rec_pv.pviuvecod,--nfiuvecod, rec_pv.pviuvedes,--nfiuvedes, rec_pv.pviuveun,--nfiuveun, rec_pv.pviuvemult,--nfiuvemult, rec_pv.pviqtdeatecar,--nfiqtde, rec_pv.pvivltab,--nfivltabunit, v_vproFinal/rec_pv.pviqtdeatecar,-- rec_pv.pvivlven,--nfivlunit v_vproFinal,--rec_pv.pvivltotal,--nfivl, rec_pv.cfopcod,--nficfopcod, rec_pv.cst,--nficstcod, rec_pv.gtcsosncod,--nficsosncod, rec_pv.gtpCredSN,--nfialiqcredsn, rec_pv.vCredICMSSN,--nfivlcredicmssn, v_vbasecalc,--nfibcicms, rec_pv.percrbcicms,--nfipercredbcicms, rec_pv.aliqicms,--nfialiqicms, rec_pv.aliqicmsefet,--nfialiqicmsefet v_vicms,--nfivlicms, v_vbasecalcST,--nfibcicmsst, rec_pv.percrbcicmsret,--nfipercredbcicmsst, coalesce(rec_pv.aliqicmsret, 0),--(coalesce(rec_pv.aliqicmsret,0)+coalesce(rec_pv.fcpaliqicmsst,0)),--nfialiqicmsst, v_vlicmsST,--nfivlicmsst, rec_pv.pvivltotal,--nfibcipi rec_pv.cstipi,--nficstipicod, rec_pv.percipi,--nfialiqipi, v_vipi,--nfivlipi, rec_pv.piscst,--nficstpiscofinscod, rec_pv.pisaliq,--nfialiqpis, rec_pv.pisvlpauta,--nfivlpautapis, round(rec_pv.bcpis * rec_pv.pisaliq / 100, 2),--nfivlpis, rec_pv.cofinsaliq,--nfialiqcofins, null,--nfivlpautacofins, round(rec_pv.bccofins * rec_pv.cofinsaliq / 100, 2),--nfivlcofins, rec_pv.pvivlfrete,--nfivlfrete, null,--nfivlseguro, 0,--rec_pv.vldesc,--nfivldesc, rec_pv.despbol,--nfivloutrasdesp, v_visento,--nfivlisento, v_voutros,--nfivloutros, null,--nfivldesprat, null,--nfivldespnrat, rec_pv.estcustocompra,--nficustocompra, rec_pv.estcustoreal,--nficustoreal, null,--nfivlvensug, rec_pv.fpeforparcod,--nfiforparcod, rec_pv.bcpis,--nfibcpis numeric(14,4), rec_pv.bccofins,--nfibccofins numeric(14,4), rec_pv.bcqtpis,--nfibcqtpis numeric(14,4), rec_pv.bcqtcofins,--nfibcqtcofins numeric(14,4), rec_pv.puvecod,--nfipuvecod integer, rec_pv.puvedes,--nfipuvedes character varying(60), rec_pv.puveun,--nfipuveun character varying(10), rec_pv.puvemult,--nfipuvemult numeric(14,4), rec_pv.pqtde,--nfipqtde numeric(14,4) DEFAULT 0, rec_pv.pvltabunit,--nfipvltabunit numeric(14,4) DEFAULT 0, rec_pv.pvlven,--nfipvlunit numeric(14,4) DEFAULT 0, rec_pv.uvenf,--nfiuvenf char(1) DEFAULT 'V' rec_pv.pviseq,--nfiseq rec_pv.pvibasedebcred,--pvibasedebcred rec_pv.qtdefalta,--nfiqtdefalta rec_pv.qtdecorte,--nfiqtdecorte case when rec_pv.tribdifalpercicms>0 then v_vbasecalc else 0 end,--nfidifalbcfcpdest, rec_pv.tribdifalpercfcp,--nfidifalpercfcpdest, rec_pv.tribdifalpercicms,--nfidifalpercicmsdest, rec_pv.tribdifalpercpart,--nfidifalpercpartdest, round(rec_pv.tribdifalpercfcp * v_vbasecalc / 100, 2),-- nfidifalvlfcpdest, --Formula = round(((pICMSUFDest-pICMSInter)*vBCUFDest/100)*pICMSInterPart/100,2) case when rec_pv.tribdifalpercicms>0 then round(((rec_pv.tribdifalpercicms)* v_vbasecalc / 100)* rec_pv.tribdifalpercpart / 100, 2) else 0 end,--nfidifalvlicmsdest, --Formula = round(((pICMSUFDest-pICMSInter)*vBCUFDest/100)*([100]-pICMSInterPart)/100,2) [100]=>menos 100 pois se tribdifalpart=40% então origem paga o resto case when rec_pv.tribdifalpercicms>0 then round(((rec_pv.tribdifalpercicms)* v_vbasecalc / 100)*(100-rec_pv.tribdifalpercpart)/ 100, 2) else 0 end,--nfidifalvlicms rec_pv.pviinfadprod, v_vbcfcp,--nfibcfcp rec_pv.fcpaliqicms, v_vlfcp, v_vbcfcpST,--nfibcfcpst rec_pv.fcpaliqicmsst, v_vlfcpST,--nfifcpvlqicmsst, rec_pv.aliqiva, v_vbasecalc_efet,--nfibcicmsefet, v_vicms_efet,--nfivlicmsefet rec_pv.pvipedcli,--nfipedcli rec_pv.pvimetrocubico, rec_pv.ben_cbenef--nficbenef ); end loop; --************************************************************* --UPDATE PESO --************************************************************* update nf set nfpesobruto = t.t_pesobruto, nfpesoliq = t.t_pesoliq from( select case when coalesce(sum(uvepesobruto), 0) > 0 then sum((pviqtdeatecar * uvepesobruto)) else 0 end as t_pesobruto, case when coalesce(sum(uvepesoliq), 0) > 0 then sum((pviqtdeatecar * uvepesoliq)) else 0 end as t_pesoliq from pvi join uve on pviprocod = uveprocod and pviuvecod = uvecod where pviqtdeatecar>0 and pvipvempparcod = p_empresa and pvipvcod = p_pedido ) as t where nfcod = v_nfcod; --************************************************************* --UPDATE NF PARA DISPONIBILIZAR VL TOTAL PARA GERAR CPR --************************************************************* update nf set nfvl = i.nfvl,--nfvl numeric(14,4) DEFAULT 0, nfvlpro = i.nfvlpro,--nfvlpro numeric(14,4) DEFAULT 0, nfbcicms = i.nfbcicms,--nfbcicms numeric(14,4) DEFAULT 0, nfvlicms = i.nfvlicms,--nfvlicms numeric(14,4) DEFAULT 0, nfbcicmsst = i.nfbcicmsst,--nfbcicmsst numeric(14,4) DEFAULT 0, nfvlicmsst = i.nfvlicmsst,--nfvlicmsst numeric(14,4) DEFAULT 0, nfvlfrete = i.nfvlfrete,--nfvlfrete numeric(14,4) DEFAULT 0, nfvlseguro = i.nfvlseguro,--nfvlseguro numeric(14,4) DEFAULT 0, nfvldesc = 0,--nfvldesc=i.nfvldesc,--nfvldesc numeric(14,4) DEFAULT 0, nfvloutrasdesp = i.nfvloutrasdesp,--nfvloutrasdesp numeric(14,4) DEFAULT 0, nfvlipi = i.nfvlipi,--nfvlipi numeric(14,4) DEFAULT 0, nfvlisento = i.nfvlisento,--nfvlisento numeric(14,4) DEFAULT 0, nfvloutros = i.nfvloutros,--nfvloutros numeric(14,4) DEFAULT 0, nfnumvol = i.nfnumvol--nfnumvol numeric(14,4), from( select nfinfcod, count(nfiprocod) as qtitens, sum(coalesce(nfivl, 0))+ sum(coalesce(nfivlipi, 0))+ sum(coalesce(nfivlfrete, 0))+ sum(coalesce(nfivlseguro, 0))+ sum(coalesce(nfivloutrasdesp, 0))+ sum(coalesce(nfivlicmsst, 0))+ sum(coalesce(nfifcpvlqicmsst, 0)) --sum(coalesce(nfivldesc,0)) desconto ja vem do item as nfvl, sum(coalesce(nfibcicms, 0)) as nfbcicms, sum(coalesce(nfivlicms, 0)) as nfvlicms, sum(coalesce(nfibcicmsst, 0)) as nfbcicmsst, sum(coalesce(nfivlicmsst, 0)) as nfvlicmsst, sum(coalesce(nfivl, 0)) as nfvlpro, sum(coalesce(nfivlfrete, 0)) as nfvlfrete, sum(coalesce(nfivlseguro, 0)) as nfvlseguro, sum(coalesce(nfivloutrasdesp, 0)) as nfvloutrasdesp, sum(coalesce(nfivlipi, 0)) as nfvlipi, sum(coalesce(nfivlisento, 0)) as nfvlisento, sum(coalesce(nfivloutros, 0)) as nfvloutros, sum(coalesce(nfivldesc, 0)) as nfvldesc, sum(coalesce(nfiqtde, 0)) as nfnumvol --difal (gravando só nos itens) --nfdifalvlfcpdest, --nfdifalvlicmsdest, --nfdifalvlicms from nfi where nfinfcod = v_nfcod group by nfinfcod ) as i where nfcod = nfinfcod; --************************************************************* --verifica diferenca de despbol e joga no ultimo produto --************************************************************* /* if rec_pv.despbol > 0 then UPDATE nfi a SET nfivloutrasdesp = round(nfivloutrasdesp,2)+p.dif FROM ( select nfempparcod, nfcod, max(max(nfiseq)) over (partition by 1) as ultpro, nfvloutrasdesp-sum(round(coalesce(nfivloutrasdesp,0),2)) as dif from nf join nfi on nfinfcod = nfcod where nfcod=v_nfcod group by nfempparcod,nfcod,nfvloutrasdesp ) AS p WHERE nfinfcod=nfinfcod and nfinfempparcod=nfempparcod and nfiseq=ultpro; end if; */ --Se opnf gera conta if rec_pv.opnfcpr = 'S' then --************************************************************* --OBTER PROX CODIGO/SEQ DE CPR - CAMPO CHAVE --************************************************************* select nextval('seq_cpr' || rec_pv.pvempparcod::text) into v_cprcod; --select nfvl-(nfvl*rec_pv.cli_perc_fin/100) into v_vnf from nf where nfcod=v_nfcod; select nfvl into v_vnf from nf where nfcod = v_nfcod; select(nfvl * rec_pv.cli_perc_fin / 100) into v_vdesc from nf where nfcod = v_nfcod; select coalesce(conf_div_st_parcelas, 'N') into v_DivSt from conf where confempparcod = p_empresa; --INSERIR CAB insert into cpr(cprempparcod,-- integer NOT NULL, cprcod,-- integer NOT NULL, cprtipo,-- character(3), cprccpcgcccod,-- integer, cprccpcgpcgcod,-- integer, cprmodg,-- character(2), cprparcod,-- integer, cprdocnum,-- integer, cprdocserie,-- character varying(10), cprprev,-- character(1), cprdemi,-- timestamp with time zone, cprdlan,-- timestamp with time zone, cprvt,-- numeric(14,4) DEFAULT 0, cprvtpg,-- numeric(14,4) DEFAULT 0, cprfunparcod,-- integer, cprpcgcod,-- integer, cprnat,-- character(1), cprrcaparcod,-- integer, cprdevparcod,-- integer, cprobs,-- character varying(250), cpr_cart_codigo,-- integer, cpr_d_competencia,-- date, cpr_ccc_id,-- integer, cpr_conta_id,-- integer, cpr_cc_id,-- integer, cpr_notafiscal,-- character varying(20), cprnfcod-- integer, ) select nfempparcod,--cprempparcod integer NOT NULL, v_cprcod,--cprcod integer NOT NULL, 'CRC',--cprtipo character(3), null,--cprccpcgcccod integer, null,--cprccpcgpcgcod integer, 'FT',--cprmodg character(2), nfparcod,--cprparcod integer, null,--update cprdocnum integer, null,--update cprdocserie character varying(10), 'N',--cprprev character(1), nfdtemi,--cprdemi timestamp with time zone, v_agora,--cprdlan timestamp with time zone, v_vnf,--cprvt numeric(14,4) DEFAULT 0, 0,--cprvtpg numeric(14,4) DEFAULT 0, p_usuario,--cprfunparcod integer, null,--cprpcgcod integer, null,--cprnat character(1), nfrcaparcod,--cprrcaparcod integer, nfparcod,--cprdevparcod integer, 'Referente a saida de Mercadoria',--cprobs character varying(250), 1,--cpr_cart_codigo integer, DATE(v_agora),--cpr_d_competencia date, null,--cpr_ccc_id integer, rec_pv.opnf_conta_id,--cpr_conta_id integer, rec_pv.opnf_cc_id,--cpr_cc_id integer, null,--update cpr_notafiscal character varying(20), v_nfcod--cprnfcod integer; from nf where nfcod = v_nfcod; /* SE PEDIDO COM PLANO NEGOCIADO ENTAO GERAR CPRPG A PARTIR DO PVPLPG SENAO NFPLPGCOD */ ------------------------------------------------------------------------------ --confusadtentregaparagerarfin if coalesce(rec_pv.qtparcplpgnegoc, 0)>0 then --INSERIR CPRPG A PARTIR DE PVPLPG (PLANO NEGOCIADO) insert into cprpg (cprpgcprempparcod,-- integer NOT NULL, cprpgcprcod,-- integer NOT NULL, cprpgcod,-- integer NOT NULL, cprpgdvenc,-- date, cprpgv,-- numeric(14,4), cprpgtccod,-- integer, cprpgsta,-- character(1), cprpgfunparcod,-- integer, cprpgdvenco,-- date, cprpgtccodo,-- integer, cprpg_d_lanc,-- timestamp without time zone, cprpg_d_competencia,-- date, cprpgparc-- varchar(250) ) select cprempparcod,--cprpgcprempparcod integer NOT NULL, v_cprcod,--cprpgcprcod integer NOT NULL, pvplpgparc,--cprpgcod integer NOT NULL, case when coalesce(confusadtentregaparagerarfin, 'N')= 'S' and pvdtentrega is not null then pvplpgdtvenc +(DATE(pvdtentrega)-DATE(now())) else pvplpgdtvenc end as pvplpgdtvenc,--cprpgdvenc date, pvplpgv,--cprpgv numeric(14,4), pvplpgtccod,--cprpgtccod integer, 'A',--cprpgsta character(1), cprfunparcod,--cprpgfunparcod integer, pvplpgdtvenc,--cprpgdvenco date, pvplpgtccod,--cprpgtccodo integer, v_agora,--cprpg_d_lanc timestamp without time zone, cast(v_agora as date),--cprpg_d_competencia date, pvplpgparc--cprpgparc varchar(250) from pvplpg join pv on pvcod = pvplpgpvcod and pvcod = rec_pv.pvcod join cpr on cprempparcod = p_empresa and cprcod = v_cprcod join conf on pvempparcod = confempparcod; else --INSERIR CPRPG A PARTIR DE PLPG insert into cprpg (cprpgcprempparcod,-- integer NOT NULL, cprpgcprcod,-- integer NOT NULL, cprpgcod,-- integer NOT NULL, cprpgdvenc,-- date, cprpgv,-- numeric(14,4), --Gerar conta com vl total nf menos ST cprpgtccod,-- integer, cprpgsta,-- character(1), cprpgfunparcod,-- integer, cprpgdvenco,-- date, cprpgtccodo,-- integer, cprpg_d_lanc,-- timestamp without time zone, cprpg_d_competencia,-- date, cprpgparc,-- varchar(250) cprpgdescv ) select cprempparcod,--cprpgcprempparcod integer NOT NULL, v_cprcod,--cprpgcprcod integer NOT NULL, parc,--cprpgcod integer NOT NULL, case when coalesce(confusadtentregaparagerarfin, 'N')= 'S' and rec_pv.pvdtentrega is not null then (v_datahorasaida::date + prazo[parc]::integer)+(DATE(rec_pv.pvdtentrega)-DATE(now())) else v_datahorasaida::date + prazo[parc]::integer end, --cprpgdvenc date, --now()::date+prazo[parc]::integer,--cprpgdvenc date, --ST rateado igualmente em todas as parcelas (REGRA SUSPENSA) --trunc(cprvt/rec_pv.num_parc,2),--cprpgv numeric(14,4), --Com ST na Primeira Parcela case when (v_DivSt = 'S') then trunc(cprvt / rec_pv.num_parc, 2) else case when parc = 1--se primeira parcela, calcula o valor da parcela sem ST e em seguida soma o valor total ST then trunc(((cprvt-coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0))/ rec_pv.num_parc)+ coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0), 2)--cprpgv numeric(14,4), --Gerar conta com vl total nf menos ST else trunc((cprvt-coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0))/ rec_pv.num_parc, 2)--cprpgv numeric(14,4), --Gerar conta com vl total nf menos ST end end, rec_pv.pvtccod,--cprpgtccod integer, 'A',--cprpgsta character(1), cprfunparcod,--cprpgfunparcod integer, v_datahorasaida::date + prazo[parc]::integer,--cprpgdvenco date, --now()::date+prazo[parc]::integer,--cprpgdvenco date, rec_pv.pvtccod,--cprpgtccodo integer, v_agora,--cprpg_d_lanc timestamp without time zone, cast(v_agora as date),--cprpg_d_competencia date, parc,--cprpgparc varchar(250) case when (v_DivSt = 'S') then round((cprvt / rec_pv.num_parc)* rec_pv.cli_perc_fin / 100, 4) else case when (parc = 1 and rec_pv.cli_tipo_perc_fin = 'N') then round((((cprvt-coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0))/ rec_pv.num_parc)+ coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0))* rec_pv.cli_perc_fin / 100, 4) else round((((cprvt-coalesce(( select nfvlicmsst from nf where nfcod = cprnfcod), 0))/ rec_pv.num_parc))* rec_pv.cli_perc_fin / 100, 4) end end from(select regexp_split_to_array(rec_pv.plpgcondicao, ';') as prazo) p join generate_series(1, rec_pv.num_parc) parc on 1 = 1 join cpr on cprempparcod = p_empresa and cprcod = v_cprcod join conf on cprempparcod = confempparcod; end if;--verifica diferenca e joga na ultima parcela update cprpg a set cprpgv = round(cprpgv, 2)+ p.dif from(select cprempparcod, cprcod, cprvt-sum(round(coalesce(cprpgv, 0), 2)) as dif from cpr left join cprpg on cprcod = cprpgcprcod and cprpgcprempparcod = cprempparcod where cprcod = v_cprcod group by cprempparcod, cprcod, cprvt ) as p where cprpgcprcod = cprcod and cprpgcprempparcod = cprempparcod and cprpgcod = rec_pv.num_parc; --corrige o desconto update cprpg a set cprpgdescv = round(cprpgv * rec_pv.cli_perc_fin / 100, 2) from(select cprempparcod, cprcod from cpr left join cprpg on cprcod = cprpgcprcod and cprpgcprempparcod = cprempparcod where cprcod = v_cprcod group by cprempparcod, cprcod, cprvt ) as p where cprpgcprcod = cprcod and cprpgcprempparcod = cprempparcod; end if;--IF rec_pv.opnfcpr='S' THEN --************************************************************* --TRATAMENTO DO ESTOQUE --(No momento tratando pelo pvicb, se existe entao caracteriza pedido CB. --Tratar no futuro Tipo Pedido) select pvipvcod into v_pedido from pvicb where pvipvcod = p_pedido; if found then--SE PEDIDO CESTA for rec_pv_insert_estmv in select pvcliparcod, pvipvempparcod, pvipvcod, pviprocod, pviuvecod, pviuvedes, pviuveun, pviuvemult, pviqtde, pviqtdeate, pviqtdeatecar, opnfcod, opnfsta, opnfcpr, opnfesp, opnftopnfcod from pv join cli on pvcliparcod = cliparcod join loc on cliloccod = loccod join opnf on pvopnfcod = opnfcod join plpg on pvplpgcod = plpgcod join pvicb on pvcod = pvipvcod and pvempparcod = pvipvempparcod join pro on pviprocod = procod join est on pviprocod = estprocod and pvipvempparcod = estempparcod where pviqtdeatecar>0 and opnf_nao_mov_est = 'N' and pvipvempparcod = p_empresa and pvipvcod = p_pedido loop select f_insert_estmv(rec_pv_insert_estmv.pvipvempparcod, rec_pv_insert_estmv.pviprocod, rec_pv_insert_estmv.pviuvecod, rec_pv_insert_estmv.pviuvedes, rec_pv_insert_estmv.pviuveun, rec_pv_insert_estmv.pviuvemult, 'S', rec_pv_insert_estmv.opnfsta, rec_pv_insert_estmv.pviqtdeatecar, v_VERSAO,--'FUNCAO FATURAMENTO', v_VERSAO,--'FATURAMENTO PEDIDO CESTA BASICA', v_nfcod, p_usuario, --novos campos rec_pv_insert_estmv.pvcliparcod, rec_pv_insert_estmv.opnfcod, 'SAIDA MERCADORIA' ) into rec_insert_estmv; end loop; else for rec_pv_insert_estmv in--SE PEDIDO NAO CESTA select pvcliparcod, pvipvempparcod, pvipvcod, pviprocod, pviuvecod, pviuvedes, pviuveun, pviuvemult, pviqtde, pviqtdeate, pviqtdeatecar, opnfcod, opnfsta, opnfcpr, opnfesp, opnftopnfcod, fpeforparcod from pv join cli on pvcliparcod = cliparcod join loc on cliloccod = loccod join opnf on pvopnfcod = opnfcod join plpg on pvplpgcod = plpgcod join pvi on pvcod = pvipvcod and pvempparcod = pvipvempparcod join pro on pviprocod = procod join est on pviprocod = estprocod and pvipvempparcod = estempparcod join fpe on fpeprocod = procod and fpeempparcod = estempparcod and fpetipo = 'P' where pviqtdeatecar > 0 and opnf_nao_mov_est = 'N' and pvipvempparcod = p_empresa and pvipvcod = p_pedido loop if rec_pv.opnfusaentregafutura = 'N' then select f_insert_estmv(rec_pv_insert_estmv.pvipvempparcod, rec_pv_insert_estmv.pviprocod, rec_pv_insert_estmv.pviuvecod, rec_pv_insert_estmv.pviuvedes, rec_pv_insert_estmv.pviuveun, rec_pv_insert_estmv.pviuvemult, 'S', rec_pv_insert_estmv.opnfsta, rec_pv_insert_estmv.pviqtdeatecar, v_VERSAO,--'FUNCAO FATURAMENTO', v_VERSAO,--'FATURAMENTO PEDIDO DE VENDA', v_nfcod, p_usuario, --novos campos rec_pv_insert_estmv.fpeforparcod,--rec_pv_insert_estmv.pvcliparcod, alterado temporariamente para mostrar o fornecedor do produto rec_pv_insert_estmv.opnfcod, 'SAIDA MERCADORIA' ) into rec_insert_estmv; end if; /*************************************************************** * ALIMENTA CLIEST **************************************************************/ if rec_pv.opnfusaentregafutura = 'S' then select coalesce(estcliprocod, 0) into v_cliestprocod from estcli where estcliparcod = rec_pv_insert_estmv.pvcliparcod and estcliprocod = rec_pv_insert_estmv.pviprocod and estcliuvecod = rec_pv_insert_estmv.pviuvecod; if v_cliestprocod > 0 then update estcli set estcliest = coalesce(estcliest, 0)+ rec_pv_insert_estmv.pviqtdeatecar where estcliparcod = rec_pv_insert_estmv.pvcliparcod and estcliprocod = rec_pv_insert_estmv.pviprocod and estcliuvecod = rec_pv_insert_estmv.pviuvecod; else insert into estcli (estcliparcod, estcliprocod, estcliuvecod, estcliest ) values ( rec_pv_insert_estmv.pvcliparcod,--estcliparcod, rec_pv_insert_estmv.pviprocod,--estcliprocod, rec_pv_insert_estmv.pviuvecod,--estcliuvecod, rec_pv_insert_estmv.pviqtdeatecar--estcliest ); end if;--v_cliestprocod > 0 end if;--rec_pv.opnfusaentregafutura = 'S' /*************************************************************** * ALIMENTA CLIEST **************************************************************/ end loop; end if; --************************************************************* -- TRATAMENTO LOTE --************************************************************* for rec_pv_usacontrolelote in --FILTRA ITENS DO PEDIDO QUE USA CONTROLE DE LOTE select pvcliparcod, pvipvempparcod, pvipvcod, pviprocod, pviuvecod, pviuvedes, pviuveun, pviuvemult, pviqtde, pviqtdeate, pviqtdeatecar, opnfsta, opnfcpr, opnfesp, opnftopnfcod, pvilotelotecod, pviloteqtdeatecar from pv join cli on pvcliparcod = cliparcod join loc on cliloccod = loccod join opnf on pvopnfcod = opnfcod join plpg on pvplpgcod = plpgcod join pvi on pvcod = pvipvcod and pvempparcod = pvipvempparcod join pro on pviprocod = procod join est on pviprocod = estprocod and pvipvempparcod = estempparcod join pvilote on pvipvcod = pvilotepvipvcod and pvilotepviseq = pviseq where pviqtdeatecar>0 and opnf_nao_mov_est = 'N' and estusacontrolelote = 'S' and pvcod = p_pedido and pvipvempparcod = p_empresa loop select f_insert_estlotemv( rec_pv_usacontrolelote.pvipvempparcod, rec_pv_usacontrolelote.pviprocod, rec_pv_usacontrolelote.pviuvecod, rec_pv_usacontrolelote.pviuvedes, rec_pv_usacontrolelote.pviuveun, rec_pv_usacontrolelote.pviuvemult, rec_pv_usacontrolelote.pvilotelotecod, 'S', rec_pv_usacontrolelote.opnfsta, rec_pv_usacontrolelote.pviloteqtdeatecar, v_VERSAO,--'FUNC FATURAMENTO', v_VERSAO,--'FATURAMENTO PEDIDO DE VENDA', v_nfcod, p_usuario) into rec_insert_estlotemv; insert into nfilote ( nfilotecadusuparcod, nfilotecadhorario, nfilotealtusuparcod, nfilotealthorario, nfilotenfempparcod, nfilotenfparcod, nfilotenfnum, nfilotenfserie, nfilotenfcod, nfiloteprocod, nfiloteuvecod, nfiloteuvedes, nfiloteuveun, nfiloteuvemult, nfilotelotecod, nfiloteqtde) values ( p_usuario, v_agora, null, null, rec_pv_usacontrolelote.pvipvempparcod, rec_pv_usacontrolelote.pvcliparcod, 1,--substituir no update '1',--substituir no update v_nfcod, rec_pv_usacontrolelote.pviprocod, rec_pv_usacontrolelote.pviuvecod, rec_pv_usacontrolelote.pviuvedes, rec_pv_usacontrolelote.pviuveun, rec_pv_usacontrolelote.pviuvemult, rec_pv_usacontrolelote.pvilotelotecod, rec_pv_usacontrolelote.pviloteqtdeatecar ); end loop; --FOR rec_pv_usacontrolelote IN --************************************************************* -- LIBERACAO DA QTDE RESERVADA --************************************************************* select f_tratar_reserva(p_empresa) into v_res; --LOCK TABLE "app"; -- trava a tabela para nenhuma outra instancia da função acessar a tabela e gerar o mesmo numero. --p_numero = (SELECT numero FROM "app" WHERE empresa= p_empresa AND serie = p_serie); -- pega o numero da tabela --IF p_numero is null THEN --caso não tenha registro para a empresa e serie informado, cria um novo. --INSERT INTO "app" (appcod,appdes,appcom) VALUES (1,p_empresa,p_serie); --p_numero = 1; --END IF; --************************************************************* -- GERAR PROXIMO NUM NF --************************************************************* select empresa, layout, numero, serie into rec_seqnf from f_seqnf(rec_pv.pvempparcod, rec_pv.pvopnfcod); --************************************************************* -- ATUALIZAR PROXIMO NUM NF E DEMAIS DADOS --************************************************************* update nf set nfnum = rec_seqnf.numero, nfserie = rec_seqnf.serie where nfcod = v_nfcod; update nfe set nfenfnum = rec_seqnf.numero, nfenfserie = rec_seqnf.serie where nfenfcod = v_nfcod; update nfecf set nfecfnfnum = rec_seqnf.numero, nfecfnfserie = rec_seqnf.serie where nfecfnfcod = v_nfcod; update nfi set nfinfnum = rec_seqnf.numero, nfinfserie = rec_seqnf.serie where nfinfcod = v_nfcod; update cpr set cprdocnum = rec_seqnf.numero, cprdocserie = rec_seqnf.serie, cpr_notafiscal = rec_seqnf.numero::text where cprnfcod = v_nfcod; --cprcod=v_cprcod; update pv set pvsta = 'FT', pvaltusuparcod = p_usuario, pvalthorario = now(), pvacao = 'FUNCAO FATURAMENTO' || v_VERSAO where pvcod = rec_pv.pvcod and pvempparcod = rec_pv.pvempparcod; update car set carsta = 'FT', cartf = 'F' where carcod = rec_pv.pvcarcod and carempparcod = rec_pv.pvempparcod; update nfilote set nfilotenfnum = rec_seqnf.numero, nfilotenfserie = rec_seqnf.serie where nfilotenfcod = v_nfcod; -- corrige o nfivl caso a diferença de round 4 - round 2 seja maior que 0 jogando essa diferença no primeiro item if v_DescontaStdoPreco = 'S' then UPDATE nfi a SET nfivl = round(nfivl,4)+p.dif, nfibcicms = round(nfibcicms,4)+p.dif FROM ( select nfempparcod, nfcod, max(max(nfiseq)) over (partition by 1) as ultpro, sum((nfivl+nfivlicmsst+nfifcpvlqicmsst)-(round(nfivl,2)+round(nfivlicmsst,2)+round(nfifcpvlqicmsst,2))) as dif from nf join nfi on nfinfcod = nfcod where nfcod=v_nfcod group by nfempparcod,nfcod ) AS p WHERE nfiseq=ultpro and nfinfcod=v_nfcod; end if; --atualizar info sobre compras do cliente if rec_pv.opnftopnfcod in ('VE', 'VI', 'VV') then --Inserindo a Data da Primeira Compra update cli set clidpcomp = v_agora where cliparcod = rec_pv.pvcliparcod and (clidpcomp is null); --Atualizando a Data da Ultima Compra update cli set cliducomp = v_agora, cliultnfnum = rec_seqnf.numero, cliultnfserie = rec_seqnf.serie where cliparcod = rec_pv.pvcliparcod; end if; --************************************************************* -- NFIDET --************************************************************* select f_atualizar_nfidet(v_nfcod) into v_nfidet; --************************************************************* -- EFETIVACAO AUTOMATICA --************************************************************* if rec_pv.opnfcpr = 'S' then select confefetivarauto into v_efetauto from conf where confempparcod = rec_pv.pvempparcod; if coalesce(v_efetauto, 'N')= 'S' then select f_efetivar_automatico(v_nfcod) into rec_efetauto; end if; end if; --************************************************************* -- ENVIO DE MENSAGEM --************************************************************* select nextval('mensagem_mens_cod_seq') into v_menscod; insert into mensagem (mens_cod, mens_dtlan, mens_de, mens_assunto, mens_texto1, mens_texto2) values (v_menscod, now(), p_usuario, 'Faturamento realizado', 'NFe ' || cast(rec_seqnf.numero as varchar)|| ' - Faturamento realizado para o pedido: ' || cast(p_pedido as varchar), 'Cliente: ' ||( select pardes from par where parcod = ( select pvcliparcod from pv where pvcod = p_pedido)) ); insert into mens_para (menspara_mens_cod, menspara_para, menspara_dtreceb, menspara_dtexc) values (v_menscod, rec_pv.pvrcaparcod, null, null); if v_nfcod>0 then return QUERY select v_nfcod::integer as frfatnfcod, rec_seqnf.numero::integer as frfatnfnum, rec_seqnf.serie::text as frfatnfserie, 'Faturamento realizado'::text; else return QUERY select 0::integer as frfatnfcod, 0::integer as frfatnfnum, ''::text as frfatnfserie, 'Nenhum pedido faturado'::text; end if; --RETURN QUERY SELECT 1::integer as frfatnfcod, 1::integer as frfatnfnum, '1'::text as frfatnfserie, 'Faturamento realizado'::text; return; end; $function$ ; ------------------------------------------------------------------------------------------------ alter table pro add column pronaocompra char(1) ------------------------------------------------------------------------------------------------