-- Veltrix POS SaaS - Esquema inicial
-- Motor recomendado: MySQL 8+

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS factura_detalles;
DROP TABLE IF EXISTS facturas;
DROP TABLE IF EXISTS resoluciones_dian;
DROP TABLE IF EXISTS numeraciones_documentos;
DROP TABLE IF EXISTS pagos_compra;
DROP TABLE IF EXISTS recepcion_compra_detalles;
DROP TABLE IF EXISTS recepciones_compra;
DROP TABLE IF EXISTS orden_compra_detalles;
DROP TABLE IF EXISTS ordenes_compra;
DROP TABLE IF EXISTS compra_detalles;
DROP TABLE IF EXISTS compras;
DROP TABLE IF EXISTS proveedores;
DROP TABLE IF EXISTS ajustes_inventario;
DROP TABLE IF EXISTS movimientos_inventario;
DROP TABLE IF EXISTS inventario;
DROP TABLE IF EXISTS devoluciones;
DROP TABLE IF EXISTS venta_pagos;
DROP TABLE IF EXISTS venta_detalles;
DROP TABLE IF EXISTS ventas;
DROP TABLE IF EXISTS cierres_caja;
DROP TABLE IF EXISTS traspasos_caja;
DROP TABLE IF EXISTS movimientos_caja;
DROP TABLE IF EXISTS aperturas_caja;
DROP TABLE IF EXISTS cajas;
DROP TABLE IF EXISTS productos;
DROP TABLE IF EXISTS unidades_medida;
DROP TABLE IF EXISTS marcas;
DROP TABLE IF EXISTS categorias;
DROP TABLE IF EXISTS clientes;
DROP TABLE IF EXISTS configuracion_empresa;
DROP TABLE IF EXISTS configuracion_global;
DROP TABLE IF EXISTS soporte_ticket_eventos;
DROP TABLE IF EXISTS soporte_tickets;
DROP TABLE IF EXISTS notificacion_vistas;
DROP TABLE IF EXISTS ai_help_sessions;
DROP TABLE IF EXISTS ai_help_messages;
DROP TABLE IF EXISTS metodos_pago;
DROP TABLE IF EXISTS impresoras;
DROP TABLE IF EXISTS saas_checkout_intents;
DROP TABLE IF EXISTS avisos_cobro_suscripcion;
DROP TABLE IF EXISTS suscripciones;
DROP TABLE IF EXISTS pagos_suscripcion;
DROP TABLE IF EXISTS planes;
DROP TABLE IF EXISTS usuario_empresa;
DROP TABLE IF EXISTS logs_actividad;
DROP TABLE IF EXISTS rol_permiso;
DROP TABLE IF EXISTS permisos;
DROP TABLE IF EXISTS usuarios;
DROP TABLE IF EXISTS roles;
DROP TABLE IF EXISTS sucursales;
DROP TABLE IF EXISTS empresas;
DROP TABLE IF EXISTS monedas;
DROP TABLE IF EXISTS ciudades;
DROP TABLE IF EXISTS paises;
DROP TABLE IF EXISTS impuestos;

SET FOREIGN_KEY_CHECKS = 1;

