37048-vm/api/get_order_details.php
2025-12-07 20:08:31 +00:00

143 lines
5.2 KiB
PHP

<?php
session_start();
header('Content-Type: application/json');
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/apache2/flatlogic_error.log');
require_once '../db/config.php';
require_once '../includes/jdf.php';
// Function to send JSON error response
function send_error($message) {
echo json_encode(['error' => $message]);
exit();
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
send_error('Invalid request method.');
}
$input_data = json_decode(file_get_contents('php://input'), true);
if (!isset($input_data['tracking_id']) || empty($input_data['tracking_id'])) {
send_error('شناسه رهگیری مشخص نشده است.');
}
$tracking_id = $input_data['tracking_id'];
try {
$db = db();
// 1. Fetch the order by tracking_id
$stmt = $db->prepare(
"SELECT id, billing_name, billing_email, billing_address, billing_city, billing_province, billing_postal_code, total_amount, items_json, created_at, status
FROM orders
WHERE tracking_id = :tracking_id"
);
$stmt->bindParam(':tracking_id', $tracking_id, PDO::PARAM_STR);
$stmt->execute();
$order = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$order) {
send_error('سفارشی با این کد رهگیری یافت نشد.');
}
// 2. Decode items JSON and fetch product details
$items_from_db = json_decode($order['items_json'], true);
$products_response = [];
$product_ids = [];
if (is_array($items_from_db)) {
foreach ($items_from_db as $item) {
if (isset($item['product_id'])) {
$product_ids[] = $item['product_id'];
}
}
}
if (!empty($product_ids)) {
$placeholders = implode(',', array_fill(0, count($product_ids), '?'));
// Price is taken from items_json, not the products table, which is correct.
// The selected color is also in items_json.
$stmt_products = $db->prepare("SELECT id, name, image_url FROM products WHERE id IN ($placeholders)");
$stmt_products->execute($product_ids);
$products_data = $stmt_products->fetchAll(PDO::FETCH_ASSOC);
$products_by_id = [];
foreach ($products_data as $product) {
$products_by_id[$product['id']] = $product;
}
foreach ($items_from_db as $item) {
$product_id = $item['product_id'];
if (isset($products_by_id[$product_id])) {
$product = $products_by_id[$product_id];
$products_response[] = [
'id' => $product['id'],
'name' => $product['name'],
'price' => number_format($item['price']) . ' تومان',
'image_url' => $product['image_url'],
'quantity' => $item['quantity'],
'color' => $item['color'] ?? null // Add the selected color from the order
];
}
}
}
// 3. Format the response
$status_map = [
'pending' => 'در انتظار پرداخت',
'processing' => 'در حال پردازش',
'shipped' => 'ارسال شده',
'completed' => 'تکمیل شده',
'delivered' => 'تحویل شده', // Add mapping for Delivered
'cancelled' => 'لغو شده',
'refunded' => 'مسترد شده'
];
$status_persian = $status_map[strtolower($order['status'])] ?? $order['status'];
// Robust date formatting to prevent errors
try {
// Create DateTime object to reliably parse the date from DB
$date = new DateTime($order['created_at']);
$timestamp = $date->getTimestamp();
// Format the timestamp into Jalali date
$order_date_jalali = jdate('Y/m/d ساعت H:i', $timestamp);
} catch (Exception $e) {
// If parsing fails, log the error and return a safe value
error_log("Jalali date conversion failed for order ID {$order['id']}: " . $e->getMessage());
$order_date_jalali = 'تاریخ نامعتبر';
}
$order_response = [
'id' => $order['id'],
'order_date' => $order_date_jalali,
'total_amount' => number_format($order['total_amount']) . ' تومان',
'discount_amount' => '0 تومان',
'status' => $order['status'], // Pass original status to JS for logic
'status_persian' => $status_persian, // Pass Persian status for display
'shipping_name' => $order['billing_name'],
'shipping_address' => trim(implode(', ', array_filter([$order['billing_province'], $order['billing_city'], $order['billing_address']]))),
'shipping_postal_code' => $order['billing_postal_code']
];
// Final JSON structure
$response = [
'success' => true,
'order' => $order_response,
'products' => $products_response
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
} catch (PDOException $e) {
error_log("API Error in get_order_details.php: " . $e->getMessage());
send_error('خطای سرور: مشکل در ارتباط با پایگاه داده.');
} catch (Exception $e) {
error_log("API Error in get_order_details.php: " . $e->getMessage());
send_error('خطای سرور: یک مشکل پیش بینی نشده رخ داد.');
}
?>