middleware('active.account');
}
public function index()
{
return view('user.order.index');
}
public function detail($id)
{
$user = User::find(Auth::user()->id);
$shopping_order = ShoppingOrder::findOrFail($id);
if ($shopping_order->auth_user_id !== $user->id) {
Log::channel(self::LOG_CHANNEL)->warning("Unauthorized access attempt to order #{$id} by user #{$user->id}");
abort(404);
}
if ($shopping_order->payment_for === 6 || $shopping_order->payment_for === 7) {
return redirect(route('user_shop_order_detail', [$shopping_order->id]));
}
$shopping_order->getLastShoppingPayment();
return view('user.order.detail', [
'shopping_order' => $shopping_order,
'isAdmin' => false,
]);
}
public function ordersDatatable()
{
$user = User::find(Auth::user()->id);
$query = ShoppingOrder::with('shopping_user', 'shopping_payments')
->select('shopping_orders.*')
->where('auth_user_id', '=', $user->id)
->where('txaction', '!=', null);
return \DataTables::eloquent($query)
->addColumn('id', function (ShoppingOrder $ShoppingOrder) {
return '';
})
->addColumn('created_at', function (ShoppingOrder $ShoppingOrder) {
return $ShoppingOrder->created_at->format('d.m.Y');
})
->addColumn('txaction', function (ShoppingOrder $ShoppingOrder) {
return Payment::getShoppingOrderBadge($ShoppingOrder);
})
->addColumn('total_shipping', function (ShoppingOrder $ShoppingOrder) {
return ''.$ShoppingOrder->getFormattedTotalShipping().' €';
})
->addColumn('payment', function (ShoppingOrder $ShoppingOrder) {
return $ShoppingOrder->getLastShoppingPayment('getPaymentType');
})
->addColumn('shipped', function (ShoppingOrder $ShoppingOrder) {
if ($ShoppingOrder->payment_for === 8) {
return '';
}
return ''.$ShoppingOrder->getShippedType().'';
})
->addColumn('payment_for', function (ShoppingOrder $ShoppingOrder) {
return Payment::getPaymentForBadge($ShoppingOrder);
})
->addColumn('invoice', function (ShoppingOrder $ShoppingOrder) {
return $ShoppingOrder->isInvoice() ? '
' : '-';
})
->addColumn('reference', function (ShoppingOrder $ShoppingOrder) {
return $ShoppingOrder->getLastShoppingPayment('reference');
})
->orderColumn('id', 'id $1')
->orderColumn('txaction', 'txaction $1')
->orderColumn('shipped', 'shipped $1')
->orderColumn('total_shipping', 'total_shipping $1')
->orderColumn('payment_for', 'payment_for $1')
->rawColumns(['id', 'txaction', 'payment_for', 'total_shipping', 'invoice', 'shipped'])
->make(true);
}
/*
$for = me, ot-member, ot-customer, abo-ot-member, abo-ot-customer, abo-me
*/
public function delivery($for, $id = null)
{
$user = User::find(Auth::user()->id);
$shopping_user = null;
$delivery_id = null;
if (strpos($for, 'ot') !== false) {
$shopping_user = Shop::checkShoppingUser($id, $user);
$delivery_id = $shopping_user->id;
if (! Shop::checkShoppingCountry($for, $delivery_id) && ! \Session()->has('custom-error')) {
$country = Shop::getDeliveryCountry($for, $delivery_id);
\Session()->flash('custom-error', $country.': '.__('validation.custom.shipping_not_found'));
Log::channel(self::LOG_CHANNEL)->error("Shipping country not found for user #{$user->id}, country: {$country}");
return redirect(route('user_order_my_delivery', [$for, $delivery_id]));
}
if ($for === 'abo-ot-customer') {
if (AboHelper::hasAboByEmail($shopping_user->billing_email) && ! \Session()->has('custom-error')) {
\Session()->flash('custom-error', __('abo.error_email_has_abo', ['email' => $shopping_user->billing_email]));
return redirect(route('user_order_my_delivery', [$for, $delivery_id]));
}
}
}
if (Request::get('action') === 'next') {
Yard::instance('shopping')->destroy();
if (strpos(Request::get('switchers-radio-is-for'), 'ot') !== false) {
$delivery_id = $id;
}
return redirect(route('user_order_my_list', [Request::get('switchers-radio-is-for'), $delivery_id]));
}
return view('user.order.delivery', [
'shopping_user' => $shopping_user,
'isAdmin' => false,
'isView' => 'customer',
'for' => $for,
'delivery_id' => $delivery_id,
]);
}
public function list($for, $id = null)
{
$user = User::find(Auth::user()->id);
if ($for === 'abo-me' && AboHelper::userHasAbo($user)) {
Log::channel(self::LOG_CHANNEL)->error("User #{$user->id} attempted to create abo but already has one");
abort(403, 'User has an Abo. Cannot order.');
}
$shopping_user = null;
$delivery_id = null;
if (strpos($for, 'ot') !== false) {
$shopping_user = Shop::checkShoppingUser($id, $user);
$delivery_id = $shopping_user->id;
}
if ($for === 'ot-customer' || $for === 'abo-ot-customer') {
UserService::initCustomerYard($shopping_user, $for);
} else {
$shipping_country_id = Shop::checkShoppingCountry($for, $id);
if (! $shipping_country_id) {
$country = Shop::getDeliveryCountry($for, $id);
\Session()->flash('custom-error', $country.': '.__('validation.custom.shipping_not_found'));
Log::channel(self::LOG_CHANNEL)->warning("Shipping country not found for user #{$user->id}, country: {$country}");
return redirect(route('user_order_my_delivery', [$for, $delivery_id]));
}
UserService::initUserYard($user, $shipping_country_id, $for);
}
return view('user.order.list', [
'shopping_user' => $shopping_user,
'user' => $user,
'isAdmin' => false,
'isView' => 'customer',
'for' => $for,
'template' => str_replace('abo-', '', $for),
'delivery_id' => $delivery_id,
'is_abo' => strpos($for, 'abo') !== false,
'comp_products' => Shop::getCompProducts($for),
]);
}
public function payment($for, $id = null)
{
$data = Request::all();
$user = User::find(Auth::user()->id);
$rules = [
'shipping_salutation' => 'required',
'shipping_firstname' => 'required',
'shipping_lastname' => 'required',
'shipping_address' => 'required',
'shipping_zipcode' => 'required',
'shipping_city' => 'required',
'shipping_state' => 'required',
];
$validator = Validator::make(Request::all(), $rules);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput(Request::all());
}
try {
$this->checkSendYardForPayment($data, $id);
} catch (\Exception $e) {
Log::channel(self::LOG_CHANNEL)->error('Error checking yard for payment: '.$e->getMessage(), [
'user_id' => $user->id,
'for' => $for,
'id' => $id,
]);
return back()->withErrors(['error' => $e->getMessage()])->withInput(Request::all());
}
if (Yard::instance('shopping')->getNumComp() > 0) {
if (! isset($data['switchers-comp-product'])) {
$validator->errors()->add('switchers-comp-product', __('msg.please_select_compensation_product'));
} elseif (! is_array($data['switchers-comp-product'])) {
$validator->errors()->add('switchers-comp-product', __('msg.please_select_compensation_product'));
} elseif (count($data['switchers-comp-product']) !== Yard::instance('shopping')->getNumComp()) {
$validator->errors()->add('switchers-comp-product', __('mdg.please_select_count_compensation_products', ['count' => Yard::instance('shopping')->getNumComp()]));
}
if ($validator->errors()->count()) {
return back()->withErrors($validator)->withInput(Request::all());
}
}
// Generate unique identifier
do {
$identifier = Util::getToken();
} while (ShoppingInstance::where('identifier', $identifier)->count());
// Prepare common data
$data['is_from'] = 'user_order';
$data['is_for'] = $for;
$data['is_abo'] = $data['is_abo'] ?? 0;
$data['abo_interval'] = $data['abo_interval'] ?? 0;
$data['shopping_user_id'] = $id;
$data['user_price_infos'] = Yard::instance('shopping')->getUserPriceInfos();
$data['mode'] = config('app.mode') === 'test' ? 'test' : 'live';
// Remove unnecessary data
unset($data['quantity']);
unset($data['_token']);
if ($for === 'ot-customer' || $for === 'abo-ot-customer') {
return $this->processCustomerPayment($user, $identifier, $data, $id, $for);
} else {
return $this->processUserPayment($user, $identifier, $data, $id, $for);
}
}
/**
* Process payment for customer orders
*/
private function processCustomerPayment($user, $identifier, $data, $id, $for)
{
$shopping_user = ShoppingUser::find($id);
$shopping_instance = ShoppingInstance::create([
'identifier' => $identifier,
'user_shop_id' => $user->shop->id,
'payment' => 6, // Berater Shop to Customer Shop
'subdomain' => $user->shop->getSubdomain(),
'country_id' => Yard::instance('shopping')->getShippingCountryId(),
'language' => $shopping_user->getLocale(), // hier wird die Sprache des Kunden verwendet
'amount' => Yard::instance('shopping')->totalWithShipping(2, '.', ''),
'status' => 0,
'shopping_user_id' => $id,
'shopping_data' => $data,
'back' => url()->previous(),
]);
Yard::instance('shopping')->store($identifier);
$yard_shopping_items = OrderPaymentService::getRestoredYardShoppingItems($shopping_instance);
// Send Mail to Customer
try {
$this->customPaymentSendMail($user, $identifier, $yard_shopping_items, $data);
} catch (\Exception $e) {
Log::channel(self::LOG_CHANNEL)->error('Failed to send custom payment email: '.$e->getMessage(), [
'identifier' => $identifier,
'user_id' => $user->id,
]);
}
UserHistory::create([
'user_id' => $user->id,
'action' => 'user_order_customer',
'status' => 1,
'product_id' => null,
'identifier' => $identifier,
'is_abo' => $data['is_abo'],
]);
return redirect(route('user_order_my_custom_payment', ['identifier' => $identifier]));
}
/**
* Process payment for user orders
*/
private function processUserPayment($user, $identifier, $data, $id, $for)
{
Shop::deleteCheckoutInstance();
ShoppingInstance::create([
'identifier' => $identifier,
'user_shop_id' => 1, // is first faker shop for buy intern
'auth_user_id' => Auth::user()->id,
'payment' => 2, // Berater Shop
'subdomain' => url('/'),
'country_id' => Yard::instance('shopping')->getShippingCountryId(),
'language' => \App::getLocale(), // das ist richtig, hier wird die App-Locale verwendet da es vom user kommt
'amount' => Yard::instance('shopping')->totalWithShipping(2, '.', ''),
'status' => 0,
'shopping_user_id' => $id,
'shopping_data' => $data,
'back' => url()->previous(),
]);
Yard::instance('shopping')->store($identifier);
UserHistory::create([
'user_id' => $user->id,
'action' => 'user_order_payment',
'status' => 1,
'product_id' => null,
'identifier' => $identifier,
'is_abo' => $data['is_abo'],
]);
$path = route('checkout.checkout_card', ['identifier' => $identifier]);
return redirect()->secure($path);
}
/**
* Validate the yard before payment
*/
private function checkSendYardForPayment($data, $id)
{
$user = User::find(Auth::user()->id);
$shopping_user = null;
if (strpos($data['shipping_is_for'], 'ot') !== false) {
$shopping_user = Shop::checkShoppingUser($id, $user);
}
$shipping_country_id = Shop::checkShoppingCountry($data['shipping_is_for'], $id);
if (! $shipping_country_id) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
];
MyLog::writeLog('payment', 'error', 'no shipping_country_id found | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping country not found', $logData);
throw new \Exception(__('msg.shipping_country_was_not_found'));
}
// Must be the same shipping country
if ($shipping_country_id != Yard::instance('shopping')->getShippingCountryId()) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'expected' => $shipping_country_id,
'actual' => Yard::instance('shopping')->getShippingCountryId(),
];
MyLog::writeLog('payment', 'error', 'shipping_country_id is not the same from Yard | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping country mismatch', $logData);
throw new \Exception(__('msg.shipping_country_was_not_correctly'));
}
if ($data['shipping_is_for'] !== 'ot-customer') {
if (Yard::instance('shopping')->shipping_free) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
];
MyLog::writeLog('payment', 'error', 'Yard can by not shipping_free | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Yard cannot be shipping free', $logData);
throw new \Exception(__('msg.shopping_cart_was_shipping_free'));
}
}
if ($data['shipping_is_for'] === 'ot-customer') {
if (! $user->shop) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
];
MyLog::writeLog('payment', 'error', 'User has no Shop for an User to Customer order| Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('User has no shop for customer order', $logData);
throw new \Exception(__('msg.shopping_cart_was_not_user_shop'));
}
}
$shipping_price = Shop::getShippingPriceByShippingCountryId($shipping_country_id, Yard::instance('shopping')->weight());
// For other and has weight - check
if (strpos($data['shipping_is_for'], 'ot') !== false && $data['shipping_is_for'] !== 'ot-customer' && Yard::instance('shopping')->weight() > 0) {
// Prüfe ob Versandkostenfreiheit durch Freigrenze legitimiert ist
$shipping_free = Yard::instance('shopping')->getShippingFree();
$total = Yard::instance('shopping')->total(2, '.', '');
$isFreeDueToThreshold = $shipping_free && $total >= $shipping_free && Yard::instance('shopping')->weightByFreeShipping() == 0;
if (! Yard::instance('shopping')->getShippingPrice() || Yard::instance('shopping')->getShippingPrice() == 0) {
// Nur Fehler werfen, wenn Versandpreis 0 NICHT durch Freigrenze legitimiert ist
if (! $isFreeDueToThreshold) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'weight' => Yard::instance('shopping')->weight(),
'total' => $total,
'shipping_free' => $shipping_free,
];
MyLog::writeLog('payment', 'error', 'Yard OT shipping_price is 0 | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping price cannot be zero for order with weight', $logData);
throw new \Exception(__('msg.shipping_cost_cannot_be_0'));
}
}
// Preisvergleich nur durchführen, wenn NICHT versandkostenfrei durch Freigrenze
if (! $isFreeDueToThreshold && Yard::instance('shopping')->getShippingPrice() != $shipping_price->price) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'expected' => $shipping_price->price,
'actual' => Yard::instance('shopping')->getShippingPrice(),
];
MyLog::writeLog('payment', 'error', 'Yard OT shipping_price is not the same from shipping_price | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping price mismatch', $logData);
throw new \Exception(__('msg.shipping_costs_were_not_calculated_correctly'));
}
}
if (($data['shipping_is_for'] == 'me' || $data['shipping_is_for'] == 'abo-me') && Yard::instance('shopping')->weight() > 0) {
// Prüfe ob Versandkostenfreiheit durch Freigrenze legitimiert ist
$shipping_free = Yard::instance('shopping')->getShippingFree();
$total = Yard::instance('shopping')->total(2, '.', '');
$isFreeDueToThreshold = $shipping_free && $total >= $shipping_free && Yard::instance('shopping')->weightByFreeShipping() == 0;
if (! Yard::instance('shopping')->getShippingPrice() || Yard::instance('shopping')->getShippingPrice() == 0) {
// Nur Fehler werfen, wenn Versandpreis 0 NICHT durch Freigrenze legitimiert ist
if (! $isFreeDueToThreshold) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'weight' => Yard::instance('shopping')->weight(),
'total' => $total,
'shipping_free' => $shipping_free,
];
MyLog::writeLog('payment', 'error', 'Yard ME shipping_price is 0 | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping price cannot be zero for personal order with weight', $logData);
throw new \Exception(__('msg.shipping_cost_cannot_be_0'));
}
}
if (Shop::isCompProducts($data['shipping_is_for'])) {
// Preisvergleich nur durchführen, wenn NICHT versandkostenfrei durch Freigrenze
if (! $isFreeDueToThreshold && Yard::instance('shopping')->getShippingPrice() != $shipping_price->price_comp) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'expected' => $shipping_price->price_comp,
'actual' => Yard::instance('shopping')->getShippingPrice(),
];
MyLog::writeLog('payment', 'error', 'Yard ME shipping_price is not the same from shipping_price with comp products | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping price mismatch for personal order', $logData);
throw new \Exception(__('msg.shipping_costs_were_not_calculated_correctly'));
}
if (Yard::instance('shopping')->getNumComp() != $shipping_price->num_comp) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'expected' => $shipping_price->num_comp,
'actual' => Yard::instance('shopping')->getNumComp(),
];
MyLog::writeLog('payment', 'error', 'Yard num_comp is not correct | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Compensation product count mismatch', $logData);
throw new \Exception(__('msg.compensation_products_cannot_be_0'));
}
} else {
// Preisvergleich nur durchführen, wenn NICHT versandkostenfrei durch Freigrenze
if (! $isFreeDueToThreshold && Yard::instance('shopping')->getShippingPrice() != $shipping_price->price) {
$identifier = 'error-'.time().mt_rand(1000000, 9999999);
Yard::instance('shopping')->store($identifier);
$logData = [
'user_id' => Auth::user()->id,
'shopping_user_id' => $id,
'yard_identifier' => $identifier,
'expected' => $shipping_price->price,
'actual' => Yard::instance('shopping')->getShippingPrice(),
];
MyLog::writeLog('payment', 'error', 'Yard ME shipping_price is not the same from shipping_price without comp products | Yard identifier: '.$identifier, $data);
Log::channel(self::LOG_CHANNEL)->error('Shipping price mismatch for personal order', $logData);
throw new \Exception(__('msg.shipping_costs_were_not_calculated_correctly'));
}
}
}
}
public function datatable()
{
$isAbo = Request::get('is_abo');
$shippingIsFor = Request::get('shipping_is_for');
if ($shippingIsFor === 'me' || $shippingIsFor === 'abo-me') {
$show_on_ids = $isAbo ? ['12', '13'] : ['2'];
$query = Product::with('product_buyings')
->select('products.*')
->where('products.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]]
);
} else {
$show_on_ids = $isAbo ? ['12', '13'] : ['3'];
$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('product', function (Product $product) {
$cartItem = Yard::instance('shopping')->getCartItemByProduct($product->id);
$qty = isset($cartItem->qty) ? $cartItem->qty : 0;
$rowId = isset($cartItem->rowId) ? $cartItem->rowId : '';
return ''.$product->getLang('name').'