From 73bcaae3f6d2995e52b1344657178f54fabe6cd3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 28 Apr 2021 11:18:27 +1000 Subject: [PATCH] Allow invoice balances to change - but do no allow them to go negative --- app/Helpers/Invoice/InvoiceSum.php | 10 +++ app/Helpers/Invoice/InvoiceSumInclusive.php | 6 ++ .../Requests/Invoice/UpdateInvoiceRequest.php | 5 ++ .../Invoice/InvoiceBalanceSanity.php | 77 +++++++++++++++++++ app/Repositories/BaseRepository.php | 6 ++ 5 files changed, 104 insertions(+) create mode 100644 app/Http/ValidationRules/Invoice/InvoiceBalanceSanity.php diff --git a/app/Helpers/Invoice/InvoiceSum.php b/app/Helpers/Invoice/InvoiceSum.php index c6e3fcfd367c..3252f7cfe064 100644 --- a/app/Helpers/Invoice/InvoiceSum.php +++ b/app/Helpers/Invoice/InvoiceSum.php @@ -183,6 +183,16 @@ class InvoiceSum return $this; } + /** + * Allow us to get the entity without persisting it + * @return Invoice the temp + */ + public function getTempEntity() + { + $this->setCalculatedAttributes(); + return $this->invoice; + } + public function getInvoice() { //Build invoice values here and return Invoice diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index c0505387b71f..80e95153cdd4 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -196,6 +196,12 @@ class InvoiceSumInclusive return $this->invoice; } + public function getTempEntity() + { + $this->setCalculatedAttributes(); + return $this->invoice; + } + public function getInvoice() { //Build invoice values here and return Invoice diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index ec08c200bb90..663fc0e5fa4e 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -12,7 +12,9 @@ namespace App\Http\Requests\Invoice; use App\Http\Requests\Request; +use App\Http\ValidationRules\Invoice\InvoiceBalanceSanity; use App\Http\ValidationRules\Invoice\LockedInvoiceRule; +use App\Models\Invoice; use App\Utils\Traits\ChecksEntityStatus; use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; @@ -55,6 +57,9 @@ class UpdateInvoiceRequest extends Request $rules['line_items'] = 'array'; + if($this->input('status_id') != Invoice::STATUS_DRAFT) + $rules['balance'] = new InvoiceBalanceSanity($this->invoice, $this->all()); + return $rules; } diff --git a/app/Http/ValidationRules/Invoice/InvoiceBalanceSanity.php b/app/Http/ValidationRules/Invoice/InvoiceBalanceSanity.php new file mode 100644 index 000000000000..e171667b44ab --- /dev/null +++ b/app/Http/ValidationRules/Invoice/InvoiceBalanceSanity.php @@ -0,0 +1,77 @@ +invoice = $invoice; + $this->input = $input; + } + + /** + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value) + { + return $this->checkIfInvoiceBalanceIsSane(); //if it exists, return false! + } + + /** + * @return string + */ + public function message() + { + return $this->message; + } + + /** + * @return bool + */ + private function checkIfInvoiceBalanceIsSane() : bool + { + + $this->invoice->line_items = $this->input['line_items']; + + DB::beginTransaction(); + + $temp_invoice = $this->invoice->calc()->getTempEntity(); + + DB::rollBack(); + + if($temp_invoice->balance < 0){ + $this->message = 'Invoice balance cannot go negative'; + return false; + } + + + return true; + + } +} diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index 9942698ef7f6..a1084a2d4342 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -302,8 +302,14 @@ class BaseRepository /* Perform model specific tasks */ if ($model instanceof Invoice) { +nlog("in base"); +nlog($state['finished_amount']); +nlog($state['starting_amount']); +nlog($model->status_id); + if (($state['finished_amount'] != $state['starting_amount']) && ($model->status_id != Invoice::STATUS_DRAFT)) { + $model->service()->updateStatus()->save(); $model->ledger()->updateInvoiceBalance(($state['finished_amount'] - $state['starting_amount']), "Update adjustment for invoice {$model->number}"); $model->client->service()->updateBalance(($state['finished_amount'] - $state['starting_amount']))->save();