Skip to content
leoco/dev
← Volver a proyectos
Backend (extensión de módulo financiero)·2026·Repo privado

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.

Disponible bajo NDA · puedo hacer un walkthrough en una llamada.
STACK TÉCNICO
LaravelPHPMySQLMulti-guard auth
DESAFÍOS

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).

SOLUCIONES

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.

¿Te interesa este proyecto o tienes una idea similar?