20-02-2026

This commit is contained in:
Kevin Adametz 2026-02-20 17:55:06 +01:00
parent a8b395e20d
commit a00c42e770
252 changed files with 28785 additions and 8907 deletions

View file

@ -2,25 +2,27 @@
namespace App\Http\Controllers\Portal;
use Auth;
use Yard;
use Request;
use Validator;
use App\Services\Shop;
use App\Services\Util;
use App\Models\Product;
use App\Models\UserAbo;
use App\Services\AboHelper;
use App\Models\ShoppingUser;
use App\Models\ShoppingOrder;
use App\Services\UserService;
use App\Models\ShoppingInstance;
use App\Http\Controllers\Controller;
use App\Models\Product;
use App\Models\ShoppingInstance;
use App\Models\ShoppingUser;
use App\Models\UserAbo;
use App\Models\UserAboItem;
use App\Repositories\AboRepository;
use App\Services\AboHelper;
use App\Services\AboItemHistoryService;
use App\Services\AboOrderCart;
use App\Services\Shop;
use App\Services\UserService;
use App\Services\Util;
use Auth;
use Request;
use Yard;
class AboController extends Controller
{
private $instance = 'subscription';
private $yard;
/**
@ -34,12 +36,11 @@ class AboController extends Controller
$this->yard = Yard::instance($this->instance);
}
public function myAbo()
{
$user = Auth::guard('customers')->user();
if (!$user->shopping_user_id) {
if (! $user->shopping_user_id) {
return view('portal.abo.my_abo_create', [
'user' => $user,
'no_shopping_user' => true,
@ -49,30 +50,304 @@ class AboController extends Controller
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$user_abo = UserAbo::where('email', $shopping_user->billing_email)
->where('status', '>', 1)
->first();
->where('status', '>', 1)
->first();
return $user_abo
? view('portal.abo.my_abo', ['user_abo' => $user_abo])
: view('portal.abo.my_abo_create', [
if (! $user_abo) {
return view('portal.abo.my_abo_create', [
'shopping_user' => $shopping_user,
'step' => 0,
]);
}
$this->checkPortalPermission($user_abo);
$view = 'portal';
// Init Yard und Customer-Detail
AboOrderCart::initYard($user_abo);
$customer_detail = AboOrderCart::getCustomerDetail();
AboOrderCart::makeOrderYard($user_abo);
return view('portal.abo.my_abo', [
'user_abo' => $user_abo,
'customer_detail' => $customer_detail,
'view' => $view,
'comp_products' => [],
'isAdmin' => false,
]);
}
public function update($view, $id)
{
$data = Request::all();
$user_abo = UserAbo::findOrFail($id);
$this->checkPortalPermission($user_abo);
$isAddOnlyMode = AboHelper::isAddOnlyMode($user_abo, $view);
if (isset($data['action'])) {
if ($data['action'] === 'abo_update_settings') {
$user_abo = UserAbo::findOrFail($data['id']);
$this->checkPortalPermission($user_abo);
$aboRepository = new AboRepository;
$aboRepository->setModel($user_abo);
$aboRepository->update($data);
return redirect(route('portal.my_subscriptions'));
}
if (Request::ajax()) {
$message = false;
// addProduct
if ($data['action'] === 'addProduct') {
if ($product = Product::find($data['product_id'])) {
if ($UserAboItem = UserAboItem::where('user_abo_id', $user_abo->id)->where('product_id', $product->id)->where('comp', 0)->first()) {
$qtyBefore = $UserAboItem->qty;
$UserAboItem->qty = $UserAboItem->qty + 1;
$UserAboItem->save();
AboItemHistoryService::logProductAdded($user_abo, $UserAboItem, $qtyBefore, $view);
} else {
$newItem = UserAboItem::create([
'user_abo_id' => $user_abo->id,
'product_id' => $product->id,
'comp' => 0,
'qty' => 1,
'status' => 1,
]);
AboItemHistoryService::logProductAdded($user_abo, $newItem, 0, $view);
}
}
}
// updateCart
if ($data['action'] === 'updateCart') {
if (isset($data['product_id']) && $product = Product::find($data['product_id'])) {
if (isset($data['order_item_id']) && $UserAboItem = UserAboItem::find($data['order_item_id'])) {
if (isset($data['qty'])) {
$qtyBefore = $UserAboItem->qty;
$qty = (int) $data['qty'];
$qty = $qty < 1 ? 1 : $qty;
$qty = $qty > 100 ? 100 : $qty;
if ($isAddOnlyMode && $qty < $UserAboItem->qty) {
$qty = $UserAboItem->qty;
}
$UserAboItem->qty = $qty;
$UserAboItem->save();
AboItemHistoryService::logQtyChanged($user_abo, $UserAboItem, $qtyBefore, $qty, $view);
}
}
}
}
// removeFromCart
if ($data['action'] === 'removeFromCart') {
if ($isAddOnlyMode) {
return response()->json([
'response' => false,
'message' => __('abo.error_add_only_no_remove'),
], 403);
}
if (! isset($data['product_id']) || ! ($product = Product::find($data['product_id']))) {
$message = __('abo.product_not_found');
}
if (! isset($data['order_item_id']) || ! ($userAboItem = UserAboItem::find($data['order_item_id']))) {
$message = __('abo.abo_item_not_found');
}
$has_basis_product = $this->checkNeedBasisProduct($user_abo, $product, $data['order_item_id']);
if (! $has_basis_product) {
$message = __('abo.need_basis_product');
}
if (! $message) {
AboItemHistoryService::logProductRemoved($user_abo, $userAboItem, $view);
$userAboItem->delete();
$user_abo->refresh();
}
}
// updateCompProduct
if ($data['action'] === 'updateCompProduct') {
if ($UserAboItem = UserAboItem::where('user_abo_id', $user_abo->id)->where('comp', $data['comp_num'])->first()) {
$oldProduct = $UserAboItem->product;
$UserAboItem->product_id = $data['comp_product_id'];
$UserAboItem->save();
$UserAboItem->load('product');
AboItemHistoryService::logCompProductChanged($user_abo, $UserAboItem, $oldProduct, $UserAboItem->product, $view);
} else {
$newItem = UserAboItem::create([
'user_abo_id' => $user_abo->id,
'product_id' => $data['comp_product_id'],
'comp' => $data['comp_num'],
'qty' => 1,
'status' => 1,
]);
AboItemHistoryService::logProductAdded($user_abo, $newItem, 0, $view);
}
}
AboOrderCart::initYard($user_abo);
AboOrderCart::makeOrderYard($user_abo);
AboOrderCart::checkNumOfCompProducts($user_abo);
$error_message = $message ? $message : false;
$html_cart = view('admin.abo._order_abo_show', ['user_abo' => $user_abo, 'error_message' => $error_message, 'add_only_mode' => $isAddOnlyMode])->render();
$html_comp = view('user.order.comp_product', $data)->render();
$amount = $user_abo->getFormattedAmount();
return response()->json(['response' => true, 'data' => $data, 'html_cart' => $html_cart, 'html_comp' => $html_comp, 'amount' => $amount]);
}
}
}
public function datatable($user_abo_id)
{
$user_abo = UserAbo::findOrFail($user_abo_id);
$this->checkPortalPermission($user_abo);
$show_on_ids = ['12', '13'];
$query = Product::select('products.*')
->where('active', true)
->where(function ($q) use ($show_on_ids) {
foreach ($show_on_ids as $id) {
$q->orWhereJsonContains('show_on', $id);
}
})
->orderByRaw(
"CASE
WHEN JSON_CONTAINS(show_on, ?, '$') THEN 1
WHEN JSON_CONTAINS(show_on, ?, '$') THEN 2
ELSE 3 END",
[$show_on_ids[0], isset($show_on_ids[1]) ? $show_on_ids[1] : $show_on_ids[0]]
);
return \DataTables::eloquent($query)
->addColumn('add_card', function (Product $product) {
$tax_free = Yard::instance('shopping')->getUserTaxFree();
$price = $product->getFormattedPriceWith($tax_free, false, Yard::instance('shopping')->getUserCountry());
return '<button type="button" class="btn btn-sm btn-md-extra btn-secondary add-product-basket" data-product-id="'.$product->id.'" data-product-name="'.e($product->getLang('name')).'" data-product-price="'.$price.' &euro;">
<strong>&euro; '.$price.'</strong>&nbsp; +<span class="ion ion-md-cart"></span>
</button>';
})
->addColumn('picture', function (Product $product) {
if (count($product->images)) {
return '<img class="img-fluid img-extra" alt="" src="'.route('product_image', [$product->images->first()->slug]).'">';
}
return '';
})
->addColumn('name', function (Product $product) {
return '<strong>'.$product->getLang('name').'</strong><br>'.get_abo_type_badge_by_product($product);
})
->addColumn('points', function (Product $product) {
return '<span class="no-line-break">'.$product->getFormattedPoints().'</span>';
})
->addColumn('price_net', function (Product $product) {
return '<span class="no-line-break">'.$product->getFormattedPriceWith(true, false, Yard::instance('shopping')->getUserCountry()).' €</span>'.'<span class="no-line-break">'.$product->getFormattedPriceCurrencyWith(true, true, Yard::instance('shopping')->getUserCountry()).'</span>';
})
->addColumn('price_gross', function (Product $product) {
return '<span class="no-line-break">'.$product->getFormattedPriceWith(false, false, Yard::instance('shopping')->getUserCountry()).' €</span>'.'<span class="no-line-break">'.$product->getFormattedPriceCurrencyWith(true, true, Yard::instance('shopping')->getUserCountry()).'</span>';
})
->addColumn('action', function (Product $product) {
return '<button class="btn btn-default btn-sm icon-btn md-btn-flat product-tooltip" title="details" data-modal="modal-lg"
data-toggle="modal" data-target="#modals-load-content" data-id="'.$product->id.'" data-route="'.route('portal.loading_modal').'"
data-action="user-order-show-product" data-view="customer"><i class="ion ion-md-eye"></i></button>';
})
->filterColumn('product', function ($query, $keyword) {
if ($keyword != '') {
$query->where('name', 'LIKE', '%'.$keyword.'%');
}
})
->orderColumn('name', 'name $1')
->orderColumn('product', 'name $1')
->orderColumn('number', 'number $1')
->orderColumn('points', 'points $1')
->orderColumn('price_net', 'price_net $1')
->orderColumn('price_gross', 'price_gross $1')
->orderColumn('contents_total', 'contents_total $1')
->orderColumn('weight', 'weight $1')
->rawColumns(['add_card', 'points', 'product', 'name', 'quantity', 'picture', 'price_net', 'price_gross', 'action'])
->make(true);
}
public function modalLoad()
{
$data = Request::all();
$ret = '';
if (isset($data['action'])) {
if ($data['action'] === 'abo-add-product') {
$user_abo = UserAbo::find($data['id']);
$this->checkPortalPermission($user_abo);
$ret = view('user.abo.modal_abo_show_products', compact('data', 'user_abo'))->render();
}
if ($data['action'] === 'abo_update_settings') {
$user_abo = UserAbo::find($data['id']);
$this->checkPortalPermission($user_abo);
$route = route('user_abos_update', [$data['view'], $user_abo->id]);
$ret = view('admin.abo.modal_abo_update', compact('user_abo', 'data', 'route'))->render();
}
if ($data['action'] === 'user-order-show-product') {
$product = Product::find($data['id']);
$ret = view('admin.modal.show_product', compact('product', 'data'))->render();
}
}
if (Request::ajax()) {
return response()->json(['response' => $data, 'html' => $ret, 'status' => true]);
}
abort(404);
}
public function checkNeedBasisProduct($user_abo, $product, $order_item_id)
{
if (AboHelper::getAboShowOn($product) !== 'base') {
return true;
}
foreach ($user_abo->user_abo_items as $user_abo_item) {
if ($user_abo_item->id == $order_item_id) {
continue;
}
if ($user_abo_item->comp) {
continue;
}
if (AboHelper::getAboShowOn($user_abo_item->product) === 'base') {
return true;
}
}
return false;
}
private function checkPortalPermission($user_abo)
{
$user = Auth::guard('customers')->user();
if (! $user || ! $user->shopping_user_id) {
abort(403, 'Unauthorized action.');
}
$shopping_user = ShoppingUser::find($user->shopping_user_id);
if (! $shopping_user || $user_abo->email !== $shopping_user->billing_email) {
abort(403, 'Unauthorized action.');
}
}
public function myAboCreate($step)
{
$user = Auth::guard('customers')->user();
if (!$user->shopping_user_id) {
if (! $user->shopping_user_id) {
abort(403, 'Unauthorized action.');
}
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$data = $this->prepareAboCreateData($shopping_user, $step);
if(isset($data['checkout_url'])){
if (isset($data['checkout_url'])) {
return redirect($data['checkout_url']);
}
return view('portal.abo.my_abo_create', $data);
}
@ -81,16 +356,16 @@ class AboController extends Controller
$data = [
'shopping_user' => $shopping_user,
'basis_products' => Product::where('active', true)
->whereJsonContains('show_on', ['12'])
->orderBy('pos', 'ASC')
->get(),
->whereJsonContains('show_on', ['12'])
->orderBy('pos', 'ASC')
->get(),
'upgrade_products' => Product::where('active', true)
->whereJsonContains('show_on', ['13'])
->orderBy('pos', 'ASC')
->get(),
->whereJsonContains('show_on', ['13'])
->orderBy('pos', 'ASC')
->get(),
'step' => 0,
];
if(Request::get('action') == 'back') {
if (Request::get('action') == 'back') {
$step = $step - 2;
}
@ -110,14 +385,14 @@ class AboController extends Controller
case 3:
UserService::setInstance($this->instance);
UserService::initCustomerYard($shopping_user, 'abo-ot-customer');
if(Request::get('action') == 'next'){
if (!$this->checkBasisProduct()) {
if (Request::get('action') == 'next') {
if (! $this->checkBasisProduct()) {
$data['error'] = __('abo.abo_error_basis_product');
$data['step'] = 2;
} else {
$data['step'] = 3;
}
}else{
} else {
$data['step'] = 3;
}
break;
@ -128,12 +403,12 @@ class AboController extends Controller
$data['step'] = 4;
break;
case 5:
//chekout verarbeiten
// chekout verarbeiten
UserService::setInstance($this->instance);
UserService::initCustomerYard($shopping_user, 'abo-ot-customer');
if(Request::get('action') == 'checkout'){
//checkout verarbeiten
if (!$this->preCheckCheckout()) {
if (Request::get('action') == 'checkout') {
// checkout verarbeiten
if (! $this->preCheckCheckout()) {
$data['error'] = __('abo.abo_error_basis_product');
$data['step'] = 4;
} else {
@ -152,8 +427,8 @@ class AboController extends Controller
private function initYard($shopping_user)
{
$delivery_country = $shopping_user->getDeliveryCountry(true);
if (!$delivery_country) {
if (! $delivery_country) {
abort(404, 'No delivery country found, please edit your personal data.');
}
@ -164,55 +439,55 @@ class AboController extends Controller
Shop::initUserShopLang($delivery_country, $this->instance);
}
private function preCheckCheckout(){
private function preCheckCheckout()
{
$result = false;
//alle inhlate des warenkorb
// alle inhlate des warenkorb
$cartItems = $this->yard->content();
foreach($cartItems as $item){
if(in_array(12, $item->options->show_on)){
foreach ($cartItems as $item) {
if (in_array(12, $item->options->show_on)) {
$result = true;
}
}
return $result;
}
private function checkBasisProduct()
{
$data = Request::all();
$result = false;
if (!isset($data['base_product_qty'])) {
if (! isset($data['base_product_qty'])) {
return false;
}
foreach ($data['base_product_qty'] as $product_id => $quantity) {
$product = Product::find($product_id);
if (!$product || intval($quantity) <= 0) {
if (! $product || intval($quantity) <= 0) {
continue;
}
$result = true;
$this->addProductToCart($product, $quantity);
}
return $result;
}
private function upgradeProductToCart(){
private function upgradeProductToCart()
{
$data = Request::all();
$result = false;
if (!isset($data['upgrade_product_qty'])) {
if (! isset($data['upgrade_product_qty'])) {
return false;
}
foreach ($data['upgrade_product_qty'] as $product_id => $quantity) {
$product = Product::find($product_id);
if (!$product) {
if (! $product) {
continue;
}
@ -226,7 +501,7 @@ class AboController extends Controller
private function addProductToCart($product, $quantity)
{
// Suche nach dem Produkt im Warenkorb
$cartItems = $this->yard->search(function($item) use ($product) {
$cartItems = $this->yard->search(function ($item) use ($product) {
return $item->id === $product->id;
});
@ -235,13 +510,14 @@ class AboController extends Controller
foreach ($cartItems as $item) {
$this->yard->remove($item->rowId);
}
return;
}
$image = $product->images->first()->slug ?? '';
$price = $product->getPriceWith(
$this->yard->getUserTaxFree(),
false,
$this->yard->getUserTaxFree(),
false,
$this->yard->getUserCountry()
);
@ -265,7 +541,7 @@ class AboController extends Controller
'points' => $product->points,
'no_commission' => $product->no_commission,
'no_free_shipping' => $product->no_free_shipping,
'show_on' => $product->show_on
'show_on' => $product->show_on,
]
);
}
@ -274,15 +550,15 @@ class AboController extends Controller
$this->yard->reCalculateShippingPrice();
}
private function processCheckout(){
private function processCheckout()
{
$user_shop = Util::getUserShop();
if(!$user_shop){
if (! $user_shop) {
$user_shop = Util::getDefaultUserShop();
}
do {
$identifier = Util::getToken();
} while( ShoppingInstance::where('identifier', $identifier)->count() );
} while (ShoppingInstance::where('identifier', $identifier)->count());
$data = [];
$data['is_from'] = 'shopping';
@ -291,7 +567,7 @@ class AboController extends Controller
ShoppingInstance::create([
'identifier' => $identifier,
'user_shop_id' => $user_shop->id,
'payment' => 1, //Customer Shop Payment
'payment' => 1, // Customer Shop Payment
'subdomain' => url('/'),
'country_id' => $this->yard->getShippingCountryId(),
'language' => \App::getLocale(),
@ -299,13 +575,14 @@ class AboController extends Controller
'back' => url()->previous(),
]);
$this->yard->store($identifier);
//add to DB
$path = route('checkout.checkout_card', ['identifier'=>$identifier]);
if(strpos($path, 'https') === false){
// add to DB
$path = route('checkout.checkout_card', ['identifier' => $identifier]);
if (strpos($path, 'https') === false) {
$path = str_replace('http', 'https', $path);
}
return $path;
}
}

View file

@ -2,13 +2,12 @@
namespace App\Http\Controllers\Portal;
use App\Http\Controllers\Controller;
use App\Models\ShoppingUser;
use App\Services\CustomerPriority;
use Auth;
use Request;
use Validator;
use App\Models\ShoppingUser;
use App\Services\CustomerPriority;
use App\Http\Controllers\Controller;
class CustomerController extends Controller
{
@ -22,49 +21,48 @@ class CustomerController extends Controller
$this->middleware('auth:customers');
}
public function myDataEdit()
{
$user = Auth::guard('customers')->user();
if($user->shopping_user_id){
if ($user->shopping_user_id) {
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
}else{
$shopping_user = new ShoppingUser();
} else {
$shopping_user = new ShoppingUser;
}
$data = [
'shopping_user' => $shopping_user,
'isAdmin' => false,
'isView' => 'customer',
];
return view('portal.customer.edit', $data);
return view('portal.customer.edit', $data);
}
public function myDataStore(){
public function myDataStore()
{
$user = Auth::guard('customers')->user();
$data = Request::all();
if($data['action'] === 'shopping-user-store-new' || $data['action']==='shopping-user-store'){
$rules = array(
if ($data['action'] === 'shopping-user-store-new' || $data['action'] === 'shopping-user-store') {
$rules = [
'billing_salutation' => 'required',
'billing_firstname'=>'required',
'billing_lastname'=>'required',
'billing_address'=>'required',
'billing_zipcode'=>'required',
'billing_firstname' => 'required',
'billing_lastname' => 'required',
'billing_address' => 'required',
'billing_zipcode' => 'required',
'billing_city' => 'required',
'billing_country_id' => 'required',
);
];
if(!Request::get('same_as_billing')){
if (! Request::get('same_as_billing')) {
$rules = array_merge($rules, [
'shipping_firstname'=>'required',
'shipping_lastname'=>'required',
'shipping_address'=>'required',
'shipping_zipcode'=>'required',
'shipping_firstname' => 'required',
'shipping_lastname' => 'required',
'shipping_address' => 'required',
'shipping_zipcode' => 'required',
'shipping_city' => 'required',
'shipping_salutation' => 'required',
'shipping_country_id' => 'required'
'shipping_country_id' => 'required',
]);
}
$validator = Validator::make(Request::all(), $rules);
@ -72,28 +70,31 @@ class CustomerController extends Controller
return back()->withErrors($validator)->withInput(Request::all());
}
}
$data['language'] = \App::getLocale();
$data['language'] = $data['language'] ?? \App::getLocale();
$data['same_as_billing'] = isset($data['same_as_billing']) ? true : false;
$data['shipping_country_id'] = isset($data['shipping_country_id']) ? $data['shipping_country_id'] : $data['billing_country_id'];
if($user->shopping_user_id){
if ($user->shopping_user_id) {
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$shopping_user->fill($data);
$shopping_user->save();
}else{
// Sprachpräferenz auch im Customer-Modell für Portal-UI synchronisieren
if (isset($data['language'])) {
$user->update(['language' => $data['language']]);
}
} else {
$data['billing_email'] = $user->email;
$shopping_user = ShoppingUser::create($data);
$user->shopping_user_id = $shopping_user->id;
if (isset($data['language'])) {
$user->language = $data['language'];
}
$user->save();
//kundenhoheit
// kundenhoheit
CustomerPriority::checkOne(ShoppingUser::find($shopping_user->id), true);
}
\Session()->flash('alert-save', true);
return redirect(route('portal.my_data.edit'));
}
}

View file

@ -5,68 +5,202 @@ namespace App\Http\Controllers\Portal;
use App\Http\Controllers\Controller;
use App\Models\Product;
use App\Models\ShoppingOrder;
use App\Models\ShoppingPayment;
use App\Models\ShoppingUser;
use App\Services\Payment;
use App\Services\Shop;
use App\Services\Util;
use Auth;
use Request;
use Validator;
use Yard;
class OrderController extends Controller
{
private $instance = 'webshop';
/**
* Create a new controller instance.
*
* @return void
*/
private string $instance = 'webshop';
public function __construct()
{
$this->middleware('auth:customers');
}
/**
* Bestellübersicht anzeigen.
*/
public function myOrders()
{
$user = Auth::guard('customers')->user();
if($user->shopping_user_id){
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$shopping_orders = $shopping_user->getAllOrdersByMember();
}else{
$shopping_user = new ShoppingUser();
$shopping_orders = [];
}
$data = [
'shopping_user' => $shopping_user,
'shopping_orders' => $shopping_orders,
];
return view('portal.order.my_orders', $data);
return view('portal.order.my_orders');
}
public function myOrderShow($id)
/**
* DataTable-Daten für Bestellübersicht (server-side).
*/
public function ordersDatatable()
{
$user = Auth::guard('customers')->user();
if (! $user->shopping_user_id) {
return \DataTables::of(collect())->make(true);
}
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$shopping_order = ShoppingOrder::findOrFail($id);
if($shopping_order->shopping_user_id != $user->shopping_user_id){
$userIds = ShoppingUser::where('billing_email', $shopping_user->billing_email)
->where('member_id', $shopping_user->member_id)
->pluck('id');
$query = ShoppingOrder::with('shopping_user')
->select('shopping_orders.*')
->whereIn('shopping_user_id', $userIds)
->whereNotNull('txaction');
return \DataTables::eloquent($query)
->addColumn('id', function (ShoppingOrder $order) {
return '<a href="'.route('portal.my_orders.show', $order->id).'" '
.'class="btn icon-btn btn-sm btn-primary"><span class="fa fa-eye"></span></a>';
})
->addColumn('created_at', function (ShoppingOrder $order) {
return $order->created_at->format('d.m.Y');
})
->addColumn('total_shipping', function (ShoppingOrder $order) {
return '<span class="no-line-break">'.$order->getFormattedTotalShipping().' €</span>';
})
->addColumn('txaction', function (ShoppingOrder $order) {
return Payment::getShoppingOrderBadge($order);
})
->addColumn('shipped', function (ShoppingOrder $order) {
return '<span class="badge badge-pill badge-'.$order->getShippedColor().'">'
.$order->getShippedType().'</span>';
})
->addColumn('firstname', function (ShoppingOrder $order) {
return $order->shopping_user->billing_firstname ?? '-';
})
->addColumn('lastname', function (ShoppingOrder $order) {
return $order->shopping_user->billing_lastname ?? '-';
})
->addColumn('email', function (ShoppingOrder $order) {
return $order->shopping_user->billing_email ?? '-';
})
->addColumn('invoice', function (ShoppingOrder $order) {
if ($order->isInvoice()) {
return '<span class="no-line-break">'
.'<a href="'.route('storage_file', [$order->id, 'invoice', 'download']).'" '
.'class="btn btn-primary btn-xs"><i class="fa fa-download"></i></a> '
.'<a href="'.route('storage_file', [$order->id, 'invoice', 'stream']).'" '
.'target="_blank" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a>'
.'</span>';
}
return '-';
})
->addColumn('payment_for', function (ShoppingOrder $order) {
return Payment::getPaymentForBadge($order);
})
->orderColumn('id', 'shopping_orders.id $1')
->orderColumn('created_at', 'shopping_orders.created_at $1')
->orderColumn('total_shipping', 'shopping_orders.total_shipping $1')
->orderColumn('txaction', 'shopping_orders.txaction $1')
->orderColumn('shipped', 'shopping_orders.shipped $1')
->rawColumns(['id', 'txaction', 'payment_for', 'total_shipping', 'invoice', 'shipped'])
->make(true);
}
/**
* Bestelldetail anzeigen.
*/
public function myOrderShow(int $id)
{
$user = Auth::guard('customers')->user();
if (! $user->shopping_user_id) {
abort(403, 'Unauthorized action.');
}
$shopping_order = ShoppingOrder::with('shopping_user', 'shopping_order_items.product.images')
->findOrFail($id);
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
if (! $this->orderBelongsToMember($shopping_order, $shopping_user)) {
abort(403, 'Unauthorized action.');
}
return view('portal.order.my_order_show', [
'shopping_order' => $shopping_order,
'shopping_user' => $shopping_user,
]);
}
public function myOrderCreate($id)
/**
* DataTable-Daten für Zahlungen einer Bestellung (server-side).
*/
public function paymentsDatatable(int $id)
{
$user = Auth::guard('customers')->user();
if (! $user->shopping_user_id) {
return \DataTables::of(collect())->make(true);
}
$shopping_order = ShoppingOrder::findOrFail($id);
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
if (! $this->orderBelongsToMember($shopping_order, $shopping_user)) {
abort(403, 'Unauthorized action.');
}
$query = ShoppingPayment::where('shopping_order_id', $id);
$counter = 0;
return \DataTables::eloquent($query)
->addColumn('line_number', function (ShoppingPayment $payment) use (&$counter) {
$counter++;
return $counter;
})
->addColumn('payment_type', function (ShoppingPayment $payment) {
return $payment->getPaymentType();
})
->addColumn('amount', function (ShoppingPayment $payment) {
return $payment->getPaymentAmount();
})
->addColumn('status', function (ShoppingPayment $payment) {
return Payment::getShoppingPaymentBadge($payment);
})
->addColumn('created_at', function (ShoppingPayment $payment) {
return $payment->created_at->format('d.m.Y H:i');
})
->addColumn('reference', function (ShoppingPayment $payment) {
return $payment->reference;
})
->rawColumns(['status'])
->make(true);
}
/**
* Prüft, ob Bestellung zum Mitglied gehört (billing_email + member_id).
*/
private function orderBelongsToMember(ShoppingOrder $order, ShoppingUser $member): bool
{
$orderUser = $order->shopping_user;
return $orderUser
&& $orderUser->billing_email === $member->billing_email
&& $orderUser->member_id === $member->member_id;
}
/**
* Bestellung erneut in den Warenkorb legen.
*/
public function myOrderCreate(int $id)
{
$user = Auth::guard('customers')->user();
$shopping_order = ShoppingOrder::findOrFail($id);
if($shopping_order->shopping_user_id != $user->shopping_user_id){
abort(403, 'Unauthorized action.');
if ($shopping_order->shopping_user_id != $user->shopping_user_id) {
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
if (! $this->orderBelongsToMember($shopping_order, $shopping_user)) {
abort(403, 'Unauthorized action.');
}
}
$shopping_user = ShoppingUser::findOrFail($user->shopping_user_id);
$delivery_country = $shopping_user->getDeliveryCountry(true);
@ -76,41 +210,50 @@ class OrderController extends Controller
Shop::initUserShopLang($delivery_country, $this->instance);
//init Yard
foreach($shopping_order->shopping_order_items as $shopping_order_item){
if($shopping_order_item->product){
$this->addToCard($shopping_order_item->product_id, $shopping_order_item->qty);
foreach ($shopping_order->shopping_order_items as $item) {
if ($item->product) {
$this->addToCart($item->product_id, $item->qty);
}
}
$url = Util::getMyMivitaShopUrl("/user/card/show");
return redirect($url);
return redirect(Util::getMyMivitaShopUrl('/user/card/show'));
}
private function addToCard($id, $quantity = 1)
private function addToCart(int $productId, int $quantity = 1): void
{
$product = Product::find($id);
if($product){
$image = "";
if($product->images->count()){
$image = $product->images->first()->slug;
}
$cartItem = Yard::instance($this->instance)
->add($product->id, $product->getLang('name'), $quantity,
$product->getPriceWith(Yard::instance($this->instance)->getUserTaxFree(), false, Yard::instance($this->instance)->getUserCountry()), 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(Yard::instance($this->instance)->getUserTaxFree()){
Yard::setTax($cartItem->rowId, 0);
}else{
Yard::setTax($cartItem->rowId, $product->getTaxWith(Yard::instance($this->instance)->getUserCountry()));
}
Yard::instance($this->instance)->reCalculateShippingPrice();
\Session()->flash('show-card-after-add', true);
$product = Product::find($productId);
if (! $product) {
return;
}
$image = $product->images->first()?->slug ?? '';
$yard = Yard::instance($this->instance);
$cartItem = $yard->add(
$product->id,
$product->getLang('name'),
$quantity,
$product->getPriceWith($yard->getUserTaxFree(), false, $yard->getUserCountry()),
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 ($yard->getUserTaxFree()) {
Yard::setTax($cartItem->rowId, 0);
} else {
Yard::setTax($cartItem->rowId, $product->getTaxWith($yard->getUserCountry()));
}
$yard->reCalculateShippingPrice();
\Session()->flash('show-card-after-add', true);
}
}