Booking to Checkout Payment Flow Implementation

📄 General
← Back to Documentation
# Booking to Checkout Payment Flow Implementation ## Overview Successfully implemented a complete payment flow where bookings created via the web form redirect to checkout for deposit/full payment, then to confirmation after successful payment. ## Implementation Summary ### 1. **Booking Creation Flow** **File**: `app/Http/Controllers/BookingController.php` #### Changes Made: - After successful booking creation, the system now redirects to checkout instead of directly to confirmation - Calculates deposit amount based on financial settings - Updates booking with deposit amount before redirecting #### Deposit Calculation Logic: ```php $depositSettings = config('financial-settings.deposits'); if ($depositSettings['enable_deposit_payments']) { if ($depositSettings['deposit_type'] === 'percentage') { $depositAmount = $totalPrice * ($depositSettings['deposit_percentage'] / 100); } else { $depositAmount = $depositSettings['deposit_fixed_amount']; } } else { // If deposits are disabled, require full payment $depositAmount = $totalPrice; } ``` #### Redirect: ```php return redirect()->route('checkout', ['reservationId' => $booking->id]) ->with('success', 'Booking created successfully! Please complete payment to confirm your booking.'); ``` ### 2. **Checkout Page Enhancement** **File**: `app/Http/Controllers/CheckoutController.php` #### showCheckout Method Updates: - Calculates amount due based on deposit settings - If booking doesn't have deposit_amount set, calculates it now - Passes `$amountDue` variable to the view - Updates booking with deposit amount if not already set #### Key Features: - **Deposit Payment**: Shows deposit amount if enabled in settings - **Full Payment**: Shows full amount if deposits are disabled - **Fallback**: If deposit_amount is not set on booking, calculates it dynamically ### 3. **Checkout View Updates** **File**: `resources/views/checkout.blade.php` #### Enhanced Payment Summary: - **Booking Total**: Shows the full booking amount - **Deposit Required**: Shows deposit amount with percentage/fixed indicator - **Remaining Balance**: Shows what's left to pay after deposit - **Amount Due Now**: Prominently displays the amount to be paid - **Info Banner**: Explains deposit payment terms #### Visual Improvements: - Clear distinction between total and amount due - Color-coded amounts (primary color for deposit, dark for total) - Information banner explaining deposit terms - Responsive styling matching existing design ### 4. **Payment Success Redirect** **File**: `app/Http/Controllers/CheckoutController.php` #### Updated All Payment Success Handlers: - `processMyPOS()` → redirects to `booking.confirmation` - `tremolSuccess()` → redirects to `booking.confirmation` - `myposSuccess()` → redirects to `booking.confirmation` - `handleSuccessfulPayment()` → redirects to `booking.confirmation` #### Before: ```php return redirect()->route('checkout.confirmation', $reservation->id); ``` #### After: ```php return redirect()->route('booking.confirmation', ['booking' => $reservation->id]); ``` ## Financial Settings Configuration ### Location: `config/financial-settings.php` ### Deposit Settings: ```php 'deposits' => [ 'enable_deposit_payments' => false, // Enable/disable deposits 'require_deposit_for_booking' => false, 'deposit_type' => 'percentage', // 'percentage' or 'fixed' 'deposit_percentage' => 30, // 30% of total 'deposit_fixed_amount' => 100.00, // Fixed amount 'deposit_currency_id' => null, 'deposit_due_timing' => 'immediately', 'deposit_due_days' => 7, ], ``` ### To Enable Deposits: 1. Set `enable_deposit_payments` to `true` 2. Choose `deposit_type`: `'percentage'` or `'fixed'` 3. Set `deposit_percentage` (e.g., 30 for 30%) or `deposit_fixed_amount` ## Complete User Flow ### Step 1: Create Booking 1. User fills out booking form on venue page 2. Selects dates, venue objects, services 3. Clicks "Proceed to Booking" 4. Form validates and submits ### Step 2: Booking Created 1. BookingController creates booking record 2. Calculates deposit amount from settings 3. Updates booking with deposit_amount 4. Redirects to checkout page ### Step 3: Checkout Payment 1. User sees payment summary with: - Full booking total - Deposit amount (if enabled) - Remaining balance (if deposit) - Amount due now 2. User selects payment method 3. User completes payment ### Step 4: Payment Processing 1. Payment gateway processes payment 2. CheckoutController handles success/failure 3. Updates booking status to 'confirmed' 4. Updates payment_status to 'paid' ### Step 5: Confirmation 1. User redirected to booking confirmation page 2. Shows booking details and confirmation number 3. Sends confirmation email 4. Booking is confirmed and active ## Database Schema ### Bookings Table Fields Used: - `total_amount` - Full booking price - `deposit_amount` - Deposit required (calculated) - `paid_amount` - Amount actually paid - `payment_status` - 'pending', 'paid', 'partially_paid' - `status` - 'pending', 'confirmed', 'cancelled' ## Testing Scenarios ### Scenario 1: Deposits Enabled (30%) - Booking total: €100 - Deposit required: €30 - Amount due now: €30 - Remaining balance: €70 - After payment: Status = 'confirmed', payment_status = 'partially_paid' ### Scenario 2: Deposits Disabled - Booking total: €100 - Deposit required: €100 (full amount) - Amount due now: €100 - Remaining balance: €0 - After payment: Status = 'confirmed', payment_status = 'paid' ### Scenario 3: Fixed Deposit (€50) - Booking total: €100 - Deposit required: €50 - Amount due now: €50 - Remaining balance: €50 - After payment: Status = 'confirmed', payment_status = 'partially_paid' ## Payment Methods Supported 1. **MyPOS** - Online card payments 2. **Tremol** - In-person fiscal device payments 3. **Cash** - Manual cash payments 4. **Bank Transfer** - Bank transfer payments All payment methods redirect to `booking.confirmation` after success. ## Error Handling ### Booking Creation Fails: - User stays on venue page - Error message displayed - Form data preserved ### Payment Fails: - User stays on checkout page - Error message displayed - Can retry payment ### Payment Cancelled: - User redirected to checkout - Warning message displayed - Booking remains in 'pending' status ## Files Modified 1. `app/Http/Controllers/BookingController.php` - Added deposit calculation - Changed redirect to checkout 2. `app/Http/Controllers/CheckoutController.php` - Added amountDue calculation in showCheckout - Updated all success redirects to booking.confirmation 3. `resources/views/checkout.blade.php` - Enhanced payment summary - Added deposit information display - Added info banner for deposit terms 4. `config/financial-settings.php` - Already contains deposit configuration ## Configuration Options ### Enable Deposits: ```php // In config/financial-settings.php or database settings 'enable_deposit_payments' => true, 'deposit_type' => 'percentage', 'deposit_percentage' => 30, ``` ### Disable Deposits (Require Full Payment): ```php 'enable_deposit_payments' => false, ``` ### Use Fixed Deposit: ```php 'enable_deposit_payments' => true, 'deposit_type' => 'fixed', 'deposit_fixed_amount' => 50.00, ``` ## Benefits 1. **Flexible Payment Options**: Support both deposits and full payments 2. **Clear Communication**: Users know exactly what they're paying 3. **Professional Flow**: Matches industry standards (Booking.com, Airbnb) 4. **Financial Control**: Configure deposit requirements per business needs 5. **Reduced Risk**: Collect deposits to secure bookings 6. **Better Cash Flow**: Get partial payment upfront ## Future Enhancements 1. **Partial Payment Plans**: Allow multiple installments 2. **Dynamic Deposit Rules**: Different deposits per venue/category 3. **Deposit Reminders**: Email reminders for remaining balance 4. **Refund Handling**: Automated deposit refunds on cancellation 5. **Payment Schedule**: Show payment timeline to users ## Success Indicators ✅ Booking redirects to checkout after creation ✅ Deposit amount calculated from settings ✅ Checkout shows correct amount due ✅ Payment success redirects to confirmation ✅ Booking status updated after payment ✅ Clear communication about deposits ✅ Professional payment summary display ## Notes - Both `Booking` and `Reservation` models use the same `bookings` table - The system is backward compatible with existing bookings - Deposit settings can be changed without affecting existing bookings - All payment methods follow the same flow - Confirmation page remains unchanged