-- 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 TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0=BORRADOR, 1=EMITIDO, 2=ANULADO, 3=ENVIADO, 4=PENDIENTE, 5=ACEPTADO, 6=RECHAZADO, 7=VENCIDO',
    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());
