%PDF- %PDF-
Direktori : /var/www/pjc/vendor/cknow/laravel-money/src/Casts/ |
Current File : /var/www/pjc/vendor/cknow/laravel-money/src/Casts/MoneyCast.php |
<?php namespace Cknow\Money\Casts; use Cknow\Money\Money; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use InvalidArgumentException; abstract class MoneyCast implements CastsAttributes { /** * The currency code or the model attribute holding the currency code. * * @var string|null */ protected $currency; /** * Force decimals. * * @var bool */ protected $forceDecimals = false; /** * Instantiate the class. * * @param string|null $currency * @param mixed $forceDecimals */ public function __construct(string $currency = null, $forceDecimals = null) { $this->currency = $currency; $this->forceDecimals = is_string($forceDecimals) ? filter_var($forceDecimals, FILTER_VALIDATE_BOOLEAN) : (bool) $forceDecimals; } /** * Get formatter. * * @param \Cknow\Money\Money $money * @return string|float|int */ abstract protected function getFormatter(Money $money); /** * Prepare value to parser. * * @param mixed $value * @return mixed */ protected function prepareValue($value) { if (! $this->forceDecimals) { return $value; } if (is_int($value) || (filter_var($value, FILTER_VALIDATE_INT) !== false && ! is_float($value))) { return sprintf('%.14F', $value); } return $value; } /** * Transform the attribute from the underlying model values. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param mixed $value * @param array $attributes * @return \Cknow\Money\Money|null */ public function get($model, string $key, $value, array $attributes) { if ($value === null) { return $value; } $value = $this->prepareValue($value); $currency = $this->getCurrency($attributes); return Money::parse($value, $currency); } /** * Transform the attribute to its underlying model values. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param mixed $value * @param array $attributes * @return array * * @throws \InvalidArgumentException */ public function set($model, string $key, $value, array $attributes) { if ($value === null) { return [$key => $value]; } try { $value = $this->prepareValue($value); $currency = $this->getCurrency($attributes); $money = Money::parse($value, $currency); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException( sprintf('Invalid data provided for %s::$%s', get_class($model), $key) ); } $amount = $this->getFormatter($money); if (array_key_exists($this->currency, $attributes)) { return [$key => $amount, $this->currency => $money->getCurrency()->getCode()]; } return [$key => $amount]; } /** * Get currency. * * @param array $attributes * @return \Money\Currency */ protected function getCurrency(array $attributes) { $defaultCode = Money::getDefaultCurrency(); if ($this->currency === null) { return Money::parseCurrency($defaultCode); } $currency = Money::parseCurrency($this->currency); $currencies = Money::getCurrencies(); if ($currencies->contains($currency)) { return $currency; } $code = $attributes[$this->currency] ?? $defaultCode; return Money::parseCurrency($code); } }