Habita
Aplicación full-stack para administrar edificios de alquiler: habitaciones, inquilinos, contratos y pagos.
Sistema interno de gestión de propiedades residenciales construido con React y Django. Cubre el ciclo completo: registrar unidades, asignar inquilinos, generar contratos y hacer seguimiento de pagos con estados de mora.
Gestionar un edificio de alquiler sin herramientas adecuadas genera fricción operativa.
El objetivo era construir una herramienta interna que centralizara la administración de unidades, contratos y pagos, eliminando el seguimiento manual disperso en planillas.
- El seguimiento de pagos y mora era manual y propenso a errores.
- No había forma de ver rápido el estado de ocupación del edificio.
- Cada contrato y su historial de pagos vivía en documentos separados sin relación.
Aplicación full-stack con dominio modelado alrededor del ciclo de alquiler.
Se construyó un sistema con módulos independientes por dominio (habitaciones, inquilinos, contratos, pagos) con un dashboard que centraliza el estado general del edificio.
- Dashboard con indicadores clave: vacantes, mora y contratos activos.
- Registro y seguimiento de pagos con estados (pendiente, pagado, parcial, vencido).
- Formulario rápido de pago accesible desde cualquier pantalla del sistema.
Stack full-stack desacoplado con frontend en React y API REST en Django.
El backend expone una API versionada con DRF y JWT. El frontend consume esa API con React Query, manteniendo estado del servidor y cliente separados.
React 19 + React Router 7 con React Query para server state y Zustand para auth.
Django REST Framework con serializers, filtros y autenticación JWT por dominio.
PostgreSQL con relaciones entre habitaciones, contratos e inquilinos modeladas en Django ORM.
El stack combina Django REST Framework y React para un sistema de gestión robusto, con separación clara entre API y frontend que facilita escalar cada capa de forma independiente.
- Refresh token rotado en cookie httpOnly con SameSite=Strict; el access token vive solo en memoria (Zustand) y nunca toca almacenamiento persistente, para reducir superficie de robo ante XSS.
- Sincronización entre dominios: un servicio dedicado actualiza el estado ocupado/disponible de la habitación cuando cambia el contrato asociado, en vez de depender de queries manuales.
- El estado de mora se recalcula con un management command (`marcar_morosos`, con soporte `--dry-run`) que revisa contratos activos con pagos vencidos, pensado para ejecutarse manualmente o vía scheduler externo.
83 tests de backend + 102 de frontend corriendo en CI, con cobertura mínima del 60%.
Invalidación de caché consciente del dominio en React Query: pagar una cuota también invalida el contrato asociado (por el recálculo de garantía) y actualiza la disponibilidad de la habitación en el dashboard.
Modelo de dominio con 7 entidades relacionadas —incluida una tabla de auditoría (AuditLog)— para trazabilidad completa del ciclo habitación → contrato → pago.