
-- StoreProcedure {gravacccl()} Versao {009} Esquema {padrao} Descricao {Grava classificacao gerencial da conta corrente}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravacccl(character varying[],character varying[])
  RETURNS bool AS
  $BODY$
  DECLARE
	p_atributo                  alias for $1;
	p_dado                      alias for $2;
	v_length                    integer;
 	v_contador                  integer;
 	v_retorna                   boolean;
    a_lancamento                bigint;
    a_financ_cc_id              int;  
    a_financ_cc_movto_controle  bigint;
    a_financ_classificacao_g_id int4;
    a_datalcto                  date; 
    a_natureza                  VARCHAR(20);
    a_valor                     NUMERIC(16,4);
    r_registro   record;
  BEGIN
     v_length   := array_upper(p_dado,1);
  	 v_contador := 0;
  	 v_retorna = true;
  	 
     
    WHILE v_contador <= v_length LOOP
        --RAISE NOTICE 'atributo(%)',  p_atributo[v_contador];
        --RAISE NOTICE 'dado (%)',      p_dado[v_contador];
     	v_contador := v_contador + 1;
     	IF  p_atributo[v_contador] = 'lancamento'THEN
     	   a_lancamento = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_lancamento (%)',      a_lancamento;
     	END IF;
     	IF  p_atributo[v_contador] = 'financ_cc_id'THEN
     	   a_financ_cc_id = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_cc_id (%)',      a_financ_cc_id;
     	END IF;
     	IF  p_atributo[v_contador] = 'financ_cc_movto_controle'THEN
     	   a_financ_cc_movto_controle = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_cc_movto_controle (%)',     a_financ_cc_movto_controle;
     	END IF;
     	IF p_atributo[v_contador] = 'financ_classificacao_g_id'THEN
     	   a_financ_classificacao_g_id = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE ' a_financ_classificacao_g_id (%)',      a_financ_classificacao_g_id;
     	END IF;   
     	IF  p_atributo[v_contador] = 'financ_cc_movto_controle'THEN
     	   a_financ_cc_movto_controle = CAST(p_dado[v_contador] AS Integer);
		   --RAISE NOTICE 'a_financ_cc_movto_controle (%)',      a_financ_cc_movto_controle;
     	END IF; 
     	IF  p_atributo[v_contador] = 'datalcto'THEN
     	   a_datalcto = TO_DATE(p_dado[v_contador],'dd/mm/yyyy');
     	END IF; 
     	IF  p_atributo[v_contador] = 'natureza'THEN
     	   a_natureza = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'valor'THEN
     	   a_valor = CAST(p_dado[v_contador] AS DECIMAL(16,2));
     	END IF;
     
  	End LOOP;

    -- Insert or update tabela financ_cc_movcl row with the new values.
    LOOP
       UPDATE financ_cc_movcl
          SET natureza                   = a_natureza,               
			  datalcto                   = a_datalcto,               
			  valor                      = a_valor                  
        WHERE financ_cc_id               = a_financ_cc_id
          AND financ_cc_movto_controle   = a_financ_cc_movto_controle
          AND financ_classificacao_g_id  = a_financ_classificacao_g_id; 

        EXIT  WHEN found;

        BEGIN
            INSERT INTO financ_cc_movcl
                      ( financ_cc_id,       
					    financ_cc_movto_controle,                
					    financ_classificacao_g_id,
					    natureza,              
					    datalcto,              
					    valor)                   
                 VALUES(a_financ_cc_id,                
						a_financ_cc_movto_controle,               
						a_financ_classificacao_g_id,
						a_natureza,              
						a_datalcto,              
						a_valor	);
            EXIT ;

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

  