
-- StoreProcedure {gravapa()} Versao {09} Esquema {padrao} Descricao {Grava grava atendimento ped/orc/consig/etc}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravapa(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_docto_pc_controle                 bigint;
    a_fat_docto_c_controle                  bigint;
    a_fat_produto_id                        int;
    a_qtde                                  NUMERIC(16,4);
    a_qtde_naoatendida                      NUMERIC(16,4);
    a_qtde_cancelada                        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
     	v_contador := v_contador + 1;
        --RAISE NOTICE 'atributo(%)', p_atributo[v_contador];
        --RAISE NOTICE 'dado (%)',      p_dado[v_contador];
     	IF  p_atributo[v_contador] = 'fat_produto_id'THEN
     	   a_fat_produto_id = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_fat_produto_id (%)',      a_cad_cadastro_id;
     	END IF;
     	IF  p_atributo[v_contador] = 'fat_docto_pc_controle'THEN
     	   a_fat_docto_pc_controle = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_a_fat_docto_pc_controle (%)',      a_fat_docto_pc_controle;
     	END IF;   
     	IF  p_atributo[v_contador] = 'fat_docto_c_controle'THEN
     	   a_fat_docto_c_controle = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_fat_docto_c_controle (%)',      a_fat_docto_c_controle;
     	END IF;   
		IF  p_atributo[v_contador] = 'qtde'THEN
     	   a_qtde = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	
     	IF  p_atributo[v_contador] = 'qtde_naoatendida'THEN
     	   a_qtde_naoatendida = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'qtde_cancelada'THEN
     	   a_qtde_cancelada = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	
     	
     
  	End LOOP;
    -- Insert or update tabela financ_rp row with the new values.
    LOOP
   
       UPDATE fat_docto_pa
          SET fat_produto_id          = a_fat_produto_id,
              fat_docto_c_controle    = a_fat_docto_c_controle,
			  fat_docto_pc_controle   = a_fat_docto_pc_controle,
			  qtde                    = a_qtde,
			  qtde_naoatendida        = a_qtde_naoatendida,
			  qtde_cancelada          = a_qtde_cancelada
        WHERE fat_produto_id          = a_fat_produto_id
          AND fat_docto_pc_controle   = a_fat_docto_pc_controle;

        EXIT  WHEN found;

        BEGIN
            INSERT INTO fat_docto_pa
                      ( fat_produto_id ,
  						fat_docto_pc_controle,
  						fat_docto_c_controle,
  						qtde ,
  						qtde_naoatendida ,
  						qtde_cancelada )
                 VALUES(a_fat_produto_id ,         
                        a_fat_docto_pc_controle,   
						a_fat_docto_c_controle,    
						a_qtde ,                   
						a_qtde_naoatendida ,       
						a_qtde_cancelada);         

			EXIT ;

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

  