
-- StoreProcedure {gravasaldo()} Versao {15} Esquema {padrao} Descricao {Grava saldo produto}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravasaldo(character varying[], character varying[])
  RETURNS boolean AS
$BODY$
  DECLARE
	p_atributo               alias for $1;
	p_dado                   alias for $2;
	v_length                 integer;
 	v_contador               integer;
 	v_retorna                boolean;
  --Variaveis   
	a_fat_produto_id          int;                                                                     
	a_cad_filial_id           INT4;                           
	a_fat_almoxarifado_id     INT4;                     
	a_ultimaentrada           DATE;                           
	a_ultimasaida             date;                       
	a_ultimomovto             date;                      
	a_customedio              NUMERIC(16,4);                   
	a_customediototal         NUMERIC(16,4);      
	a_custonf                 NUMERIC(16,4);                      
	a_custoreal               NUMERIC(16,4);                      
	a_custodigitado           NUMERIC(16,4);               
	a_saldo                   NUMERIC(16,4);                       
	a_saldo2                  NUMERIC(16,4);                      
	a_saldoinventario         NUMERIC(16,4);           
	a_comdefeito              NUMERIC(16,4);                    
	a_consginacaocliente      NUMERIC(16,4);             
	a_pedidocliente           NUMERIC(16,4);      
	a_reservacliente          NUMERIC(16,4);      
	a_orcamentocliente        NUMERIC(16,4);      
	a_demonstracaocliente     NUMERIC(16,4);      
	a_consertocliente         NUMERIC(16,4);      
	a_entregafuturacliente    NUMERIC(16,4);      
	a_consignacaofornecedor   NUMERIC(16,4);      
	a_pedidofornecedor        NUMERIC(16,4);      
	a_reservafornecedor       NUMERIC(16,4);      
	a_orcamentofornecedor     NUMERIC(16,4);      
	a_demonstracaofornecedor  NUMERIC(16,4);      
    a_consertofornecedor      NUMERIC(16,4);      
	a_entregafuturafornecedor NUMERIC(16,4);      
	a_dataalteracao           DATE ;                       
	a_choraalteracao          TIME ;                       
	a_usuarioalteracao        VARCHAR(20);                 
	a_datainclusao            DATE;                          
	a_horainclusao            TIME;                          
	a_usuarioinclusao         VARCHAR(20);                  
	 
  --registro 
    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] = 'fat_produto_id'THEN
     	   a_fat_produto_id = CAST(p_dado[v_contador] AS Integer);
     	END IF;
     	IF p_atributo[v_contador] = 'cad_filial_id'THEN
     	   a_cad_filial_id = CAST(p_dado[v_contador] AS Integer);
     	END IF;   
     	IF  p_atributo[v_contador] = 'fat_almoxarifado_id'THEN
     	   a_fat_almoxarifado_id = CAST(p_dado[v_contador] AS Integer);
     	END IF; 
     	IF  p_atributo[v_contador] = 'ultimaentrada'THEN
     	   a_ultimaentrada = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'ultimasaida'THEN
     	   a_ultimasaida = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
        IF  p_atributo[v_contador] = 'ultimomovto'THEN
     	   a_ultimomovto = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'customedio'THEN
     	   a_customedio = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'customediototal'THEN
     	   a_customediototal = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custonf'THEN
     	   a_custonf = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custoreal'THEN
     	   a_custoreal = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custodigitado'THEN
     	   a_custodigitado = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldo'THEN
     	   a_saldo = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldo2'THEN
     	   a_saldo2 = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldoinventario'THEN
     	   a_saldoinventario = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
        IF  p_atributo[v_contador] = 'comdefeito'THEN
     	   a_comdefeito = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'consginacaocliente'THEN
     	   a_consginacaocliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'pedidocliente'THEN
     	   a_pedidocliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'reservacliente'THEN
     	   a_reservacliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'orcamentocliente'THEN
     	   a_reservacliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'demonstracaocliente'THEN
     	   a_reservacliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'consertocliente'THEN
     	   a_consertocliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'demonstracaocliente'THEN
     	   a_reservacliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'consginacaocliente'THEN
     	   a_consginacaocliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'entregafuturacliente'THEN
     	   a_entregafuturacliente = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'pedidofornecedor'THEN
     	   a_pedidofornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'reservafornecedor'THEN
     	   a_reservafornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'orcamentofornecedor'THEN
     	   a_reservafornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'demonstracaofornecedor'THEN
     	   a_reservafornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'consertofornecedor'THEN
     	   a_consertofornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;	
     	IF  p_atributo[v_contador] = 'demonstracaofornecedor'THEN
     	   a_reservafornecedor = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	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  row with the new values.
	
    LOOP
       UPDATE fat_produto_saldo
          SET fat_almoxarifado_id       = a_fat_almoxarifado_id,    
			  ultimaentrada             = (CASE WHEN a_ultimaentrada > TO_DATE('','dd/MM/yyyy') THEN a_ultimaentrada       ELSE ultimaentrada END),          
			  ultimasaida               = (CASE WHEN a_ultimasaida   > TO_DATE('','dd/MM/yyyy') THEN a_ultimasaida         ELSE ultimasaida   END),            
			  ultimomovto               = (CASE WHEN a_ultimomovto   > TO_DATE('','dd/MM/yyyy') THEN a_ultimomovto         ELSE ultimomovto   END),                
              dataalteracao             = current_date,
              horaalteracao             = current_time,         
              usuarioalteracao          = a_usuarioalteracao       
		WHERE fat_produto_id  = a_fat_produto_id;
		 

        EXIT  WHEN found;

        BEGIN
            INSERT INTO fat_produto_saldo
                      ( fat_produto_id,         
					    cad_filial_id,          
					    fat_almoxarifado_id,    
					    ultimaentrada,          
					    ultimasaida,            
					    ultimomovto,            
					    datainclusao,           
					    horainclusao,           
					    usuarioinclusao)                   
                 VALUES(a_fat_produto_id,                    
                        a_cad_filial_id,                     
						a_fat_almoxarifado_id,               
						a_ultimaentrada,                     
						a_ultimasaida,                       
						a_ultimomovto,                       
						current_date,                      
						current_time,                      
						a_usuarioinclusao);
            EXIT ;

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