
-- StoreProcedure {gravarp()} Versao {09} Esquema {padrao} Descricao {Grava contas a receber/pagar}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravarp(char(1),character varying[],character varying[])
  RETURNS bool AS
  $BODY$
  DECLARE
 	p_opcao               alias for $1;
	p_atributo            alias for $2;
	p_dado                alias for $3;
	v_length              integer;
 	v_contador            integer;
 	v_retorna             boolean;
    a_cadastro_codigo     receber.cadastro_codigo%TYPE;
    a_fatura              receber.fatura%TYPE;
    a_parcela             receber.parcela%TYPE;
    a_filial_codigo       receber.filial_codigo%TYPE;
    a_emissao             receber.emissao%TYPE;
    a_vcto                receber.vcto%TYPE;
    a_prorrogacao         receber.prorrogacao%TYPE;
    a_dataref             receber.dataref%TYPE;
    a_docto               receber.docto%TYPE;
    a_portador_codigo     receber.portador_codigo%TYPE;
    a_tipocobranca_codigo receber.tipocobranca_codigo%TYPE;
    a_status_reg          receber.status_reg%TYPE;
    a_moeda_codigo        receber.moeda_codigo%TYPE;
    a_valor_total         receber.valor_total%TYPE;
    a_valor_saldo         receber.valor_saldo%TYPE;
    a_valor_jurosmora     receber.valor_jurosmora%TYPE;
    a_valor_desconto      receber.valor_desconto%TYPE;
    a_valor_acrescimo     receber.valor_acrescimo%TYPE;
    a_numeroboleto        receber.numeroboleto%TYPE;
    a_per_jurosmora       receber.per_jurosmora%TYPE;
    a_per_acrescimo       receber.per_acrescimo%TYPE;
    a_per_multa           receber.per_multa%TYPE;
    a_vendedor_codigo     receber.vendedor_codigo%TYPE;
    a_datainclusao        receber.datainclusao%TYPE;
    a_horainclusao        receber.horainclusao%TYPE;
    a_usuarioinclusao     receber.usuarioinclusao%TYPE;
    a_dataalteracao       receber.dataalteracao%TYPE;
    a_horaalteracao       receber.horaalteracao%TYPE;
    a_usuarioalteracao    receber.usuarioalteracao%TYPE;

    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] = 'cadastro_codigo'THEN
     	   a_cadastro_codigo = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_cadastro_codigo (%)',      a_cadastro_codigo;
     	END IF;
     	IF  p_atributo[v_contador] = 'fatura'THEN
     	   a_fatura = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_fatura (%)',      a_fatura;
     	END IF;   
     	IF p_atributo[v_contador] = 'parcela'THEN
     	   a_parcela = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_parcela (%)',      a_parcela;
     	END IF;   
     	IF  p_atributo[v_contador] = 'filial_codigo'THEN
     	   a_filial_codigo = CAST(p_dado[v_contador] AS bigInt);
		   --RAISE NOTICE 'a_filial_codigo (%)',      a_filial_codigo;
     	END IF;   
     	IF  p_atributo[v_contador] = 'emissao'THEN
     	   a_emissao = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF; 
     	IF  p_atributo[v_contador] = 'vcto'THEN
     	   a_vcto = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'prorrogacao'THEN
     	   a_prorrogacao = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'dataref'THEN
     	   a_dataref = TO_DATE(p_dado[v_contador],'dd/MM/yyyy');
     	END IF;
     	IF  p_atributo[v_contador] = 'docto'THEN
     	   a_docto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'portador_codigo'THEN
     	   a_portador_codigo = CAST(p_dado[v_contador] AS bigInt);
     	END IF;
     	IF  p_atributo[v_contador] = 'tipocobranca_codigo'THEN
     	   a_tipocobranca_codigo = CAST(p_dado[v_contador] AS bigInt);
     	END IF;
     	IF  p_atributo[v_contador] = 'status_reg'THEN
     	   a_status_reg = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'moeda_codigo'THEN
     	   a_moeda_codigo = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_total'THEN
     	   a_valor_total = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_saldo'THEN
     	   a_valor_saldo = CAST(p_dado[v_contador] AS DECIMAL(14,4));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_jurosmora'THEN
     	   a_valor_jurosmora = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;     	
     	IF  p_atributo[v_contador] = 'valor_desconto'THEN
     	   a_valor_desconto = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;
     	IF  p_atributo[v_contador] = 'valor_acrescimo'THEN
     	   a_valor_acrescimo = CAST(p_dado[v_contador] AS DECIMAL(14,5));
     	END IF;
     	IF  p_atributo[v_contador] = 'numeroboleto'THEN
     	   a_numeroboleto = p_dado[v_contador];
     	END IF;
     	IF  p_atributo[v_contador] = 'per_jurosmora'THEN
     	   a_per_jurosmora = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'per_acrescimo'THEN
     	   a_per_acrescimo = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'per_multa'THEN
     	   a_per_multa = CAST(p_dado[v_contador] AS DECIMAL(14,6));
     	END IF;
     	IF  p_atributo[v_contador] = 'vendedor_codigo'THEN
     	   a_vendedor_codigo = CAST(p_dado[v_contador] AS bigInt);
     	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 receber row with the new values.
	IF p_opcao = 'C' THEN 
        LOOP
           UPDATE receber
              SET filial_codigo       = a_filial_codigo,
				  emissao             = a_emissao,
				  vcto                = a_vcto,
				  prorrogacao         = a_prorrogacao,
				  dataref             = a_dataref,
				  docto               = a_docto,
				  portador_codigo     = a_portador_codigo,
				  tipocobranca_codigo = a_tipocobranca_codigo,
				  status_reg          = a_status_reg,
				  moeda_codigo        = a_moeda_codigo,
				  valor_total         = a_valor_total,
				  valor_saldo         = a_valor_saldo,
				  valor_jurosmora     = a_valor_jurosmora,
				  valor_desconto      = a_valor_desconto,
				  valor_acrescimo     = a_valor_acrescimo,
				  numeroboleto        = a_numeroboleto,
				  per_jurosmora       = a_per_jurosmora,
				  per_acrescimo       = a_per_acrescimo,
				  per_multa           = a_per_multa,
				  vendedor_codigo     = a_vendedor_codigo,
				  dataalteracao       = current_date,
				  horaalteracao       = current_time,
				  usuarioalteracao    = a_usuarioalteracao
            WHERE cadastro_codigo     = a_cadastro_codigo
              AND fatura              = a_fatura
              AND parcela             = a_parcela;

            EXIT  WHEN found;

            BEGIN
                INSERT INTO receber
                          ( cadastro_codigo,
						    fatura,
						    parcela,
						    filial_codigo,
						    emissao,
						    vcto,
						    prorrogacao,
						    dataref,
						    docto,
						    portador_codigo,
						  	tipocobranca_codigo,
						    status_reg,
						    moeda_codigo,
						    valor_total,
						    valor_saldo,
						  	valor_jurosmora,
						  	valor_desconto,
						  	valor_acrescimo,
						  	numeroboleto,
						  	per_jurosmora,
						  	per_acrescimo,
						  	per_multa,
						  	vendedor_codigo,
						  	datainclusao,
						  	horainclusao ,
						  	usuarioalteracao )
                     VALUES(a_cadastro_codigo,      
							a_fatura,               
							a_parcela,         
							a_filial_codigo,        
							a_emissao,              
							a_vcto,                 
							a_prorrogacao,          
							a_dataref,              
							a_docto,                
							a_portador_codigo,      
							a_tipocobranca_codigo,  
							a_status_reg,           
							a_moeda_codigo,         
							a_valor_total,          
							a_valor_saldo,          
							a_valor_jurosmora,      
							a_valor_desconto,       
							a_valor_acrescimo,      
							a_numeroboleto,         
							a_per_jurosmora,        
							a_per_acrescimo,        
							a_per_multa,            
							a_vendedor_codigo,      
							current_date,        
							current_time ,       
							a_usuarioalteracao);
                EXIT ;

            EXCEPTION
                WHEN UNIQUE_VIOLATION THEN
                    -- do nothing
                      v_retorna = false;
            END;
        END LOOP;
   END IF; 
   -- Insert or update tabela pagar row with the new values.
   IF p_opcao = 'D' THEN 
        LOOP
           UPDATE pagar
              SET filial_codigo       = a_filial_codigo,
				  emissao             = a_emissao,
				  vcto                = a_vcto,
				  prorrogacao         = a_prorrogacao,
				  dataref             = a_dataref,
				  docto               = a_docto,
				  portador_codigo     = a_portador_codigo,
				  tipocobranca_codigo = a_tipocobranca_codigo,
				  status_reg          = a_status_reg,
				  moeda_codigo        = a_moeda_codigo,
				  valor_total         = a_valor_total,
				  valor_saldo         = a_valor_saldo,
				  valor_jurosmora     = a_valor_jurosmora,
				  valor_desconto      = a_valor_desconto,
				  valor_acrescimo     = a_valor_acrescimo,
				  numeroboleto        = a_numeroboleto,
				  per_jurosmora       = a_per_jurosmora,
				  per_acrescimo       = a_per_acrescimo,
				  per_multa           = a_per_multa,
				  vendedor_codigo     = a_vendedor_codigo,
				  datainclusao        = current_date,
				  horainclusao        = current_time,
				  usuarioinclusao     = a_usuarioinclusao
            WHERE cadastro_codigo     = a_cadastro_codigo
              AND fatura              = a_fatura
              AND parcela             = a_parcela;

            EXIT  WHEN found;

            BEGIN
                INSERT INTO pagar
                          ( cadastro_codigo,
						    fatura,
						    parcela,
						    filial_codigo,
						    emissao,
						    vcto,
						    prorrogacao,
						    dataref,
						    docto,
						    portador_codigo,
						  	tipocobranca_codigo,
						    status_reg,
						    moeda_codigo,
						    valor_total,
						    valor_saldo,
						  	valor_jurosmora,
						  	valor_desconto,
						  	valor_acrescimo,
						  	numeroboleto,
						  	per_jurosmora,
						  	per_acrescimo,
						  	per_multa,
						  	vendedor_codigo,
						  	dataalteracao,
						  	horaalteracao ,
						  	usuarioalteracao )
                     VALUES(a_cadastro_codigo,      
							a_fatura,               
							a_parcela,         
							a_filial_codigo,        
							a_emissao,              
							a_vcto,                 
							a_prorrogacao,          
							a_dataref,              
							a_docto,                
							a_portador_codigo,      
							a_tipocobranca_codigo,  
							a_status_reg,           
							a_moeda_codigo,         
							a_valor_total,          
							a_valor_saldo,          
							a_valor_jurosmora,      
							a_valor_desconto,       
							a_valor_acrescimo,      
							a_numeroboleto,         
							a_per_jurosmora,        
							a_per_acrescimo,        
							a_per_multa,            
							a_vendedor_codigo,      
							current_date,        
							current_time ,       
							a_usuarioalteracao);
                EXIT ;

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

  