
-- StoreProcedure {gravabaixa()} Versao {03} Esquema {padrao} Descricao {Grava baixa}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravabaixa(char(1),character varying[],character varying[])
  RETURNS bool AS
  $BODY$
  DECLARE
 	p_opcao               alias for $1;
	p_atributo            alias for $2;
	p_dado                alias for $3;
	v_length              integer;
 	v_contador            integer;
 	v_retorna             boolean;
    a_financ_receber_cad_cadastro_id  int;
    a_financ_receber_fatura           bigint;
    a_financ_receber_parcela  	      int;
    a_id                              bigint;
    a_cad_filial_id                   int4;
    a_datapgto                        date;
    a_valor_pago                      NUMERIC(16,4);
    a_valor_juros                     NUMERIC(16,4);
    a_valor_despesasac                NUMERIC(16,4);
    a_valor_devolucaom                NUMERIC(16,4);
    a_valor_descontos                 NUMERIC(16,4);
    a_valor_liquido                   NUMERIC(16,4);
    a_docto                           VARCHAR(20);
    a_historico                       TEXT;
    a_fat_docto_c_controle  bigint;
    a_fat_transacao_id      int4;
    

    r_registro   record;
  
  BEGIN
     v_length   := array_upper(p_dado,1);
  	 v_contador := 0;
  	 v_retorna = true;
  	 
     
    WHILE v_contador < v_length LOOP
     	v_contador := v_contador + 1;
        --RAISE NOTICE 'atributo(%)', p_atributo[v_contador];
        --RAISE NOTICE 'dado (%)',      p_dado[v_contador];
     	IF  p_atributo[v_contador] = 'financ_receber_cad_cadastro_id'THEN
     	   a_financ_receber_cad_cadastro_id = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_receber_cad_cadastro_id (%)',      a_financ_receber_cad_cadastro_id;
     	END IF;
     	IF  p_atributo[v_contador] = 'financ_financ_receber_fatura'THEN
     	   a_financ_receber_fatura = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_receber_fatura (%)',      a_financ_receber_fatura;
     	END IF;   
     	IF p_atributo[v_contador] = 'financ_receber_parcela'THEN
     	   a_financ_receber_parcela = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_receber_parcela (%)',      a_financ_receber_parcela;
     	END IF;   
     	IF p_atributo[v_contador] = 'cad_filial_id'THEN
     	   a_cad_filial_id = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_cad_filial_id (%)',      a_cad_filial_id;
     	END IF;   
     	IF  p_atributo[v_contador] = 'id'THEN
     	   a_id = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_cad_filial_id (%)',      a_cad_filial_id;
     	END IF;   
     	IF  p_atributo[v_contador] = 'datapgto'THEN
     	   a_datapgto = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF; 
     	IF  p_atributo[v_contador] = 'valor_pago'THEN
     	   a_valor_pago = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_juros'THEN
     	   a_valor_juros = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_despesasac'THEN
     	   a_valor_despesasac = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_devolucaom'THEN
     	   a_valor_devolucaom = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_descontos'THEN
     	   a_valor_descontos = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_liquido'THEN
     	   a_valor_liquido = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'docto'THEN
     	   a_docto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'historico'THEN
     	   a_historico = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_docto_c_controle'THEN
     	   a_fat_docto_c_controle = CAST(p_dado[v_contador] AS Integer);
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_transacao_id'THEN
     	   a_fat_transacao_id = CAST(p_dado[v_contador] AS Integer);
     	END IF;
     	
       
     
  	End LOOP;

    -- Insert or update tabela rbaixa row with the new values.
	IF p_opcao = 'R' THEN 
	LOOP
	   UPDATE rbaixa
	      SET financ_receber_cad_cadastro_id      = a_financ_receber_cad_cadastro_id,  
				  receber_financ_receber_fatura   = a_financ_receber_fatura,     
				  receber_financ_receber_parcela  = a_financ_receber_parcela,    
				  id       = a_id,       
				  cad_filial_id    = a_cad_filial_id,    
				  datapgto         = a_datapgto,         
				  valor_pago       = a_valor_pago,       
				  valor_juros      = a_valor_juros,      
				  valor_despesasac = a_valor_despesasac,
				  valor_devolucaom = a_valor_devolucaom, 
				  valor_descontos  = a_valor_descontos,  
				  valor_liquido    = a_valor_liquido,    
				  docto            = a_docto,            
				  historico        = a_historico,        
				  fat_docto_c_controle = a_fat_docto_c_controle, 
				  fat_transacao_id = a_fat_transacao_id
	    WHERE financ_receber_cad_cadastro_id     = a_financ_receber_cad_cadastro_id
	      AND receber_financ_receber_fatura              = a_financ_receber_fatura
	      AND receber_financ_receber_parcela             = a_financ_receber_parcela
	      AND id                  = a_id;
	       

	    EXIT  WHEN found;

	    BEGIN
		INSERT INTO rbaixa
			  ( financ_receber_cad_cadastro_id, 
						    receber_financ_receber_fatura,    
						    receber_financ_receber_parcela,   
						    cad_filial_id,   
						    datapgto,        
						    valor_pago,      
						    valor_juros,     
						    valor_despesasac,
						    valor_devolucaom,
							valor_descontos,
						    valor_liquido,   
						    docto,           
						    historico,       
						    fat_docto_c_controle,
						    fat_transacao_id )
		     VALUES(a_financ_receber_cad_cadastro_id,   
							a_financ_receber_fatura,    
							a_financ_receber_parcela, 
							a_cad_filial_id,     
							a_datapgto,          
							a_valor_pago,        
							a_valor_juros,       
							a_valor_despesasac,  
							a_valor_devolucaom,  
							a_valor_descontos,   
							a_valor_liquido,     
							a_docto,             
							a_historico,         
							a_fat_docto_c_controle,  
							a_fat_transacao_id );  
		EXIT ;

	    EXCEPTION
		WHEN UNIQUE_VIOLATION THEN
		    -- do nothing
		      v_retorna = false;
	    END;
	END LOOP;
   END IF; 
   -- Insert or update tabela pagar row with the new values.
   IF p_opcao = 'P' THEN 
       	LOOP
	   UPDATE pbaixa
	      SET financ_receber_cad_cadastro_id  = a_financ_receber_cad_cadastro_id,  
				  pagar_financ_receber_fatura   = a_financ_receber_fatura,     
				  pagar_financ_receber_parcela  = a_financ_receber_parcela,    
				  id       = a_id,       
				  cad_filial_id    = a_cad_filial_id,    
				  datapgto         = a_datapgto,         
				  valor_pago       = a_valor_pago,       
				  valor_juros      = a_valor_juros,      
				  valor_despesasac = a_valor_despesasac,
				  valor_devolucaom = a_valor_devolucaom, 
				  valor_descontos  = a_valor_descontos,  
				  valor_liquido    = a_valor_liquido,    
				  docto            = a_docto,            
				  historico        = a_historico,        
				  fat_docto_c_controle = a_fat_docto_c_controle, 
				  fat_transacao_id = a_fat_transacao_id
	    WHERE financ_receber_cad_cadastro_id     = a_financ_receber_cad_cadastro_id
	      AND pagar_financ_receber_fatura              = a_financ_receber_fatura
	      AND pagar_financ_receber_parcela             = a_financ_receber_parcela
	      AND id                = a_id;    
	      

	    EXIT  WHEN found;

	    BEGIN
		INSERT INTO pbaixa
			  ( financ_receber_cad_cadastro_id, 
						    pagar_financ_receber_fatura,    
						    pagar_financ_receber_parcela,   
						    cad_filial_id,   
						    datapgto,        
						    valor_pago,      
						    valor_juros,     
						    valor_despesasac,
						    valor_devolucaom,
							valor_descontos,
						    valor_liquido,   
						    docto,           
						    historico,       
						    fat_docto_c_controle, 
						    fat_transacao_id ) 
		     VALUES(a_financ_receber_cad_cadastro_id,   
							a_financ_receber_fatura,    
							a_financ_receber_parcela, 
							a_cad_filial_id,     
							a_datapgto,          
							a_valor_pago,        
							a_valor_juros,       
							a_valor_despesasac,  
							a_valor_devolucaom,  
							a_valor_descontos,   
							a_valor_liquido,     
							a_docto,             
							a_historico,         
							a_fat_docto_c_controle,  
							a_fat_transacao_id );  
		EXIT ;

	    EXCEPTION
		WHEN UNIQUE_VIOLATION THEN
		    -- do nothing
		      v_retorna = false;
	    END;
	END LOOP;

   END IF;
   
   
   
   RETURN v_retorna;
  END
  
  $BODY$
  
  LANGUAGE 'plpgsql' VOLATILE;
