- Pay-now-Flow: bei fehlgeschlagenem Abo (Status 3) begleicht der Inhaber die offene Rechnung im Standard-Checkout mit frei waehlbarer, abo-faehiger Zahlart (nur eigenes Abo: Berater me-View + Kundenportal), payNow-Controller + Routen - AboRecoveryCheckoutService baut die ShoppingInstance aus den Abo-Artikeln; neue Spalte shopping_orders.recovery_user_abo_id verknuepft Bestellung<->Abo - Bei Erfolg: AboHelper::advanceAboAfterRecoveryPayment schreibt das Abo fort (Status->2, next_date) und uebernimmt die gewaehlte Zahlart als neues Token fuer kuenftige Abbuchungen - Neue Pay-now-Fehlermail (AboPaymentFailedMail) ersetzt die generische Fehlermail im Abo-Cron; Link fuehrt auf die Abo-Detailseite (CRM bzw. Portal) - Retry-/"extern erledigt"-Buttons nur noch fuer Admins; tote user/portal- Retry-Routen entfernt - Checkout: Recovery-Hinweis statt "Abschluss des Abonnements", Lieferadresse vorbelegt, korrekter Zurueck-Link (Abo statt Shop) - UserAbo::selfServiceDetailUrl zentralisiert die Abo-URL (Mail, Back-Links) - Test-Command abo:test-recovery; Tests fuer payNow, Advance-Logik, Fehlermail Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
78 lines
5.6 KiB
PHP
78 lines
5.6 KiB
PHP
<?php
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Main Website Routes (mivita.care)
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
use App\Http\Controllers\Portal\AboController;
|
|
use App\Http\Controllers\Portal\Auth\LoginController;
|
|
use App\Http\Controllers\Portal\CustomerController;
|
|
use App\Http\Controllers\Portal\InController;
|
|
use App\Http\Controllers\Portal\OrderController;
|
|
use App\Http\Controllers\Web\AboCardUpdateController;
|
|
|
|
/* ROUTING FOR CRM my.mivita / CMS */
|
|
|
|
Route::domain(config('app.pre_url_portal').config('app.domain').config('app.tld_care'))->group(function () {
|
|
|
|
Route::get('/', [InController::class, 'index'])->name('/portal.home');
|
|
Route::post('/loading/modal', [InController::class, 'loadingModal'])->name('portal.loading_modal');
|
|
Route::get('portal/change-login', [InController::class, 'changeLogin'])->name('portal.change_login');
|
|
|
|
// Standard login route für Laravel Auth-Kompatibilität
|
|
Route::get('login', function () {
|
|
return redirect()->route('portal.login.form');
|
|
})->name('login');
|
|
|
|
Route::get('portal/login', [LoginController::class, 'showLoginForm'])->name('portal.login.form');
|
|
Route::post('portal/login/send-otp', [LoginController::class, 'sendOtp'])->name('portal.login.send-otp');
|
|
Route::get('portal/login/verify/{email?}/{otp?}', [LoginController::class, 'showOtpForm'])->name('portal.login.otp.form'); // Zeigt OTP-Eingabeformular
|
|
Route::post('portal/login/verify', [LoginController::class, 'verifyOtpAndLogin'])->name('portal.login.verify-otp');
|
|
Route::get('portal/logout', [LoginController::class, 'logout'])->name('portal.logout');
|
|
Route::post('portal/logout-change', [LoginController::class, 'logoutChange'])->name('portal.logout_change');
|
|
|
|
// Login-freier Kreditkarten-Update-Link (Berater → Kunde); Kunde gibt selbst ein. Bewusst
|
|
// ausserhalb von auth:customers, da der Kunde nicht eingeloggt ist (Token = Berechtigung).
|
|
Route::get('abo/karte/{token}', [AboCardUpdateController::class, 'show'])->middleware('throttle:10,1')->name('abo_card_update_show');
|
|
Route::post('abo/karte/{token}', [AboCardUpdateController::class, 'store'])->middleware('throttle:10,1')->name('abo_card_update_store');
|
|
Route::get('abo/karte/{token}/return/{status}', [AboCardUpdateController::class, 'return'])->middleware('throttle:10,1')->name('abo_card_update_return');
|
|
|
|
// Geschützte Kunden-Routen
|
|
Route::middleware('auth:customers')->group(function () {
|
|
|
|
Route::get('portal/dashboard', [InController::class, 'dashboard'])->name('portal.dashboard');
|
|
// Route::get('portal/go-to-shop', [InController::class, 'goToShop'])->name('portal.go_to_shop');
|
|
Route::get('portal/my-data/edit', [CustomerController::class, 'myDataEdit'])->name('portal.my_data.edit');
|
|
Route::post('portal/my-data/store', [CustomerController::class, 'myDataStore'])->name('portal.my_data.store');
|
|
Route::get('portal/my-orders', [OrderController::class, 'myOrders'])->name('portal.my_orders');
|
|
Route::get('portal/my-orders/datatable', [OrderController::class, 'ordersDatatable'])->name('portal.my_orders.datatable');
|
|
Route::get('portal/my-orders/show/{id}', [OrderController::class, 'myOrderShow'])->name('portal.my_orders.show');
|
|
Route::get('portal/my-orders/{id}/payments/datatable', [OrderController::class, 'paymentsDatatable'])->name('portal.my_orders.payments_datatable');
|
|
Route::get('portal/my-orders/create/{id}', [OrderController::class, 'myOrderCreate'])->name('portal.my_orders.create');
|
|
Route::get('portal/my-subscriptions', [AboController::class, 'myAbo'])->name('portal.my_subscriptions');
|
|
Route::match(['get', 'post'], 'portal/my-subscriptions/create/{step}', [AboController::class, 'myAboCreate'])->name('portal.my_subscriptions.create');
|
|
Route::post('portal/my-subscriptions/update/{view}/{id}', [AboController::class, 'update'])->name('user_abos_update');
|
|
Route::post('portal/my-subscriptions/onetime/{view}/{id}', [AboController::class, 'oneTime'])->name('user_abos_onetime');
|
|
Route::post('portal/my-subscriptions/pay-now/{id}', [AboController::class, 'payNow'])->name('portal_abos_pay_now');
|
|
Route::get('portal/my-subscriptions/payment-method/{id}', [AboController::class, 'editPaymentMethod'])->name('portal_abos_payment_method_edit');
|
|
Route::post('portal/my-subscriptions/payment-method/{id}', [AboController::class, 'updatePaymentMethod'])->name('portal_abos_payment_method_update');
|
|
Route::get('portal/my-subscriptions/payment-method/{id}/return/{status}', [AboController::class, 'paymentMethodReturn'])->name('portal_abos_payment_method_return');
|
|
Route::get('portal/my-subscriptions/datatable/{id}', [AboController::class, 'datatable'])->name('user_abo_datatable');
|
|
Route::get('portal/my-subscriptions/onetime-datatable/{id}', [AboController::class, 'oneTimeDatatable'])->name('user_abo_onetime_datatable');
|
|
Route::post('portal/modal/load', [AboController::class, 'modalLoad'])->name('modal_load');
|
|
// Routen-Aliase für shared Views (admin.abo._detail, admin.abo._executions)
|
|
Route::get('portal/my-data/edit/{id?}', function () {
|
|
return redirect()->route('portal.my_data.edit');
|
|
})->name('user_customer_edit');
|
|
Route::get('portal/my-orders/detail/{id}', [OrderController::class, 'myOrderShow'])->name('user_shop_order_detail');
|
|
Route::get('portal/settings', [InController::class, 'settings'])->name('portal.settings');
|
|
// Weitere Kunden-spezifische Routen
|
|
});
|
|
|
|
// Logout für Kunden
|
|
|
|
// Logout für Kunden
|
|
});
|