Attendize/app/Http/Controllers/EventQrcodeCheckInControlle...

115 lines
4.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use App\Models\Attendee;
use App\Models\Event;
use Carbon\Carbon;
use Illuminate\Http\Request;
use JavaScript;
class EventQrcodeCheckInController extends Controller
{
/**
* Show the check-in page
*
* @param $event_id
* @return \Illuminate\View\View
*/
public function showCheckIn($event_id)
{
$event = Event::scope()->findOrFail($event_id);
JavaScript::put([
'qrcodeCheckInRoute' => route('postQRCodeCheckInAttendee', ['event_id' => $event->id])
]);
return view('ManageEvent.QrcodeCheckIn', compact('event'));
}
/**
* Check in an attendee
*
* @param $event_id
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function postCheckInAttendee($event_id, Request $request)
{
$event = Event::scope()->findOrFail($event_id);
$qrcodeToken = $request->get('qrcode_token');
$attendee = Attendee::scope()->withoutCancelled()
->join('tickets', 'tickets.id', '=', 'attendees.ticket_id')
->where(function ($query) use ($event, $qrcodeToken) {
$query->where('attendees.event_id', $event->id)
->where('attendees.private_reference_number', $qrcodeToken);
})->select([
'attendees.id',
'attendees.order_id',
'attendees.first_name',
'attendees.last_name',
'attendees.email',
'attendees.reference',
'attendees.arrival_time',
'attendees.has_arrived',
'tickets.title as ticket',
])->first();
if(is_null($attendee)){
return response()->json(['status' => 'error', 'message' => "Invalid Ticket! Please try again."]);
}
$relatedAttendesCount = Attendee::where('id', '!=', $attendee->id)
->where([
'order_id' => $attendee->order_id,
'has_arrived' => false
])->count();
if($relatedAttendesCount >= 1){
$confirmOrderTicketsRoute = route('confirmCheckInOrderTickets', [$event->id, $attendee->order_id]);
$appendedText = '<br><br><form action="'. $confirmOrderTicketsRoute .'" method="POST">'. csrf_field() .'<input type="hidden" name="_method" value="PUT"><div class="row"><div class="col-md-10 col-md-offset-1 col-xs-12"><button class="btn btn-primary btn-block btn-lg" type="submit"><i class="fa fa-ticket"></i> Check in other tickets associated to this order</button></div></div></form>';
} else {
$appendedText = '';
}
if ($attendee->has_arrived) {
return response()->json([
'status' => 'error',
'message' => 'Warning: This attendee has already been checked in at '. $attendee->arrival_time->format('H:i A, F j'). '.' . $appendedText
]);
}
Attendee::find($attendee->id)->update(['has_arrived' => true, 'arrival_time' => Carbon::now()]);
return response()->json([
'status' => 'success',
'message' => 'Success !<br>Name: ' . $attendee->first_name . ' ' . $attendee->last_name . '<br>Reference: '. $attendee->reference . '<br>Ticket: '. $attendee->ticket . '.' . $appendedText
]);
}
/**
* Confirm tickets of same order.
*
* @param $event_id
* @param $order_id
* @return \Illuminate\Http\Response
*/
public function confirmOrderTickets($event_id, $order_id)
{
$updateRowsCount = Attendee::where([
'event_id' => $event_id,
'order_id' => $order_id,
'has_arrived' => false
])
->update(['has_arrived' => true, 'arrival_time' => Carbon::now()]);
session()->flash('success_message', $updateRowsCount . ' other tickets checked in.');
return back();
}
}