Files
telegram_new_socias/db/init/init.sql
google-labs-jules[bot] 4e2b6335a6 feat: Implement multi-database architecture
This commit introduces a three-database architecture to the application,
as specified in the `db_logic.md` file.

The changes include:
- A SQL initialization script (`db/init/init.sql`) to create the
  `USERS_ALMA`, `vanity_hr`, and `vanity_attendance` databases and their
  respective tables.
- SQLAlchemy models for all tables, organized into separate files
  within the `models` directory.
- Refactoring of the database connection logic in `modules/database.py`
  to support connections to all three databases.
- Creation of a `modules/logger.py` to handle request logging to the
  `USERS_ALMA` database.
- Updates to `docker-compose.yml` to mount the initialization script and
  build the bot image locally.
- Updates to `.env.example` to include the new database environment
  variables.
- Restoration of the data dictionary to `db_tasks.md`.
2025-12-18 19:36:40 +00:00

137 lines
4.2 KiB
SQL

CREATE DATABASE IF NOT EXISTS USERS_ALMA;
CREATE DATABASE IF NOT EXISTS vanity_hr;
CREATE DATABASE IF NOT EXISTS vanity_attendance;
GRANT ALL PRIVILEGES ON USERS_ALMA.* TO 'user'@'%';
GRANT ALL PRIVILEGES ON vanity_hr.* TO 'user'@'%';
GRANT ALL PRIVILEGES ON vanity_attendance.* TO 'user'@'%';
USE USERS_ALMA;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
role ENUM('admin', 'manager', 'user'),
first_name VARCHAR(100),
last_name VARCHAR(100),
email VARCHAR(100) UNIQUE,
cell_phone VARCHAR(20),
telegram_id VARCHAR(50) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS request_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
telegram_id VARCHAR(50),
username VARCHAR(100),
command VARCHAR(100),
message VARCHAR(500),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
USE vanity_hr;
CREATE TABLE IF NOT EXISTS data_empleadas (
numero_empleado VARCHAR(15) PRIMARY KEY,
puesto VARCHAR(50),
sucursal VARCHAR(50),
fecha_ingreso DATE,
estatus VARCHAR(15),
nombre_completo VARCHAR(150),
nombre VARCHAR(50),
nombre_preferido VARCHAR(50),
apellido_paterno VARCHAR(50),
apellido_materno VARCHAR(50),
fecha_nacimiento DATE,
lugar_nacimiento VARCHAR(50),
rfc VARCHAR(13) UNIQUE,
curp VARCHAR(18) UNIQUE,
email VARCHAR(100),
telefono_celular VARCHAR(15),
domicilio_calle VARCHAR(255),
domicilio_numero_exterior VARCHAR(10),
domicilio_numero_interior VARCHAR(10),
domicilio_numero_texto VARCHAR(50),
domicilio_colonia VARCHAR(255),
domicilio_codigo_postal VARCHAR(10),
domicilio_ciudad VARCHAR(100),
domicilio_estado VARCHAR(50),
domicilio_completo VARCHAR(255),
emergencia_nombre VARCHAR(100),
emergencia_telefono VARCHAR(15),
emergencia_parentesco VARCHAR(50),
referencia_1_nombre VARCHAR(100),
referencia_1_telefono VARCHAR(15),
referencia_1_tipo VARCHAR(20),
referencia_2_nombre VARCHAR(100),
referencia_2_telefono VARCHAR(15),
referencia_2_tipo VARCHAR(20),
referencia_3_nombre VARCHAR(100),
referencia_3_telefono VARCHAR(15),
referencia_3_tipo VARCHAR(20),
origen_registro VARCHAR(50),
telegram_usuario VARCHAR(50),
telegram_chat_id BIGINT,
bot_version VARCHAR(20),
fecha_registro DATETIME,
tiempo_registro_minutos INT,
fecha_procesamiento DATETIME(3)
);
CREATE TABLE IF NOT EXISTS vacaciones (
vacaciones_id VARCHAR(50) PRIMARY KEY,
numero_empleado VARCHAR(15),
tipo_solicitud VARCHAR(20),
estatus ENUM('pendiente', 'aprobado', 'rechazado', 'cancelado'),
fecha_inicio DATE,
fecha_fin DATE,
dias_solicitados INT,
dias_habiles INT,
motivo TEXT,
con_goce_sueldo TINYINT(1),
fecha_solicitud DATETIME,
fecha_procesamiento DATETIME(3),
origen VARCHAR(20),
afecta_nomina TINYINT(1),
FOREIGN KEY (numero_empleado) REFERENCES data_empleadas(numero_empleado)
);
CREATE TABLE IF NOT EXISTS permisos (
permiso_id VARCHAR(50) PRIMARY KEY,
numero_empleado VARCHAR(15),
categoria ENUM('PERSONAL', 'MEDICO', 'OFICIAL', 'OTRO'),
estatus ENUM('pendiente', 'aprobado', 'rechazado', 'cancelado'),
fecha_inicio DATE,
horario_especifico VARCHAR(50),
motivo TEXT,
con_goce_sueldo TINYINT(1),
afecta_nomina TINYINT(1),
FOREIGN KEY (numero_empleado) REFERENCES data_empleadas(numero_empleado)
);
USE vanity_attendance;
CREATE TABLE IF NOT EXISTS asistencia_registros (
id_asistencia INT AUTO_INCREMENT PRIMARY KEY,
numero_empleado VARCHAR(15),
fecha DATE,
hora_entrada_real TIME,
hora_salida_real TIME,
minutos_retraso INT,
minutos_extra INT,
sucursal_registro VARCHAR(50),
telegram_id_usado BIGINT,
FOREIGN KEY (numero_empleado) REFERENCES vanity_hr.data_empleadas(numero_empleado)
);
CREATE TABLE IF NOT EXISTS horario_empleadas (
id_horario INT AUTO_INCREMENT PRIMARY KEY,
numero_empleado VARCHAR(15),
telegram_id BIGINT,
dia_semana VARCHAR(20),
hora_entrada_teorica TIME,
hora_salida_teorica TIME,
FOREIGN KEY (numero_empleado) REFERENCES vanity_hr.data_empleadas(numero_empleado)
);