Merge pull request #1724 from burakcakirel/total-and-line-discounts
Refactoring total and line discount calculation according to new design
This commit is contained in:
commit
437b0a7daf
41
resources/assets/js/views/common/documents.js
vendored
41
resources/assets/js/views/common/documents.js
vendored
@ -65,7 +65,7 @@ const app = new Vue({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
onCalculateTotal() {
|
onCalculateTotal() {
|
||||||
let global_discount = this.discount;
|
let global_discount = this.form.discount;
|
||||||
let discount_total = 0;
|
let discount_total = 0;
|
||||||
let line_item_discount_total = 0;
|
let line_item_discount_total = 0;
|
||||||
let taxes = document_taxes;
|
let taxes = document_taxes;
|
||||||
@ -188,16 +188,16 @@ const app = new Vue({
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// calculate sub, tax, discount all items.
|
// set item total
|
||||||
|
if (item.discount) {
|
||||||
|
item.grand_total = item_discounted_total;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate sub, tax, discount all items.
|
||||||
line_item_discount_total += line_discount_amount;
|
line_item_discount_total += line_discount_amount;
|
||||||
sub_total += item.total;
|
sub_total += item.total;
|
||||||
grand_total += item.grand_total;
|
grand_total += item.grand_total;
|
||||||
|
|
||||||
// set item total
|
|
||||||
if (item.discount) {
|
|
||||||
item.total = item_discounted_total;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.form.items[index].name = item.name;
|
this.form.items[index].name = item.name;
|
||||||
this.form.items[index].description = item.description;
|
this.form.items[index].description = item.description;
|
||||||
this.form.items[index].quantity = item.quantity;
|
this.form.items[index].quantity = item.quantity;
|
||||||
@ -207,15 +207,13 @@ const app = new Vue({
|
|||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
// Apply discount to total
|
// Apply discount to total
|
||||||
/*
|
if (global_discount) {
|
||||||
if (discount_in_totals) {
|
discount_total = sub_total * (global_discount / 100);
|
||||||
discount_total = sub_total * (discount_in_totals / 100);
|
|
||||||
|
|
||||||
this.totals.discount = discount_total;
|
this.totals.discount = discount_total;
|
||||||
|
|
||||||
sub_total = sub_total - (sub_total * (discount_in_totals / 100));
|
grand_total = sub_total - (sub_total * (global_discount / 100));
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
this.totals.item_discount = line_item_discount_total;
|
this.totals.item_discount = line_item_discount_total;
|
||||||
this.totals.sub = sub_total;
|
this.totals.sub = sub_total;
|
||||||
@ -333,10 +331,27 @@ const app = new Vue({
|
|||||||
this.onCalculateTotal();
|
this.onCalculateTotal();
|
||||||
},
|
},
|
||||||
|
|
||||||
onAddDiscount(item_index) {
|
onAddLineDiscount(item_index) {
|
||||||
this.items[item_index].add_discount = true;
|
this.items[item_index].add_discount = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onAddTotalDiscount() {
|
||||||
|
let discount = document.getElementById('pre-discount').value;
|
||||||
|
|
||||||
|
if (discount < 0) {
|
||||||
|
discount = 0;
|
||||||
|
} else if (discount > 100) {
|
||||||
|
discount = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('pre-discount').value = discount;
|
||||||
|
|
||||||
|
this.form.discount = discount;
|
||||||
|
this.discount = false;
|
||||||
|
|
||||||
|
this.onCalculateTotal();
|
||||||
|
},
|
||||||
|
|
||||||
onDeleteDiscount(item_index) {
|
onDeleteDiscount(item_index) {
|
||||||
this.items[item_index].add_discount = false;
|
this.items[item_index].add_discount = false;
|
||||||
},
|
},
|
||||||
|
@ -13,11 +13,6 @@
|
|||||||
<col style="width: 30%;">
|
<col style="width: 30%;">
|
||||||
<col style="width: 100px;">
|
<col style="width: 100px;">
|
||||||
<col style="width: 100px;">
|
<col style="width: 100px;">
|
||||||
@if (!$hideDiscount)
|
|
||||||
@if (in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
|
||||||
<col style="width: 100px;">
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
<col style="width: 250px;">
|
<col style="width: 250px;">
|
||||||
<col style="width: 40px;">
|
<col style="width: 40px;">
|
||||||
</colgroup>
|
</colgroup>
|
||||||
@ -57,16 +52,6 @@
|
|||||||
@endif
|
@endif
|
||||||
@stack('price_th_end')
|
@stack('price_th_end')
|
||||||
|
|
||||||
@if (!$hideDiscount)
|
|
||||||
@if (in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
|
||||||
@stack('discount_th_start')
|
|
||||||
<th id="line-discount" class="text-right border-top-0 border-right-0 border-bottom-0">
|
|
||||||
{{ trans('invoices.discount') }}
|
|
||||||
</th>
|
|
||||||
@stack('discount_th_end')
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@stack('total_th_start')
|
@stack('total_th_start')
|
||||||
@if (!$hideAmount)
|
@if (!$hideAmount)
|
||||||
<th class="text-right border-top-0 border-bottom-0 item-total">
|
<th class="text-right border-top-0 border-bottom-0 item-total">
|
||||||
|
@ -11,11 +11,6 @@
|
|||||||
<col style="width: 30%;">
|
<col style="width: 30%;">
|
||||||
<col style="width: 100px;">
|
<col style="width: 100px;">
|
||||||
<col style="width: 100px;">
|
<col style="width: 100px;">
|
||||||
@if (!$hideDiscount)
|
|
||||||
@if (in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
|
||||||
<col style="width: 100px;">
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
<col style="width: 250px;">
|
<col style="width: 250px;">
|
||||||
<col style="width: 40px;">
|
<col style="width: 40px;">
|
||||||
</colgroup>
|
</colgroup>
|
||||||
@ -113,41 +108,7 @@
|
|||||||
@endif
|
@endif
|
||||||
@stack('price_td_end')
|
@stack('price_td_end')
|
||||||
|
|
||||||
@if (!$hideDiscount)
|
|
||||||
@if (in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
|
||||||
@stack('discount_td_start')
|
|
||||||
<td colspan="1" class="pb-3 border-bottom-0"
|
|
||||||
:class="[{'has-error': form.errors.has('items.' + index + '.discount') }]">
|
|
||||||
@stack('discount_input_start')
|
|
||||||
<div class="input-group input-group-merge">
|
|
||||||
<div class="input-group-prepend">
|
|
||||||
<span class="input-group-text" id="input-discount">
|
|
||||||
<i class="fa fa-percent"></i>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input type="number"
|
|
||||||
max="100"
|
|
||||||
min="0"
|
|
||||||
class="form-control text-center p-0"
|
|
||||||
:name="'items.' + index + '.discount'"
|
|
||||||
autocomplete="off"
|
|
||||||
required="required"
|
|
||||||
data-item="discount"
|
|
||||||
v-model="row.discount"
|
|
||||||
@input="onCalculateTotal"
|
|
||||||
@change="form.errors.clear('items.' + index + '.discount')">
|
|
||||||
|
|
||||||
<div class="invalid-feedback d-block"
|
|
||||||
v-if="form.errors.has('items.' + index + '.discount')"
|
|
||||||
v-html="form.errors.get('items.' + index + '.discount')">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@stack('discount_input_end')
|
|
||||||
</td>
|
|
||||||
@stack('discount_td_end')
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@stack('total_td_start')
|
@stack('total_td_start')
|
||||||
@if (!$hideAmount)
|
@if (!$hideAmount)
|
||||||
@ -175,7 +136,7 @@
|
|||||||
@stack('item_custom_fields')
|
@stack('item_custom_fields')
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td class="border-top-0 p-0" colspan="{{ (!$hideDiscount && in_array(setting('localisation.discount_location', 'total'), ['item', 'both'])) ? '5' : '4' }}">
|
<td class="border-top-0 p-0" colspan="{{ (!$hideDiscount && in_array(setting('localisation.discount_location'), ['item', 'both'])) ? '5' : '4' }}">
|
||||||
<table class="w-100">
|
<table class="w-100">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col style="width: 100px;">
|
<col style="width: 100px;">
|
||||||
@ -185,11 +146,11 @@
|
|||||||
</colgroup>
|
</colgroup>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
@if (!$hideDiscount && in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
@if (!$hideDiscount && in_array(setting('localisation.discount_location'), ['item', 'both']))
|
||||||
<tr v-if="!row.add_tax || !row.add_discount">
|
<tr v-if="!row.add_tax || !row.add_discount">
|
||||||
<td colspan="1" style="border: 0; max-width: 100px; border: 0px; padding-left: 10px;">
|
<td colspan="1" style="border: 0; max-width: 100px; border: 0px; padding-left: 10px;">
|
||||||
<div style="max-width: 100px;">
|
<div style="max-width: 100px;">
|
||||||
<button type="button" class="btn btn-link btn-sm p-0" @click="onAddDiscount(index)" v-if="!row.add_discount">Add Discount</button>
|
<button type="button" class="btn btn-link btn-sm p-0" @click="onAddLineDiscount(index)" v-if="!row.add_discount">Add Discount</button>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="1" style="border: 0; max-width: 100px; border: 0px; padding-right: 10px; text-align: right;">
|
<td colspan="1" style="border: 0; max-width: 100px; border: 0px; padding-right: 10px; text-align: right;">
|
||||||
@ -210,7 +171,7 @@
|
|||||||
@stack('discount_input_start')
|
@stack('discount_input_start')
|
||||||
<div class="input-group input-group-merge">
|
<div class="input-group input-group-merge">
|
||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text" id="input-discount-rate">
|
<span class="input-group-text" id="input-discount">
|
||||||
<i class="fa fa-percent"></i>
|
<i class="fa fa-percent"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -218,17 +179,17 @@
|
|||||||
max="100"
|
max="100"
|
||||||
min="0"
|
min="0"
|
||||||
class="form-control text-center"
|
class="form-control text-center"
|
||||||
:name="'items.' + index + '.discount-rate'"
|
:name="'items.' + index + '.discount'"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
required="required"
|
required="required"
|
||||||
data-item="discount_rate"
|
data-item="discount"
|
||||||
v-model="row.discount_rate"
|
v-model="row.discount"
|
||||||
@input="onCalculateTotal"
|
@input="onCalculateTotal"
|
||||||
@change="form.errors.clear('items.' + index + '.discount_rate')">
|
@change="form.errors.clear('items.' + index + '.discount')">
|
||||||
|
|
||||||
<div class="invalid-feedback d-block"
|
<div class="invalid-feedback d-block"
|
||||||
v-if="form.errors.has('items.' + index + '.discount_rate')"
|
v-if="form.errors.has('items.' + index + '.discount')"
|
||||||
v-html="form.errors.get('items.' + index + '.discount_rate')">
|
v-html="form.errors.get('items.' + index + '.discount')">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@stack('discount_input_end')
|
@stack('discount_input_end')
|
||||||
@ -236,7 +197,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td colspan="1" style="border: 0;" class="text-right total-column border-bottom-0 long-texts">
|
<td colspan="1" style="border: 0;" class="text-right total-column border-bottom-0 long-texts">
|
||||||
<div>
|
<div>
|
||||||
{{ Form::moneyGroup('discount', '', '', ['required' => 'required', 'disabled' => 'true' , 'row-input' => 'true', 'v-model' => 'row.discount', 'data-item' => 'discount', 'currency' => $currency, 'dynamic-currency' => 'currency'], 0.00, 'text-right input-price disabled-money') }}
|
{{ Form::moneyGroup('discount', '', '', ['required' => 'required', 'disabled' => 'true' , 'row-input' => 'true', 'value' => 'row.discount', 'data-item' => 'discount', 'currency' => $currency, 'dynamic-currency' => 'currency'], 0.00, 'text-right input-price disabled-money') }}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="1" style="border: 0;" class="pb-0 align-middle">
|
<td colspan="1" style="border: 0;" class="pb-0 align-middle">
|
||||||
@ -342,10 +303,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="1" style="border: 0;">
|
<td colspan="1" style="border: 0;">
|
||||||
@if (!$hideDiscount && in_array(setting('localisation.discount_location', 'total'), ['item', 'both']))
|
@if (!$hideDiscount && in_array(setting('localisation.discount_location'), ['item', 'both']))
|
||||||
<button type="button" @click="onDeleteTax(index, row_tax_index)" class="btn btn-link btn-delete p-0">
|
|
||||||
<i class="far fa-trash-alt"></i>
|
<i class="far fa-trash-alt"></i>
|
||||||
</button>
|
<button type="button" @click="onDeleteDiscount(index)" class="btn btn-link btn-delete p-0">
|
||||||
|
</button>
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
<a href="javascript:void(0)" @click="discount = false" class="btn btn-outline-secondary" @click="closePayment">
|
<a href="javascript:void(0)" @click="discount = false" class="btn btn-outline-secondary" @click="closePayment">
|
||||||
{{ trans('general.cancel') }}
|
{{ trans('general.cancel') }}
|
||||||
</a>
|
</a>
|
||||||
{!! Form::button(trans('general.save'), ['type' => 'button', 'id' => 'save-discount', '@click' => 'onAddDiscount', 'class' => 'btn btn-success']) !!}
|
{!! Form::button(trans('general.save'), ['type' => 'button', 'id' => 'save-discount', '@click' => 'onAddTotalDiscount', 'class' => 'btn btn-success']) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user