TicketsController.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Server;
  4. use App\Models\Ticket;
  5. use App\Models\TicketBlacklist;
  6. use App\Models\TicketCategory;
  7. use App\Models\TicketComment;
  8. use App\Models\User;
  9. use App\Notifications\Ticket\Admin\AdminCreateNotification;
  10. use App\Notifications\Ticket\Admin\AdminReplyNotification;
  11. use App\Notifications\Ticket\User\CreateNotification;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Auth;
  14. use Illuminate\Support\Facades\Notification;
  15. use Illuminate\Support\Str;
  16. class TicketsController extends Controller
  17. {
  18. public function index()
  19. {
  20. $tickets = Ticket::where('user_id', Auth::user()->id)->paginate(10);
  21. $ticketcategories = TicketCategory::all();
  22. return view('ticket.index', compact('tickets', 'ticketcategories'));
  23. }
  24. public function store(Request $request)
  25. {
  26. $this->validate($request, [
  27. 'title' => 'required',
  28. 'ticketcategory' => 'required',
  29. 'priority' => 'required',
  30. 'message' => 'required',]
  31. );
  32. $ticket = new Ticket([
  33. 'title' => $request->input('title'),
  34. 'user_id' => Auth::user()->id,
  35. 'ticket_id' => strtoupper(Str::random(8)),
  36. 'ticketcategory_id' => $request->input('ticketcategory'),
  37. 'priority' => $request->input('priority'),
  38. 'message' => $request->input('message'),
  39. 'status' => 'Open',
  40. 'server' => $request->input('server'),]
  41. );
  42. $ticket->save();
  43. $user = Auth::user();
  44. if (config('SETTINGS::TICKET:NOTIFY') == "all") {
  45. $admin = User::where('role', 'admin')->orWhere('role', 'mod')->get();
  46. }
  47. if (config('SETTINGS::TICKET:NOTIFY') == "admin") {
  48. $admin = User::where('role', 'admin')->get();
  49. }
  50. if (config('SETTINGS::TICKET:NOTIFY') == "moderator") {
  51. $admin = User::where('role', 'mod')->get();
  52. }
  53. $user->notify(new CreateNotification($ticket));
  54. if (config('SETTINGS::TICKET:NOTIFY') != "none") {
  55. Notification::send($admin, new AdminCreateNotification($ticket, $user));
  56. }
  57. return redirect()->route('ticket.index')->with('success', __('A ticket has been opened, ID: #') . $ticket->ticket_id);
  58. }
  59. public function show($ticket_id)
  60. {
  61. try {
  62. $ticket = Ticket::where('ticket_id', $ticket_id)->firstOrFail();
  63. } catch (Exception $e) {
  64. return redirect()->back()->with('warning', __('Ticket not found on the server. It potentially got deleted earlier'));
  65. }
  66. $ticketcomments = $ticket->ticketcomments;
  67. $ticketcategory = $ticket->ticketcategory;
  68. $server = Server::where('id', $ticket->server)->first();
  69. return view('ticket.show', compact('ticket', 'ticketcategory', 'ticketcomments', 'server'));
  70. }
  71. public function reply(Request $request)
  72. {
  73. //check in blacklist
  74. $check = TicketBlacklist::where('user_id', Auth::user()->id)->first();
  75. if ($check && $check->status == 'True') {
  76. return redirect()->route('ticket.index')->with('error', __("You can't reply a ticket because you're on the blacklist for a reason: '" . $check->reason . "', please contact the administrator"));
  77. }
  78. $this->validate($request, ['ticketcomment' => 'required']);
  79. try {
  80. $ticket = Ticket::where('id', $request->input('ticket_id'))->firstOrFail();
  81. } catch (Exception $e) {
  82. return redirect()->back()->with('warning', __('Ticket not found on the server. It potentially got deleted earlier'));
  83. }
  84. $ticket->status = 'Client Reply';
  85. $ticket->update();
  86. $ticketcomment = TicketComment::create([
  87. 'ticket_id' => $request->input('ticket_id'),
  88. 'user_id' => Auth::user()->id,
  89. 'ticketcomment' => $request->input('ticketcomment'),
  90. 'message' => $request->input('message'),
  91. ]);
  92. $user = Auth::user();
  93. $admin = User::where('role', 'admin')->orWhere('role', 'mod')->get();
  94. $newmessage = $request->input('ticketcomment');
  95. Notification::send($admin, new AdminReplyNotification($ticket, $user, $newmessage));
  96. return redirect()->back()->with('success', __('Your comment has been submitted'));
  97. }
  98. public function create()
  99. {
  100. //check in blacklist
  101. $check = TicketBlacklist::where('user_id', Auth::user()->id)->first();
  102. if ($check && $check->status == 'True') {
  103. return redirect()->route('ticket.index')->with('error', __("You can't make a ticket because you're on the blacklist for a reason: '" . $check->reason . "', please contact the administrator"));
  104. }
  105. $ticketcategories = TicketCategory::all();
  106. $servers = Auth::user()->servers;
  107. return view('ticket.create', compact('ticketcategories', 'servers'));
  108. }
  109. public function changeStatus($ticket_id)
  110. {
  111. try {
  112. $ticket = Ticket::where('user_id', Auth::user()->id)->where("ticket_id", $ticket_id)->firstOrFail();
  113. } catch (Exception $e) {
  114. return redirect()->back()->with('warning', __('Ticket not found on the server. It potentially got deleted earlier'));
  115. }
  116. if ($ticket->status == "Closed") {
  117. $ticket->status = "Reopened";
  118. $ticket->save();
  119. return redirect()->back()->with('success', __('A ticket has been reopened, ID: #') . $ticket->ticket_id);
  120. }
  121. $ticket->status = "Closed";
  122. $ticket->save();
  123. return redirect()->back()->with('success', __('A ticket has been closed, ID: #') . $ticket->ticket_id);
  124. }
  125. public function dataTable()
  126. {
  127. $query = Ticket::where('user_id', Auth::user()->id)->get();
  128. return datatables($query)
  129. ->addColumn('category', function (Ticket $tickets) {
  130. return $tickets->ticketcategory->name;
  131. })
  132. ->editColumn('title', function (Ticket $tickets) {
  133. return '<a class="text-info" href="' . route('ticket.show', ['ticket_id' => $tickets->ticket_id]) . '">' . '#' . $tickets->ticket_id . ' - ' . htmlspecialchars($tickets->title) . '</a>';
  134. })
  135. ->editColumn('status', function (Ticket $tickets) {
  136. switch ($tickets->status) {
  137. case 'Reopened':
  138. case 'Open':
  139. $badgeColor = 'badge-success';
  140. break;
  141. case 'Closed':
  142. $badgeColor = 'badge-danger';
  143. break;
  144. case 'Answered':
  145. $badgeColor = 'badge-info';
  146. break;
  147. default:
  148. $badgeColor = 'badge-warning';
  149. break;
  150. }
  151. return '<span class="badge ' . $badgeColor . '">' . $tickets->status . '</span>';
  152. })
  153. ->editColumn('priority', function (Ticket $tickets) {
  154. return __($tickets->priority);
  155. })
  156. ->editColumn('updated_at', function (Ticket $tickets) {
  157. return ['display' => $tickets->updated_at ? $tickets->updated_at->diffForHumans() : '',
  158. 'raw' => $tickets->updated_at ? strtotime($tickets->updated_at) : ''];
  159. })
  160. ->addColumn('actions', function (Ticket $tickets) {
  161. $statusButtonColor = ($tickets->status == "Closed") ? 'btn-success' : 'btn-warning';
  162. $statusButtonIcon = ($tickets->status == "Closed") ? 'fa-redo' : 'fa-times';
  163. $statusButtonText = ($tickets->status == "Closed") ? __('Reopen') : __('Close');
  164. return '
  165. <a data-content="' . __('View') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('ticket.show', ['ticket_id' => $tickets->ticket_id]) . '" class="btn btn-sm text-white btn-info mr-1"><i class="fas fa-eye"></i></a>
  166. <form class="d-inline" method="post" action="' . route('ticket.changeStatus', ['ticket_id' => $tickets->ticket_id]) . '">
  167. ' . csrf_field() . '
  168. ' . method_field('POST') . '
  169. <button data-content="' . __($statusButtonText) . '" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white ' . $statusButtonColor . ' mr-1"><i class="fas ' . $statusButtonIcon . '"></i></button>
  170. </form>
  171. </form>
  172. ';
  173. })
  174. ->rawColumns(['category', 'title', 'status', 'updated_at', "actions"])
  175. ->make(true);
  176. }
  177. }