From c15b72b6b00c9d22d1210b1e41333d8afaf3a199 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 21 Mar 2020 06:00:36 +0100 Subject: [PATCH] Refactor currency validation --- .../V1/Requests/RecurrenceStoreRequest.php | 3 +- .../V1/Requests/RecurrenceUpdateRequest.php | 3 +- .../V1/Requests/TransactionStoreRequest.php | 4 +- app/Validation/CurrencyValidation.php | 72 +++++++++++++++++++ app/Validation/GroupValidation.php | 27 +++++++ app/Validation/TransactionValidation.php | 55 -------------- 6 files changed, 106 insertions(+), 58 deletions(-) create mode 100644 app/Validation/CurrencyValidation.php diff --git a/app/Api/V1/Requests/RecurrenceStoreRequest.php b/app/Api/V1/Requests/RecurrenceStoreRequest.php index ca21326d07..ced87a5087 100644 --- a/app/Api/V1/Requests/RecurrenceStoreRequest.php +++ b/app/Api/V1/Requests/RecurrenceStoreRequest.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests; use Carbon\Carbon; use FireflyIII\Rules\BelongsUser; use FireflyIII\Rules\IsBoolean; +use FireflyIII\Validation\CurrencyValidation; use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\TransactionValidation; use Illuminate\Validation\Validator; @@ -35,7 +36,7 @@ use Illuminate\Validation\Validator; */ class RecurrenceStoreRequest extends Request { - use RecurrenceValidation, TransactionValidation; + use RecurrenceValidation, TransactionValidation, CurrencyValidation; /** * Authorize logged in users. diff --git a/app/Api/V1/Requests/RecurrenceUpdateRequest.php b/app/Api/V1/Requests/RecurrenceUpdateRequest.php index 4ea18ff3d8..22304a39cb 100644 --- a/app/Api/V1/Requests/RecurrenceUpdateRequest.php +++ b/app/Api/V1/Requests/RecurrenceUpdateRequest.php @@ -26,6 +26,7 @@ namespace FireflyIII\Api\V1\Requests; use FireflyIII\Models\Recurrence; use FireflyIII\Rules\BelongsUser; use FireflyIII\Rules\IsBoolean; +use FireflyIII\Validation\CurrencyValidation; use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\TransactionValidation; use Illuminate\Validation\Validator; @@ -35,7 +36,7 @@ use Illuminate\Validation\Validator; */ class RecurrenceUpdateRequest extends Request { - use RecurrenceValidation, TransactionValidation; + use RecurrenceValidation, TransactionValidation, CurrencyValidation; /** * Authorize logged in users. diff --git a/app/Api/V1/Requests/TransactionStoreRequest.php b/app/Api/V1/Requests/TransactionStoreRequest.php index 5315c3c22a..91b246c737 100644 --- a/app/Api/V1/Requests/TransactionStoreRequest.php +++ b/app/Api/V1/Requests/TransactionStoreRequest.php @@ -28,6 +28,8 @@ use FireflyIII\Rules\BelongsUser; use FireflyIII\Rules\IsBoolean; use FireflyIII\Rules\IsDateOrTime; use FireflyIII\Support\NullArrayObject; +use FireflyIII\Validation\CurrencyValidation; +use FireflyIII\Validation\GroupValidation; use FireflyIII\Validation\TransactionValidation; use Illuminate\Validation\Validator; use Log; @@ -37,7 +39,7 @@ use Log; */ class TransactionStoreRequest extends Request { - use TransactionValidation; + use TransactionValidation, GroupValidation, CurrencyValidation; /** * Authorize logged in users. diff --git a/app/Validation/CurrencyValidation.php b/app/Validation/CurrencyValidation.php new file mode 100644 index 0000000000..de71491857 --- /dev/null +++ b/app/Validation/CurrencyValidation.php @@ -0,0 +1,72 @@ +. + */ + +namespace FireflyIII\Validation; + + +use Illuminate\Validation\Validator; +use Log; + +/** + * Trait CurrencyValidation + * + * This trait contains validation methods that have to do with currencies. + */ +trait CurrencyValidation +{ + /** + * @param Validator $validator + * + * @return array + */ + abstract protected function getTransactionsArray(Validator $validator): array; + + /** + * If the transactions contain foreign amounts, there must also be foreign currency information. + * + * @param Validator $validator + */ + protected function validateForeignCurrencyInformation(Validator $validator): void + { + Log::debug('Now in validateForeignCurrencyInformation()'); + $transactions = $this->getTransactionsArray($validator); + + foreach ($transactions as $index => $transaction) { + // if foreign amount is present, then the currency must be as well. + if (isset($transaction['foreign_amount']) && !(isset($transaction['foreign_currency_id']) || isset($transaction['foreign_currency_code'])) + && 0 !== bccomp('0', $transaction['foreign_amount']) + ) { + $validator->errors()->add( + 'transactions.' . $index . '.foreign_amount', + (string) trans('validation.require_currency_info') + ); + } + // if the currency is present, then the amount must be present as well. + if ((isset($transaction['foreign_currency_id']) || isset($transaction['foreign_currency_code'])) && !isset($transaction['foreign_amount'])) { + $validator->errors()->add( + 'transactions.' . $index . '.foreign_amount', + (string) trans('validation.require_currency_amount') + ); + } + } + } +} \ No newline at end of file diff --git a/app/Validation/GroupValidation.php b/app/Validation/GroupValidation.php index e7f6fe3c54..d1387a36d8 100644 --- a/app/Validation/GroupValidation.php +++ b/app/Validation/GroupValidation.php @@ -67,6 +67,31 @@ trait GroupValidation } } + /** + * Adds an error to the "description" field when the user has submitted no descriptions and no + * journal description. + * + * @param Validator $validator + */ + protected function validateDescriptions(Validator $validator): void + { + Log::debug('Now in GroupValidation::validateDescriptions()'); + $transactions = $this->getTransactionsArray($validator); + $validDescriptions = 0; + foreach ($transactions as $transaction) { + if ('' !== (string)($transaction['description'] ?? null)) { + $validDescriptions++; + } + } + + // no valid descriptions? + if (0 === $validDescriptions) { + $validator->errors()->add( + 'transactions.0.description', (string)trans('validation.filled', ['attribute' => (string)trans('validation.attributes.description')]) + ); + } + } + /** * Do the validation required by validateJournalIds. * @@ -86,4 +111,6 @@ trait GroupValidation $validator->errors()->add(sprintf('transactions.%d.source_name', $index), (string) trans('validation.need_id_in_edit')); } } + + } \ No newline at end of file diff --git a/app/Validation/TransactionValidation.php b/app/Validation/TransactionValidation.php index 61d49ace46..a0168ed4ff 100644 --- a/app/Validation/TransactionValidation.php +++ b/app/Validation/TransactionValidation.php @@ -160,61 +160,6 @@ trait TransactionValidation } } - /** - * Adds an error to the "description" field when the user has submitted no descriptions and no - * journal description. - * - * @param Validator $validator - */ - public function validateDescriptions(Validator $validator): void - { - Log::debug('Now in validateDescriptions()'); - $transactions = $this->getTransactionsArray($validator); - $validDescriptions = 0; - foreach ($transactions as $transaction) { - if ('' !== (string)($transaction['description'] ?? null)) { - $validDescriptions++; - } - } - - // no valid descriptions? - if (0 === $validDescriptions) { - $validator->errors()->add( - 'transactions.0.description', (string)trans('validation.filled', ['attribute' => (string)trans('validation.attributes.description')]) - ); - } - } - - /** - * If the transactions contain foreign amounts, there must also be foreign currency information. - * - * @param Validator $validator - */ - public function validateForeignCurrencyInformation(Validator $validator): void - { - Log::debug('Now in validateForeignCurrencyInformation()'); - $transactions = $this->getTransactionsArray($validator); - - foreach ($transactions as $index => $transaction) { - // if foreign amount is present, then the currency must be as well. - if (isset($transaction['foreign_amount']) && !(isset($transaction['foreign_currency_id']) || isset($transaction['foreign_currency_code'])) - && 0 !== bccomp('0', $transaction['foreign_amount']) - ) { - $validator->errors()->add( - 'transactions.' . $index . '.foreign_amount', - (string)trans('validation.require_currency_info') - ); - } - // if the currency is present, then the amount must be present as well. - if ((isset($transaction['foreign_currency_id']) || isset($transaction['foreign_currency_code'])) && !isset($transaction['foreign_amount'])) { - $validator->errors()->add( - 'transactions.' . $index . '.foreign_amount', - (string)trans('validation.require_currency_amount') - ); - } - } - } - /** * @param Validator $validator */