Inicio › Foros › Foro principal › Desarrolladores › Posible bug en calculos de retenciones por rango › Respuesta a: Posible bug en calculos de retenciones por rango

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;
}