CREATE TABLE paises (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(120) NOT NULL,
    codigo_iso2 CHAR(2) NOT NULL UNIQUE,
    codigo_iso3 CHAR(3) NOT NULL UNIQUE,
    created_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE ciudades (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    pais_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    departamento VARCHAR(120) NULL,
    codigo_dane VARCHAR(10) NULL,
    created_at DATETIME NULL,
    CONSTRAINT fk_ciudades_pais FOREIGN KEY (pais_id) REFERENCES paises(id),
    UNIQUE KEY uq_ciudades_pais_codigo_dane (pais_id, codigo_dane),
    INDEX idx_ciudades_pais_departamento_nombre (pais_id, departamento, nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE monedas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(10) NOT NULL UNIQUE,
    nombre VARCHAR(50) NOT NULL,
    simbolo VARCHAR(10) NOT NULL,
    decimales TINYINT NOT NULL DEFAULT 2,
    created_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE empresas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    slug VARCHAR(120) NOT NULL UNIQUE,
    nit VARCHAR(40) NULL,
    email VARCHAR(150) NULL,
    telefono VARCHAR(40) NULL,
    direccion VARCHAR(255) NULL,
    pais_id BIGINT UNSIGNED NULL,
    ciudad_id BIGINT UNSIGNED NULL,
    logo VARCHAR(255) NULL,
    moneda VARCHAR(10) NOT NULL DEFAULT 'COP',
    zona_horaria VARCHAR(60) NOT NULL DEFAULT 'America/Bogota',
    estado ENUM('activa', 'suspendida', 'bloqueada') NOT NULL DEFAULT 'activa',
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    CONSTRAINT fk_empresas_pais FOREIGN KEY (pais_id) REFERENCES paises(id),
    CONSTRAINT fk_empresas_ciudad FOREIGN KEY (ciudad_id) REFERENCES ciudades(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE sucursales (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    codigo VARCHAR(50) NULL,
    telefono VARCHAR(40) NULL,
    direccion VARCHAR(255) NULL,
    ciudad_id BIGINT UNSIGNED NULL,
    activa TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_sucursales_empresa (empresa_id),
    CONSTRAINT fk_sucursales_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_sucursales_ciudad FOREIGN KEY (ciudad_id) REFERENCES ciudades(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE roles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(80) NOT NULL,
    slug VARCHAR(80) NOT NULL UNIQUE,
    descripcion VARCHAR(255) NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    rol_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    email VARCHAR(180) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    telefono VARCHAR(40) NULL,
    foto VARCHAR(255) NULL,
    ultimo_login DATETIME NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_usuarios_empresa (empresa_id),
    INDEX idx_usuarios_sucursal (sucursal_id),
    CONSTRAINT fk_usuarios_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_usuarios_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_usuarios_rol FOREIGN KEY (rol_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE permisos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    codigo VARCHAR(150) NOT NULL UNIQUE,
    modulo VARCHAR(80) NOT NULL,
    created_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE rol_permiso (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    rol_id BIGINT UNSIGNED NOT NULL,
    permiso_id BIGINT UNSIGNED NOT NULL,
    created_at DATETIME NULL,
    UNIQUE KEY uk_rol_permiso (rol_id, permiso_id),
    CONSTRAINT fk_rol_permiso_rol FOREIGN KEY (rol_id) REFERENCES roles(id),
    CONSTRAINT fk_rol_permiso_permiso FOREIGN KEY (permiso_id) REFERENCES permisos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuario_empresa (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    es_principal TINYINT(1) NOT NULL DEFAULT 0,
    created_at DATETIME NULL,
    UNIQUE KEY uk_usuario_empresa (usuario_id, empresa_id),
    CONSTRAINT fk_usuario_empresa_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_usuario_empresa_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE logs_actividad (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NULL,
    usuario_id BIGINT UNSIGNED NULL,
    accion VARCHAR(120) NOT NULL,
    descripcion TEXT NULL,
    ip VARCHAR(45) NULL,
    user_agent VARCHAR(255) NULL,
    created_at DATETIME NULL,
    INDEX idx_logs_empresa_fecha (empresa_id, created_at),
    CONSTRAINT fk_logs_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_logs_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE planes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    slug VARCHAR(80) NOT NULL UNIQUE,
    precio_mensual DECIMAL(12,2) NOT NULL DEFAULT 0,
    max_usuarios INT NOT NULL DEFAULT 1,
    max_sucursales INT NOT NULL DEFAULT 1,
    max_productos INT NOT NULL DEFAULT 500,
    permite_facturacion_electronica TINYINT(1) NOT NULL DEFAULT 0,
    permite_reportes_avanzados TINYINT(1) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE suscripciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    plan_id BIGINT UNSIGNED NOT NULL,
    fecha_inicio DATE NOT NULL,
    fecha_vencimiento DATE NOT NULL,
    estado ENUM('activa', 'vencida', 'cancelada', 'morosa') NOT NULL DEFAULT 'activa',
    trial TINYINT(1) NOT NULL DEFAULT 0,
    auto_renovacion TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_suscripciones_empresa (empresa_id),
    CONSTRAINT fk_suscripciones_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_suscripciones_plan FOREIGN KEY (plan_id) REFERENCES planes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE pagos_suscripcion (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    suscripcion_id BIGINT UNSIGNED NOT NULL,
    pasarela VARCHAR(80) NOT NULL,
    referencia VARCHAR(120) NULL,
    monto DECIMAL(12,2) NOT NULL,
    moneda VARCHAR(10) NOT NULL DEFAULT 'COP',
    estado ENUM('pendiente', 'pagado', 'fallido', 'reembolsado') NOT NULL DEFAULT 'pagado',
    fecha_pago DATETIME NOT NULL,
    created_at DATETIME NULL,
    INDEX idx_pagos_suscripcion_empresa (empresa_id),
    CONSTRAINT fk_pagos_suscripcion_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_pagos_suscripcion FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE saas_checkout_intents (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    reference VARCHAR(80) NOT NULL UNIQUE,
    plan_id BIGINT UNSIGNED NOT NULL,
    empresa_nombre VARCHAR(150) NOT NULL,
    empresa_slug VARCHAR(120) NOT NULL,
    empresa_email VARCHAR(180) NULL,
    admin_nombre VARCHAR(150) NOT NULL,
    admin_email VARCHAR(180) NOT NULL,
    admin_password_hash VARCHAR(255) NOT NULL,
    currency VARCHAR(10) NOT NULL DEFAULT 'COP',
    amount_in_cents INT UNSIGNED NOT NULL,
    estado ENUM('pending', 'approved', 'declined', 'error', 'voided', 'provisioned', 'failed') NOT NULL DEFAULT 'pending',
    wompi_transaction_id VARCHAR(80) NULL,
    wompi_status VARCHAR(40) NULL,
    last_event_at DATETIME NULL,
    paid_at DATETIME NULL,
    empresa_id BIGINT UNSIGNED NULL,
    suscripcion_id BIGINT UNSIGNED NULL,
    provisioned_at DATETIME NULL,
    failure_reason VARCHAR(255) NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_saas_checkout_plan (plan_id),
    INDEX idx_saas_checkout_admin_email (admin_email),
    INDEX idx_saas_checkout_status (estado),
    CONSTRAINT fk_saas_checkout_plan FOREIGN KEY (plan_id) REFERENCES planes(id),
    CONSTRAINT fk_saas_checkout_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_saas_checkout_suscripcion FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE avisos_cobro_suscripcion (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    suscripcion_id BIGINT UNSIGNED NOT NULL,
    tipo VARCHAR(80) NOT NULL,
    fecha_referencia DATE NOT NULL,
    canal ENUM('email', 'whatsapp', 'log') NOT NULL DEFAULT 'email',
    destinatario VARCHAR(180) NULL,
    asunto VARCHAR(180) NULL,
    mensaje TEXT NULL,
    estado ENUM('pendiente', 'enviado', 'error') NOT NULL DEFAULT 'pendiente',
    intentos TINYINT UNSIGNED NOT NULL DEFAULT 0,
    max_intentos TINYINT UNSIGNED NOT NULL DEFAULT 3,
    ultimo_intento_at DATETIME NULL,
    proximo_intento_at DATETIME NULL,
    enviado_at DATETIME NULL,
    error_detalle VARCHAR(255) NULL,
    metadata_json TEXT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_aviso_cobro_dia_canal (suscripcion_id, tipo, fecha_referencia, canal),
    INDEX idx_aviso_cobro_empresa_fecha (empresa_id, fecha_referencia),
    INDEX idx_aviso_cobro_estado_retry (estado, proximo_intento_at),
    INDEX idx_aviso_cobro_intentos (intentos, max_intentos),
    CONSTRAINT fk_aviso_cobro_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_aviso_cobro_suscripcion FOREIGN KEY (suscripcion_id) REFERENCES suscripciones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE soporte_tickets (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    creado_por_usuario_id BIGINT UNSIGNED NULL,
    asignado_a_usuario_id BIGINT UNSIGNED NULL,
    asunto VARCHAR(180) NOT NULL,
    descripcion TEXT NOT NULL,
    prioridad ENUM('baja', 'media', 'alta', 'critica') NOT NULL DEFAULT 'media',
    estado ENUM('abierto', 'en_proceso', 'pendiente_cliente', 'resuelto', 'cerrado') NOT NULL DEFAULT 'abierto',
    canal VARCHAR(40) NOT NULL DEFAULT 'panel',
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    primera_respuesta_at DATETIME NULL,
    primera_respuesta_limite_at DATETIME NULL,
    resolucion_limite_at DATETIME NULL,
    objetivo_primera_respuesta_min SMALLINT UNSIGNED NOT NULL DEFAULT 120,
    objetivo_resolucion_horas SMALLINT UNSIGNED NOT NULL DEFAULT 24,
    sla_primera_respuesta_estado ENUM('pendiente', 'cumplido', 'incumplido') NOT NULL DEFAULT 'pendiente',
    sla_resolucion_estado ENUM('pendiente', 'cumplido', 'incumplido') NOT NULL DEFAULT 'pendiente',
    cerrado_at DATETIME NULL,
    resuelto_at DATETIME NULL,
    INDEX idx_soporte_tickets_empresa_estado (empresa_id, estado),
    INDEX idx_soporte_tickets_asignado (asignado_a_usuario_id),
    INDEX idx_soporte_sla_primer (sla_primera_respuesta_estado, primera_respuesta_limite_at),
    INDEX idx_soporte_sla_resolucion (sla_resolucion_estado, resolucion_limite_at),
    INDEX idx_soporte_created_at (created_at),
    CONSTRAINT fk_soporte_tickets_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_soporte_tickets_creado_por FOREIGN KEY (creado_por_usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_soporte_tickets_asignado FOREIGN KEY (asignado_a_usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE soporte_ticket_eventos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ticket_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NULL,
    tipo ENUM('creacion', 'comentario', 'estado', 'asignacion', 'interno') NOT NULL DEFAULT 'comentario',
    mensaje TEXT NOT NULL,
    estado_anterior VARCHAR(40) NULL,
    estado_nuevo VARCHAR(40) NULL,
    created_at DATETIME NULL,
    INDEX idx_soporte_eventos_ticket (ticket_id, created_at),
    CONSTRAINT fk_soporte_eventos_ticket FOREIGN KEY (ticket_id) REFERENCES soporte_tickets(id),
    CONSTRAINT fk_soporte_eventos_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE notificacion_vistas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL DEFAULT 0,
    notification_key VARCHAR(255) NOT NULL,
    leido_at DATETIME NOT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_notificacion_vistas_usuario_empresa_key (usuario_id, empresa_id, notification_key),
    INDEX idx_notificacion_vistas_empresa_usuario (empresa_id, usuario_id),
    INDEX idx_notificacion_vistas_leido_at (leido_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE ai_help_sessions (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    titulo VARCHAR(160) NOT NULL,
    estado ENUM('activa', 'cerrada') NOT NULL DEFAULT 'activa',
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    last_activity_at DATETIME NULL,
    closed_at DATETIME NULL,
    reopened_at DATETIME NULL,
    INDEX idx_ai_help_sessions_empresa_usuario_estado (empresa_id, usuario_id, estado, id),
    INDEX idx_ai_help_sessions_closed_at (closed_at),
    CONSTRAINT fk_ai_help_sessions_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_ai_help_sessions_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE ai_help_messages (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    session_id BIGINT UNSIGNED NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    rol ENUM('user', 'assistant', 'system') NOT NULL DEFAULT 'assistant',
    contenido TEXT NOT NULL,
    modelo VARCHAR(120) NULL,
    metadata_json TEXT NULL,
    created_at DATETIME NULL,
    INDEX idx_ai_help_messages_session (session_id, id),
    INDEX idx_ai_help_messages_empresa_usuario (empresa_id, usuario_id, id),
    INDEX idx_ai_help_messages_created_at (created_at),
    CONSTRAINT fk_ai_help_messages_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_ai_help_messages_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE cajas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(120) NOT NULL,
    estado ENUM('activa', 'inactiva') NOT NULL DEFAULT 'activa',
    created_at DATETIME NULL,
    CONSTRAINT fk_cajas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_cajas_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE aperturas_caja (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    caja_id BIGINT UNSIGNED NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    monto_apertura DECIMAL(12,2) NOT NULL DEFAULT 0,
    monto_cierre DECIMAL(12,2) NULL,
    diferencia DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('abierta', 'cerrada') NOT NULL DEFAULT 'abierta',
    fecha_apertura DATETIME NOT NULL,
    fecha_cierre DATETIME NULL,
    notas TEXT NULL,
    created_at DATETIME NULL,
    INDEX idx_aperturas_empresa_estado (empresa_id, estado),
    CONSTRAINT fk_aperturas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_aperturas_caja FOREIGN KEY (caja_id) REFERENCES cajas(id),
    CONSTRAINT fk_aperturas_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE movimientos_caja (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    apertura_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    tipo ENUM('ingreso', 'egreso') NOT NULL,
    concepto VARCHAR(160) NOT NULL,
    monto DECIMAL(12,2) NOT NULL DEFAULT 0,
    observacion TEXT NULL,
    created_at DATETIME NULL,
    INDEX idx_movimientos_caja_apertura (empresa_id, apertura_id),
    CONSTRAINT fk_movimientos_caja_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_movimientos_caja_apertura FOREIGN KEY (apertura_id) REFERENCES aperturas_caja(id),
    CONSTRAINT fk_movimientos_caja_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE traspasos_caja (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    apertura_origen_id BIGINT UNSIGNED NOT NULL,
    apertura_destino_id BIGINT UNSIGNED NOT NULL,
    usuario_origen_id BIGINT UNSIGNED NOT NULL,
    usuario_destino_id BIGINT UNSIGNED NOT NULL,
    monto DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('pendiente', 'aprobado', 'rechazado') NOT NULL DEFAULT 'pendiente',
    concepto VARCHAR(160) NOT NULL,
    observacion TEXT NULL,
    respondido_por_id BIGINT UNSIGNED NULL,
    respondido_at DATETIME NULL,
    observacion_respuesta TEXT NULL,
    created_at DATETIME NULL,
    INDEX idx_traspasos_empresa_fecha (empresa_id, created_at),
    INDEX idx_traspasos_estado_destino (empresa_id, estado, apertura_destino_id),
    CONSTRAINT fk_traspasos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_traspasos_apertura_origen FOREIGN KEY (apertura_origen_id) REFERENCES aperturas_caja(id),
    CONSTRAINT fk_traspasos_apertura_destino FOREIGN KEY (apertura_destino_id) REFERENCES aperturas_caja(id),
    CONSTRAINT fk_traspasos_usuario_origen FOREIGN KEY (usuario_origen_id) REFERENCES usuarios(id),
    CONSTRAINT fk_traspasos_usuario_destino FOREIGN KEY (usuario_destino_id) REFERENCES usuarios(id),
    CONSTRAINT fk_traspasos_respondido_por FOREIGN KEY (respondido_por_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE cierres_caja (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    apertura_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    monto_esperado DECIMAL(12,2) NOT NULL DEFAULT 0,
    monto_real DECIMAL(12,2) NOT NULL DEFAULT 0,
    diferencia DECIMAL(12,2) NOT NULL DEFAULT 0,
    created_at DATETIME NULL,
    CONSTRAINT fk_cierres_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_cierres_apertura FOREIGN KEY (apertura_id) REFERENCES aperturas_caja(id),
    CONSTRAINT fk_cierres_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE categorias (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    descripcion VARCHAR(255) NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    CONSTRAINT fk_categorias_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE marcas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    created_at DATETIME NULL,
    CONSTRAINT fk_marcas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE unidades_medida (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    abreviatura VARCHAR(20) NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    CONSTRAINT fk_unidades_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE productos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    categoria_id BIGINT UNSIGNED NULL,
    proveedor_id BIGINT UNSIGNED NULL,
    marca_id BIGINT UNSIGNED NULL,
    unidad_medida_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(180) NOT NULL,
    sku VARCHAR(80) NULL,
    codigo_barras VARCHAR(80) NULL,
    descripcion TEXT NULL,
    imagen VARCHAR(255) NULL,
    precio_compra DECIMAL(12,2) NOT NULL DEFAULT 0,
    precio_venta DECIMAL(12,2) NOT NULL DEFAULT 0,
    impuesto_porcentaje DECIMAL(5,2) NOT NULL DEFAULT 0,
    stock_actual DECIMAL(12,2) NOT NULL DEFAULT 0,
    stock_minimo DECIMAL(12,2) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_productos_empresa_nombre (empresa_id, nombre),
    UNIQUE KEY uk_productos_empresa_sku (empresa_id, sku),
    INDEX idx_productos_codigo_barras (codigo_barras),
    INDEX idx_productos_proveedor (proveedor_id),
    CONSTRAINT fk_productos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_productos_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_productos_categoria FOREIGN KEY (categoria_id) REFERENCES categorias(id),
    CONSTRAINT fk_productos_marca FOREIGN KEY (marca_id) REFERENCES marcas(id),
    CONSTRAINT fk_productos_unidad FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE producto_variantes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    sku VARCHAR(80) NULL,
    cantidad INT UNSIGNED NOT NULL DEFAULT 0,
    stock_minimo INT UNSIGNED NOT NULL DEFAULT 0,
    precio_venta DECIMAL(12,2) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_producto_variantes_producto (empresa_id, producto_id),
    UNIQUE KEY uk_producto_variante_nombre (empresa_id, producto_id, nombre),
    CONSTRAINT fk_producto_variantes_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_producto_variantes_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE inventario (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    stock DECIMAL(12,2) NOT NULL DEFAULT 0,
    costo_promedio DECIMAL(12,2) NOT NULL DEFAULT 0,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_inventario (empresa_id, sucursal_id, producto_id),
    CONSTRAINT fk_inventario_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_inventario_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_inventario_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE movimientos_inventario (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    tipo ENUM('entrada', 'salida', 'ajuste') NOT NULL,
    referencia VARCHAR(120) NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    costo_unitario DECIMAL(12,2) NOT NULL DEFAULT 0,
    created_at DATETIME NULL,
    INDEX idx_movimientos_empresa_producto (empresa_id, producto_id),
    INDEX idx_movimientos_variante (empresa_id, variante_id),
    CONSTRAINT fk_movimientos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_movimientos_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_movimientos_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_movimientos_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE ajustes_inventario (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    tipo_ajuste ENUM('incremento', 'decremento', 'correccion') NOT NULL DEFAULT 'correccion',
    stock_anterior DECIMAL(12,2) NOT NULL,
    stock_nuevo DECIMAL(12,2) NOT NULL,
    motivo VARCHAR(255) NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    estado ENUM('pendiente', 'aprobado', 'rechazado') NOT NULL DEFAULT 'pendiente',
    aprobado_por_id BIGINT UNSIGNED NULL,
    observacion_aprobacion TEXT NULL,
    aprobado_at DATETIME NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_ajustes_empresa_estado (empresa_id, estado),
    INDEX idx_ajustes_empresa_sucursal (empresa_id, sucursal_id),
    INDEX idx_ajustes_variante (empresa_id, variante_id),
    CONSTRAINT fk_ajustes_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_ajustes_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_ajustes_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_ajustes_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes(id),
    CONSTRAINT fk_ajustes_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_ajustes_aprobador FOREIGN KEY (aprobado_por_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE clientes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    documento VARCHAR(60) NULL,
    email VARCHAR(150) NULL,
    telefono VARCHAR(40) NULL,
    direccion VARCHAR(255) NULL,
    saldo_pendiente DECIMAL(12,2) NOT NULL DEFAULT 0,
    credito_maximo DECIMAL(12,2) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    CONSTRAINT fk_clientes_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE proveedores (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    documento VARCHAR(60) NULL,
    email VARCHAR(150) NULL,
    telefono VARCHAR(40) NULL,
    direccion VARCHAR(255) NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    CONSTRAINT fk_proveedores_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE productos
    ADD CONSTRAINT fk_productos_proveedor FOREIGN KEY (proveedor_id) REFERENCES proveedores(id);

CREATE TABLE ordenes_compra (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    proveedor_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    numero VARCHAR(80) NOT NULL,
    fecha DATETIME NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
    impuestos DECIMAL(12,2) NOT NULL DEFAULT 0,
    total DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('abierta', 'parcial', 'completa', 'anulada') NOT NULL DEFAULT 'abierta',
    observacion TEXT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_ordenes_compra_numero (empresa_id, numero),
    INDEX idx_ordenes_compra_estado (empresa_id, estado),
    CONSTRAINT fk_ordenes_compra_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_ordenes_compra_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_ordenes_compra_proveedor FOREIGN KEY (proveedor_id) REFERENCES proveedores(id),
    CONSTRAINT fk_ordenes_compra_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE orden_compra_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    orden_compra_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    cantidad_recibida DECIMAL(12,2) NOT NULL DEFAULT 0,
    costo_unitario DECIMAL(12,2) NOT NULL,
    impuesto DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_linea DECIMAL(12,2) NOT NULL,
    INDEX idx_orden_detalle_orden (orden_compra_id, empresa_id),
    INDEX idx_orden_detalle_variante (empresa_id, variante_id),
    CONSTRAINT fk_orden_detalle_orden FOREIGN KEY (orden_compra_id) REFERENCES ordenes_compra(id),
    CONSTRAINT fk_orden_detalle_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_orden_detalle_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_orden_detalle_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE recepciones_compra (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    orden_compra_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    numero_recepcion VARCHAR(80) NOT NULL,
    fecha_recepcion DATETIME NOT NULL,
    estado ENUM('recibida', 'anulada') NOT NULL DEFAULT 'recibida',
    observacion TEXT NULL,
    created_at DATETIME NULL,
    UNIQUE KEY uk_recepcion_numero (empresa_id, numero_recepcion),
    INDEX idx_recepcion_orden (empresa_id, orden_compra_id),
    CONSTRAINT fk_recepciones_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_recepciones_orden FOREIGN KEY (orden_compra_id) REFERENCES ordenes_compra(id),
    CONSTRAINT fk_recepciones_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_recepciones_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE recepcion_compra_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    recepcion_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    orden_detalle_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    costo_unitario DECIMAL(12,2) NOT NULL,
    impuesto DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_linea DECIMAL(12,2) NOT NULL,
    INDEX idx_recepcion_detalle_recepcion (recepcion_id, empresa_id),
    CONSTRAINT fk_recepcion_detalle_recepcion FOREIGN KEY (recepcion_id) REFERENCES recepciones_compra(id),
    CONSTRAINT fk_recepcion_detalle_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_recepcion_detalle_orden FOREIGN KEY (orden_detalle_id) REFERENCES orden_compra_detalles(id),
    CONSTRAINT fk_recepcion_detalle_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_recepcion_detalle_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE compras (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    orden_compra_id BIGINT UNSIGNED NULL,
    recepcion_compra_id BIGINT UNSIGNED NULL,
    proveedor_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    fecha DATETIME NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
    impuestos DECIMAL(12,2) NOT NULL DEFAULT 0,
    total DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('borrador', 'recibida', 'anulada') NOT NULL DEFAULT 'recibida',
    created_at DATETIME NULL,
    INDEX idx_compras_orden (empresa_id, orden_compra_id),
    CONSTRAINT fk_compras_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_compras_proveedor FOREIGN KEY (proveedor_id) REFERENCES proveedores(id),
    CONSTRAINT fk_compras_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_compras_orden FOREIGN KEY (orden_compra_id) REFERENCES ordenes_compra(id),
    CONSTRAINT fk_compras_recepcion FOREIGN KEY (recepcion_compra_id) REFERENCES recepciones_compra(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE compra_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    compra_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    variante_id BIGINT UNSIGNED NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    costo_unitario DECIMAL(12,2) NOT NULL,
    impuesto DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_linea DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_compra_detalle_compra FOREIGN KEY (compra_id) REFERENCES compras(id),
    CONSTRAINT fk_compra_detalle_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_compra_detalle_producto FOREIGN KEY (producto_id) REFERENCES productos(id),
    CONSTRAINT fk_compra_detalle_variante FOREIGN KEY (variante_id) REFERENCES producto_variantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE pagos_compra (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    compra_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    fecha_pago DATETIME NOT NULL,
    metodo_pago VARCHAR(50) NOT NULL,
    referencia VARCHAR(120) NULL,
    created_at DATETIME NULL,
    CONSTRAINT fk_pagos_compra_compra FOREIGN KEY (compra_id) REFERENCES compras(id),
    CONSTRAINT fk_pagos_compra_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE ventas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    cliente_id BIGINT UNSIGNED NULL,
    apertura_caja_id BIGINT UNSIGNED NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
    descuento DECIMAL(12,2) NOT NULL DEFAULT 0,
    impuestos DECIMAL(12,2) NOT NULL DEFAULT 0,
    total DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('pagada', 'pendiente', 'anulada') NOT NULL DEFAULT 'pagada',
    fecha DATETIME NOT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    INDEX idx_ventas_empresa_fecha (empresa_id, fecha),
    CONSTRAINT fk_ventas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_ventas_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_ventas_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_ventas_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    CONSTRAINT fk_ventas_apertura FOREIGN KEY (apertura_caja_id) REFERENCES aperturas_caja(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE venta_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    precio_unitario DECIMAL(12,2) NOT NULL,
    impuesto DECIMAL(12,2) NOT NULL DEFAULT 0,
    descuento DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_linea DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_venta_detalles_venta FOREIGN KEY (venta_id) REFERENCES ventas(id),
    CONSTRAINT fk_venta_detalles_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_venta_detalles_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE venta_pagos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    venta_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NOT NULL,
    metodo_pago VARCHAR(50) NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    referencia VARCHAR(120) NULL,
    created_at DATETIME NULL,
    CONSTRAINT fk_venta_pagos_venta FOREIGN KEY (venta_id) REFERENCES ventas(id),
    CONSTRAINT fk_venta_pagos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE devoluciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    venta_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    motivo VARCHAR(255) NULL,
    total DECIMAL(12,2) NOT NULL DEFAULT 0,
    fecha DATETIME NOT NULL,
    created_at DATETIME NULL,
    CONSTRAINT fk_devoluciones_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_devoluciones_venta FOREIGN KEY (venta_id) REFERENCES ventas(id),
    CONSTRAINT fk_devoluciones_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE impuestos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(80) NOT NULL,
    porcentaje DECIMAL(5,2) NOT NULL,
    tipo VARCHAR(40) NOT NULL DEFAULT 'IVA',
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    CONSTRAINT fk_impuestos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE numeraciones_documentos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    tipo_documento VARCHAR(40) NOT NULL,
    prefijo VARCHAR(20) NULL,
    consecutivo_actual BIGINT NOT NULL DEFAULT 1,
    consecutivo_final BIGINT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_num_doc (empresa_id, tipo_documento, prefijo, sucursal_id),
    INDEX idx_num_doc_sucursal (sucursal_id),
    CONSTRAINT fk_numdoc_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_numdoc_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE resoluciones_dian (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    numero_resolucion VARCHAR(80) NOT NULL,
    fecha_desde DATE NOT NULL,
    fecha_hasta DATE NOT NULL,
    prefijo VARCHAR(20) NULL,
    rango_desde BIGINT NOT NULL,
    rango_hasta BIGINT NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    INDEX idx_resoluciones_sucursal (sucursal_id),
    CONSTRAINT fk_resoluciones_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_resoluciones_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE facturas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    venta_id BIGINT UNSIGNED NULL,
    cliente_id BIGINT UNSIGNED NULL,
    tipo_documento ENUM('factura', 'nota_credito', 'nota_debito') NOT NULL DEFAULT 'factura',
    numero VARCHAR(80) NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0,
    impuestos DECIMAL(12,2) NOT NULL DEFAULT 0,
    total DECIMAL(12,2) NOT NULL DEFAULT 0,
    estado ENUM('borrador', 'emitida', 'anulada', 'aceptada', 'rechazada') NOT NULL DEFAULT 'emitida',
    documento_referencia_id BIGINT UNSIGNED NULL,
    motivo_documento VARCHAR(255) NULL,
    anulado_por_usuario_id BIGINT UNSIGNED NULL,
    anulado_motivo VARCHAR(255) NULL,
    anulado_at DATETIME NULL,
    cufe VARCHAR(120) NULL,
    qr_path VARCHAR(255) NULL,
    fecha_emision DATETIME NOT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_factura_empresa_numero (empresa_id, numero),
    INDEX idx_facturas_sucursal (sucursal_id),
    INDEX idx_facturas_referencia (empresa_id, documento_referencia_id),
    CONSTRAINT fk_facturas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_facturas_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id),
    CONSTRAINT fk_facturas_venta FOREIGN KEY (venta_id) REFERENCES ventas(id),
    CONSTRAINT fk_facturas_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    CONSTRAINT fk_facturas_referencia FOREIGN KEY (documento_referencia_id) REFERENCES facturas(id),
    CONSTRAINT fk_facturas_anulado_por FOREIGN KEY (anulado_por_usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE factura_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    factura_id BIGINT UNSIGNED NOT NULL,
    producto_id BIGINT UNSIGNED NULL,
    descripcion VARCHAR(255) NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    precio_unitario DECIMAL(12,2) NOT NULL,
    impuesto DECIMAL(12,2) NOT NULL DEFAULT 0,
    total_linea DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_factura_detalles_factura FOREIGN KEY (factura_id) REFERENCES facturas(id),
    CONSTRAINT fk_factura_detalles_producto FOREIGN KEY (producto_id) REFERENCES productos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE configuracion_empresa (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    clave VARCHAR(120) NOT NULL,
    valor TEXT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_config_empresa (empresa_id, clave),
    CONSTRAINT fk_config_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE configuracion_global (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    clave VARCHAR(120) NOT NULL,
    valor TEXT NULL,
    created_at DATETIME NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uk_configuracion_global_clave (clave)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE metodos_pago (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(80) NOT NULL,
    codigo VARCHAR(40) NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    CONSTRAINT fk_metodos_pago_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE impresoras (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NULL,
    nombre VARCHAR(120) NOT NULL,
    tipo VARCHAR(40) NOT NULL DEFAULT 'termica',
    ip VARCHAR(80) NULL,
    puerto VARCHAR(20) NULL,
    activa TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NULL,
    CONSTRAINT fk_impresoras_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_impresoras_sucursal FOREIGN KEY (sucursal_id) REFERENCES sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
