XpresApp — Plataforma Bancaria/Cooperativa
Trabajé sobre una plataforma financiera con paneles separados para usuarios, personal de sucursal y administradores, cada uno con sus propios guards de autenticación. Mi contribución central fue el módulo de Certificados de Depósito (CD): un CdService que encapsula toda la lógica financiera dentro de transacciones de base de datos, validando monto mínimo y balance suficiente antes de crear la inversión, generando cuotas mensuales automáticamente, calculando penalización por retiro anticipado, y procesando la maduración con envío de notificación por correo. Extendí el esquema con excepciones de dominio propias (InsufficientBalanceException, InvalidCdOperationException) en vez de errores genéricos.
Consistencia financiera bajo concurrencia
Crear una inversión, generar cuotas y descontar balance debe ser todo o nada. Solución: toda la operación envuelta en DB::transaction, con validaciones de negocio (plan activo, balance suficiente) antes de cualquier escritura.
Maduración y penalizaciones automáticas
Los CDs deben madurar y pagar intereses sin intervención manual, y un retiro anticipado debe penalizarse de forma justa. Solución: comandos Artisan programados (ProcessMaturedCds) más un cálculo de penalización encapsulado en el propio modelo del plan (cdPlan->calPenalty).
Excepciones de dominio explícitas
InsufficientBalanceException e InvalidCdOperationException en vez de errores genéricos, permitiendo que la capa HTTP traduzca cada caso a una respuesta clara sin lógica condicional dispersa.
Jobs configurables desde base de datos
Además del scheduler nativo de Artisan, un registro de CronJob/CronJobLog en base de datos permite ajustar la periodicidad de los procesos de maduración desde el panel admin sin tocar código ni redeploy.