Checkout – online booking

Address:SWF New York 185669Contact No:1800333665

/

Checkout

Review your booking and complete the payment

No items to checkout

Your cart or booking is empty. Please add an item and come back.

Contact Information

Traveler Details

Travelers:

Payment

You will receive payment instructions after placing the order.
Continue Browsing

Order Confirmed!

Your booking has been received. A confirmation email has been sent to you.

const vehicle = vehicleBooking.vehicle; lsItems.push({ id: 'vehicle-' + (vehicle.id || Date.now()), type: 'vehicle', name: vehicle.name || 'Vehicle Rental', price: Number(vehicleBooking.totalCost) || Number(vehicle.price) || 0, image: vehicle.image || 'https://placehold.co/120x80', meta: `${vehicle.type || ''} · ${vehicleBooking.rentalDays || 0} Days`.trim() }); // Store vehicle booking data localStorage.setItem('vehicleBookingData', JSON.stringify({ vehicle_id: vehicle.id, pickup_date: vehicleBooking.searchForm?.pickupDate || '', dropoff_date: vehicleBooking.searchForm?.dropoffDate || '', message: '' })); } // Trekking booking from localStorage const trekkingBooking = JSON.parse(localStorage.getItem('trekkingBooking') || 'null'); if (trekkingBooking?.trek) { const trek = trekkingBooking.trek; const groupSize = trekkingBooking.searchForm?.groupSize || '1'; const size = parseInt(groupSize.split('-')[0] || groupSize); lsItems.push({ id: 'trekking-' + (trek.id || Date.now()), type: 'trekking', name: trek.name || 'Trekking Package', price: Number(trekkingBooking.totalCost) || Number(trek.price) || 0, image: trek.image || 'https://placehold.co/120x80', meta: `${trek.destination || ''} · ${trek.duration || ''} · ${size} People`.trim() }); // Store trekking booking data localStorage.setItem('trekkingBookingData', JSON.stringify({ trekking_id: trek.id, travel_date: trekkingBooking.searchForm?.travelDate || '', group_size: size.toString(), message: '' })); } // Helicopter booking from localStorage const helicopterBooking = JSON.parse(localStorage.getItem('helicopterBooking') || 'null'); if (helicopterBooking?.helicopter) { const helicopter = helicopterBooking.helicopter; lsItems.push({ id: 'helicopter-' + (helicopter.id || Date.now()), type: 'helicopter', name: helicopter.model || 'Helicopter Tour', price: Number(helicopter.totalCost) || Number(helicopter.pricePerHour) || 0, image: helicopter.image || 'https://placehold.co/120x80', meta: `${helicopter.category || ''} · ${helicopterBooking.bookingForm?.passengers || 1} Passengers` }); localStorage.setItem('helicopterBookingData', JSON.stringify({ helicopter_id: helicopter.id, flight_date: helicopterBooking.bookingForm?.flightDate || '', passengers: helicopterBooking.bookingForm?.passengers || '1', message: '' })); } // from events quick book const quickEventBook = JSON.parse(localStorage.getItem('quickEventBook') || 'null'); const eventBooking = JSON.parse(localStorage.getItem('eventBooking') || 'null'); if (eventBooking?.event) { lsItems.push({ id: 'event-' + (eventBooking.event.id || Date.now()), type: 'event', name: eventBooking.event.name, price: Number(eventBooking.totalCost) || Number(eventBooking.event.price) || 0, image: eventBooking.event.image, meta: `${eventBooking.event.location} · ${eventBooking.event.date || ''}`.trim() }); localStorage.setItem('eventBookingData', JSON.stringify({ event_id: eventBooking.event.id, event_date: eventBooking.event.date || '', tickets: '1', message: '' })); } else if (quickEventBook) { lsItems.push({ id: 'event-quick-' + Date.now(), type: 'event', name: (quickEventBook.eventType || 'Event').toString(), price: 99, image: 'https://placehold.co/120x80', meta: `${quickEventBook.date || ''}` }); } // generic cart (if your app.js populates it) const cart = JSON.parse(localStorage.getItem('cart') || '[]'); cart.forEach(c => lsItems.push({ id: c.id || Math.random().toString(36).slice(2), type: c.type || 'item', name: c.name || 'Item', price: Number(c.price) || 0, image: c.image || 'https://placehold.co/120x80', meta: c.meta || '' })); this.items = lsItems; this.hasItems = this.items.length > 0; }, calculateTotals() { const subtotal = this.items.reduce((s, it) => s + (Number(it.price) || 0), 0); const fees = Math.round(subtotal * 0.08 * 100) / 100; // 8% taxes/fees mock this.totals.subtotal = subtotal; this.totals.fees = fees; this.totals.total = Math.max(0, subtotal + fees - this.discount); }, applyCoupon() { if (!this.coupon) return; // Simple coupon logic if (this.coupon.toUpperCase() === 'SAVE10') { this.discount = Math.round(this.totals.subtotal * 0.1 * 100) / 100; } else if (this.coupon.toUpperCase() === 'FLAT25') { this.discount = 25; } else { this.discount = 0; alert('Invalid coupon code'); } this.calculateTotals(); }, get canPlaceOrder() { if (!this.hasItems || !this.form.terms) return false; if (!this.form.name || !this.form.email || !this.form.phone) return false; if (this.form.payment === 'card') { return this.form.card.number && this.form.card.name && this.form.card.expiry && this.form.card.cvc; } if (this.form.payment === 'upi') { return !!this.form.upi; } return true; }, formatCurrency(v) { try { return new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD' }).format(v || 0); } catch(e){ return '$' + (v||0).toFixed(2); } }, async placeOrder() { if (!this.canPlaceOrder) return; this.loading = true; // Find the booking item const bookingItem = this.items.find(item => item.id); if (bookingItem) { // Determine booking type const bookingType = this.determineBookingType(bookingItem); if (bookingType) { try { const formData = this.buildBookingFormData(bookingType, bookingItem); const response = await fetch('https://holidays.rstca.com.np/wp-admin/admin-ajax.php', { method: 'POST', body: formData }); const result = await response.json(); if (result.success) { // Clear all booking data this.clearBookingData(bookingType); const orderId = result.data.booking_id || 'ORD' + Date.now(); const order = { id: orderId, items: this.items, totals: this.totals, form: this.form, createdAt: new Date().toISOString(), status: 'confirmed', booking_id: result.data.booking_id }; // Persist const orders = JSON.parse(localStorage.getItem('orders') || '[]'); orders.unshift(order); localStorage.setItem('orders', JSON.stringify(orders)); localStorage.setItem('lastOrder', JSON.stringify(order)); // UI this.orderUrl = 'https://holidays.rstca.com.np/dashboard/'; this.success = true; this.loading = false; } else { alert(result.data.message || 'Failed to create booking. Please try again.'); this.loading = false; } } catch (error) { console.error('Booking error:', error); alert('An error occurred. Please try again.'); this.loading = false; } } else { // Fallback for unsupported booking types // Handle regular cart/event bookings setTimeout(() => { const orderId = 'ORD' + Date.now(); const order = { id: orderId, items: this.items, totals: this.totals, form: this.form, createdAt: new Date().toISOString(), status: 'confirmed' }; // Persist const orders = JSON.parse(localStorage.getItem('orders') || '[]'); orders.unshift(order); localStorage.setItem('orders', JSON.stringify(orders)); localStorage.setItem('lastOrder', JSON.stringify(order)); // clear ephemeral carts this.clearAllBookingData(); // UI this.orderUrl = 'https://holidays.rstca.com.np/dashboard/'; this.success = true; this.loading = false; }, 1200); } } else { // Handle regular cart/event bookings setTimeout(() => { const orderId = 'ORD' + Date.now(); const order = { id: orderId, items: this.items, totals: this.totals, form: this.form, createdAt: new Date().toISOString(), status: 'confirmed' }; // Persist const orders = JSON.parse(localStorage.getItem('orders') || '[]'); orders.unshift(order); localStorage.setItem('orders', JSON.stringify(orders)); localStorage.setItem('lastOrder', JSON.stringify(order)); // clear ephemeral carts localStorage.removeItem('eventBooking'); localStorage.removeItem('quickEventBook'); localStorage.removeItem('cart'); localStorage.removeItem('packageBookingData'); // UI this.orderUrl = 'https://holidays.rstca.com.np/dashboard/'; this.success = true; this.loading = false; }, 1200); } }, // Helper function to determine booking type determineBookingType(item) { if (!item || !item.id) return null; // Extract type from item ID prefix if (item.id.startsWith('package-')) return 'package'; if (item.id.startsWith('hotel-')) return 'hotel'; if (item.id.startsWith('trip-')) return 'trip'; if (item.id.startsWith('vehicle-')) return 'vehicle'; if (item.id.startsWith('visa-')) return 'visa'; if (item.id.startsWith('insurance-')) return 'insurance'; if (item.id.startsWith('trekking-')) return 'trekking'; if (item.id.startsWith('helicopter-')) return 'helicopter'; if (item.id.startsWith('forex-')) return 'forex'; if (item.id.startsWith('adventure-')) return 'adventure'; if (item.id.startsWith('event-')) return 'event'; // Fallback to item.type if available return item.type || null; }, // Build form data for booking submission buildBookingFormData(bookingType, bookingItem) { const formData = new FormData(); formData.append('action', 'booking_universal'); formData.append('booking_type', bookingType); formData.append('security', '27b63cbf79'); // Get booking-specific data const bookingData = this.getBookingData(bookingType, bookingItem); // Add common fields formData.append('name', this.form.name); formData.append('email', this.form.email); formData.append('phone', this.form.phone); formData.append('total_amount', this.totals.total); formData.append('payment_method', this.form.payment); // Add type-specific fields Object.keys(bookingData).forEach(key => { formData.append(key, bookingData[key]); }); return formData; }, // Get booking data based on type getBookingData(bookingType, bookingItem) { const data = {}; const itemId = bookingItem.id.replace(bookingType + '-', ''); switch(bookingType) { case 'package': const packageData = JSON.parse(localStorage.getItem('packageBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['start_date'] = packageData.start_date || ''; data['end_date'] = packageData.end_date || ''; data['adults'] = packageData.adults || '1'; data['children'] = packageData.children || '0'; data['message'] = packageData.message || ''; break; case 'hotel': const hotelData = JSON.parse(localStorage.getItem('hotelBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['checkin_date'] = hotelData.checkin_date || ''; data['checkout_date'] = hotelData.checkout_date || ''; data['guests'] = hotelData.guests || '1'; data['adults'] = hotelData.adults || '1'; data['children'] = hotelData.children || '0'; data['rooms'] = hotelData.rooms || '1'; data['message'] = hotelData.message || ''; break; case 'trip': const tripData = JSON.parse(localStorage.getItem('tripBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['travel_date'] = tripData.travel_date || ''; data['travelers'] = tripData.travelers || '1'; data['message'] = tripData.message || ''; break; case 'vehicle': const vehicleData = JSON.parse(localStorage.getItem('vehicleBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['pickup_date'] = vehicleData.pickup_date || ''; data['dropoff_date'] = vehicleData.dropoff_date || ''; data['message'] = vehicleData.message || ''; break; case 'visa': case 'insurance': case 'forex': data[bookingType + '_id'] = itemId; const basicData = JSON.parse(localStorage.getItem(bookingType + 'BookingData') || '{}'); data['message'] = basicData.message || ''; break; case 'trekking': const trekkingData = JSON.parse(localStorage.getItem('trekkingBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['travel_date'] = trekkingData.travel_date || ''; data['group_size'] = trekkingData.group_size || '1'; data['message'] = trekkingData.message || ''; break; case 'helicopter': const helicopterData = JSON.parse(localStorage.getItem('helicopterBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['flight_date'] = helicopterData.flight_date || ''; data['passengers'] = helicopterData.passengers || '1'; data['message'] = helicopterData.message || ''; break; case 'adventure': const adventureData = JSON.parse(localStorage.getItem('adventureBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['activity_date'] = adventureData.activity_date || ''; data['participants'] = adventureData.participants || '1'; data['message'] = adventureData.message || ''; break; case 'event': const eventData = JSON.parse(localStorage.getItem('eventBookingData') || '{}'); data[bookingType + '_id'] = itemId; data['event_date'] = eventData.event_date || ''; data['tickets'] = eventData.tickets || '1'; data['message'] = eventData.message || ''; break; } return data; }, // Clear booking data after successful submission clearBookingData(bookingType) { localStorage.removeItem(bookingType + 'BookingData'); }, // Clear all booking data clearAllBookingData() { localStorage.removeItem('eventBooking'); localStorage.removeItem('quickEventBook'); localStorage.removeItem('cart'); localStorage.removeItem('packageBookingData'); localStorage.removeItem('hotelBookingData'); localStorage.removeItem('tripBookingData'); localStorage.removeItem('vehicleBookingData'); localStorage.removeItem('visaBookingData'); localStorage.removeItem('insuranceBookingData'); localStorage.removeItem('trekkingBookingData'); localStorage.removeItem('helicopterBookingData'); localStorage.removeItem('forexBookingData'); localStorage.removeItem('adventureBookingData'); localStorage.removeItem('eventBookingData'); } } }