297 lines
9.8 KiB
PHP
297 lines
9.8 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',
|
|
'end_date' => 'required|date|after_or_equal:start_date',
|
|
'end_period' => 'required|string',
|
|
'type' => 'required|string',
|
|
];
|
|
|
|
// 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
|
|
$type = $request->input('type');
|
|
$reason = $request->input('reason');
|
|
$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,
|
|
'type' => $type,
|
|
'status' => 'WAITING',
|
|
'reason' => $reason,
|
|
'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',
|
|
'admin_note' => '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);
|
|
|
|
if (!$ticket || $ticket->status !== "WAITING") {
|
|
return response()->json(['message' => "Ticket not found", 'status' => false]);
|
|
}
|
|
$results = $this->getAllPeriod($ticket->start_date, $ticket->start_period, $ticket->end_date, $ticket->end_period);
|
|
|
|
// $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
|
|
|
|
if ($action == "confirm") {
|
|
foreach ($results as $result) {
|
|
list($year, $month, $day) = explode('-', $result['date']);
|
|
Notes::create([
|
|
'n_user_id' => $ticket->user_id,
|
|
'n_day' => $day,
|
|
'n_month' => $month,
|
|
'n_year' => $year,
|
|
'n_time_type' => $result['period'],
|
|
'n_reason' => $ticket->type,
|
|
'n_note' => $ticket->reason
|
|
]);
|
|
}
|
|
|
|
$ticket['updated_by'] = $admin->name;
|
|
$ticket['admin_note'] = $admin_note;
|
|
$ticket['status'] = 'CONFIRMED';
|
|
|
|
$ticket->save();
|
|
$this->createOrUpdateRecordForCurrentMonth($month, $year);
|
|
return response()->json(['message' => "confirmed", 'status' => true]);
|
|
}
|
|
|
|
if ($action == "refuse") {
|
|
$ticket['updated_by'] = $admin->name;
|
|
$ticket['admin_note'] = $admin_note;
|
|
$ticket['status'] = 'REFUSED';
|
|
return response()->json(['message' => "refused", 'status' => true]);
|
|
}
|
|
|
|
return response()->json(['message' => "failed", 'status' => 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')->get();
|
|
$morning = null;
|
|
$afternoon = null;
|
|
$all_day = null;
|
|
|
|
foreach ($time_type as $item) {
|
|
switch ($item->c_code) {
|
|
case 'S':
|
|
$morning = $item;
|
|
break;
|
|
case 'C':
|
|
$afternoon = $item;
|
|
break;
|
|
case 'ALL':
|
|
$all_day = $item;
|
|
break;
|
|
}
|
|
}
|
|
|
|
foreach ($period as $date) {
|
|
//If it is the start date
|
|
if ($date->isSameDay($startDate)) {
|
|
//Add start session
|
|
//If the start date is morning, add afternoon
|
|
if ($startDate == $endDate) {
|
|
if ($startPeriod == $endPeriod) {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $startPeriod];
|
|
} else {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $all_day->c_code];
|
|
}
|
|
} else {
|
|
if ($startPeriod == $morning->c_code) {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $all_day->c_code];
|
|
} else {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $startPeriod];
|
|
}
|
|
}
|
|
} elseif ($date->isSameDay($endDate)) {
|
|
//If it is the end date
|
|
//If the end session is afternoon, add morning first
|
|
|
|
if ($endPeriod == $afternoon->c_code) {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $all_day->c_code];
|
|
} else {
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $endPeriod];
|
|
}
|
|
} else {
|
|
//Add both sessions for days between intervals
|
|
$results[] = ['date' => $date->toDateString(), 'period' => $all_day->c_code];
|
|
// $results[] = ['date' => $date->toDateString(), 'period' => 'afternoon'];
|
|
}
|
|
}
|
|
|
|
//Returns results
|
|
return $results;
|
|
}
|
|
}
|