if ($accion == 'registrar_pago') { try { $pdo->beginTransaction(); // Iniciamos transacción para asegurar la integridad $mov_id = $_POST['movimiento_id']; $monto = $_POST['monto']; $moneda = $_POST['moneda']; $tca = $_POST['tipo_cambio'] ?? 1; // 1. Insertar el abono $sqlPago = "INSERT INTO pagos (movimiento_id, monto_pagado, moneda_pago, tipo_cambio) VALUES (?, ?, ?, ?)"; $stmtPago = $pdo->prepare($sqlPago); $stmtPago->execute([$mov_id, $monto, $moneda, $tca]); // 2. Recalcular saldo total del movimiento // Sumamos todos los pagos (considerando el tipo de cambio si es necesario) $sqlSaldo = "SELECT m.monto_total, COALESCE(SUM(p.monto_pagado), 0) as total_abonado FROM movimientos m LEFT JOIN pagos p ON m.id = p.movimiento_id WHERE m.id = ?"; $stmtSaldo = $pdo->prepare($sqlSaldo); $stmtSaldo->execute([$mov_id]); $check = $stmtSaldo->fetch(); // 3. Determinar el nuevo estado $nuevoEstado = 'parcial'; if ($check['total_abonado'] >= $check['monto_total']) { $nuevoEstado = 'pagado'; } elseif ($check['total_abonado'] <= 0) { $nuevoEstado = 'pendiente'; } // 4. Actualizar el movimiento principal $sqlUpd = "UPDATE movimientos SET estado = ? WHERE id = ?"; $stmtUpd = $pdo->prepare($sqlUpd); $stmtUpd.execute([$nuevoEstado, $mov_id]); $pdo->commit(); // Guardamos todos los cambios echo json_encode(["status" => "success", "nuevo_estado" => $nuevoEstado]); } catch (Exception $e) { $pdo->rollBack(); // Si algo falla, deshacemos todo echo json_encode(["status" => "error", "message" => $e->getMessage()]); } }