middleware('active.account'); $this->aboRepository = $aboRepository; } public function index($view) { if ($view === 'me') { // Nur Abos des aktuellen Benutzers $user_abos = UserAbo::where('user_id', \Auth::user()->id) ->where('status', '>', 1); if ($user_abos->count() > 0) { return redirect(route('user_abos_detail', ['me', $user_abos->first()->id])); } return view('user.abo.index', [ 'user_abos' => [], 'view' => 'me', 'isAdmin' => false ]); } if ($view === 'ot') { $user_abos = UserAbo::where('member_id', \Auth::user()->id) ->where('status', '>', 1) ->where('is_for', 'ot') ->orderBy('id', 'desc') ->get(); return view('user.abo.index', [ 'user_abos' => $user_abos, 'view' => 'ot', 'isAdmin' => false ]); } // Standardfall, wenn weder 'me' noch 'ot' return view('user.abo.index', [ 'user_abos' => [], 'view' => 'me', 'isAdmin' => false ]); } public function detail($view, $id) { $data = Request::all(); $user_abo = UserAbo::findOrFail($id); $this->checkPermissions($view, $user_abo); //init Yard AboOrderCart::initYard($user_abo); //holt die aktuellen UserAccount Daten oder die Userdaten des Abo $customer_detail = AboOrderCart::getCustomerDetail(); AboOrderCart::makeOrderYard($user_abo); $comp_products = []; if ($user_abo->is_for === 'me') { $comp_products = Shop::getCompProducts('abo-me'); } $data = [ 'user_abo' => $user_abo, 'isAdmin' => false, 'customer_detail' => $customer_detail, 'view' => $view, 'comp_products' => $comp_products, ]; return view('user.abo.detail', $data); } public function update($view, $id) { $data = Request::all(); $user_abo = UserAbo::findOrFail($id); $this->checkPermissions($view, $user_abo); if (isset($data['action'])) { if ($data['action'] === 'abo_update_settings') { $user_abo = UserAbo::findOrFail($data['id']); $this->aboRepository->setModel($user_abo); $this->aboRepository->update($data); return redirect(route('user_abos_detail', [$view, $id])); } 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()) { $UserAboItem->qty = $UserAboItem->qty + 1; $UserAboItem->save(); } else { UserAboItem::create([ 'user_abo_id' => $user_abo->id, 'product_id' => $product->id, 'comp' => 0, 'qty' => 1, 'status' => 1, ]); } } } //updateCart if ($data['action'] === 'updateCart') { //product_id | order_item_id | cart_order_id | qty 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'])) { $qty = (int) $data['qty']; $qty = $qty < 1 ? 1 : $qty; $qty = $qty > 100 ? 100 : $qty; $UserAboItem->qty = $qty; $UserAboItem->save(); } } } } //removeFromCart if ($data['action'] === 'removeFromCart') { 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->check_need_basis_product($user_abo, $product, $data['order_item_id']); if (!$has_basis_product) { $message = __('abo.need_basis_product'); } if (!$message) { $userAboItem->delete(); $user_abo->refresh(); // Abo neu laden um die aktualisierten Items zu erhalten } } //updateCompProduct if ($data['action'] === 'updateCompProduct') { if ($UserAboItem = UserAboItem::where('user_abo_id', $user_abo->id)->where('comp', $data['comp_num'])->first()) { $UserAboItem->product_id = $data['comp_product_id']; $UserAboItem->save(); } else { UserAboItem::create([ 'user_abo_id' => $user_abo->id, 'product_id' => $data['comp_product_id'], 'comp' => $data['comp_num'], 'qty' => 1, 'status' => 1, ]); } } AboOrderCart::initYard($user_abo); AboOrderCart::makeOrderYard($user_abo); //reCalculateShippingPrice AboOrderCart::checkNumOfCompProducts($user_abo); //after reCalculateShippingPrice check it and remove or add comp product if ($user_abo->is_for === 'me') { $data['comp_products'] = Shop::getCompProducts('abo-me'); } $error_message = $message ? $message : false; $html_cart = view("admin.abo._order_abo_show", ['user_abo' => $user_abo, 'error_message' => $error_message])->render(); $html_comp = view("user.order.comp_product", $data)->render(); $amount = $user_abo->getFormattedAmount(); // $html_total = view("user.homeparty.show_total_order", ['homeparty' => $homeparty])->render(); return response()->json(['response' => true, 'data' => $data, 'html_cart' => $html_cart, 'html_comp' => $html_comp, 'amount' => $amount]); } } } public function check_need_basis_product($user_abo, $product, $order_item_id) { // Wenn das zu entfernende Produkt kein Basis-Produkt ist, keine weitere Prüfung nötig if (AboHelper::getAboShowOn($product) !== 'base') { return true; } // Prüfe ob noch ein anderes Basis-Produkt vorhanden ist foreach ($user_abo->user_abo_items as $user_abo_item) { if ($user_abo_item->id == $order_item_id) { continue; } if (AboHelper::getAboShowOn($user_abo_item->product) === 'base') { return true; } } return false; } public function datatable($user_abo_id) { $user_abo = UserAbo::findOrFail($user_abo_id); if (!$user_abo) { abort(404); } //$user_abo->is_for === 'me' $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) use ($user_abo) { $ufactor = $user_abo->is_for === 'me' ? true : false; $tax_free = $user_abo->is_for === 'me' ? true : Yard::instance('shopping')->getUserTaxFree(); return ''; }) ->addColumn('picture', function (Product $product) { if (count($product->images)) { return ''; } return ""; }) ->addColumn('name', function (Product $product) use ($user_abo) { return '' . $product->getLang('name') . '
' . get_abo_type_badge_by_product($product); }) ->addColumn('price_net', function (Product $product) use ($user_abo) { $ufactor = $user_abo->is_for === 'me' ? true : false; return '' . $product->getFormattedPriceWith(true, $ufactor, Yard::instance('shopping')->getUserCountry()) . " €" . '' . $product->getFormattedPriceCurrencyWith(true, true, Yard::instance('shopping')->getUserCountry()) . ''; }) ->addColumn('price_gross', function (Product $product) use ($user_abo) { $ufactor = $user_abo->is_for === 'me' ? true : false; return '' . $product->getFormattedPriceWith(false, $ufactor, Yard::instance('shopping')->getUserCountry()) . " €" . '' . $product->getFormattedPriceCurrencyWith(true, true, Yard::instance('shopping')->getUserCountry()) . ''; }) ->addColumn('action', function (Product $product) { return ''; }) ->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', 'product', 'name', 'quantity', 'picture', 'price_net', 'price_gross', 'action']) ->make(true); } private function checkPermissions($view, $user_abo) { if ($view === 'me' && $user_abo->is_for !== 'me') { abort(403, 'Unauthorized action. Is not for me'); } if ($view === 'ot' && $user_abo->is_for !== 'ot') { abort(403, 'Unauthorized action. Is not your customer'); } if ($view === 'me' && $user_abo->user_id !== \Auth::user()->id) { abort(403, 'Unauthorized action. Is not my abo'); } if ($view === 'ot' && $user_abo->member_id !== \Auth::user()->id) { abort(403, 'Unauthorized action. Is not my customer abo'); } } }