-- Abisfact: instalador unico para hosting
-- Ejecutar sobre una base vacia o recien creada.
-- Incluye estructura base, migraciones y datos esenciales de arranque.


CREATE TABLE IF NOT EXISTS giro_negocio (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(30) NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    descripcion VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_giro_negocio_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS modulos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(80) NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    categoria VARCHAR(30) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_modulos_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS empresa_modulos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    modulo_id BIGINT UNSIGNED NOT NULL,
    habilitado TINYINT(1) NOT NULL DEFAULT 1,
    configuracion JSON NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_empresa_modulo (empresa_id, modulo_id),
    KEY idx_empresa_modulos_empresa (empresa_id),
    KEY idx_empresa_modulos_modulo (modulo_id),
    CONSTRAINT fk_empresa_modulos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_empresa_modulos_modulo FOREIGN KEY (modulo_id) REFERENCES modulos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_series (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_comprobante_id BIGINT UNSIGNED NOT NULL,
    serie VARCHAR(10) NOT NULL,
    es_electronico TINYINT(1) NOT NULL DEFAULT 1 COMMENT '0=No electronico, 1=Electronico',
    en_modulo TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Facturacion, 2=Guias, 3=Cotizaciones',
    correlativo_actual INT UNSIGNED NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_series (empresa_id, tipo_comprobante_id, serie),
    KEY idx_fact_series_empresa_tipo (empresa_id, tipo_comprobante_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260817_base_seguridad_multiempresa.sql
-- ==================================================
-- Base inicial de abisfact
-- Enfoque: seguridad + multiempresa + auditoría

CREATE TABLE IF NOT EXISTS usuarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    usuario VARCHAR(80) NOT NULL,
    email VARCHAR(150) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    es_super_admin TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    ultimo_login DATETIME NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_usuarios_usuario (usuario),
    UNIQUE KEY uq_usuarios_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS tipo_empresa (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(30) NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_tipo_empresa_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS empresas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ruc CHAR(11) NOT NULL,
    razon_social VARCHAR(200) NOT NULL,
    nombre_comercial VARCHAR(200) NULL,
    tipo_empresa_id BIGINT UNSIGNED NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_empresas_ruc (ruc),
    KEY idx_empresas_tipo_empresa (tipo_empresa_id),
    CONSTRAINT fk_empresas_tipo_empresa
        FOREIGN KEY (tipo_empresa_id) REFERENCES tipo_empresa(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS roles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    descripcion VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_roles_empresa (empresa_id),
    CONSTRAINT fk_roles_empresa
        FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS empresa_usuarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NOT NULL,
    rol_id BIGINT UNSIGNED NULL,
    estado ENUM('ACTIVO','INACTIVO') NOT NULL DEFAULT 'ACTIVO',
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_empresa_usuario (empresa_id, usuario_id),
    KEY idx_eu_usuario (usuario_id),
    KEY idx_eu_rol (rol_id),
    CONSTRAINT fk_eu_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_eu_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_eu_rol FOREIGN KEY (rol_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS modulos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(80) NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    UNIQUE KEY uq_modulos_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS acciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(80) NOT NULL,
    nombre VARCHAR(120) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    UNIQUE KEY uq_acciones_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS permisos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    rol_id BIGINT UNSIGNED NOT NULL,
    modulo_id BIGINT UNSIGNED NOT NULL,
    accion_id BIGINT UNSIGNED NOT NULL,
    permitido TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    UNIQUE KEY uq_permiso (rol_id, modulo_id, accion_id),
    CONSTRAINT fk_permisos_rol FOREIGN KEY (rol_id) REFERENCES roles(id),
    CONSTRAINT fk_permisos_modulo FOREIGN KEY (modulo_id) REFERENCES modulos(id),
    CONSTRAINT fk_permisos_accion FOREIGN KEY (accion_id) REFERENCES acciones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS historial (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    usuario_id BIGINT UNSIGNED NULL,
    modulo VARCHAR(80) NOT NULL,
    accion VARCHAR(80) NOT NULL,
    registro_id BIGINT UNSIGNED NULL,
    resumen JSON NULL,
    ip VARCHAR(60) NULL,
    created_at DATETIME NOT NULL,
    deleted_at DATETIME NULL,
    KEY idx_historial_empresa_fecha (empresa_id, created_at),
    KEY idx_historial_modulo_registro (modulo, registro_id),
    CONSTRAINT fk_historial_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_historial_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO tipo_empresa (id, codigo, nombre, estado, created_at)
VALUES (1, 'GENERAL', 'General', 1, NOW());

INSERT IGNORE INTO modulos (id, codigo, nombre, estado, created_at) VALUES
(1, 'usuarios', 'Usuarios', 1, NOW()),
(2, 'empresas', 'Empresas', 1, NOW()),
(3, 'facturacion', 'Facturación', 1, NOW()),
(4, 'auditoria', 'Auditoría', 1, NOW());

INSERT IGNORE INTO acciones (id, codigo, nombre, estado, created_at) VALUES
(1, 'ver', 'Ver', 1, NOW()),
(2, 'crear', 'Crear', 1, NOW()),
(3, 'editar', 'Editar', 1, NOW()),
(4, 'eliminar', 'Eliminar', 1, NOW()),
(5, 'anular', 'Anular', 1, NOW());


-- ==================================================
-- 20260818_add_codigos_catalogo_items.sql
-- ==================================================
-- Codigos estandar para catalogo de productos/servicios

SET @codigo_sunat_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'codigo_sunat'
);

SET @sql_codigo_sunat := IF(
    @codigo_sunat_exists = 0,
    'ALTER TABLE catalogo_items ADD COLUMN codigo_sunat VARCHAR(20) NULL AFTER codigo',
    'SELECT 1'
);
PREPARE stmt_codigo_sunat FROM @sql_codigo_sunat;
EXECUTE stmt_codigo_sunat;
DEALLOCATE PREPARE stmt_codigo_sunat;

SET @codigo_gs1_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'codigo_gs1'
);

SET @sql_codigo_gs1 := IF(
    @codigo_gs1_exists = 0,
    'ALTER TABLE catalogo_items ADD COLUMN codigo_gs1 VARCHAR(20) NULL AFTER codigo_sunat',
    'SELECT 1'
);
PREPARE stmt_codigo_gs1 FROM @sql_codigo_gs1;
EXECUTE stmt_codigo_gs1;
DEALLOCATE PREPARE stmt_codigo_gs1;


-- ==================================================
-- 20260818_module_catalogo.sql
-- ==================================================
-- Catalogo de giros y modulos para abisfact
-- Complementa la base de seguridad multiempresa.

INSERT IGNORE INTO giro_negocio (id, codigo, nombre, descripcion, estado, created_at) VALUES
(1, 'GENERAL', 'General', 'Negocio generico', 1, NOW()),
(2, 'FERRETERIA', 'Ferreteria', 'Venta de articulos de construccion y ferreteria', 1, NOW()),
(3, 'RESTAURANTE', 'Restaurante', 'Atencion de mesas, salon y cocina', 1, NOW()),
(4, 'BODEGA', 'Bodega', 'Tienda de abarrotes y venta rapida', 1, NOW()),
(5, 'SPA', 'Spa', 'Servicios de bienestar y citas', 1, NOW()),
(6, 'SERVICIOS', 'Servicios', 'Prestacion de servicios profesionales', 1, NOW()),
(7, 'POLLERIA', 'Polleria', 'Venta de pollos, combos y delivery', 1, NOW());

INSERT IGNORE INTO modulos (id, codigo, nombre, categoria, estado, created_at) VALUES
(1, 'usuarios', 'Usuarios', 'CORE', 1, NOW()),
(2, 'empresas', 'Empresas', 'CORE', 1, NOW()),
(3, 'facturacion', 'Facturacion', 'LEGAL', 1, NOW()),
(4, 'auditoria', 'Auditoria', 'CORE', 1, NOW()),
(5, 'catalogos_sunat', 'Catalogos SUNAT', 'LEGAL', 1, NOW()),
(6, 'terceros', 'Terceros', 'CORE', 1, NOW()),
(7, 'productos', 'Productos', 'CORE', 1, NOW()),
(8, 'inventario', 'Inventario', 'CORE', 1, NOW()),
(9, 'caja', 'Caja', 'CORE', 1, NOW()),
(10, 'compras', 'Compras', 'CORE', 1, NOW()),
(11, 'ventas', 'Ventas', 'CORE', 1, NOW()),
(12, 'polleria', 'Polleria', 'VERTICAL', 1, NOW()),
(13, 'restaurante', 'Restaurante', 'VERTICAL', 1, NOW()),
(14, 'bodega', 'Bodega', 'VERTICAL', 1, NOW()),
(15, 'spa', 'Spa', 'VERTICAL', 1, NOW()),
(16, 'servicios', 'Servicios', 'VERTICAL', 1, NOW()),
(17, 'ferreteria', 'Ferreteria', 'VERTICAL', 1, NOW());

INSERT IGNORE INTO empresa_modulos (empresa_id, modulo_id, habilitado, created_at)
SELECT e.id, m.id, 1, NOW()
FROM empresas e
INNER JOIN modulos m
WHERE e.deleted_at IS NULL
  AND m.codigo IN ('usuarios','empresas','facturacion','auditoria','catalogos_sunat','terceros','productos','ventas','compras','caja');


-- ==================================================
-- 20260818_tipo_operacion_catalogo.sql
-- ==================================================
-- Catalogo de tipos de operacion para facturacion

CREATE TABLE IF NOT EXISTS tipo_operacion (
    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_tipo_operacion_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO tipo_operacion (id, codigo, descripcion, estado, created_at) VALUES
(1, 'VENTA', 'Venta', 1, NOW()),
(2, 'COMPRA', 'Compra', 1, NOW());

SET @tipo_operacion_col_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'tipo_operacion_id'
);

SET @sql_tipo_operacion_col := IF(
    @tipo_operacion_col_exists = 0,
    'ALTER TABLE facturacion_comprobantes ADD COLUMN tipo_operacion_id TINYINT UNSIGNED NOT NULL DEFAULT 1 AFTER empresa_id',
    'SELECT 1'
);
PREPARE stmt_tipo_operacion_col FROM @sql_tipo_operacion_col;
EXECUTE stmt_tipo_operacion_col;
DEALLOCATE PREPARE stmt_tipo_operacion_col;

SET @sql_tipo_operacion_key := IF(
    @tipo_operacion_col_exists = 0,
    'ALTER TABLE facturacion_comprobantes ADD KEY idx_fact_comprobante_tipo_operacion (tipo_operacion_id)',
    'SELECT 1'
);
PREPARE stmt_tipo_operacion_key FROM @sql_tipo_operacion_key;
EXECUTE stmt_tipo_operacion_key;
DEALLOCATE PREPARE stmt_tipo_operacion_key;

SET @sql_tipo_operacion_fk := IF(
    @tipo_operacion_col_exists = 0,
    'ALTER TABLE facturacion_comprobantes ADD CONSTRAINT fk_fact_comprobante_tipo_operacion FOREIGN KEY (tipo_operacion_id) REFERENCES tipo_operacion(id)',
    'SELECT 1'
);
PREPARE stmt_tipo_operacion_fk FROM @sql_tipo_operacion_fk;
EXECUTE stmt_tipo_operacion_fk;
DEALLOCATE PREPARE stmt_tipo_operacion_fk;

UPDATE facturacion_comprobantes
SET tipo_operacion_id = 1
WHERE tipo_operacion_id IS NULL OR tipo_operacion_id = 0;


-- ==================================================
-- 20260819_add_giro_negocio_empresa.sql
-- ==================================================
-- Agrega el giro de negocio a la empresa para activar modulos verticales

ALTER TABLE empresas
    ADD COLUMN giro_negocio_id BIGINT UNSIGNED NULL AFTER tipo_empresa_id;

ALTER TABLE empresas
    ADD KEY idx_empresas_giro_negocio (giro_negocio_id);

ALTER TABLE empresas
    ADD CONSTRAINT fk_empresas_giro_negocio
    FOREIGN KEY (giro_negocio_id) REFERENCES giro_negocio(id);


-- ==================================================
-- 20260819_facturacion_base.sql
-- ==================================================
-- Base de facturacion electronica para abisfact

CREATE TABLE IF NOT EXISTS terceros (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo ENUM('CLIENTE','PROVEEDOR','AMBOS') NOT NULL DEFAULT 'CLIENTE',
    tipo_documento VARCHAR(10) NOT NULL DEFAULT '6',
    numero_documento VARCHAR(20) NOT NULL,
    razon_social VARCHAR(200) NOT NULL,
    nombre_comercial VARCHAR(200) NULL,
    direccion VARCHAR(255) NULL,
    email VARCHAR(150) NULL,
    telefono VARCHAR(50) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_terceros_empresa_doc (empresa_id, tipo_documento, numero_documento),
    KEY idx_terceros_empresa (empresa_id),
    KEY idx_terceros_nombre (razon_social),
    CONSTRAINT fk_terceros_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_tipo_comprobante (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(5) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    afecta_igv TINYINT(1) NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_tipo_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_series (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_comprobante_id BIGINT UNSIGNED NOT NULL,
    serie VARCHAR(10) NOT NULL,
    es_electronico TINYINT(1) NOT NULL DEFAULT 1 COMMENT '0=No electronico, 1=Electronico',
    en_modulo TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Facturacion, 2=Guias, 3=Cotizaciones',
    correlativo_actual INT UNSIGNED NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_series (empresa_id, tipo_comprobante_id, serie),
    KEY idx_fact_series_empresa_tipo (empresa_id, tipo_comprobante_id),
    CONSTRAINT fk_fact_series_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_fact_series_tipo FOREIGN KEY (tipo_comprobante_id) REFERENCES facturacion_tipo_comprobante(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS catalogo_items (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo ENUM('PRODUCTO','SERVICIO') NOT NULL DEFAULT 'PRODUCTO',
    codigo VARCHAR(50) NULL,
    descripcion VARCHAR(255) NOT NULL,
    unidad_medida VARCHAR(10) NOT NULL DEFAULT 'NIU',
    valor_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    precio_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    afecto_igv TINYINT(1) NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_catalogo_empresa (empresa_id),
    KEY idx_catalogo_tipo (tipo),
    KEY idx_catalogo_descripcion (descripcion),
    CONSTRAINT fk_catalogo_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_comprobantes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tercero_id BIGINT UNSIGNED NULL,
    tipo_comprobante_id BIGINT UNSIGNED NOT NULL,
    serie_id BIGINT UNSIGNED NULL,
    serie VARCHAR(10) NOT NULL,
    numero INT UNSIGNED NOT NULL,
    fecha_emision DATE NOT NULL,
    fecha_vencimiento DATE NULL,
    moneda CHAR(3) NOT NULL DEFAULT 'PEN',
    forma_pago ENUM('CONTADO','CREDITO') NOT NULL DEFAULT 'CONTADO',
    subtotal DECIMAL(14,2) NOT NULL DEFAULT 0,
    igv DECIMAL(14,2) NOT NULL DEFAULT 0,
    total DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado ENUM('BORRADOR','EMITIDO','ANULADO') NOT NULL DEFAULT 'BORRADOR',
    sunat_estado VARCHAR(30) NULL,
    sunat_mensaje VARCHAR(255) NULL,
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_comprobante (empresa_id, tipo_comprobante_id, serie, numero),
    KEY idx_fact_comprobante_empresa_fecha (empresa_id, fecha_emision),
    KEY idx_fact_comprobante_tercero (tercero_id),
    KEY idx_fact_comprobante_tipo (tipo_comprobante_id),
    CONSTRAINT fk_fact_comprobante_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_fact_comprobante_tercero FOREIGN KEY (tercero_id) REFERENCES terceros(id),
    CONSTRAINT fk_fact_comprobante_tipo FOREIGN KEY (tipo_comprobante_id) REFERENCES facturacion_tipo_comprobante(id),
    CONSTRAINT fk_fact_comprobante_serie FOREIGN KEY (serie_id) REFERENCES facturacion_series(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_comprobante_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    catalogo_item_id BIGINT UNSIGNED NULL,
    item INT UNSIGNED NOT NULL,
    descripcion VARCHAR(255) NOT NULL,
    cantidad DECIMAL(14,2) NOT NULL DEFAULT 1,
    unidad_medida VARCHAR(10) NOT NULL DEFAULT 'NIU',
    valor_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    precio_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    descuento DECIMAL(14,2) NOT NULL DEFAULT 0,
    afecto_igv TINYINT(1) NOT NULL DEFAULT 1,
    subtotal DECIMAL(14,2) NOT NULL DEFAULT 0,
    igv DECIMAL(14,2) NOT NULL DEFAULT 0,
    total DECIMAL(14,2) NOT NULL DEFAULT 0,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_detalle_comp (comprobante_id),
    KEY idx_fact_detalle_catalogo (catalogo_item_id),
    CONSTRAINT fk_fact_detalle_comp FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO facturacion_tipo_comprobante (id, codigo, descripcion, afecta_igv, estado, created_at) VALUES
(1, '01', 'Factura', 1, 1, NOW()),
(2, '03', 'Boleta', 1, 1, NOW()),
(3, '07', 'Nota de credito', 1, 1, NOW()),
(4, '08', 'Nota de debito', 1, 1, NOW()),
(5, '09', 'Guia de remision', 0, 1, NOW());


-- ==================================================
-- 20260820_add_descripcion_editable_catalogo_items.sql
-- ==================================================
-- Agrega control de edicion de descripcion por item

SET @sql_add_desc_editable := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD COLUMN descripcion_editable TINYINT(1) NOT NULL DEFAULT 0 AFTER afectacion_igv_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'descripcion_editable'
);
PREPARE stmt_add_desc_editable FROM @sql_add_desc_editable;
EXECUTE stmt_add_desc_editable;
DEALLOCATE PREPARE stmt_add_desc_editable;


-- ==================================================
-- 20260820_auth_refresh_tokens.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS auth_refresh_tokens (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    session_id CHAR(36) NOT NULL,
    user_id BIGINT UNSIGNED NOT NULL,
    empresa_id BIGINT UNSIGNED NULL,
    token_hash CHAR(64) NOT NULL,
    ip_address VARCHAR(45) NULL,
    user_agent VARCHAR(255) NULL,
    expires_at DATETIME NOT NULL,
    last_used_at DATETIME NULL,
    revoked_at DATETIME NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uq_auth_refresh_session (session_id),
    UNIQUE KEY uq_auth_refresh_token (token_hash),
    KEY idx_auth_refresh_user (user_id),
    KEY idx_auth_refresh_empresa (empresa_id),
    KEY idx_auth_refresh_expires (expires_at),
    CONSTRAINT fk_auth_refresh_user FOREIGN KEY (user_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    CONSTRAINT fk_auth_refresh_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260820_catalogo_detracciones_cuotas.sql
-- ==================================================
-- Catalogo de detracciones y cuotas de facturacion

CREATE TABLE IF NOT EXISTS catalogo_detracciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(10) NOT NULL,
    descripcion VARCHAR(180) NOT NULL,
    porcentaje DECIMAL(6,2) NOT NULL DEFAULT 0,
    limite_minimo DECIMAL(14,2) NOT NULL DEFAULT 0,
    comentario VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_detracciones_codigo (codigo),
    KEY idx_catalogo_detracciones_descripcion (descripcion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_detracciones (codigo, descripcion, porcentaje, limite_minimo, comentario, estado, created_at) VALUES
('01', 'Intermediacion laboral y tercerizacion', 12.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('02', 'Arrendamiento de bienes', 10.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('03', 'Mantenimiento y reparacion de bienes muebles', 12.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('04', 'Movimiento de carga', 10.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('05', 'Otros servicios empresariales', 12.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('06', 'Comision mercantil', 10.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('07', 'Fabricacion de bienes por encargo', 10.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('08', 'Servicio de transporte de personas', 10.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('09', 'Contratos de construccion', 4.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('10', 'Demas servicios gravados con IGV', 12.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW()),
('11', 'Servicio de beneficio de minerales metalicos gravado con IGV', 12.00, 700.00, 'Servicio sujeto a detraccion segun anexo 3 SUNAT', 1, NOW());

SET @sql_add_detraccion_item := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD COLUMN catalogo_detraccion_id BIGINT UNSIGNED NULL AFTER afectacion_igv_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'catalogo_detraccion_id'
);
PREPARE stmt_add_detraccion_item FROM @sql_add_detraccion_item;
EXECUTE stmt_add_detraccion_item;
DEALLOCATE PREPARE stmt_add_detraccion_item;

SET @sql_add_detraccion_item_idx := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD KEY idx_catalogo_detraccion (catalogo_detraccion_id)',
        'SELECT 1'
    )
    FROM information_schema.statistics
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND index_name = 'idx_catalogo_detraccion'
);
PREPARE stmt_add_detraccion_item_idx FROM @sql_add_detraccion_item_idx;
EXECUTE stmt_add_detraccion_item_idx;
DEALLOCATE PREPARE stmt_add_detraccion_item_idx;

SET @sql_add_detraccion_item_fk := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD CONSTRAINT fk_catalogo_item_detraccion FOREIGN KEY (catalogo_detraccion_id) REFERENCES catalogo_detracciones(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND constraint_name = 'fk_catalogo_item_detraccion'
);
PREPARE stmt_add_detraccion_item_fk FROM @sql_add_detraccion_item_fk;
EXECUTE stmt_add_detraccion_item_fk;
DEALLOCATE PREPARE stmt_add_detraccion_item_fk;

SET @sql_add_comprobante_detraccion_id := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_id BIGINT UNSIGNED NULL AFTER forma_pago_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_id'
);
PREPARE stmt_add_comprobante_detraccion_id FROM @sql_add_comprobante_detraccion_id;
EXECUTE stmt_add_comprobante_detraccion_id;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_id;

SET @sql_add_comprobante_detraccion_codigo := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_codigo VARCHAR(10) NULL AFTER detraccion_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_codigo'
);
PREPARE stmt_add_comprobante_detraccion_codigo FROM @sql_add_comprobante_detraccion_codigo;
EXECUTE stmt_add_comprobante_detraccion_codigo;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_codigo;

SET @sql_add_comprobante_detraccion_desc := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_descripcion VARCHAR(180) NULL AFTER detraccion_codigo',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_descripcion'
);
PREPARE stmt_add_comprobante_detraccion_desc FROM @sql_add_comprobante_detraccion_desc;
EXECUTE stmt_add_comprobante_detraccion_desc;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_desc;

SET @sql_add_comprobante_detraccion_pct := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_porcentaje DECIMAL(6,2) NOT NULL DEFAULT 0 AFTER detraccion_descripcion',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_porcentaje'
);
PREPARE stmt_add_comprobante_detraccion_pct FROM @sql_add_comprobante_detraccion_pct;
EXECUTE stmt_add_comprobante_detraccion_pct;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_pct;

SET @sql_add_comprobante_detraccion_base := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_base DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER detraccion_porcentaje',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_base'
);
PREPARE stmt_add_comprobante_detraccion_base FROM @sql_add_comprobante_detraccion_base;
EXECUTE stmt_add_comprobante_detraccion_base;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_base;

SET @sql_add_comprobante_detraccion_monto := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_monto DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER detraccion_base',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_monto'
);
PREPARE stmt_add_comprobante_detraccion_monto FROM @sql_add_comprobante_detraccion_monto;
EXECUTE stmt_add_comprobante_detraccion_monto;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_monto;

SET @sql_add_comprobante_detraccion_limite := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_limite_minimo DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER detraccion_monto',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_limite_minimo'
);
PREPARE stmt_add_comprobante_detraccion_limite FROM @sql_add_comprobante_detraccion_limite;
EXECUTE stmt_add_comprobante_detraccion_limite;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_limite;

SET @sql_add_comprobante_detraccion_aplica := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN detraccion_aplica TINYINT(1) NOT NULL DEFAULT 0 AFTER detraccion_limite_minimo',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'detraccion_aplica'
);
PREPARE stmt_add_comprobante_detraccion_aplica FROM @sql_add_comprobante_detraccion_aplica;
EXECUTE stmt_add_comprobante_detraccion_aplica;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_aplica;

SET @sql_add_comprobante_detraccion_fk := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD CONSTRAINT fk_fact_comprobante_detraccion FOREIGN KEY (detraccion_id) REFERENCES catalogo_detracciones(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND constraint_name = 'fk_fact_comprobante_detraccion'
);
PREPARE stmt_add_comprobante_detraccion_fk FROM @sql_add_comprobante_detraccion_fk;
EXECUTE stmt_add_comprobante_detraccion_fk;
DEALLOCATE PREPARE stmt_add_comprobante_detraccion_fk;

CREATE TABLE IF NOT EXISTS facturacion_comprobante_cuotas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    numero_cuota INT UNSIGNED NOT NULL,
    fecha_vencimiento DATE NOT NULL,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado ENUM('PENDIENTE','PAGADA','ANULADA') NOT NULL DEFAULT 'PENDIENTE',
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_cuota_comprobante (comprobante_id, numero_cuota),
    KEY idx_fact_cuota_comprobante (comprobante_id),
    CONSTRAINT fk_fact_cuota_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260820_catalogo_items.sql
-- ==================================================
-- Alta de catalogo de productos y servicios para facturacion electronica

CREATE TABLE IF NOT EXISTS catalogo_items (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo ENUM('PRODUCTO','SERVICIO') NOT NULL DEFAULT 'PRODUCTO',
    codigo VARCHAR(50) NULL,
    descripcion VARCHAR(255) NOT NULL,
    unidad_medida VARCHAR(10) NOT NULL DEFAULT 'NIU',
    valor_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    precio_unitario DECIMAL(14,2) NOT NULL DEFAULT 0,
    afecto_igv TINYINT(1) NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_catalogo_empresa (empresa_id),
    KEY idx_catalogo_tipo (tipo),
    KEY idx_catalogo_descripcion (descripcion),
    CONSTRAINT fk_catalogo_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET @catalogo_col_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobante_detalles'
      AND column_name = 'catalogo_item_id'
);

SET @sql_catalogo_col := IF(
    @catalogo_col_exists = 0,
    'ALTER TABLE facturacion_comprobante_detalles ADD COLUMN catalogo_item_id BIGINT UNSIGNED NULL AFTER comprobante_id',
    'SELECT 1'
);
PREPARE stmt_catalogo_col FROM @sql_catalogo_col;
EXECUTE stmt_catalogo_col;
DEALLOCATE PREPARE stmt_catalogo_col;

SET @sql_catalogo_key := IF(
    @catalogo_col_exists = 0,
    'ALTER TABLE facturacion_comprobante_detalles ADD KEY idx_fact_detalle_catalogo (catalogo_item_id)',
    'SELECT 1'
);
PREPARE stmt_catalogo_key FROM @sql_catalogo_key;
EXECUTE stmt_catalogo_key;
DEALLOCATE PREPARE stmt_catalogo_key;

SET @sql_catalogo_fk := IF(
    @catalogo_col_exists = 0,
    'ALTER TABLE facturacion_comprobante_detalles ADD CONSTRAINT fk_fact_detalle_catalogo FOREIGN KEY (catalogo_item_id) REFERENCES catalogo_items(id)',
    'SELECT 1'
);
PREPARE stmt_catalogo_fk FROM @sql_catalogo_fk;
EXECUTE stmt_catalogo_fk;
DEALLOCATE PREPARE stmt_catalogo_fk;


-- ==================================================
-- 20260820_catalogo_medios_pago_es_credito.sql
-- ==================================================
-- Marca medios de pago de credito y normaliza el catalogo para facturacion

SET @sql_add_es_credito := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_medios_pago ADD COLUMN es_credito TINYINT(1) NOT NULL DEFAULT 0 AFTER comentario',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_medios_pago'
      AND column_name = 'es_credito'
);
PREPARE stmt_add_es_credito FROM @sql_add_es_credito;
EXECUTE stmt_add_es_credito;
DEALLOCATE PREPARE stmt_add_es_credito;

UPDATE catalogo_medios_pago
SET es_credito = CASE WHEN UPPER(codigo) = 'CREDITO' THEN 1 ELSE 0 END
WHERE deleted_at IS NULL;

INSERT INTO catalogo_medios_pago (id, codigo, descripcion, comentario, es_credito, estado, created_at)
SELECT 2, 'CREDITO', 'Credito', 'Pago diferido o en cuotas', 1, 1, NOW()
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1
    FROM catalogo_medios_pago
    WHERE id = 2 OR UPPER(codigo) = 'CREDITO'
    LIMIT 1
);


-- ==================================================
-- 20260820_empresa_cuentas_bancarias.sql
-- ==================================================
SET @sql_add_empresa_cuenta_detracciones := (
    SELECT IF(
        EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = 'empresas'
              AND COLUMN_NAME = 'cuenta_detracciones'
        ),
        'SELECT 1',
        'ALTER TABLE empresas ADD COLUMN cuenta_detracciones VARCHAR(60) NULL AFTER nombre_comercial'
    )
);
PREPARE stmt_add_empresa_cuenta_detracciones FROM @sql_add_empresa_cuenta_detracciones;
EXECUTE stmt_add_empresa_cuenta_detracciones;
DEALLOCATE PREPARE stmt_add_empresa_cuenta_detracciones;

SET @sql_add_empresa_cuenta_bancaria := (
    SELECT IF(
        EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = 'empresas'
              AND COLUMN_NAME = 'cuenta_bancaria'
        ),
        'SELECT 1',
        'ALTER TABLE empresas ADD COLUMN cuenta_bancaria VARCHAR(60) NULL AFTER cuenta_detracciones'
    )
);
PREPARE stmt_add_empresa_cuenta_bancaria FROM @sql_add_empresa_cuenta_bancaria;
EXECUTE stmt_add_empresa_cuenta_bancaria;
DEALLOCATE PREPARE stmt_add_empresa_cuenta_bancaria;

CREATE TABLE IF NOT EXISTS empresa_cuentas_bancarias (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    banco VARCHAR(120) NOT NULL,
    moneda CHAR(3) NOT NULL DEFAULT 'PEN',
    numero_cuenta VARCHAR(60) NOT NULL,
    cci VARCHAR(60) NULL,
    alias VARCHAR(120) NULL,
    es_detracciones TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_empresa_cuenta_banco (empresa_id, numero_cuenta),
    KEY idx_empresa_cuenta_empresa (empresa_id),
    KEY idx_empresa_cuenta_detracciones (empresa_id, es_detracciones),
    CONSTRAINT fk_empresa_cuenta_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260820_facturacion_detalles_afectacion.sql
-- ==================================================
ALTER TABLE facturacion_comprobante_detalles
    ADD COLUMN afectacion_igv_id BIGINT UNSIGNED NULL AFTER afecto_igv;

UPDATE facturacion_comprobante_detalles d
LEFT JOIN facturacion_comprobantes c ON c.id = d.comprobante_id
LEFT JOIN catalogo_items ci ON ci.id = d.catalogo_item_id
SET d.afectacion_igv_id = COALESCE(ci.afectacion_igv_id, 1)
WHERE d.afectacion_igv_id IS NULL;

ALTER TABLE facturacion_comprobante_detalles
    ADD CONSTRAINT fk_fact_detalle_afectacion_igv
    FOREIGN KEY (afectacion_igv_id) REFERENCES catalogo_afectaciones_igv(id);


-- ==================================================
-- 20260820_facturacion_formas_medios_pago.sql
-- ==================================================
-- Normalizacion de forma de pago y medios de pago para facturacion

CREATE TABLE IF NOT EXISTS catalogo_formas_pago (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    comentario VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_formas_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_formas_pago (id, codigo, descripcion, comentario, estado, created_at) VALUES
(1, 'CONTADO', 'Contado', 'Pago al momento de la operacion', 1, NOW()),
(2, 'CREDITO', 'Credito', 'Pago diferido o en cuotas', 1, NOW());

CREATE TABLE IF NOT EXISTS catalogo_medios_pago (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(30) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    comentario VARCHAR(255) NULL,
    es_credito TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_medios_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_medios_pago (id, codigo, descripcion, comentario, estado, created_at) VALUES
(1, 'EFECTIVO', 'Efectivo', 'Pago en efectivo', 1, NOW()),
(2, 'CREDITO', 'Credito', 'Pago diferido o en cuotas', 1, NOW()),
(3, 'YAPE', 'Yape', 'Pago por Yape', 1, NOW()),
(4, 'PLIN', 'Plin', 'Pago por Plin', 1, NOW()),
(5, 'TRANSFERENCIA', 'Transferencia', 'Transferencia bancaria', 1, NOW()),
(6, 'CHEQUE', 'Cheque', 'Pago con cheque', 1, NOW()),
(7, 'TARJETA', 'Tarjeta', 'Pago con tarjeta de debito o credito', 1, NOW()),
(8, 'DEPOSITO', 'Deposito', 'Deposito bancario', 1, NOW()),
(9, 'OTRO', 'Otro', 'Otro medio de pago', 1, NOW());

UPDATE catalogo_medios_pago
SET es_credito = CASE WHEN UPPER(codigo) = 'CREDITO' THEN 1 ELSE 0 END;

SET @sql_add_forma_pago_id := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD COLUMN forma_pago_id BIGINT UNSIGNED NULL AFTER moneda',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'forma_pago_id'
);
PREPARE stmt_add_forma_pago_id FROM @sql_add_forma_pago_id;
EXECUTE stmt_add_forma_pago_id;
DEALLOCATE PREPARE stmt_add_forma_pago_id;

UPDATE facturacion_comprobantes
SET forma_pago_id = CASE UPPER(COALESCE(forma_pago, 'CONTADO'))
    WHEN 'CREDITO' THEN 2
    ELSE 1
END
WHERE forma_pago_id IS NULL;

SET @sql_add_forma_fk := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobantes ADD CONSTRAINT fk_fact_comprobante_forma_pago FOREIGN KEY (forma_pago_id) REFERENCES catalogo_formas_pago(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND constraint_name = 'fk_fact_comprobante_forma_pago'
);
PREPARE stmt_add_forma_fk FROM @sql_add_forma_fk;
EXECUTE stmt_add_forma_fk;
DEALLOCATE PREPARE stmt_add_forma_fk;

SET @sql_forma_not_null := 'ALTER TABLE facturacion_comprobantes MODIFY COLUMN forma_pago_id BIGINT UNSIGNED NOT NULL COMMENT ''Referencia a catalogo_formas_pago''';
PREPARE stmt_forma_not_null FROM @sql_forma_not_null;
EXECUTE stmt_forma_not_null;
DEALLOCATE PREPARE stmt_forma_not_null;

SET @sql_drop_forma_legacy := (
    SELECT IF(
        COUNT(*) > 0,
        'ALTER TABLE facturacion_comprobantes DROP COLUMN forma_pago',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'forma_pago'
);
PREPARE stmt_drop_forma_legacy FROM @sql_drop_forma_legacy;
EXECUTE stmt_drop_forma_legacy;
DEALLOCATE PREPARE stmt_drop_forma_legacy;

CREATE TABLE IF NOT EXISTS facturacion_comprobante_pagos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    medio_pago_id BIGINT UNSIGNED NOT NULL,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    referencia VARCHAR(150) NULL,
    fecha_pago DATE NULL,
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_pago_comprobante (comprobante_id),
    KEY idx_fact_pago_medio (medio_pago_id),
    CONSTRAINT fk_fact_pago_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_pago_medio FOREIGN KEY (medio_pago_id) REFERENCES catalogo_medios_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260820_facturacion_movimientos.sql
-- ==================================================
-- Consolidacion de movimientos de facturacion en una sola tabla

CREATE TABLE IF NOT EXISTS facturacion_comprobante_movimientos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    tipo_movimiento ENUM('PAGO','CUOTA') NOT NULL,
    numero_cuota INT UNSIGNED NULL,
    medio_pago_id BIGINT UNSIGNED NULL,
    fecha_movimiento DATE NULL,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado ENUM('PENDIENTE','PAGADO','ANULADO') NOT NULL DEFAULT 'PENDIENTE',
    referencia VARCHAR(150) NULL,
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_mov_comprobante (comprobante_id),
    KEY idx_fact_mov_tipo (tipo_movimiento),
    KEY idx_fact_mov_estado (estado),
    KEY idx_fact_mov_medio (medio_pago_id),
    KEY idx_fact_mov_fecha (fecha_movimiento),
    UNIQUE KEY uq_fact_mov_comprobante_cuota (comprobante_id, tipo_movimiento, numero_cuota),
    CONSTRAINT fk_fact_mov_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_mov_medio FOREIGN KEY (medio_pago_id) REFERENCES catalogo_medios_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO facturacion_comprobante_movimientos
    (comprobante_id, tipo_movimiento, numero_cuota, medio_pago_id, fecha_movimiento, monto, estado, referencia, observacion, created_by, created_at)
SELECT
    p.comprobante_id,
    'PAGO',
    NULL,
    p.medio_pago_id,
    p.fecha_pago,
    p.monto,
    'PAGADO',
    p.referencia,
    p.observacion,
    p.created_by,
    p.created_at
FROM facturacion_comprobante_pagos p
LEFT JOIN facturacion_comprobante_movimientos m
    ON m.comprobante_id = p.comprobante_id
   AND m.tipo_movimiento = 'PAGO'
   AND m.medio_pago_id = p.medio_pago_id
   AND COALESCE(m.fecha_movimiento, '1000-01-01') = COALESCE(p.fecha_pago, '1000-01-01')
   AND COALESCE(m.monto, 0) = COALESCE(p.monto, 0)
WHERE p.deleted_at IS NULL
  AND m.id IS NULL;

INSERT INTO facturacion_comprobante_movimientos
    (comprobante_id, tipo_movimiento, numero_cuota, medio_pago_id, fecha_movimiento, monto, estado, observacion, created_by, created_at)
SELECT
    q.comprobante_id,
    'CUOTA',
    q.numero_cuota,
    NULL,
    q.fecha_vencimiento,
    q.monto,
    q.estado,
    q.observacion,
    q.created_by,
    q.created_at
FROM facturacion_comprobante_cuotas q
LEFT JOIN facturacion_comprobante_movimientos m
    ON m.comprobante_id = q.comprobante_id
   AND m.tipo_movimiento = 'CUOTA'
   AND m.numero_cuota = q.numero_cuota
WHERE q.deleted_at IS NULL
  AND m.id IS NULL;



-- ==================================================
-- 20260821_drop_empresa_cuenta_columns.sql
-- ==================================================
SET @sql_drop_empresa_cuenta_detracciones := (
    SELECT IF(
        EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = 'empresas'
              AND COLUMN_NAME = 'cuenta_detracciones'
        ),
        'ALTER TABLE empresas DROP COLUMN cuenta_detracciones',
        'SELECT 1'
    )
);
PREPARE stmt_drop_empresa_cuenta_detracciones FROM @sql_drop_empresa_cuenta_detracciones;
EXECUTE stmt_drop_empresa_cuenta_detracciones;
DEALLOCATE PREPARE stmt_drop_empresa_cuenta_detracciones;

SET @sql_drop_empresa_cuenta_bancaria := (
    SELECT IF(
        EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = DATABASE()
              AND TABLE_NAME = 'empresas'
              AND COLUMN_NAME = 'cuenta_bancaria'
        ),
        'ALTER TABLE empresas DROP COLUMN cuenta_bancaria',
        'SELECT 1'
    )
);
PREPARE stmt_drop_empresa_cuenta_bancaria FROM @sql_drop_empresa_cuenta_bancaria;
EXECUTE stmt_drop_empresa_cuenta_bancaria;
DEALLOCATE PREPARE stmt_drop_empresa_cuenta_bancaria;


-- ==================================================
-- 20260821_drop_forma_pago_comprobante.sql
-- ==================================================
-- Eliminacion de forma_pago_id de la cabecera de comprobantes

ALTER TABLE facturacion_comprobantes
    DROP FOREIGN KEY fk_fact_comprobante_forma_pago,
    DROP COLUMN forma_pago_id;


-- ==================================================
-- 20260821_empresa_sucursal_logo.sql
-- ==================================================
-- Logo por empresa y sucursal con fallback en impresion

SET @logo_empresa_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'logo'
);

SET @sql_logo_empresa := IF(
    @logo_empresa_exists = 0,
    'ALTER TABLE empresas ADD COLUMN logo VARCHAR(500) NULL AFTER nombre_comercial',
    'SELECT 1'
);
PREPARE stmt_logo_empresa FROM @sql_logo_empresa;
EXECUTE stmt_logo_empresa;
DEALLOCATE PREPARE stmt_logo_empresa;

SET @logo_sucursal_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresa_sucursales'
      AND column_name = 'logo'
);

SET @sql_logo_sucursal := IF(
    @logo_sucursal_exists = 0,
    'ALTER TABLE empresa_sucursales ADD COLUMN logo VARCHAR(500) NULL AFTER telefono',
    'SELECT 1'
);
PREPARE stmt_logo_sucursal FROM @sql_logo_sucursal;
EXECUTE stmt_logo_sucursal;
DEALLOCATE PREPARE stmt_logo_sucursal;


-- ==================================================
-- 20260821_empresa_sunat_credenciales.sql
-- ==================================================
SET @sunat_usuario_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'sunat_usuario_secundario'
);

SET @sql_sunat_usuario := IF(
    @sunat_usuario_exists = 0,
    'ALTER TABLE empresas ADD COLUMN sunat_usuario_secundario VARCHAR(120) NULL AFTER giro_negocio_id',
    'SELECT 1'
);
PREPARE stmt_sunat_usuario FROM @sql_sunat_usuario;
EXECUTE stmt_sunat_usuario;
DEALLOCATE PREPARE stmt_sunat_usuario;

SET @sunat_clave_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'sunat_clave_secundaria'
);

SET @sql_sunat_clave := IF(
    @sunat_clave_exists = 0,
    'ALTER TABLE empresas ADD COLUMN sunat_clave_secundaria VARCHAR(255) NULL AFTER sunat_usuario_secundario',
    'SELECT 1'
);
PREPARE stmt_sunat_clave FROM @sql_sunat_clave;
EXECUTE stmt_sunat_clave;
DEALLOCATE PREPARE stmt_sunat_clave;


-- ==================================================
-- 20260821_facturacion_detracciones.sql
-- ==================================================
-- Detracciones por comprobante en tabla separada

CREATE TABLE IF NOT EXISTS facturacion_comprobante_detracciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    catalogo_detraccion_id BIGINT UNSIGNED NULL,
    base DECIMAL(14,2) NOT NULL DEFAULT 0,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_det_comprobante (comprobante_id),
    KEY idx_fact_det_catalogo (catalogo_detraccion_id),
    CONSTRAINT fk_fact_det_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_det_catalogo FOREIGN KEY (catalogo_detraccion_id) REFERENCES catalogo_detracciones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO facturacion_comprobante_detracciones
    (comprobante_id, catalogo_detraccion_id, base, monto, created_at)
SELECT
    c.id,
    c.detraccion_id,
    COALESCE(c.detraccion_base, c.total, 0),
    COALESCE(c.detraccion_monto, 0),
    NOW()
FROM facturacion_comprobantes c
LEFT JOIN facturacion_comprobante_detracciones fd ON fd.comprobante_id = c.id
WHERE fd.id IS NULL
  AND c.deleted_at IS NULL
  AND (c.detraccion_id IS NOT NULL OR COALESCE(c.detraccion_base, 0) <> 0 OR COALESCE(c.detraccion_monto, 0) <> 0);


-- ==================================================
-- 20260821_facturacion_integraciones.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS facturacion_integracion_endpoints (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL,
    descripcion VARCHAR(180) NOT NULL,
    tipo VARCHAR(40) NOT NULL,
    proveedor VARCHAR(20) NOT NULL DEFAULT 'CUSTOM',
    ambiente VARCHAR(20) NOT NULL DEFAULT 'PRODUCCION',
    metodo VARCHAR(10) NOT NULL DEFAULT 'POST',
    url VARCHAR(600) NULL,
    headers_json JSON NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_facturacion_integracion_codigo (codigo),
    KEY idx_facturacion_integracion_tipo (tipo),
    KEY idx_facturacion_integracion_proveedor (proveedor),
    KEY idx_facturacion_integracion_ambiente (ambiente)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO facturacion_integracion_endpoints
    (codigo, descripcion, tipo, proveedor, ambiente, metodo, url, estado, created_at)
VALUES
    ('SUNAT_FACTURA', 'Envio de comprobantes a SUNAT', 'EMISION', 'SUNAT', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('SUNAT_CONSULTA', 'Consulta de CDR / estado', 'CONSULTA', 'SUNAT', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('SUNAT_GUIA', 'Envio de guia de remision', 'GUIA', 'SUNAT', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('SUNAT_SUMARIO_BOLETA', 'Resumen diario de boletas', 'RESUMEN_BOLETAS', 'SUNAT', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('SUNAT_BAJA', 'Comunicacion de baja', 'RESUMEN_BAJA', 'SUNAT', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('OSE_FACTURA', 'Envio de comprobantes a OSE', 'EMISION', 'OSE', 'PRODUCCION', 'POST', NULL, 1, NOW()),
    ('CUSTOM_FACTURA', 'Endpoint personalizado de emision', 'EMISION', 'CUSTOM', 'PRODUCCION', 'POST', NULL, 1, NOW());

CREATE TABLE IF NOT EXISTS empresa_certificados_digitales (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    alias VARCHAR(120) NOT NULL,
    archivo_pfx VARCHAR(600) NOT NULL,
    password_pfx VARCHAR(255) NOT NULL,
    fecha_vencimiento DATE NULL,
    es_activo TINYINT(1) NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_cert_empresa (empresa_id),
    KEY idx_cert_activo (empresa_id, es_activo, estado),
    CONSTRAINT fk_cert_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260821_facturacion_integraciones_default.sql
-- ==================================================
ALTER TABLE facturacion_integracion_endpoints
    ADD COLUMN es_defecto TINYINT(1) NOT NULL DEFAULT 0 AFTER estado;

UPDATE facturacion_integracion_endpoints
SET es_defecto = 1
WHERE codigo = 'SUNAT_FACTURA'
  AND deleted_at IS NULL
  AND estado = 1
LIMIT 1;


-- ==================================================
-- 20260821_facturacion_movimientos_catalogo.sql
-- ==================================================
-- Catalogo de tipos de movimiento y normalizacion de movimientos de facturacion

CREATE TABLE IF NOT EXISTS catalogo_tipo_movimiento (
    id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    descripcion VARCHAR(80) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_tipo_movimiento_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_tipo_movimiento (id, codigo, descripcion, estado, created_at) VALUES
(1, 'PAGO', 'Pago', 1, NOW()),
(2, 'CUOTA', 'Cuota', 1, NOW());

CREATE TABLE IF NOT EXISTS facturacion_comprobante_movimientos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    tipo_movimiento_id TINYINT UNSIGNED NOT NULL,
    numero_cuota INT UNSIGNED NULL,
    medio_pago_id BIGINT UNSIGNED NULL,
    fecha_movimiento DATE NULL,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    referencia VARCHAR(150) NULL,
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_mov_comprobante (comprobante_id),
    KEY idx_fact_mov_tipo (tipo_movimiento_id),
    KEY idx_fact_mov_estado (estado),
    KEY idx_fact_mov_medio (medio_pago_id),
    KEY idx_fact_mov_fecha (fecha_movimiento),
    UNIQUE KEY uq_fact_mov_comprobante_cuota (comprobante_id, tipo_movimiento_id, numero_cuota),
    CONSTRAINT fk_fact_mov_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_mov_medio FOREIGN KEY (medio_pago_id) REFERENCES catalogo_medios_pago(id),
    CONSTRAINT fk_fact_mov_tipo FOREIGN KEY (tipo_movimiento_id) REFERENCES catalogo_tipo_movimiento(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260821_sucursales_pos.sql
-- ==================================================
-- Estructura de sucursales, POS y asignaciones por usuario

CREATE TABLE IF NOT EXISTS empresa_sucursales (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(180) NOT NULL,
    direccion VARCHAR(255) NULL,
    telefono VARCHAR(50) NULL,
    es_principal TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_empresa_sucursal (empresa_id, codigo),
    KEY idx_empresa_sucursal_empresa (empresa_id),
    CONSTRAINT fk_empresa_sucursal_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS sucursal_pos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    sucursal_id BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(180) NOT NULL,
    descripcion VARCHAR(255) NULL,
    impresion_formato ENUM('A4','A5','TICKET') NOT NULL DEFAULT 'TICKET',
    es_principal TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_sucursal_pos (sucursal_id, codigo),
    KEY idx_pos_sucursal (sucursal_id),
    CONSTRAINT fk_pos_sucursal FOREIGN KEY (sucursal_id) REFERENCES empresa_sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS usuario_sucursales (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    sucursal_id BIGINT UNSIGNED NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_usuario_sucursal (usuario_id, sucursal_id),
    KEY idx_usuario_sucursal_usuario (usuario_id),
    KEY idx_usuario_sucursal_sucursal (sucursal_id),
    CONSTRAINT fk_usuario_sucursal_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_usuario_sucursal_sucursal FOREIGN KEY (sucursal_id) REFERENCES empresa_sucursales(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS usuario_pos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    usuario_id BIGINT UNSIGNED NOT NULL,
    pos_id BIGINT UNSIGNED NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_usuario_pos (usuario_id, pos_id),
    KEY idx_usuario_pos_usuario (usuario_id),
    KEY idx_usuario_pos_pos (pos_id),
    CONSTRAINT fk_usuario_pos_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_usuario_pos_pos FOREIGN KEY (pos_id) REFERENCES sucursal_pos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE facturacion_comprobantes
    ADD COLUMN sucursal_id BIGINT UNSIGNED NULL AFTER empresa_id,
    ADD COLUMN pos_id BIGINT UNSIGNED NULL AFTER sucursal_id,
    ADD KEY idx_fact_comprobante_sucursal (sucursal_id),
    ADD KEY idx_fact_comprobante_pos (pos_id),
    ADD CONSTRAINT fk_fact_comprobante_sucursal FOREIGN KEY (sucursal_id) REFERENCES empresa_sucursales(id),
    ADD CONSTRAINT fk_fact_comprobante_pos FOREIGN KEY (pos_id) REFERENCES sucursal_pos(id);


-- ==================================================
-- 20260821_sucursales_ubigeo.sql
-- ==================================================
-- Ubigeo de sucursal para XML SUNAT

SET @ubigeo_sucursal_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresa_sucursales'
      AND column_name = 'ubigeo'
);

SET @sql_ubigeo_sucursal := IF(
    @ubigeo_sucursal_exists = 0,
    'ALTER TABLE empresa_sucursales ADD COLUMN ubigeo CHAR(6) NULL AFTER telefono',
    'SELECT 1'
);
PREPARE stmt_ubigeo_sucursal FROM @sql_ubigeo_sucursal;
EXECUTE stmt_ubigeo_sucursal;
DEALLOCATE PREPARE stmt_ubigeo_sucursal;


-- ==================================================
-- 20260821_unidades_medida.sql
-- ==================================================
-- Catalogo base de unidades de medida

CREATE TABLE IF NOT EXISTS unidades_medida (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(10) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    simbolo VARCHAR(20) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_unidades_codigo (codigo),
    KEY idx_unidades_descripcion (descripcion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO unidades_medida (id, codigo, descripcion, simbolo, estado, created_at) VALUES
(1, 'NIU', 'Unidad', 'UND', 1, NOW()),
(2, 'ZZ', 'Servicio', 'SER', 1, NOW()),
(3, 'HUR', 'Hora', 'H', 1, NOW()),
(4, 'KGM', 'Kilogramo', 'KG', 1, NOW()),
(5, 'LTR', 'Litro', 'L', 1, NOW()),
(6, 'MTR', 'Metro', 'M', 1, NOW()),
(7, 'C62', 'Unidad de producto', 'UND', 1, NOW());

SET @sql_add_catalogo_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD COLUMN unidad_medida_id BIGINT UNSIGNED NULL AFTER tipo',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'unidad_medida_id'
);
PREPARE stmt_add_catalogo_um FROM @sql_add_catalogo_um;
EXECUTE stmt_add_catalogo_um;
DEALLOCATE PREPARE stmt_add_catalogo_um;

SET @sql_add_detalle_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobante_detalles ADD COLUMN unidad_medida_id BIGINT UNSIGNED NULL AFTER catalogo_item_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobante_detalles'
      AND column_name = 'unidad_medida_id'
);
PREPARE stmt_add_detalle_um FROM @sql_add_detalle_um;
EXECUTE stmt_add_detalle_um;
DEALLOCATE PREPARE stmt_add_detalle_um;

SET @sql_fk_catalogo_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD CONSTRAINT fk_catalogo_unidad_medida FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND constraint_name = 'fk_catalogo_unidad_medida'
);
PREPARE stmt_fk_catalogo_um FROM @sql_fk_catalogo_um;
EXECUTE stmt_fk_catalogo_um;
DEALLOCATE PREPARE stmt_fk_catalogo_um;

SET @sql_fk_detalle_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobante_detalles ADD CONSTRAINT fk_fact_detalle_unidad_medida FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobante_detalles'
      AND constraint_name = 'fk_fact_detalle_unidad_medida'
);
PREPARE stmt_fk_detalle_um FROM @sql_fk_detalle_um;
EXECUTE stmt_fk_detalle_um;
DEALLOCATE PREPARE stmt_fk_detalle_um;

UPDATE catalogo_items ci
LEFT JOIN unidades_medida um ON um.codigo = ci.unidad_medida
SET ci.unidad_medida_id = um.id
WHERE ci.unidad_medida_id IS NULL
  AND ci.deleted_at IS NULL;

UPDATE facturacion_comprobante_detalles d
LEFT JOIN catalogo_items ci ON ci.id = d.catalogo_item_id
LEFT JOIN unidades_medida um ON um.codigo = COALESCE(ci.unidad_medida, d.unidad_medida)
SET d.unidad_medida_id = um.id
WHERE d.unidad_medida_id IS NULL
  AND d.deleted_at IS NULL;


-- ==================================================
-- 20260822_catalogo_tipo_documento.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS catalogo_tipo_documentos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo_sunat VARCHAR(5) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    comentario VARCHAR(255) NULL,
    orden INT UNSIGNED NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_tipo_documento_codigo (codigo_sunat)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_tipo_documentos (id, codigo_sunat, descripcion, comentario, orden, estado, created_at) VALUES
(1, '6', 'RUC', 'Registro Unico de Contribuyentes', 1, 1, NOW()),
(2, '1', 'DNI', 'Documento Nacional de Identidad', 2, 1, NOW()),
(3, '4', 'CARNET EXTRANJERIA', 'Carnet de Extranjeria', 3, 1, NOW()),
(4, '7', 'PASAPORTE', 'Pasaporte', 4, 1, NOW()),
(5, '0', 'SIN DOCUMENTO', 'Consumidor final u otros', 5, 1, NOW()),
(6, 'A', 'CEDULA DIPLOMATICA', 'Cedula Diplomatica de Identidad', 6, 1, NOW());

ALTER TABLE terceros
    ADD COLUMN tipo_documento_id BIGINT UNSIGNED NULL AFTER tipo,
    MODIFY numero_documento VARCHAR(20) NULL;

UPDATE terceros t
LEFT JOIN catalogo_tipo_documentos ctd ON ctd.codigo_sunat = t.tipo_documento
SET t.tipo_documento_id = ctd.id
WHERE t.deleted_at IS NULL;

UPDATE terceros
SET tipo_documento_id = 1
WHERE tipo_documento_id IS NULL
  AND deleted_at IS NULL
  AND tipo_documento IS NOT NULL
  AND tipo_documento <> '';

ALTER TABLE terceros
    ADD KEY idx_terceros_tipo_documento_id (tipo_documento_id),
    ADD CONSTRAINT fk_terceros_tipo_documento FOREIGN KEY (tipo_documento_id) REFERENCES catalogo_tipo_documentos(id);


-- ==================================================
-- 20260822_empresa_sunat_api.sql
-- ==================================================
-- Credenciales de la API REST de SUNAT (GRE) para abisfact.
-- El client_id y client_secret se obtienen al registrar la empresa en el
-- portal de clientes SOL de SUNAT para consumir api-cpe.sunat.gob.pe.

SET @client_id_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'sunat_client_id'
);

SET @sql_client_id := IF(
    @client_id_exists = 0,
    'ALTER TABLE empresas ADD COLUMN sunat_client_id VARCHAR(120) NULL AFTER sunat_clave_secundaria',
    'SELECT 1'
);
PREPARE stmt_client_id FROM @sql_client_id;
EXECUTE stmt_client_id;
DEALLOCATE PREPARE stmt_client_id;

SET @client_secret_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'sunat_client_secret'
);

SET @sql_client_secret := IF(
    @client_secret_exists = 0,
    'ALTER TABLE empresas ADD COLUMN sunat_client_secret VARCHAR(255) NULL AFTER sunat_client_id',
    'SELECT 1'
);
PREPARE stmt_client_secret FROM @sql_client_secret;
EXECUTE stmt_client_secret;
DEALLOCATE PREPARE stmt_client_secret;

-- ==================================================
-- 20260822_facturacion_comprobante_evento_anulado.sql
-- ==================================================
INSERT IGNORE INTO facturacion_comprobante_eventos
    (id, codigo, descripcion, comentario, estado, created_at)
VALUES
    (8, 'ANULADO', 'Anulado', 'Comprobante anulado por sistema o por baja electrónica', 1, NOW());


-- ==================================================
-- 20260822_facturacion_comprobante_evento_no_existe.sql
-- ==================================================
INSERT IGNORE INTO facturacion_comprobante_eventos
    (codigo, descripcion, comentario, estado, created_at)
VALUES
    ('NO_EXISTE', 'No existe', 'El comprobante no existe en SUNAT', 1, NOW());


-- ==================================================
-- 20260822_facturacion_comprobante_historial.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS facturacion_comprobante_eventos (
    id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(30) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    comentario VARCHAR(255) NULL COMMENT 'Descripcion extendida del evento',
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_comprobante_eventos_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO facturacion_comprobante_eventos
    (id, codigo, descripcion, comentario, estado, created_at)
VALUES
    (1, 'GENERADO', 'Generado', 'Se genero el XML del comprobante', 1, NOW()),
    (2, 'FIRMADO', 'Firmado', 'Se firmo el XML del comprobante', 1, NOW()),
    (3, 'ZIPIADO', 'Zipiado', 'Se comprimio el XML firmado en ZIP', 1, NOW()),
    (4, 'ENVIADO', 'Enviado', 'Se envio el ZIP a SUNAT u otro endpoint', 1, NOW()),
    (5, 'ACEPTADO', 'Aceptado', 'SUNAT acepto el comprobante', 1, NOW()),
    (6, 'RECHAZADO', 'Rechazado', 'SUNAT rechazo el comprobante', 1, NOW()),
    (7, 'ERROR', 'Error', 'Ocurrio un error durante el proceso', 1, NOW()),
    (8, 'VENCIDO', 'Vencido', 'El comprobante supero la fecha maxima de envio automatico', 1, NOW());

CREATE TABLE IF NOT EXISTS facturacion_comprobante_historial (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    evento_id TINYINT UNSIGNED NOT NULL COMMENT 'Referencia a facturacion_comprobante_eventos.id',
    detalle VARCHAR(500) NULL,
    archivo_ruta VARCHAR(600) NULL,
    ticket VARCHAR(80) NULL COMMENT 'Ticket SUNAT cuando el evento lo genera',
    respuesta LONGTEXT NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_hist_comprobante (comprobante_id),
    KEY idx_fact_hist_evento (evento_id),
    KEY idx_fact_hist_fecha (created_at),
    CONSTRAINT fk_fact_hist_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_hist_evento FOREIGN KEY (evento_id) REFERENCES facturacion_comprobante_eventos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260822_facturacion_guias.sql
-- ==================================================
-- Guias de remision electronica (GRE remitente) para abisfact
-- Las guias se guardan en facturacion_comprobantes con tipo_comprobante 09;
-- esta tabla guarda los datos particulares del traslado.

CREATE TABLE IF NOT EXISTS facturacion_guia_catalogos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    categoria VARCHAR(30) NOT NULL COMMENT 'MOTIVO_TRASLADO | MODALIDAD_TRANSPORTE',
    codigo VARCHAR(5) NOT NULL,
    descripcion VARCHAR(180) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_guia_cat (categoria, codigo),
    KEY idx_fact_guia_cat_categoria (categoria)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO facturacion_guia_catalogos
    (categoria, codigo, descripcion, estado, created_at)
VALUES
    ('MODALIDAD_TRANSPORTE', '01', 'Publico', 1, NOW()),
    ('MODALIDAD_TRANSPORTE', '02', 'Privado', 1, NOW()),
    ('MOTIVO_TRASLADO', '01', 'Venta', 1, NOW()),
    ('MOTIVO_TRASLADO', '02', 'Compra', 1, NOW()),
    ('MOTIVO_TRASLADO', '03', 'Venta con entrega a terceros', 1, NOW()),
    ('MOTIVO_TRASLADO', '04', 'Traslado entre establecimientos de la misma empresa', 1, NOW()),
    ('MOTIVO_TRASLADO', '05', 'Consignacion', 1, NOW()),
    ('MOTIVO_TRASLADO', '06', 'Devolucion', 1, NOW()),
    ('MOTIVO_TRASLADO', '07', 'Traslado entre establecimientos de la misma empresa (bienes transformados)', 1, NOW()),
    ('MOTIVO_TRASLADO', '08', 'Importacion', 1, NOW()),
    ('MOTIVO_TRASLADO', '09', 'Exportacion', 1, NOW()),
    ('MOTIVO_TRASLADO', '13', 'Otros', 1, NOW());

CREATE TABLE IF NOT EXISTS facturacion_guia_transporte (
    comprobante_id BIGINT UNSIGNED PRIMARY KEY,
    fecha_traslado DATE NOT NULL,
    peso_total DECIMAL(12,3) NOT NULL DEFAULT 0,
    unidad_peso VARCHAR(10) NOT NULL DEFAULT 'KGM',
    bultos INT UNSIGNED NOT NULL DEFAULT 0,
    motivo_traslado_codigo VARCHAR(5) NOT NULL,
    motivo_traslado_descripcion VARCHAR(180) NULL,
    modalidad_transporte_codigo VARCHAR(5) NOT NULL,
    transportista_documento_tipo VARCHAR(2) NULL,
    transportista_documento VARCHAR(20) NULL,
    transportista_nombre VARCHAR(200) NULL,
    transportista_registro_mtc VARCHAR(50) NULL,
    conductor_documento_tipo VARCHAR(2) NULL,
    conductor_documento VARCHAR(20) NULL,
    conductor_nombres VARCHAR(150) NULL,
    conductor_apellidos VARCHAR(150) NULL,
    conductor_licencia VARCHAR(30) NULL,
    placa VARCHAR(15) NULL,
    indicador_m1l TINYINT(1) NOT NULL DEFAULT 0,
    partida_ubigeo VARCHAR(6) NOT NULL,
    partida_direccion VARCHAR(255) NOT NULL,
    llegada_ubigeo VARCHAR(6) NOT NULL,
    llegada_direccion VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    CONSTRAINT fk_guia_transporte_comp FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Serie base para guias de remision (tipo 09)
INSERT IGNORE INTO facturacion_series
    (empresa_id, tipo_comprobante_id, serie, es_electronico, en_modulo, correlativo_actual, estado, created_at)
SELECT e.id, tc.id, 'T001', 1, 2, 0, 1, NOW()
FROM empresas e
CROSS JOIN facturacion_tipo_comprobante tc
WHERE tc.codigo = '09'
  AND tc.deleted_at IS NULL
  AND e.deleted_at IS NULL;


-- ==================================================
-- 20260822_facturacion_guias_maestros.sql
-- ==================================================
-- Tablas maestras reutilizables para guias de remision:
-- direcciones (ubigeo + direccion), transportistas y conductores.
-- Asi los datos se registran una vez y se reutilizan en todas las guias.

CREATE TABLE IF NOT EXISTS facturacion_direcciones (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tercero_id BIGINT UNSIGNED NULL COMMENT 'Opcional: direccion asociada a un tercero',
    descripcion VARCHAR(255) NOT NULL,
    ubigeo VARCHAR(6) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_dir_empresa (empresa_id),
    KEY idx_fact_dir_tercero (tercero_id),
    CONSTRAINT fk_fact_dir_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_fact_dir_tercero FOREIGN KEY (tercero_id) REFERENCES terceros(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_transportistas (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_documento VARCHAR(2) NOT NULL DEFAULT '6',
    numero_documento VARCHAR(20) NOT NULL,
    razon_social VARCHAR(200) NOT NULL,
    registro_mtc VARCHAR(50) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_transportista (empresa_id, numero_documento),
    CONSTRAINT fk_fact_transportista_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_conductores (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_documento VARCHAR(2) NOT NULL DEFAULT '1',
    numero_documento VARCHAR(20) NOT NULL,
    nombres VARCHAR(150) NOT NULL,
    apellidos VARCHAR(150) NOT NULL,
    licencia VARCHAR(30) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_conductor (empresa_id, numero_documento),
    CONSTRAINT fk_fact_conductor_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Referencias a los maestros desde el traslado de cada guia
SET @col_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'facturacion_guia_transporte' AND column_name = 'transportista_id'
);
SET @sql := IF(@col_exists = 0,
    'ALTER TABLE facturacion_guia_transporte ADD COLUMN transportista_id BIGINT UNSIGNED NULL AFTER modalidad_transporte_codigo',
    'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @col_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'facturacion_guia_transporte' AND column_name = 'conductor_id'
);
SET @sql := IF(@col_exists = 0,
    'ALTER TABLE facturacion_guia_transporte ADD COLUMN conductor_id BIGINT UNSIGNED NULL AFTER transportista_id',
    'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @col_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'facturacion_guia_transporte' AND column_name = 'direccion_partida_id'
);
SET @sql := IF(@col_exists = 0,
    'ALTER TABLE facturacion_guia_transporte ADD COLUMN direccion_partida_id BIGINT UNSIGNED NULL AFTER conductor_id',
    'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @col_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'facturacion_guia_transporte' AND column_name = 'direccion_llegada_id'
);
SET @sql := IF(@col_exists = 0,
    'ALTER TABLE facturacion_guia_transporte ADD COLUMN direccion_llegada_id BIGINT UNSIGNED NULL AFTER direccion_partida_id',
    'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- Rescatar los datos de las guias existentes hacia los maestros
INSERT IGNORE INTO facturacion_transportistas
    (empresa_id, tipo_documento, numero_documento, razon_social, registro_mtc, estado, created_at)
SELECT c.empresa_id, COALESCE(gt.transportista_documento_tipo, '6'), gt.transportista_documento, gt.transportista_nombre, gt.transportista_registro_mtc, 1, NOW()
FROM facturacion_guia_transporte gt
INNER JOIN facturacion_comprobantes c ON c.id = gt.comprobante_id
WHERE gt.transportista_documento IS NOT NULL AND gt.transportista_documento <> ''
  AND gt.deleted_at IS NULL;

INSERT IGNORE INTO facturacion_conductores
    (empresa_id, tipo_documento, numero_documento, nombres, apellidos, licencia, estado, created_at)
SELECT c.empresa_id, COALESCE(gt.conductor_documento_tipo, '1'), gt.conductor_documento, gt.conductor_nombres, gt.conductor_apellidos, gt.conductor_licencia, 1, NOW()
FROM facturacion_guia_transporte gt
INNER JOIN facturacion_comprobantes c ON c.id = gt.comprobante_id
WHERE gt.conductor_documento IS NOT NULL AND gt.conductor_documento <> ''
  AND gt.deleted_at IS NULL;

INSERT INTO facturacion_direcciones
    (empresa_id, tercero_id, descripcion, ubigeo, estado, created_at)
SELECT c.empresa_id, c.tercero_id, gt.partida_direccion, gt.partida_ubigeo, 1, NOW()
FROM facturacion_guia_transporte gt
INNER JOIN facturacion_comprobantes c ON c.id = gt.comprobante_id
WHERE gt.partida_ubigeo IS NOT NULL AND gt.partida_ubigeo <> ''
  AND gt.deleted_at IS NULL
  AND NOT EXISTS (
      SELECT 1 FROM facturacion_direcciones d
      WHERE d.empresa_id = c.empresa_id AND d.ubigeo = gt.partida_ubigeo AND d.descripcion = gt.partida_direccion AND d.deleted_at IS NULL
  );

INSERT INTO facturacion_direcciones
    (empresa_id, tercero_id, descripcion, ubigeo, estado, created_at)
SELECT c.empresa_id, c.tercero_id, gt.llegada_direccion, gt.llegada_ubigeo, 1, NOW()
FROM facturacion_guia_transporte gt
INNER JOIN facturacion_comprobantes c ON c.id = gt.comprobante_id
WHERE gt.llegada_ubigeo IS NOT NULL AND gt.llegada_ubigeo <> ''
  AND gt.deleted_at IS NULL
  AND NOT EXISTS (
      SELECT 1 FROM facturacion_direcciones d
      WHERE d.empresa_id = c.empresa_id AND d.ubigeo = gt.llegada_ubigeo AND d.descripcion = gt.llegada_direccion AND d.deleted_at IS NULL
  );

-- Vincular las guias existentes con sus maestros
UPDATE facturacion_guia_transporte gt
INNER JOIN facturacion_comprobantes c ON c.id = gt.comprobante_id
INNER JOIN facturacion_transportistas t ON t.empresa_id = c.empresa_id AND t.numero_documento = gt.transportista_documento AND t.deleted_at IS NULL
SET gt.transportista_id = t.id
WHERE gt.transportista_id IS NULL AND gt.transportista_documento IS NOT NULL AND gt.transportista_documento <> '';

UPDATE facturacion_guia_transporte gt
INNER JOIN facturacion_conductores cd ON cd.empresa_id = (SELECT empresa_id FROM facturacion_comprobantes WHERE id = gt.comprobante_id) AND cd.numero_documento = gt.conductor_documento AND cd.deleted_at IS NULL
SET gt.conductor_id = cd.id
WHERE gt.conductor_id IS NULL AND gt.conductor_documento IS NOT NULL AND gt.conductor_documento <> '';

UPDATE facturacion_guia_transporte gt
INNER JOIN facturacion_direcciones dp ON dp.empresa_id = (SELECT empresa_id FROM facturacion_comprobantes WHERE id = gt.comprobante_id) AND dp.ubigeo = gt.partida_ubigeo AND dp.descripcion = gt.partida_direccion AND dp.deleted_at IS NULL
SET gt.direccion_partida_id = dp.id
WHERE gt.direccion_partida_id IS NULL AND gt.partida_ubigeo IS NOT NULL AND gt.partida_ubigeo <> '';

UPDATE facturacion_guia_transporte gt
INNER JOIN facturacion_direcciones dl ON dl.empresa_id = (SELECT empresa_id FROM facturacion_comprobantes WHERE id = gt.comprobante_id) AND dl.ubigeo = gt.llegada_ubigeo AND dl.descripcion = gt.llegada_direccion AND dl.deleted_at IS NULL
SET gt.direccion_llegada_id = dl.id
WHERE gt.direccion_llegada_id IS NULL AND gt.llegada_ubigeo IS NOT NULL AND gt.llegada_ubigeo <> '';

-- ==================================================
-- 20260822_facturacion_notas.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS facturacion_motivos_nota (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tipo CHAR(1) NOT NULL COMMENT 'C = nota de credito, D = nota de debito',
    codigo VARCHAR(10) NOT NULL,
    descripcion VARCHAR(180) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_fact_motivos_nota (tipo, codigo),
    KEY idx_fact_motivos_nota_tipo (tipo),
    KEY idx_fact_motivos_nota_estado (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO facturacion_motivos_nota
    (id, tipo, codigo, descripcion, estado, created_at)
VALUES
    (1, 'C', '01', 'Anulacion de la operacion', 1, NOW()),
    (2, 'C', '03', 'Descuento global', 1, NOW()),
    (3, 'C', '04', 'Descuento por item', 1, NOW()),
    (4, 'C', '05', 'Devolucion total', 1, NOW()),
    (5, 'C', '06', 'Devolucion por item', 1, NOW()),
    (6, 'C', '07', 'Bonificacion', 1, NOW()),
    (7, 'C', '08', 'Ajustes por diferencia de precio', 1, NOW()),
    (8, 'C', '09', 'Otros conceptos', 1, NOW()),
    (9, 'D', '01', 'Intereses por mora', 1, NOW()),
    (10, 'D', '02', 'Aumento en el valor', 1, NOW()),
    (11, 'D', '03', 'Penalidades', 1, NOW()),
    (12, 'D', '04', 'Ajustes por diferencia de precio', 1, NOW()),
    (13, 'D', '05', 'Otros conceptos', 1, NOW());

ALTER TABLE facturacion_comprobantes
    ADD COLUMN comprobante_referencia_id BIGINT UNSIGNED NULL AFTER tipo_comprobante_id,
    ADD COLUMN nota_motivo_id BIGINT UNSIGNED NULL AFTER comprobante_referencia_id,
    ADD COLUMN nota_motivo_codigo VARCHAR(10) NULL AFTER nota_motivo_id,
    ADD COLUMN nota_motivo_descripcion VARCHAR(180) NULL AFTER nota_motivo_codigo,
    ADD KEY idx_fact_comp_ref (comprobante_referencia_id),
    ADD KEY idx_fact_comp_nota_motivo (nota_motivo_id);

ALTER TABLE facturacion_comprobantes
    ADD CONSTRAINT fk_fact_comp_ref
        FOREIGN KEY (comprobante_referencia_id) REFERENCES facturacion_comprobantes(id);

ALTER TABLE facturacion_comprobantes
    ADD CONSTRAINT fk_fact_comp_nota_motivo
        FOREIGN KEY (nota_motivo_id) REFERENCES facturacion_motivos_nota(id);


-- ==================================================
-- 20260822_facturacion_resumen_diario.sql
-- ==================================================
CREATE TABLE IF NOT EXISTS facturacion_resumen_diarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_documento VARCHAR(2) NOT NULL DEFAULT 'RC' COMMENT 'RC = Resumen diario',
    fecha_generacion DATE NOT NULL,
    fecha_referencia DATE NOT NULL,
    fecha_envio DATE NOT NULL,
    serie VARCHAR(20) NOT NULL,
    correlativo INT UNSIGNED NOT NULL DEFAULT 1,
    nombre_xml VARCHAR(120) NULL,
    xml_path VARCHAR(600) NULL,
    xml_firmado_path VARCHAR(600) NULL,
    zip_path VARCHAR(600) NULL,
    cdr_zip_path VARCHAR(600) NULL,
    cdr_xml_path VARCHAR(600) NULL,
    ticket VARCHAR(80) NULL,
    estado VARCHAR(20) NOT NULL DEFAULT 'GENERADO' COMMENT 'GENERADO, FIRMADO, ZIPIADO, ENVIADO, PENDIENTE, ACEPTADO, RECHAZADO, ERROR, VENCIDO',
    codigo_sunat VARCHAR(20) NULL,
    mensaje_sunat VARCHAR(600) NULL,
    respuesta_soap LONGTEXT NULL,
    total_documentos INT UNSIGNED NOT NULL DEFAULT 0,
    total_importe DECIMAL(14,2) NOT NULL DEFAULT 0,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_resumen_empresa_fecha (empresa_id, fecha_referencia),
    KEY idx_resumen_empresa_estado (empresa_id, estado),
    UNIQUE KEY uq_resumen_empresa_serie_correlativo (empresa_id, serie, correlativo),
    CONSTRAINT fk_resumen_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS facturacion_resumen_diario_detalles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    resumen_id BIGINT UNSIGNED NOT NULL,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    line_id INT UNSIGNED NOT NULL,
    documento_tipo_codigo VARCHAR(2) NOT NULL,
    documento_serie VARCHAR(20) NOT NULL,
    documento_numero VARCHAR(20) NOT NULL,
    cliente_documento_tipo VARCHAR(5) NULL,
    cliente_documento_numero VARCHAR(20) NULL,
    cliente_razon_social VARCHAR(255) NULL,
    condicion_code VARCHAR(2) NOT NULL DEFAULT '1',
    moneda VARCHAR(3) NOT NULL DEFAULT 'PEN',
    total_amount DECIMAL(14,2) NOT NULL DEFAULT 0,
    gravadas DECIMAL(14,2) NOT NULL DEFAULT 0,
    exoneradas DECIMAL(14,2) NOT NULL DEFAULT 0,
    inafectas DECIMAL(14,2) NOT NULL DEFAULT 0,
    igv DECIMAL(14,2) NOT NULL DEFAULT 0,
    created_at DATETIME NOT NULL,
    deleted_at DATETIME NULL,
    KEY idx_resumen_detalle_resumen (resumen_id),
    KEY idx_resumen_detalle_comprobante (comprobante_id),
    CONSTRAINT fk_resumen_detalle_resumen FOREIGN KEY (resumen_id) REFERENCES facturacion_resumen_diarios(id),
    CONSTRAINT fk_resumen_detalle_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260822_guia_qr_sunat.sql
-- ==================================================
-- Guarda el enlace del codigo QR devuelto por SUNAT en el CDR
-- (tag cac:AdditionalDocumentReference/cbc:DocumentDescription o similar)
-- para mostrarlo en la representacion impresa de la guia.

SET @col_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_guia_transporte'
      AND column_name = 'qr_sunat'
);
SET @sql := IF(@col_exists = 0,
    'ALTER TABLE facturacion_guia_transporte ADD COLUMN qr_sunat VARCHAR(500) NULL AFTER indicador_m1l',
    'SELECT 1');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ==================================================
-- 20260822_normalizar_catalogo_items.sql
-- ==================================================
-- Normalizacion de catalogo_items con catlogos de tipo y afectacion IGV

CREATE TABLE IF NOT EXISTS catalogo_tipo_items (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    comentario VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_tipo_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_tipo_items (id, codigo, descripcion, comentario, estado, created_at) VALUES
(1, 'PRODUCTO', 'Producto', '1 = productos', 1, NOW()),
(2, 'SERVICIO', 'Servicio', '2 = servicios', 1, NOW());

CREATE TABLE IF NOT EXISTS catalogo_afectaciones_igv (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(4) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    tipo_afectacion CHAR(1) NOT NULL,
    codigo_tributo VARCHAR(10) NOT NULL,
    nombre_tributo VARCHAR(20) NOT NULL,
    abreviatura VARCHAR(20) NOT NULL,
    porcentaje DECIMAL(5,2) NOT NULL DEFAULT 0.00,
    afecta_igv TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_catalogo_afectacion_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO catalogo_afectaciones_igv
    (id, codigo, descripcion, tipo_afectacion, codigo_tributo, nombre_tributo, abreviatura, porcentaje, afecta_igv, estado, created_at)
VALUES
    (1, '10', 'OP. GRAVADAS', 'S', '1000', 'IGV', 'VAT', 18.00, 1, 1, NOW()),
    (2, '20', 'OP. EXONERADAS', 'E', '9997', 'EXO', 'VAT', 0.00, 0, 1, NOW()),
    (3, '30', 'OP. INAFECTAS', 'O', '9998', 'INA', 'FRE', 0.00, 0, 1, NOW());

SET @tipo_col_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'tipo_id'
);

SET @sql_add_tipo_id := IF(
    @tipo_col_exists = 0,
    'ALTER TABLE catalogo_items ADD COLUMN tipo_id BIGINT UNSIGNED NULL AFTER empresa_id',
    'SELECT 1'
);
PREPARE stmt_add_tipo_id FROM @sql_add_tipo_id;
EXECUTE stmt_add_tipo_id;
DEALLOCATE PREPARE stmt_add_tipo_id;

SET @afect_col_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'afectacion_igv_id'
);

SET @sql_add_afect_id := IF(
    @afect_col_exists = 0,
    'ALTER TABLE catalogo_items ADD COLUMN afectacion_igv_id BIGINT UNSIGNED NULL AFTER unidad_medida_id',
    'SELECT 1'
);
PREPARE stmt_add_afect_id FROM @sql_add_afect_id;
EXECUTE stmt_add_afect_id;
DEALLOCATE PREPARE stmt_add_afect_id;

UPDATE catalogo_items
SET tipo_id = CASE UPPER(tipo)
    WHEN 'SERVICIO' THEN 2
    ELSE 1
END
WHERE tipo_id IS NULL;

UPDATE catalogo_items
SET afectacion_igv_id = CASE
    WHEN afecto_igv = 1 THEN 1
    WHEN afecto_igv = 0 THEN 2
    ELSE 1
END
WHERE afectacion_igv_id IS NULL;

SET @sql_add_tipo_fk := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD CONSTRAINT fk_catalogo_tipo_item FOREIGN KEY (tipo_id) REFERENCES catalogo_tipo_items(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND constraint_name = 'fk_catalogo_tipo_item'
);
PREPARE stmt_add_tipo_fk FROM @sql_add_tipo_fk;
EXECUTE stmt_add_tipo_fk;
DEALLOCATE PREPARE stmt_add_tipo_fk;

SET @sql_add_afect_fk := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD CONSTRAINT fk_catalogo_afectacion_igv FOREIGN KEY (afectacion_igv_id) REFERENCES catalogo_afectaciones_igv(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND constraint_name = 'fk_catalogo_afectacion_igv'
);
PREPARE stmt_add_afect_fk FROM @sql_add_afect_fk;
EXECUTE stmt_add_afect_fk;
DEALLOCATE PREPARE stmt_add_afect_fk;

SET @sql_tipo_not_null := 'ALTER TABLE catalogo_items MODIFY COLUMN tipo_id BIGINT UNSIGNED NOT NULL COMMENT ''1=Producto, 2=Servicio''';
PREPARE stmt_tipo_not_null FROM @sql_tipo_not_null;
EXECUTE stmt_tipo_not_null;
DEALLOCATE PREPARE stmt_tipo_not_null;

SET @sql_afect_not_null := 'ALTER TABLE catalogo_items MODIFY COLUMN afectacion_igv_id BIGINT UNSIGNED NOT NULL COMMENT ''Referencia a catalogo_afectaciones_igv''';
PREPARE stmt_afect_not_null FROM @sql_afect_not_null;
EXECUTE stmt_afect_not_null;
DEALLOCATE PREPARE stmt_afect_not_null;

SET @sql_drop_tipo_legacy := (
    SELECT IF(
        COUNT(*) > 0,
        'ALTER TABLE catalogo_items DROP COLUMN tipo',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'tipo'
);
PREPARE stmt_drop_tipo_legacy FROM @sql_drop_tipo_legacy;
EXECUTE stmt_drop_tipo_legacy;
DEALLOCATE PREPARE stmt_drop_tipo_legacy;

SET @sql_drop_afecto_legacy := (
    SELECT IF(
        COUNT(*) > 0,
        'ALTER TABLE catalogo_items DROP COLUMN afecto_igv',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'afecto_igv'
);
PREPARE stmt_drop_afecto_legacy FROM @sql_drop_afecto_legacy;
EXECUTE stmt_drop_afecto_legacy;
DEALLOCATE PREPARE stmt_drop_afecto_legacy;


-- ==================================================
-- 20260826_facturacion_placa_vehicular.sql
-- ==================================================
-- Placa vehicular opcional para comprobantes de facturacion y flag por empresa.

SET @empresa_placa_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'empresas'
      AND column_name = 'requiere_placa_vehicular'
);

SET @sql_empresa_placa := IF(
    @empresa_placa_exists = 0,
    'ALTER TABLE empresas ADD COLUMN requiere_placa_vehicular TINYINT(1) NOT NULL DEFAULT 0',
    'SELECT 1'
);
PREPARE stmt_empresa_placa FROM @sql_empresa_placa;
EXECUTE stmt_empresa_placa;
DEALLOCATE PREPARE stmt_empresa_placa;

SET @comprobante_placa_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'placa_vehicular'
);

SET @sql_comprobante_placa := IF(
    @comprobante_placa_exists = 0,
    'ALTER TABLE facturacion_comprobantes ADD COLUMN placa_vehicular VARCHAR(15) NULL AFTER moneda',
    'SELECT 1'
);
PREPARE stmt_comprobante_placa FROM @sql_comprobante_placa;
EXECUTE stmt_comprobante_placa;
DEALLOCATE PREPARE stmt_comprobante_placa;


-- ==================================================
-- 20260827_cotizaciones.sql
-- ==================================================
-- Cotizaciones internas separadas de facturacion fiscal

INSERT IGNORE INTO tipo_operacion (id, codigo, descripcion, estado, created_at) VALUES
(3, 'COTIZACION', 'Cotizacion', 1, NOW());

INSERT IGNORE INTO modulos (id, codigo, nombre, categoria, estado, created_at) VALUES
(18, 'cotizaciones', 'Cotizaciones', 'CORE', 1, NOW());

SET @cotizaciones_table_exists := (
    SELECT COUNT(*)
    FROM information_schema.tables
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_cotizaciones'
);

SET @sql_cotizaciones := IF(
    @cotizaciones_table_exists = 0,
    'CREATE TABLE facturacion_cotizaciones (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        empresa_id BIGINT UNSIGNED NOT NULL,
        tercero_id BIGINT UNSIGNED NULL,
        tipo_operacion_id TINYINT UNSIGNED NOT NULL DEFAULT 3 COMMENT ''3=Cotizacion'',
        serie VARCHAR(20) NOT NULL DEFAULT ''COT'',
        numero INT UNSIGNED NOT NULL DEFAULT 1,
        fecha_emision DATE NOT NULL,
        fecha_vigencia DATE NULL,
        dias_vigencia INT UNSIGNED NOT NULL DEFAULT 15,
        moneda CHAR(3) NOT NULL DEFAULT ''PEN'',
        subtotal DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        igv DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        total DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        estado TINYINT UNSIGNED NOT NULL DEFAULT 2 COMMENT ''1=Borrador, 2=Emitida, 5=Anulada'',
        observacion TEXT NULL,
        created_by BIGINT UNSIGNED NULL,
        updated_by BIGINT UNSIGNED NULL,
        created_at DATETIME NOT NULL,
        updated_at DATETIME NULL,
        deleted_at DATETIME NULL,
        UNIQUE KEY uq_cotizacion_empresa_serie_numero (empresa_id, serie, numero),
        KEY idx_cotizacion_empresa_fecha (empresa_id, fecha_emision),
        KEY idx_cotizacion_tercero (tercero_id),
        KEY idx_cotizacion_tipo_operacion (tipo_operacion_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci',
    'SELECT 1'
);
PREPARE stmt_cotizaciones FROM @sql_cotizaciones;
EXECUTE stmt_cotizaciones;
DEALLOCATE PREPARE stmt_cotizaciones;

SET @cotizaciones_detalles_exists := (
    SELECT COUNT(*)
    FROM information_schema.tables
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_cotizacion_detalles'
);

SET @sql_cotizaciones_detalles := IF(
    @cotizaciones_detalles_exists = 0,
    'CREATE TABLE facturacion_cotizacion_detalles (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        cotizacion_id BIGINT UNSIGNED NOT NULL,
        catalogo_item_id BIGINT UNSIGNED NULL,
        unidad_medida_id BIGINT UNSIGNED NULL,
        item VARCHAR(30) NULL,
        descripcion VARCHAR(255) NOT NULL,
        cantidad DECIMAL(15,4) NOT NULL DEFAULT 0.0000,
        unidad_medida VARCHAR(20) NOT NULL,
        valor_unitario DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        precio_unitario DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        descuento DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        afecto_igv TINYINT(1) NOT NULL DEFAULT 1,
        afectacion_igv_id BIGINT UNSIGNED NULL,
        subtotal DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        igv DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        total DECIMAL(15,2) NOT NULL DEFAULT 0.00,
        created_at DATETIME NOT NULL,
        updated_at DATETIME NULL,
        deleted_at DATETIME NULL,
        KEY idx_cot_det_cotizacion (cotizacion_id),
        KEY idx_cot_det_item (catalogo_item_id),
        KEY idx_cot_det_unidad (unidad_medida_id),
        CONSTRAINT fk_cot_det_cotizacion FOREIGN KEY (cotizacion_id) REFERENCES facturacion_cotizaciones(id),
        CONSTRAINT fk_cot_det_item FOREIGN KEY (catalogo_item_id) REFERENCES catalogo_items(id),
        CONSTRAINT fk_cot_det_unidad FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id),
        CONSTRAINT fk_cot_det_afectacion FOREIGN KEY (afectacion_igv_id) REFERENCES catalogo_afectaciones_igv(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci',
    'SELECT 1'
);
PREPARE stmt_cotizaciones_detalles FROM @sql_cotizaciones_detalles;
EXECUTE stmt_cotizaciones_detalles;
DEALLOCATE PREPARE stmt_cotizaciones_detalles;

INSERT IGNORE INTO empresa_modulos (empresa_id, modulo_id, habilitado, created_at)
SELECT e.id, m.id, 1, NOW()
FROM empresas e
INNER JOIN modulos m
WHERE e.deleted_at IS NULL
  AND m.codigo IN ('cotizaciones');


-- ==================================================
-- 20260827_inventario.sql
-- ==================================================
-- Inventario para abisfact
-- Basado en el flujo de Contable: cabecera, detalle y saldos por producto.

CREATE TABLE IF NOT EXISTS inventario (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo_operacion_id TINYINT UNSIGNED NOT NULL COMMENT 'Referencia a tipo_operacion.id (1=Venta, 2=Compra)',
    origen_tipo VARCHAR(30) NOT NULL DEFAULT 'MANUAL' COMMENT 'MANUAL, COMPROBANTE, COTIZACION, DOCUMENTO_INTERNO',
    origen_id BIGINT UNSIGNED NULL COMMENT 'Id del documento origen',
    fecha_movimiento DATE NOT NULL,
    glosa VARCHAR(255) NULL,
    sentido TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Entrada, 2=Salida',
    ambito TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Fiscal, 2=Interno',
    estado TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Activo, 0=Anulado',
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_inventario_empresa_fecha (empresa_id, fecha_movimiento),
    KEY idx_inventario_origen (origen_tipo, origen_id),
    KEY idx_inventario_tipo_operacion (tipo_operacion_id),
    CONSTRAINT fk_inventario_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_inventario_tipo_operacion FOREIGN KEY (tipo_operacion_id) REFERENCES tipo_operacion(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventario_detalle (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    inventario_id BIGINT UNSIGNED NOT NULL,
    catalogo_item_id BIGINT UNSIGNED NULL,
    unidad_medida_id BIGINT UNSIGNED NULL,
    item INT UNSIGNED NOT NULL DEFAULT 1,
    descripcion VARCHAR(255) NOT NULL,
    cantidad DECIMAL(14,4) NOT NULL DEFAULT 0,
    unidad_medida VARCHAR(10) NOT NULL DEFAULT 'NIU',
    valor_unitario DECIMAL(14,4) NOT NULL DEFAULT 0,
    valor_total DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Activo, 0=Anulado',
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_inv_det_inventario (inventario_id),
    KEY idx_inv_det_catalogo (catalogo_item_id),
    CONSTRAINT fk_inv_det_inventario FOREIGN KEY (inventario_id) REFERENCES inventario(id),
    CONSTRAINT fk_inv_det_catalogo FOREIGN KEY (catalogo_item_id) REFERENCES catalogo_items(id),
    CONSTRAINT fk_inv_det_unidad FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventario_saldos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    catalogo_item_id BIGINT UNSIGNED NOT NULL,
    stock_cantidad DECIMAL(14,4) NOT NULL DEFAULT 0,
    stock_valorizado DECIMAL(14,2) NOT NULL DEFAULT 0,
    costo_promedio DECIMAL(14,4) NOT NULL DEFAULT 0,
    updated_at DATETIME NULL,
    created_at DATETIME NOT NULL,
    UNIQUE KEY uq_inv_saldo_empresa_catalogo (empresa_id, catalogo_item_id),
    KEY idx_inv_saldo_empresa (empresa_id),
    CONSTRAINT fk_inv_saldo_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id),
    CONSTRAINT fk_inv_saldo_catalogo FOREIGN KEY (catalogo_item_id) REFERENCES catalogo_items(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ==================================================
-- 20260827_series_en_modulo.sql
-- ==================================================
-- en_modulo pertenece a la serie.
-- 1=Facturacion, 2=Guias, 3=Cotizaciones.

SET @serie_en_modulo_exists := (
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_series'
      AND column_name = 'en_modulo'
);

SET @sql_serie_en_modulo := IF(
    @serie_en_modulo_exists = 0,
    'ALTER TABLE facturacion_series ADD COLUMN en_modulo TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''1=Facturacion, 2=Guias, 3=Cotizaciones'' AFTER es_electronico',
    'SELECT 1'
);
PREPARE stmt_serie_en_modulo FROM @sql_serie_en_modulo;
EXECUTE stmt_serie_en_modulo;
DEALLOCATE PREPARE stmt_serie_en_modulo;

UPDATE facturacion_series fs
INNER JOIN facturacion_tipo_comprobante tc ON tc.id = fs.tipo_comprobante_id
SET fs.en_modulo = CASE
    WHEN tc.codigo = '09' THEN 2
    WHEN tc.codigo = '00' THEN 3
    ELSE 1
END
WHERE fs.deleted_at IS NULL;


-- ==================================================
-- 20260827_series_es_electronico.sql
-- ==================================================
-- La condicion electronica pertenece a la serie, no al tipo de comprobante.
-- es_electronico: 0=No electronico, 1=Electronico.

SET @tipo_es_electronico_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_tipo_comprobante'
      AND column_name = 'es_electronico'
);
SET @sql_drop_tipo_es_electronico := IF(
    @tipo_es_electronico_exists > 0,
    'ALTER TABLE facturacion_tipo_comprobante DROP COLUMN es_electronico',
    'SELECT 1'
);
PREPARE stmt_drop_tipo_es_electronico FROM @sql_drop_tipo_es_electronico;
EXECUTE stmt_drop_tipo_es_electronico;
DEALLOCATE PREPARE stmt_drop_tipo_es_electronico;

SET @tipo_es_tributario_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_tipo_comprobante'
      AND column_name = 'es_tributario'
);
SET @sql_drop_tipo_es_tributario := IF(
    @tipo_es_tributario_exists > 0,
    'ALTER TABLE facturacion_tipo_comprobante DROP COLUMN es_tributario',
    'SELECT 1'
);
PREPARE stmt_drop_tipo_es_tributario FROM @sql_drop_tipo_es_tributario;
EXECUTE stmt_drop_tipo_es_tributario;
DEALLOCATE PREPARE stmt_drop_tipo_es_tributario;

SET @serie_modalidad_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_series'
      AND column_name = 'modalidad_emision'
);
SET @sql_drop_serie_modalidad := IF(
    @serie_modalidad_exists > 0,
    'ALTER TABLE facturacion_series DROP COLUMN modalidad_emision',
    'SELECT 1'
);
PREPARE stmt_drop_serie_modalidad FROM @sql_drop_serie_modalidad;
EXECUTE stmt_drop_serie_modalidad;
DEALLOCATE PREPARE stmt_drop_serie_modalidad;

SET @serie_es_electronico_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_series'
      AND column_name = 'es_electronico'
);
SET @sql_serie_es_electronico := IF(
    @serie_es_electronico_exists = 0,
    'ALTER TABLE facturacion_series ADD COLUMN es_electronico TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''0=No electronico, 1=Electronico'' AFTER serie',
    'SELECT 1'
);
PREPARE stmt_serie_es_electronico FROM @sql_serie_es_electronico;
EXECUTE stmt_serie_es_electronico;
DEALLOCATE PREPARE stmt_serie_es_electronico;

SET @comprobante_modalidad_exists := (
    SELECT COUNT(*) FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobantes'
      AND column_name = 'modalidad_emision'
);
SET @sql_drop_comprobante_modalidad := IF(
    @comprobante_modalidad_exists > 0,
    'ALTER TABLE facturacion_comprobantes DROP COLUMN modalidad_emision',
    'SELECT 1'
);
PREPARE stmt_drop_comprobante_modalidad FROM @sql_drop_comprobante_modalidad;
EXECUTE stmt_drop_comprobante_modalidad;
DEALLOCATE PREPARE stmt_drop_comprobante_modalidad;

INSERT INTO facturacion_tipo_comprobante
    (codigo, descripcion, afecta_igv, estado, created_at)
VALUES
    ('00', 'Documento interno', 0, 1, NOW())
ON DUPLICATE KEY UPDATE
    descripcion = VALUES(descripcion),
    estado = 1,
    deleted_at = NULL;

UPDATE facturacion_series fs
INNER JOIN facturacion_tipo_comprobante tc ON tc.id = fs.tipo_comprobante_id
SET fs.es_electronico = 0
WHERE tc.codigo = '00';


-- Datos minimos de arranque para poder ingresar al sistema
INSERT INTO usuarios (id, nombre, usuario, email, password_hash, es_super_admin, estado, created_at) VALUES
(1, 'Administrador Principal', 'admin', 'admin@abisfact.local', '$2y$10$MXidrwnEzL5YyZTaeLAvwOJ1UYGCVU1pnAuoRZktAv2zONNGLDohC', 1, 1, NOW());

INSERT INTO empresas (id, ruc, razon_social, nombre_comercial, logo, tipo_empresa_id, giro_negocio_id, estado, created_at) VALUES
(1, '00000000000', 'EMPRESA BASE', 'EMPRESA BASE', NULL, 1, 1, 1, NOW());

INSERT INTO roles (id, empresa_id, nombre, descripcion, estado, created_at) VALUES
(1, 1, 'Administrador', 'Acceso total para la empresa base', 1, NOW());

INSERT INTO empresa_usuarios (id, empresa_id, usuario_id, rol_id, estado, created_at) VALUES
(1, 1, 1, 1, 'ACTIVO', NOW());

INSERT INTO empresa_sucursales (id, empresa_id, codigo, nombre, direccion, telefono, logo, es_principal, estado, created_at) VALUES
(1, 1, 'SUC-01', 'Sucursal principal', NULL, NULL, NULL, 1, 1, NOW());

INSERT INTO sucursal_pos (id, sucursal_id, codigo, nombre, descripcion, impresion_formato, es_principal, estado, created_at) VALUES
(1, 1, 'POS-01', 'Caja principal', 'POS principal de la empresa', 'TICKET', 1, 1, NOW());

INSERT INTO usuario_sucursales (id, usuario_id, sucursal_id, estado, created_at) VALUES
(1, 1, 1, 1, NOW());

INSERT INTO usuario_pos (id, usuario_id, pos_id, estado, created_at) VALUES
(1, 1, 1, 1, NOW());

INSERT INTO empresa_modulos (empresa_id, modulo_id, habilitado, created_at)
SELECT 1, m.id, 1, NOW() FROM modulos m WHERE m.codigo IN ('usuarios','empresas','facturacion','auditoria','catalogos_sunat','terceros','productos','inventario','caja','compras','ventas','cotizaciones');

INSERT INTO facturacion_series (id, empresa_id, tipo_comprobante_id, serie, es_electronico, en_modulo, correlativo_actual, estado, created_at) VALUES
(1, 1, 1, 'F001', 1, 1, 0, 1, NOW()),
(2, 1, 2, 'B001', 1, 1, 0, 1, NOW()),
(3, 1, 3, 'FC01', 1, 1, 0, 1, NOW()),
(4, 1, 4, 'FD01', 1, 1, 0, 1, NOW()),
(5, 1, 5, 'T001', 1, 2, 0, 1, NOW());

