Documentación técnica del plugin Amortizaciones

Documento para desarrolladores que necesiten mantener el plugin, ampliarlo o integrarlo con otros. Describe los modelos, los procesos, los asientos que genera y los puntos de extensión.

🗃️ Modelos y tablas

  • Amortizacion (amortizaciones): ficha del inmovilizado o del préstamo.
    • tipo: constante o bancario.
    • contabilizacion: anual, trimestral o mensual. En el tipo bancario se fuerza mensual.
    • periodos: años en el tipo constante, cuotas en el bancario.
    • valor: precio de adquisición.
    • residualvalue: valor residual, por defecto 0. Solo en el tipo constante: en el bancario test() lo fuerza a 0. test() rechaza valores negativos o, si es mayor que 0, iguales o mayores que valor (residual-value-error). Se bloquea al generar el plan, porque la vista de contabilización pasa a solo lectura.
    • residual: pendiente de amortizar, valor menos residualvalue menos getTotalAmortized(). Se calcula en test(), no se edita y queda a 0 cuando hay asiento de baja (idasientofinvida). getTotalAmortized() suma amortizado de las líneas; en el tipo bancario suma capital de las cuotas con amortizado > 0, porque lo amortizado de un préstamo es el capital devuelto y no la cuota.
    • fechainicio; fechafin, calculada en test() a partir de los periodos.
    • Subcuentas: codsubcuentacierre, codsubcuentadebe, codsubcuentahaber, codsubcuentabeneficios, codsubcuentaperdidas y, en el tipo bancario, codsubcuentainteres. En el bancario, codsubcuentadebe es la de capital y codsubcuentahaber la de banco.
    • Datos del préstamo: tasaanual, cargo (0 último día del mes, 1 primer día) y cuotainicial.
    • Enlaces: idfactura (factura de compra), idfacturaventa (factura de venta) e idasientofinvida (asiento de baja), con fechafinvidautil como fecha de baja.
    • Importes calculados: getDepreciableBase() (base amortizable, valor - residualvalue), getPendingAmount() (base amortizable menos lo amortizado) y getBookValue() (valor neto contable, valor menos lo amortizado). Este último es lo que se da de baja al vender o finalizar y coincide con residualvalue al terminar el plan.
  • LineaAmortizacion (lineasamortizaciones): un periodo del plan.
    • ano y periodo. La fecha se recalcula en test() a partir de ellos con getDateFromPeriod(), salvo en la línea de cierre o con keepDate activo. keepDate es un atributo que no se guarda en la tabla: lo usa la baja para la línea parcial.
    • cantidad (importe a amortizar), amortizado y, en el tipo bancario, capital e interes.
    • idasiento: asiento del periodo.
    • El periodo 99 (PERIOD_FINALIZE) es la línea de cierre que se crea al vender o dar de baja. Conserva su fecha, enlaza el asiento de baja, guarda en cantidad el valor neto contable en el momento de la baja (getBookValue()) y deja amortizado a 0.
  • AmortizacionPlantilla, AmortizacionTabla y AmortizacionSubcuenta: catálogos de plantillas, periodos legales y ayuda de cuentas. Los datos de España se cargan desde Data/Codpais/ESP solo al crear cada tabla, así que los cambios en esos CSV no llegan a las instalaciones existentes. La excepción es la corrección de las subcuentas de las plantillas con cierre 206 y 214, que aplica la migración Migration/FixSpainTemplateSubaccounts: solo cambia los valores que siguen siendo los erróneos.
  • Join\Amortizacion: modelo del listado, que añade el nombre corto de la empresa.
  • Los modales de venta y fin de vida de EditAmortizacion muestran el valor neto contable (getBookValue()), y la venta lo propone como importe.

🔄 Procesos

