-- =====================================================================
--  SISTEMA DE TALENTO HUMANO Y NÓMINA - EMPACADORA DE CAMARÓN
--  Motor: MySQL 5.7+ / MariaDB 10.3+  (compatible cPanel)
--  Charset: utf8mb4  |  Engine: InnoDB (integridad referencial + FK)
--  Normativa: Código del Trabajo / IESS / SRI (Ecuador)
-- =====================================================================
--  NOTA: Todos los valores normativos (SBU, porcentajes IESS, recargos)
--  viven en la tabla `parametros_costos` para poder regularlos por año
--  sin tocar el código. NUNCA se hardcodean en la lógica.
-- =====================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------------------------
-- 1. USUARIOS DEL SISTEMA (autenticación / auditoría)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS usuarios (
    id              INT UNSIGNED NOT NULL AUTO_INCREMENT,
    nombre          VARCHAR(120)    NOT NULL,
    email           VARCHAR(120)    NOT NULL,
    password_hash   VARCHAR(255)    NOT NULL,          -- password_hash() BCRYPT
    rol             ENUM('ADMIN','RRHH','SUPERVISOR','CONSULTA') NOT NULL DEFAULT 'CONSULTA',
    activo          TINYINT(1)      NOT NULL DEFAULT 1,
    creado_en       TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_usuarios_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 2. DEPARTAMENTOS  (Clasificado, Empaque, Cámaras, Administración...)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS departamentos (
    id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
    nombre      VARCHAR(80)  NOT NULL,
    descripcion VARCHAR(255) DEFAULT NULL,
    activo      TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    UNIQUE KEY uq_dep_nombre (nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 3. TIPOS DE PAGO (catálogo maestro de esquemas)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tipos_pago (
    id           INT UNSIGNED NOT NULL AUTO_INCREMENT,
    codigo       VARCHAR(20)  NOT NULL,   -- FIJO_MENSUAL, VARIABLE_SEMANAL, POR_HORAS, DESTAJO, MIXTO
    nombre       VARCHAR(80)  NOT NULL,
    periodicidad ENUM('MENSUAL','QUINCENAL','SEMANAL','DIARIA') NOT NULL,
    descripcion  VARCHAR(255) DEFAULT NULL,
    activo       TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    UNIQUE KEY uq_tipo_pago_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 4. PUESTOS  (roles + tarifa base referencial por departamento)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS puestos (
    id              INT UNSIGNED NOT NULL AUTO_INCREMENT,
    departamento_id INT UNSIGNED NOT NULL,
    tipo_pago_id    INT UNSIGNED NOT NULL,       -- esquema por defecto del puesto
    nombre          VARCHAR(100) NOT NULL,       -- "Pelador", "Clasificador", "Jefe de Empaque"
    tarifa_base     DECIMAL(10,4) NOT NULL DEFAULT 0.0000, -- sueldo o tarifa referencial
    activo          TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    KEY idx_puesto_dep (departamento_id),
    KEY idx_puesto_tipopago (tipo_pago_id),
    CONSTRAINT fk_puesto_dep     FOREIGN KEY (departamento_id) REFERENCES departamentos(id),
    CONSTRAINT fk_puesto_tipopag FOREIGN KEY (tipo_pago_id)    REFERENCES tipos_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 5. EMPLEADOS
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS empleados (
    id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
    cedula              VARCHAR(13)  NOT NULL,          -- validada por algoritmo módulo 10
    apellidos           VARCHAR(100) NOT NULL,
    nombres             VARCHAR(100) NOT NULL,
    fecha_nacimiento    DATE         DEFAULT NULL,
    genero              ENUM('M','F','O') DEFAULT NULL,
    telefono            VARCHAR(20)  DEFAULT NULL,
    email               VARCHAR(120) DEFAULT NULL,
    direccion           VARCHAR(255) DEFAULT NULL,
    -- Datos laborales
    puesto_id           INT UNSIGNED NOT NULL,
    tipo_pago_id        INT UNSIGNED NOT NULL,          -- puede diferir del puesto
    fecha_ingreso       DATE         NOT NULL,
    fecha_salida        DATE         DEFAULT NULL,
    sueldo_base         DECIMAL(10,2) NOT NULL DEFAULT 0.00, -- para fijos/mixtos
    modo_mixto          ENUM('SUMA','MAYOR') DEFAULT 'SUMA', -- base+destajo vs. el mayor de ambos
    aplica_fondos_reserva TINYINT(1) NOT NULL DEFAULT 0,     -- se activa tras 1 año
    -- Datos de pago
    banco               VARCHAR(60)  DEFAULT NULL,
    tipo_cuenta         ENUM('AHORROS','CORRIENTE') DEFAULT NULL,
    numero_cuenta       VARCHAR(30)  DEFAULT NULL,
    estado              ENUM('ACTIVO','INACTIVO','LIQUIDADO') NOT NULL DEFAULT 'ACTIVO',
    creado_en           TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    actualizado_en      TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_emp_cedula (cedula),
    KEY idx_emp_puesto (puesto_id),
    KEY idx_emp_tipopago (tipo_pago_id),
    KEY idx_emp_estado (estado),
    CONSTRAINT fk_emp_puesto   FOREIGN KEY (puesto_id)    REFERENCES puestos(id),
    CONSTRAINT fk_emp_tipopago FOREIGN KEY (tipo_pago_id) REFERENCES tipos_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 6. CONTRATOS (historial contractual del empleado)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS contratos (
    id            INT UNSIGNED NOT NULL AUTO_INCREMENT,
    empleado_id   INT UNSIGNED NOT NULL,
    tipo_contrato ENUM('INDEFINIDO','EVENTUAL','TEMPORADA','OBRA_CIERTA','APRENDIZAJE') NOT NULL,
    fecha_inicio  DATE         NOT NULL,
    fecha_fin     DATE         DEFAULT NULL,
    sueldo_pactado DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    jornada       ENUM('COMPLETA','PARCIAL') NOT NULL DEFAULT 'COMPLETA',
    activo        TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    KEY idx_contrato_emp (empleado_id),
    CONSTRAINT fk_contrato_emp FOREIGN KEY (empleado_id) REFERENCES empleados(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 7. PARAMETROS DE COSTOS  (config parametrizable clave/valor)
--    El módulo de administración regula estos valores. Se versionan por
--    vigencia para no perder el histórico de cálculos ya emitidos.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS parametros_costos (
    id             INT UNSIGNED NOT NULL AUTO_INCREMENT,
    clave          VARCHAR(60)  NOT NULL,   -- SBU, IESS_PERSONAL, IESS_PATRONAL, RECARGO_SUPLEM, etc.
    valor          DECIMAL(12,6) NOT NULL,
    descripcion    VARCHAR(200) DEFAULT NULL,
    vigente_desde  DATE         NOT NULL,
    vigente_hasta  DATE         DEFAULT NULL, -- NULL = vigente actual
    PRIMARY KEY (id),
    KEY idx_param_clave (clave),
    KEY idx_param_vigencia (clave, vigente_desde)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 8. TARIFAS DE AVANCE / DESTAJO  (parametrizable por producto/proceso)
--    Ej: tarifa por gaveta pelada, por libra clasificada, etc.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tarifas_avance (
    id             INT UNSIGNED NOT NULL AUTO_INCREMENT,
    codigo         VARCHAR(30)  NOT NULL,   -- PELADO_GAVETA, CLASIF_LIBRA...
    descripcion    VARCHAR(150) NOT NULL,
    unidad         ENUM('GAVETA','LIBRA','KILO','UNIDAD','TINA') NOT NULL,
    tarifa_unitaria DECIMAL(10,4) NOT NULL,  -- USD por unidad
    departamento_id INT UNSIGNED DEFAULT NULL,
    vigente_desde  DATE         NOT NULL,
    vigente_hasta  DATE         DEFAULT NULL,
    activo         TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    KEY idx_tarifa_codigo (codigo),
    KEY idx_tarifa_dep (departamento_id),
    CONSTRAINT fk_tarifa_dep FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 9. ASISTENCIA  (marcaciones diarias + horas calculadas)
--    Alimentada por reloj biométrico o registro manual.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS asistencia (
    id                   BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    empleado_id          INT UNSIGNED NOT NULL,
    fecha                DATE         NOT NULL,
    hora_entrada         TIME         DEFAULT NULL,
    hora_salida          TIME         DEFAULT NULL,
    horas_normales       DECIMAL(5,2) NOT NULL DEFAULT 0.00,  -- hasta 8h
    horas_suplementarias DECIMAL(5,2) NOT NULL DEFAULT 0.00,  -- +50% (06-24h) o +100% (00-06h)
    horas_extraordinarias DECIMAL(5,2) NOT NULL DEFAULT 0.00, -- +100% (feriados/descanso)
    observacion          VARCHAR(150) DEFAULT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uq_asist_emp_fecha (empleado_id, fecha),
    KEY idx_asist_fecha (fecha),
    CONSTRAINT fk_asist_emp FOREIGN KEY (empleado_id) REFERENCES empleados(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 10. AVANCE DE PRODUCCION (destajo diario por empleado)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS avance_produccion (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    empleado_id     INT UNSIGNED NOT NULL,
    tarifa_avance_id INT UNSIGNED NOT NULL,
    fecha           DATE         NOT NULL,
    cantidad        DECIMAL(12,3) NOT NULL,          -- gavetas/libras procesadas
    tarifa_aplicada DECIMAL(10,4) NOT NULL,          -- congelada al momento del registro
    valor           DECIMAL(12,2) AS (cantidad * tarifa_aplicada) STORED, -- columna calculada
    lote            VARCHAR(40)  DEFAULT NULL,
    registrado_por  INT UNSIGNED DEFAULT NULL,
    PRIMARY KEY (id),
    KEY idx_avance_emp_fecha (empleado_id, fecha),
    KEY idx_avance_tarifa (tarifa_avance_id),
    CONSTRAINT fk_avance_emp    FOREIGN KEY (empleado_id)      REFERENCES empleados(id) ON DELETE CASCADE,
    CONSTRAINT fk_avance_tarifa FOREIGN KEY (tarifa_avance_id) REFERENCES tarifas_avance(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 11. CONCEPTOS DE NOMINA (catálogo de ingresos / egresos)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS conceptos_nomina (
    id           INT UNSIGNED NOT NULL AUTO_INCREMENT,
    codigo       VARCHAR(30)  NOT NULL,
    nombre       VARCHAR(100) NOT NULL,
    tipo         ENUM('INGRESO','EGRESO') NOT NULL,
    aporta_iess  TINYINT(1)   NOT NULL DEFAULT 1,   -- ¿es materia gravada IESS?
    activo       TINYINT(1)   NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    UNIQUE KEY uq_concepto_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 12. PERIODOS DE NOMINA
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS periodos_nomina (
    id           INT UNSIGNED NOT NULL AUTO_INCREMENT,
    tipo         ENUM('SEMANAL','QUINCENAL','MENSUAL') NOT NULL,
    fecha_inicio DATE         NOT NULL,
    fecha_fin    DATE         NOT NULL,
    estado       ENUM('ABIERTO','PROCESADO','PAGADO','CERRADO') NOT NULL DEFAULT 'ABIERTO',
    creado_en    TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_periodo (tipo, fecha_inicio, fecha_fin),
    KEY idx_periodo_fechas (fecha_inicio, fecha_fin)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 13. NOMINA - CABECERA  (rol de pagos por empleado y periodo)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nomina_cabecera (
    id                   BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    periodo_id           INT UNSIGNED NOT NULL,
    empleado_id          INT UNSIGNED NOT NULL,
    -- Ingresos
    ingreso_base         DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingreso_destajo      DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingreso_horas_extra  DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingreso_bonos        DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    total_ingresos       DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    -- Egresos
    aporte_iess_personal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    retencion_ir         DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    otros_descuentos     DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    total_egresos        DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    -- Resultado
    neto_a_pagar         DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    -- Provisiones (costo patronal, NO se descuentan al empleado)
    prov_decimo_tercero  DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    prov_decimo_cuarto   DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    prov_vacaciones      DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    prov_fondos_reserva  DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    aporte_iess_patronal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    estado               ENUM('BORRADOR','APROBADO','PAGADO') NOT NULL DEFAULT 'BORRADOR',
    procesado_en         TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_nomina_periodo_emp (periodo_id, empleado_id),
    KEY idx_nomina_emp (empleado_id),
    CONSTRAINT fk_nomina_periodo FOREIGN KEY (periodo_id)  REFERENCES periodos_nomina(id),
    CONSTRAINT fk_nomina_emp     FOREIGN KEY (empleado_id) REFERENCES empleados(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 14. NOMINA - DETALLE  (líneas de ingresos/egresos, trazabilidad total)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nomina_detalle (
    id            BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    nomina_id     BIGINT UNSIGNED NOT NULL,
    concepto_id   INT UNSIGNED NOT NULL,
    descripcion   VARCHAR(150) DEFAULT NULL,
    tipo          ENUM('INGRESO','EGRESO') NOT NULL,
    valor         DECIMAL(12,2) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_detalle_nomina (nomina_id),
    CONSTRAINT fk_detalle_nomina   FOREIGN KEY (nomina_id)   REFERENCES nomina_cabecera(id) ON DELETE CASCADE,
    CONSTRAINT fk_detalle_concepto FOREIGN KEY (concepto_id) REFERENCES conceptos_nomina(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;

-- =====================================================================
--  DATOS SEMILLA (catálogos base)
-- =====================================================================

INSERT INTO tipos_pago (codigo, nombre, periodicidad, descripcion) VALUES
 ('FIJO_MENSUAL',    'Sueldo Fijo Mensual',     'MENSUAL',  'Personal administrativo'),
 ('FIJO_QUINCENAL',  'Sueldo Fijo Quincenal',   'QUINCENAL','Pago cada 15 dias'),
 ('VARIABLE_SEMANAL','Sueldo Variable Semanal', 'SEMANAL',  'Operarios de planta'),
 ('POR_HORAS',       'Pago por Horas',          'SEMANAL',  'Con reloj de asistencia'),
 ('DESTAJO',         'Pago por Avance/Destajo',  'SEMANAL',  'Por gavetas/libras procesadas'),
 ('MIXTO',           'Mixto (Base + Destajo)',   'SEMANAL',  'Sueldo base + produccion');

-- Parámetros normativos vigentes (AJUSTA EL SBU AL VALOR DEL AÑO EN CURSO)
INSERT INTO parametros_costos (clave, valor, descripcion, vigente_desde) VALUES
 ('SBU',             470.000000, 'Salario Basico Unificado (ajustar por decreto anual)', '2026-01-01'),
 ('IESS_PERSONAL',   0.094500,   'Aporte personal IESS 9.45%',        '2026-01-01'),
 ('IESS_PATRONAL',   0.111500,   'Aporte patronal IESS 11.15%',       '2026-01-01'),
 ('FONDOS_RESERVA',  0.083300,   'Fondos de reserva 8.33% (tras 1 anio)', '2026-01-01'),
 ('RECARGO_SUPLEM',  0.500000,   'Recargo horas suplementarias +50%', '2026-01-01'),
 ('RECARGO_NOCTURNO',1.000000,   'Recargo suplementarias nocturnas +100%', '2026-01-01'),
 ('RECARGO_EXTRA',   1.000000,   'Recargo horas extraordinarias +100%', '2026-01-01'),
 ('HORAS_JORNADA',   8.000000,   'Horas de jornada diaria legal',     '2026-01-01'),
 ('DIAS_MES',        30.000000,  'Dias base para divisor mensual',    '2026-01-01');

INSERT INTO conceptos_nomina (codigo, nombre, tipo, aporta_iess) VALUES
 ('SUELDO_BASE',   'Sueldo Base',                 'INGRESO', 1),
 ('DESTAJO',       'Pago por Avance/Destajo',     'INGRESO', 1),
 ('HORA_SUPLEM',   'Horas Suplementarias',        'INGRESO', 1),
 ('HORA_EXTRA',    'Horas Extraordinarias',       'INGRESO', 1),
 ('BONO_PROD',     'Bono de Produccion',          'INGRESO', 1),
 ('BONO_NOGRAV',   'Bono No Gravado IESS',        'INGRESO', 0),
 ('IESS_PERS',     'Aporte Personal IESS',        'EGRESO',  0),
 ('ANTICIPO',      'Anticipo de Sueldo',          'EGRESO',  0),
 ('PRESTAMO_IESS', 'Prestamo Quirografario IESS', 'EGRESO',  0),
 ('MULTA',         'Multa / Descuento',           'EGRESO',  0),
 ('RETENCION_IR',  'Retencion Impuesto a la Renta','EGRESO', 0);

-- Ejemplo de tarifas de destajo (ajustar segun mercado)
INSERT INTO tarifas_avance (codigo, descripcion, unidad, tarifa_unitaria, vigente_desde) VALUES
 ('PELADO_GAVETA',  'Pelado de camaron por gaveta',      'GAVETA', 2.5000, '2026-01-01'),
 ('CLASIF_LIBRA',   'Clasificacion por libra',           'LIBRA',  0.0800, '2026-01-01'),
 ('DESCABEZADO_TINA','Descabezado por tina',             'TINA',   4.0000, '2026-01-01');

-- Usuario administrador inicial (password: Admin2026*  -> CAMBIAR en producción)
INSERT INTO usuarios (nombre, email, password_hash, rol) VALUES
 ('Administrador', 'admin@janickec.com',
  '$2y$10$e0MYzXyjpJS7Pd0RVvHwHe1HlHSSmZUxq2m5rY.sZQ7q3d7Nq0bK6', 'ADMIN');
