Viendo 3 entradas - de la 1 a la 3 (de un total de 3)
  • Autor
    Entradas
  • #46517
    jose.geneos
    Participante

    Estimados/as les comento un problema que tengo.

    Necesito poder calcular retenciones a clientes bajo un régimen que tiene escalas.

    Configuro el esquema de retención con el parámetro “Porcentaje a Retener” con Tipo de Parámetro = “Rango” y no me funciona, cuando quiero probar con Tipo de Parámetro = “Valor” para ver si de esa forma me sale sigue sin calcular y el problema es que aunque cambie el tipo siempre me queda el campo is_range = ‘Y’ y por lo que veo es por lo siguiente:

    protected boolean beforeSave(boolean newRecord){
    // Si es rango, se anula el valor del campo Valor (utilizado para parámetros
    // que solo tienen un valor.
    if(Util.isEmpty(getParamType())){
    setParamType(PARAMTYPE_Valor);
    setValor(“”);
    }
    if(getParamType().equals(PARAMTYPE_Rango)) {
    this.setValor(“”);
    this.setIs_Range(true);
    }
    //Si el parámetro es “Por Región Origen Y Destino” y el valor es ‘Y’
    // no debe permitir guardar el parámetro si el esquema de retención no tiene región seteada
    MRetencionSchema retencionSchema = new MRetencionSchema(getCtx(), getC_RetencionSchema_ID(), get_TrxName());
    if(getName().equals(NAME_PorRegionOrigenYDestino) && getValor().equals(“Y”) && (retencionSchema.getC_Region_ID() == 0)){
    log.saveError(Msg.getMsg(getCtx(), “RetentionSchemaWithOutRegionParameter”),””);
    return false;
    }
    return true;
    }

    Una vez que paso a “Rango” cambia el campo por medio de this.setIs_Range(true); y esto ya queda así, por lo que vemos sin posibilidad de volver a valor ‘N’.

    Alguien tiene funcionando retenciones por rango en la versión 16.04 ??

    Siguiendo el código da la sensación de que nunca calcularía por rangos, porque en un momento comienza a pasar con valor null el campo “baseImponible” y ese valor corta el algoritmo.

    Desde ya muchas gracias.

    Saludos
    José

    #46518
    jose.geneos
    Participante

    Ampliado el seguimiento del código para el (NO) cálculo de retenciones cuando esta configurado por rango.

    RetencionGanancias.java
    Linea 77

    // Se obtiene el valor del parámetro Porcentaje a Retener (T)
    setPorcentajeRetencion(getParamValueBigDecimal(
    MRetSchemaConfig.NAME_PorcentajeARetener, Env.ZERO));

    AbstractRetencionProcessor.java
    Linea 247

    protected BigDecimal getParamValueBigDecimal(String paramName,
    BigDecimal defaultValue) {
    return getParamBigDecimal(paramName, defaultValue, null);
    }

    AbstractRetencionProcessor.java
    Linea 257

    Base Imponible lega con null !!

    protected BigDecimal getParamBigDecimal(String paramName, BigDecimal defaultValue, BigDecimal baseImponible){
    Object value = getParamValue(paramName, defaultValue, baseImponible);
    BigDecimal valueDecimal = null;
    if(value != null){
    if(value instanceof BigDecimal){
    valueDecimal = (BigDecimal)value;
    }
    else{
    valueDecimal = new BigDecimal(((String)value).replaceAll(“,”, “.”));
    }
    }
    return valueDecimal;
    }

    AbstractRetencionProcessor.java
    Linea 272

    Base Imponible lega con null !!!

    protected Object getParamValue(String paramName, Object defaultValue, BigDecimal baseImponible){
    Object value = null;
    // Obtiene el MRetSchemaConfig con el nombre de parámetro pasado.
    MRetSchemaConfig param = getRetencionSchema().getParameter(paramName);
    // Si hay configuración…
    if (param != null) {
    // Si es rango busco el rango que incluye al monto, sino obtengo el
    // valor del parámetro
    if(param.is_Range()){
    value = MRetSchemaConfig.getRangeApplyValue(param.getID(),
    baseImponible, getTrxName());
    }
    else{
    value = param.getValor();
    }
    }
    // Se retorna el valor o el defaultValue en caso de que el value sea
    // null.
    return (value == null ? defaultValue : value);
    }

    MRetSchemaConfig.java
    Linea 45

    /**
    * Valor que se debe aplicar del rango de la configuración parámetro a
    * partir del monto parámetro. La consulta se ordena con el monto inicial
    * ascendente, o sea, si se definen rangos donde el valor final coincide con
    * el valor inicial de otro rango, se tomará el rango con valor inicial
    * menor
    *
    * @param retSchemaConfigID
    * id de configuración del esquema de retención
    * @param amt
    * monto de evaluación
    * @param trxName
    * transacción actual
    * @return el valor a aplicar donde el parámetro amt esté incluído, null en
    * caso que el parámetro de configuración sea null o 0, el monto de
    * evaluación sea null o no se haya encontrado rango para ese monto
    */
    public static Object getRangeApplyValue(Integer retSchemaConfigID, BigDecimal amt, String trxName){

    // Geneos: el problema es que acá siempre llega con amt = null !!!

    if (Util.isEmpty(retSchemaConfigID, true) || amt == null)
    return null;
    Object valueObj = DB
    .getSQLObject(
    trxName,
    “SELECT value_apply FROM c_retschema_range WHERE c_retschema_config_id = ? AND ? BETWEEN value_from AND value_to ORDER BY value_from”,
    new Object[] { retSchemaConfigID, amt });
    return valueObj;
    }

    #46519
    Pablo Corace
    Participante

    Hola José,
    Hasta donde yo se las retenciones son a proveedores no a clientes. Es decir si un proveedor nos hace una factura de 100 y nosotros somos agentes de retención le pagamos 80 y por los 20 restantes le damos el certificado de retención. No veo como aplicar esto a un cliente.
    A un cliente se le hacen percepciones, es decir se les cobra demás en la factura los impuestos en los cuales somos agentes de percepción.
    Disculpá la aclaración que capaz no tenga nada que ver con tu problema pero me pareció pertinente.
    Saludos!

Viendo 3 entradas - de la 1 a la 3 (de un total de 3)
  • Debes estar registrado para responder a este debate.