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'; ?>

μ˜ˆμ•½ 확인 및 μ·¨μ†Œ

μ˜ˆμ•½ μ‹œ μž…λ ₯ν•˜μ‹  이름과 μ—°λ½μ²˜λ‘œ μ˜ˆμ•½ 내역을 μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.