mradosta / pragtico

Other
1 stars 2 forks source link

Tildes de tipo de liquidación en conceptos, posiblemente no funcionan correctamente #13

Open JavierAder opened 8 years ago

JavierAder commented 8 years ago

Buenas, antes que nada me presento, ya que es mi primer posteo: Soy Javier Ader, y vengo hace unos meses trabajando con Pragtico, creo que corrigiendo algunos bugs e intentando encarar algunas modificaciones mucho más generales, entre ellas: hacerlo correr sobre nginx sobre Windows y así evitar Apache y sus instaladores poco mantenidos, e intentar migrar Pragtico a Cake 2.7 y así evitar versiones de php antiguas y problemas de performance... Realmente nunca tuve el tiempo para publicar estas cosas acá, así que pido disculpas y espero en cuanto pueda ir publicando lo que encontré y lo que vaya encontrando.

Ok, yendo al tema actual: siguiendo una issue publicado anteriormente y mirando el código, creo que hay algo que no funciona como "se supone" (entre comillas porque quizá sea ese justamente el funcionamiento correcto) con respecto a los tildes de de tipo de liquidación en la que se permite usar el mismo (normal, sac, final, etc). En particular, cuando uno liquida sac o final (posiblemente también pase en otras tipos de liquidaciones), el foreach en la linea 145 (modelo liquidacion.php) https://github.com/mradosta/pragtico/blob/master/app/models/liquidacion.php#L445

            foreach ($this->Relacion->RelacionesConcepto->Concepto->findConceptos('Relacion',
                    array(      'relacion'  => $relationship,
                                'desde'     => $this->getVarValue('#fecha_desde_liquidacion'),
                                'hasta'     => $this->getVarValue('#fecha_hasta_liquidacion'))) as $cCod => $concepto) {
                if (!$this->__isValid($concepto, array_keys($novedades['conceptos']))) {
                    $this->__resolvConceptToZero($cCod);
                } else {
                    $this->setConcept(array($cCod => $concepto));
                }
            }

si entiendo bien hace lo siguiente: busca todos los conceptos a nivel de relación para la liquidación en curso, y luego los filtra si no corresponden para el tipo de liquidación que estamos haciendo. Ahora bien, el filtrado se hace a nivel de código mediantes __isValid(....) y esta función no hace lo que uno creería correcto. https://github.com/mradosta/pragtico/blob/master/app/models/liquidacion.php#L486

/**
 * Returns true when the concept is valid for the current receipt type, false in other cases.
*/
    function __isValid($concept, $novelties) {
        if (((int)$concept['liquidacion_tipo'] & $this->__receiptTypeMapping[$this->__receiptType]) === $this->__receiptTypeMapping[$this->__receiptType]
            || in_array($concept['codigo'], $novelties)
            || $concept['imprimir'] == 'No'
            || $concept['tipo'] == 'Deduccion') {
            //|| substr($concept['imprimir'], -9) === '[Forzado]') {
            return true;
        } else {
            return false;
        }
    }

parece ser que no mira SOLO en tipo de liquidación, hay excepciones; tambien considera valido (independientemente de los tildes de tipo de liquidación en el concepto, lo cual es chequeado en la primer condición del if) si 1) el concepto esta en la lista de novedades (supongo que eso esta perfecto) o 2) si es "no imprimible" (realmente no se si estaría bien o mal; creo que sí, porque esto debe estar pensado para "conceptos auxiliares" que en general solo se calculan para poder evaluar otros conceptos) o 3) si es de tipo Deducción

Especialmente para el caso 3 es mi duda: parece que los tildes para tipo de liquidación en los conceptos SOLO se aplican para conceptos Remunerativos o No Remunerativos, pero NO para de tipo Deducción. Otra forma de decirlo: las conceptos de tipo Deducción SIEMPRE son agregados a la liquidación independientemente de cual sea el tipo de la misma. Sí esa es la idea, tal vez estaría bueno agregar este detalle en la documentación.

Finalmente, aún si ese es el caso, vale aclarar (bah, creo) que uno siempre puede hacer que un concepto de tipo Deducción sea "filtrado indirectamente" mediante la formula, haciendo que se comporte como una deducción efectiva para las liquidaciones en las que deba aplicarse realmente y en los casos restantes que evalúe a cero (esto es exactamente lo mismo que hace __resolvConceptToZero). Por ej, digamos que se agrega concepto DeduccionNoEnSacOFinal que es una deduccion fija de 500 pesos que no se tiene que hacer en el sac y en e final; un podría poner la formula (basada en la formula de Obra Social que también es una deducción y por lo tanto se aplica siempre) = if (or('#tipo_liquidacion' = 'sac', '#tipo_liquidacion' = 'final'), 0, 500)

Tiene sentido hacer esto? O tal vez sería mejor modificar __inValid para que no haga la excpeción para las deducciones (esto es, que las filtre de igual manera que filtra a los restantes tipos)?

Gracias

mradosta commented 8 years ago

Javier, gracias por tomarte el tiempo de reportar en detalle el problema. Migrar a Cake 2.7 seria un gran avance para Pragtico, Te invito que hagas un fork con lo poco o mucho de avance que tengas y vemos si lo podemos encarar de una buena vez al tema.

Con respecto al reporte, a priori me atrevo a decir que es un BUG y debe modificarse el metodo __isValid, pero es un bug "hecho a drede", por lo que me hace dudar. Voy a hacer algunas pruebas y vuelvo con mas detalles.