diff --git a/app/Http/Controllers/EventCheckoutController.php b/app/Http/Controllers/EventCheckoutController.php
index 5275c35e..24741023 100644
--- a/app/Http/Controllers/EventCheckoutController.php
+++ b/app/Http/Controllers/EventCheckoutController.php
@@ -15,6 +15,7 @@ use App\Models\PaymentGateway;
use App\Models\QuestionAnswer;
use App\Models\ReservedTickets;
use App\Models\Ticket;
+use App\Services\Order as OrderService;
use Carbon\Carbon;
use Cookie;
use DB;
@@ -257,11 +258,17 @@ class EventCheckoutController extends Controller
$secondsToExpire = Carbon::now()->diffInSeconds($order_session['expires']);
+ $event = Event::findorFail($order_session['event_id']);
+
+ $orderService = new OrderService($order_session['order_total'], $order_session['total_booking_fee'], $event);
+ $orderService->calculateFinalCosts();
+
$data = $order_session + [
- 'event' => Event::findorFail($order_session['event_id']),
+ 'event' => $event,
'secondsToExpire' => $secondsToExpire,
'is_embedded' => $this->is_embedded,
- ];
+ 'orderService' => $orderService
+ ];
if ($this->is_embedded) {
return view('Public.ViewEvent.Embedded.EventPageCheckout', $data);
@@ -346,16 +353,14 @@ class EventCheckoutController extends Controller
]);
}
- // Calculating grand total including tax
- $grand_total = $ticket_order['order_total'] + $ticket_order['organiser_booking_fee'];
- $tax_amt = ($grand_total * $event->organiser->taxvalue) / 100;
- $grand_total = $tax_amt + $grand_total;
-
+ $orderService = new OrderService($ticket_order['order_total'], $ticket_order['total_booking_fee'], $event);
+ $orderService->calculateFinalCosts();
+
$transaction_data += [
- 'amount' => $grand_total,
+ 'amount' => $orderService->getGrandTotal(),
'currency' => $event->currency->code,
'description' => 'Order for customer: ' . $request->get('order_email'),
- ];
+ ];
switch ($ticket_order['payment_gateway']->id) {
case config('attendize.payment_gateway_dummy'):
@@ -562,10 +567,10 @@ class EventCheckoutController extends Controller
$order->is_payment_received = isset($request_data['pay_offline']) ? 0 : 1;
// Calculating grand total including tax
- $grand_total = $ticket_order['order_total'] + $ticket_order['organiser_booking_fee'];
- $tax_amt = ($grand_total * $event->organiser->taxvalue) / 100;
+ $orderService = new OrderService($ticket_order['order_total'], $ticket_order['total_booking_fee'], $event);
+ $orderService->calculateFinalCosts();
- $order->taxamt = $tax_amt;
+ $order->taxamt = $orderService->getTaxAmount();
$order->save();
/*
@@ -740,11 +745,15 @@ class EventCheckoutController extends Controller
abort(404);
}
+ $orderService = new OrderService($order->amount, $order->organiser_booking_fee, $order->event);
+ $orderService->calculateFinalCosts();
+
$data = [
- 'order' => $order,
- 'event' => $order->event,
- 'tickets' => $order->event->tickets,
- 'is_embedded' => $this->is_embedded,
+ 'order' => $order,
+ 'orderService' => $orderService,
+ 'event' => $order->event,
+ 'tickets' => $order->event->tickets,
+ 'is_embedded' => $this->is_embedded,
];
if ($this->is_embedded) {
diff --git a/app/Http/Controllers/EventOrdersController.php b/app/Http/Controllers/EventOrdersController.php
index f306196c..fe383bb1 100644
--- a/app/Http/Controllers/EventOrdersController.php
+++ b/app/Http/Controllers/EventOrdersController.php
@@ -8,6 +8,7 @@ use App\Models\Attendee;
use App\Models\Event;
use App\Models\EventStats;
use App\Models\Order;
+use App\Services\Order as OrderService;
use DB;
use Excel;
use Illuminate\Http\Request;
@@ -78,8 +79,14 @@ class EventOrdersController extends MyBaseController
*/
public function manageOrder(Request $request, $order_id)
{
+ $order = Order::scope()->find($order_id);
+
+ $orderService = new OrderService($order->amount, $order->booking_fee, $order->event);
+ $orderService->calculateFinalCosts();
+
$data = [
- 'order' => Order::scope()->find($order_id),
+ 'order' => $order,
+ 'orderService' => $orderService
];
return view('ManageEvent.Modals.ManageOrder', $data);
diff --git a/app/Http/Controllers/OrganiserController.php b/app/Http/Controllers/OrganiserController.php
index a9261025..fb5db358 100644
--- a/app/Http/Controllers/OrganiserController.php
+++ b/app/Http/Controllers/OrganiserController.php
@@ -40,6 +40,11 @@ class OrganiserController extends MyBaseController
{
$organiser = Organiser::createNew(false, false, true);
+ $chargeTax = $request->get('charge_tax');
+ if ($chargeTax == 1) {
+ $organiser->addExtraValidationRules();
+ }
+
if (!$organiser->validate($request->all())) {
return response()->json([
'status' => 'error',
@@ -53,13 +58,11 @@ class OrganiserController extends MyBaseController
$organiser->facebook = $request->get('facebook');
$organiser->twitter = $request->get('twitter');
$organiser->confirmation_key = str_random(15);
- $organiser->taxname = $request->get('taxname');
- $organiser->taxvalue = $request->get('taxvalue');
- $organiser->taxid = $request->get('taxid');
- $organiser->taxname = $request->get('taxname');
- $organiser->taxvalue = round($request->get('taxvalue'),2);
- $organiser->taxid = $request->get('taxid');
+ $organiser->tax_name = $request->get('tax_name');
+ $organiser->tax_value = round($request->get('tax_value'),2);
+ $organiser->tax_id = $request->get('tax_id');
+ $organiser->charge_tax = ($chargeTax == 1) ? 1 : 0;
if ($request->hasFile('organiser_logo')) {
$organiser->setLogo($request->file('organiser_logo'));
diff --git a/app/Http/Controllers/OrganiserCustomizeController.php b/app/Http/Controllers/OrganiserCustomizeController.php
index a50b8c37..943378f4 100644
--- a/app/Http/Controllers/OrganiserCustomizeController.php
+++ b/app/Http/Controllers/OrganiserCustomizeController.php
@@ -36,6 +36,11 @@ class OrganiserCustomizeController extends MyBaseController
{
$organiser = Organiser::scope()->find($organiser_id);
+ $chargeTax = $request->get('charge_tax');
+ if ($chargeTax == 1) {
+ $organiser->addExtraValidationRules();
+ }
+
if (!$organiser->validate($request->all())) {
return response()->json([
'status' => 'error',
@@ -50,9 +55,11 @@ class OrganiserCustomizeController extends MyBaseController
$organiser->enable_organiser_page = $request->get('enable_organiser_page');
$organiser->facebook = $request->get('facebook');
$organiser->twitter = $request->get('twitter');
- $organiser->taxname = $request->get('taxname');
- $organiser->taxvalue = $request->get('taxvalue');
- $organiser->taxid = $request->get('taxid');
+
+ $organiser->tax_name = $request->get('tax_name');
+ $organiser->tax_value = $request->get('tax_value');
+ $organiser->tax_id = $request->get('tax_id');
+ $organiser->charge_tax = ($request->get('charge_tax') == 1) ? 1 : 0;
if ($request->get('remove_current_image') == '1') {
$organiser->logo_path = '';
diff --git a/app/Mailers/OrderMailer.php b/app/Mailers/OrderMailer.php
index eab2efcb..d4d28d81 100644
--- a/app/Mailers/OrderMailer.php
+++ b/app/Mailers/OrderMailer.php
@@ -3,6 +3,7 @@
namespace App\Mailers;
use App\Models\Order;
+use App\Services\Order as OrderService;
use Log;
use Mail;
@@ -10,8 +11,12 @@ class OrderMailer
{
public function sendOrderNotification(Order $order)
{
+ $orderService = new OrderService($order->amount, $order->organiser_booking_fee, $order->event);
+ $orderService->calculateFinalCosts();
+
$data = [
- 'order' => $order
+ 'order' => $order,
+ 'orderService' => $orderService
];
Mail::send('Emails.OrderNotification', $data, function ($message) use ($order) {
@@ -21,12 +26,15 @@ class OrderMailer
}
- public function sendOrderTickets($order)
+ public function sendOrderTickets(Order $order)
{
+ $orderService = new OrderService($order->amount, $order->organiser_booking_fee, $order->event);
+ $orderService->calculateFinalCosts();
Log::info("Sending ticket to: " . $order->email);
$data = [
'order' => $order,
+ 'orderService' => $orderService
];
Mail::send('Mailers.TicketMailer.SendOrderTickets', $data, function ($message) use ($order) {
diff --git a/app/Models/Order.php b/app/Models/Order.php
index 188b40e1..ae6924eb 100644
--- a/app/Models/Order.php
+++ b/app/Models/Order.php
@@ -106,7 +106,7 @@ class Order extends MyBaseModel
*/
public function getOrganiserAmountAttribute()
{
- return $this->amount + $this->organiser_booking_fee;
+ return $this->amount + $this->organiser_booking_fee + $this->taxamt;
}
/**
diff --git a/app/Models/Organiser.php b/app/Models/Organiser.php
index 900d5ba1..89aa5cac 100644
--- a/app/Models/Organiser.php
+++ b/app/Models/Organiser.php
@@ -2,12 +2,15 @@
namespace App\Models;
+use Illuminate\Auth\Authenticatable;
use Illuminate\Http\UploadedFile;
+use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Str;
use Image;
-class Organiser extends MyBaseModel
+class Organiser extends MyBaseModel implements AuthenticatableContract
{
+ use Authenticatable;
/**
* The validation rules for the model.
*
@@ -16,21 +19,24 @@ class Organiser extends MyBaseModel
protected $rules = [
'name' => ['required'],
'email' => ['required', 'email'],
- 'taxname' => ['required','max:15'],
- 'taxvalue' => ['required','numeric'],
- 'taxid' => ['required','max:100'],
'organiser_logo' => ['mimes:jpeg,jpg,png', 'max:10000'],
];
+ protected $extra_rules = [
+ 'tax_name' => ['required','max:15'],
+ 'tax_value' => ['required','numeric'],
+ 'tax_id' => ['required','max:100'],
+ ];
+
/**
* The validation rules for the model.
*
* @var array $attributes
*/
protected $attributes = [
- 'taxname' => 'Tax Name',
- 'taxvalue' => 'Tax Rate',
- 'taxid' => 'Tax ID',
+ 'tax_name' => 'Tax Name',
+ 'tax_value' => 'Tax Rate',
+ 'tax_id' => 'Tax ID',
];
/**
@@ -161,5 +167,12 @@ class Organiser extends MyBaseModel
$this->logo_path = $relativePath;
}
}
+
+ /**
+ * Adds extra validator rules to the organiser object depending on whether tax is required or not
+ */
+ public function addExtraValidationRules() {
+ $this->rules = $this->rules + $this->extra_rules;
+ }
}
diff --git a/app/Services/Order.php b/app/Services/Order.php
new file mode 100644
index 00000000..5e22b434
--- /dev/null
+++ b/app/Services/Order.php
@@ -0,0 +1,117 @@
+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 . ")";
+ }
+
+}
diff --git a/database/migrations/2018_07_09_133243_additional_tax_field_rename_current_tax_fields.php b/database/migrations/2018_07_09_133243_additional_tax_field_rename_current_tax_fields.php
new file mode 100644
index 00000000..f4544bd0
--- /dev/null
+++ b/database/migrations/2018_07_09_133243_additional_tax_field_rename_current_tax_fields.php
@@ -0,0 +1,37 @@
+boolean('charge_tax')->default(0);
+ $table->renameColumn('taxname', 'tax_name');
+ $table->renameColumn('taxvalue', 'tax_value');
+ $table->renameColumn('taxid', 'tax_id');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('organisers', function (Blueprint $table) {
+ $table->dropColumn('charge_tax');
+ $table->renameColumn('tax_name', 'taxname');
+ $table->renameColumn('tax_value', 'taxvalue');
+ $table->renameColumn('tax_id', 'taxid');
+ });
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
index f1bd8182..5a2c22ea 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -19,7 +19,7 @@
{!! trans("Organiser.organiser_tax_prompt") !!}
+ {!! Form::label('Yes', 'Yes', array('class'=>'control-label', 'id' => 'charge_yes')) !!} + {{ Form::radio('charge_tax', '1' , false) }} + {!! Form::label('No', 'No', array('class'=>'control-label','id' => 'charge_no')) !!} + {{ Form::radio('charge_tax', '0' , true) }} +{!! trans("Organiser.organiser_tax_prompt") !!}
+ + charge_tax == 1 ? 'checked' : '' }}> + + charge_tax == 0 ? 'checked' : '' }}>