From 905d1a3f85022c489b6c25e065226c1666965e7d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 6 Dec 2023 23:20:12 +1100 Subject: [PATCH] Fixes for invoice filtering and partial due date validations --- app/Filters/InvoiceFilters.php | 12 ++++++++---- app/Http/Requests/Invoice/StoreInvoiceRequest.php | 6 +++++- app/Http/Requests/Invoice/UpdateInvoiceRequest.php | 6 +++++- lang/en/texts.php | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index 58af558b99b8..a3feeb040047 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -147,11 +147,15 @@ class InvoiceFilters extends QueryFilters public function upcoming(): Builder { return $this->builder->whereIn('status_id', [Invoice::STATUS_PARTIAL, Invoice::STATUS_SENT]) - ->where(function ($query) { - $query->whereNull('due_date') - ->orWhere('due_date', '>', now()); + ->whereNull('due_date') + ->orWhere(function ($q) { + $q->where('due_date', '>=', now()->startOfDay()->subSecond())->where('partial', 0); }) - ->orderBy('due_date', 'ASC'); + ->orWhere(function ($q) { + $q->where('partial_due_date', '>=', now()->startOfDay()->subSecond())->where('partial', '>', 0); + }) + ->orderByRaw('ISNULL(due_date), due_date '. 'desc') + ->orderByRaw('ISNULL(partial_due_date), partial_due_date '. 'desc'); } /** diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 1b8da986af03..aa254b920297 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -74,7 +74,7 @@ class StoreInvoiceRequest extends Request $rules['tax_name3'] = 'bail|sometimes|string|nullable'; $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0'; - $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date']; + $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date', 'before:due_date']; return $rules; } @@ -89,6 +89,10 @@ class StoreInvoiceRequest extends Request $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; } + if(isset($input['partial']) && $input['partial'] == 0 && isset($input['partial_due_date'])) { + $input['partial_due_date'] = ''; + } + $input['amount'] = 0; $input['balance'] = 0; diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 14f18db35a6f..319f1d9aab91 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -76,7 +76,7 @@ class UpdateInvoiceRequest extends Request $rules['status_id'] = 'bail|sometimes|not_in:5'; //do not allow cancelled invoices to be modfified. $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric'; - $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date']; + $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date', 'before:due_date']; return $rules; } @@ -89,6 +89,10 @@ class UpdateInvoiceRequest extends Request $input['id'] = $this->invoice->id; + if(isset($input['partial']) && $input['partial'] == 0 && isset($input['partial_due_date'])) { + $input['partial_due_date'] = ''; + } + if (isset($input['line_items']) && is_array($input['line_items'])) { $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; } diff --git a/lang/en/texts.php b/lang/en/texts.php index 12fcae859353..e6fa85eca5f4 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -3372,7 +3372,7 @@ $lang = array( 'credit_number_counter' => 'Credit Number Counter', 'reset_counter_date' => 'Reset Counter Date', 'counter_padding' => 'Counter Padding', - 'shared_invoice_quote_counter' => 'Share Invoice Quote Counter', + 'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter', 'default_tax_name_1' => 'Default Tax Name 1', 'default_tax_rate_1' => 'Default Tax Rate 1', 'default_tax_name_2' => 'Default Tax Name 2',