Attendize/app/Http/Controllers/EventAttendeesController.php

568 lines
18 KiB
PHP
Raw Normal View History

2016-02-29 15:59:36 +00:00
<?php
namespace App\Http\Controllers;
2016-03-05 00:18:10 +00:00
use App\Commands\OrderTicketsCommand;
use App\Commands\SendAttendeeTicketCommand;
2016-03-05 00:18:10 +00:00
use App\Models\Attendee;
2016-02-29 15:59:36 +00:00
use App\Models\Event;
use App\Models\EventStats;
2016-03-05 00:18:10 +00:00
use App\Models\Message;
2016-02-29 15:59:36 +00:00
use App\Models\Order;
use App\Models\OrderItem;
2016-03-05 00:18:10 +00:00
use App\Models\Ticket;
use Illuminate\Http\Request;
2016-03-05 00:18:10 +00:00
use Auth;
use DB;
use Excel;
use Mail;
use Response;
use Session;
use Validator;
class EventAttendeesController extends MyBaseController
{
/**
* Show the attendees list
*
* @param Request $request
* @param $event_id
* @return View
*/
public function showAttendees(Request $request, $event_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$allowed_sorts = ['first_name', 'email', 'ticket_id', 'order_reference'];
$searchQuery = $request->get('q');
$sort_order = $request->get('sort_order') == 'asc' ? 'asc' : 'desc';
$sort_by = (in_array($request->get('sort_by'), $allowed_sorts) ? $request->get('sort_by') : 'created_at');
2016-02-29 15:59:36 +00:00
$event = Event::scope()->find($event_id);
if ($searchQuery) {
$attendees = $event->attendees()
->withoutCancelled()
->join('orders', 'orders.id', '=', 'attendees.order_id')
2016-03-05 00:18:10 +00:00
->where(function ($query) use ($searchQuery) {
$query->where('orders.order_reference', 'like', $searchQuery.'%')
->orWhere('attendees.first_name', 'like', $searchQuery.'%')
->orWhere('attendees.email', 'like', $searchQuery.'%')
->orWhere('attendees.last_name', 'like', $searchQuery.'%');
2016-02-29 15:59:36 +00:00
})
2016-03-05 00:18:10 +00:00
->orderBy(($sort_by == 'order_reference' ? 'orders.' : 'attendees.').$sort_by, $sort_order)
2016-02-29 15:59:36 +00:00
->select('attendees.*', 'orders.order_reference')
->paginate();
} else {
$attendees = $event->attendees()
->join('orders', 'orders.id', '=', 'attendees.order_id')
->withoutCancelled()
2016-03-05 00:18:10 +00:00
->orderBy(($sort_by == 'order_reference' ? 'orders.' : 'attendees.').$sort_by, $sort_order)
2016-02-29 15:59:36 +00:00
->select('attendees.*', 'orders.order_reference')
->paginate();
}
$data = [
2016-03-05 00:18:10 +00:00
'attendees' => $attendees,
'event' => $event,
'sort_by' => $sort_by,
2016-02-29 15:59:36 +00:00
'sort_order' => $sort_order,
2016-03-05 00:18:10 +00:00
'q' => $searchQuery ? $searchQuery : '',
2016-02-29 15:59:36 +00:00
];
return view('ManageEvent.Attendees', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Show the 'Create Attendee' modal
*
* @param Request $request
* @param $event_id
* @return string|View
*/
public function showCreateAttendee(Request $request, $event_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$event = Event::scope()->find($event_id);
/*
* If there are no tickets then we can't create an attendee
* @todo This is a bit hackish
*/
2016-03-05 00:18:10 +00:00
if ($event->tickets->count() === 0) {
2016-02-29 15:59:36 +00:00
return '<script>showMessage("You need to create a ticket before you can add an attendee.");</script>';
}
return view('ManageEvent.Modals.CreateAttendee', [
'modal_id' => $request->get('modal_id'),
'event' => $event,
'tickets' => $event->tickets()->lists('title', 'id'),
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
/**
* Create an attendee
*
* @param Request $request
* @param $event_id
* @return mixed
*/
public function postCreateAttendee(Request $request, $event_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$rules = [
2016-03-05 00:18:10 +00:00
'first_name' => 'required',
'ticket_id' => 'required|exists:tickets,id,account_id,'.\Auth::user()->account_id,
2016-02-29 15:59:36 +00:00
'ticket_price' => 'numeric|required',
2016-03-05 00:18:10 +00:00
'email' => 'email|required',
2016-02-29 15:59:36 +00:00
];
$messages = [
2016-03-05 00:18:10 +00:00
'ticket_id.exists' => 'The ticket you have selected does not exist',
'ticket_id.required' => 'The ticket field is required. ',
2016-02-29 15:59:36 +00:00
];
$validator = Validator::make($request->all(), $rules, $messages);
2016-02-29 15:59:36 +00:00
if ($validator->fails()) {
return response()->json([
2016-03-05 00:18:10 +00:00
'status' => 'error',
'messages' => $validator->messages()->toArray(),
]);
2016-02-29 15:59:36 +00:00
}
$ticket_id = $request->get('ticket_id');
$ticket_price = $request->get('ticket_price');
$attendee_first_name =$request->get('first_name');
$attendee_last_name = $request->get('last_name');
$attendee_email = $request->get('email');
$email_attendee = $request->get('email_ticket');
2016-02-29 15:59:36 +00:00
/*
* Create the order
*/
2016-03-05 00:18:10 +00:00
$order = new Order();
2016-02-29 15:59:36 +00:00
$order->first_name = $attendee_first_name;
$order->last_name = $attendee_last_name;
$order->email = $attendee_email;
$order->order_status_id = config('attendize.order_complete');
2016-02-29 15:59:36 +00:00
$order->amount = $ticket_price;
$order->account_id = Auth::user()->account_id;
$order->event_id = $event_id;
$order->save();
/*
* Update qty sold
*/
$ticket = Ticket::scope()->find($ticket_id);
$ticket->increment('quantity_sold');
$ticket->increment('sales_volume', $ticket_price);
$ticket->event->increment('sales_volume', $ticket_price);
/*
* Insert order item
*/
2016-03-05 00:18:10 +00:00
$orderItem = new OrderItem();
2016-02-29 15:59:36 +00:00
$orderItem->title = $ticket->title;
$orderItem->quantity = 1;
$orderItem->order_id = $order->id;
$orderItem->unit_price = $ticket_price;
$orderItem->save();
/*
* Update the event stats
*/
2016-03-05 00:18:10 +00:00
$event_stats = new EventStats();
2016-02-29 15:59:36 +00:00
$event_stats->updateTicketsSoldCount($event_id, 1);
$event_stats->updateTicketRevenue($ticket_id, $ticket_price);
/*
* Create the attendee
*/
2016-03-05 00:18:10 +00:00
$attendee = new Attendee();
2016-02-29 15:59:36 +00:00
$attendee->first_name = $attendee_first_name;
$attendee->last_name = $attendee_last_name;
$attendee->email = $attendee_email;
$attendee->event_id = $event_id;
$attendee->order_id = $order->id;
$attendee->ticket_id = $ticket_id;
$attendee->account_id = Auth::user()->account_id;
2016-03-05 00:18:10 +00:00
$attendee->reference = $order->order_reference.'-1';
2016-02-29 15:59:36 +00:00
$attendee->save();
if ($email_attendee == '1') {
$this->dispatch(new OrderTicketsCommand($order, false));
}
session()->flash('message', 'Attendee Successfully Created');
2016-02-29 15:59:36 +00:00
return response()->json([
'status' => 'success',
'id' => $attendee->id,
'redirectUrl' => route('showEventAttendees', [
'event_id' => $event_id,
]),
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
/**
* Show the printable attendee list
*
* @param $event_id
* @return View
*/
2016-03-05 00:18:10 +00:00
public function showPrintAttendees($event_id)
{
2016-02-29 15:59:36 +00:00
$data['event'] = Event::scope()->find($event_id);
$data['attendees'] = $data['event']->attendees()->withoutCancelled()->orderBy('first_name')->get();
return view('ManageEvent.PrintAttendees', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Show the 'Message Attendee' modal
*
* @param Request $request
* @param $attendee_id
* @return View
*/
public function showMessageAttendee(Request $request, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$attendee = Attendee::scope()->findOrFail($attendee_id);
$data = [
'attendee' => $attendee,
2016-03-05 00:18:10 +00:00
'event' => $attendee->event,
'modal_id' => $request->get('modal_id'),
2016-02-29 15:59:36 +00:00
];
return view('ManageEvent.Modals.MessageAttendee', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Send a message to an attendee
*
* @param Request $request
* @param $attendee_id
* @return mixed
*/
public function postMessageAttendee(Request $request, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$rules = [
'subject' => 'required',
2016-03-05 00:18:10 +00:00
'message' => 'required',
2016-02-29 15:59:36 +00:00
];
$validator = Validator::make($request->all(), $rules);
2016-02-29 15:59:36 +00:00
if ($validator->fails()) {
return response()->json([
2016-03-05 00:18:10 +00:00
'status' => 'error',
'messages' => $validator->messages()->toArray(),
]);
2016-02-29 15:59:36 +00:00
}
$attendee = Attendee::scope()->findOrFail($attendee_id);
$data = [
2016-03-05 00:18:10 +00:00
'attendee' => $attendee,
'message_content' => $request->get('message'),
'subject' => $request->get('subject'),
2016-03-05 00:18:10 +00:00
'event' => $attendee->event,
'email_logo' => $attendee->event->organiser->full_logo_path,
2016-02-29 15:59:36 +00:00
];
2016-03-05 00:18:10 +00:00
Mail::send('Emails.messageAttendees', $data, function ($message) use ($attendee, $data) {
2016-02-29 15:59:36 +00:00
$message->to($attendee->email, $attendee->full_name)
->from(config('attendize.outgoing_email_noreply'), $attendee->event->organiser->name)
2016-02-29 15:59:36 +00:00
->replyTo($attendee->event->organiser->email, $attendee->event->organiser->name)
->subject($data['subject']);
});
/* Could bcc in the above? */
if ($request->get('send_copy') == '1') {
2016-03-05 00:18:10 +00:00
Mail::send('Emails.messageAttendees', $data, function ($message) use ($attendee, $data) {
2016-02-29 15:59:36 +00:00
$message->to($attendee->event->organiser->email, $attendee->event->organiser->name)
->from(config('attendize.outgoing_email_noreply'), $attendee->event->organiser->name)
2016-02-29 15:59:36 +00:00
->replyTo($attendee->event->organiser->email, $attendee->event->organiser->name)
2016-03-05 00:18:10 +00:00
->subject($data['subject'].'[ORGANISER COPY]');
2016-02-29 15:59:36 +00:00
});
}
return response()->json([
'status' => 'success',
'message' => 'Message Successfully Sent',
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
/**
* Shows the 'Message Attendees' modal
*
* @param $event_id
* @return View
*/
public function showMessageAttendees(Request $request, $event_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$data = [
2016-03-05 00:18:10 +00:00
'event' => Event::scope()->find($event_id),
'modal_id' => $request->get('modal_id'),
2016-03-05 00:18:10 +00:00
'tickets' => Event::scope()->find($event_id)->tickets()->lists('title', 'id')->toArray(),
2016-02-29 15:59:36 +00:00
];
return view('ManageEvent.Modals.MessageAttendees', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Send a message to attendees
*
* @param Request $request
* @param $event_id
* @return mixed
*/
public function postMessageAttendees(Request $request, $event_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$rules = [
2016-03-05 00:18:10 +00:00
'subject' => 'required',
'message' => 'required',
'recipients' => 'required',
2016-02-29 15:59:36 +00:00
];
$validator = Validator::make($request->all(), $rules);
2016-02-29 15:59:36 +00:00
if ($validator->fails()) {
2016-03-05 00:18:10 +00:00
return Response::json([
'status' => 'error',
'messages' => $validator->messages()->toArray(),
]);
2016-02-29 15:59:36 +00:00
}
$message = Message::createNew();
$message->message = $request->get('message');
$message->subject = $request->get('subject');
$message->recipients = $request->get('recipients');
2016-02-29 15:59:36 +00:00
$message->event_id = $event_id;
$message->save();
/*
* Add to the queue
*/
return response()->json([
'status' => 'success',
'message' => 'Message Successfully Sent',
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
/**
* Downloads an export of attendees
*
* @param $event_id
* @param string $export_as (xlsx, xls, csv, html)
*/
2016-03-05 00:18:10 +00:00
public function showExportAttendees($event_id, $export_as = 'xls')
{
Excel::create('attendees-as-of-'.date('d-m-Y-g.i.a'), function ($excel) use ($event_id) {
2016-02-29 15:59:36 +00:00
$excel->setTitle('Attendees List');
// Chain the setters
$excel->setCreator(config('attendize.app_name'))
->setCompany(config('attendize.app_name'));
2016-02-29 15:59:36 +00:00
2016-03-05 00:18:10 +00:00
$excel->sheet('attendees_sheet_1', function ($sheet) use ($event_id) {
2016-02-29 15:59:36 +00:00
DB::connection()->setFetchMode(\PDO::FETCH_ASSOC);
$data = DB::table('attendees')
->where('attendees.event_id', '=', $event_id)
->where('attendees.is_cancelled', '=', 0)
->where('attendees.account_id', '=', Auth::user()->account_id)
->join('events', 'events.id', '=', 'attendees.event_id')
->join('orders', 'orders.id', '=', 'attendees.order_id')
->join('tickets', 'tickets.id', '=', 'attendees.ticket_id')
->select(
'attendees.first_name', 'attendees.last_name', 'attendees.email', 'attendees.reference', 'orders.order_reference', 'tickets.title', 'orders.created_at', DB::raw("(CASE WHEN attendees.has_arrived = 1 THEN 'YES' ELSE 'NO' END) AS `attendees.has_arrived`"), 'attendees.arrival_time')->get();
//DB::raw("(CASE WHEN UNIX_TIMESTAMP(`attendees.arrival_time`) = 0 THEN '---' ELSE 'd' END) AS `attendees.arrival_time`"))
$sheet->fromArray($data);
2016-03-05 00:18:10 +00:00
$sheet->row(1, [
'First Name', 'Last Name', 'Email', 'Ticket Reference', 'Order Reference', 'Ticket Type', 'Purchase Date', 'Has Arrived', 'Arrival Time',
]);
2016-02-29 15:59:36 +00:00
// Set gray background on first row
2016-03-05 00:18:10 +00:00
$sheet->row(1, function ($row) {
2016-02-29 15:59:36 +00:00
$row->setBackground('#f5f5f5');
});
});
})->export($export_as);
}
/**
* Show the 'Edit Attendee' modal
*
* @param Request $request
* @param $event_id
* @param $attendee_id
* @return View
*/
public function showEditAttendee(Request $request, $event_id, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$attendee = Attendee::scope()->findOrFail($attendee_id);
$data = [
'attendee' => $attendee,
2016-03-05 00:18:10 +00:00
'event' => $attendee->event,
'tickets' => $attendee->event->tickets->lists('title', 'id'),
'modal_id' => $request->get('modal_id'),
2016-02-29 15:59:36 +00:00
];
return view('ManageEvent.Modals.EditAttendee', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Updates an attendee
*
* @param Request $request
* @param $event_id
* @param $attendee_id
* @return mixed
*/
public function postEditAttendee(Request $request, $event_id, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$rules = [
'first_name' => 'required',
2016-03-05 00:18:10 +00:00
'ticket_id' => 'required|exists:tickets,id,account_id,'.Auth::user()->account_id,
'email' => 'required|email',
2016-02-29 15:59:36 +00:00
];
$messages = [
2016-03-05 00:18:10 +00:00
'ticket_id.exists' => 'The ticket you have selected does not exist',
'ticket_id.required' => 'The ticket field is required. ',
2016-02-29 15:59:36 +00:00
];
$validator = Validator::make($request->all(), $rules, $messages);
2016-02-29 15:59:36 +00:00
if ($validator->fails()) {
return response()->json([
2016-03-05 00:18:10 +00:00
'status' => 'error',
'messages' => $validator->messages()->toArray(),
]);
2016-02-29 15:59:36 +00:00
}
$attendee = Attendee::scope()->findOrFail($attendee_id);
$attendee->update($request->all());
2016-02-29 15:59:36 +00:00
session()->flash('message', 'Successfully Updated Attendee');
2016-02-29 15:59:36 +00:00
return response()->json([
'status' => 'success',
'id' => $attendee->id,
'redirectUrl' => '',
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
/**
* Shows the 'Cancel Attendee' modal
*
* @param Request $request
* @param $event_id
* @param $attendee_id
* @return View
*/
public function showCancelAttendee(Request $request, $event_id, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$attendee = Attendee::scope()->findOrFail($attendee_id);
$data = [
'attendee' => $attendee,
2016-03-05 00:18:10 +00:00
'event' => $attendee->event,
'tickets' => $attendee->event->tickets->lists('title', 'id'),
'modal_id' => $request->get('modal_id'),
2016-02-29 15:59:36 +00:00
];
return view('ManageEvent.Modals.CancelAttendee', $data);
2016-02-29 15:59:36 +00:00
}
/**
* Cancels an attendee
*
* @param Request $request
* @param $event_id
* @param $attendee_id
* @return mixed
*/
public function postCancelAttendee(Request $request, $event_id, $attendee_id)
2016-03-05 00:18:10 +00:00
{
2016-02-29 15:59:36 +00:00
$attendee = Attendee::scope()->findOrFail($attendee_id);
2016-03-07 17:37:16 +00:00
if ($attendee->is_cancelled) {
return Response::json([
'status' => 'success',
'message' => 'Attendee Already Cancelled',
]);
}
2016-02-29 15:59:36 +00:00
$attendee->ticket->decrement('quantity_sold');
$attendee->is_cancelled = 1;
$attendee->save();
$data = [
2016-03-05 00:18:10 +00:00
'attendee' => $attendee,
'email_logo' => $attendee->event->organiser->full_logo_path,
2016-02-29 15:59:36 +00:00
];
2016-03-05 00:18:10 +00:00
if ($request->get('notify_attendee') == '1') {
2016-03-05 00:18:10 +00:00
Mail::send('Emails.notifyCancelledAttendee', $data, function ($message) use ($attendee) {
2016-02-29 15:59:36 +00:00
$message->to($attendee->email, $attendee->full_name)
->from(config('attendize.outgoing_email_noreply'), $attendee->event->organiser->name)
2016-02-29 15:59:36 +00:00
->replyTo($attendee->event->organiser->email, $attendee->event->organiser->name)
->subject('You\'re ticket has been cancelled');
});
}
session()->flash('message', 'Successfully Cancelled Attenddee');
2016-02-29 15:59:36 +00:00
return response()->json([
'status' => 'success',
'id' => $attendee->id,
'redirectUrl' => '',
]);
}
/**
* Show the 'Message Attendee' modal
*
* @param Request $request
* @param $attendee_id
* @return View
*/
public function showResendTicketToAttendee(Request $request, $attendee_id)
{
$attendee = Attendee::scope()->findOrFail($attendee_id);
$data = [
'attendee' => $attendee,
'event' => $attendee->event,
'modal_id' => $request->get('modal_id'),
];
return view('ManageEvent.Modals.ResendTicketToAttendee', $data);
}
/**
* Send a message to an attendee
*
* @param Request $request
* @param $attendee_id
* @return mixed
*/
public function postResendTicketToAttendee(Request $request, $attendee_id)
{
$attendee = Attendee::scope()->findOrFail($attendee_id);
$this->dispatch(new SendAttendeeTicketCommand($attendee));
return response()->json([
'status' => 'success',
'message' => 'Ticket Successfully Resent',
2016-03-05 00:18:10 +00:00
]);
2016-02-29 15:59:36 +00:00
}
}