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:
Cüneyt Şentürk 2021-01-03 23:55:11 +03:00 committed by GitHub
commit 437b0a7daf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 94 deletions

View File

@ -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;
}, },

View File

@ -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">

View File

@ -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>

View File

@ -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>