mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Working on gateway fees
This commit is contained in:
parent
022ad2e414
commit
21166a3be7
@ -394,6 +394,10 @@ if (! defined('APP_NAME')) {
|
||||
define('GATEWAY_TYPE_CUSTOM', 6);
|
||||
define('GATEWAY_TYPE_TOKEN', 'token');
|
||||
|
||||
define('FEE_LOCATION_CHARGE1', 'invoice_charge1');
|
||||
define('FEE_LOCATION_CHARGE2', 'invoice_charge2');
|
||||
define('FEE_LOCATION_ITEM', 'invoice_item');
|
||||
|
||||
define('REMINDER1', 'reminder1');
|
||||
define('REMINDER2', 'reminder2');
|
||||
define('REMINDER3', 'reminder3');
|
||||
|
@ -1188,6 +1188,7 @@ class AccountController extends BaseController
|
||||
$account = Auth::user()->account;
|
||||
$account->token_billing_type_id = Input::get('token_billing_type_id');
|
||||
$account->auto_bill_on_due_date = boolval(Input::get('auto_bill_on_due_date'));
|
||||
$account->gateway_fee_location = Input::get('gateway_fee_location') ?: null;
|
||||
$account->save();
|
||||
|
||||
event(new UserSettingsChanged());
|
||||
|
@ -93,6 +93,7 @@ class Account extends Eloquent
|
||||
'domain_id',
|
||||
'payment_terms',
|
||||
'payment_type_id',
|
||||
'gateway_fee_location',
|
||||
];
|
||||
|
||||
/**
|
||||
|
@ -58,10 +58,10 @@ class AccountGatewaySettings extends EntityModel
|
||||
}
|
||||
|
||||
if (floatval($this->fee_percent)) {
|
||||
$parts[] = $this->fee_percent . '%';
|
||||
$parts[] = (floor($this->fee_percent * 1000) / 1000) . '%';
|
||||
}
|
||||
|
||||
if (floatval($this->fee_tax_rate1) || floatval($this->fee_tax_rate1)) {
|
||||
if ($this->fee_location == FEE_LOCATION_ITEM && (floatval($this->fee_tax_rate1) || floatval($this->fee_tax_rate1))) {
|
||||
$parts[] = trans('texts.tax');
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,8 @@ trait ChargesFees
|
||||
{
|
||||
public function calcGatewayFee($gatewayTypeId = false, $includeTax = true)
|
||||
{
|
||||
$settings = $this->account->getGatewaySettings($gatewayTypeId);
|
||||
$account = $this->account;
|
||||
$settings = $account->getGatewaySettings($gatewayTypeId);
|
||||
$fee = 0;
|
||||
|
||||
if (! $settings) {
|
||||
@ -25,14 +26,10 @@ trait ChargesFees
|
||||
}
|
||||
|
||||
if ($settings->fee_percent) {
|
||||
$amount = $this->amount;
|
||||
if ($item = $this->getGatewayFeeItem()) {
|
||||
$amount -= $item->amount();
|
||||
}
|
||||
$fee += $amount * $settings->fee_percent / 100;
|
||||
$fee += $this->amount * $settings->fee_percent / 100;
|
||||
}
|
||||
|
||||
if ($includeTax) {
|
||||
if ($account->gateway_fee_location == FEE_LOCATION_ITEM && $includeTax) {
|
||||
$preTaxFee = $fee;
|
||||
|
||||
if ($settings->fee_tax_rate1) {
|
||||
@ -46,60 +43,4 @@ trait ChargesFees
|
||||
|
||||
return round($fee, 2);
|
||||
}
|
||||
|
||||
public function getGatewayFeeItem()
|
||||
{
|
||||
foreach ($this->invoice_items as $item) {
|
||||
if ($item->invoice_item_type_id == INVOICE_ITEM_TYPE_GATEWAY_FEE) {
|
||||
return $item;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getGatewayFee()
|
||||
{
|
||||
$item = $this->getGatewayFeeItem();
|
||||
|
||||
return $item ? $item->cost : 0;
|
||||
}
|
||||
|
||||
public function setGatewayFee($gatewayTypeId)
|
||||
{
|
||||
$settings = $this->account->getGatewaySettings($gatewayTypeId);
|
||||
$fee = $this->calcGatewayFee($gatewayTypeId);
|
||||
$feePreTax = $this->calcGatewayFee($gatewayTypeId, false);
|
||||
$item = $this->getGatewayFeeItem();
|
||||
|
||||
if ($fee == ($item ? $item->amount() : 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($item) {
|
||||
$this->amount -= $item->amount();
|
||||
$this->balance -= $item->amount();
|
||||
if (! $fee) {
|
||||
$item->forceDelete();
|
||||
}
|
||||
}
|
||||
|
||||
if ($fee) {
|
||||
$item = $item ?: InvoiceItem::createNew($this);
|
||||
$item->invoice_item_type_id = INVOICE_ITEM_TYPE_GATEWAY_FEE;
|
||||
$item->product_key = trans('texts.fee');
|
||||
$item->notes = trans('texts.' . GatewayType::getAliasFromId($gatewayTypeId));
|
||||
$item->cost = $feePreTax;
|
||||
$item->qty = 1;
|
||||
$item->tax_rate1 = $settings->fee_tax_rate1;
|
||||
$item->tax_name1 = $settings->fee_tax_name1;
|
||||
$item->tax_rate2 = $settings->fee_tax_rate2;
|
||||
$item->tax_name2 = $settings->fee_tax_name2;
|
||||
$this->invoice_items()->save($item);
|
||||
}
|
||||
|
||||
$this->amount += $fee;
|
||||
$this->balance += $fee;
|
||||
$this->save();
|
||||
}
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ trait PresentsInvoice
|
||||
'website',
|
||||
'phone',
|
||||
'blank',
|
||||
'adjustment',
|
||||
'surcharge',
|
||||
'tax_invoice',
|
||||
'tax_quote',
|
||||
'statement',
|
||||
|
@ -97,6 +97,10 @@ class AccountGatewayDatatable extends EntityDatatable
|
||||
[
|
||||
'fees',
|
||||
function ($model) {
|
||||
if (! $model->gateway_fee_location) {
|
||||
return trans('texts.fees_disabled');
|
||||
}
|
||||
|
||||
$gatewayTypes = $this->getGatewayTypes($model->id, $model->gateway_id);
|
||||
$html = '';
|
||||
foreach ($gatewayTypes as $gatewayTypeId) {
|
||||
|
@ -133,7 +133,8 @@ class BasePaymentDriver
|
||||
}
|
||||
|
||||
// apply gateway fees
|
||||
$this->invoice()->setGatewayFee($this->gatewayType);
|
||||
$invoicRepo = app('App\Ninja\Repositories\InvoiceRepository');
|
||||
$invoicRepo->setGatewayFee($this->invoice(), $this->gatewayType);
|
||||
|
||||
if ($this->isGatewayType(GATEWAY_TYPE_TOKEN) || $gateway->is_offsite) {
|
||||
if (Session::has('error')) {
|
||||
@ -849,8 +850,8 @@ class BasePaymentDriver
|
||||
$label = trans('texts.payment_type_on_file', ['type' => $paymentMethod->payment_type->name]);
|
||||
}
|
||||
|
||||
if ($fees = $this->invoice()->present()->gatewayFee($paymentMethod->payment_type->gateway_type_id)) {
|
||||
$label .= sprintf(' - %s %s', $fees, trans('texts.fee'));
|
||||
if ($fee = $this->invoice()->present()->gatewayFee($paymentMethod->payment_type->gateway_type_id)) {
|
||||
$label .= sprintf(' - %s: %s', trans('texts.fee'), $fee);
|
||||
}
|
||||
|
||||
$links[] = [
|
||||
@ -885,8 +886,8 @@ class BasePaymentDriver
|
||||
$label = trans("texts.{$gatewayTypeAlias}");
|
||||
}
|
||||
|
||||
if ($fees = $this->invoice()->present()->gatewayFee($gatewayTypeId)) {
|
||||
$label .= sprintf(' - %s %s', $fees, trans('texts.fee'));
|
||||
if ($fee = $this->invoice()->present()->gatewayFee($gatewayTypeId)) {
|
||||
$label .= sprintf(' - %s: %s', trans('texts.fee'), $fee);
|
||||
}
|
||||
|
||||
$links[] = [
|
||||
|
@ -257,23 +257,22 @@ class InvoicePresenter extends EntityPresenter
|
||||
{
|
||||
$invoice = $this->entity;
|
||||
$account = $invoice->account;
|
||||
$fees = $invoice->calcGatewayFee($gatewayTypeId);
|
||||
$settings = $account->getGatewaySettings($gatewayTypeId);
|
||||
|
||||
if (! $fees) {
|
||||
return false;
|
||||
if (! $settings || ! $settings->areFeesEnabled()) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $account->formatMoney($fees, $invoice->client);
|
||||
$parts = [];
|
||||
|
||||
if ($settings->fee_amount) {
|
||||
$parts[] = $account->formatMoney($settings->fee_amount, $invoice->client);
|
||||
}
|
||||
|
||||
public function payNowLabel($gatewayTypeId = false)
|
||||
{
|
||||
$str = trans('texts.pay_now');
|
||||
|
||||
if ($fees = $this->gatewayFee($gatewayTypeId)) {
|
||||
$str .= sprintf(' - %s %s', $fees, trans('texts.fee'));
|
||||
if (floatval($settings->fee_percent) > 0) {
|
||||
$parts[] = (floor($settings->fee_percent * 1000) / 1000) . '%';
|
||||
}
|
||||
|
||||
return $str;
|
||||
return join(' + ', $parts);
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ class AccountGatewayRepository extends BaseRepository
|
||||
{
|
||||
$query = DB::table('account_gateways')
|
||||
->join('gateways', 'gateways.id', '=', 'account_gateways.gateway_id')
|
||||
->join('accounts', 'accounts.id', '=', 'account_gateways.account_id')
|
||||
->where('account_gateways.account_id', '=', $accountId)
|
||||
->whereNull('account_gateways.deleted_at');
|
||||
|
||||
@ -23,6 +24,7 @@ class AccountGatewayRepository extends BaseRepository
|
||||
'account_gateways.public_id',
|
||||
'gateways.name',
|
||||
'account_gateways.deleted_at',
|
||||
'account_gateways.gateway_id');
|
||||
'account_gateways.gateway_id',
|
||||
'accounts.gateway_fee_location');
|
||||
}
|
||||
}
|
||||
|
@ -1007,4 +1007,40 @@ class InvoiceRepository extends BaseRepository
|
||||
|
||||
return $invoices;
|
||||
}
|
||||
|
||||
public function setGatewayFee($invoice, $gatewayTypeId)
|
||||
{
|
||||
$account = $invoice->account;
|
||||
$location = $account->gateway_fee_location;
|
||||
|
||||
if (! $location) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (! $invoice->relationLoaded('invoice_items')) {
|
||||
$invoice->load('invoice_items');
|
||||
}
|
||||
|
||||
// first remove fee if already set
|
||||
if ($location == FEE_LOCATION_ITEM) {
|
||||
// todo
|
||||
} else {
|
||||
if ($location == FEE_LOCATION_CHARGE1) {
|
||||
$field = 'custom_value1';
|
||||
} elseif ($location == FEE_LOCATION_CHARGE2) {
|
||||
$field = 'custom_value2';
|
||||
}
|
||||
|
||||
if ($invoice->$field > 0) {
|
||||
$data = $invoice->toArray();
|
||||
$data[$field] = 0;
|
||||
$invoice = $this->save($data, $invoice);
|
||||
}
|
||||
}
|
||||
|
||||
$fee = $invoice->calcGatewayFee($gatewayTypeId);
|
||||
$data = $invoice->toArray();
|
||||
$data[$field] = $fee;
|
||||
$this->save($data, $invoice);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddGatewayFeeLocation extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('accounts', function ($table) {
|
||||
$table->enum('gateway_fee_location', [FEE_LOCATION_CHARGE1, FEE_LOCATION_CHARGE2, FEE_LOCATION_ITEM])->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('accounts', function ($table) {
|
||||
$table->dropColumn('gateway_fee_location');
|
||||
});
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -562,10 +562,10 @@ NINJA.subtotals = function(invoice, hideBalance)
|
||||
}
|
||||
|
||||
if (NINJA.parseFloat(invoice.custom_value1) && invoice.custom_taxes1 == '1') {
|
||||
data.push([{text: account.custom_invoice_label1 || invoiceLabels.adjustment, style: ['subtotalsLabel', 'customTax1Label']}, {text: formatMoneyInvoice(invoice.custom_value1, invoice), style: ['subtotals', 'customTax1']}]);
|
||||
data.push([{text: account.custom_invoice_label1 || invoiceLabels.surcharge, style: ['subtotalsLabel', 'customTax1Label']}, {text: formatMoneyInvoice(invoice.custom_value1, invoice), style: ['subtotals', 'customTax1']}]);
|
||||
}
|
||||
if (NINJA.parseFloat(invoice.custom_value2) && invoice.custom_taxes2 == '1') {
|
||||
data.push([{text: account.custom_invoice_label2 || invoiceLabels.adjustment, style: ['subtotalsLabel', 'customTax2Label']}, {text: formatMoneyInvoice(invoice.custom_value2, invoice), style: ['subtotals', 'customTax2']}]);
|
||||
data.push([{text: account.custom_invoice_label2 || invoiceLabels.surcharge, style: ['subtotalsLabel', 'customTax2Label']}, {text: formatMoneyInvoice(invoice.custom_value2, invoice), style: ['subtotals', 'customTax2']}]);
|
||||
}
|
||||
|
||||
for (var key in invoice.item_taxes) {
|
||||
@ -586,10 +586,10 @@ NINJA.subtotals = function(invoice, hideBalance)
|
||||
}
|
||||
|
||||
if (NINJA.parseFloat(invoice.custom_value1) && invoice.custom_taxes1 != '1') {
|
||||
data.push([{text: account.custom_invoice_label1 || invoiceLabels.adjustment, style: ['subtotalsLabel', 'custom1Label']}, {text: formatMoneyInvoice(invoice.custom_value1, invoice), style: ['subtotals', 'custom1']}]);
|
||||
data.push([{text: account.custom_invoice_label1 || invoiceLabels.surcharge, style: ['subtotalsLabel', 'custom1Label']}, {text: formatMoneyInvoice(invoice.custom_value1, invoice), style: ['subtotals', 'custom1']}]);
|
||||
}
|
||||
if (NINJA.parseFloat(invoice.custom_value2) && invoice.custom_taxes2 != '1') {
|
||||
data.push([{text: account.custom_invoice_label2 || invoiceLabels.adjustment, style: ['subtotalsLabel', 'custom2Label']}, {text: formatMoneyInvoice(invoice.custom_value2, invoice), style: ['subtotals', 'custom2']}]);
|
||||
data.push([{text: account.custom_invoice_label2 || invoiceLabels.surcharge, style: ['subtotalsLabel', 'custom2Label']}, {text: formatMoneyInvoice(invoice.custom_value2, invoice), style: ['subtotals', 'custom2']}]);
|
||||
}
|
||||
|
||||
var paid = invoice.amount - invoice.balance;
|
||||
|
@ -700,7 +700,7 @@ $LANG = array(
|
||||
'oneclick_login' => 'One-Click Login',
|
||||
'disable' => 'Disable',
|
||||
'invoice_quote_number' => 'Invoice and Quote Numbers',
|
||||
'invoice_charges' => 'Invoice Charges',
|
||||
'invoice_charges' => 'Invoice Surcharges',
|
||||
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.',
|
||||
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
|
||||
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.',
|
||||
@ -1353,7 +1353,7 @@ $LANG = array(
|
||||
'wepay_payment_tos_agree' => 'I agree to the WePay :terms and :privacy_policy.',
|
||||
'privacy_policy' => 'Privacy Policy',
|
||||
'wepay_payment_tos_agree_required' => 'You must agree to the WePay Terms of Service and Privacy Policy.',
|
||||
'payment_settings_supported_gateways' => 'These options are supported by the WePay, Stripe, and Braintree gateways.',
|
||||
'payment_settings_supported_gateways' => 'Note: token billing is supported by WePay, Stripe, and Braintree.',
|
||||
'ach_email_prompt' => 'Please enter your email address:',
|
||||
'verification_pending' => 'Verification Pending',
|
||||
|
||||
@ -2402,13 +2402,19 @@ $LANG = array(
|
||||
'fees' => 'Fees',
|
||||
'fee' => 'Fee',
|
||||
'set_limits_fees' => 'Set :gateway_type Limits/Fees',
|
||||
'fee_amount' => 'Amount',
|
||||
'fee_percent' => 'Percent',
|
||||
'fees_tax_help' => 'Enable line item taxes to set fee tax rates.',
|
||||
'fees_sample' => 'The fee for a :amount invoice would be :total.',
|
||||
'no_fees' => 'No Fees',
|
||||
'gateway_fees_disclaimer' => 'Warning: not all payment gateways allow adding fees, please review their terms of service.',
|
||||
|
||||
'percent' => 'Percent',
|
||||
'location' => 'Location',
|
||||
'line_item' => 'Line Item',
|
||||
'surcharge' => 'Surcharge',
|
||||
'first_surcharge' => 'Enabled - Use first surcharge',
|
||||
'second_surcharge' => 'Enabled - Use second surcharge',
|
||||
'online_payment_surcharge' => 'Online Payment Surcharge',
|
||||
'gateway_fees' => 'Gateway Fees',
|
||||
'fees_disabled' => 'Fees are disabled',
|
||||
);
|
||||
|
||||
return $LANG;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
if (isStorageSupported()) {
|
||||
if (isStorageSupported() && /\/settings\//.test(location.href)) {
|
||||
localStorage.setItem('last:settings_page', location.href);
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
{!! Former::open()->addClass('warn-on-exit') !!}
|
||||
{!! Former::populateField('token_billing_type_id', $account->token_billing_type_id) !!}
|
||||
{!! Former::populateField('auto_bill_on_due_date', $account->auto_bill_on_due_date) !!}
|
||||
|
||||
{!! Former::populateField('gateway_fee_location', $account->gateway_fee_location) !!}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@ -27,6 +27,14 @@
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-4 col-sm-8"><p>{!! trans('texts.payment_settings_supported_gateways') !!}</p></div>
|
||||
</div>
|
||||
|
||||
{!! Former::select('gateway_fee_location')
|
||||
->addOption(trans('texts.disabled'), '')
|
||||
->addOption(trans('texts.first_surcharge') . ($account->custom_invoice_label1 ? ': ' . $account->custom_invoice_label1 : ''), FEE_LOCATION_CHARGE1)
|
||||
->addOption(trans('texts.second_surcharge') . ($account->custom_invoice_label2 ? ': ' . $account->custom_invoice_label2 : '' ), FEE_LOCATION_CHARGE2)
|
||||
//->addOption(trans('texts.line_item'), FEE_LOCATION_ITEM)
|
||||
->label('gateway_fees')!!}
|
||||
|
||||
{!! Former::actions( Button::success(trans('texts.save'))->submit()->appendIcon(Icon::create('floppy-disk')) ) !!}
|
||||
</div>
|
||||
</div>
|
||||
@ -56,6 +64,7 @@
|
||||
->render('datatable') !!}
|
||||
|
||||
{!! Former::open( 'settings/payment_gateway_limits') !!}
|
||||
|
||||
<div class="modal fade" id="paymentLimitsModal" tabindex="-1" role="dialog"
|
||||
aria-labelledby="paymentLimitsModalLabel"
|
||||
aria-hidden="true">
|
||||
@ -121,18 +130,21 @@
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::text('fee_amount')
|
||||
->label('amount')
|
||||
->onchange('updateFeeSample()')
|
||||
->type('number')
|
||||
->min('0')
|
||||
->step('any') !!}
|
||||
|
||||
{!! Former::text('fee_percent')
|
||||
->label('percent')
|
||||
->onchange('updateFeeSample()')
|
||||
->type('number')
|
||||
->min('0')
|
||||
->step('any')
|
||||
->append('%') !!}
|
||||
|
||||
<div id="taxDiv" style="display:none">
|
||||
@if ($account->invoice_item_taxes)
|
||||
{!! Former::select('tax_rate1')
|
||||
->onchange('onTaxRateChange(1)')
|
||||
@ -149,6 +161,7 @@
|
||||
@endif
|
||||
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div style="display:none">
|
||||
{!! Former::text('fee_tax_name1') !!}
|
||||
@ -159,12 +172,12 @@
|
||||
|
||||
<br/><div id="feeSample" class="help-block"></div>
|
||||
|
||||
<br/><b>{{ trans('texts.gateway_fees_disclaimer') }}</b>
|
||||
|
||||
@if (!$account->invoice_item_taxes && $account->invoice_taxes && count($taxRates))
|
||||
<br/><div class="help-block">{{ trans('texts.fees_tax_help') }}</div>
|
||||
@endif
|
||||
|
||||
<br/><b>{{ trans('texts.gateway_fees_disclaimer') }}</b>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -348,9 +361,11 @@
|
||||
|
||||
onTaxRateChange(instance);
|
||||
}
|
||||
|
||||
/*
|
||||
$(function() {
|
||||
javascript:showLimitsModal('Credit Card', 1);
|
||||
})
|
||||
*/
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@stop
|
||||
|
@ -422,7 +422,7 @@
|
||||
<tr>
|
||||
<td class="hide-border" colspan="3"/>
|
||||
<td style="display:none" class="hide-border" data-bind="visible: $root.invoice_item_taxes.show"/>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label1 ?: trans('texts.adjustment') }}</td>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label1 ?: trans('texts.surcharge') }}</td>
|
||||
<td style="text-align: right;padding-right: 28px" colspan="2"><input name="custom_value1" class="form-control" data-bind="value: custom_value1, valueUpdate: 'afterkeydown'"/></td>
|
||||
</tr>
|
||||
@endif
|
||||
@ -431,7 +431,7 @@
|
||||
<tr>
|
||||
<td class="hide-border" colspan="3"/>
|
||||
<td style="display:none" class="hide-border" data-bind="visible: $root.invoice_item_taxes.show"/>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label2 ?: trans('texts.adjustment') }}</td>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label2 ?: trans('texts.surcharge') }}</td>
|
||||
<td style="text-align: right;padding-right: 28px" colspan="2"><input name="custom_value2" class="form-control" data-bind="value: custom_value2, valueUpdate: 'afterkeydown'"/></td>
|
||||
</tr>
|
||||
@endif
|
||||
@ -479,7 +479,7 @@
|
||||
<tr>
|
||||
<td class="hide-border" colspan="3"/>
|
||||
<td style="display:none" class="hide-border" data-bind="visible: $root.invoice_item_taxes.show"/>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label1 ?: trans('texts.adjustment') }}</td>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label1 ?: trans('texts.surcharge') }}</td>
|
||||
<td style="text-align: right;padding-right: 28px" colspan="2"><input name="custom_value1" class="form-control" data-bind="value: custom_value1, valueUpdate: 'afterkeydown'"/></td>
|
||||
</tr>
|
||||
@endif
|
||||
@ -488,7 +488,7 @@
|
||||
<tr>
|
||||
<td class="hide-border" colspan="3"/>
|
||||
<td style="display:none" class="hide-border" data-bind="visible: $root.invoice_item_taxes.show"/>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label2 ?: trans('texts.adjustment') }}</td>
|
||||
<td colspan="{{ $account->hide_quantity ? 1 : 2 }}">{{ $account->custom_invoice_label2 ?: trans('texts.surcharge') }}</td>
|
||||
<td style="text-align: right;padding-right: 28px" colspan="2"><input name="custom_value2" class="form-control" data-bind="value: custom_value2, valueUpdate: 'afterkeydown'"/></td>
|
||||
</tr>
|
||||
@endif
|
||||
|
@ -123,7 +123,10 @@
|
||||
@if (count($paymentTypes) > 1)
|
||||
{!! DropdownButton::success(trans('texts.pay_now'))->withContents($paymentTypes)->large() !!}
|
||||
@elseif (count($paymentTypes) == 1)
|
||||
<a href='{!! $paymentURL !!}' class="btn btn-success btn-lg">{{ $invoice->present()->payNowLabel($gatewayTypeId) }}</a>
|
||||
<a href='{!! $paymentURL !!}' class="btn btn-success btn-lg">{{ trans('texts.pay_now') }}</a>
|
||||
@if ($fee = $invoice->present()->gatewayFee($gatewayTypeId))
|
||||
<div class="help-block">{{ trans('texts.online_payment_surcharge') }}: {{ $fee }}</div>
|
||||
@endif
|
||||
@endif
|
||||
@else
|
||||
{!! Button::normal(trans('texts.download_pdf'))->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}
|
||||
|
Loading…
x
Reference in New Issue
Block a user