Your IP : 216.73.216.145


Current Path : /home/users/unlimited/www/sigmaerp.codeskitter.site/app/Http/Controllers/
Upload File :
Current File : /home/users/unlimited/www/sigmaerp.codeskitter.site/app/Http/Controllers/ScheduleController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

use App\Models\OrderedProduct;
use App\Models\Order;
use App\Models\Tax;
use App\Models\User;
use App\Models\JobOrder;
use App\Services\GeneralDataService;
use App\Http\Requests\JobStatusReport;

class ScheduleController extends Controller
{
    private $jobStatusArray;

    public function __construct(GeneralDataService $jobStatusArray){
        $this->jobStatusArray = $jobStatusArray;
    }

    /**
     * Edit a order.
     *
     * @param int $id The ID of the order to edit.
     * @return \Illuminate\View\View
     */
    public function edit($id) : View {
        $order = Order::find($id);
        return view('schedule.edit', compact('order'));
    }

    public function list() : View {
        return view('schedule.list');
    }

    /**
     * Update the model
     * @return JsonResponse
     * */
    public function update(Request $request): JsonResponse {
        try {
                DB::beginTransaction();

                $timestamp = now();

                $orderId = $request->input('order_id');

                $validatedData = [];
                $validatedData['order_status'] = $request['order_status'];
                $validatedData['schedule_note'] = $request['schedule_note'];
                $validatedData['schedule_note'] = $request['schedule_note'];
                $orderModel = Order::whereId($orderId)->update($validatedData);

                /**
                 * Code for table records
                 * */
                $rowCount = $request['row_count'];
                if($rowCount == 0){
                    return response()->json([
                        'status' => false,
                        'message' => __('service.please_select_services'),
                    ],409);
                }

                for ($i=0; $i < $rowCount ; $i++) {
                    if(!$request->input('service_id.'.$i)){
                        continue;
                    }

                    $insertOrderedProducts = [
                        'assigned_user_id'          => $request->input('user_id.'.$i, null),
                        'assigned_user_note'        => $request->input('assigned_user_note.'.$i, null),
                        'staff_status'              => $request->input('staff_status.'.$i, null),
                        'staff_status_note'        => $request->input('staff_status_note.'.$i, null),
                        'updated_at'                => $timestamp,
                    ];

                    //Ordered Products update
                    OrderedProduct::whereId($request->input('ordered_product_id.'.$i))->update($insertOrderedProducts);

                }//end: forloop

                DB::commit();

                return response()->json([
                    'status'    => false,
                    'message' => __('app.record_saved_successfully'),
                    'id' => $orderId,
                ]);

        } catch (\Exception $e) {
                DB::rollback();

                Log::channel('custom')->critical($e->getMessage());

                return response()->json([
                    'message' => __('app.something_went_wrong').__('app.check_custom_log_file').$e->getMessage(),
                ], 409);

        }
    }

