-- ============================================================
-- Club Palestino CRM v2.0 — BD MULTIEMPRESA
-- empresa_id en TODAS las tablas
-- 4 RUTs independientes sobre una sola BD MySQL
-- ============================================================

-- ── 1. TABLA MAESTRA DE EMPRESAS ─────────────────────────────
CREATE TABLE IF NOT EXISTS `empresas` (
    `id`              TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `rut`             VARCHAR(12)      NOT NULL COMMENT 'RUT de la empresa ej: 76.123.456-7',
    `razon_social`    VARCHAR(150)     NOT NULL,
    `nombre_fantasia` VARCHAR(100)     NULL,
    `tipo`            ENUM(
        'club_principal',    -- RUT principal del club
        'restaurant',        -- Restaurant + Pérgola (IVA afecto)
        'instalaciones',     -- Canchas/deportivo (exento)
        'membresias'         -- Membresías (nota venta exenta)
    ) NOT NULL,
    `regimen_tributario` ENUM('afecto_iva','exento','nota_venta_exenta') NOT NULL,
    `emite_dte`       TINYINT(1)       NOT NULL DEFAULT 1,
    `tipo_dte_default` TINYINT UNSIGNED NULL    COMMENT '33=Factura, 39=Boleta, 56=Nota débito',
    `giro`            VARCHAR(200)     NULL,
    `direccion`       VARCHAR(200)     NULL,
    `comuna`          VARCHAR(60)      NULL,
    `ciudad`          VARCHAR(60)      NULL DEFAULT 'Santiago',
    `email`           VARCHAR(100)     NULL,
    `telefono`        VARCHAR(20)      NULL,
    `logo_path`       VARCHAR(200)     NULL,
    `cert_sii_path`   VARCHAR(200)     NULL  COMMENT 'Ruta al certificado .pfx del SII',
    `cert_sii_pass`   VARCHAR(200)     NULL  COMMENT 'Contraseña cifrada del certificado',
    `ambiente_sii`    ENUM('certificacion','produccion') NOT NULL DEFAULT 'certificacion',
    `activo`          TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`      TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_rut` (`rut`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Entidades tributarias del club — una fila por RUT';

INSERT INTO `empresas`
    (`rut`, `razon_social`, `nombre_fantasia`, `tipo`, `regimen_tributario`, `emite_dte`, `tipo_dte_default`, `giro`) VALUES
('76.XXX.XXX-X', 'Corporación Club Palestino',      'Club Palestino',            'club_principal', 'exento',           1, 56,  'Corporación deportiva y cultural'),
('XX.XXX.XXX-X', 'Palestino Restaurant SpA',        'Restaurant Club Palestino', 'restaurant',     'afecto_iva',       1, 39,  'Servicios de alimentación y restaurant'),
('XX.XXX.XXX-X', 'Palestino Instalaciones SpA',     'Instalaciones Deportivas',  'instalaciones',  'exento',           1, 56,  'Arriendo de instalaciones deportivas'),
('XX.XXX.XXX-X', 'Club Palestino Membresías',        'Membresías CP',             'membresias',     'nota_venta_exenta',1, 56,  'Cuotas y membresías de socios');

-- ── 2. CUENTAS CORRIENTES (una o más por empresa) ────────────
CREATE TABLE IF NOT EXISTS `cuentas_corrientes` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `banco`       VARCHAR(80)      NOT NULL COMMENT 'Ej: Banco Chile, Santander, BCI',
    `tipo_cuenta` ENUM('corriente','ahorro','vista') NOT NULL DEFAULT 'corriente',
    `numero`      VARCHAR(30)      NOT NULL,
    `nombre_titular` VARCHAR(150)  NOT NULL,
    `rut_titular` VARCHAR(12)      NOT NULL,
    `moneda`      ENUM('CLP','UF','USD') NOT NULL DEFAULT 'CLP',
    `saldo_actual` DECIMAL(14,2)   NOT NULL DEFAULT 0,
    `es_principal` TINYINT(1)      NOT NULL DEFAULT 0,
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `updated_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_cta` (`empresa_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 3. CONFIG SISTEMA POR EMPRESA ─────────────────────────────
CREATE TABLE IF NOT EXISTS `config_empresa` (
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `clave`       VARCHAR(80)      NOT NULL,
    `valor`       VARCHAR(500)     NOT NULL,
    `descripcion` VARCHAR(300)     NULL,
    PRIMARY KEY (`empresa_id`, `clave`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 4. PLAN DE CUENTAS MULTIEMPRESA ───────────────────────────
CREATE TABLE IF NOT EXISTS `conta_plan_cuentas` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `codigo`      VARCHAR(20)      NOT NULL COMMENT 'Ej: 1.1.01.001',
    `nombre`      VARCHAR(150)     NOT NULL,
    `tipo`        ENUM('activo','pasivo','patrimonio','ingreso','gasto','resultado') NOT NULL,
    `subtipo`     VARCHAR(60)      NULL,
    `nivel`       TINYINT          NOT NULL DEFAULT 1,
    `padre_id`    INT UNSIGNED     NULL,
    `es_imputable` TINYINT(1)      NOT NULL DEFAULT 1 COMMENT '1=acepta movimientos',
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_empresa_codigo` (`empresa_id`, `codigo`),
    KEY `idx_empresa_cuenta` (`empresa_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 5. LIBRO DIARIO ───────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `conta_asientos` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `numero`      INT UNSIGNED     NOT NULL,
    `fecha`       DATE             NOT NULL,
    `glosa`       VARCHAR(300)     NOT NULL,
    `tipo`        ENUM('manual','automatico_venta','automatico_pago','ajuste','apertura','cierre') NOT NULL DEFAULT 'manual',
    `referencia`  VARCHAR(100)     NULL  COMMENT 'Ej: DTE-39-001234',
    `total_debe`  DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `total_haber` DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `usuario_id`  INT UNSIGNED     NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_empresa_numero` (`empresa_id`, `numero`),
    KEY `idx_empresa_fecha` (`empresa_id`, `fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `conta_asiento_items` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `asiento_id`  INT UNSIGNED     NOT NULL,
    `cuenta_id`   INT UNSIGNED     NOT NULL,
    `descripcion` VARCHAR(200)     NULL,
    `debe`        DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `haber`       DECIMAL(14,2)    NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`),
    KEY `fk_item_asiento` (`asiento_id`),
    KEY `fk_item_cuenta`  (`cuenta_id`),
    CONSTRAINT `fk_item_asiento` FOREIGN KEY (`asiento_id`) REFERENCES `conta_asientos`(`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_item_cuenta`  FOREIGN KEY (`cuenta_id`)  REFERENCES `conta_plan_cuentas`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 6. PROVEEDORES MULTIEMPRESA ───────────────────────────────
CREATE TABLE IF NOT EXISTS `proveedores` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `rut`         VARCHAR(12)      NOT NULL,
    `razon_social` VARCHAR(150)    NOT NULL,
    `giro`        VARCHAR(200)     NULL,
    `direccion`   VARCHAR(200)     NULL,
    `email`       VARCHAR(100)     NULL,
    `telefono`    VARCHAR(20)      NULL,
    `contacto`    VARCHAR(100)     NULL,
    `banco`       VARCHAR(80)      NULL,
    `tipo_cuenta` VARCHAR(20)      NULL,
    `numero_cuenta` VARCHAR(30)    NULL,
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_prov` (`empresa_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 7. DOCUMENTOS DE COMPRA (facturas de proveedores) ─────────
CREATE TABLE IF NOT EXISTS `compras_documentos` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`    TINYINT UNSIGNED NOT NULL,
    `proveedor_id`  INT UNSIGNED     NOT NULL,
    `tipo_dte`      TINYINT UNSIGNED NOT NULL COMMENT '33=Factura, 61=Nota crédito',
    `folio`         INT UNSIGNED     NOT NULL,
    `fecha_emision` DATE             NOT NULL,
    `fecha_vencimiento` DATE         NULL,
    `neto`          DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `iva`           DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `total`         DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `glosa`         VARCHAR(300)     NULL,
    `estado`        ENUM('pendiente','pagado','vencido','anulado') NOT NULL DEFAULT 'pendiente',
    `cuenta_pago_id` INT UNSIGNED    NULL  COMMENT 'FK cuentas_corrientes',
    `fecha_pago`    DATE             NULL,
    `asiento_id`    INT UNSIGNED     NULL,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_compra` (`empresa_id`, `estado`),
    KEY `fk_compra_prov`    (`proveedor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 8. PAGOS A PROVEEDORES ────────────────────────────────────
CREATE TABLE IF NOT EXISTS `pagos_proveedores` (
    `id`             INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`     TINYINT UNSIGNED NOT NULL,
    `proveedor_id`   INT UNSIGNED     NOT NULL,
    `documento_id`   INT UNSIGNED     NULL,
    `cuenta_id`      INT UNSIGNED     NOT NULL COMMENT 'Cuenta corriente desde la que se paga',
    `monto`          DECIMAL(14,2)    NOT NULL,
    `fecha`          DATE             NOT NULL,
    `medio_pago`     ENUM('transferencia','cheque','efectivo','tarjeta') NOT NULL DEFAULT 'transferencia',
    `referencia`     VARCHAR(100)     NULL COMMENT 'N° transferencia o cheque',
    `glosa`          VARCHAR(200)     NULL,
    `asiento_id`     INT UNSIGNED     NULL,
    `usuario_id`     INT UNSIGNED     NULL,
    `created_at`     TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_pago` (`empresa_id`, `fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 9. MOVIMIENTOS DE CUENTA CORRIENTE ───────────────────────
CREATE TABLE IF NOT EXISTS `movimientos_cta_cte` (
    `id`          BIGINT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `cuenta_id`   INT UNSIGNED     NOT NULL,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `fecha`       DATE             NOT NULL,
    `tipo`        ENUM('ingreso','egreso') NOT NULL,
    `monto`       DECIMAL(14,2)    NOT NULL,
    `saldo`       DECIMAL(14,2)    NOT NULL COMMENT 'Saldo después de este movimiento',
    `glosa`       VARCHAR(300)     NOT NULL,
    `origen`      ENUM('venta','pago_proveedor','nomina','transferencia','ajuste','otro') NOT NULL,
    `referencia`  VARCHAR(100)     NULL,
    `asiento_id`  INT UNSIGNED     NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_cuenta_fecha` (`cuenta_id`, `fecha`),
    KEY `idx_empresa_mov`  (`empresa_id`, `fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 10. FOLIOS SII (CAF) POR EMPRESA ─────────────────────────
CREATE TABLE IF NOT EXISTS `sii_folios` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `tipo_dte`    TINYINT UNSIGNED NOT NULL COMMENT '33=Factura,39=Boleta,56=Nota débito,61=Nota crédito',
    `rango_desde` INT UNSIGNED     NOT NULL,
    `rango_hasta` INT UNSIGNED     NOT NULL,
    `folio_actual` INT UNSIGNED    NOT NULL,
    `caf_xml`     TEXT             NULL COMMENT 'CAF en XML del SII',
    `fecha_venc`  DATE             NULL,
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_tipo` (`empresa_id`, `tipo_dte`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 11. DTE EMITIDOS ─────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `dte_documentos` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `tipo_dte`    TINYINT UNSIGNED NOT NULL,
    `folio`       INT UNSIGNED     NOT NULL,
    `fecha`       DATE             NOT NULL,
    `rut_receptor` VARCHAR(12)     NULL,
    `razon_receptor` VARCHAR(150)  NULL,
    `neto`        DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `iva`         DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `exento`      DECIMAL(14,2)    NOT NULL DEFAULT 0,
    `total`       DECIMAL(14,2)    NOT NULL,
    `estado_sii`  ENUM('pendiente','enviado','aceptado','rechazado','anulado') NOT NULL DEFAULT 'pendiente',
    `track_id`    VARCHAR(50)      NULL COMMENT 'TrackID del SII',
    `xml_firmado` MEDIUMTEXT       NULL,
    `pdf_path`    VARCHAR(200)     NULL,
    `socio_id`    INT UNSIGNED     NULL,
    `asiento_id`  INT UNSIGNED     NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_empresa_tipo_folio` (`empresa_id`, `tipo_dte`, `folio`),
    KEY `idx_empresa_dte` (`empresa_id`, `fecha`, `estado_sii`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 12. RRHH — 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,
    `cargo`       VARCHAR(100)     NULL,
    `area`        VARCHAR(80)      NULL,
    `tipo_contrato` ENUM('indefinido','plazo_fijo','honorarios','practicante') NOT NULL,
    `fecha_ingreso` DATE           NOT NULL,
    `fecha_termino` DATE           NULL,
    `sueldo_base` DECIMAL(12,2)    NOT NULL,
    `afp`         VARCHAR(60)      NULL,
    `salud`       VARCHAR(60)      NULL COMMENT 'Isapre o Fonasa',
    `banco`       VARCHAR(80)      NULL,
    `tipo_cuenta` VARCHAR(20)      NULL,
    `numero_cuenta` VARCHAR(30)    NULL,
    `estado`      ENUM('activo','inactivo','licencia') NOT NULL DEFAULT 'activo',
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_empresa_emp` (`empresa_id`, `estado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 13. RRHH — LIQUIDACIONES ─────────────────────────────────
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',
    `sueldo_base`  DECIMAL(12,2)    NOT NULL,
    `horas_extra`  DECIMAL(6,2)     NOT NULL DEFAULT 0,
    `bono_asist`   DECIMAL(12,2)    NOT NULL DEFAULT 0,
    `otros_haberes` DECIMAL(12,2)   NOT NULL DEFAULT 0,
    `total_haberes` DECIMAL(12,2)   NOT NULL,
    `afp_trabajador` DECIMAL(10,2)  NOT NULL DEFAULT 0,
    `salud_trabajador' DECIMAL(10,2) NOT NULL DEFAULT 0,
    `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,
    `liquido`      DECIMAL(12,2)    NOT NULL,
    `afp_empleador` DECIMAL(10,2)   NOT NULL DEFAULT 0,
    `salud_empleador' DECIMAL(10,2) NOT NULL DEFAULT 0,
    `seguro_cesantia' DECIMAL(10,2) NOT NULL DEFAULT 0,
    `estado`       ENUM('borrador','pagado','enviado_previred') NOT NULL DEFAULT 'borrador',
    `fecha_pago`   DATE             NULL,
    `cuenta_id`    INT UNSIGNED     NULL,
    `asiento_id`   INT UNSIGNED     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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 14. MÓDULOS ACTIVADOS POR EMPRESA ────────────────────────
CREATE TABLE IF NOT EXISTS `modulos_empresa` (
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `modulo`      VARCHAR(40)      NOT NULL COMMENT 'socios,restaurant,reservas,eventos,contabilidad,rrhh,etc',
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `config`      JSON             NULL,
    PRIMARY KEY (`empresa_id`, `modulo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Control de módulos habilitados por empresa — arquitectura modular';

-- ── USUARIOS Y ROLES MULTIEMPRESA ────────────────────────────
CREATE TABLE IF NOT EXISTS `usuarios` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `nombre`      VARCHAR(150)     NOT NULL,
    `email`       VARCHAR(100)     NOT NULL,
    `password_hash` VARCHAR(255)   NOT NULL,
    `tipo`        ENUM('superadmin','admin','contador','rrhh','cajero','recepcion','socio') NOT NULL DEFAULT 'recepcion',
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `ultimo_login` TIMESTAMP       NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `usuarios_empresas` (
    `usuario_id`  INT UNSIGNED     NOT NULL,
    `empresa_id`  TINYINT UNSIGNED NOT NULL,
    `rol`         VARCHAR(40)      NOT NULL,
    `permisos`    JSON             NULL,
    PRIMARY KEY (`usuario_id`, `empresa_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Un usuario puede tener distintos roles en distintas empresas';

