. */ declare(strict_types=1); namespace FireflyIII\Validation\Api\Data\Bulk; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Illuminate\Validation\Validator; trait ValidatesBulkTransactionQuery { protected function validateTransactionQuery(Validator $validator): void { $data = $validator->getData(); // assumption is all validation has already taken place and the query key exists. $json = json_decode($data['query'], true, 8, JSON_THROW_ON_ERROR); if (array_key_exists('account_id', $json['where']) && array_key_exists('account_id', $json['update']) ) { // find both accounts, must be same type. // already validated: belongs to this user. $repository = app(AccountRepositoryInterface::class); $source = $repository->find((int)$json['where']['account_id']); $dest = $repository->find((int)$json['update']['account_id']); if (null === $source) { $validator->errors()->add('query', sprintf((string)trans('validation.invalid_query_data'), 'where', 'account_id')); return; } if (null === $dest) { $validator->errors()->add('query', sprintf((string)trans('validation.invalid_query_data'), 'update', 'account_id')); return; } if ($source->accountType->type !== $dest->accountType->type) { $validator->errors()->add('query', (string)trans('validation.invalid_query_account_type')); return; } // must have same currency: // some account types (like expenses) do not have currency, so they have to be omitted $sourceCurrency = $repository->getAccountCurrency($source); $destCurrency = $repository->getAccountCurrency($dest); if ( null !== $sourceCurrency && null !== $destCurrency && $sourceCurrency->id !== $destCurrency->id ) { $validator->errors()->add('query', (string)trans('validation.invalid_query_currency')); } } } }