Modelo funcional y reglas de negocio
Entidades, invitaciones y usuarios en DB

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:

  1. token existente;
  2. invitación activa;
  3. fecha de vencimiento;
  4. cupo total;
  5. cantidad de usuarios ya incorporados;
  6. 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.