34968-vm/checkout.php
Flatlogic Bot 8795a633f6 V22
2025-10-16 20:00:52 +00:00

280 lines
12 KiB
PHP

<?php
session_start();
require_once 'db/config.php';
require_once 'includes/api_keys.php';
// Fetch emergency shutdown status
$stmt_shutdown = db()->prepare("SELECT value FROM settings WHERE name = ?");
$stmt_shutdown->execute(['emergency_shutdown']);
$shutdown_active = ($stmt_shutdown->fetchColumn() === 'true');
$is_guest = !isset($_SESSION['user_id']);
$user_id = $_SESSION['user_id'] ?? null;
$session_id = session_id();
$pdo = db();
$user = [];
if (!$is_guest) {
$userStmt = $pdo->prepare("SELECT name, email, address, phone FROM users WHERE id = ?");
$userStmt->execute([$user_id]);
$user = $userStmt->fetch(PDO::FETCH_ASSOC);
}
// Fetch cart items
if (!$is_guest) {
$stmt = $pdo->prepare("SELECT c.id, mi.name, mi.price, c.quantity, r.name as restaurant_name, r.id as restaurant_id FROM cart c JOIN menu_items mi ON c.menu_item_id = mi.id JOIN restaurants r ON mi.restaurant_id = r.id WHERE c.user_id = :user_id");
$stmt->bindParam(':user_id', $user_id);
} else {
$stmt = $pdo->prepare("SELECT c.id, mi.name, mi.price, c.quantity, r.name as restaurant_name, r.id as restaurant_id FROM cart c JOIN menu_items mi ON c.menu_item_id = mi.id JOIN restaurants r ON mi.restaurant_id = r.id WHERE c.session_id = :session_id");
$stmt->bindParam(':session_id', $session_id);
}
$stmt->execute();
$cartItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($cartItems)) {
header("Location: cart.php");
exit();
}
$subtotal = 0;
foreach ($cartItems as $item) {
$subtotal += $item['price'] * $item['quantity'];
}
$settingsStmt = $pdo->query("SELECT name, value FROM settings WHERE name IN ('delivery_fee', 'service_fee_percentage')");
$settings = $settingsStmt->fetchAll(PDO::FETCH_KEY_PAIR);
$delivery_fee = $settings['delivery_fee'] ?? 0;
$service_fee_percentage = $settings['service_fee_percentage'] ?? 0;
$service_fee = ($subtotal * $service_fee_percentage) / 100;
$discount_amount = $_SESSION['discount_amount'] ?? 0;
$totalPrice = $subtotal + $delivery_fee + $service_fee - $discount_amount;
$_SESSION['total_price'] = $totalPrice;
include 'header.php';
?>
<script src="https://js.stripe.com/v3/"></script>
<script src="https://www.paypal.com/sdk/js?client-id=<?php echo $paypalClientId; ?>&currency=USD"></script>
<div class="checkout-container">
<?php if ($shutdown_active): ?>
<div class="alert alert-danger text-center" role="alert">
<h4 class="alert-heading">Ordering Temporarily Disabled</h4>
<p>Due to severe weather conditions, we have temporarily suspended all delivery services. The safety of our drivers and customers is our top priority.</p>
<hr>
<p class="mb-0">We apologize for any inconvenience and will resume operations as soon as it is safe to do so.</p>
</div>
<?php else: ?>
<div class="checkout-main">
<div class="checkout-header">
<a href="index.php" class="checkout-logo">
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" fill="currentColor"/><path d="M12 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z" fill="currentColor"/><path d="M12 14c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" fill="currentColor"/></svg>
<span>Food Delivery</span>
</a>
</div>
<div id="delivery-step">
<h3 class="step-title">1. Delivery Details</h3>
<form id="delivery-form">
<div class="form-group">
<label for="name">Full Name</label>
<input type="text" id="name" name="name" class="form-control" value="<?php echo htmlspecialchars($user['name'] ?? ''); ?>" required>
</div>
<?php if ($is_guest): ?>
<div class="form-group">
<label for="email">Email Address</label>
<input type="email" id="email" name="email" class="form-control" required>
</div>
<?php endif; ?>
<div class="form-group">
<label for="address">Delivery Address</label>
<input type="text" id="address" name="address" class="form-control" value="<?php echo htmlspecialchars($user['address'] ?? ''); ?>" required>
</div>
<div class="form-group">
<label for="phone">Phone Number</label>
<input type="tel" id="phone" name="phone" class="form-control" value="<?php echo htmlspecialchars($user['phone'] ?? ''); ?>" required>
</div>
<button type="button" id="to-payment-btn" class="btn-primary">Continue to Payment</button>
</form>
</div>
<div id="payment-step" style="display: none;">
<h3 class="step-title">2. Payment Method</h3>
<div class="payment-methods">
<div class="payment-method-card" data-method="stripe">
<input type="radio" id="stripe-radio" name="payment_method" value="stripe" checked>
<label for="stripe-radio">
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><path d="M42,12H6A2,2,0,0,0,4,14V34a2,2,0,0,0,2,2H42a2,2,0,0,0,2-2V14A2,2,0,0,0,42,12ZM6,16H42v4H6Zm0,16V24H42v8Z" fill="#000"/><rect x="10" y="28" width="8" height="4" fill="#000"/></svg>
<span>Credit or Debit Card</span>
</label>
</div>
<div class="payment-method-card" data-method="paypal">
<input type="radio" id="paypal-radio" name="payment_method" value="paypal">
<label for="paypal-radio">
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><path d="M24,4A20,20,0,1,0,44,24,20,20,0,0,0,24,4Zm11.2,9.45a.7.7,0,0,1,.6,1l-4.6,17.5a.7.7,0,0,1-1.3.1L24,24.25l-5.9,7.8a.7.7,0,0,1-1.1-.9l4.6-17.5a.7.7,0,0,1,1.3-.1L24,19.75l5.9-7.8A.7.7,0,0,1,35.2,13.45Z" fill="#000"/></svg>
<span>PayPal</span>
</label>
</div>
</div>
<form id="payment-form" action="create_stripe_session.php" method="POST">
<input type="hidden" name="name" id="hidden_name">
<input type="hidden" name="email" id="hidden_email">
<input type="hidden" name="address" id="hidden_address">
<input type="hidden" name="phone" id="hidden_phone">
<button id="stripe-button" class="btn-primary">Pay with Stripe</button>
</form>
<div id="paypal-button-container" style="display: none;"></div>
<button type="button" id="back-to-delivery-btn" class="btn-secondary">Back to Delivery</button>
</div>
</div>
<?php endif; ?>
<div class="checkout-summary">
<h4>Order Summary</h4>
<div class="summary-items">
<?php foreach ($cartItems as $item): ?>
<div class="summary-item">
<span class="item-name"><?php echo htmlspecialchars($item['name']); ?> (x<?php echo $item['quantity']; ?>)</span>
<span class="item-price">$<?php echo number_format($item['price'] * $item['quantity'], 2); ?></span>
</div>
<?php endforeach; ?>
</div>
<div class="summary-total">
<div class="summary-line">
<span>Subtotal</span>
<span>$<?php echo number_format($subtotal, 2); ?></span>
</div>
<div class="summary-line">
<span>Delivery Fee</span>
<span>$<?php echo number_format($delivery_fee, 2); ?></span>
</div>
<div class="summary-line">
<span>Service Fee</span>
<span>$<?php echo number_format($service_fee, 2); ?></span>
</div>
<?php if ($discount_amount > 0): ?>
<div class="summary-line discount">
<span>Discount</span>
<span>-$<?php echo number_format($discount_amount, 2); ?></span>
</div>
<?php endif; ?>
<div class="summary-line total">
<span>Total</span>
<span>$<?php echo number_format($totalPrice, 2); ?></span>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const deliveryStep = document.getElementById('delivery-step');
const paymentStep = document.getElementById('payment-step');
const toPaymentBtn = document.getElementById('to-payment-btn');
const backToDeliveryBtn = document.getElementById('back-to-delivery-btn');
const deliveryForm = document.getElementById('delivery-form');
const stripeRadio = document.getElementById('stripe-radio');
const paypalRadio = document.getElementById('paypal-radio');
const stripeButton = document.getElementById('stripe-button');
const paypalButtonContainer = document.getElementById('paypal-button-container');
const nameInput = document.getElementById('name');
const emailInput = document.getElementById('email');
const addressInput = document.getElementById('address');
const phoneInput = document.getElementById('phone');
const hiddenName = document.getElementById('hidden_name');
const hiddenEmail = document.getElementById('hidden_email');
const hiddenAddress = document.getElementById('hidden_address');
const hiddenPhone = document.getElementById('hidden_phone');
toPaymentBtn.addEventListener('click', () => {
if (deliveryForm.checkValidity()) {
// Copy values to hidden fields for Stripe form
hiddenName.value = nameInput.value;
if (emailInput) {
hiddenEmail.value = emailInput.value;
}
hiddenAddress.value = addressInput.value;
hiddenPhone.value = phoneInput.value;
deliveryStep.style.display = 'none';
paymentStep.style.display = 'block';
} else {
deliveryForm.reportValidity();
}
});
backToDeliveryBtn.addEventListener('click', () => {
paymentStep.style.display = 'none';
deliveryStep.style.display = 'block';
});
function togglePaymentButtons() {
if (stripeRadio.checked) {
stripeButton.style.display = 'block';
paypalButtonContainer.style.display = 'none';
} else {
stripeButton.style.display = 'none';
paypalButtonContainer.style.display = 'block';
}
}
stripeRadio.addEventListener('change', togglePaymentButtons);
paypalRadio.addEventListener('change', togglePaymentButtons);
document.querySelectorAll('.payment-method-card').forEach(card => {
card.addEventListener('click', () => {
card.querySelector('input[type="radio"]').checked = true;
togglePaymentButtons();
});
});
togglePaymentButtons();
paypal.Buttons({
createOrder: function(data, actions) {
return actions.order.create({
purchase_units: [{
amount: {
value: '<?php echo number_format($totalPrice, 2, '.', ''); ?>'
}
}]
});
},
onApprove: function(data, actions) {
const formData = new FormData();
formData.append('orderID', data.orderID);
formData.append('name', nameInput.value);
if (emailInput) {
formData.append('email', emailInput.value);
}
formData.append('address', addressInput.value);
formData.append('phone', phoneInput.value);
fetch('paypal-capture.php', {
method: 'POST',
body: formData
}).then(res => res.json())
.then(details => {
if (details.error) {
alert(details.error);
window.location.href = 'payment-cancel.php';
} else {
window.location.href = 'order_confirmation.php?order_id=' + details.order_id;
}
});
},
onError: function(err) {
console.error('PayPal Error:', err);
alert('An error occurred with your PayPal payment.');
}
}).render('#paypal-button-container');
});
</script>
<?php include 'footer.php'; ?>