app\Order::placeOrders PHP Method

placeOrders() public static method

Start the checkout process for any type of order.
public static placeOrders ( integer $type_order ) : app\Response
$type_order integer Type of order to be processed
return app\Response
    public static function placeOrders($type_order)
    {
        $cart = self::ofType($type_order)->auth()->whereStatus('open')->orderBy('id', 'desc')->first();
        $show_order_route = $type_order == 'freeproduct' ? 'freeproducts.show' : 'orders.show_cart';
        $cartDetail = OrderDetail::where('order_id', $cart->id)->get();
        $address_id = 0;
        //When address is invalid, it is because it comes from the creation of a free product. You must have a user direction (Default)
        if (is_null($cart->address_id)) {
            $useraddress = Address::auth()->orderBy('default', 'DESC')->first();
            if ($useraddress) {
                $address_id = $useraddress->address_id;
            } else {
                return trans('address.no_registered');
            }
        } else {
            $address_id = $cart->address_id;
        }
        $address = Address::where('id', $address_id)->first();
        //Checks if the user has points for the cart price and the store has stock
        //and set the order prices to the current ones if different
        //Creates the lists or sellers to send mail to
        $total_points = 0;
        $seller_email = [];
        foreach ($cartDetail as $orderDetail) {
            $product = Product::find($orderDetail->product_id);
            $seller = User::find($product->user_id);
            if (!in_array($seller->email, $seller_email)) {
                $seller_email[] = $seller->email;
            }
            $total_points += $orderDetail->quantity * $product->price;
            if ($orderDetail->price != $product->price) {
                $orderDetail->price = $product->price;
                $orderDetail->save();
            }
            if ($product->type != 'item') {
                $virtual = VirtualProduct::where('product_id', $orderDetail->product_id)->get();
                $first = $virtual->first();
                //$first=null;
                //foreach ($virtual as $row){
                //$first=$row;
                //break;
                //}
                switch ($product->type) {
                    case 'key':
                    case 'software_key':
                        $virtualOrder = VirtualProductOrder::where('virtual_product_id', $first->id)->where('order_id', $orderDetail->order_id)->where('status', 1)->get();
                        if (count($virtual) - 1 < count($virtualOrder)) {
                            return trans('store.insufficientStock');
                        }
                        break;
                    default:
                        break;
                }
            } elseif ($product->stock < $orderDetail->quantity) {
                return trans('store.insufficientStock');
            }
        }
        //Checks if the user has points for the cart price
        $user = \Auth::user();
        if ($user->current_points < $total_points && config('app.payment_method') == 'Points') {
            return trans('store.cart_view.insufficient_funds');
        }
        if (config('app.payment_method') == 'Points') {
            $negativeTotal = -1 * $total_points;
            //7 is the action type id for order checkout
            $pointsModified = $user->modifyPoints($negativeTotal, 7, $cart->id);
        } else {
            $pointsModified = true;
        }
        if ($pointsModified) {
            //Separate the order for each seller
            //Looks for all the different sellers in the cart
            $sellers = [];
            foreach ($cartDetail as $orderDetail) {
                if (!in_array($orderDetail->product->user_id, $sellers)) {
                    $sellers[] = $orderDetail->product->user_id;
                }
            }
            foreach ($sellers as $seller) {
                //Creates a new order and address for each seller
                $newOrder = new self();
                $newOrder->user_id = $user->id;
                $newOrder->address_id = $address->id;
                $newOrder->status = $type_order == 'freeproduct' ? 'paid' : 'open';
                $newOrder->type = $type_order == 'freeproduct' ? 'freeproduct' : 'order';
                $newOrder->seller_id = $seller;
                $newOrder->save();
                $newOrder->sendNotice();
                //moves the details to the new orders
                foreach ($cartDetail as $orderDetail) {
                    if ($orderDetail->product->user_id == $seller) {
                        $orderDetail->order_id = $newOrder->id;
                        $orderDetail->save();
                    }
                    //Increasing product counters.
                    ProductsController::setCounters($orderDetail->product, ['sale_counts' => trans('globals.product_value_counters.sale')], 'orders');
                    //saving tags in users preferences
                    if (trim($orderDetail->product->tags) != '') {
                        UserController::setPreferences('product_purchased', explode(',', $orderDetail->product->tags));
                    }
                }
            }
            //virtual products
            //Changes the stock of each product in the order
            foreach ($cartDetail as $orderDetail) {
                $product = Product::find($orderDetail->product_id);
                $product->stock = $product->stock - $orderDetail->quantity;
                $product->save();
                if ($product->type != 'item') {
                    $virtual = VirtualProduct::where('product_id', $orderDetail->product_id)->where('status', 'open')->get();
                    switch ($product->type) {
                        case 'key':
                            $first = VirtualProduct::where('product_id', $orderDetail->product_id)->where('status', 'cancelled')->first();
                            foreach ($virtual as $row) {
                                $virtualOrder = VirtualProductOrder::where('order_id', $cart->id)->where('virtual_product_id', $first->id)->where('status', 1)->first();
                                if ($virtualOrder) {
                                    $virtualOrder->virtual_product_id = $row->id;
                                    $virtualOrder->order_id = $orderDetail->order_id;
                                    $virtualOrder->status = 2;
                                    $virtualOrder->save();
                                    $row->status = 'paid';
                                    $row->save();
                                } else {
                                    break;
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }
            }
            foreach ($seller_email as $email) {
                $mailed_order = self::where('id', $newOrder->id)->with('details')->get()->first();
                //Send a mail to the user: Order has been placed
                $data = ['orderId' => $newOrder->id, 'order' => $mailed_order];
                //dd($data['order']->details,$newOrder->id);
                $title = trans('email.new_order_for_user.subject') . " (#{$newOrder->id})";
                Mail::queue('emails.neworder', compact('data', 'title'), function ($message) use($user) {
                    $message->to($user->email)->subject(trans('email.new_order_for_user.subject'));
                });
                //Send a mail to the seller: Order has been placed
                $title = trans('email.new_order_for_seller.subject') . " (#{$newOrder->id})";
                Mail::queue('emails.sellerorder', compact('data', 'title'), function ($message) use($email) {
                    $message->to($email)->subject(trans('email.new_order_for_seller.subject'));
                });
            }
            return;
        } else {
            return trans('store.insufficientFunds');
        }
    }

Usage Example

コード例 #1
0
 /**
  * Store a newly created resource in storage.
  *
  * @return Response
  */
 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();
     }
 }
All Usage Examples Of app\Order::placeOrders