Centro de mando de formaciones (II): diseñando la arquitectura y el modelo de datos
Tras la idea inicial, llega el paso clave: organizar la arquitectura de la agenda visual por capas (datos, dominio, servicios, interfaz) y definir un modelo de datos flexible con formaciones base, contrataciones y sesiones.
Diseñando la arquitectura y el modelo de datos de mi agenda visual de formaciones
En el primer artículo de esta serie compartí la idea general: construir una agenda visual que me ayude a planificar y gestionar todas las formaciones que imparto a diferentes clientes.
Hoy toca dar un paso clave: definir cómo se organizará internamente la aplicación y qué modelo de datos usaremos para reflejar la realidad de mi trabajo diario.
Una arquitectura modular por capas
He optado por un enfoque modular y orientado a objetos, siguiendo una arquitectura por capas. ¿Qué significa esto? Que el proyecto se divide en bloques claros, cada uno con una función bien definida:
Capa de datos
- Almacenamiento en SQLite, con tablas normalizadas para clientes, formaciones, contrataciones y sesiones.
- Se encargará de todas las operaciones CRUD (crear, leer, actualizar y borrar).
Capa de dominio
- Clases principales:
Cliente,FormacionBase,Contratacion,Sesion,Tema,Adjunto. - Contendrá la lógica de negocio: validación de solapamientos, cálculo de horas, control de estados.
Capa de servicios
- Funcionalidades de apoyo: exportaciones (PDF, CSV, iCal), sincronización con Google Calendar y copias de seguridad.
Capa de presentación (UI)
- Interfaz gráfica en PyQt con:
- Vistas del calendario (anual, mensual, semanal y diaria).
- Formularios de clientes y contrataciones.
- Funciones de arrastrar y soltar para organizar sesiones.
- Colores y estados visuales para diferenciar eventos.
Este diseño facilita que cada capa evolucione de forma independiente, logrando un sistema más mantenible y preparado para futuras ampliaciones (como facturación).
Un modelo de datos en tres niveles
Tras analizar las necesidades, vi fundamental separar tres conceptos que a menudo se confunden:
Formación base
- Curso de “catálogo” (ejemplo: Excel Básico).
- Existe independientemente de los clientes.
- Incluye: nombre, descripción, tema, horas de referencia, nivel y contenido estándar.
Contratación
- Acuerdo con un cliente concreto para impartir una formación.
- Parte de una formación base, pero con condiciones específicas: precio/hora, número de horas previstas, modalidad (presencial u online), dirección o enlace, responsable, fechas previstas, estado (tentativo, confirmado, cancelado).
- Cada contratación tendrá un código de expediente que servirá después para enlazar con la facturación.
Sesión
- Bloque concreto que aparece en el calendario.
- Vinculada a una contratación, con fecha, hora, lugar y estado.
- Puede ser única o parte de una recurrencia (ejemplo: todos los martes de 9 a 12 durante un mes).
Además, los adjuntos (contratos, guiones, materiales) podrán asociarse tanto a clientes como a contrataciones o sesiones.
Relaciones entre entidades
De forma simplificada, el modelo funciona así:
- Un cliente puede tener varias contrataciones.
- Una formación base puede ser contratada por diferentes clientes.
- Cada contratación se compone de una o más sesiones que se reflejan en el calendario.
- Los adjuntos se pueden vincular a clientes, contrataciones o sesiones.
Este esquema evita duplicidades, permite adaptarse a particularidades de cada contrato y abre la puerta a futuras ampliaciones.
Reglas de negocio principales
Algunas reglas que se aplicarán desde el inicio:
- Sin solapamientos: dos sesiones no pueden ocupar el mismo rango horario.
- Control de desplazamientos: aviso si no hay margen suficiente entre sesiones en lugares distintos.
- Colores y estados: cada cliente tendrá un color, y cada sesión/contratación tendrá un estado (confirmado, tentativo, cancelado).
- Cómputo de horas: sumatorio por fechas, clientes o temas para estadísticas y facturación.
- Histórico de cambios: registro de modificaciones en fechas, horas o estados para garantizar trazabilidad.
Próximos pasos
En el siguiente artículo entraremos en materia: definiremos la base de datos SQLite con las tablas y relaciones necesarias, y construiremos los repositorios en Python que servirán de puente entre la base de datos y las clases de dominio.
Será el momento de pasar de la teoría a los primeros fragmentos de código.