Die Erinnerungsmails vor Ablauf der Mitgliedschaft beschrieben noch den abgeschafften SEPA-Einzug und verlinkten auf die Hauptdomain, wo /user/membership nicht existiert. Das Produkt fuer die Verlaengerung war zudem dasselbe wie bei der Registrierung und sprach deshalb vom Neuabschluss. - Erinnerungen: nur noch Stufen 31/33/34/35, SEPA-Stufen 32/36/37 samt :price und :pay_date entfallen; Button verlinkt auf my.mivita.care; fehlt ein Text zum Status, wird die Mail geloggt statt roh versendet. - Alle Erinnerungstexte (de/en/es/fr) erklaeren jetzt, dass ohne Zahlung der Account pausiert und offene Provisionen ausgezahlt werden. - Eigenes Produkt fuer die Verlaengerung (identifier show_renewal) als Kopie des Mitgliedschafts-Produkts inkl. Preisen, Kategorien und Uebersetzungen fuer en/es/fr; die Mitgliedschaftsseite faellt ohne dieses Produkt auf das bisherige zurueck. - Mitgliedschaftsseite auf ein Paket reduziert: Upgrade-, Wechsel- und Abo-Optionen entfernt, Texte auf die manuelle Verlaengerung umgestellt. - Alte Cron-Weboberflaeche entfernt, der Versand laeuft ueber den Scheduler (payments:check-accounts). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
233 lines
9.4 KiB
PHP
233 lines
9.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\User;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Mail\MailInfo;
|
|
use App\Models\Product;
|
|
use App\Models\ShippingCountry;
|
|
use App\Models\ShoppingInstance;
|
|
use App\Models\ShoppingOrder;
|
|
use App\Models\UserHistory;
|
|
use App\Services\UserService;
|
|
use App\User;
|
|
use Auth;
|
|
use Carbon;
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Request;
|
|
use Util;
|
|
use Yard;
|
|
|
|
class MembershipController extends Controller
|
|
{
|
|
/**
|
|
* Create a new controller instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth');
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$user = User::find(Auth::user()->id);
|
|
|
|
$userShoppingOrders = ShoppingOrder::with('shopping_user', 'shopping_payments')->select('shopping_orders.*')
|
|
->where('auth_user_id', '=', $user->id)
|
|
->where('txaction', '!=', null)
|
|
->whereIn('payment_for', [1, 2])
|
|
->orderBy('created_at', 'DESC')
|
|
->get();
|
|
|
|
$userHistoryPaymentOrder = null;
|
|
|
|
/* Die Zahlung ist erst ab config('mivita.renewal_days') Tagen vor Ablauf möglich.
|
|
Geht sie ein, verlängert sich die Mitgliedschaft um ein Jahr, sonst läuft sie aus. */
|
|
if ($user->isRenewalAccount()) {
|
|
// Acount ist noch nicht verlängert / bezahlt
|
|
if ($user->payment_account) {
|
|
// Die Order muss größer als das Datum sein.
|
|
$payment_greaterThan = Carbon::parse($user->payment_account)->modify('-'.(config('mivita.renewal_days') + 1).' days');
|
|
$userHistoryPaymentOrder = UserHistory::whereUserId($user->id)->whereAction('payment_order')->where('created_at', '>=', $payment_greaterThan)->get()->last();
|
|
}
|
|
}
|
|
$userHistoryDeleteMembership = UserHistory::whereUserId($user->id)->whereAction('delete_membership')->whereStatus(50)->get()->last();
|
|
|
|
$shipping_country_id = $this->checkShoppingCountry($user);
|
|
if (! $shipping_country_id) {
|
|
abort(403, __('validation.custom.shipping_not_found'));
|
|
}
|
|
|
|
UserService::checkUserTaxShippingCountry($user, $shipping_country_id);
|
|
|
|
$data = [
|
|
'user' => $user,
|
|
'products' => $this->renewalProducts(),
|
|
'userHistoryPaymentOrder' => $userHistoryPaymentOrder,
|
|
'userHistoryDeleteMembership' => $userHistoryDeleteMembership,
|
|
'yard_info' => UserService::getYardInfo(),
|
|
'userShoppingOrders' => $userShoppingOrders,
|
|
];
|
|
|
|
return view('user.membership.index', $data);
|
|
}
|
|
|
|
/**
|
|
* Produkte, die bei der Mitgliedschafts-Verlängerung zur Auswahl stehen.
|
|
*
|
|
* Die Registrierung (show_on 7) nutzt ein eigenes Produkt mit Registrierungs-Text.
|
|
* Für die Verlängerung gibt es eine Kopie mit passendem Inhalt (identifier show_renewal).
|
|
* Solange keine angelegt ist, greift das bisherige Mitgliedschafts-Produkt.
|
|
*
|
|
* @return Collection<int, Product>
|
|
*/
|
|
private function renewalProducts(): Collection
|
|
{
|
|
$renewalProducts = Product::where('active', true)
|
|
->where('identifier', 'show_renewal')
|
|
->whereJsonContains('show_on', '8')
|
|
->orderBy('pos', 'ASC')
|
|
->get();
|
|
|
|
if ($renewalProducts->isNotEmpty()) {
|
|
return $renewalProducts;
|
|
}
|
|
|
|
return Product::where('active', true)
|
|
->whereJsonContains('show_on', '7')
|
|
->whereJsonContains('show_on', '8')
|
|
->orderBy('pos', 'ASC')
|
|
->get();
|
|
}
|
|
|
|
private function checkShoppingCountry($user)
|
|
{
|
|
|
|
$country_id = null;
|
|
if ($user->account->same_as_billing) {
|
|
$country_id = $user->account->country_id;
|
|
} else {
|
|
$country_id = $user->account->shipping_country_id;
|
|
}
|
|
if ($country_id) {
|
|
if ($shipping_country = ShippingCountry::whereCountryId($country_id)->first()) {
|
|
return $shipping_country->id;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function storePayment($action)
|
|
{
|
|
// #### payment order
|
|
// #### shop upgrade
|
|
if ($action === 'upgrade_order' || $action === 'payment_order') {
|
|
if (Request::get('switchers-package-wizard')) {
|
|
$user = User::find(Auth::user()->id);
|
|
Yard::instance('shopping')->destroy();
|
|
$product = Product::find(Request::get('switchers-package-wizard'));
|
|
|
|
$shipping_country_id = $this->checkShoppingCountry($user);
|
|
if (! $shipping_country_id) {
|
|
abort(403, __('validation.custom.shipping_not_found'));
|
|
}
|
|
|
|
UserService::checkUserTaxShippingCountry($user, $shipping_country_id);
|
|
Yard::instance('shopping')->setUserPriceInfos(UserService::getYardInfo());
|
|
Yard::instance('shopping')->setShippingCountryWithPrice($shipping_country_id);
|
|
|
|
if ($product && $product->active) {
|
|
$image = '';
|
|
if ($product->images->count()) {
|
|
$image = $product->images->first()->slug;
|
|
}
|
|
$qty = $product->is_membership_only ? 1 : (Request::get('qty') ? Request::get('qty') : 1);
|
|
$cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), $qty, $product->getPriceWith(UserService::getTaxFree(), false, UserService::$user_country), false, false, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission, 'no_free_shipping' => $product->no_free_shipping, 'show_on' => $product->show_on]);
|
|
if ($cartItem->qty > 1) {
|
|
Yard::instance('shopping')->update($cartItem->rowId, 1);
|
|
}
|
|
if (UserService::getTaxFree()) {
|
|
Yard::setTax($cartItem->rowId, 0);
|
|
} else {
|
|
Yard::setTax($cartItem->rowId, $product->getTaxWith(UserService::$user_country));
|
|
}
|
|
|
|
do {
|
|
$identifier = Util::getToken();
|
|
} while (ShoppingInstance::where('identifier', $identifier)->count());
|
|
|
|
$data = [];
|
|
$data['is_from'] = 'membership';
|
|
$data['is_for'] = 'me';
|
|
$data['user_price_infos'] = UserService::getUserPriceInfos();
|
|
|
|
ShoppingInstance::create([
|
|
'identifier' => $identifier,
|
|
'user_shop_id' => 1, // is first faker shop for nuy intern
|
|
'auth_user_id' => Auth::user()->id,
|
|
'payment' => 3, // Berater Membership
|
|
'subdomain' => url('/'),
|
|
'country_id' => Yard::instance('shopping')->getShippingCountryId(),
|
|
'language' => \App::getLocale(),
|
|
'shopping_data' => $data,
|
|
'back' => url()->previous(),
|
|
|
|
]);
|
|
Yard::instance('shopping')->store($identifier);
|
|
// add to DB
|
|
$path = route('checkout.checkout_card', ['identifier' => $identifier]);
|
|
UserHistory::create(['user_id' => $user->id, 'action' => $action, 'status' => 1, 'product_id' => $product->id, 'identifier' => $identifier]);
|
|
|
|
// $path = str_replace('http', 'https', $path);
|
|
return redirect()->secure($path);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($action === 'change_order') {
|
|
if (Request::get('switchers-package-wizard')) {
|
|
$user = User::find(Auth::user()->id);
|
|
$product = Product::find(Request::get('switchers-package-wizard'));
|
|
if ($user->payment_order_id == $product->id) {
|
|
\Session()->flash('alert-success', __('msg.no_change_made'));
|
|
|
|
return back();
|
|
}
|
|
if ($product && $product->active) {
|
|
$user->payment_order_id = $product->id;
|
|
$user->save();
|
|
UserHistory::create(['user_id' => $user->id, 'action' => $action, 'status' => 10, 'product_id' => $product->id]);
|
|
\Session()->flash('alert-success', __('msg.booked_package_has_been_changed'));
|
|
|
|
return back();
|
|
}
|
|
}
|
|
}
|
|
if ($action === 'delete_membership') {
|
|
if (Request::get('delete_membership_mivita')) {
|
|
// TODO
|
|
$user = User::find(Auth::user()->id);
|
|
if ($user->isTestMode()) {
|
|
$mail = config('app.info_test_mail');
|
|
} else {
|
|
$mail = config('app.info_mail');
|
|
}
|
|
Mail::to($mail)->send(new MailInfo($user, 'delete_membership'));
|
|
UserHistory::create(['user_id' => $user->id, 'action' => $action, 'status' => 50]);
|
|
\Session()->flash('alert-success', __('msg.cancel_membership_is_requested'));
|
|
|
|
return back();
|
|
}
|
|
\Session()->flash('alert-error', __('msg.error_checkbox_not_confirm'));
|
|
|
|
return back();
|
|
}
|
|
\Session()->flash('alert-error', __('msg.error_checkbox_not_confirm'));
|
|
|
|
return back();
|
|
}
|
|
}
|