
-- StoreProcedure {gravarp()} Versao {51} Esquema {padrao} Descricao {Grava contas a financ_rp}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravarp(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_data_lcto           DATE;
    a_historico_lcto      TEXT;
    a_lote                VARCHAR;
    a_filial_id           INTEGER;
    a_parcela             INT;
    a_cad_filial_id       int;
    a_emissao             date;
    a_prorrogacao         date;
    a_dataref             date;                 
    a_docto               varchar(30);                     
    a_portador_id     	  int;              
    a_tipocobranca_id 	  int;               
    a_status_reg          varchar(40);              
    a_moeda_id            varchar(20);        
    a_valor_total         DECIMAL(14,4);          
    a_valor_saldo         DECIMAL(14,4);        
    a_valor_jurosmora     DECIMAL(14,4);      
    a_valor_desconto      DECIMAL(14,4);
    a_valor_acrescimo     DECIMAL(14,4);
    a_numeroboleto        VARCHAR(40);    
    a_per_jurosmora       DECIMAL(10,6);
    a_per_acrescimo       DECIMAL(10,6);
    a_per_multa           DECIMAL(10,6);
    a_carencia            NUMERIC (4);                       
    a_vendedor_id         int;       
    a_datainclusao        date;    
    a_horainclusao        time;          
    a_usuarioinclusao     varchar(20);  
    a_dataalteracao       date;        
    a_horaalteracao       time;     
    a_usuarioalteracao    varchar(20); 
    
    query varchar(250);
                                                                     
    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] = 'cad_cadastro_id'THEN
     	   a_cad_cadastro_id = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_cad_cadastro_id (%)',      a_cad_cadastro_id;
     	END IF;
     	IF  p_atributo[v_contador] = 'fatura'THEN
     	   a_fatura = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_fatura (%)',      a_fatura;
     	END IF;
     	IF  p_atributo[v_contador] = 'financ_cc_movto_controle'THEN
     	   a_financ_cc_movto_controle = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_financ_cc_movto_controle (%)',      a_financ_cc_movto_controle;
     	END IF;
     	IF p_atributo[v_contador] = 'parcela'THEN
     	   a_parcela = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_parcela (%)',      a_parcela;
     	END IF;   
     	IF  p_atributo[v_contador] = 'cad_filial_id'THEN
     	   a_cad_filial_id = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_cad_filial_id (%)',      a_cad_filial_id;
     	END IF;   
     	IF  p_atributo[v_contador] = 'emissao'THEN
     	   a_emissao = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF; 
     	IF  p_atributo[v_contador] = 'vcto'THEN
     	   a_vcto = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'prorrogacao'THEN
     	   a_prorrogacao = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'dataref'THEN
     	   a_dataref = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'docto'THEN
     	   a_docto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'portador_id'THEN
     	   a_portador_id = CAST(p_dado[v_contador] AS bigInt);
     	END IF;
     	IF  p_atributo[v_contador] = 'tipocobranca_id'THEN
     	   a_tipocobranca_id = CAST(p_dado[v_contador] AS bigInt);
     	END IF;
     	IF  p_atributo[v_contador] = 'status_reg'THEN
     	   a_status_reg = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'moeda_id'THEN
     	   a_moeda_id = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_total'THEN
     	   a_valor_total = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_saldo'THEN
     	   a_valor_saldo = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_jurosmora'THEN
     	   a_valor_jurosmora = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;     	
     	IF  p_atributo[v_contador] = 'valor_desconto'THEN
     	   a_valor_desconto = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_acrescimo'THEN
     	   a_valor_acrescimo = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;
     	IF  p_atributo[v_contador] = 'numeroboleto'THEN
     	   a_numeroboleto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'per_jurosmora'THEN
     	   a_per_jurosmora = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'per_acrescimo'THEN
     	   a_per_acrescimo = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'per_multa'THEN
     	   a_per_multa = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'carencia'THEN
     	   a_carencia = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'vendedor_id'THEN
     	   a_vendedor_id = CAST(p_dado[v_contador] AS bigInt);
     	END IF;
     	IF  p_atributo[v_contador] = 'usuarioinclusao'THEN
     	   a_usuarioinclusao = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'usuarioalteracao'THEN
     	   a_usuarioalteracao = p_dado[v_contador];
     	END IF;
     
  	End LOOP;
    -- Insert or update tabela financ_rp row with the new values.
    LOOP
    
      query =  'UPDATE financ_rp
          SET natureza            ='|| p_opcao||',
              cad_filial_id       ='|| a_cad_filial_id||',
			  emissao             ='||  a_emissao||',
			  vcto                ='||  a_vcto||',
			  prorrogacao         ='||  a_prorrogacao||',
			  dataref             ='||  a_dataref||',
			  docto               ='||  a_docto||',
			  portador_id         ='||  a_portador_id||',
			  tipocobranca_id     ='||  a_tipocobranca_id||',
			  status_reg          ='|| a_status_reg||',
			  moeda_id            ='||  a_moeda_id||',
			  valor_total         ='||  a_valor_total||',
			  valor_saldo         ='||  a_valor_saldo||',
			  valor_jurosmora     ='||  a_valor_jurosmora||',
			  valor_desconto      ='||  a_valor_desconto||',
			  valor_acrescimo     ='||  a_valor_acrescimo||',
			  numeroboleto        ='||  a_numeroboleto||',
			  per_jurosmora       ='||  a_per_jurosmora||',
			  per_acrescimo       ='||  a_per_acrescimo||',
			  per_multa           ='||  a_per_multa||',
			  carencia            ='||  a_carencia||',
			  vendedor_id         ='||  a_vendedor_id||',
			  dataalteracao       ='||  current_date||',
			  horaalteracao       ='||  current_time||',
			  usuarioalteracao    ='||  a_usuarioalteracao||'
        WHERE cad_cadastro_id           ='||  a_cad_cadastro_id||'
          AND fatura                    ='||  a_fatura||'
          AND financ_cc_movto_controle  ='||  a_financ_cc_movto_controle||'
          AND parcela                   ='||  a_parcela||';';
          
          
       UPDATE financ_rp
          SET natureza            = p_opcao,
              cad_filial_id       = a_cad_filial_id,
			  emissao             = a_emissao,
			  vcto                = a_vcto,
			  prorrogacao         = a_prorrogacao,
			  dataref             = a_dataref,
			  docto               = a_docto,
			  portador_id     = a_portador_id,
			  tipocobranca_id = a_tipocobranca_id,
			  status_reg          = a_status_reg,
			  moeda_id        = a_moeda_id,
			  valor_total         = a_valor_total,
			  valor_saldo         = a_valor_saldo,
			  valor_jurosmora     = a_valor_jurosmora,
			  valor_desconto      = a_valor_desconto,
			  valor_acrescimo     = a_valor_acrescimo,
			  numeroboleto        = a_numeroboleto,
			  per_jurosmora       = a_per_jurosmora,
			  per_acrescimo       = a_per_acrescimo,
			  per_multa           = a_per_multa,
			  carencia            = a_carencia,
			  vendedor_id     = a_vendedor_id,
			  dataalteracao       = current_date,
			  horaalteracao       = current_time,
			  usuarioalteracao    = a_usuarioalteracao
        WHERE cad_cadastro_id           = a_cad_cadastro_id
          AND fatura                    = a_fatura
          AND financ_cc_movto_controle  = a_financ_cc_movto_controle
          AND parcela                   = a_parcela;

        EXIT  WHEN found;

        BEGIN
	        
	        query = 'INSERT INTO financ_rp
                      ( natureza,
                        cad_cadastro_id,
					    fatura,
					    parcela,
					    cad_filial_id,
					    emissao,
					    vcto,
					    prorrogacao,
					    dataref,
					    docto,
					    portador_id,
					  	tipocobranca_id,
					    status_reg,
					    moeda_id,
					    valor_total,
					    valor_saldo,
					  	valor_jurosmora,
					  	valor_desconto,
					  	valor_acrescimo,
					  	numeroboleto,
					  	per_jurosmora,
					  	per_acrescimo,
					  	per_multa,
					  	carencia,
					  	vendedor_id,
					  	datainclusao,
					  	horainclusao ,
					  	usuarioalteracao,
					  	nosso_numero )
                 VALUES('||p_opcao||',
                        '||a_cad_cadastro_id||',     
					    '||a_fatura||',               
					    '||a_financ_cc_movto_controle||',
					    '||a_parcela||',
					    '||a_cad_filial_id||',        
					    '||a_emissao||',
					    '||a_vcto||',                 
					    '||a_prorrogacao||',          
					    '||a_dataref||',              
					    '||a_docto||',                
					    '||a_portador_id||',      
					    '||a_tipocobranca_id||',  
					    '||a_status_reg||',           
					    '||a_moeda_id||',         
					    '||a_valor_total||',          
					    '||a_valor_saldo||',          
					    '||a_valor_jurosmora||',      
					    '||a_valor_desconto||',       
					    '||a_valor_acrescimo||',      
					    '||a_numeroboleto||',         
					    '||a_per_jurosmora||',        
					    '||a_per_acrescimo||',        
					    '||a_per_multa||',    
					    '||a_carencia||',    
					    '||a_vendedor_id||',      
					    '||current_date||',        
					    '||current_time ||',       
					    '||a_usuarioalteracao||',
					    '||'SELECT (COALESCE(MAX(nosso_numero), 0)+1) FROM financ_rp  WHERE  cad_filial_id='||a_cad_filial_id||')';
	        
            INSERT INTO financ_rp
                      ( natureza,
                        cad_cadastro_id,
					    fatura,
					    financ_cc_movto_controle,
					    parcela,
					    cad_filial_id,
					    emissao,
					    vcto,
					    prorrogacao,
					    dataref,
					    docto,
					    portador_id,
					  	tipocobranca_id,
					    status_reg,
					    moeda_id,
					    valor_total,
					    valor_saldo,
					  	valor_jurosmora,
					  	valor_desconto,
					  	valor_acrescimo,
					  	numeroboleto,
					  	per_jurosmora,
					  	per_acrescimo,
					  	per_multa,
					  	carencia,
					  	vendedor_id,
					  	datainclusao,
					  	horainclusao ,
					  	usuarioalteracao, nosso_numero)
                 VALUES(p_opcao,
                        a_cad_cadastro_id,      
						a_fatura,               
						a_financ_cc_movto_controle,
						a_parcela,
						a_cad_filial_id,        
						a_emissao,
						a_vcto,                 
						a_prorrogacao,          
						a_dataref,              
						a_docto,                
						a_portador_id,      
						a_tipocobranca_id,  
						a_status_reg,           
						a_moeda_id,         
						a_valor_total,          
						a_valor_saldo,          
						a_valor_jurosmora,      
						a_valor_desconto,       
						a_valor_acrescimo,      
						a_numeroboleto,         
						a_per_jurosmora,        
						a_per_acrescimo,        
						a_per_multa,    
						a_carencia,    
						a_vendedor_id,      
						current_date,        
						current_time ,       
						a_usuarioalteracao, (SELECT (COALESCE(MAX(nosso_numero), 0)+1) FROM financ_rp  WHERE  cad_filial_id=a_cad_filial_id));
            EXIT ;

        EXCEPTION
            WHEN UNIQUE_VIOLATION THEN
                -- do nothing
                  v_retorna = false;
        END;
    END LOOP;
   
   RETURN v_retorna;
  END
  
  $BODY$
  
  LANGUAGE 'plpgsql' VOLATILE;

  