App\Http\Controllers\OrdersController::rateProduct PHP Method

rateProduct() public method

public rateProduct ( Illuminate\Http\Request $request )
$request Illuminate\Http\Request
    public function rateProduct(Request $request)
    {
        $detail_id = $request->get('detail_id');
        $product_rate = $request->get('product_rate');
        $product_comment = $request->get('product_comment');
        $user = \Auth::user();
        if ($user) {
            $detail = OrderDetail::find($detail_id);
            if ($detail) {
                //Checks if the order exists and belongs to the current user
                $order = Order::where('id', $detail->order_id)->where('user_id', $user->id)->first();
                if ($order && $order->rate == '') {
                    $product = Product::find($detail->product_id);
                    $product_old_rate = $product->rate_val ? $product->rate_val : 0;
                    $product_old_rate_count = $product->rate_count ? $product->rate_count : 0;
                    //Checks if it is the first time the product is rated
                    if ($product_old_rate_count == 0) {
                        $product->rate_val = $product_rate;
                        $product->rate_count = 1;
                    } else {
                        //Checks if the user has rated this product on this order before
                        if ($detail->rate) {
                            if ($product_old_rate > $product_rate) {
                                $product->rate_val = $product->rate_val - ($product_old_rate - $product_rate) / $product_old_rate_count;
                            }
                            if ($product_old_rate < $product_rate) {
                                $product->rate_val = $product->rate_val + ($product_rate - $product_old_rate) / $product_old_rate_count;
                            }
                        } else {
                            if ($product_old_rate > $product_rate) {
                                $product->rate_val = $product->rate_val - ($product_old_rate - $product_rate) / ($product_old_rate_count + 1);
                            }
                            if ($product_old_rate < $product_rate) {
                                $product->rate_val = $product->rate_val + ($product_rate - $product_old_rate) / ($product_old_rate_count + 1);
                            }
                            $product->rate_count = $product_old_rate_count + 1;
                        }
                    }
                    $seller_user = User::find($order->seller_id);
                    $email = $seller_user->email;
                    $mail_subject = trans('email.product_rated.subject');
                    $data = ['product_id' => $product->id, 'subject' => $mail_subject, 'email_message' => $mail_subject, 'email' => $email];
                    Mail::queue('emails.product_rated', $data, function ($message) use($user, $data) {
                        $message->to($data['email'])->subject($data['subject']);
                    });
                    $product->save();
                    $detail->rate = $product_rate;
                    $detail->rate_comment = $product_comment;
                    $detail->save();
                    Notice::create(['user_id' => $seller_user->id, 'sender_id' => $user->id, 'action_type_id' => 14, 'source_id' => $order->id, 'status' => 'new']);
                    return \Response::json(['success' => true, 'message' => trans('store.order_rate_view.http_messages.success'), 'detail_id' => $detail_id, 'product_rate' => $product_rate], 200);
                } else {
                    return \Response::json(['success' => false, 'message' => trans('store.order_rate_view.http_messages.no_order'), 'detail_id' => $detail_id, 'product_rate' => $product_rate], 200);
                }
            } else {
                return \Response::json(['success' => false, 'message' => trans('store.order_rate_view.http_messages.no_user'), 'detail_id' => $detail_id, 'product_rate' => $product_rate], 200);
            }
        } else {
            return \Response::json(['success' => false, 'message' => trans('store.order_rate_view.http_messages.no_user'), 'detail_id' => $detail_id, 'product_rate' => $product_rate], 200);
        }
    }