public function orderHistoryAjax(Request $request)
 {
     $response = new stdClass();
     if ($request->isMethod('post')) {
         $postData = $request->all();
         $objUserModel = new User();
         $objOrderModel = new Order();
         $objUsersmetaModel = new Usersmeta();
         $userId = isset($postData['user_id']) ? $postData['user_id'] : '';
         $authFlag = false;
         if (isset($postData['api_token'])) {
             $apiToken = $postData['api_token'];
             if ($apiToken == $this->API_TOKEN) {
                 $authFlag = true;
             } else {
                 if ($userId != '') {
                     $where = ['rawQuery' => 'id=?', 'bindParams' => [$userId]];
                     $selectColumn = array('login_token');
                     $userCredentials = $objUserModel->getUsercredsWhere($where, $selectColumn);
                     if ($apiToken == $userCredentials->login_token) {
                         $authFlag = true;
                     }
                 }
             }
         }
         if ($authFlag) {
             $validator = Validator::make($postData, ['user_id' => 'required']);
             if (!$validator->fails()) {
                 $requestParam = json_decode($postData['requestData'], true);
                 $iTotalRecords = $iDisplayLength = intval($requestParam['length']);
                 $iDisplayLength = $iDisplayLength < 0 ? $iTotalRecords : $iDisplayLength;
                 $iDisplayStart = intval($requestParam['start']);
                 $sEcho = intval($requestParam['draw']);
                 $whereOderUserID = ['rawQuery' => 'by_user_id=?', 'bindParams' => [$userId]];
                 $data = ['orders.order_id', 'orders.server_order_id', 'orders.ins_url', 'orders.quantity_total', 'orders.price', 'orders.quantity_done', 'orders.status', 'orders.added_time', 'orders.updated_time', 'plans.plan_name', 'plans.supplier_server_id'];
                 //GET TOTAL NUMBER OF NEW ORDERS
                 $iTotalRecords = count($objOrderModel->getOrderHistory($whereOderUserID, $data));
                 $iTotalFilteredRecords = $iTotalRecords;
                 $records = array();
                 $records["data"] = array();
                 $columns = array('orders.order_id', 'plans.plan_name', 'orders.ins_url', 'orders.quantity_total', 'orders.price', 'orders.added_time', 'orders.updated_time', 'orders.status');
                 $sortingOrder = "";
                 if (isset($requestParam['order'])) {
                     $sortingOrder = [$columns[$requestParam['order'][0]['column'] - 1], $requestParam['order'][0]['dir']];
                 }
                 //group action perform here
                 if (isset($requestParam["customActionType"]) && $requestParam["customActionType"] == "group_action") {
                     if ($requestParam['customActionName'] != '' && !empty($requestParam['orderId'])) {
                         $orderId = $requestParam['orderId'];
                         if ($requestParam['customActionName'] == 'cancel_order') {
                             //cancel the order(s)
                             $messages = array();
                             foreach ($orderId as $key => $order_id) {
                                 $orderStatus = $objOrderModel->getOrderStatus(['rawQuery' => 'order_id=?', 'bindParams' => [$order_id]], ['orders.status', 'orders.by_user_id', 'orders.price']);
                                 if ($orderStatus) {
                                     if ($orderStatus[0]->status == 0) {
                                         $rollback = false;
                                         DB::beginTransaction();
                                         DB::table('usersmeta')->where('user_id', '=', $orderStatus[0]->by_user_id)->lockForUpdate()->get();
                                         $oldAccountBal = $objUsersmetaModel->getUsermetaWhere(['rawQuery' => 'user_id=?', 'bindParams' => [$orderStatus[0]->by_user_id]], ['account_bal']);
                                         $newAccountBal = $oldAccountBal->account_bal + $orderStatus[0]->price;
                                         $queryResult = $objUsersmetaModel->updateUsermetaWhere(['rawQuery' => 'user_id=?', 'bindParams' => [$orderStatus[0]->by_user_id]], ['account_bal' => $newAccountBal]);
                                         if ($queryResult) {
                                             $result = $objOrderModel->updateOrder(['rawQuery' => 'order_id=?', 'bindParams' => [$order_id]], ['status' => 6]);
                                             DB::commit();
                                         } else {
                                             $rollback = true;
                                             DB::rollBack();
                                         }
                                         if (!$rollback) {
                                             $messages[$key] = "This order is now canceled and the money is deposited back in your account, order_id :" . $order_id . "\n";
                                         } else {
                                             $messages[$key] = "There is an problem in order #ID " . $order_id . " cancellation process.\n";
                                         }
                                     } else {
                                         if ($orderStatus[0]->status == 1 || $orderStatus[0]->status == 2 || $orderStatus[0]->status == 3 || $orderStatus[0]->status == 4 || $orderStatus[0]->status == 5) {
                                             $messages[$key] = "Your order with the ID #" . $order_id . " cannot be cancelled as its already been added on the system.\n";
                                         } else {
                                             if ($orderStatus[0]->status == 6) {
                                                 $messages[$key] = "Your order with the ID #" . $order_id . " has already cancelled.\n";
                                             }
                                         }
                                     }
                                 } else {
                                     $messages[$key] = "This order ID #" . $order_id . " is invalid \n";
                                 }
                             }
                             $records["customActionStatus"] = "OK";
                             // pass custom message(useful for getting status of group actions)
                             $records["customActionMessage"] = $messages;
                         }
                         if ($requestParam['customActionName'] == 'reAdd_order') {
                             //reAdd the order(s)
                             $messages = array();
                             foreach ($orderId as $key => $order_id) {
                                 $orderDetails = $objOrderModel->getOrderDetails(['rawQuery' => 'order_id=?', 'bindParams' => [$order_id]]);
                                 if ($orderDetails) {
                                     unset($orderDetails[0]->order_id);
                                     $data = "";
                                     foreach ($orderDetails[0] as $key => $value) {
                                         $data[$key] = $value;
                                     }
                                     $data['status'] = 0;
                                     $data['start_time'] = time() + 600;
                                     $data['added_time'] = time();
                                     $data['updated_time'] = time();
                                     $data['initial_likes_count'] = 0;
                                     $data['initial_followers_count'] = 0;
                                     $data['initial_comments_count'] = 0;
                                     $data['quantity_done'] = 0;
                                     $data['cronjob_status'] = 0;
                                     $data['order_message'] = 'Order has inserted! Please wait for 10 minutes to get it started!';
                                     $price = $data['price'];
                                     //TODO PRODUCT LOCKING, DB NOCOMMIT IN LARAVEL
                                     $rollback = false;
                                     $successFlag = false;
                                     DB::beginTransaction();
                                     DB::table('usersmeta')->where('user_id', '=', [$postData['user_id']])->lockForUpdate()->get();
                                     $orderInsertedID = $objOrderModel->insertOrder($data);
                                     if ($orderInsertedID) {
                                         $accountBalanceDetails = $objUsersmetaModel->getUsermetaWhere(['rawQuery' => 'user_id=?', 'bindParams' => [$postData['user_id']]], ['account_bal']);
                                         $accountBalance = $accountBalanceDetails->account_bal;
                                         if ($accountBalance >= $price) {
                                             $current_bal['account_bal'] = $accountBalance - $price;
                                             $orderUpdateBalanceStatus = $objUsersmetaModel->updateUsermetaWhere(['rawQuery' => 'user_id=?', 'bindParams' => [$postData['user_id']]], $current_bal);
                                             if ($orderUpdateBalanceStatus) {
                                                 $messages[] = "This order ID #" . $order_id . " is re-added successful with order ID #" . $orderInsertedID;
                                                 DB::commit();
                                             } else {
                                                 $rollback = true;
                                                 $messages[] = "Error in re-add order with order ID #" . $order_id . " Please try again after few minutes.";
                                                 DB::rollBack();
                                             }
                                         } else {
                                             $messages[] = "Insufficient Balance while adding an order.";
                                             $rollback = true;
                                             DB::rollBack();
                                         }
                                     } else {
                                         $rollback = true;
                                         $messages[] = "Error in re-add order with order ID #" . $order_id . " Please try again after few minutes.";
                                         DB::rollBack();
                                     }
                                     if ($rollback) {
                                         break;
                                     }
                                 } else {
                                     $messages[] = "This order ID #" . $order_id . " is invalid.";
                                 }
                             }
                             $records["customActionStatus"] = "OK";
                             // pass custom message(useful for getting status of group actions)
                             $records["customActionMessage"] = $messages;
                         }
                     }
                 }
                 //FIRLTERING START FROM HERE
                 $filteringRules = '';
                 if (isset($requestParam['action']) && $requestParam['action'] == 'filter' && $requestParam['action'][0] != 'filter_cancel') {
                     //                        print_r($_REQUEST);die;
                     if ($requestParam['search_order_id'] != '') {
                         $filteringRules[] = "( orders.order_id LIKE '%" . $requestParam['search_order_id'] . "%' )";
                     }
                     if ($requestParam['search_service_type'] != '') {
                         $filteringRules[] = "( plans.plan_name LIKE '%" . $requestParam['search_service_type'] . "%' )";
                     }
                     if ($requestParam['search_link'] != '') {
                         $filteringRules[] = "( orders.ins_url LIKE '%" . $requestParam['search_link'] . "%' )";
                     }
                     if ($requestParam['search_amount'] != '') {
                         $filteringRules[] = "( orders.quantity_total LIKE '%" . $requestParam['search_amount'] . "%' )";
                     }
                     if ($requestParam['search_price'] != '') {
                         $filteringRules[] = "( orders.price LIKE '%" . $requestParam['search_price'] . "%' )";
                     }
                     if ($requestParam['search_status'] != '') {
                         $filteringRules[] = "( orders.status LIKE '%" . $requestParam['search_status'] . "%' )";
                     }
                     if (!empty($filteringRules)) {
                         $whereOderUserID['rawQuery'] .= " AND " . implode(" AND ", $filteringRules);
                         $iTotalFilteredRecords = count($objOrderModel->getOrderHistory($whereOderUserID, $data));
                     }
                 }
                 $ordersResult = $objOrderModel->getAllOrders($whereOderUserID, $sortingOrder, $iDisplayStart, $iDisplayLength);
                 if ($ordersResult != 2) {
                     if ($ordersResult == 0) {
                         $iTotalFilteredRecords = 0;
                         $records['data'] = array();
                     } else {
                         $iTotalFilteredRecords = count($ordersResult);
                         foreach ($ordersResult as $order) {
                             $order->added_time = $this->getDateDifference($order->added_time);
                             $order->updated_time = $this->getDateDifference($order->updated_time);
                         }
                         $records['data'] = $ordersResult;
                     }
                     //                        $response->code = 200;
                     //                        $response->message = "Success";
                     //                        $response->data = $iTotalFilteredRecords;
                     //                        echo json_encode($response, true);
                     //                        die;
                     //
                     $records["draw"] = $sEcho;
                     $records["recordsTotal"] = $iTotalRecords;
                     $records["recordsFiltered"] = $iTotalFilteredRecords;
                     $response->code = 200;
                     $response->message = "Success";
                     $response->data = $records;
                     echo json_encode($response, true);
                 } else {
                     $response->code = 401;
                     $response->message = "Error in connection please try again.";
                     $response->data = null;
                     echo json_encode($response, true);
                 }
             } else {
                 $response->code = 401;
                 $response->message = $validator->messages();
                 $response->data = null;
                 echo json_encode($response, true);
             }
         } else {
             $response->code = 401;
             $response->message = "Access Denied";
             $response->data = null;
             echo json_encode($response, true);
         }
     } else {
         $response->code = 400;
         $response->message = "Request not allowed";
         $response->data = null;
         echo json_encode($response, true);
     }
 }