public function store(Request $request)
{
try {
$validator = Validator::make($request->all(), $this->form_rules);
if ($validator->fails()) {
return redirect()->route('freeproducts.create', [$request->input('order_id')])->withErrors($validator->errors())->withInput();
}
//As is not defined that way is going to deliver products for every winner, I will confirm that the total winning is equal to total products in the cart
$cart_detail = OrderDetail::where('order_id', $request->input('order_id'))->get();
if ($request->input('draw_number') > $cart_detail->count()) {
return redirect()->route('freeproducts.create', [$request->input('order_id')])->withErrors(trans('freeproduct.drawnumber_exceed_total_products'))->withInput();
} else {
//Process the order. The process is the same as with a shopping cart. The address is not requested
//Direction is taken as the one with the user by default. Not having, it notifies the user to create a.
$errors = Order::placeOrders('freeproduct');
if ($errors) {
return redirect()->route('freeproducts.create', [$request->input('order_id')])->withErrors($errors)->withInput();
} else {
$user = \Auth::user();
//Save Free Product
$freeproduct = new FreeProduct();
$freeproduct->user_id = $user->id;
$freeproduct->description = $request->input('description');
$freeproduct->start_date = $request->input('start_date');
$freeproduct->end_date = $request->input('end_date');
$freeproduct->participation_cost = $request->input('participation_cost');
$freeproduct->min_participants = $request->input('min_participants');
$freeproduct->max_participants = $request->input('max_participants');
$freeproduct->max_participations_per_user = $request->input('max_participations_per_user');
$freeproduct->draw_number = $request->input('draw_number');
$freeproduct->draw_date = $request->input('draw_date');
$freeproduct->save();
//Because the method placeOrders products generates orders for each vendor, you need to associate these orders to free product
$orders = Order::ofType('freeproduct')->ofStatus('paid')->where('user_id', $user->id)->get();
if ($orders) {
foreach ($orders as $order) {
//Each order products are searched and a duplicate of the same is made, marking them as a free product. This will allow the product goes on the results of the advanced search
$order_detail = OrderDetail::where('order_id', $order->id)->get();
if ($order_detail) {
foreach ($order_detail as $detail) {
$product = Product::find($detail->product_id);
$productactual = $product->toArray();
unset($productactual['id']);
unset($productactual['num_of_reviews']);
$productactual['user_id'] = $user->id;
$productactual['stock'] = $detail->quantity;
$productactual['type'] = 'freeproduct';
$productactual['parent_id'] = $product->id;
$newproduct = Product::create($productactual);
}
}
if (!FreeProductOrder::where('order_id', $order->id)->first()) {
//order registration as a free product
$order_to_fp = new FreeProductOrder();
$order_to_fp->freeproduct_id = $freeproduct->id;
$order_to_fp->order_id = $order->id;
$order_to_fp->save();
}
}
}
//Send message process Ok and redirect
Session::flash('message', trans('freeproduct.saved_successfully'));
return redirect()->route('freeproducts.show', [$freeproduct->id]);
}
}
} catch (ModelNotFoundException $e) {
Log::error($e);
return redirect()->back()->withErrors(['induced_error' => [trans('freeproduct.error_exception')]])->withInput();
}
}