-- ═══════════════════════════════════════════════════════════════
-- 049 — Ampliar columna number en sale_invoices +
--       limpiar registros con número de factura corrupto
--
-- Causa raíz del bug:
--   SUBSTRING(number, 9) extraía el guión "-" antes del secuencial,
--   dando "-00001". MySQL CAST('-00001' AS UNSIGNED) devuelve
--   18446744073709551615 (desbordamiento a UNSIGNED BIGINT).
--   PHP (int)(ese valor) = PHP_INT_MAX, y PHP_INT_MAX + 1 se
--   convierte a float "9.2233720368548E+18" → número de factura
--   inválido que se guardó una vez que el campo se ensanchó.
-- ═══════════════════════════════════════════════════════════════

-- ── 1. Ensanchar columna (idempotente con MODIFY) ────────────
ALTER TABLE sale_invoices
    MODIFY COLUMN number VARCHAR(30) NOT NULL COMMENT 'FAC-YYYY-NNNNN | MED-YYYY-NNNNN';

-- ── 2. Renumerar facturas MED con número inválido ────────────
-- Crea una tabla temporal con el nuevo número correcto para cada
-- fila corrupta: MAX del secuencial válido del mismo año + 1.
CREATE TEMPORARY TABLE IF NOT EXISTS _med_number_fix AS
SELECT
    s.id,
    CONCAT(
        'MED-', YEAR(s.date), '-',
        LPAD(
            COALESCE((
                SELECT MAX(CAST(SUBSTRING(s2.number, 10) AS UNSIGNED))
                FROM sale_invoices s2
                WHERE s2.company_id = s.company_id
                  AND s2.source     = 'medical'
                  AND s2.number REGEXP '^MED-[0-9]{4}-[0-9]+$'
                  AND YEAR(s2.date) = YEAR(s.date)
                  AND s2.id        != s.id
            ), 0) + 1,
            5, '0'
        )
    ) AS new_number
FROM sale_invoices s
WHERE s.source  = 'medical'
  AND s.number NOT REGEXP '^MED-[0-9]{4}-[0-9]+$';

UPDATE sale_invoices si
JOIN _med_number_fix f ON si.id = f.id
SET si.number = f.new_number;

DROP TEMPORARY TABLE IF EXISTS _med_number_fix;
