diff --git a/app/Jobs/Document/CreateDocumentItem.php b/app/Jobs/Document/CreateDocumentItem.php index 07f1565fa..c04244708 100644 --- a/app/Jobs/Document/CreateDocumentItem.php +++ b/app/Jobs/Document/CreateDocumentItem.php @@ -43,16 +43,13 @@ class CreateDocumentItem extends Job // Apply line discount to amount if (!empty($this->request['discount'])) { - $discount += $this->request['discount']; + $discount = $this->request['discount']; - $item_discounted_amount = $item_amount -= ($item_amount * ($this->request['discount'] / 100)); - } - - // Apply global discount to amount - if (!empty($this->request['global_discount'])) { - $discount += $this->request['global_discount']; - - $item_discounted_amount = $item_amount - ($item_amount * ($this->request['global_discount'] / 100)); + if ($this->request['discount_type'] === 'percentage') { + $item_discounted_amount = $item_amount -= ($item_amount * ($this->request['discount'] / 100)); + } else { + $item_discounted_amount = $item_amount -= $this->request['discount']; + } } $tax_amount = 0; @@ -153,7 +150,11 @@ class CreateDocumentItem extends Job $item_tax_total += $tax_amount; } - $item_amount = ($item_amount - $item_tax_total) / (1 - $discount / 100); + if (!empty($this->request['discount_type']) && $this->request['discount_type'] === 'fixed') { + $item_amount = ($item_amount - $item_tax_total) - $discount; + } else { + $item_amount = ($item_amount - $item_tax_total) / (1 - $discount / 100); + } } if ($compounds) { @@ -185,6 +186,7 @@ class CreateDocumentItem extends Job $this->request['quantity'] = (double) $this->request['quantity']; $this->request['price'] = round($this->request['price'], $precision); $this->request['tax'] = round($item_tax_total, $precision); + $this->request['discount_type'] = !empty($this->request['discount_type']) ? $this->request['discount_type'] : 'percentage'; $this->request['discount_rate'] = !empty($this->request['discount']) ? $this->request['discount'] : 0; $this->request['total'] = round($item_amount, $precision); diff --git a/app/Jobs/Document/CreateDocumentItemsAndTotals.php b/app/Jobs/Document/CreateDocumentItemsAndTotals.php index a325ec2f2..4d971ebf4 100644 --- a/app/Jobs/Document/CreateDocumentItemsAndTotals.php +++ b/app/Jobs/Document/CreateDocumentItemsAndTotals.php @@ -67,15 +67,17 @@ class CreateDocumentItemsAndTotals extends Job 'sort_order' => $sort_order, ]); - $this->request['amount'] -= $discount_amount_total; - $sort_order++; } if (!empty($this->request['discount'])) { - $discount_total = ($sub_total - $discount_amount_total) * ($this->request['discount'] / 100); + if ($this->request['discount_type'] === 'percentage') { + $discount_total = $sub_total * ($this->request['discount'] / 100); + } else { + $discount_total = $this->request['discount']; + } - DocumentTotal::create([ + DocumentTotal::create([ 'company_id' => $this->document->company_id, 'type' => $this->document->type, 'document_id' => $this->document->id, @@ -193,11 +195,15 @@ class CreateDocumentItemsAndTotals extends Job $discount_amount = 0; if (!empty($item['discount'])) { - $discount_amount = ($item_amount * ($item['discount'] / 100)); + if ($item['discount_type'] === 'percentage') { + $discount_amount = ($item_amount * ($item['discount'] / 100)); + } else { + $discount_amount = $item['discount']; + } } // Calculate totals - $sub_total += $document_item->total + $discount_amount; + $sub_total += $document_item->total; $discount_amount_total += $discount_amount; diff --git a/resources/assets/js/views/common/documents.js b/resources/assets/js/views/common/documents.js index 6137007ce..486ffeed7 100644 --- a/resources/assets/js/views/common/documents.js +++ b/resources/assets/js/views/common/documents.js @@ -70,6 +70,8 @@ const app = new Vue({ }, mounted() { + this.form.discount_type = 'percentage'; + if ((document.getElementById('items') != null) && (document.getElementById('items').rows)) { this.colspan = document.getElementById("items").rows[0].cells.length - 1; } @@ -116,7 +118,19 @@ const app = new Vue({ let line_discount_amount = 0; if (item.discount) { - line_discount_amount = item.total * (item.discount / 100); + if (item.discount_type === 'percentage') { + if (item.discount > 100) { + item.discount = 100; + } + + line_discount_amount = item.total * (item.discount / 100); + } else { + if (parseInt(item.discount) > item.price) { + item.discount = item.price; + } + line_discount_amount = parseFloat(item.discount); + } + item.discount_amount = line_discount_amount item_discounted_total = item.total -= line_discount_amount; @@ -125,12 +139,6 @@ const app = new Vue({ let item_discounted_total = item.total; - if (global_discount) { - item_discounted_total = item.total - (item.total * (global_discount / 100)); - - item_discount = global_discount; - } - // item tax calculate. if (item.tax_ids) { let inclusives = []; @@ -241,7 +249,11 @@ const app = new Vue({ // Apply discount to total if (global_discount) { - discount_total = parseFloat(sub_total + inclusive_tax_total) * (global_discount / 100); + if (this.form.discount_type === 'percentage') { + discount_total = parseFloat(sub_total + inclusive_tax_total) * (global_discount / 100); + } else { + discount_total = global_discount; + } this.totals.discount = discount_total; @@ -386,16 +398,35 @@ const app = new Vue({ }, onAddLineDiscount(item_index) { + this.items[item_index].discount_type = 'percentage'; this.items[item_index].add_discount = true; }, + onChangeDiscountType(type) { + this.form.discount_type = type; + this.onCalculateTotal(); + }, + + onChangeLineDiscountType(item_index, type) { + this.items[item_index].discount_type = type; + this.onCalculateTotal(); + }, + onAddTotalDiscount() { let discount = document.getElementById('pre-discount').value; - if (discount < 0) { - discount = 0; - } else if (discount > 100) { - discount = 100; + if (this.form.discount_type === 'percentage') { + if (discount < 0) { + discount = 0; + } else if (discount > 100) { + discount = 100; + } + } else { + if (discount < 0) { + discount = 0; + } else if (discount > this.totals.sub) { + discount = this.totals.sub; + } } document.getElementById('pre-discount').value = discount; @@ -618,6 +649,7 @@ const app = new Vue({ price: (item.price).toFixed(2), tax_ids: item.tax_ids, discount: item.discount_rate, + discount_type: item.discount_type, total: (item.total).toFixed(2) }); @@ -655,6 +687,7 @@ const app = new Vue({ tax_ids: item_taxes, add_discount: (item.discount_rate) ? true : false, discount: item.discount_rate, + discount_type: item.discount_type, total: (item.total).toFixed(2), // @todo // invoice_item_checkbox_sample: [], diff --git a/resources/views/components/documents/form/line-item.blade.php b/resources/views/components/documents/form/line-item.blade.php index 7bc75000f..2f9fde784 100644 --- a/resources/views/components/documents/form/line-item.blade.php +++ b/resources/views/components/documents/form/line-item.blade.php @@ -76,7 +76,7 @@ @if (!$hideQuantity)