Viewing File: /home/ubuntu/vedadeals-backend-base/app/Http/Controllers/Admin/OrderController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

use App\Helpers\Helper;

use DB, Exception, Setting, Hash, Storage, Excel;

use App\Models\{ User, Order, OrderProduct, Product, OrderPayment, OrderTracking };

use App\Http\Requests\Admin\Order\{ OrderGetRequest };

use App\Http\Requests\Admin\OrderPayment\{ OrderPaymentGetRequest };

use App\Http\Controllers\Api\{ OrderApiController };

use App\Services\{ EmailService };

use App\Exports\{ OrdersExport, OrderPaymentsExport};

use App\Jobs\{OrderNotificationJob};

class OrderController extends Controller
{   
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->middleware('auth:admin');

        $this->skip = $request->skip ?: 0;
       
        $this->take = $request->take ?: (Setting::get('admin_take_count') ?: TAKE_COUNT);
    }

    /**
     * @method orders_index()
     *
     * @uses to list the orders
     *
     * @created Karthick
     *
     * @updated  
     *
     * @param
     *
     * @return to orders index page
     */

    public function orders_index(Request $request) {

        try {

            $sub_page = 'orders-history';

            $user = $product = '';

            $base_query = Order::withSum('orderProducts', 'quantity')->with(['user', 'orderPayment'])->orderBy('created_at','DESC');

            if($request->filled('search_key')) {

                $base_query = $base_query->when($request->filled('status'), function ($query) use ($request) {
                                        $query->where('status', $request->status);
                                    })->when($request->filled('order_status'), function ($query) use ($request) {
                                        $query->where('order_status', $request->order_status);
                                    })->when($request->filled('user_id'), function ($query) use ($request) {
                                        $query->where('user_id', $request->user_id);
                                    })->when($request->filter_by == "TODAY", function ($query) use ($request) {
                                        $query->whereDate('created_at', today());
                                    })->where(function($query) use ($request) {
                                        $query->where('unique_id', "LIKE", "%" . $request->search_key . "%");
                                    })->orWhereHas('user', function ($query) use ($request) {
                                        $query->where('name', "LIKE", "%" . $request->search_key . "%")
                                            ->orWhere('email', "LIKE", "%" . $request->search_key . "%")
                                            ->orWhere('mobile', "LIKE", "%" . $request->search_key . "%");
                                    });
            }

            if($request->user_id) {

                Helper::check_model_exists($request->user_id, USER);

                $user = User::find($request->user_id);

                $base_query = $base_query->where('user_id', $request->user_id);
            }

            if($request->product_id) {

                Helper::check_model_exists($request->product_id, PRODUCT);

                $order_product_order_ids = OrderProduct::where(['product_id' => $request->product_id])->pluck('order_id');

                $base_query = $base_query->whereIn('id', $order_product_order_ids);
            }

            if($request->filled('checkout_type')) {

                $base_query = $base_query->where('checkout_type', $request->checkout_type);
                
            } 

            if($request->filled('status')) {

                $base_query = $base_query->where('status', $request->status);
                
            } 

            if($request->filled('order_status')) {

                $base_query = $base_query->where('order_status', $request->order_status);

                $sub_page = get_orders_sub_page($request->order_status);
                
            } 

            if($request->filter_by == "TODAY") {

                $base_query = $base_query->whereDate('created_at', today());
                
            } 

            $orders = $base_query->paginate($this->take);

            return view('admin.orders.index')
                        ->with('page', 'orders')
                        ->with('sub_page', $sub_page)
                        ->with('orders', $orders)
                        ->with(compact(['user', 'product']));

        } catch (Exception $e) {

            return redirect()->route('admin.orders.index')->with('flash_error', $e->getMessage());

        }
    
    }

    /**
     * @method orders_view()
     *
     * @uses to view the withdrawal request details based on order_id
     *
     * @created Karthick 
     *
     * @updated 
     *
     * @param object $request - order_id
     * 
     * @return View page
     *
     */
    public function orders_view(OrderGetRequest $request) {
       
        try {
      
            $order = Order::withSum('orderProducts', 'quantity')->with(['orderProducts.product:id,file', 'deliveryAddress'])->find($request->order_id);

            return view('admin.orders.view')
                        ->with('page', 'orders')
                        ->with('sub_page', 'orders-view')
                        ->with('order', $order);
            
        } catch (Exception $e) {

            return redirect()->route('admin.orders.index')->with('flash_error', $e->getMessage());
        }
    
    }

    /**
     * @method orders_status
     *
     * @uses to change order status & tracking status order_id
     *
     * @created Karthick
     *
     * @updated 
     *
     * @param object $request - order_id
     * 
     * @return response success/failure message
     *
     **/
    public function orders_status(OrderGetRequest $request) {

        try {

            DB::beginTransaction();

            $order = Order::find($request->order_id);

            if($order->status == ORDER_CANCELLED) {

                throw new Exception(tr('cancelled_order_status_update_error'));
            }

            $order_result = $order_tracking_result = false;

            $order_tracking = OrderTracking::firstOrCreate(['order_id' => $order->id, 'user_id' => $order->user_id]);

            switch($request->status) {

                case ORDER_RECEIVED:

                    $order_result = $order->update(['status' => ORDER_RECEIVED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_RECEIVED, 'received_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_RECEIVED));

                    break;

                case ORDER_AWAITING_PICKUP:

                    $order_result = $order->update(['status' => ORDER_AWAITING_PICKUP]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_AWAITING_PICKUP, 'awaiting_pickup_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_AWAITING_PICKUP));

                    break;

                case ORDER_AWAITING_SHIPMENT:

                    $order_result = $order->update(['status' => ORDER_AWAITING_SHIPMENT]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_AWAITING_SHIPMENT, 'awaiting_shipment_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_AWAITING_SHIPMENT));

                    break;

                case ORDER_SHIPPED:

                    $order_result = $order->update(['status' => ORDER_SHIPPED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_SHIPPED, 'shipped_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_SHIPPED));

                    break;

                case ORDER_COMPLETED:

                    $order_result = $order->update(['status' => ORDER_COMPLETED, 'order_status' => ORDER_STATUS_COMPLETED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_COMPLETED, 'completed_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_COMPLETED));

                    break;

                case ORDER_CANCELLED:

                    $request->merge(['id' => $order->user_id, 'order_unique_id' => $order->unique_id, 'cancelled_reason' => $request->cancelled_reason ? : tr('order_cancelled_by_admin')]);

                    $order_api_controller = new OrderApiController($request);

                    $cancel_order_result = $order_api_controller->orders_send_cancel_request($request)->getData();

                    if(!$cancel_order_result->success) {

                        throw new Exception($cancel_order_result->error);
                    }

                    $order_result = $order_tracking_result = $cancel_order_result->success;

                    $message = tr('order_status_cancel_success');

                    DB::commit();

                    return back()->with('flash_success', $message);

                    break;

                case ORDER_RETURN_INITIATED:

                    $order_result = $order->update(['status' => ORDER_RETURN_INITIATED, 'order_status' => ORDER_STATUS_RETURNED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_RETURN_INITIATED, 'return_initiated_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_RETURN_INITIATED));

                    break;

                case ORDER_RETURN_REJECTED:

                    $order_result = $order->update(['status' => ORDER_RETURN_REJECTED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_RETURN_REJECTED, 'return_rejected_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_RETURN_REJECTED));

                    break;

                case ORDER_RETURN_ACCEPTED:

                    $order_result = $order->update(['status' => ORDER_RETURN_ACCEPTED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_RETURN_ACCEPTED, 'return_accepted_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_RETURN_ACCEPTED));

                    break;

                case ORDER_RETURN_USER_DAMAGE:

                    $order_result = $order->update(['status' => ORDER_RETURN_USER_DAMAGE]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_RETURN_USER_DAMAGE, 'return_user_damage_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_RETURN_USER_DAMAGE));

                    break;

                case ORDER_RETURN_SUCCESS:

                    $order_result = $order->update(['status' => ORDER_REFUND_INITIATED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_REFUND_INITIATED, 'return_success_at' => now(), 'refund_initiated_at' => now()]);

                    $message = tr('order_status_return_success');

                    break;

                case ORDER_REFUND_INITIATED:

                    $order_result = $order->update(['status' => ORDER_REFUND_INITIATED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_REFUND_INITIATED, 'refund_initiated_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_REFUND_INITIATED));

                    break;

                case ORDER_REFUND_SUCCESS:

                    $order_result = $order->update(['status' => ORDER_REFUND_SUCCESS]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_REFUND_SUCCESS, 'refund_success_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_REFUND_SUCCESS));

                    break;

                case ORDER_REFUND_FAILED:

                    $order_result = $order->update(['status' => ORDER_REFUND_FAILED]);

                    $order_tracking_result = $order_tracking->update(['status' => ORDER_REFUND_FAILED, 'refund_failed_at' => now()]);

                    $message = tr('order_status_change_success', order_status_formatted(ORDER_REFUND_FAILED));

                    break;

                default :
                
                    throw new Exception(tr('cant_update_order_status'));
            }

            if($order_result && $order_tracking_result) {

                DB::commit();

                OrderNotificationJob::dispatch($order->unique_id);

                return back()->with('flash_success', $message);
            }
            
            throw new Exception(tr('order_status_change_failed'));

        } catch(Exception $e) {

            DB::rollback();

            return redirect()->route('admin.orders.index')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method order_payments_index()
     *
     * @uses to list the order_payments
     *
     * @created Karthick
     *
     * @updated  
     *
     * @param
     *
     * @return to order_payments index page
     */

    public function order_payments_index(Request $request) {

        try {

            $user = '';

            $base_query = OrderPayment::with('user')->orderBy('created_at','DESC');

            if($request->filled('search_key')) {

                $base_query = $base_query->when($request->filled('status'), function ($query) use ($request) {
                                            $query->where('status', $request->status);
                                        })->when($request->filter_by == "TODAY", function ($query) use ($request) {
                                            $query->whereDate('created_at', today());
                                        })->when($request->filled('user_id'), function ($query) use ($request) {
                                            $query->where('user_id', $request->user_id);
                                        })->where(function($query) use ($request) {
                                            $query->where('unique_id', "LIKE", "%". $request->search_key . "%");
                                            $query->orWhere('payment_id', "LIKE", "%". $request->search_key . "%");
                                        })->orWhereHas('user', function ($query) use ($request) {
                                            $query->where('name', "LIKE", "%" . $request->search_key . "%");
                                        });
                }
 
            if($request->user_id) {

                Helper::check_model_exists($request->user_id, USER);

                $user = User::find($request->user_id);

                $base_query = $base_query->where('user_id', $request->user_id);
            }

            if($request->filled('status')) {

                $base_query = $base_query->where('status', $request->status);
                
            } 

            $order_payments = $base_query->paginate($this->take);
            
            return view('admin.order_payments.index')
                        ->with('page', 'order_payments')
                        ->with('sub_page', 'order_payments-view')
                        ->with('user', $user)
                        ->with('order_payments', $order_payments);

        } catch(Exception $e) {

            return redirect()->route('admin.order_payments.index')->with('flash_error', $e->getMessage());

        }
    
    }

    /**
     * @method order_payments_view()
     *
     * @uses to view the withdrawal request details based on order_payment_id
     *
     * @created Karthick 
     *
     * @updated 
     *
     * @param object $request - order_payment_id
     * 
     * @return View page
     *
     */
    public function order_payments_view(OrderPaymentGetRequest $request) {
       
        try {
      
            $order_payment = OrderPayment::find($request->order_payment_id);

            return view('admin.order_payments.view')
                        ->with('page', 'order_payments')
                        ->with('sub_page', 'order_payments-view')
                        ->with('order_payment', $order_payment);
            
        } catch (Exception $e) {

            return redirect()->route('admin.order_payments.index')->with('flash_error', $e->getMessage());
        }
    
    }

    /**
     * @method Orders_export()
     *
     * @uses to export Orders in excel format
     *
     * @created Karthick 
     *
     * @updated  
     *
     * @param
     * 
     * @return
     *
     */
    public function orders_export(Request $request) {

        try {

            $file_format = $request->file_format ? : '.xlsx';

            $filename = routefreestring(Setting::get('site_name'))."-".now()."-".uniqid().$file_format;

            return Excel::download(new OrdersExport($request), $filename);

        } catch(\Exception $e) {

            return redirect()->route('admin.products.index')->with('flash_error' , $e->getMessage());

        }

    }

    /**
     * @method order_payments_export()
     *
     * @uses to export order_payments in excel format
     *
     * @created Karthick 
     *
     * @updated  
     *
     * @param
     * 
     * @return
     *
     */
    public function order_payments_export(Request $request) {

        try {

            $file_format = $request->file_format ? : '.xlsx';

            $filename = routefreestring(Setting::get('site_name'))."-".now()."-".uniqid().$file_format;

            return Excel::download(new OrderPaymentsExport($request), $filename);

        } catch(\Exception $e) {

            return redirect()->route('admin.products.index')->with('flash_error' , $e->getMessage());

        }

    }
}
Back to Directory File Manager