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: importe a amortizar.residual: pendiente de amortizar. Se calcula entest()y no se edita.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.
- LineaAmortizacion (
lineasamortizaciones): un periodo del plan.anoyperiodo. Lafechase recalcula entest()a partir de ellos congetDateFromPeriod().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 y enlaza el asiento de baja.
- 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. - Join\Amortizacion: modelo del listado, que añade el nombre corto de la empresa.
🔄 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 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. - 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.
- 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
codsubcuentadebepor el capital, Debecodsubcuentainterespor el interés y Habercodsubcuentahaberpor la cuota.
- Tipo constante: Debe
- AmortizationFinalizeToAccounting: asiento de fin de vida. Informa
idasientofinvidayfechafinvidautil.- Haber
codsubcuentacierreporvalor. - Debe
codsubcuentahaberpor el total amortizado. - Debe
codsubcuentaperdidaspor lo pendiente.
- 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.
- 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.