-- Customer Invoices - InvoiceSeries -- Estado del repo a fecha 2026-07-07: -- - no hay framework de migraciones versionadas localizado; -- - el servidor registra modelos Sequelize y usa database.sync(...) según syncMode. -- Este SQL es un artefacto manual para integrar en el sistema real de despliegue DB -- cuando exista un pipeline formal de migraciones. CREATE TABLE IF NOT EXISTS customer_invoice_series ( id CHAR(36) NOT NULL, company_id CHAR(36) NOT NULL, code VARCHAR(10) NOT NULL, next_number INT UNSIGNED NOT NULL, padding_length SMALLINT UNSIGNED NOT NULL, is_default TINYINT(1) NOT NULL DEFAULT 0, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), CONSTRAINT uq_customer_invoice_series_company_code UNIQUE (company_id, code), KEY idx_customer_invoice_series_company_id (company_id), KEY idx_customer_invoice_series_company_active (company_id, is_active), CONSTRAINT chk_customer_invoice_series_next_number CHECK (next_number >= 1), CONSTRAINT chk_customer_invoice_series_padding_length CHECK (padding_length >= 1) ); -- Seed automático: -- No se incluye seed por empresa porque el repo no expone un sistema de seeders -- ni una estrategia fiable para recorrer companies existentes desde SQL puro -- sin acoplar el despliegue a un tenant concreto. -- Requisito operativo: cada company necesita al menos una InvoiceSeries activa -- antes de emitir facturas. -- Ejemplo manual por company: -- INSERT INTO customer_invoice_series ( -- id, -- company_id, -- code, -- next_number, -- padding_length, -- is_default, -- is_active, -- created_at, -- updated_at -- ) VALUES ( -- 'REEMPLAZAR-UUID', -- 'REEMPLAZAR-COMPANY-ID', -- 'A', -- 1, -- 6, -- 1, -- 1, -- NOW(), -- NOW() -- ); -- Auditoría previa recomendada para la constraint de facturas emitidas: -- confirma si existen duplicados por company + serie + número antes de forzar cambios -- en entornos donde la tabla customer_invoices ya tenga datos históricos. -- -- SELECT -- company_id, -- series, -- invoice_number, -- is_proforma, -- COUNT(*) AS duplicated_rows -- FROM customer_invoices -- WHERE deleted_at IS NULL -- GROUP BY company_id, series, invoice_number, is_proforma -- HAVING COUNT(*) > 1;