
-- StoreProcedure {gravasaldocc()} Versao {09} Esquema {padrao} Descricao {Grava saldo conta corrente}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravasaldoCC(character varying[],character varying[],char(1) )
  RETURNS boolean AS

$BODY$

 DECLARE
	p_atributo               alias for $1;
	p_dado                   alias for $2;
	p_TipoSaldo              alias for $3; -- (E)missao,(V)encimento,(C)onciliado,(R)eferencia
	v_length                 integer;
 	v_contador               integer;
 	v_retorna                boolean;
  
 	--Variaveis                                                                                   
	a_idcc                                      INT ;                                         
	a_datasaldo                                 date;                             
	a_naturezasaldo                             CHAR(1);   
	a_saldo                                     NUMERIC(16,4);
	 
  
	--registro 
    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] = 'idcc'THEN
     	   a_idcc = CAST(p_dado[v_contador] AS Integer);
     	END IF;
     	IF  p_atributo[v_contador] = 'datasaldo'THEN
     	   a_datasaldo = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF p_atributo[v_contador] = 'saldo'THEN
     	   a_saldo = CAST(p_dado[v_contador] AS DECIMAL(16,4));
     	END IF;
  	End LOOP;
       
    -- Insert or update tabela  row with the new values.
	
  	--RAISE NOTICE 'TipoSAldo(%)',   p_TipoSaldo;
    
  	LOOP
       UPDATE financ_cc_saldo
          SET idcc                                       = a_idcc,    
			  datasaldo                                  = (CASE WHEN a_datasaldo > TO_DATE('','dd/MM/yyyy') THEN a_datasaldo ELSE datasaldo END),          
              naturezasaldo                              = p_TipoSaldo,
              saldo                                      = a_saldo
		WHERE idcc          = a_idcc
		  AND datasaldo     = a_datasaldo
		  AND naturezasaldo = p_TipoSaldo ;
		

        EXIT  WHEN found;

        BEGIN
            INSERT INTO financ_cc_saldo
                      ( idcc,         
					    datasaldo,          
					    naturezasaldo,           
					    saldo)                   
                 VALUES(a_idcc,                    
                        a_datasaldo,                     
						p_TipoSaldo,                       
						a_saldo);
            EXIT ;

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

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

  