-- ============================================================
--  Migración 2026-09-04_01 · Pago por recepción (no por orden completa)
-- ------------------------------------------------------------
--  Hasta ahora el pago se agendaba UNA vez, cuando la orden quedaba
--  100% recibida, por el TOTAL de la orden. Eso deja a una orden con
--  entrega parcial permanente sin pago agendado y, si se fuerza, se
--  pagaría de más (por lo pedido, no por lo que realmente llegó).
--
--  Ahora cada recepción (total o parcial) agenda SU PROPIO pago, por
--  lo que efectivamente trae esa entrega. orden_compra ya no tiene
--  columnas de pago — el pago vive en orden_compra_recepcion.
-- ============================================================
USE tinsa_db;

-- ── orden_compra_recepcion: columnas de pago ───────────────
ALTER TABLE orden_compra_recepcion
  ADD COLUMN monto               DECIMAL(12,2) NOT NULL DEFAULT 0.00 AFTER observaciones,
  ADD COLUMN estado_pago         ENUM('no_aplica','pendiente','pagada') NOT NULL DEFAULT 'no_aplica' AFTER monto,
  ADD COLUMN fecha_pago_estimada DATE NULL AFTER estado_pago,
  ADD COLUMN fecha_pago          DATETIME NULL AFTER fecha_pago_estimada,
  ADD COLUMN referencia_pago     VARCHAR(80) NULL AFTER fecha_pago,
  ADD COLUMN id_usuario_pago     INT UNSIGNED NULL AFTER referencia_pago;

ALTER TABLE orden_compra_recepcion
  ADD CONSTRAINT fk_orden_compra_recepcion_usuario_pago
    FOREIGN KEY (id_usuario_pago) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE;

CREATE INDEX idx_orden_compra_recepcion_pago ON orden_compra_recepcion (estado_pago, fecha_pago_estimada);

-- ── Backfill: monto de cada recepción = lo recibido en ella, valorizado
--    con precio/descuento/impuesto de su línea (no el precio de toda la orden).
UPDATE orden_compra_recepcion r
JOIN (
  SELECT ri.id_recepcion,
         SUM(ri.cantidad * i.precio_unitario * (1 - i.descuento_pct / 100) * (1 + i.impuesto_pct / 100)) AS monto
  FROM orden_compra_recepcion_item ri
  JOIN orden_compra_item i ON i.id = ri.id_orden_item
  GROUP BY ri.id_recepcion
) t ON t.id_recepcion = r.id
SET r.monto = ROUND(t.monto, 2);

-- ── Backfill: antes solo había UN pago por orden (el de cuando quedó
--    'completa'). Se traslada a la recepción más reciente de cada orden,
--    que es la que en el modelo viejo disparaba ese pago.
UPDATE orden_compra_recepcion r
JOIN (
  SELECT id_orden, MAX(id) AS id_ultima FROM orden_compra_recepcion GROUP BY id_orden
) u ON u.id_ultima = r.id
JOIN orden_compra oc ON oc.id = r.id_orden
SET r.estado_pago         = oc.estado_pago,
    r.fecha_pago_estimada = oc.fecha_pago_estimada,
    r.fecha_pago          = oc.fecha_pago,
    r.referencia_pago     = oc.referencia_pago,
    r.id_usuario_pago     = oc.id_usuario_pago
WHERE oc.estado_pago <> 'no_aplica';

-- ── orden_compra: las columnas de pago quedan obsoletas ────
ALTER TABLE orden_compra
  DROP FOREIGN KEY fk_orden_compra_usuario_pago,
  DROP INDEX idx_orden_compra_pago,
  DROP COLUMN estado_pago,
  DROP COLUMN fecha_pago_estimada,
  DROP COLUMN fecha_pago,
  DROP COLUMN referencia_pago,
  DROP COLUMN id_usuario_pago;
