Entidades, invitaciones y usuarios en la base
entidades
Representa organizaciones del circuito comercial o de distribución.
Campos principales:
id
nombre
direccion
idPais
localidad
idProvincia
codigoPostal
telefono
contacto
comentario
activo
idPais referencia paises.
idProvincia referencia provincias.
El nombre de la entidad es único.
paises y provincias
paises contiene el maestro de países.
provincias pertenece a un país mediante:
provincias.idPais -> paises.id
La consistencia entre el país seleccionado en una entidad y la provincia seleccionada debe validarse en backend: la provincia debe pertenecer al mismo país.
invitaciones
Campos principales:
id
idEntidad
nombre
especialidad
token
cupoInicial
fechaVencimiento
estado
token es único.
Estados:
ACTIVA
CANCELADA
VENCIDA
fechaVencimiento puede ser NULL.
invitaciones_extensiones
Cada registro representa una ampliación histórica del cupo de una invitación.
idInvitacion
cantidad
observacion
La base exige:
cantidad > 0
El cupo efectivo se calcula como:
cupoInicial + SUM(invitaciones_extensiones.cantidad)
No se actualiza el cupo inicial para representar ampliaciones históricas.
usuarios
Campos principales:
id
idInvitacion
nombreCompleto
email
passwordHash
especialidad
emailVerificado
activo
origen
fechaUltimoAcceso
email es único.
idInvitacion es nullable.
Orígenes iniciales:
INVITACION
REGISTRO_WEB
REGISTRO_ANDROID
Regla invitación-origen
Cuando:
origen = INVITACION
debe existir idInvitacion.
Cuando el registro es directo desde web o Android, idInvitacion puede permanecer NULL.
Esta regla se valida en backend.
Alta mediante invitación
Antes de crear el usuario, el backend debe validar:
- token existente;
- invitación activa;
- fecha de vencimiento;
- cupo total;
- cantidad de usuarios ya incorporados;
- email no utilizado.
Una invitación cancelada o vencida bloquea nuevas altas, pero no modifica los usuarios existentes.
banners
Los banners pertenecen a una entidad.
Campos:
idEntidad
imagenBase64
ubicacion
activo
La baja normal de un banner se realiza mediante activo = 0, conservando el registro.