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:constanteobancario.contabilizacion:anual,trimestralomensual. En el tipo bancario se fuerzamensual.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 bancariotest()lo fuerza a 0.test()rechaza valores negativos o, si es mayor que 0, iguales o mayores quevalor(residual-value-error). Se bloquea al generar el plan, porque la vista de contabilización pasa a solo lectura.residual: pendiente de amortizar,valormenosresidualvaluemenosgetTotalAmortized(). Se calcula entest(), no se edita y queda a 0 cuando hay asiento de baja (idasientofinvida).getTotalAmortized()sumaamortizadode las líneas; en el tipo bancario sumacapitalde las cuotas conamortizado > 0, porque lo amortizado de un préstamo es el capital devuelto y no la cuota.fechainicio;fechafin, calculada entest()a partir de los periodos.- Subcuentas:
codsubcuentacierre,codsubcuentadebe,codsubcuentahaber,codsubcuentabeneficios,codsubcuentaperdidasy, en el tipo bancario,codsubcuentainteres. En el bancario,codsubcuentadebees la de capital ycodsubcuentahaberla de banco. - Datos del préstamo:
tasaanual,cargo(0 último día del mes, 1 primer día) ycuotainicial. - Enlaces:
idfactura(factura de compra),idfacturaventa(factura de venta) eidasientofinvida(asiento de baja), confechafinvidautilcomo fecha de baja. - Importes calculados:
getDepreciableBase()(base amortizable,valor - residualvalue),getPendingAmount()(base amortizable menos lo amortizado) ygetBookValue()(valor neto contable,valormenos lo amortizado). Este último es lo que se da de baja al vender o finalizar y coincide conresidualvalueal terminar el plan.
- LineaAmortizacion (
lineasamortizaciones): un periodo del plan.anoyperiodo. Lafechase recalcula entest()a partir de ellos congetDateFromPeriod(), salvo en la línea de cierre o conkeepDateactivo.keepDatees un atributo que no se guarda en la tabla: lo usa la baja para la línea parcial.cantidad(importe a amortizar),amortizadoy, en el tipo bancario,capitaleinteres.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 encantidadel valor neto contable en el momento de la baja (getBookValue()) y dejaamortizadoa 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/ESPsolo 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ónMigration/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
EditAmortizacionmuestran 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 sobregetDepreciableBase()con tres tratamientos del primer periodo) o enAmortizationBank(sistema francés, con la cuota inicial como primera línea de solo intereses), según el tipo.AmortizationBankgenera 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 desdefechainicio. - 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
idasientoy poneamortizadoigual acantidad.- Tipo constante: Debe
codsubcuentadebe, Habercodsubcuentahaber. - Tipo bancario: Debe
codsubcuentainterespor el interés redondeado, Debecodsubcuentadebepor la cuota menos ese interés y Habercodsubcuentahaberpor la cuota. Así el asiento cuadra aunquecapitaleinteresno estén redondeados, como en los planes generados antes de redondear el cuadro.
- Tipo constante: Debe
- AmortizationFinalizeToAccounting: asiento de fin de vida. Informa
idasientofinvidayfechafinvidautil.- Haber
codsubcuentacierreporvalor. - Debe
codsubcuentahaberpor el total amortizado. - Debe
codsubcuentaperdidaspor el valor neto contable (valormenos el total amortizado), que incluye el valor residual.
- Haber
- AmortizationSellToAccounting: asiento de venta. Informa
idasientofinvidayfechafinvidautil.- Haber
codsubcuentacierreporvalor. - Debe
codsubcuentahaberpor 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
codsubcuentabeneficioso al Debe decodsubcuentaperdidas.
- Haber
🧩 Extensiones
Se registran en Init::init().
- Extension/Model/Asiento: al borrar un asiento, las líneas enlazadas quedan con
amortizado = 0y sinidasiento, y vuelven a estar pendientes. Las líneas se leen endeleteBefore()porque la clave ajena delineasamortizaciones.idasientoesON DELETE SET NULLy, tras el borrado, ya no se podrían localizar. - Extension/Controller/EditSettings: al guardar la pestaña
SettingsAmortizacionesdel panel de control, ejecutaAmortizationDateUpdater.
⚙️ Ajustes
amortizaciones.annualday: día de diciembre en que se fechan las líneas anuales (1 a 31, por defecto 31). Se crea enInit::update()y se lee conLineaAmortizacion::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
fechahasta hoy. En diciembre muestra las deanohasta el año en curso, para poder contabilizar el año completo antes del cierre.