-- Separa "el dinero llegó" de "el boost se le aplicó al usuario".
--
-- Antes, acreditar era un solo paso en dos transacciones distintas: `status='credited'` se
-- confirmaba y DESPUÉS se tocaba la cuenta. Si lo segundo fallaba (un corte de red con la
-- base de datos, un lock timeout), el pago quedaba marcado como acreditado para siempre y el
-- usuario nunca recibía su boost: el reintento del proveedor lo veía ya acreditado y no hacía
-- nada. Pagaba y no recibía nada, sin recuperación posible.
--
-- Con `applied_at`, lo aplicado es un hecho aparte y REINTENTABLE: mientras esté a NULL, el
-- depósito se puede volver a aplicar sin riesgo de duplicarlo.

ALTER TABLE `deposit_orders`
    ADD COLUMN `applied_at` DATETIME(3) NULL DEFAULT NULL AFTER `credited_at`;

-- Los depósitos ya acreditados ANTES de esta migración ya se aplicaron a su cuenta: se marcan
-- como aplicados para que la recuperación no vuelva a sumarles el boost.
UPDATE `deposit_orders`
SET `applied_at` = COALESCE(`credited_at`, `created_at`)
WHERE `status` = 'credited' AND `applied_at` IS NULL;

-- Búsqueda de rezagados: los acreditados sin aplicar. Se consulta al cargar el dashboard.
CREATE INDEX `idx_deposit_orders_unapplied`
    ON `deposit_orders` (`user_id`, `status`, `applied_at`);
