0.0) { $this->setValue($value); } if (null !== $currency) { $this->setCurrency($currency); } } } /** * Возвращает значение суммы. * * @return string Сумма */ public function getValue(): string { if ($this->_value < 10) { return '0.0' . $this->_value; } if ($this->_value < 100) { return '0.' . $this->_value; } return substr($this->_value, 0, -2) . '.' . substr($this->_value, -2); } /** * {@inheritdoc} */ public function setValue(mixed $value): void { $value = $this->validatePropertyValue('_value', $value); if ($value < 0.0) { throw new InvalidPropertyValueException('Invalid amount value: "' . $value . '"', 0, 'amount.value', $value); } $castedValue = (int) round($value * 100.0); $this->_value = $castedValue; } /** * Возвращает сумму в копейках в виде целого числа. * * @return int Сумма в копейках/центах */ public function getIntegerValue(): int { return $this->_value; } /** * Возвращает валюту. * * @return string Код валюты */ public function getCurrency(): string { return $this->_currency; } /** * Устанавливает код валюты. * * @param string|null $currency Код валюты * * @return self */ public function setCurrency(?string $currency = null): self { $this->_currency = $this->validatePropertyValue('_currency', $currency); return $this; } /** * Умножает текущую сумму на указанный коэффициент * * @param float|null $coefficient Множитель * * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число * @throws InvalidPropertyValueException Выбрасывается если переданное значение меньше или равно нулю, либо если * после умножения получили значение равное нулю */ public function multiply(?float $coefficient): void { if (null === $coefficient || '' === $coefficient) { throw new EmptyPropertyValueException('Empty coefficient in multiply method', 0, 'amount.value'); } if (!is_numeric($coefficient)) { throw new InvalidPropertyValueTypeException( 'Invalid coefficient type in multiply method', 0, 'amount.value', $coefficient ); } if ($coefficient <= 0.0) { throw new InvalidPropertyValueException( 'Invalid coefficient in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient ); } $castedValue = (int) round($coefficient * $this->_value); if (0 === $castedValue) { throw new InvalidPropertyValueException( 'Invalid coefficient value in multiply method: "' . $coefficient . '"', 0, 'amount.value', $coefficient ); } $this->_value = $castedValue; } /** * Увеличивает сумму на указанное значение. * * @param float|null $value Значение, которое будет прибавлено к текущему * * @throws EmptyPropertyValueException Выбрасывается если передано пустое значение * @throws InvalidPropertyValueTypeException Выбрасывается если было передано не число * @throws InvalidPropertyValueException Выбрасывается если после сложения получилась сумма меньше или равная нулю */ public function increase(?float $value): void { if (null === $value) { throw new EmptyPropertyValueException('Empty amount value in increase method', 0, 'amount.value'); } if (!is_numeric($value)) { throw new InvalidPropertyValueTypeException( 'Invalid amount value type in increase method', 0, 'amount.value', $value ); } $castedValue = (int) round($this->_value + $value * 100.0); if ($castedValue <= 0) { throw new InvalidPropertyValueException( 'Invalid amount value in increase method: "' . $value . '"', 0, 'amount.value', $value ); } $this->_value = $castedValue; } public function jsonSerialize(): array { return [ 'value' => number_format($this->_value / 100.0, 2, '.', ''), 'currency' => $this->_currency, ]; } }