TIF_NGANJUK_E41212020/pesanan/batalkan_pesanan.php

153 lines
5.3 KiB
PHP

<?php
// Enable error logging
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '../logs/php_errors.log');
// Start output buffering
ob_start();
// Function to log errors
function logError($message, $context = []) {
$logMessage = date('[Y-m-d H:i:s] ') . $message;
if (!empty($context)) {
$logMessage .= ' Context: ' . json_encode($context, JSON_UNESCAPED_UNICODE);
}
error_log($logMessage);
}
try {
session_start();
// Log session data
logError('Session data', [
'session' => $_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()]);
}
?>