. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Hooks\Common; use Espo\Core\ORM\Type\FieldType; use Espo\ORM\Entity; use Espo\Core\Di; class CurrencyConverted implements Di\MetadataAware, Di\ConfigAware { use Di\MetadataSetter; use Di\ConfigSetter; public static int $order = 1; public function beforeSave(Entity $entity): void { $fieldDefs = $this->metadata->get(['entityDefs', $entity->getEntityType(), 'fields'], []); foreach ($fieldDefs as $fieldName => $defs) { if (empty($defs['type']) || $defs['type'] !== FieldType::CURRENCY_CONVERTED) { continue; } $currencyFieldName = substr($fieldName, 0, -9); $currencyCurrencyFieldName = $currencyFieldName . 'Currency'; if ( !$entity->isAttributeChanged($currencyFieldName) && !$entity->isAttributeChanged($currencyCurrencyFieldName) ) { continue; } if (empty($fieldDefs[$currencyFieldName])) { continue; } if ($entity->get($currencyFieldName) === null) { $entity->set($fieldName, null); continue; } $currency = $entity->get($currencyCurrencyFieldName); $value = $entity->get($currencyFieldName); if (!$currency) { continue; } $rates = $this->config->get('currencyRates', []); $baseCurrency = $this->config->get('baseCurrency'); $defaultCurrency = $this->config->get('defaultCurrency'); if ($defaultCurrency === $currency) { $targetValue = $value; } else { $targetValue = $value; $targetValue = $targetValue / ($rates[$baseCurrency] ?? 1.0); $targetValue = $targetValue * ($rates[$currency] ?? 1.0); $targetValue = round($targetValue, 2); } $entity->set($fieldName, $targetValue); } } }