
-- StoreProcedure {parcelas_factoring()} Versao {003} Esquema {padrao} Descricao {Gera parcelas no factoring}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.parcelas_factoring()
  RETURNS trigger AS
$BODY$

DECLARE
 --Variaveis
   dia                   double precision;
   mes                   double precision;
   ano                   double precision;
   ultimoVcto            DATE;
   vencimento            DATE;
   valorNFsaldo          NUMERIC(14,2); -- Valor Total da NF
   valorPA               NUMERIC(14,2); -- Valor da PArcela
   valorComissao         NUMERIC(14,2); -- Valor da Comissao pelo recebimento
   Receber_Pagar         CHAR(1);
   aCampos               character varying[];
   aDados                character varying[];
   aCamposCl             character varying[];
   aDadosCl              character varying[];
   sCampos               VARCHAR;
   sDados                VARCHAR;
 
 --Faturamento
   d11_perc_comissao     NUMERIC(14,5); 
   d12_natureza          CHAR(1); --Natureza: Entrada/Saida
   d13_tipo_docto        CHAR(1); --Tipo Docto: Nota Fiscal/Pedido/Orcamento
   d14_calcularICMS      CHAR(1); --Calcular ICMS: Sim/Nao
   d15_calcularIPI       CHAR(1); --Calcular IPI: Sim/Nao
   d16_calcularFUNRURAL  CHAR(1); --Calcular FUNRURAL: Sim/Nao
   d17_CFOP              VARCHAR; --Classificacao Fiscal(CFOP) da transacao
   d18_usarCFOP          CHAR(1); --Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos
   d19_devolucao         CHAR(1); --devolucao de mercadorias (Sim - Nao)
   d115_NFE              CHAR(1); --Nota Fiscal Eletronica: (Sim/Nao)
   d118_classgerencialproduto   CHAR(1); --Class.Gerencial do Produto: (Sim/Nao)
 --Estoque 
   d26_atualiza_estoque  CHAR(1); --Atualiza estouque:(Sim/Nao)
   d27_tipo_mvto         CHAR(1); --Tipo de Movimento :0-Normal/1-Consignacao - Envio/ ...
   d28_alterarCM         CHAR(1); --Alterar Custo Medio : Sim/Nao
   d29_alterrrCUC        CHAR(1); --Alterar Custo Ultima compra: Sim/Nao
   d210_checarestoque    CHAR(1); --Checar Estoque: 0-Checar saldo negativo/1-Vetar saida com saldo negativo 
 --Financeiro              
   d49_lancarCRP         CHAR(1); --Lancar contas a receber/pagar: Sim/Nao
   d410_atualizarsaldoCC CHAR(1); --Atualizar saldo do C/C: Sim/Nao
   d411_tipolcto         CHAR(1); --Tipo lancamento: 0-Normal/1-Transferencia
   d412_natureza         CHAR(1); --Natureza: Creditol/Debito
   d413_comissao         CHAR(1); --Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar
   d414_conciliar        CHAR(1); --Conciliar automatico: Sim/Nao
--Classificacao Gerencial
   d71_codigoclasse1      VARCHAR(5); --Codigo classificacacao gerencial 1
   d72_codigoclasse2      VARCHAR(5); --Codigo classificacacao gerencial 2
   d73_codigoclasse3      VARCHAR(5); --Codigo classificacacao gerencial 3  
   
   r_transacao      RECORD;
   r_lctoitens      RECORD;
   r_condpgto       RECORD; -- Condicao de pgto
   r_condpgtop      RECORD; -- Condicao de pgto - parcelas
   r_finaceiro      RECORD; -- Financeiro - Gravar classificacao gerencial

