
-- StoreProcedure {gravamovtoestoque()} Versao {59} Esquema {padrao} Descricao {Grava movimentacao de estoque}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravamovtoestoque(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_fat_produto_id                bigint;          
	a_fat_docto_c_controle          bigint;          
	a_cad_filial_id                 int;
	a_serie_id                  	varchar;                          
	a_numero_docto                  bigint;              
	a_cad_cadastro_id               int;           
	a_fat_transacao_id              int;          
	a_datamovto                     date;
	a_natureza                      varchar;       
	a_tipomovto                     CHAR(2);
	a_devolucao                     boolean;
	a_atualizaestoque               boolean;
	a_alteracustomedio              boolean;
	a_alteracustoultimacompra       boolean;
	a_fat_almoxarifado_id_origem    int4;        
	a_fat_almoxarifado_id_destino   int4;
	a_qtde                          NUMERIC(16,4);
	a_valorunitario                 NUMERIC(16,4);             
	a_valortotal                    NUMERIC(16,4);                
	a_custoinventario               NUMERIC(16,4);   
	a_custoinventariototal          NUMERIC(16,4);      
	a_custonf                       NUMERIC(16,4);
	a_custodigitado                 NUMERIC(16,4);  
	a_custoreal                     NUMERIC(16,4);
	a_customedio                    NUMERIC(16,4);   
	a_customediototal               NUMERIC(16,4);
	a_saldo                         NUMERIC(16,4);   
	a_saldo2                        NUMERIC(16,4); 
	a_saldoinventario               NUMERIC(16,4); 
	a_usuarioinclusao               VARCHAR(20);
	a_usuarioalteracao              VARCHAR(20);

	
    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 bigint);
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_docto_c_controle'THEN
     	   a_fat_docto_c_controle = CAST(p_dado[v_contador]AS bigint);
     	END IF;   
     	IF p_atributo[v_contador] = 'cad_filial_id'THEN
     	   a_cad_filial_id = CAST(p_dado[v_contador]AS bigint);
     	END IF;  
     	IF  p_atributo[v_contador] = 'serie_id'THEN
     	   a_serie_id = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'numero_docto'THEN
     	   a_numero_docto = CAST(p_dado[v_contador]AS bigint);
     	END IF; 
     	IF  p_atributo[v_contador] = 'cad_cadastro_id'THEN
     	   a_cad_cadastro_id = CAST(p_dado[v_contador]AS bigint);
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_transacao_id'THEN
     	   a_fat_transacao_id = CAST(p_dado[v_contador]AS bigint);
     	END IF;
     	IF  p_atributo[v_contador] = 'datamovto'THEN
     	   a_datamovto = 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] = 'tipomovto'THEN
     	   a_tipomovto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'devolucao'THEN
     	   a_devolucao = CASE WHEN p_dado[v_contador] = 'true'THEN true ELSE false END;
     	END IF;
     	IF  p_atributo[v_contador] = 'alteracustomedio'THEN
     	   a_alteracustomedio = CASE WHEN p_dado[v_contador] = 'true'THEN true ELSE false END;
     	END IF;
     	IF  p_atributo[v_contador] = 'alteracustoultimacompra'THEN
     	   a_alteracustoultimacompra = CASE WHEN p_dado[v_contador] = 'true'THEN true ELSE false END;
     	END IF;
     	IF  p_atributo[v_contador] = 'atualizaestoque'THEN
     	   a_atualizaestoque = CASE WHEN p_dado[v_contador] = 'true'THEN true ELSE false END;
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_almoxarifado_id_origem'THEN
     	   a_fat_almoxarifado_id_origem = CAST(p_dado[v_contador]AS bigint);
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_almoxarifado_id_destino'THEN
     	   a_fat_almoxarifado_id_destino = CAST(p_dado[v_contador]AS bigint);
     	END IF;
     	IF  p_atributo[v_contador] = 'qtde'THEN
     	   a_qtde = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valorunitario'THEN
     	   a_valorunitario = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valortotal'THEN
     	   a_valortotal = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custoinventario'THEN
     	   a_custoinventario = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custoinventariototal'THEN
     	   a_custoinventariototal = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custonf'THEN
     	   --RAISE EXCEPTION 'CUSTO NF: %',p_dado[v_contador];
     	   a_custonf = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custodigitado'THEN
     	   --RAISE EXCEPTION 'CUSTO NF: %',p_dado[v_contador];
     	   a_custodigitado = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'custoreal'THEN
     	   --RAISE EXCEPTION 'CUSTO REAL: %',p_dado[v_contador];
     	   a_custoreal = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'customedio'THEN
     	   a_customedio = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'customediototal'THEN
     	   a_customediototal = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldo'THEN
     	   a_saldo = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldo2'THEN
     	   a_saldo2 = CAST(p_dado[v_contador] AS NUMERIC(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'saldoinventario'THEN
     	   a_saldoinventario = CAST(p_dado[v_contador] AS NUMERIC(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;

  	-- RAISE EXCEPTION 'valorunitario: % valortotal %', a_valorunitario, a_valortotal;
    -- Insert or update tabela receber row with the new values.
	
  	--RAISE EXCEPTION 'custos nf:% digitado:% real:% custo inventario:% custo inventario total:%', a_custonf, a_custodigitado,a_custoreal,a_custoinventario, a_custoinventario*a_qtde ;
  	
    LOOP
       UPDATE fat_produto_movto
          SET serie_id                = a_serie_id,
			  numero_docto                = a_numero_docto,               
			  cad_cadastro_id             = a_cad_cadastro_id,            
			  cad_filial_id               = a_cad_filial_id,     
			  fat_transacao_id            = a_fat_transacao_id,           
			  datamovto                   = a_datamovto,                  
			  natureza                    = a_natureza, 
			  tipomovto                   = a_tipomovto,
			  devolucao                   = a_devolucao,  
              atualizaestoque             = a_atualizaestoque,            
			  alteracustomedio            = a_alteracustomedio,
			  alteracustoultimacompra     = a_alteracustoultimacompra,
              fat_almoxarifado_id_origem          = a_fat_almoxarifado_id_origem,         
			  fat_almoxarifado_id_destino         = a_fat_almoxarifado_id_destino,  
              qtde                        = a_qtde,       
			  valorunitario               = a_valorunitario,              
			  valortotal                  = a_valortotal,                 
			  custoinventario             = a_custoinventario,    
		      custoinventariototal        = a_custoinventariototal,       
			  custonf                     = a_custonf,                   
			  custodigitado               = a_custodigitado,             
			  custoreal                   = a_custoreal,                 
	          dataalteracao               = current_date,
              horaalteracao               = current_time, 
              usuarioalteracao            = a_usuarioalteracao
		WHERE fat_produto_id       = a_fat_produto_id
		  AND fat_docto_c_controle = a_fat_docto_c_controle;
		  --AND cad_filial_id    = a_cad_filial_id
		  --AND tipomovto        = a_tipomovto;

         EXIT WHEN found;

        BEGIN
            INSERT INTO fat_produto_movto
                      ( fat_produto_id,          
					    fat_docto_c_controle,        
					    cad_filial_id,  
					    serie_id,
					    numero_docto,            
					    cad_cadastro_id,         
					    fat_transacao_id,        
					    datamovto,               
					    natureza,                
					    tipomovto, 
					    devolucao,
					    atualizaestoque,   
					    alteracustomedio,
					    alteracustoultimacompra,
					    fat_almoxarifado_id_origem,      
					    fat_almoxarifado_id_destino,   
                        qtde, 
					    valorunitario,           
					    valortotal,              
					    custonf,                
					    custodigitado,          
					    custoreal,              
					    datainclusao,           
					    horainclusao,           
					    usuarioinclusao)                   
                 VALUES(a_fat_produto_id,              
                        a_fat_docto_c_controle,            
						a_cad_filial_id, 
						a_serie_id,
						a_numero_docto,                
						a_cad_cadastro_id,             
						a_fat_transacao_id,            
						a_datamovto,                   
						a_natureza,                    
						a_tipomovto, 
						a_devolucao,
						a_atualizaestoque,             
						a_alteracustomedio,
						a_alteracustoultimacompra,
						a_fat_almoxarifado_id_origem,          
						a_fat_almoxarifado_id_destino, 
                        a_qtde,       
						a_valorunitario,               
						a_valortotal,                  
						a_custonf,                    
						a_custodigitado,              
						a_custoreal,                  
						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;

  