-- 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;