    public function datatableList(Request $request){

        $data = Order::with('party');


        return DataTables::of($data)
                    ->addIndexColumn()
                    ->addColumn('order_date', function ($row) {
                        return $row->formatted_order_date;
                    })
                    ->addColumn('created_at', function ($row) {
                        return $row->created_at->format(app('company')['date_format']);
                    })
                    ->addColumn('customer_name', function ($row) {
                        return $row->party->first_name;
                    })
                    ->addColumn('mobile', function ($row) {
                        return $row->party->mobile;
                    })
                    ->addColumn('action', function($row){
                            $id = $row->id;

                            $editUrl = route('schedule.edit', ['id' => $id]);
                            $timelineUrl = route('order.timeline', ['id' => $id]);


                            $actionBtn = '<div class="dropdown ms-auto">
                            <a class="dropdown-toggle dropdown-toggle-nocaret" href="#" data-bs-toggle="dropdown"><i class="bx bx-dots-vertical-rounded font-22 text-option"></i>
                            </a>
                            <ul class="dropdown-menu">
                                <li>
                                    <a class="dropdown-item" href="' . $editUrl . '"></i><i class="bx bx-alarm-add"></i> '.__('schedule.schedule').'</a>
                                </li>
                                <li>
                                    <a class="dropdown-item" href="' . $timelineUrl . '"></i><i class="bx bx-time"></i> '.__('order.timeline').'</a>
                                </li>
                            </ul>
                        </div>';
                            return $actionBtn;
                    })
                    ->rawColumns(['action'])
                    ->make(true);
    }
    /**
     * Get Order Service Records
     * @return JsonResponse
     * */
     function getOrderRecords(Request $request): JsonResponse{
        $preparedData = [];

        $orderId = $request->input('order_id');

        $order = Order::find($orderId);
        $orderedProducts = $order->orderedProducts;

        /**
         * If no records
         * @return JsonResponse 
         * */
        if($orderedProducts->count() == 0){
            return response()->json([
                    'status'    => false,
                    'message' => __('app.record_not_found'),
                ]);
        }
        /**
         * Return JsonResponse with Actual Records
         * */
        foreach ($orderedProducts as $record) {
            $preparedData[] = [
                'ordered_product_id'  => $record->id,
                'id'                => $record->service->id,
                'name'              => $record->service->name,
                'description'       => $record->description??'',
                'start_date'        => $record->formatted_start_date,
                'start_time'        => $record->start_time,
                'end_date'          => $record->formatted_end_date,
                'end_time'          => $record->end_time,
                'unit_price'        => $record->unit_price,
                'quantity'          => $record->quantity,
                'total_price'       => $record->total_price,
                'discount'          => $record->discount,
                'discount_type'     => $record->discount_type,
                'discount_amount'   => $record->discount_amount,
                'total_price_after_discount'   => $record->total_price_after_discount,
                'tax_id'            => $record->tax_id,
                'tax_type'          => $record->tax_type,
                'tax_amount'        => $record->tax_amount,
                'assigned_user_id'  => $record->assigned_user_id??'',
                'assigned_user_note'  => $record->assigned_user_note??'',
                'status'            => $record->status,
                'taxList'           => Tax::all(),
                'userList'          => User::all(),
                'staff_status_list' => $this->jobStatusArray->getStaffStatus(),
                'staff_status'      => $record->staff_status??'',
                'staff_status_note' => $record->staff_status_note??'',
            ];
        }
        
        
        return response()->json([
                    'status'    => true,
                    'message' => null,
                    'data' => $preparedData,
                ]);
     }

     public function getJobStatusRecords(JobStatusReport $request): JsonResponse{
        $customerId         = $request->input('party_id');
        $fromDate           = $request->input('from_date');
        $toDate             = $request->input('to_date');
        $assignedUserId     = $request->input('user_id');
        $staffStatus        = $request->input('staff_status');

        $preparedData = Order::with([
                                'orderedProducts' => function ($query) use ($assignedUserId, $staffStatus) {
                                    if ($assignedUserId) {
                                        $query->where('assigned_user_id', $assignedUserId);
                                    }
                                    if ($staffStatus) {
                                        $query->where('staff_status', $staffStatus);
                                    }
                                },
                            ])
                            ->whereBetween('order_date', [$fromDate, $toDate])
                            ->when($customerId, function ($query) use ($customerId) {
                                return $query->where('party_id', $customerId);
                            })
                            ->get();
        $recordsArray = [];

        foreach ($preparedData as $order) {
            foreach ($order->orderedProducts as $product) {
                $recordsArray[] = [  
                                'order_date' => $order->order_date,
                                'order_code' => $order->order_code,
                                'job_code' => $product->job_code,
                                'customer_name' => $order->party->first_name . ' ' . $order->party->last_name,
                                'service_name' => $product->service->name,
                                'start_date' => $product->start_date??'',
                                'start_time' => $product->start_time??'',
                                'end_date' => $product->end_date??'',
                                'end_time' => $product->end_time??'',
                                'assigned_user' => $product->user->first_name??'',
                                'user_status' => $product->staff_status??'',
                            ];
            }
        }
        
        return response()->json([
                    'status'    => true,
                    'message' => null,
                    'data' => $recordsArray,
                ]);
     }
}