-- =====================================================
-- TABLAS PARA MÓDULO DE RECURSOS HUMANOS Y NÓMINA
-- Sistema ERP Simple
-- =====================================================

USE erp;

-- 1. DEPARTAMENTOS
CREATE TABLE IF NOT EXISTS departamentos (
    id_departamento INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    codigo_departamento VARCHAR(10) NOT NULL UNIQUE,
    nombre_departamento VARCHAR(100) NOT NULL,
    descripcion TEXT,
    jefe_departamento_id INT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    activo TINYINT(1) DEFAULT 1,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. PUESTOS/POSICIONES
CREATE TABLE IF NOT EXISTS puestos (
    id_puesto INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    codigo_puesto VARCHAR(10) NOT NULL UNIQUE,
    nombre_puesto VARCHAR(100) NOT NULL,
    descripcion TEXT,
    salario_base DECIMAL(12, 2) NOT NULL,
    nivel_puesto VARCHAR(20), -- OPERATIVO, SUPERVISORIO, GERENCIAL, EJECUTIVO
    departamento_id INT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    activo TINYINT(1) DEFAULT 1,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(id_departamento) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. EMPLEADOS
CREATE TABLE IF NOT EXISTS empleados (
    id_empleado INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    codigo_empleado VARCHAR(15) NOT NULL UNIQUE,
    numero_identificacion VARCHAR(20) NOT NULL UNIQUE,
    tipo_identificacion VARCHAR(10), -- CEDULA, PASAPORTE, LICENCIA, ETC
    nombre_completo VARCHAR(150) NOT NULL,
    apellido_paterno VARCHAR(80),
    apellido_materno VARCHAR(80),
    email VARCHAR(100),
    telefono VARCHAR(15),
    fecha_nacimiento DATE,
    sexo VARCHAR(10), -- M/F
    estado_civil VARCHAR(20), -- SOLTERO, CASADO, DIVORCIADO, VIUDO
    direccion TEXT,
    ciudad VARCHAR(50),
    pais VARCHAR(50),
    numero_cuenta_banco VARCHAR(30),
    banco_id INT,
    tipo_cuenta VARCHAR(10), -- CORRIENTE, AHORRO
    puesto_id INT NOT NULL,
    departamento_id INT NOT NULL,
    fecha_ingreso DATE NOT NULL,
    fecha_salida DATE,
    tipo_contrato VARCHAR(20), -- INDEFINIDO, TEMPORAL, POR_HORAS
    horas_diarias DECIMAL(4, 2) DEFAULT 8,
    salario_mensual DECIMAL(12, 2),
    salario_tipo VARCHAR(20), -- FIJO, POR_HORAS
    activo TINYINT(1) DEFAULT 1,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (puesto_id) REFERENCES puestos(id_puesto) ON DELETE RESTRICT,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(id_departamento) ON DELETE RESTRICT,
    FOREIGN KEY (banco_id) REFERENCES bancos(id_banco) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Actualizar jefe_departamento_id después de crear tabla empleados
ALTER TABLE departamentos ADD FOREIGN KEY (jefe_departamento_id) REFERENCES empleados(id_empleado) ON DELETE SET NULL;

-- 4. TIPOS DE NÓMINA
CREATE TABLE IF NOT EXISTS tipos_nomina (
    id_tipo_nomina INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    codigo_tipo VARCHAR(10) NOT NULL UNIQUE,
    nombre_tipo VARCHAR(100) NOT NULL,
    descripcion TEXT,
    frecuencia VARCHAR(20), -- SEMANAL, QUINCENAL, MENSUAL
    dias_pago INT, -- Número de días en el período
    por_defecto TINYINT(1) DEFAULT 0,
    activo TINYINT(1) DEFAULT 1,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 5. CONCEPTOS DE NÓMINA (Salarios, Bonificaciones, Descuentos, etc.)
CREATE TABLE IF NOT EXISTS conceptos_nomina (
    id_concepto INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    codigo_concepto VARCHAR(10) NOT NULL UNIQUE,
    nombre_concepto VARCHAR(100) NOT NULL,
    descripcion TEXT,
    tipo_concepto VARCHAR(20), -- SUELDO, BONIFICACION, DESCUENTO, IMPUESTO, DEDUCCION
    es_remunerativo TINYINT(1) DEFAULT 1, -- 1: si, 0: no
    es_afectable_por_falta TINYINT(1) DEFAULT 1, -- Si se ve afectado por inasistencias
    porcentaje_aplicable DECIMAL(5, 2), -- Para conceptos que son % del salario
    cuenta_contable_id INT, -- Enlace a catálogo de cuentas para contabilización
    activo TINYINT(1) DEFAULT 1,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (cuenta_contable_id) REFERENCES f_cuentas_fin(id_cuenta) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 6. FALTAS/INASISTENCIAS
CREATE TABLE IF NOT EXISTS faltas_empleados (
    id_falta INT PRIMARY KEY AUTO_INCREMENT,
    id_empleado INT NOT NULL,
    id_empresa INT NOT NULL,
    fecha_falta DATE NOT NULL,
    tipo_falta VARCHAR(20), -- FALTA, RETRASO, PERMISO, INCAPACIDAD
    descripcion TEXT,
    horas_perdidas DECIMAL(4, 2),
    justificado TINYINT(1) DEFAULT 0,
    documento_justificante VARCHAR(255), -- Path del archivo
    fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    usuario_registro INT,
    UNIQUE KEY unique_falta (id_empleado, fecha_falta, tipo_falta),
    FOREIGN KEY (id_empleado) REFERENCES empleados(id_empleado) ON DELETE CASCADE,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (usuario_registro) REFERENCES usuarios(id_usuario) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 7. ENCABEZADO DE NÓMINA
CREATE TABLE IF NOT EXISTS nominas (
    id_nomina INT PRIMARY KEY AUTO_INCREMENT,
    id_empresa INT NOT NULL,
    numero_nomina VARCHAR(20) NOT NULL UNIQUE,
    tipo_nomina_id INT NOT NULL,
    estado VARCHAR(20), -- BORRADOR, PROCESADA, PAGADA, RECHAZADA
    fecha_inicio DATE NOT NULL,
    fecha_fin DATE NOT NULL,
    fecha_pago DATE,
    total_sueldo DECIMAL(15, 2),
    total_bonificaciones DECIMAL(15, 2),
    total_descuentos DECIMAL(15, 2),
    total_neto DECIMAL(15, 2),
    cantidad_empleados INT,
    observaciones TEXT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    usuario_creacion INT,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (tipo_nomina_id) REFERENCES tipos_nomina(id_tipo_nomina) ON DELETE RESTRICT,
    FOREIGN KEY (usuario_creacion) REFERENCES usuarios(id_usuario) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 8. DETALLE DE NÓMINA (Línea por línea)
CREATE TABLE IF NOT EXISTS nomina_detalle (
    id_detalle INT PRIMARY KEY AUTO_INCREMENT,
    id_nomina INT NOT NULL,
    id_empleado INT NOT NULL,
    id_concepto INT NOT NULL,
    cantidad DECIMAL(10, 2), -- Cantidad de horas, unidades, etc
    valor_unitario DECIMAL(12, 2),
    valor_total DECIMAL(15, 2),
    observaciones TEXT,
    FOREIGN KEY (id_nomina) REFERENCES nominas(id_nomina) ON DELETE CASCADE,
    FOREIGN KEY (id_empleado) REFERENCES empleados(id_empleado) ON DELETE CASCADE,
    FOREIGN KEY (id_concepto) REFERENCES conceptos_nomina(id_concepto) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 9. RESUMEN POR EMPLEADO EN NÓMINA
CREATE TABLE IF NOT EXISTS nomina_empleado_resumen (
    id_resumen INT PRIMARY KEY AUTO_INCREMENT,
    id_nomina INT NOT NULL,
    id_empleado INT NOT NULL,
    sueldo_bruto DECIMAL(15, 2),
    total_bonificaciones DECIMAL(15, 2),
    total_descuentos DECIMAL(15, 2),
    total_impuestos DECIMAL(15, 2),
    salario_neto DECIMAL(15, 2),
    dias_trabajados DECIMAL(5, 2),
    dias_faltados DECIMAL(5, 2),
    horas_extras DECIMAL(5, 2),
    pagado TINYINT(1) DEFAULT 0,
    fecha_pago_real DATE,
    UNIQUE KEY unique_nomina_empleado (id_nomina, id_empleado),
    FOREIGN KEY (id_nomina) REFERENCES nominas(id_nomina) ON DELETE CASCADE,
    FOREIGN KEY (id_empleado) REFERENCES empleados(id_empleado) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 10. HISTORIAL DE CAMBIOS DE PUESTO
CREATE TABLE IF NOT EXISTS historial_empleados (
    id_historial INT PRIMARY KEY AUTO_INCREMENT,
    id_empleado INT NOT NULL,
    id_empresa INT NOT NULL,
    fecha_cambio DATE NOT NULL,
    tipo_cambio VARCHAR(30), -- PROMOCION, TRASLADO, CAMBIO_SALARIO, OTROS
    puesto_anterior INT,
    puesto_nuevo INT,
    salario_anterior DECIMAL(12, 2),
    salario_nuevo DECIMAL(12, 2),
    departamento_anterior INT,
    departamento_nuevo INT,
    motivo TEXT,
    usuario_registro INT,
    fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empleado) REFERENCES empleados(id_empleado) ON DELETE CASCADE,
    FOREIGN KEY (id_empresa) REFERENCES empresas(id_empresa) ON DELETE CASCADE,
    FOREIGN KEY (puesto_anterior) REFERENCES puestos(id_puesto) ON DELETE SET NULL,
    FOREIGN KEY (puesto_nuevo) REFERENCES puestos(id_puesto) ON DELETE SET NULL,
    FOREIGN KEY (departamento_anterior) REFERENCES departamentos(id_departamento) ON DELETE SET NULL,
    FOREIGN KEY (departamento_nuevo) REFERENCES departamentos(id_departamento) ON DELETE SET NULL,
    FOREIGN KEY (usuario_registro) REFERENCES usuarios(id_usuario) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 11. BENEFICIARIOS DE EMPLEADOS
CREATE TABLE IF NOT EXISTS beneficiarios_empleados (
    id_beneficiario INT PRIMARY KEY AUTO_INCREMENT,
    id_empleado INT NOT NULL,
    nombre_beneficiario VARCHAR(150) NOT NULL,
    parentesco VARCHAR(30),
    porcentaje_asignacion DECIMAL(5, 2),
    numero_identificacion VARCHAR(20),
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_empleado) REFERENCES empleados(id_empleado) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ÍNDICES PARA MEJOR RENDIMIENTO
CREATE INDEX idx_empleados_empresa ON empleados(id_empresa);
CREATE INDEX idx_empleados_puesto ON empleados(puesto_id);
CREATE INDEX idx_empleados_departamento ON empleados(departamento_id);
CREATE INDEX idx_empleados_activo ON empleados(activo);
CREATE INDEX idx_faltas_empleado ON faltas_empleados(id_empleado, fecha_falta);
CREATE INDEX idx_faltas_empresa ON faltas_empleados(id_empresa);
CREATE INDEX idx_nominas_empresa ON nominas(id_empresa, estado);
CREATE INDEX idx_nominas_fecha ON nominas(fecha_inicio, fecha_fin);
CREATE INDEX idx_nomina_detalle ON nomina_detalle(id_nomina, id_empleado);

-- =====================================================
-- INSERTAR DATOS BASE
-- =====================================================

-- Tipos de Nómina Estándares
INSERT INTO tipos_nomina (id_empresa, codigo_tipo, nombre_tipo, frecuencia, dias_pago, por_defecto, activo) VALUES
(1, 'MENS', 'Nómina Mensual', 'MENSUAL', 30, 1, 1),
(1, 'QUINCE', 'Nómina Quincenal', 'QUINCENAL', 15, 0, 1),
(1, 'SEMAN', 'Nómina Semanal', 'SEMANAL', 7, 0, 1);

-- Conceptos de Nómina Estándares
INSERT INTO conceptos_nomina (id_empresa, codigo_concepto, nombre_concepto, tipo_concepto, es_remunerativo, es_afectable_por_falta) VALUES
(1, 'SUELDO', 'Sueldo Básico', 'SUELDO', 1, 1),
(1, 'BONIF', 'Bonificación', 'BONIFICACION', 1, 0),
(1, 'HE50', 'Horas Extras 50%', 'BONIFICACION', 1, 0),
(1, 'HE100', 'Horas Extras 100%', 'BONIFICACION', 1, 0),
(1, 'AFILIA', 'Afilización ISAPRE/Fonasa', 'DESCUENTO', 0, 0),
(1, 'AFP', 'AFP/Pensión', 'DESCUENTO', 0, 0),
(1, 'IMPUESTO', 'Impuesto a la Renta', 'IMPUESTO', 0, 0),
(1, 'OTROS', 'Otros Descuentos', 'DESCUENTO', 0, 0);

-- Departamentos de Ejemplo (para empresa 1)
INSERT INTO departamentos (id_empresa, codigo_departamento, nombre_departamento, descripcion, activo) VALUES
(1, 'ADM', 'Administración', 'Departamento de Administración y Finanzas', 1),
(1, 'VENT', 'Ventas', 'Departamento de Ventas', 1),
(1, 'PROD', 'Producción', 'Departamento de Producción', 1),
(1, 'RRHH', 'Recursos Humanos', 'Departamento de Recursos Humanos', 1);

-- Puestos de Ejemplo
INSERT INTO puestos (id_empresa, codigo_puesto, nombre_puesto, salario_base, nivel_puesto, departamento_id, activo) VALUES
(1, 'GEN', 'Gerente General', 50000.00, 'EJECUTIVO', 1, 1),
(1, 'CONT', 'Contador', 25000.00, 'SUPERVISORIO', 1, 1),
(1, 'AUX_CONT', 'Auxiliar Contable', 12000.00, 'OPERATIVO', 1, 1),
(1, 'GER_VENT', 'Gerente de Ventas', 35000.00, 'GERENCIAL', 2, 1),
(1, 'VEND', 'Vendedor', 15000.00, 'OPERATIVO', 2, 1),
(1, 'OPER', 'Operario', 10000.00, 'OPERATIVO', 3, 1),
(1, 'COORD_RRHH', 'Coordinador RRHH', 18000.00, 'SUPERVISORIO', 4, 1);
