70 lines
2.3 KiB
MySQL
70 lines
2.3 KiB
MySQL
|
|
-- 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;
|