CREATE DATABASE IF NOT EXISTS websiscre CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE websiscre;
CREATE TABLE IF NOT EXISTS roles(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(80) NOT NULL UNIQUE,descripcion VARCHAR(255),es_admin TINYINT DEFAULT 0,activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS usuarios(id INT AUTO_INCREMENT PRIMARY KEY,rol_id INT NOT NULL,nombre VARCHAR(120) NOT NULL,usuario VARCHAR(60) NOT NULL UNIQUE,email VARCHAR(150),password VARCHAR(255) NOT NULL,activo TINYINT DEFAULT 1,creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(rol_id) REFERENCES roles(id));
CREATE TABLE IF NOT EXISTS permisos(id INT AUTO_INCREMENT PRIMARY KEY,clave VARCHAR(80) NOT NULL UNIQUE,nombre VARCHAR(120),grupo_menu VARCHAR(80),ruta VARCHAR(255),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS rol_permisos(rol_id INT NOT NULL,permiso_id INT NOT NULL,PRIMARY KEY(rol_id,permiso_id),FOREIGN KEY(rol_id) REFERENCES roles(id) ON DELETE CASCADE,FOREIGN KEY(permiso_id) REFERENCES permisos(id) ON DELETE CASCADE);
CREATE TABLE IF NOT EXISTS clientes(id INT AUTO_INCREMENT PRIMARY KEY,tipo_persona ENUM('Física','Jurídica') DEFAULT 'Física',documento VARCHAR(40) NOT NULL,nombres VARCHAR(120) NOT NULL,apellidos VARCHAR(120),razon_social VARCHAR(180),fecha_nacimiento DATE,nacionalidad VARCHAR(80),estado_civil VARCHAR(40),telefono VARCHAR(60),email VARCHAR(150),direccion VARCHAR(255),ciudad VARCHAR(100),actividad VARCHAR(150),empresa VARCHAR(150),ingreso_mensual DECIMAL(18,2) DEFAULT 0,observaciones TEXT,activo TINYINT DEFAULT 1,creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,UNIQUE(documento));
CREATE TABLE IF NOT EXISTS cliente_archivos(id INT AUTO_INCREMENT PRIMARY KEY,cliente_id INT NOT NULL,nombre_original VARCHAR(255),archivo VARCHAR(255),mime VARCHAR(100),descripcion VARCHAR(255),fecha_vencimiento DATE,creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(cliente_id) REFERENCES clientes(id) ON DELETE CASCADE);
CREATE TABLE IF NOT EXISTS cliente_referencias(id INT AUTO_INCREMENT PRIMARY KEY,cliente_id INT NOT NULL,tipo ENUM('Personal','Comercial') NOT NULL,nombre VARCHAR(150) NOT NULL,relacion VARCHAR(100),telefono VARCHAR(80),email VARCHAR(150),direccion VARCHAR(255),observacion VARCHAR(255),FOREIGN KEY(cliente_id) REFERENCES clientes(id) ON DELETE CASCADE);
CREATE TABLE IF NOT EXISTS vendedores(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,documento VARCHAR(40),telefono VARCHAR(60),email VARCHAR(150),tasa_comision DECIMAL(10,4) DEFAULT 0,activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS canales_venta(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,descripcion VARCHAR(255),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS tipos_documento(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,descripcion VARCHAR(255),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS garantias(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,descripcion VARCHAR(255),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS bancos(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,codigo VARCHAR(40),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS clases_prestamo(id INT AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150) NOT NULL,descripcion VARCHAR(255),activo TINYINT DEFAULT 1);
CREATE TABLE IF NOT EXISTS tasas_descuento(id INT AUTO_INCREMENT PRIMARY KEY,monto_desde DECIMAL(18,2) NOT NULL,monto_hasta DECIMAL(18,2) NOT NULL,tasa DECIMAL(10,4) NOT NULL,activo TINYINT DEFAULT 1,CHECK(monto_hasta>=monto_desde));
CREATE TABLE IF NOT EXISTS tasas_cuotas(id INT AUTO_INCREMENT PRIMARY KEY,monto_desde DECIMAL(18,2) NOT NULL,monto_hasta DECIMAL(18,2) NOT NULL,tasa DECIMAL(10,4) NOT NULL,activo TINYINT DEFAULT 1, CHECK(monto_hasta>=monto_desde));
CREATE TABLE IF NOT EXISTS tae_limites(id INT AUTO_INCREMENT PRIMARY KEY,fecha_desde DATE NOT NULL,fecha_hasta DATE NOT NULL,tae DECIMAL(10,4) NOT NULL,activo TINYINT DEFAULT 1,CHECK(fecha_hasta>=fecha_desde));
CREATE TABLE IF NOT EXISTS operaciones(id INT AUTO_INCREMENT PRIMARY KEY,fecha DATE NOT NULL,cliente_id INT NOT NULL,vendedor_id INT NOT NULL,canal_id INT NOT NULL,garantia_id INT NOT NULL,codeudor_id INT NULL,clase_prestamo_id INT NULL,tasa_interes DECIMAL(10,4) NOT NULL,total_importe DECIMAL(18,2) DEFAULT 0,total_descuento DECIMAL(18,2) DEFAULT 0,total_neto DECIMAL(18,2) DEFAULT 0,estado ENUM('Borrador','Calculada','Aprobada','Anulada') DEFAULT 'Calculada',observaciones TEXT,creado_por INT,creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(cliente_id) REFERENCES clientes(id),FOREIGN KEY(vendedor_id) REFERENCES vendedores(id),FOREIGN KEY(canal_id) REFERENCES canales_venta(id),FOREIGN KEY(garantia_id) REFERENCES garantias(id),FOREIGN KEY(codeudor_id) REFERENCES clientes(id),FOREIGN KEY(clase_prestamo_id) REFERENCES clases_prestamo(id));
CREATE TABLE IF NOT EXISTS operacion_detalles(id INT AUTO_INCREMENT PRIMARY KEY,operacion_id INT NOT NULL,tipo_documento_id INT NOT NULL,importe DECIMAL(18,2) NOT NULL,vencimiento DATE NOT NULL,banco_id INT NULL,nro_cheque VARCHAR(80),cuenta_corriente VARCHAR(80),firmante_id INT NULL,plazo_dias INT NOT NULL,tasa_aplicada DECIMAL(10,4) NOT NULL,descuento DECIMAL(18,2) NOT NULL,neto DECIMAL(18,2) NOT NULL,FOREIGN KEY(operacion_id) REFERENCES operaciones(id) ON DELETE CASCADE,FOREIGN KEY(tipo_documento_id) REFERENCES tipos_documento(id),FOREIGN KEY(banco_id) REFERENCES bancos(id),FOREIGN KEY(firmante_id) REFERENCES clientes(id));
CREATE TABLE IF NOT EXISTS auditoria(id BIGINT AUTO_INCREMENT PRIMARY KEY,usuario_id INT NULL,accion VARCHAR(100),tabla_afectada VARCHAR(80),registro_id INT NULL,detalle TEXT,ip VARCHAR(50),creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
INSERT IGNORE INTO roles(id,nombre,descripcion,es_admin) VALUES(1,'Administrador','Acceso total',1);
INSERT IGNORE INTO tipos_documento(id,nombre) VALUES(1,'Cheque'),(2,'Pagaré'),(3,'Factura');
INSERT IGNORE INTO garantias(id,nombre) VALUES(1,'Personal'),(2,'Prendaria'),(3,'Hipotecaria');
INSERT IGNORE INTO canales_venta(id,nombre) VALUES(1,'Directo');
INSERT IGNORE INTO clases_prestamo(id,nombre) VALUES(1,'Descuento de documentos'),(2,'Préstamo en cuotas');
INSERT IGNORE INTO tasas_descuento(id,monto_desde,monto_hasta,tasa) VALUES(1,0,999999999999,18);

