TicketsController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 create()
  25. {
  26. //check in blacklist
  27. $check = TicketBlacklist::where('user_id', Auth::user()->id)->first();
  28. if ($check && $check->status == 'True') {
  29. 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"));
  30. }
  31. $ticketcategories = TicketCategory::all();
  32. $servers = Auth::user()->servers;
  33. return view('ticket.create', compact('ticketcategories', 'servers'));
  34. }
  35. public function store(Request $request)
  36. {
  37. $this->validate($request, [
  38. 'title' => 'required',
  39. 'ticketcategory' => 'required',
  40. 'priority' => 'required',
  41. 'message' => 'required', ]
  42. );
  43. $ticket = new Ticket([
  44. 'title' => $request->input('title'),
  45. 'user_id' => Auth::user()->id,
  46. 'ticket_id' => strtoupper(Str::random(5)),
  47. 'ticketcategory_id' => $request->input('ticketcategory'),
  48. 'priority' => $request->input('priority'),
  49. 'message' => $request->input('message'),
  50. 'status' => 'Open',
  51. 'server' => $request->input('server'), ]
  52. );
  53. $ticket->save();
  54. $user = Auth::user();
  55. $admin = User::where('role', 'admin')->orWhere('role', 'mod')->get();
  56. $user->notify(new CreateNotification($ticket));
  57. Notification::send($admin, new AdminCreateNotification($ticket, $user));
  58. return redirect()->route('ticket.index')->with('success', __('A ticket has been opened, ID: #').$ticket->ticket_id);
  59. }
  60. public function show($ticket_id)
  61. {
  62. $ticket = Ticket::where('ticket_id', $ticket_id)->firstOrFail();
  63. $ticketcomments = $ticket->ticketcomments;
  64. $ticketcategory = $ticket->ticketcategory;
  65. $server = Server::where('id', $ticket->server)->first();
  66. return view('ticket.show', compact('ticket', 'ticketcategory', 'ticketcomments', 'server'));
  67. }
  68. public function reply(Request $request)
  69. {
  70. //check in blacklist
  71. $check = TicketBlacklist::where('user_id', Auth::user()->id)->first();
  72. if ($check && $check->status == 'True') {
  73. 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"));
  74. }
  75. $this->validate($request, ['ticketcomment' => 'required']);
  76. $ticket = Ticket::where('id', $request->input('ticket_id'))->firstOrFail();
  77. $ticket->status = 'Client Reply';
  78. $ticket->update();
  79. $ticketcomment = TicketComment::create([
  80. 'ticket_id' => $request->input('ticket_id'),
  81. 'user_id' => Auth::user()->id,
  82. 'ticketcomment' => $request->input('ticketcomment'),
  83. 'message' => $request->input('message'),
  84. ]);
  85. $user = Auth::user();
  86. $admin = User::where('role', 'admin')->orWhere('role', 'mod')->get();
  87. $newmessage = $request->input('ticketcomment');
  88. Notification::send($admin, new AdminReplyNotification($ticket, $user, $newmessage));
  89. return redirect()->back()->with('success', __('Your comment has been submitted'));
  90. }
  91. public function close($ticket_id)
  92. {
  93. $ticket = Ticket::where('user_id', Auth::user()->id)->where("ticket_id", $ticket_id)->firstOrFail();
  94. $ticket->status = "Closed";
  95. $ticket->save();
  96. return redirect()->back()->with('success', __('A ticket has been closed, ID: #') . $ticket->ticket_id);
  97. }
  98. public function dataTable()
  99. {
  100. $query = Ticket::where('user_id', Auth::user()->id)->get();
  101. return datatables($query)
  102. ->addColumn('category', function (Ticket $tickets) {
  103. return $tickets->ticketcategory->name;
  104. })
  105. ->editColumn('title', function (Ticket $tickets) {
  106. return '<a class="text-info" href="'.route('ticket.show', ['ticket_id' => $tickets->ticket_id]).'">'.'#'.$tickets->ticket_id.' - '.$tickets->title.'</a>';
  107. })
  108. ->editColumn('status', function (Ticket $tickets) {
  109. switch ($tickets->status) {
  110. case 'Open':
  111. $badgeColor = 'badge-success';
  112. break;
  113. case 'Closed':
  114. $badgeColor = 'badge-danger';
  115. break;
  116. case 'Answered':
  117. $badgeColor = 'badge-info';
  118. break;
  119. default:
  120. $badgeColor = 'badge-warning';
  121. break;
  122. }
  123. return '<span class="badge '.$badgeColor.'">'.$tickets->status.'</span>';
  124. })
  125. ->editColumn('priority', function (Ticket $tickets) {
  126. return __($tickets->priority);
  127. })
  128. ->editColumn('updated_at', function (Ticket $tickets) {
  129. return $tickets->updated_at ? $tickets->updated_at->diffForHumans() : '';
  130. })
  131. ->addColumn('actions', function (Ticket $tickets) {
  132. return '
  133. <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>
  134. <form class="d-inline" method="post" action="'.route('ticket.close', ['ticket_id' => $tickets->ticket_id]).'">
  135. '.csrf_field().'
  136. '.method_field('POST').'
  137. <button data-content="'.__('Close').'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-times"></i></button>
  138. </form>
  139. </form>
  140. ';
  141. })
  142. ->rawColumns(['category', 'title', 'status', 'updated_at', "actions"])
  143. ->make(true);
  144. }
  145. }