-- =========================================================================
-- ALPUNTO — Sistema POS + Gestion de Inventario + SIGES + Panel Admin
-- Script de creacion de base de datos (MySQL 8 / MariaDB 10.x)
-- Base de datos destino: alfredoc_tesis
--
-- Supuestos de diseno (ajustar si difieren de lo ya construido en Etapa 2):
--   - Una instalacion = una tienda (no es multi-empresa).
--   - El login usa "codigo" del trabajador, no usuario/correo.
--   - Cantidades admiten decimales (productos vendidos por peso/volumen).
--   - El redondeo obligatorio (INDECOPI) se guarda en ventas y cierres.
-- =========================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =========================================================================
-- MODULO 1: SEGURIDAD Y USUARIOS (2.1)
-- =========================================================================

CREATE TABLE roles (
    id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre        VARCHAR(50) NOT NULL UNIQUE,
    descripcion   VARCHAR(255) NULL,
    created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  COMMENT='Roles fijos del sistema: Administrador, Gerente, Supervisor, Cajero, Vendedor';

CREATE TABLE usuarios (
    id                 INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo             VARCHAR(20) NOT NULL UNIQUE COMMENT 'Codigo de acceso usado para login (no usuario/correo)',
    nombres            VARCHAR(100) NOT NULL,
    apellidos          VARCHAR(100) NOT NULL,
    dni                VARCHAR(8) NULL,
    password_hash      VARCHAR(255) NOT NULL,
    rol_id             INT UNSIGNED NOT NULL,
    foto               VARCHAR(255) NULL,
    estado             ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
    intentos_fallidos  TINYINT UNSIGNED NOT NULL DEFAULT 0,
    bloqueado_hasta    DATETIME NULL COMMENT 'Bloqueo temporal tras 5 intentos fallidos',
    ultimo_acceso      DATETIME NULL,
    created_at         TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at         TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_usuarios_rol FOREIGN KEY (rol_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE password_resets (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id   INT UNSIGNED NOT NULL,
    token        VARCHAR(255) NOT NULL,
    correo       VARCHAR(150) NULL,
    expira       DATETIME NOT NULL,
    usado        TINYINT(1) NOT NULL DEFAULT 0,
    created_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_reset_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE sesiones (
    id            BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id    INT UNSIGNED NOT NULL,
    ip_address    VARCHAR(45) NULL,
    navegador     VARCHAR(255) NULL,
    fecha_inicio  DATETIME NOT NULL,
    fecha_fin     DATETIME NULL,
    activo        TINYINT(1) NOT NULL DEFAULT 1,
    CONSTRAINT fk_sesion_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE auditoria (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id      INT UNSIGNED NULL,
    accion          VARCHAR(100) NOT NULL COMMENT 'ej: login, venta.crear, producto.editar, cierre.aprobar',
    tabla_afectada  VARCHAR(50) NULL,
    registro_id     BIGINT UNSIGNED NULL,
    detalle         TEXT NULL,
    ip_address      VARCHAR(45) NULL,
    fecha           TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_auditoria_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    INDEX idx_auditoria_fecha (fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =========================================================================
-- MODULO 2: CATALOGO E INVENTARIO (2.3)
-- =========================================================================

CREATE TABLE unidades_medida (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre       VARCHAR(50) NOT NULL,
    abreviatura  VARCHAR(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE categorias (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre              VARCHAR(100) NOT NULL,
    categoria_padre_id  INT UNSIGNED NULL,
    estado              ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
    CONSTRAINT fk_categoria_padre FOREIGN KEY (categoria_padre_id) REFERENCES categorias(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Categorias jerarquicas (padre -> hijo)';

CREATE TABLE marcas (
    id      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre  VARCHAR(100) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE proveedores (
    id                INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ruc               VARCHAR(11) NOT NULL UNIQUE,
    razon_social      VARCHAR(150) NOT NULL,
    direccion         VARCHAR(255) NULL,
    telefono          VARCHAR(20) NULL,
    correo            VARCHAR(150) NULL,
    contacto          VARCHAR(100) NULL,
    condiciones_pago  VARCHAR(100) NULL,
    estado            ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
    created_at        TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE productos (
    id                   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo               VARCHAR(30) NOT NULL UNIQUE,
    codigo_barras        VARCHAR(30) NULL UNIQUE,
    nombre               VARCHAR(150) NOT NULL,
    descripcion          TEXT NULL,
    imagen               VARCHAR(255) NULL,
    categoria_id         INT UNSIGNED NULL,
    marca_id             INT UNSIGNED NULL,
    proveedor_id         INT UNSIGNED NULL,
    unidad_medida_id     INT UNSIGNED NULL,
    precio_compra        DECIMAL(10,3) NOT NULL DEFAULT 0,
    precio_venta         DECIMAL(10,3) NOT NULL DEFAULT 0,
    precio_venta_usd     DECIMAL(10,3) NOT NULL DEFAULT 0,
    stock_actual         DECIMAL(10,3) NOT NULL DEFAULT 0,
    stock_minimo         DECIMAL(10,3) NOT NULL DEFAULT 0,
    stock_maximo         DECIMAL(10,3) NULL,
    ubicacion            VARCHAR(100) NULL COMMENT 'pasillo/estante/nivel',
    control_lotes        TINYINT(1) NOT NULL DEFAULT 0,
    registro_sanitario   VARCHAR(50) NULL,
    producto_controlado  TINYINT(1) NOT NULL DEFAULT 0,
    peso_variable        TINYINT(1) NOT NULL DEFAULT 0,
    estado               ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
    created_at           TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at           TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_producto_categoria FOREIGN KEY (categoria_id) REFERENCES categorias(id),
    CONSTRAINT fk_producto_marca FOREIGN KEY (marca_id) REFERENCES marcas(id),
    CONSTRAINT fk_producto_proveedor FOREIGN KEY (proveedor_id) REFERENCES proveedores(id),
    CONSTRAINT fk_producto_unidad FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id),
    INDEX idx_producto_nombre (nombre),
    INDEX idx_producto_stock (stock_actual)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE atributos (
    id      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre  VARCHAR(50) NOT NULL UNIQUE COMMENT 'ej: Talla, Color, Sabor'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE producto_atributos (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    producto_id  INT UNSIGNED NOT NULL,
    atributo_id  INT UNSIGNED NOT NULL,
    valor        VARCHAR(50) NOT NULL,
    CONSTRAINT fk_prodatrib_producto FOREIGN KEY (producto_id) REFERENCES productos(id) ON DELETE CASCADE,
    CONSTRAINT fk_prodatrib_atributo FOREIGN KEY (atributo_id) REFERENCES atributos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE lotes (
    id                 INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    producto_id        INT UNSIGNED NOT NULL,
    numero_lote        VARCHAR(50) NOT NULL,
    fecha_vencimiento  DATE NULL,
    cantidad           DECIMAL(10,3) NOT NULL DEFAULT 0,
    fecha_ingreso      DATE NOT NULL,
    CONSTRAINT fk_lote_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    INDEX idx_lote_vencimiento (fecha_vencimiento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE movimientos_inventario (
    id                BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    producto_id       INT UNSIGNED NOT NULL,
    tipo              ENUM('entrada','salida') NOT NULL,
    subtipo           ENUM('compra','devolucion_cliente','ajuste_positivo','venta','devolucion_proveedor','merma','ajuste_negativo') NOT NULL,
    cantidad          DECIMAL(10,3) NOT NULL,
    precio            DECIMAL(10,3) NULL,
    documento_tipo    VARCHAR(30) NULL,
    documento_numero  VARCHAR(30) NULL,
    usuario_id        INT UNSIGNED NOT NULL,
    motivo            VARCHAR(255) NULL,
    fecha             TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_movimiento_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_movimiento_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    INDEX idx_movimiento_producto_fecha (producto_id, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE conteos_inventario (
    id               INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id       INT UNSIGNED NOT NULL,
    fecha            DATETIME NOT NULL,
    filtro_aplicado  VARCHAR(255) NULL COMMENT 'categoria, ubicacion o productos especificos',
    estado           ENUM('en_proceso','finalizado') NOT NULL DEFAULT 'en_proceso',
    CONSTRAINT fk_conteo_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE conteo_inventario_detalle (
    id               BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    conteo_id        INT UNSIGNED NOT NULL,
    producto_id      INT UNSIGNED NOT NULL,
    stock_esperado   DECIMAL(10,3) NOT NULL,
    stock_contado    DECIMAL(10,3) NOT NULL,
    diferencia       DECIMAL(10,3) NOT NULL,
    CONSTRAINT fk_conteodet_conteo FOREIGN KEY (conteo_id) REFERENCES conteos_inventario(id) ON DELETE CASCADE,
    CONSTRAINT fk_conteodet_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =========================================================================
-- MODULO 3: CLIENTES
-- =========================================================================

CREATE TABLE clientes (
    id                     INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tipo_documento         ENUM('DNI','RUC','SIN_DOCUMENTO') NOT NULL DEFAULT 'SIN_DOCUMENTO',
    numero_documento       VARCHAR(11) NULL,
    nombres_razon_social   VARCHAR(150) NULL,
    direccion              VARCHAR(255) NULL,
    telefono               VARCHAR(20) NULL,
    correo                 VARCHAR(150) NULL,
    created_at             TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_cliente_doc (tipo_documento, numero_documento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =========================================================================
-- MODULO 4: VENTAS / POS (2.2)
-- =========================================================================

CREATE TABLE cajas (
    id        INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre    VARCHAR(50) NOT NULL,
    terminal  VARCHAR(50) NULL,
    estado    ENUM('activa','inactiva') NOT NULL DEFAULT 'activa'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE metodos_pago (
    id      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre  VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Efectivo, Tarjeta, Yape, Plin, Tunki, Transferencia, Cheque, Nota de Credito';

CREATE TABLE ventas (
    id                 BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tipo_comprobante   ENUM('boleta','factura','ticket') NOT NULL,
    serie              VARCHAR(10) NOT NULL,
    numero             VARCHAR(15) NOT NULL,
    cliente_id         INT UNSIGNED NULL,
    usuario_id         INT UNSIGNED NOT NULL COMMENT 'vendedor/cajero que realiza la venta',
    caja_id            INT UNSIGNED NOT NULL,
    turno              TINYINT UNSIGNED NOT NULL,
    subtotal           DECIMAL(10,2) NOT NULL DEFAULT 0,
    descuento          DECIMAL(10,2) NOT NULL DEFAULT 0,
    igv                DECIMAL(10,2) NOT NULL DEFAULT 0,
    redondeo           DECIMAL(6,2) NOT NULL DEFAULT 0 COMMENT 'Redondeo INDECOPI',
    total              DECIMAL(10,2) NOT NULL DEFAULT 0,
    tipo_cambio        DECIMAL(10,6) NOT NULL DEFAULT 1,
    estado             ENUM('emitido','anulado') NOT NULL DEFAULT 'emitido',
    motivo_anulacion   VARCHAR(255) NULL,
    anulado_por        INT UNSIGNED NULL,
    fecha_anulacion    DATETIME NULL,
    fecha              TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_venta_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    CONSTRAINT fk_venta_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_venta_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
    CONSTRAINT fk_venta_anulador FOREIGN KEY (anulado_por) REFERENCES usuarios(id),
    UNIQUE KEY uq_venta_comprobante (tipo_comprobante, serie, numero),
    INDEX idx_venta_fecha (fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE venta_detalle (
    id                BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id          BIGINT UNSIGNED NOT NULL,
    producto_id       INT UNSIGNED NOT NULL,
    cantidad          DECIMAL(10,3) NOT NULL,
    precio_unitario   DECIMAL(10,3) NOT NULL,
    descuento         DECIMAL(10,2) NOT NULL DEFAULT 0,
    total             DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_ventadet_venta FOREIGN KEY (venta_id) REFERENCES ventas(id) ON DELETE CASCADE,
    CONSTRAINT fk_ventadet_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE venta_pagos (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id        BIGINT UNSIGNED NOT NULL,
    metodo_pago_id  INT UNSIGNED NOT NULL,
    monto_soles     DECIMAL(10,2) NOT NULL DEFAULT 0,
    monto_usd       DECIMAL(10,2) NOT NULL DEFAULT 0,
    CONSTRAINT fk_pago_venta FOREIGN KEY (venta_id) REFERENCES ventas(id) ON DELETE CASCADE,
    CONSTRAINT fk_pago_metodo FOREIGN KEY (metodo_pago_id) REFERENCES metodos_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Permite pagos mixtos: varias filas por venta';

CREATE TABLE pago_tarjeta_detalle (
    venta_pago_id       BIGINT UNSIGNED PRIMARY KEY,
    tipo_tarjeta        ENUM('visa','mastercard','american_express') NOT NULL,
    numero_enmascarado  VARCHAR(20) NULL,
    numero_operacion    VARCHAR(30) NULL,
    CONSTRAINT fk_pagotarjeta_pago FOREIGN KEY (venta_pago_id) REFERENCES venta_pagos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pago_billetera_detalle (
    venta_pago_id     BIGINT UNSIGNED PRIMARY KEY,
    tipo              ENUM('yape','plin','tunki') NOT NULL,
    numero_operacion  VARCHAR(30) NOT NULL,
    CONSTRAINT fk_pagobilletera_pago FOREIGN KEY (venta_pago_id) REFERENCES venta_pagos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pago_transferencia_detalle (
    venta_pago_id     BIGINT UNSIGNED PRIMARY KEY,
    banco             VARCHAR(50) NOT NULL,
    numero_operacion  VARCHAR(30) NOT NULL,
    CONSTRAINT fk_pagotransf_pago FOREIGN KEY (venta_pago_id) REFERENCES venta_pagos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pago_cheque_detalle (
    venta_pago_id  BIGINT UNSIGNED PRIMARY KEY,
    banco          VARCHAR(50) NOT NULL,
    numero_cheque  VARCHAR(30) NOT NULL,
    fecha_cobro    DATE NOT NULL,
    CONSTRAINT fk_pagocheque_pago FOREIGN KEY (venta_pago_id) REFERENCES venta_pagos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE notas_credito (
    id        INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id  BIGINT UNSIGNED NOT NULL,
    numero    VARCHAR(15) NOT NULL,
    motivo    VARCHAR(255) NOT NULL,
    monto     DECIMAL(10,2) NOT NULL,
    estado    ENUM('emitida','aplicada','anulada') NOT NULL DEFAULT 'emitida',
    fecha     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_notacredito_venta FOREIGN KEY (venta_id) REFERENCES ventas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =========================================================================
-- MODULO 5: SIGES — DEPOSITOS (2.4)
-- =========================================================================

CREATE TABLE depositos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    numero_deposito     VARCHAR(20) NOT NULL UNIQUE COMMENT 'ej: DEP-2026-0001',
    fecha               DATE NOT NULL,
    turno               TINYINT UNSIGNED NOT NULL,
    vendedor_id         INT UNSIGNED NOT NULL,
    caja_id             INT UNSIGNED NOT NULL,
    cantidad_monedas    INT UNSIGNED NOT NULL DEFAULT 0,
    total_monedas       DECIMAL(10,2) NOT NULL DEFAULT 0,
    cantidad_billetes   INT UNSIGNED NOT NULL DEFAULT 0,
    total_billetes      DECIMAL(10,2) NOT NULL DEFAULT 0,
    monto_total         DECIMAL(10,2) NOT NULL DEFAULT 0,
    descripcion         VARCHAR(255) NULL,
    estado              ENUM('pendiente','aprobado','rechazado') NOT NULL DEFAULT 'pendiente',
    aprobado_por        INT UNSIGNED NULL,
    fecha_aprobacion    DATETIME NULL,
    motivo_rechazo      VARCHAR(255) NULL,
    created_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_deposito_vendedor FOREIGN KEY (vendedor_id) REFERENCES usuarios(id),
    CONSTRAINT fk_deposito_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
    CONSTRAINT fk_deposito_aprobador FOREIGN KEY (aprobado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =========================================================================
-- MODULO 6: CIERRE DE CAJA X / Z (2.5)
-- =========================================================================

CREATE TABLE cierres_caja (
    id                    INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tipo                  ENUM('X','Z') NOT NULL,
    caja_id               INT UNSIGNED NOT NULL,
    turno                 TINYINT UNSIGNED NOT NULL,
    usuario_id            INT UNSIGNED NOT NULL,
    fecha_hora            DATETIME NOT NULL,
    num_transacciones     INT UNSIGNED NOT NULL DEFAULT 0,
    subtotal              DECIMAL(10,2) NOT NULL DEFAULT 0,
    igv                   DECIMAL(10,2) NOT NULL DEFAULT 0,
    redondeo              DECIMAL(6,2) NOT NULL DEFAULT 0,
    total                 DECIMAL(10,2) NOT NULL DEFAULT 0,
    ventas_efectivo       DECIMAL(10,2) NOT NULL DEFAULT 0,
    depositos_aprobados   DECIMAL(10,2) NOT NULL DEFAULT 0,
    conteo_fisico         DECIMAL(10,2) NULL,
    diferencia            DECIMAL(10,2) NULL COMMENT 'sobrante/faltante: conteo - (ventas_efectivo - depositos)',
    estado                ENUM('abierto','aprobado') NOT NULL DEFAULT 'abierto',
    aprobado_por          INT UNSIGNED NULL,
    fecha_aprobacion      DATETIME NULL,
    CONSTRAINT fk_cierre_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
    CONSTRAINT fk_cierre_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_cierre_aprobador FOREIGN KEY (aprobado_por) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE cierre_denominacion (
    id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    cierre_id     INT UNSIGNED NOT NULL,
    tipo          ENUM('moneda','billete') NOT NULL,
    denominacion  DECIMAL(6,2) NOT NULL,
    cantidad      INT UNSIGNED NOT NULL DEFAULT 0,
    subtotal      DECIMAL(10,2) NOT NULL DEFAULT 0,
    CONSTRAINT fk_denominacion_cierre FOREIGN KEY (cierre_id) REFERENCES cierres_caja(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Desglose del conteo fisico por billete/moneda';

-- =========================================================================
-- MODULO 7: CONFIGURACION Y PERSONALIZACION (2.8, 2.9)
-- =========================================================================

CREATE TABLE empresa_config (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre              VARCHAR(150) NOT NULL,
    ruc                 VARCHAR(11) NOT NULL,
    direccion           VARCHAR(255) NULL,
    telefono            VARCHAR(20) NULL,
    correo              VARCHAR(150) NULL,
    logo                VARCHAR(255) NULL,
    igv_porcentaje      DECIMAL(5,2) NOT NULL DEFAULT 18.00,
    moneda_principal    VARCHAR(10) NOT NULL DEFAULT 'PEN',
    tipo_cambio_actual  DECIMAL(10,6) NOT NULL DEFAULT 1,
    tipo_cambio_modo    ENUM('automatico','manual') NOT NULL DEFAULT 'manual',
    tema_color          VARCHAR(30) NULL,
    idioma              VARCHAR(10) NOT NULL DEFAULT 'es'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Fila unica: datos de la tienda (no es multi-empresa)';

CREATE TABLE configuracion_apis (
    id                    INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre                VARCHAR(30) NOT NULL UNIQUE COMMENT 'sunat, reniec, tipo_cambio, whatsapp, correo',
    proveedor             VARCHAR(100) NULL,
    api_key               VARCHAR(255) NULL,
    configuracion_json    JSON NULL,
    estado                ENUM('activo','inactivo') NOT NULL DEFAULT 'inactivo'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE plantillas_comprobante (
    id                 INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre             VARCHAR(100) NOT NULL,
    tipo_comprobante   ENUM('boleta','factura','ticket') NOT NULL,
    diseno_json        JSON NOT NULL COMMENT 'componentes y posiciones del editor WYSIWYG',
    es_default         TINYINT(1) NOT NULL DEFAULT 0,
    estado             ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
    created_at         TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SET FOREIGN_KEY_CHECKS = 1;

-- =========================================================================
-- DATOS INICIALES (seed)
-- =========================================================================

INSERT INTO roles (nombre, descripcion) VALUES
('Administrador', 'Control total del sistema'),
('Gerente',       'Gestion operativa y reportes'),
('Supervisor',    'Supervision de cajas y vendedores'),
('Cajero',        'Operaciones de caja'),
('Vendedor',      'Ventas y depositos');

INSERT INTO metodos_pago (nombre) VALUES
('Efectivo'), ('Tarjeta'), ('Yape'), ('Plin'), ('Tunki'), ('Transferencia'), ('Cheque'), ('Nota de Credito');

INSERT INTO cajas (nombre, terminal) VALUES ('Caja 1', 'TIENDA1');

INSERT INTO unidades_medida (nombre, abreviatura) VALUES
('Unidad', 'UND'), ('Kilogramo', 'KG'), ('Litro', 'LT'), ('Metro', 'M');

INSERT INTO empresa_config (nombre, ruc) VALUES ('Mi Tienda', '00000000000');
