[[TOC(Specs,SpecsModLiq,SpecsFórmulasCanon)]] = Fórmulas de cálculo de Canon = == Contexto == El cálculo de las fórmulas de [wiki:Canon_Superficiario canon] para cada anualidad se hace de forma diferente dependiendo principalmente de: * La ley que ampare el título * La etapa del título Asímismo, cada ley hace uso de otras variables que ayudan al cálculo, como: * Salario Mínimo Diario Legal Vigente (smdlv) * Anualidad * Área (Hectáreas) Así que para hacer una formulación efectiva para cada etapa, es necesario contar con fórmulas que puedan ser procesadas y ejecutadas de forma automática. Estas fórmulas deben contar con una cadena de condiciones que determinen el valor del canon para cada una de estas condiciones. == Problemática == El problema a solucionar es el siguiente: * El usuario debe poder manejar las fórmulas de cálculo de canon desde el [wiki:mod_liq módulo de liquidaciones] * Las fórmulas se utilizan en el momento de generación de las liquidaciones * De forma periódica * Por demanda == Conceptos == === Algoritmo === Para ilustrar esto de una forma más clara, podemos ver el cálculo para las leyes 685 y 1382, en [wiki:Etapa etapa] de '''exploración''': ==== Ley 685 ==== * Si el área no supera las 2000 hectáreas * El valor del canon es 1 smdlv por el área * Si el área es mayor a las 2000 hectáreas e inferior a las 5000 * El valor del canon es 2 smdlv por el área * Si el área es mayor a las 5000 hectáreas e inferior a las 10000 * El valor del canon es 3 smdlv por el área ==== Ley 1382 ==== * Si la anualidad actual es inferior a 5 años * El valor del canon es 1 smdlv por el área * Si la anualidad actual está entre 6 y 7 años * El valor del canon es 1.25 smdlv por el área * Si la anualidad actual es igual o superior a 8 años * El valor del canon es 1.5 smdlv por el área Se pueden ver diferentes variables y constantes en estos cálculos. === Lenguaje === Descomponiendo este cálculo en diferentes elementos, podemos ver lo siguiente: 1. Ley 685 ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || AREA || ENTRE || 0 || Y || 2000 || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 1 || * || SMDLV || * || AREA || ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || AREA || ENTRE || 2001 || Y || 5000 || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 2 || * || SMDLV || * || AREA || ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || AREA || ENTRE || 5001 || Y || 10000 || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 3 || * || SMDLV || * || AREA || 2. Ley 1382 ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || ANUALIDAD || ENTRE || 1 || Y || 5 || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 1 || * || SMDLV || * || AREA || ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || ANUALIDAD || ENTRE || 6 || Y || 7 || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 1.25 || * || SMDLV || * || AREA || ||= Elemento =||= Evaluación =||= Variable =||= Operador =||= Constante =||= Operador =||= Constante =|| ||= Condición =|| SI || ANUALIDAD || MAYOR || 8 || || || ||= Elemento =||= Evaluación =||= Constante =||= Operador =||= Variable =||= Operador =||= Variable =|| ||= Expresión =|| ENTONCES || 1.5 || * || SMDLV || * || AREA || Podemos ver entonces que hay un ''léxico'' específico que involucra identificar... * Evaluación * Variable (o parámetro) * Constante * Operador ...Para cada ''Elemento'', y que cada ''Elemento'' se comporta de forma diferente, es decir, tiene una ''semántica'' inherente. También se puede ver que cada ''Condición'' viene acompañada de una ''Expresión'', van por pares de esta forma: * Condición '''1''' * Expresión '''1''' * Condición '''2''' * Expresión '''2''' * ... * ... * Condición '''n''' * Expresión '''n''' Con estos elementos, podemos definir un léxico formal. ==== Léxico ==== El siguiente léxico toma elementos de [http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form BNF]: * ::= [ if ] * ::= [ then ] * ::= * ::= * ::= [ float ] * ::= [ param ] * ::= | * ::= [ > | < | >= | <= | == | != ] * ::= | * ::= [ + | - | * | / ] * := [ ] * | () [ ] * * ::= * ::= * ::= [ ] * == Implementación == === Liquidaciones automáticas === Las liquidaciones automáticas se hacen para aquellos títulos que estén próximos a cumplir su siguiente anualidad, es decir, aquellos que la fecha de hoy más un lapso establecido, sea mayor o igual al cumpleaños. En pseudo código: '''Si''' título'''.'''anualidad actual'''.'''fecha '''<=''' hoy '''+''' lapso establecido '''entonces''' ''ejecutar liquidación en título'' Y ''ejecutar liquidación en título'' sería: 1. Cargar datos de la liquidación 2. Evaluar fórmula valor de liquidación = ( ''ejecutar fórmula'' para ''norma'' '''=''' título'''.'''norma actual, ''etapa'' '''=''' título'''.'''etapa actual, ''anualidad'' '''=''' título'''.'''anualidad_actual, ) Y ''ejecutar fórmula'' sería: * Entender fórmula * Reemplazar parámetros * Buscar valores de variables * Ejecutar fórmula === Liquidaciones por demanda ===