Added DB transaction to the checkout page

This commit is contained in:
Dave Earley 2016-05-28 09:28:53 +01:00
parent f7327c4859
commit 15de38ab91
1 changed files with 140 additions and 120 deletions

View File

@ -350,8 +350,8 @@ class EventCheckoutController extends Controller
if ($response->isSuccessful()) {
session()->push('ticket_order_' . $event_id . '.transaction_id',
$response->getTransactionReference());
session()->push('ticket_order_' . $event_id . '.transaction_id', $response->getTransactionReference());
return $this->completeOrder($event_id);
} elseif ($response->isRedirect()) {
@ -450,156 +450,176 @@ class EventCheckoutController extends Controller
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;
$ticket_questions = isset($request_data['ticket_holder_questions']) ? $request_data['ticket_holder_questions'] : [];
DB::beginTransaction();
try {
/*
* Create the order
*/
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'];
$order->order_status_id = config('attendize.order_complete');
$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;
$order->event_id = $ticket_order['event_id'];
$order->save();
$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;
$ticket_questions = isset($request_data['ticket_holder_questions']) ? $request_data['ticket_holder_questions'] : [];
/*
* 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']) {
$affiliate = Affiliate::where('name', '=', $ticket_order['affiliate_referral'])
->where('event_id', '=', $event_id)->first();
$affiliate->increment('sales_volume', $order->amount + $order->organiser_booking_fee);
$affiliate->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
}
/*
* Update the event stats
*/
$event_stats = EventStats::firstOrNew([
'event_id' => $event_id,
'date' => DB::raw('CURRENT_DATE'),
]);
$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
* Create the order
*/
$ticket = Ticket::findOrFail($attendee_details['ticket']['id']);
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'];
$order->order_status_id = config('attendize.order_complete');
$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;
$order->event_id = $ticket_order['event_id'];
$order->save();
/*
* Update some ticket info
* Update the event sales volume
*/
$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']));
$event->increment('sales_volume', $order->amount);
$event->increment('organiser_fees_volume', $order->organiser_booking_fee);
/*
* Insert order items (for use in generating invoices)
* Update affiliates stats stats
*/
$orderItem = new OrderItem();
$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();
if ($ticket_order['affiliate_referral']) {
$affiliate = Affiliate::where('name', '=', $ticket_order['affiliate_referral'])
->where('event_id', '=', $event_id)->first();
$affiliate->increment('sales_volume', $order->amount + $order->organiser_booking_fee);
$affiliate->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
}
/*
* Create the attendees
* Update the event stats
*/
for ($i = 0; $i < $attendee_details['qty']; $i++) {
$event_stats = EventStats::firstOrNew([
'event_id' => $event_id,
'date' => DB::raw('CURRENT_DATE'),
]);
$event_stats->increment('tickets_sold', $ticket_order['total_ticket_quantity']);
$attendee = new Attendee();
$attendee->first_name = $request_data["ticket_holder_first_name"][$i][$attendee_details['ticket']['id']];
$attendee->last_name = $request_data["ticket_holder_last_name"][$i][$attendee_details['ticket']['id']];
$attendee->email = $request_data["ticket_holder_email"][$i][$attendee_details['ticket']['id']];
$attendee->event_id = $event_id;
$attendee->order_id = $order->id;
$attendee->ticket_id = $attendee_details['ticket']['id'];
$attendee->account_id = $event->account->id;
$attendee->reference_index = $attendee_increment;
$attendee->save();
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']));
/*
* Save the attendee's questions
* Insert order items (for use in generating invoices)
*/
foreach ($attendee_details['ticket']->questions as $question) {
$orderItem = new OrderItem();
$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++) {
$ticket_answer = isset($ticket_questions[$attendee_details['ticket']->id][$i][$question->id]) ? $ticket_questions[$attendee_details['ticket']->id][$i][$question->id] : null;
$attendee = new Attendee();
$attendee->first_name = $request_data["ticket_holder_first_name"][$i][$attendee_details['ticket']['id']];
$attendee->last_name = $request_data["ticket_holder_last_name"][$i][$attendee_details['ticket']['id']];
$attendee->email = $request_data["ticket_holder_email"][$i][$attendee_details['ticket']['id']];
$attendee->event_id = $event_id;
$attendee->order_id = $order->id;
$attendee->ticket_id = $attendee_details['ticket']['id'];
$attendee->account_id = $event->account->id;
$attendee->reference_index = $attendee_increment;
$attendee->save();
if (is_null($ticket_answer)) {
continue;
}
/*
* If there are multiple answers to a question then join them with a comma
* and treat them as a single answer.
* Save the attendee's questions
*/
$ticket_answer = is_array($ticket_answer) ? implode(', ', $ticket_answer) : $ticket_answer;
foreach ($attendee_details['ticket']->questions as $question) {
if (!empty($ticket_answer)) {
QuestionAnswer::create([
'answer_text' => $ticket_answer,
'attendee_id' => $attendee->id,
'event_id' => $event->id,
'account_id' => $event->account->id,
'question_id' => $question->id
]);
$ticket_answer = isset($ticket_questions[$attendee_details['ticket']->id][$i][$question->id]) ? $ticket_questions[$attendee_details['ticket']->id][$i][$question->id] : null;
if (is_null($ticket_answer)) {
continue;
}
/*
* If there are multiple answers to a question then join them with a comma
* and treat them as a single answer.
*/
$ticket_answer = is_array($ticket_answer) ? implode(', ', $ticket_answer) : $ticket_answer;
if (!empty($ticket_answer)) {
QuestionAnswer::create([
'answer_text' => $ticket_answer,
'attendee_id' => $attendee->id,
'event_id' => $event->id,
'account_id' => $event->account->id,
'question_id' => $question->id
]);
}
}
/* Keep track of total number of attendees */
$attendee_increment++;
}
/* Keep track of total number of attendees */
$attendee_increment++;
}
/*
* Kill the session
*/
session()->forget('ticket_order_' . $event->id);
/*
* Queue up some tasks - Emails to be sent, PDFs etc.
*/
$this->dispatch(new OrderTicketsCommand($order));
} catch (Exception $e) {
Log::error($e);
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Whoops! There was a problem processing your order. Please try again.'
]);
}
/*
* Kill the session
*/
session()->forget('ticket_order_' . $event->id);
/*
* Queue up some tasks - Emails to be sent, PDFs etc.
*/
$this->dispatch(new OrderTicketsCommand($order));
DB::commit();
if ($return_json) {
return response()->json([
@ -616,8 +636,8 @@ class EventCheckoutController extends Controller
'order_reference' => $order->order_reference,
]);
}
}
/**
* Show the order details page