CONTRATO · TABLA usuarios · WelkoApp 1. Identificación general • Nombre de tabla: usuarios • Uso principal: Gestionar cuentas de acceso al sistema (login), niveles de acceso (SUPERADMIN / ADMIN / OPERADOR), permisos por módulo y trazabilidad básica (alta, baja, modificaciones, último acceso). ________________________________________ 2. Convenciones generales de datos 1. Mayúsculas o Se guardan siempre en MAYÚSCULAS:  nombre  apellido  rut (sin puntos, con guion, con “K” en mayúscula si aplica)  direccion  rol_empresa  rol_sistema  estado o NO se fuerza a mayúsculas:  email (se respeta tal como se ingresa). 2. RUT o Formato almacenado: NNNNNNNN-D (7 u 8 dígitos, guion, dígito verificador 0–9 o K mayúscula). o Sin puntos. o Ejemplos válidos:  12345678-9  12345678-K o Campo único: no se permiten dos usuarios con el mismo RUT. 3. Teléfono o Almacenado como texto, solo dígitos. o Convención del sistema: 9 dígitos chilenos sin +56 (ej.: 912345678). ________________________________________ 3. Definición de columnas 3.1. Bloque A · Identidad y contacto • id o Tipo: INTEGER o Clave primaria (PRIMARY KEY AUTOINCREMENT). o Identificador único interno del usuario. • nombre o Tipo: TEXT NOT NULL o Nombre de pila del usuario, en mayúsculas. • apellido o Tipo: TEXT NOT NULL o Apellido (o apellidos), en mayúsculas. • rut o Tipo: TEXT NOT NULL UNIQUE o RUT chileno sin puntos, con guion, con “K” en mayúscula si aplica. o Ej.: 12132643-4. • telefono o Tipo: TEXT (nullable) o Número de teléfono móvil, solo dígitos (convención: 9 dígitos). • direccion o Tipo: TEXT (nullable) o Dirección completa, en mayúsculas. • email o Tipo: TEXT (nullable) o Correo electrónico de contacto. o Se almacena tal como se ingresa (sin transformar mayúsculas/minúsculas). • rol_empresa o Tipo: TEXT NOT NULL o Rol o cargo interno dentro de la empresa. o Valores permitidos (CHECK):  VENTAS  PRODUCCION  REPARTO  ADMINISTRACION ________________________________________ 3.2. Bloque B · Rol de sistema y permisos • rol_sistema o Tipo: TEXT NOT NULL o Nivel de acceso al sistema (afecta qué puede administrar). o Valores permitidos (CHECK):  SUPERADMIN  ADMIN  OPERADOR o Valor por defecto: OPERADOR. • perm_ventas o Tipo: INTEGER NOT NULL DEFAULT 0 o Permiso para acceder al módulo de Ventas. o Valores permitidos: 0 (no) / 1 (sí). • perm_reparto o Tipo: INTEGER NOT NULL DEFAULT 0 o Permiso para acceder al módulo de Reparto. o Valores: 0 / 1. • perm_produccion o Tipo: INTEGER NOT NULL DEFAULT 0 o Permiso para acceder al módulo de Producción. o Valores: 0 / 1. • perm_usuarios o Tipo: INTEGER NOT NULL DEFAULT 0 o Permiso para acceder al panel de Gestión de Usuarios. o Valores: 0 / 1. Nota: El rol_sistema y las banderas de permisos se combinan. Ejemplos: • SUPERADMIN normalmente tendrá todos los perm_* = 1. • ADMIN puede tener perm_usuarios = 1 para gestionar operadores. • OPERADOR solo tendrá activos los módulos en los que efectivamente trabaja. ________________________________________ 3.3. Bloque C · Credenciales y estado • password_hash o Tipo: TEXT NOT NULL o Hash de la contraseña, generado con password_hash() de PHP. o Nunca se guarda la contraseña en texto plano. • estado o Tipo: TEXT NOT NULL o Estado lógico de la cuenta. o Valores permitidos (CHECK):  ACTIVO → puede iniciar sesión.  SUSPENDIDO → no puede iniciar sesión, pero la cuenta se mantiene (se puede reactivar).  ELIMINADO → borrado lógico; no debe aparecer en login ni en listados estándar (solo para auditoría). o Valor por defecto: ACTIVO. • debe_cambiar_password o Tipo: INTEGER NOT NULL DEFAULT 1 o Indica si el usuario está obligado a cambiar la contraseña en el próximo login. o Valores:  1 → debe cambiarla (se redirige a pantalla de cambio de contraseña).  0 → puede entrar normalmente al panel. ________________________________________ 3.4. Bloque D · Auditoría • ultimo_login_at o Tipo: TEXT (nullable) o Fecha/hora del último inicio de sesión correcto. o Formato sugerido: ISO YYYY-MM-DDTHH:MM:SS. • creado_at o Tipo: TEXT NOT NULL o Fecha/hora de creación del registro. o Valor por defecto: datetime('now') (hora del servidor SQLite). • actualizado_at o Tipo: TEXT (nullable) o Fecha/hora de la última actualización de datos del usuario. • creado_por o Tipo: INTEGER (nullable) o id del usuario que creó este registro. o Puede ser NULL en el primer SUPERADMIN generado por script. • eliminado_at o Tipo: TEXT (nullable) o Fecha/hora en que el usuario fue marcado como ELIMINADO. • eliminado_por o Tipo: INTEGER (nullable) o id del usuario (generalmente SUPERADMIN) que marcó este usuario como ELIMINADO. ________________________________________ 4. Reglas de negocio asociadas 1. Creación de usuario o Al crear un usuario:  Se normalizan a mayúsculas: nombre, apellido, rut, direccion, rol_empresa, rol_sistema.  Se verifica que el rut no exista ya.  Se define el rol_sistema (por defecto OPERADOR si no se especifica).  Se asignan permisos por módulo (perm_*) según corresponda. 2. Contraseña inicial o La contraseña inicial (o tras reseteo) se construye como: RUT completo sin puntos ni guion, manteniendo el dígito verificador. Ejemplos:  RUT 12.132.643-4 → se almacena como 12132643-4 → contraseña inicial: 121326434.  RUT 12.345.678-K → se almacena como 12345678-K → contraseña inicial: 12345678K. o Al crear usuario o resetear contraseña:  password_hash se calcula con password_hash(contraseñaInicial, PASSWORD_DEFAULT).  debe_cambiar_password se deja en 1 para obligar al cambio. 3. Reset de contraseña o Solo pueden resetear contraseñas:  SUPERADMIN: a cualquier usuario.  ADMIN: a usuarios de nivel OPERADOR (según la lógica de permisos que se implemente). o Tras un reset:  Contraseña vuelve a ser RUT sin puntos ni guion.  debe_cambiar_password vuelve a 1. 4. Login o El selector de usuario en la pantalla de login se llena desde: o SELECT id, nombre, apellido o FROM usuarios o WHERE estado = 'ACTIVO' o ORDER BY nombre, apellido; o Lo que se muestra al usuario es siempre: NOMBRE + ESPACIO + APELLIDO (ej.: LUIS BARRALES). o El sistema valida:  Que el usuario esté en estado = 'ACTIVO'.  Que la contraseña coincida (password_verify con password_hash). 5. Cambio obligatorio de contraseña o Si debe_cambiar_password = 1:  Después de un login válido, el sistema no deja entrar al panel.  Redirige a un formulario de cambio de contraseña. o Al guardar la nueva clave:  Se actualiza password_hash.  debe_cambiar_password pasa a 0. 6. Gestión de estados o ACTIVO → aparece en el selector de login y en el panel. o SUSPENDIDO → no aparece en el selector de login; el intento de login debe fallar. o ELIMINADO → no aparece en login ni en listados de uso normal; solo visible en vistas de auditoría interna. ________________________________________ 5. CAMBIOS DE VERSIÓN (CHANGELOG) • v1.0 Definición inicial de la tabla `usuarios` sin columna de alias de login. • v1.1 Se agrega la columna `usuario` para manejar un alias de inicio de sesión opcional. Detalle del cambio: • Nombre de columna: usuario • Tipo: TEXT (nullable) • Uso: alias de login del usuario (ej.: ADMIN, VENTAS01, REPARTO1). • Convención: se almacena en MAYÚSCULAS, sin espacios iniciales ni finales. • No modifica el comportamiento de las columnas ya existentes ni las reglas de RUT / contraseña inicial.