228 lines
7.4 KiB
PHP
228 lines
7.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\Admin\app\Http\Controllers;
|
|
|
|
use App\Helper\Cache\CurrentMonthTimekeeping;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Notes;
|
|
use App\Traits\AnalyzeData;
|
|
use App\Traits\HasFilterRequest;
|
|
use App\Traits\HasOrderByRequest;
|
|
use App\Traits\HasSearchRequest;
|
|
use Carbon\Carbon;
|
|
use Carbon\CarbonPeriod;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Modules\Admin\app\Models\Category;
|
|
use Modules\Admin\app\Models\Ticket;
|
|
|
|
class TicketController extends Controller
|
|
{
|
|
use HasOrderByRequest;
|
|
use HasFilterRequest;
|
|
use HasSearchRequest;
|
|
use AnalyzeData;
|
|
|
|
public function getByUserId(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->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;
|
|
}
|
|
}
|