Added DB transaction to the checkout page
This commit is contained in:
parent
f7327c4859
commit
15de38ab91
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue