/app/Http/Controllers/EventTicketsController.php

https://github.com/Attendize/Attendize · PHP · 296 lines · 186 code · 41 blank · 69 comment · 14 complexity · 88cb3df5b6ce1f01c8c64b0e44d33962 MD5 · raw file

  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Event;
  4. use App\Models\Ticket;
  5. use Carbon\Carbon;
  6. use Illuminate\Http\Request;
  7. use Log;
  8. /*
  9. Attendize.com - Event Management & Ticketing
  10. */
  11. class EventTicketsController extends MyBaseController
  12. {
  13. /**
  14. * @param Request $request
  15. * @param $event_id
  16. * @return mixed
  17. */
  18. public function showTickets(Request $request, $event_id)
  19. {
  20. $allowed_sorts = [
  21. 'created_at' => trans("Controllers.sort.created_at"),
  22. 'title' => trans("Controllers.sort.title"),
  23. 'quantity_sold' => trans("Controllers.sort.quantity_sold"),
  24. 'sales_volume' => trans("Controllers.sort.sales_volume"),
  25. 'sort_order' => trans("Controllers.sort.sort_order"),
  26. ];
  27. // Getting get parameters.
  28. $q = $request->get('q', '');
  29. $sort_by = $request->get('sort_by');
  30. if (isset($allowed_sorts[$sort_by]) === false) {
  31. $sort_by = 'sort_order';
  32. }
  33. // Find event or return 404 error.
  34. $event = Event::scope()->find($event_id);
  35. if ($event === null) {
  36. abort(404);
  37. }
  38. // Get tickets for event.
  39. $tickets = empty($q) === false
  40. ? $event->tickets()->where('title', 'like', '%' . $q . '%')->orderBy($sort_by, 'asc')->paginate()
  41. : $event->tickets()->orderBy($sort_by, 'asc')->paginate();
  42. // Return view.
  43. return view('ManageEvent.Tickets', compact('event', 'tickets', 'sort_by', 'q', 'allowed_sorts'));
  44. }
  45. /**
  46. * Show the edit ticket modal
  47. *
  48. * @param $event_id
  49. * @param $ticket_id
  50. * @return mixed
  51. */
  52. public function showEditTicket($event_id, $ticket_id)
  53. {
  54. $data = [
  55. 'event' => Event::scope()->find($event_id),
  56. 'ticket' => Ticket::scope()->find($ticket_id),
  57. ];
  58. return view('ManageEvent.Modals.EditTicket', $data);
  59. }
  60. /**
  61. * Show the create ticket modal
  62. *
  63. * @param $event_id
  64. * @return \Illuminate\Contracts\View\View
  65. */
  66. public function showCreateTicket($event_id)
  67. {
  68. return view('ManageEvent.Modals.CreateTicket', [
  69. 'event' => Event::scope()->find($event_id),
  70. ]);
  71. }
  72. /**
  73. * Creates a ticket
  74. *
  75. * @param $event_id
  76. * @return \Illuminate\Http\JsonResponse
  77. */
  78. public function postCreateTicket(Request $request, $event_id)
  79. {
  80. $ticket = Ticket::createNew();
  81. if (!$ticket->validate($request->all())) {
  82. return response()->json([
  83. 'status' => 'error',
  84. 'messages' => $ticket->errors(),
  85. ]);
  86. }
  87. $ticket->event_id = $event_id;
  88. $ticket->title = strip_tags($request->get('title'));
  89. $ticket->quantity_available = !$request->get('quantity_available') ? null : $request->get('quantity_available');
  90. $ticket->start_sale_date = $request->get('start_sale_date');
  91. $ticket->end_sale_date = $request->get('end_sale_date');
  92. $ticket->price = $request->get('price');
  93. $ticket->min_per_person = $request->get('min_per_person');
  94. $ticket->max_per_person = $request->get('max_per_person');
  95. $ticket->description = strip_tags($request->get('description'));
  96. $ticket->is_hidden = $request->get('is_hidden') ? 1 : 0;
  97. $ticket->save();
  98. // Attach the access codes to the ticket if it's hidden and the code ids have come from the front
  99. if ($ticket->is_hidden) {
  100. $ticketAccessCodes = $request->get('ticket_access_codes', []);
  101. if (empty($ticketAccessCodes) === false) {
  102. // Sync the access codes on the ticket
  103. $ticket->event_access_codes()->attach($ticketAccessCodes);
  104. }
  105. }
  106. session()->flash('message', 'Successfully Created Ticket');
  107. return response()->json([
  108. 'status' => 'success',
  109. 'id' => $ticket->id,
  110. 'message' => trans("Controllers.refreshing"),
  111. 'redirectUrl' => route('showEventTickets', [
  112. 'event_id' => $event_id,
  113. ]),
  114. ]);
  115. }
  116. /**
  117. * Pause ticket / take it off sale
  118. *
  119. * @param Request $request
  120. * @return mixed
  121. */
  122. public function postPauseTicket(Request $request)
  123. {
  124. $ticket_id = $request->get('ticket_id');
  125. $ticket = Ticket::scope()->find($ticket_id);
  126. $ticket->is_paused = ($ticket->is_paused == 1) ? 0 : 1;
  127. if ($ticket->save()) {
  128. return response()->json([
  129. 'status' => 'success',
  130. 'message' => trans("Controllers.ticket_successfully_updated"),
  131. 'id' => $ticket->id,
  132. ]);
  133. }
  134. Log::error('Ticket Failed to pause/resume', [
  135. 'ticket' => $ticket,
  136. ]);
  137. return response()->json([
  138. 'status' => 'error',
  139. 'id' => $ticket->id,
  140. 'message' => trans("Controllers.whoops"),
  141. ]);
  142. }
  143. /**
  144. * Deleted a ticket
  145. *
  146. * @param Request $request
  147. * @return \Illuminate\Http\JsonResponse
  148. */
  149. public function postDeleteTicket(Request $request)
  150. {
  151. $ticket_id = $request->get('ticket_id');
  152. $ticket = Ticket::scope()->find($ticket_id);
  153. /*
  154. * Don't allow deletion of tickets which have been sold already.
  155. */
  156. if ($ticket->quantity_sold > 0) {
  157. return response()->json([
  158. 'status' => 'error',
  159. 'message' => trans("Controllers.cant_delete_ticket_when_sold"),
  160. 'id' => $ticket->id,
  161. ]);
  162. }
  163. if ($ticket->delete()) {
  164. return response()->json([
  165. 'status' => 'success',
  166. 'message' => trans("Controllers.ticket_successfully_deleted"),
  167. 'id' => $ticket->id,
  168. ]);
  169. }
  170. Log::error('Ticket Failed to delete', [
  171. 'ticket' => $ticket,
  172. ]);
  173. return response()->json([
  174. 'status' => 'error',
  175. 'id' => $ticket->id,
  176. 'message' => trans("Controllers.whoops"),
  177. ]);
  178. }
  179. /**
  180. * Edit a ticket
  181. *
  182. * @param Request $request
  183. * @param $event_id
  184. * @param $ticket_id
  185. * @return \Illuminate\Http\JsonResponse
  186. */
  187. public function postEditTicket(Request $request, $event_id, $ticket_id)
  188. {
  189. $ticket = Ticket::scope()->findOrFail($ticket_id);
  190. /*
  191. * Add validation message
  192. */
  193. $validation_messages['quantity_available.min'] = trans("Controllers.quantity_min_error");
  194. $ticket->messages = $validation_messages + $ticket->messages;
  195. if (!$ticket->validate($request->all())) {
  196. return response()->json([
  197. 'status' => 'error',
  198. 'messages' => $ticket->errors(),
  199. ]);
  200. }
  201. // Check if the ticket visibility changed on update
  202. $ticketPreviouslyHidden = (bool)$ticket->is_hidden;
  203. $ticket->title = $request->get('title');
  204. $ticket->quantity_available = !$request->get('quantity_available') ? null : $request->get('quantity_available');
  205. $ticket->price = $request->get('price');
  206. $ticket->start_sale_date = $request->get('start_sale_date');
  207. $ticket->end_sale_date = $request->get('end_sale_date');
  208. $ticket->description = $request->get('description');
  209. $ticket->min_per_person = $request->get('min_per_person');
  210. $ticket->max_per_person = $request->get('max_per_person');
  211. $ticket->is_hidden = $request->get('is_hidden') ? 1 : 0;
  212. $ticket->save();
  213. // Attach the access codes to the ticket if it's hidden and the code ids have come from the front
  214. if ($ticket->is_hidden) {
  215. $ticketAccessCodes = $request->get('ticket_access_codes', []);
  216. if (empty($ticketAccessCodes) === false) {
  217. // Sync the access codes on the ticket
  218. $ticket->event_access_codes()->detach();
  219. $ticket->event_access_codes()->attach($ticketAccessCodes);
  220. }
  221. } else if ($ticketPreviouslyHidden) {
  222. // Delete access codes on ticket if the visibility changed to visible
  223. $ticket->event_access_codes()->detach();
  224. }
  225. return response()->json([
  226. 'status' => 'success',
  227. 'id' => $ticket->id,
  228. 'message' => trans("Controllers.refreshing"),
  229. 'redirectUrl' => route('showEventTickets', [
  230. 'event_id' => $event_id,
  231. ]),
  232. ]);
  233. }
  234. /**
  235. * Updates the sort order of tickets
  236. *
  237. * @param Request $request
  238. * @return \Illuminate\Http\JsonResponse
  239. */
  240. public function postUpdateTicketsOrder(Request $request)
  241. {
  242. $ticket_ids = $request->get('ticket_ids');
  243. $sort = 1;
  244. foreach ($ticket_ids as $ticket_id) {
  245. $ticket = Ticket::scope()->find($ticket_id);
  246. $ticket->sort_order = $sort;
  247. $ticket->save();
  248. $sort++;
  249. }
  250. return response()->json([
  251. 'status' => 'success',
  252. 'message' => trans("Controllers.ticket_order_successfully_updated"),
  253. ]);
  254. }
  255. }