From bb6075e6ef15b2cb189f0f80574a45cc558c5647 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 30 Jul 2024 17:00:54 +1000 Subject: [PATCH] Alignment for invoice/quote requests --- .../Requests/Credit/StoreCreditRequest.php | 3 ++ .../Requests/Credit/UpdateCreditRequest.php | 3 ++ .../Requests/Invoice/StoreInvoiceRequest.php | 36 ++++++------- .../Requests/Invoice/UpdateInvoiceRequest.php | 3 ++ .../StorePurchaseOrderRequest.php | 4 ++ .../UpdatePurchaseOrderRequest.php | 3 ++ app/Http/Requests/Quote/StoreQuoteRequest.php | 51 +++++++++++++------ .../Requests/Quote/UpdateQuoteRequest.php | 3 ++ .../StoreRecurringInvoiceRequest.php | 3 +- .../UpdateRecurringInvoiceRequest.php | 2 + 10 files changed, 77 insertions(+), 34 deletions(-) diff --git a/app/Http/Requests/Credit/StoreCreditRequest.php b/app/Http/Requests/Credit/StoreCreditRequest.php index 69f24d28ab19..27b9a4b020cf 100644 --- a/app/Http/Requests/Credit/StoreCreditRequest.php +++ b/app/Http/Requests/Credit/StoreCreditRequest.php @@ -64,6 +64,9 @@ class StoreCreditRequest extends Request $user = auth()->user(); $rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id; + + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; // $rules['number'] = new UniqueCreditNumberRule($this->all()); $rules['number'] = ['nullable', Rule::unique('credits')->where('company_id', $user->company()->id)]; diff --git a/app/Http/Requests/Credit/UpdateCreditRequest.php b/app/Http/Requests/Credit/UpdateCreditRequest.php index d7ece562fb6d..0733e3891326 100644 --- a/app/Http/Requests/Credit/UpdateCreditRequest.php +++ b/app/Http/Requests/Credit/UpdateCreditRequest.php @@ -65,6 +65,9 @@ class UpdateCreditRequest extends Request $rules['number'] = ['bail', 'sometimes', 'nullable', Rule::unique('credits')->where('company_id', $user->company()->id)->ignore($this->credit->id)]; $rules['client_id'] = ['bail', 'sometimes',Rule::in([$this->credit->client_id])]; + + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; $rules['line_items'] = 'array'; diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 767ac8db722d..34907c6d602f 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -38,11 +38,14 @@ class StoreInvoiceRequest extends Request public function rules() { - $rules = []; /** @var \App\Models\User $user */ $user = auth()->user(); + $rules = []; + + $rules['client_id'] = ['required', 'bail', Rule::exists('clients', 'id')->where('company_id', $user->company()->id)->where('is_deleted', 0)]; + if ($this->file('documents') && is_array($this->file('documents'))) { $rules['documents.*'] = $this->fileValidation(); } elseif ($this->file('documents')) { @@ -57,16 +60,16 @@ class StoreInvoiceRequest extends Request $rules['file'] = $this->fileValidation(); } - $rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0'; - - $rules['invitations.*.client_contact_id'] = 'distinct'; - $rules['number'] = ['bail', 'nullable', Rule::unique('invoices')->where('company_id', $user->company()->id)]; + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; + $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; $rules['is_amount_discount'] = ['boolean']; $rules['date'] = 'bail|sometimes|date:Y-m-d'; + $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date ?? '') > 1), 'date']; $rules['line_items'] = 'array'; $rules['discount'] = 'sometimes|numeric|max:99999999999999'; @@ -79,18 +82,17 @@ class StoreInvoiceRequest extends Request $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0'; $rules['partial_due_date'] = ['bail', 'sometimes', 'nullable', 'exclude_if:partial,0', 'date', 'before:due_date', 'after_or_equal:date']; - $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date ?? '') > 1), 'date']; - $rules['amount'] = ['sometimes', 'bail', 'numeric', 'max:99999999999999']; - // $rules['amount'] = ['sometimes', 'bail', 'max:99999999999999']; - // $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date) > 1), 'date']; - return $rules; } public function prepareForValidation() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + $input = $this->all(); $input = $this->decodePrimaryKeys($input); @@ -102,24 +104,24 @@ class StoreInvoiceRequest extends Request $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; $input['amount'] = $this->entityTotalAmount($input['line_items']); } - if(isset($input['partial']) && $input['partial'] == 0) { $input['partial_due_date'] = null; - } - - if (array_key_exists('tax_rate1', $input) && is_null($input['tax_rate1'])) { + } + if (!isset($input['tax_rate1'])) { $input['tax_rate1'] = 0; } - if (array_key_exists('tax_rate2', $input) && is_null($input['tax_rate2'])) { + if (!isset($input['tax_rate2'])) { $input['tax_rate2'] = 0; } - if (array_key_exists('tax_rate3', $input) && is_null($input['tax_rate3'])) { + if (!isset($input['tax_rate3'])) { $input['tax_rate3'] = 0; } if (array_key_exists('exchange_rate', $input) && is_null($input['exchange_rate'])) { $input['exchange_rate'] = 1; } - + if(!isset($input['date'])) { + $input['date'] = now()->addSeconds($user->company()->utc_offset())->format('Y-m-d'); + } //handles edge case where we need for force set the due date of the invoice. if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) { $client = \App\Models\Client::withTrashed()->find($input['client_id']); diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 9d960ef379c9..1dee8fac1a1a 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -67,6 +67,9 @@ class UpdateInvoiceRequest extends Request $rules['client_id'] = ['bail', 'sometimes', Rule::in([$this->invoice->client_id])]; $rules['line_items'] = 'array'; + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; + $rules['discount'] = 'sometimes|numeric|max:99999999999999'; $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; $rules['tax_rate1'] = 'bail|sometimes|numeric'; diff --git a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php index 3805ed73a9e3..6e2387ce79ae 100644 --- a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php @@ -50,6 +50,10 @@ class StorePurchaseOrderRequest extends Request $rules['number'] = ['nullable', Rule::unique('purchase_orders')->where('company_id', $user->company()->id)]; + + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.vendor_contact_id'] = 'bail|required|distinct'; + $rules['discount'] = 'sometimes|numeric|max:99999999999999'; $rules['is_amount_discount'] = ['boolean']; $rules['line_items'] = 'array'; diff --git a/app/Http/Requests/PurchaseOrder/UpdatePurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/UpdatePurchaseOrderRequest.php index 5ae69e8d1598..6403d1fc385f 100644 --- a/app/Http/Requests/PurchaseOrder/UpdatePurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/UpdatePurchaseOrderRequest.php @@ -53,6 +53,9 @@ class UpdatePurchaseOrderRequest extends Request $rules['line_items'] = 'array'; + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.vendor_contact_id'] = 'bail|required|distinct'; + $rules['discount'] = 'sometimes|numeric|max:99999999999999'; $rules['is_amount_discount'] = ['boolean']; diff --git a/app/Http/Requests/Quote/StoreQuoteRequest.php b/app/Http/Requests/Quote/StoreQuoteRequest.php index 4b2624ee7a6e..afb6226cfe62 100644 --- a/app/Http/Requests/Quote/StoreQuoteRequest.php +++ b/app/Http/Requests/Quote/StoreQuoteRequest.php @@ -11,12 +11,13 @@ namespace App\Http\Requests\Quote; -use App\Http\Requests\Request; -use App\Http\ValidationRules\Quote\UniqueQuoteNumberRule; use App\Models\Quote; -use App\Utils\Traits\CleanLineItems; +use App\Http\Requests\Request; use App\Utils\Traits\MakesHash; use Illuminate\Validation\Rule; +use App\Utils\Traits\CleanLineItems; +use App\Http\ValidationRules\Quote\UniqueQuoteNumberRule; +use App\Http\ValidationRules\Project\ValidProjectForClient; class StoreQuoteRequest extends Request { @@ -43,7 +44,7 @@ class StoreQuoteRequest extends Request $rules = []; - $rules['client_id'] = ['required', 'bail', Rule::exists('clients', 'id')->where('company_id', $user->company()->id)]; + $rules['client_id'] = ['required', 'bail', Rule::exists('clients', 'id')->where('company_id', $user->company()->id)->where('is_deleted',0)]; if ($this->file('documents') && is_array($this->file('documents'))) { $rules['documents.*'] = $this->fileValidation(); @@ -59,15 +60,28 @@ class StoreQuoteRequest extends Request $rules['file'] = $this->fileValidation(); } - $rules['number'] = ['nullable', Rule::unique('quotes')->where('company_id', $user->company()->id)]; + $rules['number'] = ['bail','nullable', Rule::unique('quotes')->where('company_id', $user->company()->id)]; + + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; + + $rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())]; + $rules['is_amount_discount'] = ['boolean']; + $rules['date'] = 'bail|sometimes|date:Y-m-d'; + $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date ?? '') > 1), 'date']; + $rules['line_items'] = 'array'; $rules['discount'] = 'sometimes|numeric|max:99999999999999'; - $rules['is_amount_discount'] = ['boolean']; + $rules['tax_rate1'] = 'bail|sometimes|numeric'; + $rules['tax_rate2'] = 'bail|sometimes|numeric'; + $rules['tax_rate3'] = 'bail|sometimes|numeric'; + $rules['tax_name1'] = 'bail|sometimes|string|nullable'; + $rules['tax_name2'] = 'bail|sometimes|string|nullable'; + $rules['tax_name3'] = 'bail|sometimes|string|nullable'; $rules['exchange_rate'] = 'bail|sometimes|numeric'; - $rules['line_items'] = 'array'; - $rules['date'] = 'bail|sometimes|date:Y-m-d'; + + $rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0'; $rules['partial_due_date'] = ['bail', 'sometimes', 'nullable', 'exclude_if:partial,0', 'date', 'before:due_date', 'after_or_equal:date']; - $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date ?? '') > 1), 'date']; $rules['amount'] = ['sometimes', 'bail', 'numeric', 'max:99999999999999']; return $rules; @@ -89,19 +103,24 @@ class StoreQuoteRequest extends Request $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; $input['amount'] = $this->entityTotalAmount($input['line_items']); } - - if (array_key_exists('exchange_rate', $input) && is_null($input['exchange_rate'])) { - $input['exchange_rate'] = 1; - } - if(isset($input['partial']) && $input['partial'] == 0) { $input['partial_due_date'] = null; } - + if (!isset($input['tax_rate1'])) { + $input['tax_rate1'] = 0; + } + if (!isset($input['tax_rate2'])) { + $input['tax_rate2'] = 0; + } + if (!isset($input['tax_rate3'])) { + $input['tax_rate3'] = 0; + } + if (!isset($input['exchange_rate'])) { + $input['exchange_rate'] = 1; + } if(!isset($input['date'])) { $input['date'] = now()->addSeconds($user->company()->utc_offset())->format('Y-m-d'); } - if(isset($input['partial_due_date']) && (!isset($input['due_date']) || strlen($input['due_date']) <= 1)) { $client = \App\Models\Client::withTrashed()->find($input['client_id']); $valid_days = ($client && strlen($client->getSetting('valid_until')) >= 1) ? $client->getSetting('valid_until') : 7; diff --git a/app/Http/Requests/Quote/UpdateQuoteRequest.php b/app/Http/Requests/Quote/UpdateQuoteRequest.php index 77ac6f2f4abd..1f5e795dedcf 100644 --- a/app/Http/Requests/Quote/UpdateQuoteRequest.php +++ b/app/Http/Requests/Quote/UpdateQuoteRequest.php @@ -55,6 +55,9 @@ class UpdateQuoteRequest extends Request } elseif ($this->file('file')) { $rules['file'] = $this->fileValidation(); } + + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; $rules['number'] = ['bail', 'sometimes', 'nullable', Rule::unique('quotes')->where('company_id', $user->company()->id)->ignore($this->quote->id)]; $rules['client_id'] = ['bail', 'sometimes', Rule::in([$this->quote->client_id])]; diff --git a/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php b/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php index 7dc6ef5fdc7e..3bdecfa1e66e 100644 --- a/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php +++ b/app/Http/Requests/RecurringInvoice/StoreRecurringInvoiceRequest.php @@ -61,7 +61,8 @@ class StoreRecurringInvoiceRequest extends Request $rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id; - $rules['invitations.*.client_contact_id'] = 'distinct'; + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; $rules['frequency_id'] = 'required|integer|digits_between:1,12'; diff --git a/app/Http/Requests/RecurringInvoice/UpdateRecurringInvoiceRequest.php b/app/Http/Requests/RecurringInvoice/UpdateRecurringInvoiceRequest.php index a89baa8d2cf9..6ea38d30ed5b 100644 --- a/app/Http/Requests/RecurringInvoice/UpdateRecurringInvoiceRequest.php +++ b/app/Http/Requests/RecurringInvoice/UpdateRecurringInvoiceRequest.php @@ -60,6 +60,8 @@ class UpdateRecurringInvoiceRequest extends Request $rules['number'] = ['bail', 'sometimes', Rule::unique('recurring_invoices')->where('company_id', $user->company()->id)->ignore($this->recurring_invoice->id)]; + $rules['invitations'] = 'sometimes|bail|array'; + $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; $rules['client_id'] = ['bail', 'sometimes', Rule::in([$this->recurring_invoice->client_id])];