Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
dashboard
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php require_once '../includes/functions.php'; // Require login and passenger access requireLogin(); if ($_SESSION['user_type'] !== 'passenger') { redirect('/dashboard/'); } $user = getCurrentUser(); $db = Database::getInstance(); $errors = []; $success = ''; $booking = null; // Check if user is proceeding to payment for an existing pending booking if (isset($_GET['action']) && $_GET['action'] === 'proceed_payment' && isset($_GET['booking_id'])) { $bookingId = (int)$_GET['booking_id']; // Verify the booking belongs to the current user and is pending $existingBooking = $db->fetch( "SELECT b.*, tl.name as to_location_name FROM bookings b JOIN to_locations tl ON b.to_location_id = tl.id WHERE b.id = ? AND b.passenger_id = ? AND b.status = 'pending'", [$bookingId, $user['id']] ); if ($existingBooking) { $booking = $existingBooking; $success = 'Please complete the payment for your pending booking.'; } else { $errors[] = 'Invalid booking or booking is not pending.'; } } // Get available destinations $destinations = $db->fetchAll("SELECT * FROM to_locations WHERE status = 'active' ORDER BY name"); // Handle booking submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!validateCSRFToken($_POST['csrf_token'] ?? '')) { $errors[] = 'Invalid request. Please try again.'; } else { $toLocationId = (int)($_POST['to_location_id'] ?? 0); $paymentMethod = $_POST['payment_method'] ?? ''; // Validation if (empty($toLocationId)) { $errors[] = 'Please select a destination.'; } if (empty($paymentMethod) || !in_array($paymentMethod, ['phonepe', 'googlepay'])) { $errors[] = 'Please select a payment method.'; } if (empty($errors)) { try { // Get commission amount (fare will be calculated after operator assigns pickup location) // For now, we'll use a fixed commission amount or calculate based on destination $estimatedFare = 50.00; // Placeholder - will be updated by operator $commissionAmount = calculateCommission($estimatedFare); // Configurable commission $totalAmount = $commissionAmount; // Only commission for now, fare added later // Create booking record (from_location_id and fare will be set by operator when QR is scanned) $db->query( "INSERT INTO bookings (passenger_id, from_location_id, to_location_id, booking_type, payment_method, commission_amount, fare_amount, total_amount, status, payment_status) VALUES (?, NULL, ?, 'qr_code', ?, ?, 0.00, ?, 'pending', 'pending')", [$user['id'], $toLocationId, $paymentMethod, $commissionAmount, $totalAmount] ); $bookingId = $db->lastInsertId(); // Generate QR code data $qrData = json_encode([ 'booking_id' => $bookingId, 'passenger_email' => $user['email'], 'to_location_id' => $toLocationId, 'payment_method' => $paymentMethod, 'total_amount' => $totalAmount ]); // Update booking with QR data $db->query( "UPDATE bookings SET qr_code_data = ? WHERE id = ?", [$qrData, $bookingId] ); // Get the complete booking $booking = $db->fetch( "SELECT b.*, tl.name as to_location_name FROM bookings b JOIN to_locations tl ON b.to_location_id = tl.id WHERE b.id = ?", [$bookingId] ); $success = 'Booking created successfully! Please complete the payment to get your QR code.'; // Add information about commission and fare $success .= ' You are paying commission now. The actual fare will be calculated when you visit an operator counter.'; } catch (Exception $e) { $errors[] = 'Error creating booking: ' . $e->getMessage(); } } } } $pageTitle = 'Book a Ride'; require_once '../includes/header.php'; ?> <div class="container py-4"> <div class="row"> <div class="col-md-8 mx-auto"> <div class="card"> <div class="card-header"> <h3 class="card-title mb-0">Book a Ride</h3> </div> <div class="card-body"> <?php if (!empty($errors)): ?> <div class="alert alert-danger"> <ul class="mb-0"> <?php foreach ($errors as $error): ?> <li><?php echo htmlspecialchars($error); ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> <?php if ($success): ?> <div class="alert alert-success"> <?php echo htmlspecialchars($success); ?> </div> <?php endif; ?> <?php if (!$booking): ?> <div class="row"> <div class="col-md-4"> <!-- How it works card --> <div class="card h-100"> <div class="card-header bg-primary text-white"> <h6 class="card-title mb-0"> <i class="bi bi-info-circle"></i> How it works </h6> </div> <div class="card-body"> <ol class="mb-0 small"> <li>Select your destination and payment method</li> <li>Pay <strong>commission only</strong> to get your QR code</li> <li>Go to <strong>any operator counter</strong> at any pickup location</li> <li>Show your QR code to the operator</li> <li>Operator will calculate <strong>actual fare</strong> and assign auto rickshaw</li> <li>Pay the fare amount to the driver</li> </ol> <hr> <div class="alert alert-info mb-0 small"> <i class="bi bi-lightbulb"></i> <strong>Note:</strong> You don't need to select pickup location now. The operator will set it based on which counter you visit. </div> <hr> <div class="alert alert-warning mb-0 small"> <i class="bi bi-currency-exchange"></i> <strong>Payment:</strong> Pay commission now (₹5.00), fare later. Fare is calculated by operator based on actual pickup location. </div> </div> </div> </div> <div class="col-md-8"> <form method="POST" action=""> <input type="hidden" name="csrf_token" value="<?php echo generateCSRFToken(); ?>"> <div class="mb-3"> <label for="to_location_id" class="form-label">Select Destination</label> <select class="form-select" id="to_location_id" name="to_location_id" required> <option value="">Choose destination...</option> <?php foreach ($destinations as $destination): ?> <option value="<?php echo $destination['id']; ?>"> <?php echo htmlspecialchars($destination['name']); ?> - <?php echo htmlspecialchars($destination['city']); ?> </option> <?php endforeach; ?> </select> </div> <div class="mb-3"> <label class="form-label">Payment Method</label> <div class="form-check"> <input class="form-check-input" type="radio" name="payment_method" id="phonepe" value="phonepe" required> <label class="form-check-label" for="phonepe"> <i class="bi bi-phone"></i> PhonePe </label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="payment_method" id="googlepay" value="googlepay" required> <label class="form-check-label" for="googlepay"> <i class="bi bi-google"></i> Google Pay </label> </div> </div> <div class="d-grid"> <button type="submit" class="btn btn-primary btn-lg"> <i class="bi bi-credit-card"></i> Proceed to Payment </button> </div> </form> </div> </div> <?php else: ?> <!-- Payment Section --> <div class="text-center mb-4"> <h4>Complete Your Payment</h4> <p class="text-muted">Amount: ₹<?php echo number_format($booking['total_amount'], 2); ?></p> </div> <div class="row"> <div class="col-md-6"> <div class="card"> <div class="card-body text-center"> <h5 class="card-title"><?php echo ucfirst($booking['payment_method']); ?> Payment</h5> <p class="card-text">Scan the QR code or use UPI ID to complete payment</p> <div class="mb-3"> <div id="paymentQRCode" class="qr-code-generated"> <div class="text-center"> <div class="spinner-border text-primary" role="status"> <span class="visually-hidden">Loading...</span> </div> <br><small class="text-muted">Generating QR Code...</small> </div> </div> </div> <button class="btn btn-success" onclick="simulatePayment()"> <i class="bi bi-check-circle"></i> Complete Payment </button> <button class="btn btn-outline-secondary btn-sm mt-2" onclick="generatePaymentQRCode()"> <i class="bi bi-arrow-clockwise"></i> Regenerate QR </button> </div> </div> </div> <div class="col-md-6"> <div class="card"> <div class="card-body"> <h5 class="card-title">Booking Details</h5> <ul class="list-unstyled"> <li><strong>Destination:</strong> <?php echo htmlspecialchars($booking['to_location_name']); ?></li> <li><strong>Pickup Location:</strong> <span class="text-muted">Will be set by operator</span></li> <li><strong>Commission:</strong> ₹<?php echo number_format($booking['commission_amount'], 2); ?></li> <li><strong>Fare:</strong> <span class="text-muted">Will be calculated by operator</span></li> <li><strong>Total (Commission Only):</strong> ₹<?php echo number_format($booking['total_amount'], 2); ?></li> <li><strong>Status:</strong> <span class="badge bg-warning">Pending Payment</span></li> </ul> <div class="alert alert-info mt-3"> <h6><i class="bi bi-info-circle"></i> Next Steps:</h6> <ol class="mb-0 small"> <li>Complete the payment above</li> <li>Get your QR code</li> <li>Go to <strong>any operator counter</strong></li> <li>Show QR code to operator</li> <li>Operator will assign you an auto rickshaw</li> </ol> </div> </div> </div> </div> </div> <?php endif; ?> </div> </div> </div> </div> </div> <script> $(document).ready(function() { // Check if jQuery QR plugin is loaded if (typeof $.fn.qrcode === 'undefined') { $('#paymentQRCode').html('<div class="text-center text-danger"><i class="bi bi-exclamation-triangle"></i><br><small>QR Plugin Not Loaded</small><br><button class="btn btn-sm btn-outline-danger mt-2" onclick="location.reload()">Reload Page</button></div>'); return; } // Generate QR code when page loads generatePaymentQRCode(); // Regenerate QR code if needed setTimeout(function() { if ($('#paymentQRCode canvas').length === 0) { generatePaymentQRCode(); } }, 1000); }); function generatePaymentQRCode() { const bookingId = <?php echo $booking['id'] ?? 0; ?>; if (bookingId) { try { // Create QR code data const qrData = { booking_id: bookingId, passenger_email: '<?php echo addslashes($user['email'] ?? ''); ?>', destination: '<?php echo addslashes($booking['to_location_name'] ?? ''); ?>', amount: <?php echo $booking['total_amount'] ?? 0; ?>, payment_method: '<?php echo addslashes($booking['payment_method'] ?? ''); ?>', timestamp: Date.now(), service: 'Prepaid Auto Services' }; // Clear previous content $('#paymentQRCode').empty(); // Check if jQuery QR plugin is available if (typeof $.fn.qrcode === 'undefined') { $('#paymentQRCode').html('<div class="text-center text-danger"><i class="bi bi-exclamation-triangle"></i><br><small>QR Plugin Error</small></div>'); return; } // Generate QR code using jQuery plugin $('#paymentQRCode').qrcode({ text: JSON.stringify(qrData), width: 200, height: 200, colorDark: '#000000', colorLight: '#ffffff', correctLevel: 'H' }); } catch (error) { // Fallback to placeholder $('#paymentQRCode').html('<div class="text-center"><i class="bi bi-qr-code display-4 text-muted"></i><br><small class="text-muted">QR Code</small></div>'); } } else { // Show placeholder if no booking $('#paymentQRCode').html('<div class="text-center"><i class="bi bi-qr-code display-4 text-muted"></i><br><small class="text-muted">QR Code</small></div>'); } } function simulatePayment() { // Simulate payment processing const button = event.target; button.disabled = true; button.innerHTML = '<i class="bi bi-hourglass-split"></i> Processing...'; setTimeout(() => { // Redirect to payment success page const bookingId = <?php echo $booking['id'] ?? 0; ?>; if (bookingId) { window.location.href = 'payment_success.php?booking_id=' + bookingId; } else { // Fallback to dashboard if no booking ID window.location.href = 'index.php'; } }, 2000); } </script> <?php require_once '../includes/footer.php'; ?>