BEGIN
   IF NEW.vendaaprazo = TRUE THEN
	-- SE FOR UMA EXCLUSAO
	   IF TG_OP = 'DELETE'  THEN
	   -- DELETE  CONTAS A RECEBE/PAGAR
	      --EXECUTE 'DELETE FROM ' || getesquema('pagar')||'.pagar WHERE cad_cadastro_id = '|| OLD.cad_cadastro_id ||'AND fatura = '|| OLD.fat_docto_c_controle ; 
		  EXECUTE 'DELETE FROM financ_pagar   WHERE fatura = '|| OLD.id;
		  EXECUTE 'DELETE FROM financ_receber WHERE fatura = '|| OLD.id; 
	   -- DELETE CALSSIFICACAO  GERENCIAL
	          
	   
	      RETURN NULL;
	   END IF;

		 --Posiciona condpg
		   SELECT parcelas,prazoparcelas,vctoapartir 
		     INTO r_condpgto 
		     FROM fat_condpg 
		    WHERE id = NEW.fat_condpg_id;  
		
		 --Valor Nota Fiscal
		   valorNFsaldo = NEW.total_liquido;
		 --Loop parcelas
		  dia 		  = EXTRACT(DAY   FROM NEW.data_base);
		  mes        = EXTRACT(MONTH FROM NEW.data_base);
		  ano        = EXTRACT(YEAR  FROM NEW.data_base);
		  ultimoVcto = NEW.data_base;
		   FOR r_condpgtop IN SELECT * 
		                        FROM fat_condpg_p 
		                       WHERE fat_condpg_id = NEW.fat_condpg_id
		                       ORDER BY parcela LOOP
		       
		      
		       
		       --RAISE NOTICE 'dia: (%)',     dia;
		       --RAISE NOTICE 'mes: (%)',     mes;
		       --RAISE NOTICE 'ano: (%)',     ano;
		       --RAISE NOTICE 'ultimoVcto: (%)',     ultimoVcto;
		     --Periodo (em construcao)
		       IF r_condpgto.prazoparcelas = 'Periodo' THEN
		          RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao' ; 
		       END IF;
		     --Mensal   
		       IF r_condpgto.prazoparcelas = 'Mensal' THEN
		          mes = mes + 1;
		          IF mes > 12 THEN
		             mes = 1;
		             ano = ano + 1;
		          END IF;
		          --RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao % %', vencimento ,to_Char(ano,'9999')||'-'||to_Char(mes,'99'||'/'||to_Char(dia,'99'); 
		          vencimento = to_Date(to_Char(ano,'0999')||'-'||Trim(to_Char(mes,'09'))||'-'||Trim(to_Char(dia,'09')),'YYYY-MM-DD');
		          --RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao %', vencimento ; 
		          IF vencimento IS NULL THEN    
		             vencimento = getLastDay(NEW.data_base); 
		          END IF;
		       END IF;
		     
		    --Diario
		      IF r_condpgto.prazoparcelas = 'Diario' THEN
		         vencimento = ultimoVcto + r_condpgtop.diasemissao;
		         ultimoVcto = vencimento;
		      END IF;
		    
		     valorPA      = NEW.total_liquido * r_condpgtop.percentual / 100;
		     valorNFsaldo = valorNFsaldo - valorPA;
		     --mCm          = Comissao * FaCondI->fpe / 100;
		   
		   --Checa constrant 
		     IF vencimento IS NULL THEN
		        RAISE EXCEPTION 'Vencimento nulo. Nao possivel persistir financeiro!' ;
		     END IF;
		
		     IF r_condpgtop.financ_portador_id IS NULL THEN
		        RAISE EXCEPTION 'Portador nulo. Verique condicao de pgto !' ;
		     END IF;
		
		     IF r_condpgtop.financ_tipocobranca_id IS NULL THEN
		        RAISE EXCEPTION 'Tipo de cobranca nulo. Verique condicao de pgto!' ;
		     END IF;
		
		     aCampos =  '{cad_cadastro_id,
		                   fatura,
		                   parcela,
						   cad_filial_id,
		                   emissao,
		                   vcto,
		                   prorrogacao,
		                   portador_id,
		                   tipocobranca_id,
		                   status_reg,
		                   moeda_id,
		                   valor_desconto,
						   valor_jurosmora,
						   valor_acrescimo,
		                   valor_total,
		                   valor_saldo}';
		    
		     
		      aDados  =   '{'|| to_char(NEW.cadastro_id,'99999')   ||','
		                      || to_char(NEW.id,  '9999999999')           ||',' 
		                      || to_char(r_condpgtop.parcela,  '999')           ||',' 
		                      || to_char(1,  '999')           ||','
		     			      || to_Char(NEW.data_base, 'dd/MM/yyyy')             ||','
		     			      || to_Char(vencimento::DATE, 'dd/MM/yyyy')          ||','
		     			      || to_Char(vencimento::DATE, 'dd/MM/yyyy')          ||','
		     			      || to_Char(r_condpgtop.financ_portador_id, '999')    ||','
		     			      || to_Char(r_condpgtop.financ_tipocobranca_id, '999')||','
		     			      || 'A'                                            ||','
		     			      || 'R$'                                           ||',' 
		     			      || '0.00'                                         ||',' 
		     			      || '0.00'                                         ||',' 
		     			      || '0.00'                                         ||',' 
		     			      || to_Char(valorPA, '999999999.99')               ||','
		     			      || to_Char(valorPA, '999999999.99')               ||'}';
		     			          
		     --RAISE NOTICE 'aCampos: (%)',     aCampos;
		     --RAISE NOTICE 'aDados: (%)',      aDados;
		     
		     IF aDados IS NULL THEN
		        RAISE EXCEPTION 'Nao sera possivel gravar docto. 
	                             Dados para financeiro incompleto. Verifique campos <NULL>:
	                            (cad_cadastro_id:%      
	                              fatura:%              
	                              parcela:%             
	                              cad_filial_id:%       
	                              emissao:%             
	                              vcto:%                
	                              prorrogacao:%         
	                              docto:%               
	                              portador_id:%     
	                              tipocobranca_id:% 
	                              status_reg:%          
	                              moeda_id:%        
	                              valor_desconto:%      
	                              valor_jurosmora:%     
	                              valor_acrescimo:%     
	                              valor_total:%         
	                              valor_saldo:%)',      
	                               to_char(NEW.cad_cadastro_id, '999999999')   ,
	                               to_char(NEW.controle,  '9999999999')           ,  
	                               to_char(r_condpgtop.parcela,  '999')           ,  
	                               to_Char(NEW.cad_filial_id, '999')              ,  
	                               to_Char(NEW.emissao, 'dd/MM/yyyy')             ,  
	                               to_Char(vencimento::DATE, 'dd/MM/yyyy')          ,
	                               to_Char(vencimento::DATE, 'dd/MM/yyyy')          ,
	                               NEW.serie_id||'-'||NEW.numero_docto        ,  
	                               to_Char(r_condpgtop.financ_portador_id, '999')    ,  
	                               to_Char(r_condpgtop.financ_tipocobranca_id, '999'),  
	                               'A'                                            ,  
	                               'R$'                                           ,  
	                               '0.00'                                         ,  
	                               '0.00'                                         ,  
	                               '0.00'                                         ,  
	                               to_Char(valorPA, '999999999.99')               ,  
	                               to_Char(valorPA, '999999999.99')               ; 
	                            
		     END IF;
		     
		      --RAISE NOTICE 'aDados: (%)',      aDados;
		     
		     
		     IF NOT padrao.gravarp('P', aCampos, aDados)THEN
		        RAISE EXCEPTION 'nao possivel persistir financeiro !' ;
		     END IF;
		    
		END;
		   END IF;
		   END LOOP;
	   END IF;   
	   
	   RETURN NULL;
   END IF;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;


-- Gatilho {parcelas_factoring()} Versao {001} Esquema {empresa} Descricao {Gera parcelas no factoring}
-- ------------------------------------------------------------

CREATE TRIGGER parcelas_factoring AFTER INSERT OR UPDATE OR DELETE ON fac_pmed_c
       FOR EACH ROW EXECUTE PROCEDURE padrao.parcelas_factoring();
              