diff --git a/application/Espo/Core/Action/Actions/ConvertCurrency.php b/application/Espo/Core/Action/Actions/ConvertCurrency.php index d27ced965b..d961c59fe7 100644 --- a/application/Espo/Core/Action/Actions/ConvertCurrency.php +++ b/application/Espo/Core/Action/Actions/ConvertCurrency.php @@ -40,15 +40,13 @@ use Espo\Core\{ ORM\EntityManager, Utils\FieldUtil, Utils\Metadata, - Field\Currency\CurrencyConfigDataProvider, - Field\Currency\CurrencyConverter, Field\Currency, - Field\Currency\CurrencyRates, + Currency\ConfigDataProvider as CurrencyConfigDataProvider, + Currency\Converter as CurrencyConverter, + Currency\Rates as CurrencyRates, }; -use Espo\{ - ORM\Entity, -}; +use Espo\ORM\Entity; class ConvertCurrency implements Action { diff --git a/application/Espo/Core/Field/Currency/CurrencyConfigDataProvider.php b/application/Espo/Core/Currency/ConfigDataProvider.php similarity index 94% rename from application/Espo/Core/Field/Currency/CurrencyConfigDataProvider.php rename to application/Espo/Core/Currency/ConfigDataProvider.php index 72849eebde..4e95293816 100644 --- a/application/Espo/Core/Field/Currency/CurrencyConfigDataProvider.php +++ b/application/Espo/Core/Currency/ConfigDataProvider.php @@ -27,13 +27,13 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Core\Field\Currency; +namespace Espo\Core\Currency; use Espo\Core\Utils\Config; use RuntimeException; -class CurrencyConfigDataProvider +class ConfigDataProvider { private Config $config; @@ -95,12 +95,12 @@ class CurrencyConfigDataProvider /** * Get rates. */ - public function getCurrencyRates(): CurrencyRates + public function getCurrencyRates(): Rates { $rates = $this->config->get('currencyRates') ?? []; $rates[$this->getBaseCurrency()] = 1.0; - return CurrencyRates::fromArray($rates); + return Rates::fromArray($rates); } } diff --git a/application/Espo/Core/Currency/Converter.php b/application/Espo/Core/Currency/Converter.php new file mode 100644 index 0000000000..30078a179d --- /dev/null +++ b/application/Espo/Core/Currency/Converter.php @@ -0,0 +1,112 @@ +configDataProvider = $configDataProvider; + } + + /** + * Convert a currency value to a specific currency. + * + * @throws RuntimeException + */ + public function convert(Currency $value, string $targetCurrencyCode): Currency + { + $amount = $value->getAmount(); + + if (!$this->configDataProvider->hasCurrency($targetCurrencyCode)) { + throw new RuntimeException("Can't convert currency to unknown currency '{$targetCurrencyCode}."); + } + + $rate = $this->configDataProvider->getCurrencyRate($value->getCode()); + + $targetRate = $this->configDataProvider->getCurrencyRate($targetCurrencyCode); + + $amount *= $rate; + + $amount /= $targetRate; + + return new Currency($amount, $targetCurrencyCode); + } + + /** + * Convert a currency value to the system default currency. + */ + public function convertToDefault(Currency $value): Currency + { + $targetCurrencyCode = $this->configDataProvider->getDefaultCurrency(); + + return $this->convert($value, $targetCurrencyCode); + } + + /** + * Convert a currency value to a specific currency with specific rates. + * Base currency should has rate equal to `1.0`. + * + * @throws RuntimeException + */ + public function convertWithRates(Currency $value, string $targetCurrencyCode, Rates $rates): Currency + { + $amount = $value->getAmount(); + + $currencyCode = $value->getCode(); + + if (!$rates->hasRate($currencyCode)) { + throw new RuntimeException("No rate for the currency '{$currencyCode}."); + } + + if (!$rates->hasRate($targetCurrencyCode)) { + throw new RuntimeException("No rate for the currency '{$targetCurrencyCode}."); + } + + $rate = $rates->getRate($currencyCode); + + $targetRate = $rates->getRate($targetCurrencyCode); + + $amount *= $rate; + + $amount /= $targetRate; + + return new Currency($amount, $targetCurrencyCode); + } +} diff --git a/application/Espo/Core/Field/Currency/CurrencyRates.php b/application/Espo/Core/Currency/Rates.php similarity index 78% rename from application/Espo/Core/Field/Currency/CurrencyRates.php rename to application/Espo/Core/Currency/Rates.php index c460ea7a69..bac2fb9ba9 100644 --- a/application/Espo/Core/Field/Currency/CurrencyRates.php +++ b/application/Espo/Core/Currency/Rates.php @@ -27,14 +27,14 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Core\Field\Currency; +namespace Espo\Core\Currency; use RuntimeException; /** * Currency rates. */ -class CurrencyRates +class Rates { /** * @var array @@ -45,18 +45,31 @@ class CurrencyRates { } - public function hasRate(string $currencyCode): bool + public static function create(): self { - return array_key_exists($currencyCode, $this->data); + return new self(); } - public function getRate(string $currencyCode): float + public function withRate(string $code, float $value): self { - if (!$this->hasRate($currencyCode)) { - throw new RuntimeException("No currency rate for '{$currencyCode}'."); + $obj = clone $this; + $obj->data[$code] = $value; + + return $obj; + } + + public function hasRate(string $code): bool + { + return array_key_exists($code, $this->data); + } + + public function getRate(string $code): float + { + if (!$this->hasRate($code)) { + throw new RuntimeException("No currency rate for '{$code}'."); } - return $this->data[$currencyCode]; + return $this->data[$code]; } /** diff --git a/application/Espo/Core/Field/Currency/CurrencyConverter.php b/application/Espo/Core/Field/Currency/CurrencyConverter.php index 36afaf0ea2..4af898c1d4 100644 --- a/application/Espo/Core/Field/Currency/CurrencyConverter.php +++ b/application/Espo/Core/Field/Currency/CurrencyConverter.php @@ -29,88 +29,7 @@ namespace Espo\Core\Field\Currency; -use Espo\Core\Field\Currency; - -use RuntimeException; - /** - * Converts currency values. + * @deprecated Since v7.1.0. Use `Espo\Core\Currency\Converter`. */ -class CurrencyConverter -{ - private CurrencyConfigDataProvider $configDataProvider; - - public function __construct(CurrencyConfigDataProvider $configDataProvider) - { - $this->configDataProvider = $configDataProvider; - } - - /** - * Convert a currency value to a specific currency. - * - * @throws RuntimeException - */ - public function convert(Currency $value, string $targetCurrencyCode): Currency - { - $amount = $value->getAmount(); - - if (!$this->configDataProvider->hasCurrency($targetCurrencyCode)) { - throw new RuntimeException("Can't convert currency to unknown currency '{$targetCurrencyCode}."); - } - - $rate = $this->configDataProvider->getCurrencyRate($value->getCode()); - - $targetRate = $this->configDataProvider->getCurrencyRate($targetCurrencyCode); - - $amount *= $rate; - - $amount /= $targetRate; - - return new Currency($amount, $targetCurrencyCode); - } - - /** - * Convert a currency value to the system default currency. - */ - public function convertToDefault(Currency $value): Currency - { - $targetCurrencyCode = $this->configDataProvider->getDefaultCurrency(); - - return $this->convert($value, $targetCurrencyCode); - } - - /** - * Convert a currency value to a specific currency with specific rates. - * Base currency should has rate equal to `1.0`. - * - * @throws RuntimeException - */ - public function convertWithRates( - Currency $value, - string $targetCurrencyCode, - CurrencyRates $rates - ): Currency { - - $amount = $value->getAmount(); - - $currencyCode = $value->getCode(); - - if (!$rates->hasRate($currencyCode)) { - throw new RuntimeException("No rate for the currency '{$currencyCode}."); - } - - if (!$rates->hasRate($targetCurrencyCode)) { - throw new RuntimeException("No rate for the currency '{$targetCurrencyCode}."); - } - - $rate = $rates->getRate($currencyCode); - - $targetRate = $rates->getRate($targetCurrencyCode); - - $amount *= $rate; - - $amount /= $targetRate; - - return new Currency($amount, $targetCurrencyCode); - } -} +class CurrencyConverter extends \Espo\Core\Currency\Converter {} diff --git a/application/Espo/Core/MassAction/Actions/MassConvertCurrency.php b/application/Espo/Core/MassAction/Actions/MassConvertCurrency.php index 058d99e03a..71498e553a 100644 --- a/application/Espo/Core/MassAction/Actions/MassConvertCurrency.php +++ b/application/Espo/Core/MassAction/Actions/MassConvertCurrency.php @@ -43,10 +43,10 @@ use Espo\Core\{ ORM\EntityManager, Utils\FieldUtil, Utils\Metadata, - Field\Currency\CurrencyConfigDataProvider, - Field\Currency\CurrencyConverter, Field\Currency, - Field\Currency\CurrencyRates, + Currency\ConfigDataProvider as CurrencyConfigDataProvider, + Currency\Converter as CurrencyConverter, + Currency\Rates as CurrencyRates, }; use Espo\ORM\Entity; diff --git a/application/Espo/Modules/Crm/Classes/FieldProcessing/Campaign/StatsLoader.php b/application/Espo/Modules/Crm/Classes/FieldProcessing/Campaign/StatsLoader.php index 37469b8eef..d6656fed27 100644 --- a/application/Espo/Modules/Crm/Classes/FieldProcessing/Campaign/StatsLoader.php +++ b/application/Espo/Modules/Crm/Classes/FieldProcessing/Campaign/StatsLoader.php @@ -36,7 +36,7 @@ use Espo\Core\{ FieldProcessing\Loader\Params, ORM\EntityManager, Acl, - Field\Currency\CurrencyConfigDataProvider, + Currency\ConfigDataProvider as CurrencyConfigDataProvider, }; use PDO; diff --git a/application/Espo/Services/Record.php b/application/Espo/Services/Record.php index f8b7f2f068..1a17b3dcd1 100644 --- a/application/Espo/Services/Record.php +++ b/application/Espo/Services/Record.php @@ -366,7 +366,7 @@ class Record extends RecordService implements } /** - * @deprecated Use `Espo\Core\Field\Currency\CurrencyConverter`. + * @deprecated Use `Espo\Core\Currency\Converter`. * @param ?string[] $fieldList * @return stdClass */ diff --git a/tests/unit/Espo/Core/Field/Currency/CurrencyConfigDataProviderTest.php b/tests/unit/Espo/Core/Field/Currency/CurrencyConfigDataProviderTest.php index b1dcc6d3e0..09466d4998 100644 --- a/tests/unit/Espo/Core/Field/Currency/CurrencyConfigDataProviderTest.php +++ b/tests/unit/Espo/Core/Field/Currency/CurrencyConfigDataProviderTest.php @@ -30,7 +30,7 @@ namespace tests\unit\Espo\Core\Field\Currency; use Espo\Core\{ - Field\Currency\CurrencyConfigDataProvider, + Currency\ConfigDataProvider as CurrencyConfigDataProvider, Utils\Config, }; diff --git a/tests/unit/Espo/Core/Field/Currency/CurrencyConverterTest.php b/tests/unit/Espo/Core/Field/Currency/CurrencyConverterTest.php index c430842946..71371883f4 100644 --- a/tests/unit/Espo/Core/Field/Currency/CurrencyConverterTest.php +++ b/tests/unit/Espo/Core/Field/Currency/CurrencyConverterTest.php @@ -31,9 +31,9 @@ namespace tests\unit\Espo\Core\Field\Currency; use Espo\Core\{ Field\Currency, - Field\Currency\CurrencyConverter, - Field\Currency\CurrencyConfigDataProvider, - Field\Currency\CurrencyRates, + Currency\Converter as CurrencyConverter, + Currency\ConfigDataProvider as CurrencyConfigDataProvider, + Currency\Rates as CurrencyRates, }; class CurrencyConverterTest extends \PHPUnit\Framework\TestCase