2016-03-05 00:18:10 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
use App;
|
2016-02-29 15:59:36 +00:00
|
|
|
use App\Commands\OrderTicketsCommand;
|
|
|
|
|
use App\Models\Affiliate;
|
|
|
|
|
use App\Models\Attendee;
|
2016-03-05 00:18:10 +00:00
|
|
|
use App\Models\Event;
|
2016-02-29 15:59:36 +00:00
|
|
|
use App\Models\EventStats;
|
2016-03-05 00:18:10 +00:00
|
|
|
use App\Models\Order;
|
2016-02-29 15:59:36 +00:00
|
|
|
use App\Models\OrderItem;
|
|
|
|
|
use App\Models\ReservedTickets;
|
2016-03-05 00:18:10 +00:00
|
|
|
use App\Models\Ticket;
|
|
|
|
|
use Carbon\Carbon;
|
2016-03-16 01:13:49 +00:00
|
|
|
use Illuminate\Http\Request;
|
2016-03-05 00:18:10 +00:00
|
|
|
use Cookie;
|
|
|
|
|
use DB;
|
|
|
|
|
use Log;
|
2016-03-07 17:37:16 +00:00
|
|
|
use Omnipay;
|
2016-03-05 00:18:10 +00:00
|
|
|
use PDF;
|
|
|
|
|
use Validator;
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
class EventCheckoutController extends Controller
|
|
|
|
|
{
|
2016-03-16 01:13:49 +00:00
|
|
|
/**
|
|
|
|
|
* Is the checkout in an embedded Iframe?
|
|
|
|
|
*
|
|
|
|
|
* @var bool
|
|
|
|
|
*/
|
2016-02-29 15:59:36 +00:00
|
|
|
protected $is_embedded;
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
/**
|
|
|
|
|
* EventCheckoutController constructor.
|
|
|
|
|
* @param Request $request
|
|
|
|
|
*/
|
|
|
|
|
public function __construct(Request $request)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* See if the checkout is being called from an embedded iframe.
|
|
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
$this->is_embedded = $request->get('is_embedded') == '1';
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
/**
|
|
|
|
|
* Validate a ticket request. If successful reserve the tickets and redirect to checkout
|
|
|
|
|
*
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @param $event_id
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
|
|
|
|
*/
|
|
|
|
|
public function postValidateTickets(Request $request, $event_id)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* Order expires after X min
|
|
|
|
|
*/
|
2016-03-04 23:27:13 +00:00
|
|
|
$order_expires_time = Carbon::now()->addMinutes(config('attendize.checkout_timeout_after'));
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
$event = Event::findOrFail($event_id);
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
$ticket_ids = $request->get('tickets');
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Remove any tickets the user has reserved
|
|
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
ReservedTickets::where('session_id', '=', session()->getId())->delete();
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
/*
|
2016-03-05 00:18:10 +00:00
|
|
|
* Go though the selected tickets and check if they're available
|
2016-02-29 15:59:36 +00:00
|
|
|
* , tot up the price and reserve them to prevent over selling.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
$validation_rules = [];
|
|
|
|
|
$validation_messages = [];
|
|
|
|
|
$tickets = [];
|
|
|
|
|
$order_total = 0;
|
|
|
|
|
$total_ticket_quantity = 0;
|
|
|
|
|
$booking_fee = 0;
|
|
|
|
|
$organiser_booking_fee = 0;
|
|
|
|
|
$quantity_available_validation_rules = [];
|
|
|
|
|
|
|
|
|
|
foreach ($ticket_ids as $ticket_id) {
|
2016-03-16 01:13:49 +00:00
|
|
|
$current_ticket_quantity = (int) $request->get('ticket_'.$ticket_id);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
if ($current_ticket_quantity < 1) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$total_ticket_quantity = $total_ticket_quantity + $current_ticket_quantity;
|
|
|
|
|
|
|
|
|
|
$ticket = Ticket::find($ticket_id);
|
|
|
|
|
|
|
|
|
|
$ticket_quantity_remaining = $ticket->quantity_remaining;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @todo Check max/min per person
|
|
|
|
|
*/
|
|
|
|
|
$max_per_person = min($ticket_quantity_remaining, $ticket->max_per_person);
|
|
|
|
|
|
2016-03-07 17:37:16 +00:00
|
|
|
$quantity_available_validation_rules['ticket_'.$ticket_id] = ['numeric', 'min:'.$ticket->min_per_person, 'max:'.$max_per_person];
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
$quantity_available_validation_messages = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'ticket_'.$ticket_id.'.max' => 'The maximum number of tickets you can register is '.$ticket_quantity_remaining,
|
|
|
|
|
'ticket_'.$ticket_id.'.min' => 'You must select at least '.$ticket->min_per_person.' tickets.',
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
$validator = Validator::make(['ticket_'.$ticket_id => (int) $request->get('ticket_'.$ticket_id)], $quantity_available_validation_rules, $quantity_available_validation_messages);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
if ($validator->fails()) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-05 00:18:10 +00:00
|
|
|
'messages' => $validator->messages()->toArray(),
|
2016-02-29 15:59:36 +00:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$order_total = $order_total + ($current_ticket_quantity * $ticket->price);
|
|
|
|
|
$booking_fee = $booking_fee + ($current_ticket_quantity * $ticket->booking_fee);
|
|
|
|
|
$organiser_booking_fee = $organiser_booking_fee + ($current_ticket_quantity * $ticket->organiser_booking_fee);
|
|
|
|
|
|
|
|
|
|
$tickets[] = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'ticket' => $ticket,
|
|
|
|
|
'qty' => $current_ticket_quantity,
|
|
|
|
|
'price' => ($current_ticket_quantity * $ticket->price),
|
|
|
|
|
'booking_fee' => ($current_ticket_quantity * $ticket->booking_fee),
|
2016-02-29 15:59:36 +00:00
|
|
|
'organiser_booking_fee' => ($current_ticket_quantity * $ticket->organiser_booking_fee),
|
2016-03-07 17:37:16 +00:00
|
|
|
'full_price' => $ticket->price + $ticket->total_booking_fee,
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reserve the tickets in the DB
|
|
|
|
|
*/
|
2016-03-05 00:18:10 +00:00
|
|
|
$reservedTickets = new ReservedTickets();
|
2016-02-29 15:59:36 +00:00
|
|
|
$reservedTickets->ticket_id = $ticket_id;
|
|
|
|
|
$reservedTickets->event_id = $event_id;
|
|
|
|
|
$reservedTickets->quantity_reserved = $current_ticket_quantity;
|
|
|
|
|
$reservedTickets->expires = $order_expires_time;
|
2016-03-16 01:13:49 +00:00
|
|
|
$reservedTickets->session_id = session()->getId();
|
2016-02-29 15:59:36 +00:00
|
|
|
$reservedTickets->save();
|
|
|
|
|
|
|
|
|
|
if ($event->ask_for_all_attendees_info) {
|
|
|
|
|
for ($i = 0; $i < $current_ticket_quantity; $i++) {
|
|
|
|
|
/*
|
|
|
|
|
* Create our validation rules here
|
|
|
|
|
*/
|
2016-03-07 17:37:16 +00:00
|
|
|
$validation_rules['ticket_holder_first_name.'.$i.'.'.$ticket_id] = ['required'];
|
|
|
|
|
$validation_rules['ticket_holder_last_name.'.$i.'.'.$ticket_id] = ['required'];
|
|
|
|
|
$validation_rules['ticket_holder_email.'.$i.'.'.$ticket_id] = ['required', 'email'];
|
|
|
|
|
|
|
|
|
|
$validation_messages['ticket_holder_first_name.'.$i.'.'.$ticket_id.'.required'] = 'Ticket holder '.($i + 1).'\'s first name is required';
|
|
|
|
|
$validation_messages['ticket_holder_last_name.'.$i.'.'.$ticket_id.'.required'] = 'Ticket holder '.($i + 1).'\'s last name is required';
|
|
|
|
|
$validation_messages['ticket_holder_email.'.$i.'.'.$ticket_id.'.required'] = 'Ticket holder '.($i + 1).'\'s email is required';
|
|
|
|
|
$validation_messages['ticket_holder_email.'.$i.'.'.$ticket_id.'.email'] = 'Ticket holder '.($i + 1).'\'s email appears to be invalid';
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (empty($tickets)) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-05 00:18:10 +00:00
|
|
|
'message' => 'No tickets selected.',
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @todo - Store this in something other than a session?
|
|
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
session()->set('ticket_order_'.$event->id, [
|
2016-03-20 16:01:50 +00:00
|
|
|
'validation_rules' => $validation_rules,
|
|
|
|
|
'validation_messages' => $validation_messages,
|
|
|
|
|
'event_id' => $event->id,
|
|
|
|
|
'tickets' => $tickets, /* probably shouldn't store the whole ticket obj in session */
|
|
|
|
|
'total_ticket_quantity' => $total_ticket_quantity,
|
|
|
|
|
'order_started' => time(),
|
|
|
|
|
'expires' => $order_expires_time,
|
|
|
|
|
'reserved_tickets_id' => $reservedTickets->id,
|
|
|
|
|
'order_total' => $order_total,
|
|
|
|
|
'booking_fee' => $booking_fee,
|
|
|
|
|
'organiser_booking_fee' => $organiser_booking_fee,
|
|
|
|
|
'total_booking_fee' => $booking_fee + $organiser_booking_fee,
|
|
|
|
|
'order_requires_payment' => (ceil($order_total) == 0) ? false : true,
|
|
|
|
|
'account_id' => $event->account->id,
|
|
|
|
|
'affiliate_referral' => Cookie::get('affiliate_'.$event_id),
|
|
|
|
|
'account_payment_gateway' => $event->account->active_payment_gateway->exists() ? $event->account->active_payment_gateway : false,
|
|
|
|
|
'payment_gateway' => $event->account->active_payment_gateway->payment_gateway->exists() ? $event->account->active_payment_gateway->payment_gateway : false,
|
2016-02-29 15:59:36 +00:00
|
|
|
]);
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
if ($request->ajax()) {
|
|
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'success',
|
2016-02-29 15:59:36 +00:00
|
|
|
'redirectUrl' => route('showEventCheckout', [
|
2016-03-07 17:37:16 +00:00
|
|
|
'event_id' => $event_id,
|
2016-03-05 00:18:10 +00:00
|
|
|
'is_embedded' => $this->is_embedded,
|
2016-03-07 17:37:16 +00:00
|
|
|
]).'#order_form',
|
2016-03-05 00:18:10 +00:00
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
exit('Please enable Javascript in your browser.');
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
/**
|
|
|
|
|
* Show the checkout page
|
|
|
|
|
*
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @param $event_id
|
|
|
|
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
|
|
|
|
|
*/
|
|
|
|
|
public function showEventCheckout(Request $request, $event_id)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
2016-03-16 01:13:49 +00:00
|
|
|
$order_session = session()->get('ticket_order_'.$event_id);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
if (!$order_session || $order_session['expires'] < Carbon::now()) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return redirect()->route('showEventPage', ['event_id' => $event_id]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$secondsToExpire = Carbon::now()->diffInSeconds($order_session['expires']);
|
|
|
|
|
|
|
|
|
|
$data = $order_session + [
|
2016-03-07 17:37:16 +00:00
|
|
|
'event' => Event::findorFail($order_session['event_id']),
|
2016-02-29 15:59:36 +00:00
|
|
|
'secondsToExpire' => $secondsToExpire,
|
2016-03-07 17:37:16 +00:00
|
|
|
'is_embedded' => $this->is_embedded,
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if ($this->is_embedded) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return view('Public.ViewEvent.Embedded.EventPageCheckout', $data);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-05 00:18:10 +00:00
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
return view('Public.ViewEvent.EventPageCheckout', $data);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
/**
|
|
|
|
|
* Create the order, handle payment, update stats, fire off email jobs then redirect user
|
|
|
|
|
*
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @param $event_id
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
|
|
|
|
*/
|
|
|
|
|
public function postCreateOrder(Request $request, $event_id)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
2016-03-16 01:13:49 +00:00
|
|
|
$mirror_buyer_info = ($request->get('mirror_buyer_info') == 'on');
|
2016-02-29 15:59:36 +00:00
|
|
|
$event = Event::findOrFail($event_id);
|
2016-03-20 16:01:50 +00:00
|
|
|
$order = new Order;
|
2016-03-16 01:13:49 +00:00
|
|
|
$ticket_order = session()->get('ticket_order_'.$event_id);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
$validation_rules = $ticket_order['validation_rules'];
|
|
|
|
|
$validation_messages = $ticket_order['validation_messages'];
|
|
|
|
|
|
|
|
|
|
if (!$mirror_buyer_info && $event->ask_for_all_attendees_info) {
|
|
|
|
|
$order->rules = $order->rules + $validation_rules;
|
|
|
|
|
$order->messages = $order->messages + $validation_messages;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
if (!$order->validate($request->all())) {
|
|
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-05 00:18:10 +00:00
|
|
|
'messages' => $order->errors(),
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
/*
|
|
|
|
|
* Add the request data to a session in case payment is required off-site
|
|
|
|
|
*/
|
|
|
|
|
session()->push('ticket_order_' . $event_id .'.request_data', $request->except(['card-number', 'card-cvc']));
|
|
|
|
|
|
2016-03-05 00:18:10 +00:00
|
|
|
/*
|
2016-02-29 15:59:36 +00:00
|
|
|
* Begin payment attempt before creating the attendees etc.
|
|
|
|
|
* */
|
|
|
|
|
if ($ticket_order['order_requires_payment']) {
|
|
|
|
|
try {
|
|
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
$gateway = Omnipay::create($ticket_order['payment_gateway']->name);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
$gateway->initialize($ticket_order['account_payment_gateway']->config + [
|
|
|
|
|
'testMode' => config('attendize.enable_test_payments'),
|
|
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
switch($ticket_order['payment_gateway']->id) {
|
|
|
|
|
case config('attendize.payment_gateway_paypal'):
|
2016-03-21 00:05:25 +00:00
|
|
|
case config('attendize.payment_gateway_coinbase'):
|
2016-03-20 16:01:50 +00:00
|
|
|
|
|
|
|
|
$transaction_data = [
|
|
|
|
|
'cancelUrl' => route('showEventCheckoutPaymentReturn' , [
|
|
|
|
|
'event_id' => $event_id,
|
|
|
|
|
'is_payment_cancelled' => 1
|
|
|
|
|
]),
|
|
|
|
|
'returnUrl' => route('showEventCheckoutPaymentReturn' , [
|
|
|
|
|
'event_id' => $event_id,
|
|
|
|
|
'is_payment_successful' => 1
|
|
|
|
|
]),
|
|
|
|
|
'brandName' => isset($ticket_order['account_payment_gateway']->config['brandingName'])
|
|
|
|
|
? $ticket_order['account_payment_gateway']->config['brandingName']
|
|
|
|
|
: $event->organiser->name
|
|
|
|
|
];
|
|
|
|
|
break;
|
|
|
|
|
break;
|
|
|
|
|
case config('attendize.payment_gateway_stripe'):
|
|
|
|
|
$token = $request->get('stripeToken');
|
|
|
|
|
$transaction_data = [
|
|
|
|
|
'token' => $token,
|
|
|
|
|
];
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
Log::error('No payment gateway configured.');
|
|
|
|
|
return repsonse()->json([
|
|
|
|
|
'status' => 'error',
|
|
|
|
|
'message' => 'No payment gateway configured.'
|
|
|
|
|
]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$transaction_data = [
|
|
|
|
|
'amount' => ($ticket_order['order_total'] + $ticket_order['organiser_booking_fee']),
|
|
|
|
|
'currency' => $event->currency->code,
|
|
|
|
|
'description' => 'Order for customer: '.$request->get('order_email'),
|
|
|
|
|
] + $transaction_data;
|
|
|
|
|
|
|
|
|
|
$transaction = $gateway->purchase($transaction_data);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-06 17:59:19 +00:00
|
|
|
$response = $transaction->send();
|
|
|
|
|
|
|
|
|
|
if ($response->isSuccessful()) {
|
2016-03-20 16:01:50 +00:00
|
|
|
|
|
|
|
|
session()->push('ticket_order_' . $event_id .'.transaction_id', $response->getTransactionReference());
|
|
|
|
|
return $this->completeOrder($event_id);
|
|
|
|
|
|
2016-03-06 17:59:19 +00:00
|
|
|
} elseif ($response->isRedirect()) {
|
2016-03-20 16:01:50 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* As we're going off-site for payment we need to store some into in a session
|
|
|
|
|
*/
|
|
|
|
|
session()->push('ticket_order_' . $event_id .'.transaction_data', $transaction_data);
|
|
|
|
|
|
|
|
|
|
return response()->json([
|
|
|
|
|
'status' => 'success',
|
|
|
|
|
'redirectUrl' => $response->getRedirectUrl(),
|
|
|
|
|
'redirectData' => $response->getRedirectData(),
|
|
|
|
|
'message' => 'Redirecting to ' . $ticket_order['payment_gateway']->provider_name
|
|
|
|
|
]);
|
|
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
} else {
|
2016-03-06 17:59:19 +00:00
|
|
|
// display error to customer
|
2016-03-16 01:13:49 +00:00
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-06 17:59:19 +00:00
|
|
|
'message' => $response->getMessage(),
|
2016-03-05 00:18:10 +00:00
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-06 17:59:19 +00:00
|
|
|
} catch (\Exeption $e) {
|
2016-02-29 15:59:36 +00:00
|
|
|
Log::error($e);
|
2016-03-06 17:59:19 +00:00
|
|
|
$error = 'Sorry, there was an error processing your payment. Please try again.';
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-06 17:59:19 +00:00
|
|
|
if ($error) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return response()->json([
|
2016-03-07 17:37:16 +00:00
|
|
|
'status' => 'error',
|
2016-03-06 17:59:19 +00:00
|
|
|
'message' => $error,
|
2016-03-05 00:18:10 +00:00
|
|
|
]);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* No payment required so go ahead and complete the order
|
|
|
|
|
*/
|
|
|
|
|
return $this->completeOrder($event_id);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function showEventCheckoutPaymentReturn(Request $request, $event_id)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if($request->get('is_payment_cancelled') == '1') {
|
|
|
|
|
session()->flash('message', 'You cancelled your payment. You may try again.');
|
|
|
|
|
return response()->redirectToRoute('showEventCheckout', [
|
|
|
|
|
'event_id' => $event_id,
|
|
|
|
|
'is_payment_cancelled' => 1,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ticket_order = session()->get('ticket_order_' . $event_id);
|
|
|
|
|
$gateway = Omnipay::create($ticket_order['payment_gateway']->name);
|
|
|
|
|
|
|
|
|
|
$gateway->initialize($ticket_order['account_payment_gateway']->config + [
|
|
|
|
|
'testMode' => config('attendize.enable_test_payments'),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$transaction = $gateway->completePurchase($ticket_order['transaction_data'][0]);
|
|
|
|
|
|
|
|
|
|
$response = $transaction->send();
|
|
|
|
|
|
|
|
|
|
if ($response->isSuccessful()) {
|
|
|
|
|
session()->push('ticket_order_' . $event_id .'.transaction_id', $response->getTransactionReference());
|
|
|
|
|
return $this->completeOrder($event_id, false);
|
|
|
|
|
} else {
|
|
|
|
|
session()->flash('message', $response->getMessage());
|
|
|
|
|
return response()->redirectToRoute('showEventCheckout', [
|
|
|
|
|
'event_id' => $event_id,
|
|
|
|
|
'is_payment_failed' => 1,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Complete an order
|
|
|
|
|
*
|
|
|
|
|
* @param $event_id
|
|
|
|
|
* @param bool|true $return_json
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
|
|
|
|
*/
|
|
|
|
|
public function completeOrder($event_id, $return_json=true)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
$order = new Order();
|
|
|
|
|
$ticket_order = session()->get('ticket_order_' . $event_id);
|
|
|
|
|
$request_data = $ticket_order['request_data'][0];
|
|
|
|
|
$event = Event::findOrFail($ticket_order['event_id']);
|
|
|
|
|
$attendee_increment = 1;
|
|
|
|
|
$mirror_buyer_info = isset($request_data['mirror_buyer_info']) ? ($request_data['mirror_buyer_info'] == 'on') : false;
|
|
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
/*
|
|
|
|
|
* Create the order
|
|
|
|
|
*/
|
2016-03-20 16:01:50 +00:00
|
|
|
if(isset($ticket_order['transaction_id']))
|
|
|
|
|
{
|
|
|
|
|
$order->transaction_id = $ticket_order['transaction_id'][0];
|
|
|
|
|
}
|
|
|
|
|
if($ticket_order['order_requires_payment']) {
|
|
|
|
|
$order->payment_gateway_id = $ticket_order['payment_gateway']->id;
|
|
|
|
|
}
|
|
|
|
|
$order->first_name = $request_data['order_first_name'];
|
|
|
|
|
$order->last_name = $request_data['order_last_name'];
|
|
|
|
|
$order->email = $request_data['order_email'];
|
2016-03-04 23:27:13 +00:00
|
|
|
$order->order_status_id = config('attendize.order_complete');
|
2016-02-29 15:59:36 +00:00
|
|
|
$order->amount = $ticket_order['order_total'];
|
|
|
|
|
$order->booking_fee = $ticket_order['booking_fee'];
|
|
|
|
|
$order->organiser_booking_fee = $ticket_order['organiser_booking_fee'];
|
|
|
|
|
$order->discount = 0.00;
|
|
|
|
|
$order->account_id = $event->account->id;
|
2016-03-20 16:01:50 +00:00
|
|
|
$order->event_id = $ticket_order['event_id'];
|
2016-02-29 15:59:36 +00:00
|
|
|
$order->save();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Update the event sales volume
|
|
|
|
|
*/
|
|
|
|
|
$event->increment('sales_volume', $order->amount);
|
|
|
|
|
$event->increment('organiser_fees_volume', $order->organiser_booking_fee);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Update affiliates stats stats
|
|
|
|
|
*/
|
|
|
|
|
if ($ticket_order['affiliate_referral']) {
|
2016-03-11 12:33:45 +00:00
|
|
|
$affiliate = Affiliate::where('name', '=', $ticket_order['affiliate_referral'])
|
|
|
|
|
->where('event_id', '=', $event_id)->first();
|
2016-02-29 15:59:36 +00:00
|
|
|
$affiliate->increment('sales_volume', $order->amount + $order->organiser_booking_fee);
|
|
|
|
|
$affiliate->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2016-03-05 00:18:10 +00:00
|
|
|
* Update the event stats
|
2016-02-29 15:59:36 +00:00
|
|
|
*/
|
|
|
|
|
$event_stats = EventStats::firstOrNew([
|
|
|
|
|
'event_id' => $event_id,
|
2016-03-07 17:37:16 +00:00
|
|
|
'date' => DB::raw('CURDATE()'),
|
2016-02-29 15:59:36 +00:00
|
|
|
]);
|
|
|
|
|
$event_stats->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
|
|
|
|
|
|
|
|
|
|
if ($ticket_order['order_requires_payment']) {
|
|
|
|
|
$event_stats->increment('sales_volume', $order->amount);
|
|
|
|
|
$event_stats->increment('organiser_fees_volume', $order->organiser_booking_fee);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Add the attendees
|
|
|
|
|
*/
|
|
|
|
|
foreach ($ticket_order['tickets'] as $attendee_details) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Update ticket's quantity sold
|
|
|
|
|
*/
|
|
|
|
|
$ticket = Ticket::findOrFail($attendee_details['ticket']['id']);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Update some ticket info
|
|
|
|
|
*/
|
|
|
|
|
$ticket->increment('quantity_sold', $attendee_details['qty']);
|
|
|
|
|
$ticket->increment('sales_volume', ($attendee_details['ticket']['price'] * $attendee_details['qty']));
|
|
|
|
|
$ticket->increment('organiser_fees_volume', ($attendee_details['ticket']['organiser_booking_fee'] * $attendee_details['qty']));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Insert order items (for use in generating invoices)
|
|
|
|
|
*/
|
2016-03-05 00:18:10 +00:00
|
|
|
$orderItem = new OrderItem();
|
2016-02-29 15:59:36 +00:00
|
|
|
$orderItem->title = $attendee_details['ticket']['title'];
|
|
|
|
|
$orderItem->quantity = $attendee_details['qty'];
|
|
|
|
|
$orderItem->order_id = $order->id;
|
|
|
|
|
$orderItem->unit_price = $attendee_details['ticket']['price'];
|
|
|
|
|
$orderItem->unit_booking_fee = $attendee_details['ticket']['booking_fee'] + $attendee_details['ticket']['organiser_booking_fee'];
|
|
|
|
|
$orderItem->save();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the attendees
|
|
|
|
|
*/
|
|
|
|
|
for ($i = 0; $i < $attendee_details['qty']; $i++) {
|
2016-03-05 00:18:10 +00:00
|
|
|
$attendee = new Attendee();
|
2016-03-20 16:01:50 +00:00
|
|
|
$attendee->first_name = $event->ask_for_all_attendees_info ? ($mirror_buyer_info ? $order->first_name : $request_data["ticket_holder_first_name.$i.{$attendee_details['ticket']['id']}"]) : $order->first_name;
|
|
|
|
|
$attendee->last_name = $event->ask_for_all_attendees_info ? ($mirror_buyer_info ? $order->last_name : $request_data["ticket_holder_last_name.$i.{$attendee_details['ticket']['id']}"]) : $order->last_name;
|
|
|
|
|
$attendee->email = $event->ask_for_all_attendees_info ? ($mirror_buyer_info ? $order->email : $request_data["ticket_holder_email.$i.{$attendee_details['ticket']['id']}"]) : $order->email;
|
2016-02-29 15:59:36 +00:00
|
|
|
$attendee->event_id = $event_id;
|
|
|
|
|
$attendee->order_id = $order->id;
|
|
|
|
|
$attendee->ticket_id = $attendee_details['ticket']['id'];
|
|
|
|
|
$attendee->account_id = $event->account->id;
|
2016-03-07 17:37:16 +00:00
|
|
|
$attendee->reference = $order->order_reference.'-'.($attendee_increment);
|
2016-02-29 15:59:36 +00:00
|
|
|
$attendee->save();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Queue an email to send to each attendee
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* Keep track of total number of attendees */
|
|
|
|
|
$attendee_increment++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2016-03-20 16:01:50 +00:00
|
|
|
* Queue up some tasks - Emails to be sent, PDFs etc.
|
2016-02-29 15:59:36 +00:00
|
|
|
*/
|
|
|
|
|
$this->dispatch(new OrderTicketsCommand($order));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Release the reserved the tickets
|
|
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
ReservedTickets::where('session_id', '=', session()->getId())->delete();
|
2016-02-29 15:59:36 +00:00
|
|
|
|
|
|
|
|
/*
|
2016-03-05 00:18:10 +00:00
|
|
|
* Kill the session
|
2016-02-29 15:59:36 +00:00
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
session()->forget('ticket_order_'.$event->id);
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
if($return_json) {
|
|
|
|
|
return response()->json([
|
|
|
|
|
'status' => 'success',
|
|
|
|
|
'redirectUrl' => route('showOrderDetails', [
|
|
|
|
|
'is_embedded' => $this->is_embedded,
|
|
|
|
|
'order_reference' => $order->order_reference,
|
|
|
|
|
]),
|
|
|
|
|
]);
|
|
|
|
|
}
|
2016-02-29 15:59:36 +00:00
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
return response()->redirectToRoute('showOrderDetails', [
|
2016-03-07 17:37:16 +00:00
|
|
|
'is_embedded' => $this->is_embedded,
|
2016-03-05 00:18:10 +00:00
|
|
|
'order_reference' => $order->order_reference,
|
2016-03-20 16:01:50 +00:00
|
|
|
]);
|
|
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-20 16:01:50 +00:00
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
/**
|
2016-03-16 01:13:49 +00:00
|
|
|
* Show the order details page
|
2016-02-29 15:59:36 +00:00
|
|
|
*
|
2016-03-16 01:13:49 +00:00
|
|
|
* @param Request $request
|
|
|
|
|
* @param $order_reference
|
|
|
|
|
* @return \Illuminate\View\View
|
2016-02-29 15:59:36 +00:00
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
public function showOrderDetails(Request $request, $order_reference)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
|
|
|
|
$order = Order::where('order_reference', '=', $order_reference)->first();
|
|
|
|
|
|
|
|
|
|
if (!$order) {
|
2016-03-16 01:13:49 +00:00
|
|
|
abort(404);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => $order,
|
|
|
|
|
'event' => $order->event,
|
|
|
|
|
'tickets' => $order->event->tickets,
|
2016-03-05 00:18:10 +00:00
|
|
|
'is_embedded' => $this->is_embedded,
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if ($this->is_embedded) {
|
2016-03-16 01:13:49 +00:00
|
|
|
return view('Public.ViewEvent.Embedded.EventPageViewOrder', $data);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-05 00:18:10 +00:00
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
return view('Public.ViewEvent.EventPageViewOrder', $data);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2016-03-16 01:13:49 +00:00
|
|
|
* Shows the tickets for an order - either HTML or PDF
|
2016-02-29 15:59:36 +00:00
|
|
|
*
|
2016-03-16 01:13:49 +00:00
|
|
|
* @param Request $request
|
|
|
|
|
* @param $order_reference
|
|
|
|
|
* @return \Illuminate\View\View
|
2016-02-29 15:59:36 +00:00
|
|
|
*/
|
2016-03-16 01:13:49 +00:00
|
|
|
public function showOrderTickets(Request $request, $order_reference)
|
2016-02-29 15:59:36 +00:00
|
|
|
{
|
|
|
|
|
$order = Order::where('order_reference', '=', $order_reference)->first();
|
|
|
|
|
|
|
|
|
|
if (!$order) {
|
2016-03-16 01:13:49 +00:00
|
|
|
abort(404);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data = [
|
2016-03-07 17:37:16 +00:00
|
|
|
'order' => $order,
|
|
|
|
|
'event' => $order->event,
|
|
|
|
|
'tickets' => $order->event->tickets,
|
2016-03-05 00:18:10 +00:00
|
|
|
'attendees' => $order->attendees,
|
2016-02-29 15:59:36 +00:00
|
|
|
];
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
if ($request->get('download') == '1') {
|
2016-02-29 15:59:36 +00:00
|
|
|
return PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, 'Tickets');
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 01:13:49 +00:00
|
|
|
return view('Public.ViewEvent.Partials.PDFTicket', $data);
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|
2016-03-07 17:18:55 +00:00
|
|
|
|
2016-02-29 15:59:36 +00:00
|
|
|
}
|