Control de Préstamos
El reto principal
Un préstamo no es una fila en una tabla: es un contrato con una tabla de cuotas, un saldo que cambia con cada abono y un historial que tiene que cuadrar hacia atrás en cualquier momento. El reto fue que el saldo mostrado en pantalla y la suma de los movimientos registrados nunca pudieran discrepar, ni siquiera si el navegador se cierra a mitad de una operación.
Registrar un abono toca tres tablas: el movimiento, la cuota que se salda y el saldo del préstamo. Si el proceso moría entre la segunda y la tercera, el préstamo quedaba descuadrado y no había forma limpia de saber cuál era el estado correcto. La solución fue envolver la operación completa en una transacción (START TRANSACTION / COMMIT / ROLLBACK) y dejar de guardar el saldo como un número editable: se calcula desde los movimientos.
Qué aprendí
Los datos derivados mienten en cuanto hay una escritura fallida. Si un número se puede calcular desde los hechos registrados, es mejor calcularlo que almacenarlo — y cuando el rendimiento obliga a almacenarlo, que sea la base de datos quien lo mantenga, no la aplicación.
- Toda operación que toca varias tablas va dentro de una transacción, sin excepciones
- El dinero se guarda en
DECIMAL, nunca enFLOAT: los redondeos binarios se acumulan - Un informe financiero es la mejor prueba de integridad que puedes tener: si no cuadra, hay un bug
- PHP
- MySQL
- AdminLTE
- Bootstrap
- jQuery
- VPS