Attendize/app/Services/EventOrderService.php

348 lines
12 KiB
PHP

<?php
namespace App\Services;
use App\Models\Event;
class EventOrderService
{
/**
* @var float
*/
private $orderTotal;
/**
* @var float
*/
private $totalBookingFee;
/**
* @var Event
*/
private $event;
/**
* @var float
*/
public $orderTotalWithBookingFee;
/**
* @var float
*/
public $taxAmount;
/**
* @var float
*/
public $grandTotal;
/**
* Order constructor.
* @param $orderTotal
* @param $totalBookingFee
* @param $event
*/
public function __construct($orderTotal, $totalBookingFee, $event) {
$this->orderTotal = $orderTotal;
$this->totalBookingFee = $totalBookingFee;
$this->event = $event;
}
/**
* Calculates the final costs for an event and sets the various totals
*/
public function calculateFinalCosts()
{
$this->orderTotalWithBookingFee = $this->orderTotal + $this->totalBookingFee;
if ($this->event->organiser->charge_tax == 1) {
$this->taxAmount = ($this->orderTotalWithBookingFee * $this->event->organiser->tax_value)/100;
} else {
$this->taxAmount = 0;
}
$this->grandTotal = $this->orderTotalWithBookingFee + $this->taxAmount;
}
/**
* @param bool $currencyFormatted
* @return float|string
*/
public function getOrderTotalWithBookingFee($currencyFormatted = false) {
if ($currencyFormatted == false ) {
return number_format($this->orderTotalWithBookingFee, 2, '.', '');
}
return money($this->orderTotalWithBookingFee, $this->event->currency);
}
/**
* @param bool $currencyFormatted
* @return float|string
*/
public function getTaxAmount($currencyFormatted = false) {
if ($currencyFormatted == false ) {
return number_format($this->taxAmount, 2, '.', '');
}
return money($this->taxAmount, $this->event->currency);
}
/**
* @param bool $currencyFormatted
* @return float|string
*/
public function getGrandTotal($currencyFormatted = false) {
if ($currencyFormatted == false ) {
return number_format($this->grandTotal, 2, '.', '');
}
return money($this->grandTotal, $this->event->currency);
}
/**
* @return string
*/
public function getVatFormattedInBrackets() {
return "(+" . $this->getTaxAmount(true) . " " . $this->event->organiser->tax_name . ")";
}
public static function completeOrder($session_data,$order){
DB::beginTransaction();
try {
$request_data = $session_data['request_data'][0];
$event = Event::findOrFail($order->id);
$attendee_increment = 1;
$ticket_questions = isset($request_data['ticket_holder_questions']) ? $request_data['ticket_holder_questions'] : [];
$order->order_status_id = isset($request_data['pay_offline']) ? config('attendize.order_awaiting_payment') : config('attendize.order_complete');
$order->is_payment_received = isset($request_data['pay_offline']) ? 0 : 1;
$order->save();
/*
* Update the event sales volume
*/
$order->event->increment('sales_volume', $order->amount);
$order->event->increment('organiser_fees_volume', $order->organiser_booking_fee);
/*
* Update the event stats
*/
$event_stats = EventStats::updateOrCreate([
'event_id' => $event->id,
'date' => DB::raw('CURRENT_DATE'),
]);
$event_stats->increment('tickets_sold', $session_data['total_ticket_quantity']);
if ($session_data['order_requires_payment']) {
$event_stats->increment('sales_volume', $order->amount);
$event_stats->increment('organiser_fees_volume', $order->organiser_booking_fee);
}
/*
* Add the attendees
*/
foreach ($session_data['tickets'] as $attendee_details) {
$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']));
/*
* Create the attendees
*/
foreach ($attendee_details['seats'] as $i) {
$attendee = new Attendee();
$attendee->first_name = strip_tags($request_data["ticket_holder_first_name"][$i][$attendee_details['ticket']['id']]);
$attendee->last_name = strip_tags($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 = $order->account_id;
$attendee->reference_index = $attendee_increment;
$attendee->seat_no = $i;
$attendee->save();
/*
* Save the attendee's questions
*/
foreach ($attendee_details['ticket']->questions as $question) {
$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' => $order->account_id,
'question_id' => $question->id
]);
}
}
/* Keep track of total number of attendees */
$attendee_increment++;
}
}
/*
* Remove any tickets the user has reserved after they have been ordered for the user
*/
ReservedTickets::where('session_id', '=', $order->session_id)->delete();
} catch (Exception $e) {
Log::error($e);
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => trans('ClientSide.order_error')
]);
}
//save the order to the database
DB::commit();
//forget the order in the session
// session()->forget('ticket_order_' . $event->id);
// Queue up some tasks - Emails to be sent, PDFs etc.
Log::info('Firing the event');
event(new OrderCompletedEvent($order));
return $order->order_reference;
}
public static function mobileCompleteOrder($event_id,$transaction_id){
DB::beginTransaction();
try {
$order = Order::select('orders.id','order_status_id','is_payment_received','amount','booking_fee','created_at',
'organiser_booking_fee','event_id','session_id','account_id','first_name','last_name','email','order_reference')
->with(['event:id,sales_volume,organiser_fees_volume,organiser_id,title,post_order_display_message'])
->where('transaction_id',$transaction_id)
->where('event_id',$event_id)
->first();
$order->order_status_id = config('attendize.order_complete');
$order->is_payment_received = true;
$obf = $order->organiser_booking_fee;
$orderService = new OrderService($order->amount, $order->booking_fee + $obf, $order->event);
$orderService->calculateFinalCosts();
/*
* Update the event sales volume
*/
$event = $order->event;
$event->increment('sales_volume', $orderService->getGrandTotal());
$event->increment('organiser_fees_volume', $obf);
$reserved_tickets = ReservedTickets::select('id', 'seat_no', 'ticket_id')
->with(['ticket:id,quantity_sold,sales_volume,organiser_fees_volume,price'])
->where('session_id', $order->session_id)
->where('event_id', $event_id)
->get();
/*
* Update the event stats
*/
$event_stats = EventStats::updateOrCreate([
'event_id' => $event_id,
'date' => DB::raw('CURRENT_DATE'),
]);
$event_stats->increment('tickets_sold', $reserved_tickets->count() ?? 0);
$event_stats->increment('sales_volume', $order->amount);
$event_stats->increment('organiser_fees_volume', $obf);
$attendee_increment = 1;
/*
* Add the attendees
*/
foreach ($reserved_tickets as $reserved) {
$ticket = $reserved->ticket;
/*
* Update some ticket info
*/
$ticket->increment('quantity_sold', 1);
$ticket->increment('sales_volume', $ticket->price);
$ticket->increment('organiser_fees_volume', $obf);// * $reserved->quantity_reserved
/*
* Create the attendees
*/
$attendee = new Attendee();
$attendee->first_name = $order->first_name;
$attendee->last_name = $order->last_name;
$attendee->email = $order->email;
$attendee->event_id = $order->event_id;
$attendee->order_id = $order->id;
$attendee->ticket_id = $reserved->ticket_id;
$attendee->account_id = $order->account_id;
$attendee->reference_index = $attendee_increment;
$attendee->seat_no = $reserved->seat_no;
$attendee->save();
/* Keep track of total number of attendees */
$attendee_increment++;
}
$order->save();
DB::commit();
}
catch (\Exception $ex){
Log::error($ex);
DB::rollBack();
return ['message' => $ex->getMessage()];
}
/*
* Remove any tickets the user has reserved after they have been ordered for the user
*/
ReservedTickets::where('session_id', $order->session_id)->delete();
Log::info('Firing the event');
event(new OrderCompletedEvent($order));
return [
'order' => $order,
'orderService' => $orderService,
'event' => $order->event,
'tickets' => $order->event->tickets,
];
//return view('mobile.CheckoutSuccess', $data);
}
}