-- ============================================================
-- Club Palestino CRM v2.0 — MÓDULO RRHH
-- Fase 8 — Empleados / Contratos / Liquidaciones / Previred
-- empresa_id en TODAS las tablas
-- ============================================================

-- ── 1. EMPLEADOS ──────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_empleados` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `rut`           VARCHAR(12)      NOT NULL,
    `nombres`       VARCHAR(100)     NOT NULL,
    `apellido_p`    VARCHAR(60)      NOT NULL,
    `apellido_m`    VARCHAR(60)      NULL,
    `email`         VARCHAR(100)     NULL,
    `telefono`      VARCHAR(20)      NULL,
    `fecha_nac`     DATE             NULL,
    `sexo`          ENUM('M','F','O') NULL,
    `nacionalidad`  VARCHAR(60)      NULL DEFAULT 'Chilena',
    `direccion`     VARCHAR(200)     NULL,
    `comuna`        VARCHAR(60)      NULL,
    -- Cargo
    `cargo`         VARCHAR(100)     NULL,
    `area`          VARCHAR(80)      NULL,
    `centro_costo`  VARCHAR(20)      NULL,
    -- Contrato
    `tipo_contrato` ENUM('indefinido','plazo_fijo','honorarios','practicante','part_time') NOT NULL DEFAULT 'indefinido',
    `fecha_ingreso` DATE             NOT NULL,
    `fecha_termino` DATE             NULL COMMENT 'Para contratos a plazo fijo',
    `jornada_horas` TINYINT UNSIGNED NOT NULL DEFAULT 45 COMMENT 'Horas semanales',
    `sueldo_base`   DECIMAL(12,2)    NOT NULL COMMENT 'En CLP',
    -- Previsión
    `afp`           VARCHAR(60)      NULL,
    `afp_cod`       VARCHAR(5)       NULL COMMENT 'Código AFP para Previred',
    `salud`         ENUM('fonasa','isapre') NOT NULL DEFAULT 'fonasa',
    `isapre`        VARCHAR(60)      NULL,
    `isapre_plan`   DECIMAL(8,2)     NULL COMMENT 'Monto plan de salud CLP',
    `isapre_uf`     DECIMAL(6,4)     NULL COMMENT 'Monto plan en UF',
    `afiliado_mutual` VARCHAR(60)    NULL DEFAULT 'ACHS',
    -- Banco
    `banco`         VARCHAR(80)      NULL,
    `tipo_cuenta`   ENUM('corriente','ahorro','vista') NULL,
    `numero_cuenta` VARCHAR(30)      NULL,
    -- Estado
    `estado`        ENUM('activo','inactivo','licencia_medica','licencia_maternidad','vacaciones','suspendido') NOT NULL DEFAULT 'activo',
    `activo`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_empresa_rut` (`empresa_id`,`rut`),
    KEY `idx_empresa_estado` (`empresa_id`,`estado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 2. CONTRATOS ──────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_contratos` (
    `id`            INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `empleado_id`   INT UNSIGNED  NOT NULL,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `tipo`          ENUM('indefinido','plazo_fijo','honorarios','practicante','part_time') NOT NULL,
    `fecha_inicio`  DATE          NOT NULL,
    `fecha_fin`     DATE          NULL,
    `sueldo_base`   DECIMAL(12,2) NOT NULL,
    `jornada_horas` TINYINT       NOT NULL DEFAULT 45,
    `cargo`         VARCHAR(100)  NULL,
    `documento_path` VARCHAR(300) NULL COMMENT 'Ruta al PDF del contrato firmado',
    `firmado`       TINYINT(1)    NOT NULL DEFAULT 0,
    `activo`        TINYINT(1)    NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `fk_cont_emp` (`empleado_id`),
    CONSTRAINT `fk_cont_emp` FOREIGN KEY (`empleado_id`) REFERENCES `rrhh_empleados`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 3. TABLA SII — IMPUESTO 2DA CATEGORÍA ────────────────────
-- Tramos vigentes 2025 (UTM = ~$68.000 aprox, actualizar anualmente)
CREATE TABLE IF NOT EXISTS `rrhh_tabla_impuesto` (
    `id`            INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `anio`          YEAR          NOT NULL,
    `tramo`         TINYINT       NOT NULL,
    `desde_utm`     DECIMAL(8,4)  NOT NULL,
    `hasta_utm`     DECIMAL(8,4)  NOT NULL,
    `tasa`          DECIMAL(5,4)  NOT NULL COMMENT 'Fracción (ej: 0.04 = 4%)',
    `rebaja_utm`    DECIMAL(8,4)  NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_anio_tramo` (`anio`,`tramo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla 2025 (en UTM mensuales)
INSERT INTO `rrhh_tabla_impuesto` (`anio`,`tramo`,`desde_utm`,`hasta_utm`,`tasa`,`rebaja_utm`) VALUES
(2025,1,0,      13.5,   0.0000, 0.000),
(2025,2,13.5,   30.0,   0.0400, 0.540),
(2025,3,30.0,   50.0,   0.0800, 1.740),
(2025,4,50.0,   70.0,   0.1350, 4.490),
(2025,5,70.0,   90.0,   0.2300, 11.140),
(2025,6,90.0,   120.0,  0.3000, 17.440),
(2025,7,120.0,  150.0,  0.3500, 23.440),
(2025,8,150.0,  9999.0, 0.4000, 30.940);

-- ── 4. LIQUIDACIONES DE SUELDO ────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_liquidaciones` (
    `id`              INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`      TINYINT UNSIGNED NOT NULL,
    `empleado_id`     INT UNSIGNED     NOT NULL,
    `periodo`         CHAR(7)          NOT NULL COMMENT 'YYYY-MM',
    -- Haberes
    `sueldo_base`     DECIMAL(12,2)    NOT NULL,
    `horas_extra_num` DECIMAL(5,1)     NOT NULL DEFAULT 0,
    `horas_extra_val` DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `bono_asistencia` DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `bono_produccion` DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `colacion`        DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `movilizacion`    DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `otros_haberes`   DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `total_haberes`   DECIMAL(12,2)    NOT NULL,
    -- Imponible y no imponible
    `renta_imponible` DECIMAL(12,2)    NOT NULL COMMENT 'Base para AFP y salud',
    `renta_no_imponible' DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT 'Colación + movilización si aplica',
    -- Descuentos legales trabajador
    `afp_trabajador`  DECIMAL(10,2)    NOT NULL DEFAULT 0,
    `afp_tasa`        DECIMAL(6,4)     NOT NULL DEFAULT 0 COMMENT 'Tasa AFP del período',
    `sis`             DECIMAL(10,2)    NOT NULL DEFAULT 0 COMMENT 'Seguro de Invalidez y Sobrevivencia',
    `salud_trabajador` DECIMAL(10,2)   NOT NULL DEFAULT 0,
    `salud_tasa`      DECIMAL(6,4)     NOT NULL DEFAULT 0.07 COMMENT '7% Fonasa o plan Isapre',
    `impuesto_2da`    DECIMAL(10,2)    NOT NULL DEFAULT 0,
    `otros_descuentos' DECIMAL(10,2)   NOT NULL DEFAULT 0,
    `total_descuentos` DECIMAL(10,2)   NOT NULL,
    -- Líquido
    `liquido`         DECIMAL(12,2)    NOT NULL,
    -- Costo empresa
    `afp_empleador`   DECIMAL(10,2)    NOT NULL DEFAULT 0 COMMENT 'SIS = 1.53%',
    `salud_empleador` DECIMAL(10,2)    NOT NULL DEFAULT 0,
    `seguro_cesantia_trabajador` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '0.6%',
    `seguro_cesantia_empleador`  DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '2.4% o 3% PF',
    `mutual_accidentes` DECIMAL(10,2)  NOT NULL DEFAULT 0 COMMENT 'ACHS u otra',
    `costo_total_empresa` DECIMAL(12,2) NOT NULL,
    -- Control
    `dias_trabajados` TINYINT UNSIGNED NOT NULL DEFAULT 30,
    `dias_ausencia`   TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `estado`          ENUM('borrador','aprobado','pagado','enviado_previred') NOT NULL DEFAULT 'borrador',
    `fecha_pago`      DATE             NULL,
    `cuenta_banco_id` INT UNSIGNED     NULL,
    `asiento_id`      INT UNSIGNED     NULL,
    `pdf_path`        VARCHAR(300)     NULL,
    `created_at`      TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_emp_periodo` (`empleado_id`,`periodo`),
    KEY `idx_empresa_liq` (`empresa_id`,`periodo`,`estado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 5. PREVIRED (envío mensual) ───────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_previred` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `periodo`     CHAR(7)          NOT NULL,
    `estado`      ENUM('generado','enviado','confirmado','error') NOT NULL DEFAULT 'generado',
    `archivo_txt` TEXT             NULL COMMENT 'Contenido del archivo Previred',
    `total_afp`   DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `total_salud` DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `total_cesantia` DECIMAL(14,2) NOT NULL DEFAULT 0,
    `total_pagar` DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `num_trabajadores` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    `enviado_at`  TIMESTAMP        NULL,
    `confirmado_at' TIMESTAMP      NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_empresa_periodo` (`empresa_id`,`periodo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 6. VACACIONES ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_vacaciones` (
    `id`            INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `empleado_id`   INT UNSIGNED  NOT NULL,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `tipo`          ENUM('vacacion','permiso','licencia_medica','licencia_maternidad','otro') NOT NULL DEFAULT 'vacacion',
    `fecha_inicio`  DATE          NOT NULL,
    `fecha_fin`     DATE          NOT NULL,
    `dias_habiles`  TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `dias_corridos` TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `estado`        ENUM('solicitado','aprobado','rechazado','anulado') NOT NULL DEFAULT 'solicitado',
    `aprobado_por`  INT UNSIGNED  NULL,
    `observaciones` VARCHAR(300)  NULL,
    `created_at`    TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `fk_vac_emp` (`empleado_id`),
    CONSTRAINT `fk_vac_emp` FOREIGN KEY (`empleado_id`) REFERENCES `rrhh_empleados`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 7. SALDO DE VACACIONES ────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_saldo_vacaciones` (
    `empleado_id`   INT UNSIGNED  NOT NULL,
    `dias_ganados`  DECIMAL(6,2)  NOT NULL DEFAULT 0 COMMENT '15 días hábiles por año',
    `dias_usados`   DECIMAL(6,2)  NOT NULL DEFAULT 0,
    `dias_saldo`    DECIMAL(6,2)  NOT NULL DEFAULT 0,
    `updated_at`    TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`empleado_id`),
    CONSTRAINT `fk_sv_emp` FOREIGN KEY (`empleado_id`) REFERENCES `rrhh_empleados`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 8. FINIQUITOS ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_finiquitos` (
    `id`              INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empleado_id`     INT UNSIGNED     NOT NULL,
    `empresa_id`      TINYINT UNSIGNED NOT NULL,
    `fecha_termino`   DATE             NOT NULL,
    `causal`          VARCHAR(200)     NOT NULL COMMENT 'Art. 159 N°1, Art. 160, etc.',
    `codigo_causal`   VARCHAR(20)      NULL,
    -- Cálculo
    `meses_trabajados` DECIMAL(6,2)   NOT NULL DEFAULT 0,
    `sueldo_base_ref`  DECIMAL(12,2)  NOT NULL,
    `ultimo_sueldo`    DECIMAL(12,2)  NOT NULL,
    `indemnizacion_anos` DECIMAL(12,2) NOT NULL DEFAULT 0,
    `feriado_proporcional' DECIMAL(12,2) NOT NULL DEFAULT 0,
    `aviso_previo`    DECIMAL(12,2)   NOT NULL DEFAULT 0,
    `otros_conceptos` DECIMAL(12,2)   NOT NULL DEFAULT 0,
    `total_bruto`     DECIMAL(12,2)   NOT NULL,
    `descuentos`      DECIMAL(12,2)   NOT NULL DEFAULT 0,
    `total_neto`      DECIMAL(12,2)   NOT NULL,
    -- Control
    `estado`          ENUM('borrador','firmado','pagado') NOT NULL DEFAULT 'borrador',
    `fecha_pago`      DATE            NULL,
    `cuenta_banco_id` INT UNSIGNED    NULL,
    `pdf_path`        VARCHAR(300)    NULL,
    `asiento_id`      INT UNSIGNED    NULL,
    `created_at`      TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `fk_fin_emp` (`empleado_id`),
    CONSTRAINT `fk_fin_emp` FOREIGN KEY (`empleado_id`) REFERENCES `rrhh_empleados`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 9. LICENCIAS MÉDICAS ──────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_licencias` (
    `id`            INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `empleado_id`   INT UNSIGNED  NOT NULL,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `tipo`          ENUM('medica','maternidad','paternidad','adopcion') NOT NULL DEFAULT 'medica',
    `folio`         VARCHAR(30)   NULL,
    `dias`          TINYINT UNSIGNED NOT NULL,
    `fecha_inicio`  DATE          NOT NULL,
    `fecha_fin`     DATE          NOT NULL,
    `estado`        ENUM('presentada','autorizada','rechazada') NOT NULL DEFAULT 'presentada',
    `subsidio_diario' DECIMAL(10,2) NULL,
    `total_subsidio` DECIMAL(12,2) NULL,
    `created_at`    TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `fk_lic_emp` (`empleado_id`),
    CONSTRAINT `fk_lic_emp` FOREIGN KEY (`empleado_id`) REFERENCES `rrhh_empleados`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 10. ASISTENCIA ────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `rrhh_asistencia` (
    `id`            BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `empleado_id`   INT UNSIGNED    NOT NULL,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `fecha`         DATE            NOT NULL,
    `hora_entrada`  TIME            NULL,
    `hora_salida`   TIME            NULL,
    `horas_trabajadas` DECIMAL(4,2) NULL,
    `horas_extra`   DECIMAL(4,2)    NOT NULL DEFAULT 0,
    `tipo`          ENUM('normal','extra','feriado','ausencia','licencia','vacacion') NOT NULL DEFAULT 'normal',
    `origen`        ENUM('zkteco','manual','importacion') NOT NULL DEFAULT 'zkteco',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_emp_fecha` (`empleado_id`,`fecha`),
    KEY `idx_empresa_fecha` (`empresa_id`,`fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

