false, 'message' => 'μ΄λ¦κ³Ό μ°λ½μ²λ₯Ό λͺ¨λ μ λ ₯ν΄μ£ΌμΈμ.']); exit; } // π‘ [μμ ] 리μμ€ μ 보λ₯Ό ν¨κ» μ‘°ννκΈ° μν΄ LEFT JOIN μΆκ° $sql = " SELECT r.*, res.name as resource_name FROM consultant_reservations r LEFT JOIN consultant_resources res ON r.resource_id = res.id WHERE r.customer_name = '" . sql_real_escape_string($customer_name) . "' AND r.customer_phone = '" . sql_real_escape_string($customer_phone) . "' AND r.is_deleted = 0 ORDER BY r.reservation_date DESC, r.reservation_time DESC "; $result = sql_query($sql); $reservations = []; $cancel_deadline_hours = (int)consultant_get_config('cancel_deadline_hours', 24); while ($row = sql_fetch_array($result)) { $reservation_timestamp = strtotime($row['reservation_date'] . ' ' . $row['reservation_time']); $cancellable_until = $reservation_timestamp - ($cancel_deadline_hours * 3600); $row['is_cancellable'] = (time() < $cancellable_until && in_array($row['status'], ['payment_pending', 'reserved'])); $reservations[] = $row; } echo json_encode(['success' => true, 'data' => $reservations]); exit; } // μμ½ μ·¨μ if ($action === 'cancel_reservation') { $reservation_id = (int)($_POST['reservation_id'] ?? 0); $customer_name = trim($_POST['customer_name'] ?? ''); $customer_phone = trim($_POST['customer_phone'] ?? ''); if (!$reservation_id || !$customer_name || !$customer_phone) { echo json_encode(['success' => false, 'message' => 'νμ μ λ³΄κ° λλ½λμμ΅λλ€.']); exit; } $sql = " SELECT * FROM consultant_reservations WHERE id = '{$reservation_id}' AND customer_name = '" . sql_real_escape_string($customer_name) . "' AND customer_phone = '" . sql_real_escape_string($customer_phone) . "' AND is_deleted = 0 "; $reservation = sql_fetch($sql); if (!$reservation) { echo json_encode(['success' => false, 'message' => 'μμ½ μ 보λ₯Ό μ°Ύμ μ μκ±°λ, μ λ ₯νμ μ 보μ μΌμΉνμ§ μμ΅λλ€.']); exit; } $cancel_deadline_hours = (int)consultant_get_config('cancel_deadline_hours', 24); $reservation_timestamp = strtotime($reservation['reservation_date'] . ' ' . $reservation['reservation_time']); $cancellable_until = $reservation_timestamp - ($cancel_deadline_hours * 3600); if (time() >= $cancellable_until) { echo json_encode(['success' => false, 'message' => 'μμ½ μ·¨μ κ°λ₯ μκ°μ΄ μ§λ¬μ΅λλ€. κ΄λ¦¬μμκ² λ¬Έμν΄μ£ΌμΈμ.']); exit; } if (!in_array($reservation['status'], ['payment_pending', 'reserved'])) { echo json_encode(['success' => false, 'message' => 'μ΄λ―Έ μ²λ¦¬λμκ±°λ μ·¨μλ μμ½μ λλ€.']); exit; } $sql_update = " UPDATE consultant_reservations SET status = 'cancelled', updated_at = NOW() WHERE id = '{$reservation_id}' "; if (sql_query($sql_update)) { consultant_log("κ³ κ° μμ½ μ·¨μ: ID {$reservation_id} (κ³ κ°: {$customer_name})"); echo json_encode(['success' => true, 'message' => 'μμ½μ΄ μ±κ³΅μ μΌλ‘ μ·¨μλμμ΅λλ€.']); } else { echo json_encode(['success' => false, 'message' => 'μμ½ μ·¨μ μ€ μ€λ₯κ° λ°μνμ΅λλ€. λ€μ μλν΄μ£ΌμΈμ.']); } exit; } } if (!defined('_GNUBOARD_')) exit; include_once(G5_ADMIN_PATH . '/consultant_manage/_common_con.php'); // π‘ [μμ ] μ»΄ν¬λνΈμ© κ³΅ν΅ νμΌ ν¬ν¨ // π‘ [μΆκ°] μλ΄ μ ν νκΈ μ΄λ¦μ JavaScriptμμ μ¬μ©νκΈ° μν΄ λ°°μ΄μ μ μν©λλ€. $consultant_types_map = json_decode(consultant_get_config('consultation_types', '{"onsite":"νμ₯ μλ΄"}'), true); if (!is_array($consultant_types_map)) { $consultant_types_map = ['onsite' => 'νμ₯ μλ΄']; // νμ± μ€ν¨ μ κΈ°λ³Έκ° } $ajax_url = G5_ADMIN_URL . '/consultant_manage/components/reservation_check.php'; ?>