-- =============================================================================
-- Script: PagoMaestros huérfanos (existen en pago_maestros pero NO en pagos)
-- Uso: revisar y mitigar registros que quedaron por errores al guardar pagos.
-- =============================================================================

-- -----------------------------------------------------------------------------
-- 1. LISTAR PagoMaestros huérfanos (sin ningún registro en pagos)
--    Opcional: filtrar por caja_id para una caja concreta
-- -----------------------------------------------------------------------------

-- Todos los huérfanos (todas las cajas):
SELECT
    pm.id AS pago_maestro_id,
    pm.cliente_id,
    pm.caja_id,
    pm.monto_total,
    pm.metodo_pago_id,
    pm.banco_id,
    pm.num_operacion,
    pm.fecha,
    pm.estado,
    pm.comentario,
    pm.created_at
FROM pago_maestros pm
LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
WHERE p.id IS NULL
  AND pm.estado = 1
ORDER BY pm.caja_id, pm.fecha, pm.id;

-- Solo huérfanos de UNA caja (cambia 3 por tu caja_id):
SELECT
    pm.id AS pago_maestro_id,
    pm.cliente_id,
    pm.caja_id,
    pm.monto_total,
    pm.fecha,
    pm.comentario
FROM pago_maestros pm
LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
WHERE p.id IS NULL
  AND pm.estado = 1
  AND pm.caja_id = 3   /* <-- cambiar por la caja que quieras */
ORDER BY pm.fecha, pm.id;


-- -----------------------------------------------------------------------------
-- 2. CONTAR huérfanos por caja (resumen)
-- -----------------------------------------------------------------------------

SELECT
    pm.caja_id,
    COUNT(*) AS cantidad_huérfanos,
    SUM(pm.monto_total) AS monto_total_huérfanos
FROM pago_maestros pm
LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
WHERE p.id IS NULL
  AND pm.estado = 1
GROUP BY pm.caja_id
ORDER BY pm.caja_id;


-- -----------------------------------------------------------------------------
-- 3. MITIGAR: Anular (estado = 0) los PagoMaestros huérfanos
--    Ejecutar SOLO después de revisar el listado del punto 1.
--    Hacer backup o probar en desarrollo primero.
-- -----------------------------------------------------------------------------

-- 3a) Preview: qué IDs se anularían (no modifica nada)
-- SELECT pm.id
-- FROM pago_maestros pm
-- LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
-- WHERE p.id IS NULL AND pm.estado = 1;

-- 3b) Anular huérfanos (estado = 0) para que no cuenten en reportes:
-- UPDATE pago_maestros pm
-- LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
-- SET pm.estado = 0
-- WHERE p.id IS NULL AND pm.estado = 1;


-- -----------------------------------------------------------------------------
-- 4. MITIGAR: Eliminar definitivamente los PagoMaestros huérfanos
--    Las tablas (ingresos, pago_venta_logs, historial_saldo_cliente, ventas, pagos)
--    tienen FK a pago_maestros con ON DELETE SET NULL, así que el DELETE no falla.
--    Usar solo si estás seguro; hacer backup antes.
-- -----------------------------------------------------------------------------

-- 4a) Preview: IDs que se borrarían
-- SELECT pm.id FROM pago_maestros pm
-- LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
-- WHERE p.id IS NULL AND pm.estado = 1;

-- 4b) Eliminar (descomenta solo tras revisar y backup):
-- DELETE pm FROM pago_maestros pm
-- LEFT JOIN pagos p ON p.pago_maestro_id = pm.id
-- WHERE p.id IS NULL AND pm.estado = 1;


--1. Datos que necesitas del PagoMaestro 5594
-- En la BD ejecuta: (Esto es lo que necesitamos para crear el PagoMaestro 5594)
--------------------------------
SELECT id, cliente_id, caja_id, monto_total, metodo_pago_id, banco_id, num_operacion, fecha, comentario
FROM pago_maestros
WHERE id = 5594;


-- 2. Elegir la venta a la que “pegar” el pago
-- El 139 debe aplicarse a una venta del mismo cliente. Si no tienes claro cuál era, una opción es la venta pendiente más antigua de ese cliente (como hace la amortización). Por ejemplo, para cliente 43:
-- En la BD ejecuta:
--------------------------------
SELECT id, fecha_venta, monto_total, monto_recibido, monto_pendiente
FROM ventas
WHERE cliente_id = 43  AND estado = 1  AND monto_pendiente > 0
ORDER BY fecha_venta ASC, id ASC LIMIT 1;
--------------------------------
--  Decide el venta_id al que quieres aplicar los 139 (puede ser esa o otra que tú sepas).



-- 3. Insertar el pago con la misma caja_id
-- Sustituye los valores según el SELECT del PagoMaestro 5594 y el venta_id que elegiste. user_id pon uno válido (ej. el que registró ese día):
-- En la BD ejecuta:
--------------------------------
-- Reemplaza:
-- @venta_id     = id de la venta a la que aplicas los 139
-- @user_id      = 1 (o el usuario que corresponda)
-- banco_id, num_operacion, holder_id los tomas del PagoMaestro 5594

INSERT INTO pagos (
  pago_maestro_id, venta_id, user_id, cliente_id, caja_id,
  metodo_pago_id, monto, banco_id, num_operacion, fecha, holder_id,
  estado, es_historico, created_at, updated_at
)
SELECT
  5594,
  @venta_id,           -- <-- venta a la que aplicas el abono
  1,                   -- <-- user_id (ajustar si hace falta)
  pm.cliente_id,
  pm.caja_id,          -- misma caja (ej. 55)
  pm.metodo_pago_id,
  LEAST(pm.monto_total, 139.00),   -- 139 o el monto que quieras aplicar a esta venta
  pm.banco_id,
  pm.num_operacion,
  pm.fecha,
  (SELECT id FROM account_holders LIMIT 1),  -- ajustar si tienes holder_id en pago_maestros o lógica
  1,
  1,
  NOW(),
  NOW()
FROM pago_maestros pm
WHERE pm.id = 5594;


-- 4. Actualizar la venta (descontar el abono)
-- Si aplicaste todo el 139 a una sola venta:
-- En la BD ejecuta:
--------------------------------
UPDATE ventas SET monto_recibido = monto_recibido + 139,    monto_pendiente = GREATEST(0, monto_pendiente - 139),    updated_at = NOW()WHERE id = @venta_id;
--Si repartes el monto en varios pagos (varios venta_id), haz un UPDATE por cada venta con el monto que le corresponda.


