orderByRequest($tickets, $request); // Filter $this->filterRequest( builder: $tickets, request: $request, filterKeys: [ 'type' => self::F_TEXT, 'reason' => self::F_TEXT, 'updated_by' => self::F_TEXT, 'start_date' => [ 'type' => self::F_THAN_EQ_DATETIME, 'column' => 'tickets.start_date' ], 'end_date' => [ 'type' => self::F_THAN_EQ_DATETIME, 'column' => 'tickets.end_date' ], ] ); $responseData = array_merge( $tickets->where('user_id',auth('admins')->user()->id)->orderBy('created_at', 'desc')->paginate($request->get('per_page'))->toArray(), ['status' => true] ); return response()->json($responseData); } public function getAll(Request $request) { $tickets = new Ticket; // Order by $this->orderByRequest($tickets, $request); // Filter $this->filterRequest( builder: $tickets, request: $request, filterKeys: [ 'type' => self::F_TEXT, 'reason' => self::F_TEXT, 'updated_by' => self::F_TEXT, 'start_date' => [ 'type' => self::F_THAN_EQ_DATETIME, 'column' => 'tickets.start_date' ], 'end_date' => [ 'type' => self::F_THAN_EQ_DATETIME, 'column' => 'tickets.end_date' ], ] ); $responseData = array_merge( $tickets->orderBy('created_at', 'desc')->paginate($request->get('per_page'))->toArray(), ['status' => true] ); return response()->json($responseData); } public function createTicket(Request $request){ // Define validation rules $rules = [ 'start_date' => 'required|date', 'start_period' => 'required|string', // Adjust the validation rule as per your requirements 'end_date' => 'required|date|after_or_equal:start_date', 'end_period' => 'required|string', // Adjust the validation rule as per your requirements ]; // Validate the request $request->validate($rules); // return $request; //Get data from request $startDate = $request->input('start_date'); //Start day $startPeriod = $request->input('start_period'); //The session begins $endDate = $request->input('end_date'); //End date $endPeriod = $request->input('end_period'); //Session ends $user = auth('admins')->user(); // user create ticket // return $user; $ticket = Ticket::create([ 'start_date' => Carbon::create($startDate)->setTimezone(env('TIME_ZONE')), 'start_period' => $startPeriod, 'end_date' => Carbon::create($endDate)->setTimezone(env('TIME_ZONE')), 'end_period' => $endPeriod, 'user_id' => $user->id ]); // Send notification email to admin (list) return response()->json(['data' => $ticket, 'status' => true]); } public function deleteTicket(Request $request){ $rules = [ 'ticket_id' => 'required' ]; // Validate the request $request->validate($rules); $user = auth('admins')->user(); $ticket_id = $request->input('ticket_id'); $ticket = Ticket::find($ticket_id); if($ticket){ // $user->id == user_id of ticket ---> delete if($ticket->user_id == $user->id){ $ticket->delete(); return response()->json(['message' => 'delete success', 'status' => true]); }else{ return response()->json(['message' => 'You are committing an act of vandalism', 'status' => false]); } } return response()->json(['message' => 'Delete fail', 'status' => false]); } public function handleTicket(Request $request){ $rules = [ 'ticket_id' => 'required', 'action' => 'required' ]; // Validate the request $request->validate($rules); $ticket_id = $request->input('ticket_id'); $admin_note = $request->input('admin_note'); $action = $request->input('action'); // 'confirm' or 'refuse' $admin = auth('admins')->user(); $ticket = Ticket::find($ticket_id); $results = $this->getAllPeriod($ticket->start_date, $ticket->start_period, $ticket->end_date, $ticket->end_period); return $results; // $admin->id != user_id of ticket ---> continue // Confirm // Add records to the notes table like function Timekeeping.addNoteForUser() based on the $results array // Update updated_by and admin_note in tickets table // Send notification email to users // Refuse // Update updated_by and admin_note in tickets table // Send notification email to users // false } private function getAllPeriod($startDate, $startPeriod, $endDate, $endPeriod) { //Create an array to contain the results $results = []; //Use CarbonPeriod to create a period from the start date to the end date $period = CarbonPeriod::create($startDate, $endDate); $time_type = Category::where('c_type','TIME_TYPE'); foreach ($period as $date) { //If it is the start date if ($date->isSameDay($startDate)) { //Add start session $results[] = ['date' => $date->toDateString(), 'period' => $startPeriod]; //If the start date is morning, add afternoon if ($startPeriod == 'morning') { $results[] = ['date' => $date->toDateString(), 'period' => 'afternoon']; } } elseif ($date->isSameDay($endDate)) { //If it is the end date //If the end session is afternoon, add morning first if ($endPeriod == 'afternoon') { $results[] = ['date' => $date->toDateString(), 'period' => 'morning']; } $results[] = ['date' => $date->toDateString(), 'period' => $endPeriod]; } else { //Add both sessions for days between intervals $results[] = ['date' => $date->toDateString(), 'period' => 'morning']; $results[] = ['date' => $date->toDateString(), 'period' => 'afternoon']; } } //Returns results return $results; } }