update conf set confrelease = '13309'; ------------------------------------------------------------------------------------------------ -- DROP FUNCTION public.f_validar_faturamento(int4, int4); CREATE OR REPLACE FUNCTION public.f_validar_faturamento(integer, integer) RETURNS TABLE(pedido integer, advertencia text) LANGUAGE plpgsql AS $function$ DECLARE /* select * from f_validar_faturamento(1,4000) Descrição: Função criada para validar os dados do pedido/itens necessários para realização do faturamento. 10/01/2013 - KAYTON: Criação da função f_validar_faturamento 17/06/2013 - KAYTON: Ajuste V2 10/10/2013 - KAYTON: Implementacao do campo opnfcfop e opnfgt e aproveitamento de cred PIS/COFINS 26/03/2014 - KAYTON: Tratamento de tributacao por produto 28/03/2014 - KAYTON: Ajustar criticas de verificacao de cadastro de tributacao por produto 07/07/2014 - KAYTON: Implementar regra CLILP - usar f_livro_do_cliente para localizar trib 11/08/2014 - KAYTON: Tratamento de tributacao por benefício fiscal associado ao cliente 15/08/2014 - KAYTON: Implementação do coalesce coalesce(tribbenefufdest,tribproufdest,tribufdest)corrigindo erro quando pedido bonificação enviando cfop de venda 02/06/2015 - KAYTON: Implementação do UNION dos produtos KIT 16/03/2016 - RAUL: Validar CEP do destinatário 24/04/2020 - David: Validar data de programação 23/06/2020 - David: Validar data de programação 01/02/2022 - David: Validação, caso tenha pedido referenciado não permitir faturar caso o pedido não tenha sido faturado primeiro 24/04/2023 - David: Validação do Livro e melhoria da informação para CFOP não encontrado 26/04/2023 - David: Validação da UF para NFce 03/07/2023 - David: Validação do CSOSN para caso o regime de tributação seja SN 13/09/2023 - David: Correção da identação Adição do informativo de contribuinte ICMS para as mensagens de tributação Adição da validação de CST 24/10/2023 - David: Validação da aliq de ICMS caso o CST seja tributavel 17/09/2025 - David: Validar layout para operação, informando caso esteja vazia */ p_empresa ALIAS FOR $1; p_pedido ALIAS FOR $2; rec_pv RECORD; v_horario TIMESTAMP; v_staPedRef TEXT; BEGIN --************************************************************* -- OBTER DATA HORA HOJE --************************************************************* select now() into v_horario; --************************************************************* -- VALIDAR DADOS ANTES DO FATURAMENTO --************************************************************* for rec_pv in select pvempparcod, pvcod, pvsta, pvplpgcod, pvtccod, pvcliparcod, cliloc.loccod as pvloccod, --cliendloc.loccod as pvcliendloccod, clipar.parcep as pvclicep, clicepent as pvclicepent, clicepcob as pvclicepcob, --cliend.cliendcep,) as pvcliendcep, pvopnfcod, pvrcaparcod, pvrcaauxparcod, pvsupparcod, pvcarcod, pvobsnf, pvdtprog, coalesce(pvrefpvcod, 0) as pvrefpvcod, pvipvempparcod, pvipvcod, tipoproduto, kitprocod, pviprocod, pviuvecod, pviuvedes, pviuveun, pviuvemult, pviqtde, pviqtdeate, pviqtdeatecar, pvivltab, pvivlven, pvivltotal, --pvivdesc, --pvipercdesc, clipar.parcontricms as contribicms, regtribccsacod, opnfsta, opnf_conta_id, opnf_cc_id, opnfcpr, opnfesp, opnftopnfcod, 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, gtcod, gtdes, f_livro_do_cliente(pvcliparcod, pvempparcod) as livro_cliente, case when clipar.parcontricms = 'S' then estvlpautaicms else estvlpautaicmsncontrib end as pauta, case when clipar.parcontricms = 'S' then gtpercredbc else gtncontribpercredbc end as percrbcicms, case when clipar.parcontricms = 'S' then gtaliqicms else gtncontribaliqicms end as aliqicms, case when clipar.parcontricms = 'S' then gtcstcod else gtncontribcstcod end as cst, --case when clipar.parcontricms='S' then gtcfopcod else gtncontribcfopcod end as cfopcod, --se utilizar CFOP de OPNF 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 clipar.parcontricms = 'S' then opnfcfopcodi when opnfcfop = 'S' and coalesce(tribbenefuforig, tribprouforig, tribuforig)<> coalesce(tribbenefufdest, tribproufdest, tribufdest) and clipar.parcontricms <> 'S' then opnfcfopcodincontricms else case when clipar.parcontricms = 'S' then gtcfopcod else gtncontribcfopcod end end as cfopcod, case when clipar.parcontricms = 'S' then gtmodalidbcicms else gtncontribmodalidbcicms end as modbcicms, case when clipar.parcontricms = 'S' then estvlpautast else estvlpautast end as pautaret, case when clipar.parcontricms = 'S' then gtstaliqicms else gtstaliqicms end as aliqicmsret, case when clipar.parcontricms = 'S' then gtstpercredbc else gtstpercredbc end as percrbcicmsret, case when clipar.parcontricms = 'S' then gtstiva else gtstiva end as aliqiva, case when clipar.parcontricms = 'S' then gtstmodalidbcicms else gtstmodalidbcicms end as modbcicmsret, case when clipar.parcontricms = 'S' then gtisento else gtisento end as isento, case when clipar.parcontricms = 'S' then estaliqipi else estaliqipi end as percipi, case when clipar.parcontricms = 'S' then estcstipicod else estcstipicod end as ipi_cst, gtmensagem, gtlegenda, gtpercdescisencaocond, gtcsosncod, gtperccredicmssn, --calculado round((pviqtdeatecar*pvivlven)*gtperccredicmssn/100,4) 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, proncm, regtribcod, (select empregtribcod from emp where empparcod=pvempparcod) as empregtribcod, (select laymodelo from opnf join eol on eolopnfcod=opnfcod and eolempparcod=pvempparcod join lay on eollaycod=laycod where opnfcod=pvopnfcod) as modelo, climun.munufsigla as cliuf, empmun.munufsigla as empuf 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 ,2) as pvivlven, --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))*(prompmpqtde*pviqtdeatecar)::numeric else pvivltotal end ,2) as pvivltotal 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 clipar on clipar.parcod=pvcliparcod join mun climun on climun.muncod=clipar.parmuncod join loc cliloc on cliloccod=loccod join opnf on pvopnfcod=opnfcod join plpg on pvplpgcod=plpgcod join pro on pviprocod=procod join est on pviprocod=estprocod and pvipvempparcod=estempparcod left join cliend on cliendcod=pvcliendcod left join mun cliendmun on cliendmuncod=cliendmun.muncod left join loc cliendloc on cliloccod = cliendloc.loccod left join emp on pvipvempparcod=empparcod left join par emppar on emppar.parcod = empparcod left join mun empmun on empmun.muncod=emppar.parmuncod left join regtrib on empregtribcod=regtribcod --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 --verificar PIS/COFINS left join cstpiscofins on regtribcod=cstpiscofins_regtribcod and estcstpiscofinscod=cstpiscofins_cod where pviqtdeatecar>0 and pvipvempparcod=p_empresa and pvipvcod=p_pedido --where pviqtdeatecar>0 and pvipvempparcod=1 and pvipvcod=46984 loop -- Pedido ref select pvsta into v_staPedRef from pv where pvcod = pvrefpvcod; if rec_pv.pvrefpvcod > 0 and v_staPedRef <> 'FT' then RETURN QUERY SELECT rec_pv.pvcod,cast('Pedido '||cast(rec_pv.pvcod as text) as text)||' possui um pedido referenciado ('|| cast(rec_pv.pvrefpvcod as text) ||') que não foi faturado ainda, é necessário faturar o pedido referenciado primeiro.' as advertencia; END IF; IF rec_pv.pvsta='FT' THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Pedido '||cast(rec_pv.pvcod as text) as text)||' já faturado anteriormente' as advertencia; END IF; IF (rec_pv.modelo='' or rec_pv.modelo is null) THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Operação '||cast(rec_pv.pvopnfcod as text) as text)||' sem cadastro de layout para esta empresa' as advertencia; END IF; IF rec_pv.modelo='65' and rec_pv.cliuf <> rec_pv.empuf THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Pedido '||cast(rec_pv.pvcod as text) as text)||' com UF divergente da UF da empresa para NFce' as advertencia; END IF; IF rec_pv.gtcod IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Tributação não cadastrada para o produto '||cast(rec_pv.pviprocod as text) as text) as advertencia; RETURN; END IF; IF rec_pv.regtribcod IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Tributação não cadastrada para o Regime para o produto '||cast(rec_pv.pviprocod as text) as text) as advertencia; END IF; IF rec_pv.proncm IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('NCM não cadastrado para o produto '||cast(rec_pv.pviprocod as text) as text) as advertencia; END IF; IF rec_pv.empregtribcod IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Regime de Tributação não cadastrado para empresa' as text) as advertencia; END IF; IF rec_pv.livro_cliente IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Cliente não possiu livro para o estado selecionado' as text) as advertencia; END IF; IF rec_pv.cfopcod IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CFOP não informado para o produto '||cast(rec_pv.pviprocod as text)||', verifique o grupo de tributação '||cast(rec_pv.gtcod as text)||' ,cliente contribuinte de ICMS:'||cast(rec_pv.contribicms as text) as text) as advertencia; END IF; IF rec_pv.cst IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CST não informado para o produto '||cast(rec_pv.pviprocod as text)||', verifique o grupo de tributação '||cast(rec_pv.gtcod as text)||' ,cliente contribuinte de ICMS:'||cast(rec_pv.contribicms as text) as text) as advertencia; END IF; IF (rec_pv.cst = '000') and (coalesce(rec_pv.aliqicms,0) = 0) THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Não informado aliq de ICMS para o produto '||cast(rec_pv.pviprocod as text)||', verifique o grupo de tributação '||cast(rec_pv.gtcod as text)||' ,cliente contribuinte de ICMS:'||cast(rec_pv.contribicms as text) as text) as advertencia; END IF; IF (rec_pv.gtcsosncod IS null and rec_pv.empregtribcod = 3) THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CSOSN não informado para o produto '||cast(rec_pv.pviprocod as text)||', verifique o grupo de tributação '||cast(rec_pv.gtcod as text)||' ,cliente contribuinte de ICMS:'||cast(rec_pv.contribicms as text) as text) as advertencia; END IF; IF rec_pv.pvclicep IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP do parceiro não informado - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF length(translate(rec_pv.pvclicep,'.-',''))<>8 THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP do parceiro INVALIDO - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF rec_pv.pvclicepent IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP de entrega não informado - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF length(translate(rec_pv.pvclicepent,'.-',''))<>8 THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP de entrega INVALIDO - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF rec_pv.pvclicepcob IS NULL THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP de cobranca não informado - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF length(translate(rec_pv.pvclicepcob,'.-',''))<>8 THEN RETURN QUERY SELECT rec_pv.pvcod,cast('CEP de cobranca INVALIDO - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; IF DATE(rec_pv.pvdtprog)>DATE(now()) THEN RETURN QUERY SELECT rec_pv.pvcod,cast('Data de Programação maior que a data atual - '||cast(rec_pv.pvcliparcod as text) as text) as advertencia; END IF; --IF cast(p_boleto as integer)>0 --AND (select tc_per_alt_fat from tc where tccod=rec_pv.pvtccod)='S' --AND (select tctdoc from tc where tccod=rec_pv.pvtccod)<>'BO' THEN --RETURN QUERY SELECT rec_pv.pvcod,cast('Não é permitido alteração de cobrança diferente de Boleto '||'Pedido '||cast(rec_pv.pvcod as text) as text) as advertencia; --END IF; END LOOP; RETURN; --select * from f_validar_faturamento(191,884) as (mens text) --RETURN QUERY SELECT v_erro, cast('DADOS VALIDOS' as text) as mens; END; $function$ ; ------------------------------------------------------------------------------------------------ CREATE TABLE public.doc_hist ( doc_histempparcod int4 NOT NULL, doc_histcod serial4, doc_histdt timestamp NOT NULL, doc_histfunparcod int4 NULL, doc_histdocorigcod int4 not NULL, doc_histdoccod int4 null, CONSTRAINT pk_doc_hist PRIMARY KEY (doc_histempparcod, doc_histcod) ); ALTER TABLE public.doc_hist OWNER TO postgres; ALTER TABLE public.doc_hist OWNER TO consulta; ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------