Están en Lib/Amortizaciones, y los que escriben datos se ejecutan dentro de una transacción.

  • AmortizationPlan: crea el plan. Delega en AmortizationConstant (cuota lineal sobre getDepreciableBase() con tres tratamientos del primer periodo) o en AmortizationBank (sistema francés, con la cuota inicial como primera línea de solo intereses), según el tipo. AmortizationBank genera el cuadro ya redondeado a 2 decimales: cuota redondeada, interés sobre el pendiente redondeado y última cuota que cancela exactamente lo que queda.
  • AmortizacionVender: crea la factura de venta si no se indica una existente, cierra el plan hasta la fecha de la factura, genera el asiento de venta y crea la línea de cierre.
  • AmortizacionFinalizar: igual que la venta pero sin factura, con la fecha indicada por el usuario y el asiento de fin de vida.
  • AmortizeUntilDateTrait: cierre del plan que comparten las dos anteriores. Contabiliza las líneas pendientes hasta la fecha de baja; la primera posterior se contabiliza por la parte proporcional de días, con fecha de baja y keepDate, y el resto se borran. En el periodo anual se toma del 01-01 al 31-12 real, sin el día de contabilización anual, y si la baja cae en el primer periodo se cuenta desde fechainicio.
  • EditAmortizacionAction: acciones de la pestaña de líneas. Editar e insertar líneas, datos de una línea o de la factura de compra para los modales, y autocompletado de asientos de la misma fecha que la línea.
  • AmortizationDateUpdater: actualiza la fecha de las líneas anuales sin asiento cuando cambia el ajuste del día de contabilización.
  • AmortizationInfo: datos de las ayudas de periodos legales y cuentas que se muestran al pie de las pestañas, mediante los bloques de View/Block.

📒 Asientos

Las clases de Lib/Accounting extienden AccountingClass del core. Todas comprueban que el ejercicio de la fecha exista y esté abierto, y guardan el asiento con editable = false.

  • AmortizationPlanToAccounting: un asiento por línea, con la fecha de la línea. Al contabilizar informa idasiento y pone amortizado igual a cantidad.
    • Tipo constante: Debe codsubcuentadebe, Haber codsubcuentahaber.
    • Tipo bancario: Debe codsubcuentainteres por el interés redondeado, Debe codsubcuentadebe por la cuota menos ese interés y Haber codsubcuentahaber por la cuota. Así el asiento cuadra aunque capital e interes no estén redondeados, como en los planes generados antes de redondear el cuadro.
  • AmortizationFinalizeToAccounting: asiento de fin de vida. Informa idasientofinvida y fechafinvidautil.
    • Haber codsubcuentacierre por valor.
    • Debe codsubcuentahaber por el total amortizado.
    • Debe codsubcuentaperdidas por el valor neto contable (valor menos el total amortizado), que incluye el valor residual.
  • AmortizationSellToAccounting: asiento de venta. Informa idasientofinvida y fechafinvidautil.
    • Haber codsubcuentacierre por valor.
    • Debe codsubcuentahaber por el total amortizado.
    • Debe la subcuenta de venta por el importe de la venta, para anular lo que la factura de venta llevó a esa subcuenta. Es el «Importe» del modal, no el neto de la factura, que puede incluir otros conceptos.
    • La diferencia va al Haber de codsubcuentabeneficios o al Debe de codsubcuentaperdidas.

🧩 Extensiones

Se registran en Init::init().

  • Extension/Model/Asiento: al borrar un asiento, las líneas enlazadas quedan con amortizado = 0 y sin idasiento, y vuelven a estar pendientes. Las líneas se leen en deleteBefore() porque la clave ajena de lineasamortizaciones.idasiento es ON DELETE SET NULL y, tras el borrado, ya no se podrían localizar.
  • Extension/Controller/EditSettings: al guardar la pestaña SettingsAmortizaciones del panel de control, ejecuta AmortizationDateUpdater.

⚙️ Ajustes

  • amortizaciones.annualday: día de diciembre en que se fechan las líneas anuales (1 a 31, por defecto 31). Se crea en Init::update() y se lee con LineaAmortizacion::annualDay(), que devuelve el valor por defecto si el guardado no es válido. No afecta a las líneas mensuales ni trimestrales.

🔒 Reglas de integridad

  • Una ficha no se puede borrar si alguna de sus líneas tiene asiento.
  • Al borrar una línea con asiento se borra también el asiento, desbloqueándolo antes. El ejercicio cerrado y la regularización de IVA bloqueada siguen impidiéndolo.
  • Al modificar una línea se vuelve a guardar la ficha, para recalcular el pendiente de amortizar.
  • Con el plan creado, la pestaña de contabilización queda en solo lectura y el tipo, la fecha de inicio, el importe y la divisa no se pueden cambiar.
  • Con el asiento de baja informado (idasientofinvida), la ficha queda en solo lectura y no se pueden borrar líneas.
  • La venta y el fin de vida solo están disponibles para el tipo constante.
  • La pestaña Pendiente del listado muestra las líneas sin asiento con fecha hasta hoy. En diciembre muestra las de ano hasta el año en curso, para poder contabilizar el año completo antes del cierre.
Cookies
Usamos cookies necesarias para el funcionamiento del sitio y cookies opcionales para recordar tus preferencias y mejorar tu experiencia. Puedes aceptarlas todas, rechazarlas o configurar tus preferencias

Soporte