Uecko_ERP/docs/dev/customer-invoice-series.sql

73 lines
2.5 KiB
SQL

-- Customer Invoices - InvoiceSeries
-- Estado: HISTORICO / TRANSICIONAL.
-- No ejecutar en entornos nuevos.
-- Sustituido por: /document-series como API canónica y document_series como tabla canónica.
-- 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;