*/ public function getAll(): array { return ['from' => $this->get('from'), 'rates' => $this->get('rates', [])]; } public function getFromCurrency(): TransactionCurrency { return Amount::getTransactionCurrencyByCode((string) $this->get('from')); } /** * The rules that the incoming request must be matched against. * * @return array */ public function rules(): array { return ['from' => 'required|exists:transaction_currencies,code', 'rates' => 'required|array', 'rates.*' => 'required|numeric|min:0.0000000001']; } public function withValidator(Validator $validator): void { $from = $this->getFromCurrency(); $validator->after(static function (Validator $validator) use ($from): void { $data = $validator->getData(); $rates = $data['rates'] ?? []; if (0 === count($rates)) { $validator->errors()->add('rates', 'No rates given.'); return; } foreach ($rates as $key => $entry) { if ($key === $from->code) { $validator->errors()->add(sprintf('rates.%s', $key), trans('validation.convert_to_itself', ['code' => $key])); continue; } try { Amount::getTransactionCurrencyByCode((string) $key); } catch (FireflyException) { $validator->errors()->add(sprintf('rates.%s', $key), trans('validation.invalid_currency_code', ['code' => $key])); } } }); } }