create or replace function fn_fco_tarifa_arp(pch_compania   char,
                                             pch_trabajador char)
  return number is
  vch_agt_ctr    char(10); -- centro de trabajo
  vdc_aux        number(19, 6);
  vdc_porcentaje number(9, 8);
  vvc_metodo     varchar2(20);
  vti_metodo     number;
  vvc_var_tra    varchar2(20);
  vti_secuencia  number;
  vsi_impuesto   number;
  vch_agr_tra    char(10);
  vch_dato       char(10);
  vdc_var_pto    number(15, 6);
begin

  begin
    select dato
      into vch_agt_ctr
      from vw_fdt_parametros
     where pais = 'COL' and compania = pch_compania and
           parametro = 'autoliq' and secuencia = 24;
  exception
    when no_data_found then
      vch_agt_ctr := null;
  end;

  begin
    select dato
      into vvc_metodo
      from vw_fdt_parametros
     where pais = 'COL' and compania = pch_compania and
           parametro = 'autoliq' and secuencia = 33;
  exception
    when no_data_found then
      vvc_metodo := null;
  end;

  begin
    select dato
      into vvc_var_tra
      from vw_fdt_parametros
     where pais = 'COL' and compania = pch_compania and
           parametro = 'autoliq' and secuencia = 34;
  exception
    when no_data_found then
      vvc_var_tra := null;
  end;

  begin
    select to_number(dato)
      into vsi_impuesto
      from vw_fdt_parametros
     where pais = 'COL' and compania = pch_compania and
           parametro = 'autoliq' and secuencia = 35;
  exception
    when no_data_found then
      vsi_impuesto := null;
  end;

  begin
    select substr(ltrim(dato), 1, 10)
      into vch_agr_tra
      from vw_fdt_parametros
     where pais = 'COL' and compania = pch_compania and
           parametro = 'autoliq' and secuencia = 36;
  exception
    when no_data_found then
      vch_agr_tra := null;
  end;

  vvc_metodo := nvl(vvc_metodo, '1');

  if isnumeric(substr(vvc_metodo, 1, 1)) = 1 then
    vti_metodo := to_number(substr(vvc_metodo, 1, 1));
  else
    vti_metodo := 1;
  end if;

  vvc_var_tra := nvl(vvc_var_tra, '00');

  if isnumeric(substr(vvc_var_tra, 1, 2)) = 1 then
    vti_secuencia := to_number(substr(vvc_var_tra, 1, 2));
  else
    vti_secuencia := 0;
  end if;

  if vti_metodo = 1 then
    -- método sugerido: ctr en [rel_trab_agr] y % en fco_centros_trabajo
    begin
      select a.tarifa
        into vdc_aux
        from fco_centros_trabajo a, rel_trab_agr b
       where a.compania = b.compania and a.centro_trabajo = b.dato and
             a.compania = pch_compania and b.agrupacion = vch_agt_ctr and
             b.trabajador = pch_trabajador;
    exception
      when no_data_found then
        vdc_aux := 0;
    end;
  end if;

  if vti_metodo = 2 then
    -- método coca COLa: % en variable del trabajador
    select variable_trabajador / 10
      into vdc_aux
      from variables_trabajador
     where compania = pch_compania and trabajador = pch_trabajador and
           secuencia = vti_secuencia;
  end if;

  if vti_metodo = 3 then
    -- otros clientes: nivel en variable y % en tabla de impuestos
    -- nivel
    begin
      select variable_trabajador
        into vdc_aux
        from variables_trabajador
       where compania = pch_compania and trabajador = pch_trabajador and
             secuencia = vti_secuencia;
    exception
      when NO_DATA_FOUND then
        vdc_aux := 1;
/*
        dbms_output.put_line('Trabajador: ' || pch_trabajador);
        Raise_application_error(-20005, 'No tiene definido nivel de riesgo');
*/
    end;
  
    -- porcentaje
    select porcentaje
      into vdc_aux
      from impuestos
     where impuesto = vsi_impuesto and vdc_aux between limite_inferior and
           limite_superior;
  end if;

  if vti_metodo = 4 then
    -- método colcafé y la bastilla
    -- nivel
    select dato
      into vch_dato
      from rel_trab_agr
     where compania = pch_compania and trabajador = pch_trabajador and
           agrupacion = vch_agr_tra;
  
    if isnumeric(vch_dato) = 1 then
      vdc_aux := to_number(vch_dato);
    else
      vdc_aux := 0;
    end if;
  
    -- porcentaje
    select porcentaje / 100000
      into vdc_aux
      from impuestos
     where impuesto = vsi_impuesto and vdc_aux between limite_inferior and
           limite_superior;
  
  end if;

  if vti_metodo = 5 then
    -- Metodo de Porvenir: Valor unico en variable de nomina
    begin
      select real
        into vdc_aux
        from defn_variables_ns var, parametros_rh par
       where var.compania = pch_compania and
             var.variable = 'var_nom_' || vvc_var_tra and
             var.compania = par.compania(+) and
             var.variable = par.parametro_rh(+);
    exception
      when no_data_found then
        return(0);
    end;
  end if;

  if vti_metodo = 6 then
    -- Metodo de MEALS DE COLOMBIA
    -- Nivel en variable 1 del puesto y % en variable de nomina sg nivel
    begin
      select variable_puesto_01
        into vdc_var_pto
        from puestos pu, plazas pl
       where pu.puesto = pl.puesto and pl.compania = pch_compania and
             pl.trabajador = pch_trabajador;
    exception
      when others then
        vdc_var_pto := null;
    end;
    if vdc_var_pto is null then
      vdc_aux := 0;
    else
      if vdc_var_pto = 1 then
        begin
          select real / 1000
            INTO vdc_aux
            from parametros_rh
           where parametro_rh = 'var_nom_20';
        exception
          when others then
            vdc_aux := 0.00522;
        end;
      end if;
      if vdc_var_pto = 2 then
        begin
          select real / 1000
            INTO vdc_aux
            from parametros_rh
           where parametro_rh = 'var_nom_21';
        exception
          when others then
            vdc_aux := 0.01044;
        end;
      end if;
      if vdc_var_pto = 3 then
        begin
          select real / 1000
            INTO vdc_aux
            from parametros_rh
           where parametro_rh = 'var_nom_22';
        exception
          when others then
            vdc_aux := 0.02436;
        end;
      end if;
    end if;
  end if;

  if vdc_aux > 1 then
    vdc_aux := vdc_aux / 100;
    vdc_aux := vdc_aux / 1000;
  end if;

  vdc_porcentaje := vdc_aux;
  return nvl(vdc_porcentaje, 0);
end fn_fco_tarifa_arp;
/
