$_SESSION, 'status_login' => isset($_SESSION['status_login']) ? $_SESSION['status_login'] : 'not set', 'id_pembeli' => isset($_SESSION['id_pembeli']) ? $_SESSION['id_pembeli'] : 'not set' ]); include '../config.php'; // Set proper JSON header header('Content-Type: application/json'); // Function to send JSON response and exit function sendJsonResponse($status, $message, $debug = null) { ob_clean(); // Clear any output buffer $response = ['status' => $status, 'message' => $message]; if ($debug !== null) { $response['debug'] = $debug; } echo json_encode($response, JSON_UNESCAPED_UNICODE); exit; } // Log the incoming request logError('Processing cancel order request', [ 'POST' => $_POST, 'SESSION' => $_SESSION ]); // Pastikan user sudah login if (!isset($_SESSION['status_login']) || !$_SESSION['status_login']) { echo json_encode(['status' => 'error', 'message' => 'Anda harus login terlebih dahulu']); exit; } // Pastikan ada ID pesanan if (!isset($_POST['id_order'])) { echo json_encode(['status' => 'error', 'message' => 'ID Pesanan tidak valid']); exit; } $id_order = intval($_POST['id_order']); $id_pembeli = $_SESSION['id_pembeli']; // Log the query parameters logError('Query parameters', [ 'id_order' => $id_order, 'id_pembeli' => $id_pembeli ]); // Ambil data pesanan $query = mysqli_query($conn, "SELECT * FROM orders WHERE id_order = '$id_order' AND id_pembeli = '$id_pembeli'"); $order = mysqli_fetch_assoc($query); if (!$order) { echo json_encode(['status' => 'error', 'message' => 'Pesanan tidak ditemukan']); exit; } // Log order data logError('Data pesanan yang ditemukan', [ 'order' => $order, 'status_order' => $order['status_order'], 'metode_pembayaran' => $order['metode_pembayaran'] ]); // Cek status pesanan dan metode pembayaran $can_cancel = false; $message = ''; if (($order['status_order'] == 'Belum Dibayar' && in_array($order['metode_pembayaran'], ['COD', 'QRIS'])) || ($order['status_order'] == 'Pembayaran Sukses' && $order['metode_pembayaran'] == 'SALDO')) { $can_cancel = true; $message = 'Pesanan berhasil dibatalkan'; } if (!$can_cancel) { echo json_encode(['status' => 'error', 'message' => 'Pesanan tidak dapat dibatalkan. Status: ' . $order['status_order'] . ', Metode: ' . $order['metode_pembayaran']]); exit; } // Mulai transaksi mysqli_begin_transaction($conn); try { // Update status pesanan mysqli_query($conn, "UPDATE orders SET status_order = 'Dibatalkan' WHERE id_order = '$id_order'"); // Ambil detail pesanan untuk mengembalikan stok $query_details = mysqli_query($conn, "SELECT id_produk, jumlah FROM order_details WHERE id_order = '$id_order'"); while ($detail = mysqli_fetch_assoc($query_details)) { // Kembalikan stok produk mysqli_query($conn, "UPDATE produk SET stok = stok + {$detail['jumlah']} WHERE id_produk = {$detail['id_produk']}"); } // Jika pembayaran menggunakan saldo, kembalikan saldo if ($order['metode_pembayaran'] == 'SALDO') { $total_pembayaran = $order['total_harga'] + $order['ongkos_kirim']; mysqli_query($conn, "UPDATE pembeli SET saldo = saldo + $total_pembayaran WHERE id_pembeli = '$id_pembeli'"); // Update session saldo if (isset($_SESSION['user_global_pembeli']) && is_object($_SESSION['user_global_pembeli'])) { $_SESSION['user_global_pembeli']->saldo += $total_pembayaran; } $message .= ' dan saldo telah dikembalikan'; } mysqli_commit($conn); echo json_encode(['status' => 'success', 'message' => $message]); } catch (Exception $e) { mysqli_rollback($conn); echo json_encode(['status' => 'error', 'message' => 'Terjadi kesalahan saat membatalkan pesanan']); } } catch (Exception $e) { logError('Unexpected error', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), 'file' => $e->getFile(), 'line' => $e->getLine() ]); echo json_encode(['status' => 'error', 'message' => 'Terjadi kesalahan yang tidak terduga', 'details' => $e->getMessage()]); } catch (Error $e) { logError('PHP Error', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), 'file' => $e->getFile(), 'line' => $e->getLine() ]); echo json_encode(['status' => 'error', 'message' => 'Terjadi kesalahan sistem', 'details' => $e->getMessage()]); } ?>