Merge pull request #399 from Attendize/charge-vat-at-organiser-level
Added charging tax at the organiser level
This commit is contained in:
commit
1c65daa8b9
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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'));
|
||||
|
|
|
|||
|
|
@ -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 = '';
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\Event;
|
||||
|
||||
class Order
|
||||
{
|
||||
|
||||
/**
|
||||
* @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 . ")";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AdditionalTaxFieldRenameCurrentTaxFields extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('organisers', function (Blueprint $table) {
|
||||
$table->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');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="MAIL_DRIVER" value="log"/>
|
||||
<env name="DB_HOST" value="176.58.123.120"/>
|
||||
<env name="DB_DATABASE" value="test"/>
|
||||
<env name="DB_HOST" value="db"/>
|
||||
<env name="DB_DATABASE" value="attendize"/>
|
||||
</php>
|
||||
</phpunit>
|
||||
|
|
|
|||
|
|
@ -58,6 +58,12 @@ return array (
|
|||
'organiser_twitter_placeholder' => 'E.g http://www.twitter.com/MyTwitterPage',
|
||||
'organiser_username_facebook_placeholder' => 'MyFacebookPage',
|
||||
'organiser_username_twitter_placeholder' => 'MyTwitterPage',
|
||||
'organiser_tax_prompt' => 'Do you want to charge tax as your events?',
|
||||
'organiser_tax_id' => 'Tax ID',
|
||||
'organiser_tax_name' => 'Tax Name',
|
||||
'organiser_tax_value' => 'Tax Value',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
'sales_volume' => 'Sales Volume',
|
||||
'select_an_organiser' => 'Select An Organiser',
|
||||
'select_organiser' => 'Select Organiser',
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ return array (
|
|||
'total' => 'total',
|
||||
'whoops' => 'Whoops!',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
/*
|
||||
* Lines below will turn obsolete in localization helper, it is declared in app/Helpers/macros.
|
||||
* If you run it, it will break file input fields.
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
</div>
|
||||
|
||||
<div class="col-sm-6 col-xs-6">
|
||||
<b>@lang("ManageEvent.amount")</b><br>{{money($order->total_amount, $order->event->currency)}}
|
||||
<b>@lang("ManageEvent.amount")</b><br>{{ $orderService->getGrandTotal(true) }}
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-xs-6">
|
||||
|
|
@ -143,6 +143,36 @@
|
|||
{{money($order->total_amount, $order->event->currency)}}
|
||||
</td>
|
||||
</tr>
|
||||
@if($order->event->organiser->charge_tax)
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>{{$order->event->organiser->tax_name}}</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{ $orderService->getTaxAmount(true) }}
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{ $orderService->getGrandTotal(true) }}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@
|
|||
</td>
|
||||
<td>
|
||||
<a href="#" class="hint--top" data-hint="{{money($order->amount, $event->currency)}} + {{money($order->organiser_booking_fee, $event->currency)}} @lang("Order.organiser_booking_fees")">
|
||||
{{money($order->amount + $order->organiser_booking_fee, $event->currency)}}
|
||||
{{money($order->amount + $order->organiser_booking_fee + $order->taxamt, $event->currency)}}
|
||||
@if($order->is_refunded || $order->is_partially_refunded)
|
||||
|
||||
@endif
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@
|
|||
text-shadow: none !important;;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
@include('ManageOrganiser.Partials.OrganiserCreateAndEditJS')
|
||||
</script>
|
||||
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
|
@ -52,10 +56,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
{!! Form::label('about', trans("Organiser.organiser_description"), array('class'=>'control-label ')) !!}
|
||||
{!! Form::textarea('about', Input::old('about'),
|
||||
|
|
@ -65,26 +65,33 @@
|
|||
'rows' => 4
|
||||
)) !!}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<p class="control-label">{!! trans("Organiser.organiser_tax_prompt") !!}</p>
|
||||
{!! 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) }}
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div id="tax_fields" class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxid', 'Tax ID', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxid', Input::old('taxid'), array('class'=>'form-control', 'placeholder'=>'Tax ID')) !!}
|
||||
{!! Form::label('tax_id', trans("Organiser.organiser_tax_id"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_id', Input::old('tax_id'), array('class'=>'form-control', 'placeholder'=>'Tax ID')) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxname', 'Tax name', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxname', Input::old('taxname'), array('class'=>'form-control', 'placeholder'=>'Tax name')) !!}
|
||||
{!! Form::label('tax_name', trans("Organiser.organiser_tax_name"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_name', Input::old('tax_name'), array('class'=>'form-control', 'placeholder'=>'Tax name')) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxvalue', 'Tax value', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxvalue', Input::old('taxvalue'), array('class'=>'form-control', 'placeholder'=>'Tax Value')) !!}
|
||||
{!! Form::label('tax_value', trans("Organiser.organiser_tax_value"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_value', Input::old('tax_value'), array('class'=>'form-control', 'placeholder'=>'Tax Value')) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
});
|
||||
|
||||
});
|
||||
|
||||
@include('ManageOrganiser.Partials.OrganiserCreateAndEditJS')
|
||||
</script>
|
||||
@stop
|
||||
|
||||
|
|
@ -94,24 +96,35 @@
|
|||
)) !!}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxid', 'Tax ID', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxid', Input::old('taxid'), array('class'=>'form-control', 'placeholder'=>'Tax ID')) !!}
|
||||
<p class="control-label">{!! trans("Organiser.organiser_tax_prompt") !!}</p>
|
||||
<label for="Yes" class="control-label" id="charge_yes">{!! trans("Organiser.yes") !!}</label>
|
||||
<input id="charge_yes" name="charge_tax" type="radio" value="1" {{ $organiser->charge_tax == 1 ? 'checked' : '' }}>
|
||||
<label for="No" class="control-label" id="charge_no">{!! trans("Organiser.no") !!}</label>
|
||||
<input id="charge_yes" name="charge_tax" type="radio" value="0" {{ $organiser->charge_tax == 0 ? 'checked' : '' }}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxname', 'Tax name', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxname', Input::old('taxname'), array('class'=>'form-control', 'placeholder'=>'Tax name')) !!}
|
||||
<div id="tax_fields">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
{!! Form::label('tax_id', trans("Organiser.organiser_tax_id"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_id', Input::old('tax_id'), array('class'=>'form-control', 'placeholder'=>'Tax ID')) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('taxvalue', 'Tax value', array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('taxvalue', Input::old('taxvalue'), array('class'=>'form-control', 'placeholder'=>'Tax Value')) !!}
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('tax_name', trans("Organiser.organiser_tax_name"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_name', Input::old('tax_name'), array('class'=>'form-control', 'placeholder'=>'Tax name')) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
{!! Form::label('tax_value', trans("Organiser.organiser_tax_value"), array('class'=>'control-label required')) !!}
|
||||
{!! Form::text('tax_value', Input::old('tax_value'), array('class'=>'form-control', 'placeholder'=>'Tax Value')) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
$(document).ready(function(){
|
||||
var charge_tax = $("input[type=radio][name='charge_tax']:checked").val();
|
||||
if (charge_tax == 1) {
|
||||
$('#tax_fields').show();
|
||||
} else {
|
||||
$('#tax_fields').hide();
|
||||
}
|
||||
|
||||
$('input[type=radio][name=charge_tax]').change(function() {
|
||||
if (this.value == 1) {
|
||||
$('#tax_fields').show();
|
||||
}
|
||||
else {
|
||||
$('#tax_fields').hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -35,25 +35,17 @@
|
|||
</div>
|
||||
@if($order_total > 0)
|
||||
<div class="panel-footer">
|
||||
@php
|
||||
$grand_total = $order_total + $total_booking_fee;
|
||||
@endphp
|
||||
<h5>
|
||||
@lang("Public_ViewEvent.total"): <span style="float: right;"><b>{{ money($grand_total + $total_booking_fee,$event->currency) }}</b></span>
|
||||
@lang("Public_ViewEvent.total"): <span style="float: right;"><b>{{ $orderService->getOrderTotalWithBookingFee(true) }}</b></span>
|
||||
</h5>
|
||||
@if($event->organiser->taxname && $event->organiser->taxvalue && $event->organiser->taxvalue > 0)
|
||||
@if($event->organiser->charge_tax)
|
||||
<h5>
|
||||
{{ $event->organiser->taxname }} ({{ $event->organiser->taxvalue }}%):
|
||||
@php
|
||||
// Calculating grand total including tax
|
||||
$tax_amt = ($grand_total * $event->organiser->taxvalue) / 100;
|
||||
$grand_total = $tax_amt + $grand_total;
|
||||
@endphp
|
||||
<span style="float: right;"><b>{{ money($tax_amt,$event->currency) }}</b></span>
|
||||
{{ $event->organiser->tax_name }} ({{ $event->organiser->tax_value }}%):
|
||||
<span style="float: right;"><b>{{ $orderService->getTaxAmount(true) }}</b></span>
|
||||
</h5>
|
||||
<h5>
|
||||
<strong>Grand Total:</strong>
|
||||
<span style="float: right;"><b>{{ money($grand_total,$event->currency) }}</b></span>
|
||||
<span style="float: right;"><b>{{ $orderService->getGrandTotal(true) }}</b></span>
|
||||
</h5>
|
||||
@endif
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
$is_free_event = false;
|
||||
?>
|
||||
<span title='{{money($ticket->price, $event->currency)}} @lang("Public_ViewEvent.ticket_price") + {{money($ticket->total_booking_fee, $event->currency)}} @lang("Public_ViewEvent.booking_fees")'>{{money($ticket->total_price, $event->currency)}} </span>
|
||||
<span class="tax-amount text-muted text-smaller">{{ ($event->organiser->taxname && $event->organiser->taxvalue) ? '(+'.money(($ticket->total_price*($event->organiser->taxvalue)/100), $event->currency).' '.$event->organiser->taxname.')' : '' }}</span>
|
||||
<span class="tax-amount text-muted text-smaller">{{ ($event->organiser->tax_name && $event->organiser->tax_value) ? '(+'.money(($ticket->total_price*($event->organiser->tax_value)/100), $event->currency).' '.$event->organiser->tax_name.')' : '' }}</span>
|
||||
<meta property="priceCurrency"
|
||||
content="{{ $event->currency->code }}">
|
||||
<meta property="price"
|
||||
|
|
|
|||
|
|
@ -82,8 +82,10 @@
|
|||
</div>
|
||||
|
||||
<div class="col-sm-4 col-xs-6">
|
||||
<b>@lang("Public_ViewEvent.amount")</b><br> {{$order->event->currency_symbol}}{{number_format($order->total_amount,2)}}
|
||||
<small>{{ ($event->organiser->taxname && $event->organiser->taxvalue) ? '(+'.money(($order->total_amount*($event->organiser->taxvalue)/100), $event->currency).' '.$event->organiser->taxname.')' : '' }}</small>
|
||||
<b>@lang("Public_ViewEvent.amount")</b><br> {{$order->event->currency_symbol}}{{number_format($order->total_amount, 2)}}
|
||||
@if($event->organiser->charge_tax)
|
||||
<small>{{ $orderService->getVatFormattedInBrackets() }}</small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4 col-xs-6">
|
||||
|
|
@ -185,9 +187,10 @@
|
|||
<b>@lang("Public_ViewEvent.sub_total")</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->total_amount, $order->event->currency)}}
|
||||
{{ $orderService->getOrderTotalWithBookingFee(true) }}
|
||||
</td>
|
||||
</tr>
|
||||
@if($event->organiser->charge_tax)
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
|
|
@ -196,12 +199,13 @@
|
|||
<td>
|
||||
</td>
|
||||
<td>
|
||||
{{$event->organiser->taxname}}
|
||||
{{$event->organiser->tax_name}}
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money(($order->total_amount*($event->organiser->taxvalue)/100), $event->currency)}}
|
||||
{{ $orderService->getTaxAmount(true) }}
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
|
|
@ -213,7 +217,7 @@
|
|||
<b>Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->total_amount+($order->total_amount*($event->organiser->taxvalue)/100), $event->currency)}}
|
||||
{{ $orderService->getGrandTotal(true) }}
|
||||
</td>
|
||||
</tr>
|
||||
@if($order->is_refunded || $order->is_partially_refunded)
|
||||
|
|
|
|||
|
|
@ -92,11 +92,11 @@
|
|||
@php
|
||||
// Calculating grand total including tax
|
||||
$grand_total = $attendee->ticket->total_price;
|
||||
$tax_amt = ($grand_total * $event->organiser->taxvalue) / 100;
|
||||
$tax_amt = ($grand_total * $event->organiser->tax_value) / 100;
|
||||
$grand_total = $tax_amt + $grand_total;
|
||||
@endphp
|
||||
{{money($grand_total, $order->event->currency)}} (inc. {{money($attendee->ticket->total_booking_fee, $order->event->currency)}} @lang("Public_ViewEvent.inc_fees") (inc. {{money($tax_amt, $order->event->currency)}} {{$event->organiser->taxname}})
|
||||
<br><br>{{$event->organiser->taxname}} ID: {{ $event->organiser->taxid }}
|
||||
{{money($grand_total, $order->event->currency)}} (inc. {{money($attendee->ticket->total_booking_fee, $order->event->currency)}} @lang("Public_ViewEvent.inc_fees") (inc. {{money($tax_amt, $order->event->currency)}} {{$event->organiser->tax_name}})
|
||||
<br><br>{{$event->organiser->tax_name}} ID: {{ $event->organiser->tax_id }}
|
||||
</div>
|
||||
|
||||
<div class="barcode">
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
@include('Shared.Partials.GlobalMeta')
|
||||
|
||||
@yield('head')
|
||||
|
||||
<!--JS-->
|
||||
{!! HTML::script('vendor/jquery/dist/jquery.min.js') !!}
|
||||
<!--/JS-->
|
||||
|
|
@ -17,6 +15,8 @@
|
|||
{!!HTML::style('assets/stylesheet/application.css')!!}
|
||||
<!--/Style-->
|
||||
|
||||
@yield('head')
|
||||
|
||||
<style>
|
||||
|
||||
body {
|
||||
|
|
|
|||
|
|
@ -76,12 +76,13 @@ Order Email: <b>{{$order->email}}</b><br>
|
|||
<td>
|
||||
</td>
|
||||
<td>
|
||||
Sub Total
|
||||
<b>Sub Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->amount + $order->order_fee, $order->event->currency)}}
|
||||
{{$orderService->getOrderTotalWithBookingFee(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@if($order->event->organiser->charge_tax == 1)
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
|
|
@ -90,12 +91,13 @@ Order Email: <b>{{$order->email}}</b><br>
|
|||
<td>
|
||||
</td>
|
||||
<td>
|
||||
{{$event->organiser->taxname}}
|
||||
<b>{{$order->event->organiser->tax_name}}</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money(($order->amount*($event->organiser->taxvalue)/100), $event->currency)}}
|
||||
{{$orderService->getTaxAmount(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
|
|
@ -107,7 +109,7 @@ Order Email: <b>{{$order->email}}</b><br>
|
|||
<b>Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->amount+($order->amount*($event->organiser->taxvalue)/100), $event->currency)}}
|
||||
{{$orderService->getGrandTotal(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -85,7 +85,37 @@ Order Email: <b>{{$order->email}}</b><br>
|
|||
<b>Sub Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->total_amount, $order->event->currency)}}
|
||||
{{$orderService->getOrderTotalWithBookingFee(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@if($order->event->organiser->charge_tax == 1)
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>{{$order->event->organiser->tax_name}}</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{$orderService->getTaxAmount(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{$orderService->getGrandTotal(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,37 @@ Order Email: <b>{{$order->email}}</b><br>
|
|||
<b>Sub Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{money($order->amount + $order->order_fee, $order->event->currency)}}
|
||||
{{$orderService->getOrderTotalWithBookingFee(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@if($order->event->organiser->charge_tax == 1)
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>{{$order->event->organiser->tax_name}}</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{$orderService->getTaxAmount(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
<b>Total</b>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
{{$orderService->getGrandTotal(true)}}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -7,18 +7,20 @@ use App\Models\Organiser;
|
|||
|
||||
class OrganiserCustomizeTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @group passing
|
||||
*/
|
||||
public function test_customize_organiser_is_successful()
|
||||
{
|
||||
$organiser = factory(App\Models\Organiser::class)->create();
|
||||
|
||||
$this->actingAs($this->test_user)
|
||||
$this->actingAs($organiser)
|
||||
->visit(route('showOrganiserCustomize', ['organiser_id' => $organiser->id]))
|
||||
->type($this->faker->name, 'name')
|
||||
->type($this->faker->email, 'email')
|
||||
->type($this->faker->email, 'about')
|
||||
->type($this->faker->word, 'facebook')
|
||||
->type($this->faker->word, 'twitter')
|
||||
->press('Create Organiser')
|
||||
->press('Save Organiser')
|
||||
->seeJson([
|
||||
'status' => 'success'
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -7,18 +7,69 @@ use App\Models\Organiser;
|
|||
|
||||
class OrganiserTest extends TestCase
|
||||
{
|
||||
public function test_create_organiser_is_successful()
|
||||
/**
|
||||
* @group passing
|
||||
*/
|
||||
public function test_create_organiser_is_successful_when_charge_tax_is_no()
|
||||
{
|
||||
|
||||
$email = $this->faker->email;
|
||||
|
||||
$this->actingAs($this->test_user)
|
||||
->visit(route('showCreateOrganiser'))
|
||||
->type($this->faker->name, 'name')
|
||||
->type($this->faker->email, 'email')
|
||||
->type($this->faker->email, 'about')
|
||||
->type($this->faker->word, 'facebook')
|
||||
->type($this->faker->word, 'twitter')
|
||||
->type($email, 'email')
|
||||
->type('No', 'charge_tax')
|
||||
->press('Create Organiser')
|
||||
->seeJson([
|
||||
'status' => 'success'
|
||||
]);
|
||||
|
||||
//get the most recently created organiser from database
|
||||
$this->organiser = Organiser::where('email','=', $email)->orderBy('created_at', 'desc')->first();
|
||||
//check the charge tax flag is 0
|
||||
$this->assertEquals($this->organiser->charge_tax, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group passing
|
||||
*/
|
||||
public function test_create_organiser_is_successful_when_charge_tax_is_yes()
|
||||
{
|
||||
$email = $this->faker->email;
|
||||
|
||||
$this->actingAs($this->test_user)
|
||||
->visit(route('showCreateOrganiser'))
|
||||
->type($this->faker->name, 'name')
|
||||
->type($email, 'email')
|
||||
->type('organisers', 'tax_name')
|
||||
->type(12323, 'tax_id')
|
||||
->type(15, 'tax_value')
|
||||
->type('Yes', 'charge_tax')
|
||||
->press('Create Organiser')
|
||||
->seeJson([
|
||||
'status' => 'success'
|
||||
]);
|
||||
|
||||
//get the most recently created organiser from database
|
||||
$this->organiser = Organiser::where('email','=', $email)->orderBy('created_at', 'desc')->first();
|
||||
//check the charge tax flag is 1
|
||||
$this->assertEquals($this->organiser->charge_tax, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group passing
|
||||
*/
|
||||
public function test_create_organiser_fails_when_organiser_details_missing()
|
||||
{
|
||||
$this->actingAs($this->test_user)
|
||||
->visit(route('showCreateOrganiser'))
|
||||
->type('', 'name')
|
||||
->type('', 'email')
|
||||
->type('No', 'charge_tax')
|
||||
->press('Create Organiser')
|
||||
->seeJson([
|
||||
'status' => 'error'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue