Route::get('/currency/{currency}', [\App\Http\Controllers\Web\CurrencyController::class, 'switch'])->name('currency.switch'); use Illuminate\Support\Facades\Route; use App\Http\Controllers\Web\AuthController; use App\Http\Controllers\Web\DashboardController; use App\Http\Controllers\Web\SocialController; use App\Http\Controllers\Hotelier\HotelierDashboardController; use App\Http\Controllers\Hotelier\HotelController; use App\Http\Controllers\Hotelier\HotelRoomController; use App\Http\Controllers\Hotelier\HotelCalendarController; use App\Http\Controllers\Web\SubscriptionController; use App\Http\Controllers\TipTopPayController; Route::get('/', [\App\Http\Controllers\Web\HomeController::class , 'index'])->name('home'); Route::get('/tariffs', [\App\Http\Controllers\Web\HomeController::class , 'tariffs'])->name('tariffs'); Route::get('/login', [\App\Http\Controllers\Auth\LoginController::class , 'showLoginForm'])->name('login'); Route::post('/login', [\App\Http\Controllers\Auth\LoginController::class , 'login']); Route::post('/logout', [\App\Http\Controllers\Auth\LoginController::class , 'logout'])->name('logout'); Route::get('/register', [\App\Http\Controllers\Auth\RegisterController::class , 'showRegistrationForm'])->name('register'); Route::post('/register', [\App\Http\Controllers\Auth\RegisterController::class , 'register']); // Social Network (public) Route::get('/feed', [SocialController::class , 'feed'])->name('social.feed'); Route::get('/events', [SocialController::class , 'events'])->name('social.events'); Route::get('/plans', [SocialController::class , 'plans'])->name('social.plans'); Route::get('/search', [SocialController::class , 'search'])->name('social.search'); Route::get('/map', [\App\Http\Controllers\Web\MapController::class , 'index'])->name('map.index'); Route::get('/stories', [\App\Http\Controllers\Web\StoryController::class , 'index'])->name('stories.index'); Route::get('/marketplace', [\App\Http\Controllers\Web\MarketplaceController::class , 'index'])->name('marketplace.index'); // Public Catalog Route::get('/catalog', [\App\Http\Controllers\Web\CatalogController::class , 'index'])->name('catalog.index'); Route::get('/catalog/{product}', [\App\Http\Controllers\Web\CatalogController::class , 'show'])->name('catalog.show'); Route::get('/nearby', [SocialController::class , 'nearby'])->name('social.nearby'); // Tours (public) Route::get('/tours', [\App\Http\Controllers\Web\TourController::class , 'index'])->name('tours.index'); Route::get('/tours/filters', [\App\Http\Controllers\Web\TourController::class , 'getFilters'])->name('tours.filters'); Route::post('/tours/save-to-session', [\App\Http\Controllers\Web\TourController::class , 'saveToSession'])->name('tours.save-session'); Route::get('/tours/{id}', [\App\Http\Controllers\Web\TourController::class , 'show'])->name('tours.show'); // Agent Routes (Landing page is public) Route::get('/agent/register', [\App\Http\Controllers\Web\AgentRegistrationController::class , 'showRegistrationForm'])->name('agent.register.form'); Route::name('agent.')->prefix('agent')->middleware('auth')->group(function () { Route::post('/register', [\App\Http\Controllers\Web\AgentRegistrationController::class , 'register'])->name('register'); Route::post('/register/test', [\App\Http\Controllers\Web\AgentRegistrationController::class , 'testRegister'])->name('register.test'); Route::middleware('agent')->group(function () { Route::get('/dashboard', [\App\Http\Controllers\Web\AgentDashboardController::class , 'index'])->name('dashboard'); Route::get('/exchange', [\App\Http\Controllers\Web\AgentExchangeController::class , 'index'])->name('exchange'); Route::post('/exchange/claim/{type}/{id}', [\App\Http\Controllers\Web\AgentExchangeController::class , 'claim'])->name('exchange.claim'); } ); }); // Public Hotel Catalog (Unified) Route::get('/hotels', [\App\Http\Controllers\Web\ExternalHotelController::class , 'index'])->name('catalog.hotels.index'); Route::get('/hotels/{id}', [\App\Http\Controllers\Web\ExternalHotelController::class , 'show'])->name('catalog.hotels.show'); Route::get('/hotels/{id}/checkout', [\App\Http\Controllers\Web\ExternalHotelController::class , 'checkout'])->name('hotels.checkout')->middleware('auth'); // Backward Compatibility Redirects Route::get('/external-hotels', function () { return redirect()->route('catalog.hotels.index', request()->all()); }); Route::get('/external-hotels/{id}', function ($id) { return redirect()->route('catalog.hotels.show', array_merge(['id' => $id], request()->all())); }); // Hotel Booking.com affiliate redirect (already exists, keep it) Route::get('/hotels/{hotel}/book-on-booking', [\App\Http\Controllers\HotelBookingController::class , 'redirectToBooking']) ->name('hotels.booking-redirect'); // SAMO Hotels Catalog (from SAMO API) Route::get('/samo-hotels', [\App\Http\Controllers\Web\SamoHotelCatalogController::class , 'index'])->name('samo.hotels.index'); Route::get('/samo-hotels/country/{country}', [\App\Http\Controllers\Web\SamoHotelCatalogController::class , 'byCountry'])->name('samo.hotels.by-country'); Route::get('/samo-hotels/resort/{resort}', [\App\Http\Controllers\Web\SamoHotelCatalogController::class , 'byResort'])->name('samo.hotels.by-resort'); Route::get('/samo-hotels/{id}', [\App\Http\Controllers\Web\SamoHotelCatalogController::class , 'show'])->name('samo.hotels.show'); Route::post('/samo-hotels/{hotel}/search-tours', [\App\Http\Controllers\Web\SamoHotelCatalogController::class , 'searchTours'])->name('samo.hotels.search-tours'); // Public FAQ Route::get('/faq', [\App\Http\Controllers\Web\FaqController::class , 'index'])->name('faq'); // Ambassador Program Route::name('ambassadors.')->prefix('ambassadors')->group(function () { Route::get('/', [\App\Http\Controllers\AmbassadorController::class , 'index'])->name('index'); Route::post('/apply', [\App\Http\Controllers\AmbassadorController::class , 'store'])->name('store'); Route::get('/regions/{country}', [\App\Http\Controllers\AmbassadorController::class , 'getRegions'])->name('regions'); // Authenticated Ambassador Routes Route::middleware(['auth', 'ambassador'])->group(function () { Route::get('/dashboard', [\App\Http\Controllers\Web\AmbassadorDashboardController::class , 'index'])->name('dashboard'); Route::get('/promotions/create', [\App\Http\Controllers\Web\AmbassadorDashboardController::class , 'createPromotion'])->name('promotions.create'); Route::post('/promotions', [\App\Http\Controllers\Web\AmbassadorDashboardController::class , 'storePromotion'])->name('promotions.store'); } ); }); // Promotions & Giveaways Route::prefix('promotions')->name('promotions.')->group(function () { Route::get('/', [\App\Http\Controllers\Web\PromotionController::class , 'index'])->name('index'); Route::post('/{promotion}/participate', [\App\Http\Controllers\Web\PromotionController::class , 'participate'])->name('participate'); }); // CryptoCloud Webhook (public - no auth required) Route::post('/crypto/webhook', [\App\Http\Controllers\CryptoCloudPaymentController::class , 'webhook']) ->name('crypto.webhook'); Route::middleware('auth')->group(function () { Route::get('/dashboard', [DashboardController::class , 'index'])->name('dashboard'); // Admin Routes Route::middleware('admin')->prefix('admin')->name('admin.')->group(function () { Route::get('/', [DashboardController::class , 'admin'])->name('dashboard'); Route::get('/tenants', [DashboardController::class , 'tenants'])->name('tenants'); // SAMO Integration Management Route::prefix('samo')->name('samo.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\SamoAdminController::class , 'index'])->name('index'); Route::get('/countries', [\App\Http\Controllers\Admin\SamoAdminController::class , 'countries'])->name('countries'); Route::get('/hotels', [\App\Http\Controllers\Admin\SamoAdminController::class , 'hotels'])->name('hotels'); Route::post('/sync/countries', [\App\Http\Controllers\Admin\SamoAdminController::class , 'syncCountries'])->name('sync.countries'); Route::post('/sync/hotels', [\App\Http\Controllers\Admin\SamoAdminController::class , 'syncHotels'])->name('sync.hotels'); Route::post('/sync/all', [\App\Http\Controllers\Admin\SamoAdminController::class , 'syncAll'])->name('sync.all'); Route::post('/cleanup', [\App\Http\Controllers\Admin\SamoAdminController::class , 'cleanup'])->name('cleanup'); Route::get('/health', [\App\Http\Controllers\Admin\SamoAdminController::class , 'healthCheck'])->name('health'); } ); // Content Moderation Route::prefix('moderation')->name('moderation.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModerationController::class , 'index'])->name('index'); Route::get('/flagged', [\App\Http\Controllers\Admin\ModerationController::class , 'flagged'])->name('flagged'); Route::post('/review/{id}', [\App\Http\Controllers\Admin\ModerationController::class , 'review'])->name('review'); } ); // Ambassador Program Management Route::prefix('ambassadors')->name('ambassadors.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\AmbassadorAdminController::class , 'index'])->name('index'); Route::get('/{application}', [\App\Http\Controllers\Admin\AmbassadorAdminController::class , 'show'])->name('show'); Route::post('/{application}/approve', [\App\Http\Controllers\Admin\AmbassadorAdminController::class , 'approve'])->name('approve'); Route::post('/{application}/reject', [\App\Http\Controllers\Admin\AmbassadorAdminController::class , 'reject'])->name('reject'); Route::post('/regions/{region}/update', [\App\Http\Controllers\Admin\AmbassadorAdminController::class , 'updateRegion'])->name('regions.update'); } ); // Reviews Moderation Route::prefix('reviews')->name('reviews.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ReviewModerationController::class , 'index'])->name('index'); Route::post('/{type}/{id}/approve', [\App\Http\Controllers\Admin\ReviewModerationController::class , 'approve'])->name('approve'); Route::post('/{type}/{id}/reject', [\App\Http\Controllers\Admin\ReviewModerationController::class , 'reject'])->name('reject'); } ); // FAQ Management Route::resource('faqs', \App\Http\Controllers\Admin\FaqController::class); Route::resource('faq-categories', \App\Http\Controllers\Admin\FaqCategoryController::class); // Leads Management (Bookings & Requests) Route::prefix('leads')->name('leads.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\AdminLeadController::class, 'index'])->name('index'); Route::get('/booking/{booking}', [\App\Http\Controllers\Admin\AdminLeadController::class, 'showBooking'])->name('show_booking'); Route::get('/request/{tourRequest}', [\App\Http\Controllers\Admin\AdminLeadController::class, 'showRequest'])->name('show_request'); }); // Promotions Management Route::resource('promotions', \App\Http\Controllers\Admin\PromotionAdminController::class); Route::post('promotions/{promotion}/approve', [\App\Http\Controllers\Admin\PromotionAdminController::class , 'approveModeration'])->name('promotions.approve'); Route::post('promotions/{promotion}/reject', [\App\Http\Controllers\Admin\PromotionAdminController::class , 'rejectModeration'])->name('promotions.reject'); Route::get('promotions/{promotion}/participants', [\App\Http\Controllers\Admin\PromotionAdminController::class , 'participants'])->name('promotions.participants'); Route::post('promotions/{promotion}/pick-winner', [\App\Http\Controllers\Admin\PromotionAdminController::class , 'pickWinner'])->name('promotions.pick-winner'); Route::get('promotions/{promotion}/export', [\App\Http\Controllers\Admin\PromotionAdminController::class , 'exportParticipants'])->name('promotions.export'); } ); // Billing History - Commented out (controller not implemented yet) // Route::get('/billing/history', [BillingController::class, 'history'])->name('billing.history'); // ============================================ // HOTELIER ROUTES (Hotel Management) // ============================================ Route::prefix('hotelier')->name('hotelier.')->group(function () { // Root - redirect to dashboard Route::get('/', function () { return redirect()->route('hotelier.dashboard'); } ); // Dashboard Route::get('/dashboard', [HotelierDashboardController::class , 'index'])->name('dashboard'); Route::post('/switch-hotel', [HotelierDashboardController::class , 'switchHotel'])->name('switch-hotel'); // Hotels CRUD Route::resource('hotels', HotelController::class); // Hotel Photos Route::delete('hotels/{hotel}/photos/{photo}', [HotelController::class , 'deletePhoto']) ->name('hotels.photos.destroy'); // Calendar (Global - redirects to first hotel or shows selection) Route::get('/calendar', [\App\Http\Controllers\Hotelier\CalendarRedirectController::class , 'index'])->name('calendar.index'); // Bookings Management Route::prefix('bookings')->name('bookings.')->group(function () { Route::get('/', [\App\Http\Controllers\Hotelier\BookingController::class , 'index'])->name('index'); Route::get('/{booking}', [\App\Http\Controllers\Hotelier\BookingController::class , 'show'])->name('show'); Route::post('/{booking}/confirm', [\App\Http\Controllers\Hotelier\BookingController::class , 'confirm'])->name('confirm'); Route::post('/{booking}/cancel', [\App\Http\Controllers\Hotelier\BookingController::class , 'cancel'])->name('cancel'); } ); // Rooms Management Route::prefix('hotels/{hotel}')->name('hotels.')->group(function () { Route::resource('rooms', HotelRoomController::class)->except(['show']); // Calendar & Availability (Per Hotel) Route::get('calendar', [HotelCalendarController::class , 'index'])->name('calendar'); Route::post('calendar/bulk-update', [HotelCalendarController::class , 'bulkUpdate'])->name('calendar.bulk'); Route::get('calendar/bookings', [HotelCalendarController::class , 'getBookings'])->name('calendar.bookings'); // Single availability update (AJAX) Route::post('rooms/{room}/availability', [HotelCalendarController::class , 'updateAvailability']) ->name('rooms.availability.update'); } ); // Review Management (Hotelier) Route::prefix('reviews')->name('reviews.')->group(function () { Route::get('/', [\App\Http\Controllers\Hotelier\ReviewController::class , 'index'])->name('index'); Route::get('/{review}', [\App\Http\Controllers\Hotelier\ReviewController::class , 'show'])->name('show'); Route::post('/{review}/approve', [\App\Http\Controllers\Hotelier\ReviewController::class , 'approve'])->name('approve'); Route::post('/{review}/reject', [\App\Http\Controllers\Hotelier\ReviewController::class , 'reject'])->name('reject'); Route::get('/{review}/respond', [\App\Http\Controllers\Hotelier\ReviewController::class , 'respondForm'])->name('respond.form'); Route::post('/{review}/respond', [\App\Http\Controllers\Hotelier\ReviewController::class , 'respond'])->name('respond'); Route::post('/bulk-approve', [\App\Http\Controllers\Hotelier\ReviewController::class , 'bulkApprove'])->name('bulk-approve'); Route::post('/bulk-reject', [\App\Http\Controllers\Hotelier\ReviewController::class , 'bulkReject'])->name('bulk-reject'); } ); // Analytics Dashboard Route::get('/analytics', [\App\Http\Controllers\Hotelier\AnalyticsController::class , 'index'])->name('analytics.index'); } ); // Review Submission (User) Route::prefix('reviews')->name('reviews.')->group(function () { Route::get('/bookings/{booking}/create', [\App\Http\Controllers\ReviewController::class , 'create'])->name('create'); Route::post('/', [\App\Http\Controllers\ReviewController::class , 'store'])->name('store'); Route::get('/{review}/edit', [\App\Http\Controllers\ReviewController::class , 'edit'])->name('edit'); Route::put('/{review}', [\App\Http\Controllers\ReviewController::class , 'update'])->name('update'); Route::delete('/{review}', [\App\Http\Controllers\ReviewController::class , 'destroy'])->name('destroy'); Route::post('/{review}/helpful', [\App\Http\Controllers\ReviewController::class , 'markHelpful'])->name('helpful'); Route::post('/{review}/not-helpful', [\App\Http\Controllers\ReviewController::class , 'markNotHelpful'])->name('not-helpful'); // Tour Reviews Route::post('/tours', [\App\Http\Controllers\Web\TourReviewController::class, 'store'])->name('tours.store'); Route::post('/tours/{review}/helpful', [\App\Http\Controllers\Web\TourReviewController::class, 'helpful'])->name('tours.helpful'); } ); // Profile (protected) Route::get('/profile/edit', [SocialController::class , 'editProfile'])->name('profile.edit'); Route::put('/profile', [SocialController::class , 'updateProfile'])->name('profile.update'); Route::get('/profile/{userId?}', [SocialController::class , 'profile'])->name('social.profile'); Route::post('/profile/{user}/follow', [SocialController::class , 'follow'])->name('profile.follow'); Route::post('/profile/{user}/unfollow', [SocialController::class , 'unfollow'])->name('profile.unfollow'); // Chat Route::get('/chat', [\App\Http\Controllers\Web\ChatController::class , 'index'])->name('chat.index'); Route::get('/chat/conversations', [\App\Http\Controllers\Web\ChatController::class , 'fetchConversations'])->name('chat.conversations'); Route::get('/chat/{userId}/messages', [\App\Http\Controllers\Web\ChatController::class , 'fetchMessages'])->name('chat.messages'); Route::post('/chat/{userId}/send', [\App\Http\Controllers\Web\ChatController::class , 'sendMessage'])->name('chat.send.api'); Route::post('/chat/{userId}/typing', [\App\Http\Controllers\Web\ChatController::class , 'typing'])->name('chat.typing'); Route::put('/messages/{messageId}', [\App\Http\Controllers\Web\ChatController::class , 'editMessage'])->name('messages.edit'); Route::delete('/messages/{messageId}', [\App\Http\Controllers\Web\ChatController::class , 'deleteMessage'])->name('messages.delete'); Route::post('/messages/{messageId}/reactions', [\App\Http\Controllers\Web\ChatController::class , 'toggleReaction'])->name('messages.reactions.toggle'); Route::post('/chat/messages/{messageId}/view', [\App\Http\Controllers\Web\ChatController::class , 'markAsViewed'])->name('chat.message.view'); Route::post('/chat/messages/{messageId}/screenshot-alert', [\App\Http\Controllers\Web\ChatController::class , 'screenshotAlert'])->name('chat.message.screenshot'); Route::post('/messages/{messageId}/feedback', [\App\Http\Controllers\Web\ChatController::class , 'submitFeedback'])->name('messages.feedback'); Route::get('/chat/unread-count', [\App\Http\Controllers\Web\ChatController::class , 'getUnreadCount'])->name('chat.unread'); Route::post('/chat/vizir/send', [\App\Http\Controllers\Web\VizirChatController::class , 'sendToVisir'])->name('chat.vizir.send'); Route::get('/chat/{userId}', [\App\Http\Controllers\Web\ChatController::class , 'show'])->name('chat.show'); Route::get('/api/users', [\App\Http\Controllers\Web\ChatController::class , 'getUsers'])->name('api.users'); Route::get('/api/users/{userId}', [\App\Http\Controllers\Web\ChatController::class , 'getUser'])->name('api.user'); // Calls Route::post('/calls/initiate/{userId}', [\App\Http\Controllers\Web\CallController::class , 'initiate'])->name('calls.initiate'); Route::post('/calls/{call}/answer', [\App\Http\Controllers\Web\CallController::class , 'answer'])->name('calls.answer'); Route::post('/calls/{call}/reject', [\App\Http\Controllers\Web\CallController::class , 'reject'])->name('calls.reject'); Route::post('/calls/{call}/end', [\App\Http\Controllers\Web\CallController::class , 'end'])->name('calls.end'); Route::post('/calls/{call}/signal', [\App\Http\Controllers\Web\CallController::class , 'signal'])->name('calls.signal'); // Gallery Route::post('/posts/{post}/upload', [\App\Http\Controllers\Web\GalleryController::class , 'upload'])->name('gallery.upload'); Route::delete('/posts/{post}/images/{index}', [\App\Http\Controllers\Web\GalleryController::class , 'delete'])->name('gallery.delete'); // Analytics Route::get('/analytics', [\App\Http\Controllers\Web\AnalyticsController::class , 'index'])->name('analytics.index'); // Stories Route::post('/stories', [\App\Http\Controllers\Web\StoryController::class , 'store'])->name('stories.store'); Route::post('/stories/{story}/view', [\App\Http\Controllers\Web\StoryController::class , 'view'])->name('stories.view'); // Marketplace Route::get('/marketplace/create', [\App\Http\Controllers\Web\MarketplaceController::class , 'create'])->name('marketplace.create'); Route::post('/marketplace', [\App\Http\Controllers\Web\MarketplaceController::class , 'store'])->name('marketplace.store'); Route::get('/marketplace/{item}', [\App\Http\Controllers\Web\MarketplaceController::class , 'show'])->name('marketplace.show'); // Subscription & Tariffs Route::post('/subscription/subscribe', [SubscriptionController::class, 'paySubscription'])->name('subscription.subscribe'); Route::post('/subscription/upgrade', [SubscriptionController::class, 'upgrade'])->name('subscription.upgrade'); // Wallet Route::get('/wallet', [\App\Http\Controllers\Web\WalletController::class , 'index'])->name('wallet.index'); Route::get('/wallet/deposit', [\App\Http\Controllers\Web\WalletController::class , 'deposit'])->name('wallet.deposit'); Route::get('/wallet/transactions', [\App\Http\Controllers\Web\WalletController::class , 'transactions'])->name('wallet.transactions'); // CryptoCloud Payments Route::post('/wallet/deposit/crypto', [\App\Http\Controllers\CryptoCloudPaymentController::class , 'createDeposit'])->name('wallet.deposit.crypto'); Route::get('/payments/cryptocloud/success', [\App\Http\Controllers\CryptoCloudPaymentController::class , 'success'])->name('payments.cryptocloud.success'); Route::get('/payments/cryptocloud/cancel', [\App\Http\Controllers\CryptoCloudPaymentController::class , 'cancel'])->name('payments.cryptocloud.cancel'); // TipTop Payments (deposit creation is handled via widget, but we need pending for better tracking) // Route::post('/wallet/deposit/tiptop', [TipTopPayController::class , 'createDeposit'])->name('wallet.deposit.tiptop'); // Referrals Route::get('/referrals', [App\Http\Controllers\ReferralController::class , 'index'])->name('referrals.index'); Route::get('/referrals/stats', [App\Http\Controllers\ReferralController::class , 'stats'])->name('referrals.stats'); Route::get('/referrals/link', [App\Http\Controllers\ReferralController::class , 'getLink'])->name('referrals.link'); // Subscription Route::post('/subscription/trial', [\App\Http\Controllers\Web\SubscriptionController::class , 'activateTrial'])->name('subscription.trial'); Route::post('/subscription/pay', [\App\Http\Controllers\Web\SubscriptionController::class , 'paySubscription'])->name('subscription.pay'); }); // TipTop Pay Callback Route::post('/api/payments/tiptop/callback', [TipTopPayController::class, 'webhook'])->name('payments.tiptop.callback'); // VTB Bank Payment Routes Route::middleware('auth')->group(function () { Route::post('/wallet/deposit/vtb', [\App\Http\Controllers\VTBPaymentController::class , 'createDeposit'])->name('wallet.deposit.vtb'); Route::get('/payments/vtb/success', [\App\Http\Controllers\VTBPaymentController::class , 'success'])->name('payments.vtb.success'); Route::get('/payments/vtb/fail', [\App\Http\Controllers\VTBPaymentController::class , 'fail'])->name('payments.vtb.fail'); }); Route::match (['get', 'post'], '/api/payments/vtb/callback', [\App\Http\Controllers\VTBPaymentController::class , 'callback'])->name('payments.vtb.callback'); // TEST ONLY - БЦК Callback Simulator (for local development) // Remove in production! if (app()->environment('local')) { Route::post('/test/bcc/callback-success', function (\Illuminate\Http\Request $request) { $orderId = $request->input('order_id', '0000041766747868'); // Find transaction $transaction = \App\Models\WalletTransaction::whereJsonContains('metadata->order_id', $orderId)->first(); if (!$transaction) { return response()->json(['error' => 'Transaction not found'], 404); } if ($transaction->status !== 'pending') { return response()->json(['error' => 'Already processed', 'status' => $transaction->status], 400); } // Direct update - bypass signature validation \Illuminate\Support\Facades\DB::transaction(function () use ($transaction, $request) { $user = $transaction->user; $wallet = app(\App\Services\WalletService::class)->getOrCreateWallet($user); $newBalance = $wallet->balance + $transaction->amount; $wallet->update(['balance' => $newBalance]); $transaction->update([ 'status' => 'completed', 'balance_after' => $newBalance, 'bcc_transaction_id' => $request->input('rrn', '536022068081'), 'processed_at' => now(), ]); \Illuminate\Support\Facades\Log::info('TEST: BCC payment confirmed', [ 'transaction_id' => $transaction->id, 'amount' => $transaction->amount, ]); } ); return response()->json(['success' => true, 'balance' => $transaction->fresh()->user->wallet->balance]); })->name('test.bcc.success'); } Route::middleware('auth')->group(function () { // Posts Route::get('/posts/create', [\App\Http\Controllers\Web\PostController::class , 'create'])->name('posts.create'); Route::post('/posts', [\App\Http\Controllers\Web\PostController::class , 'store'])->name('posts.store'); Route::get('/posts/{post}/edit', [\App\Http\Controllers\Web\PostController::class , 'edit'])->name('posts.edit'); Route::put('/posts/{post}', [\App\Http\Controllers\Web\PostController::class , 'update'])->name('posts.update'); Route::delete('/posts/{post}', [\App\Http\Controllers\Web\PostController::class , 'destroy'])->name('posts.destroy'); Route::post('/posts/{post}/like', [\App\Http\Controllers\Web\PostController::class , 'like'])->name('posts.like'); Route::post('/posts/{post}/comment', [\App\Http\Controllers\Web\PostController::class , 'comment'])->name('posts.comment'); // Events Route::get('/events/create', [\App\Http\Controllers\Web\EventController::class , 'create'])->name('events.create'); Route::post('/events', [\App\Http\Controllers\Web\EventController::class , 'store'])->name('events.store'); Route::get('/events/{event}', [\App\Http\Controllers\Web\EventController::class , 'show'])->name('events.show'); Route::post('/events/{event}/join', [\App\Http\Controllers\Web\EventController::class , 'join'])->name('events.join'); Route::post('/events/{event}/leave', [\App\Http\Controllers\Web\EventController::class , 'leave'])->name('events.leave'); // Travel Plans Route::get('/plans/create', [\App\Http\Controllers\Web\TravelPlanController::class , 'create'])->name('plans.create'); Route::post('/plans', [\App\Http\Controllers\Web\TravelPlanController::class , 'store'])->name('plans.store'); Route::get('/plans/{plan}/edit', [\App\Http\Controllers\Web\TravelPlanController::class , 'edit'])->name('plans.edit'); Route::put('/plans/{plan}', [\App\Http\Controllers\Web\TravelPlanController::class , 'update'])->name('plans.update'); Route::post('/plans/{plan}/toggle', [\App\Http\Controllers\Web\TravelPlanController::class , 'togglePublic'])->name('plans.toggle'); Route::get('/plans/{plan}', [\App\Http\Controllers\Web\TravelPlanController::class , 'show'])->name('plans.show'); }); // Tour Bookings (Public/Guest) Route::get('/tours/book', [\App\Http\Controllers\Web\TourBookingController::class , 'create'])->name('tours.book'); Route::post('/tours/book', [\App\Http\Controllers\Web\TourBookingController::class , 'store'])->name('tours.book.store'); Route::get('/my-bookings/{id}/pay', [\App\Http\Controllers\Web\TourBookingController::class , 'pay'])->name('bookings.pay'); Route::get('/my-bookings/{id}', [\App\Http\Controllers\Web\TourBookingController::class , 'show'])->name('bookings.show'); Route::get('/check-booking', [\App\Http\Controllers\Web\TourBookingController::class , 'checkGuestBookingForm'])->name('bookings.guest.form'); Route::post('/check-booking', [\App\Http\Controllers\Web\TourBookingController::class , 'guestShow'])->name('bookings.guest.show'); Route::middleware('auth')->group(function () { Route::get('/my-bookings', [\App\Http\Controllers\Web\TourBookingController::class , 'index'])->name('bookings.index'); Route::get('/my-bookings/{id}/documents', [\App\Http\Controllers\Web\TourBookingController::class , 'documents'])->name('bookings.documents'); // Bookings Route::post('/bookings', [\App\Http\Controllers\Web\BookingPublicController::class , 'store'])->name('bookings.store'); // Videos & Reels Route::get('/reels', [\App\Http\Controllers\Web\VideoController::class , 'index'])->name('reels.index'); Route::post('/videos', [\App\Http\Controllers\Web\VideoController::class , 'store'])->name('videos.store'); Route::get('/videos/{video}', [\App\Http\Controllers\Web\VideoController::class , 'show'])->name('videos.show'); Route::post('/videos/{video}/view', [\App\Http\Controllers\Web\VideoController::class , 'incrementView'])->name('videos.view'); Route::post('/videos/{video}/like', [\App\Http\Controllers\Web\VideoController::class , 'like'])->name('videos.like'); Route::delete('/videos/{video}', [\App\Http\Controllers\Web\VideoController::class , 'destroy'])->name('videos.destroy'); Route::get('/videos/feed', [\App\Http\Controllers\Web\VideoController::class , 'feed'])->name('videos.feed'); Route::get('/videos/user/{userId}', [\App\Http\Controllers\Web\VideoController::class , 'userVideos'])->name('videos.user'); Route::get('/stories/videos', [\App\Http\Controllers\Web\VideoController::class , 'stories'])->name('videos.stories'); Route::post('/videos/{video}/comment', [\App\Http\Controllers\Web\VideoController::class , 'comment'])->name('videos.comment'); Route::get('/videos/{video}/comments', [\App\Http\Controllers\Web\VideoController::class , 'getComments'])->name('videos.comments'); Route::delete('/videos/{video}/comments/{commentId}', [\App\Http\Controllers\Web\VideoController::class , 'deleteComment'])->name('videos.comment.delete'); // AI Features Route::post('/ai/chat', [\App\Http\Controllers\ChatbotController::class , 'chat'])->name('ai.chat'); Route::get('/ai/history', [\App\Http\Controllers\ChatbotController::class , 'history'])->name('ai.history'); Route::get('/ai/chat/{chatId}/messages', [\App\Http\Controllers\ChatbotController::class , 'messages'])->name('ai.messages'); Route::post('/ai/itinerary', [\App\Http\Controllers\ChatbotController::class , 'generateItinerary'])->name('ai.itinerary'); Route::post('/ai/recommendations', [\App\Http\Controllers\ChatbotController::class , 'getRecommendations'])->name('ai.recommendations'); Route::post('/ai/generate-caption', [\App\Http\Controllers\ChatbotController::class , 'generateCaption'])->name('ai.caption'); // Locations API Route::get('/api/locations/autocomplete', [\App\Http\Controllers\Api\LocationController::class , 'autocomplete'])->name('api.locations.autocomplete'); Route::get('/api/locations/search', [\App\Http\Controllers\Api\LocationController::class , 'search'])->name('api.locations.search'); Route::post('/api/locations/geocode', [\App\Http\Controllers\Api\LocationController::class , 'geocode'])->name('api.locations.geocode'); Route::get('/api/locations/popular', [\App\Http\Controllers\Api\LocationController::class , 'popular'])->name('api.locations.popular'); Route::post('/api/locations/nearby', [\App\Http\Controllers\Api\LocationController::class , 'nearby'])->name('api.locations.nearby'); Route::post('/api/locations/nearby-users', [\App\Http\Controllers\Api\LocationController::class , 'nearbyUsers'])->name('api.locations.nearbyUsers'); Route::post('/api/locations/reverse-geocode', [\App\Http\Controllers\Api\LocationController::class , 'reverseGeocode'])->name('api.locations.reverseGeocode'); Route::post('/api/locations/update-location', [\App\Http\Controllers\Api\LocationController::class , 'updateLocation'])->name('api.locations.updateLocation'); Route::get('/api/locations/{location}', [\App\Http\Controllers\Api\LocationController::class , 'show'])->name('api.locations.show'); }); // Авиабилеты (Duffel API) Route::group(['prefix' => 'flights', 'as' => 'flights.'], function () { Route::get('/', [App\Http\Controllers\Web\FlightController::class , 'index'])->name('index'); Route::get('/suggest', [App\Http\Controllers\Web\FlightController::class , 'suggestAirports'])->name('suggest'); Route::middleware('auth')->group(function () { Route::get('/checkout/{offerId}', [App\Http\Controllers\Web\FlightController::class , 'checkout'])->name('checkout'); Route::post('/book', [App\Http\Controllers\Web\FlightController::class , 'book'])->name('book'); Route::get('/orders/{flightOrder}', [App\Http\Controllers\Web\FlightController::class , 'show'])->name('show'); Route::post('/orders/{flightOrder}/cancel', [App\Http\Controllers\Web\FlightController::class , 'cancel'])->name('cancel'); // Order Management & Document Uploads Route::post('/orders/{flightOrder}/documents', [App\Http\Controllers\Web\FlightOrderLifecycleController::class , 'uploadDocument'])->name('orders.documents.upload'); Route::post('/orders/{flightOrder}/request-change', [App\Http\Controllers\Web\FlightOrderLifecycleController::class , 'requestChange'])->name('orders.change.request'); Route::post('/orders/{flightOrder}/confirm-change', [App\Http\Controllers\Web\FlightOrderLifecycleController::class , 'confirmChange'])->name('orders.change.confirm'); // AJAX Endpoints Route::get('/seat-map/{offerId}', [App\Http\Controllers\Web\FlightController::class , 'seatMap'])->name('seatmap'); Route::get('/services/{offerId}', [App\Http\Controllers\Web\FlightController::class , 'availableServices'])->name('services'); // Passenger Profiles Route::get('/passenger-profiles', [App\Http\Controllers\Web\PassengerProfileController::class , 'index'])->name('passenger-profiles.index'); Route::post('/passenger-profiles', [App\Http\Controllers\Web\PassengerProfileController::class , 'store'])->name('passenger-profiles.store'); Route::delete('/passenger-profiles/{passengerProfile}', [App\Http\Controllers\Web\PassengerProfileController::class , 'destroy'])->name('passenger-profiles.destroy'); Route::get('/api/passenger-profiles', [App\Http\Controllers\Web\PassengerProfileController::class , 'list'])->name('passenger-profiles.list'); } ); }); // Legal Pages Route::get('/payment-policy', [\App\Http\Controllers\LegalController::class , 'paymentPolicy'])->name('legal.payment-policy'); Route::get('/privacy-policy', [\App\Http\Controllers\LegalController::class , 'privacyPolicy'])->name('legal.privacy-policy'); Route::get('/ambassador-offer', [\App\Http\Controllers\LegalController::class , 'ambassadorOffer'])->name('legal.ambassador-offer'); // Include booking routes require __DIR__ . '/booking.php';