From b4bd66c363932d7251fcef0030aaa1f672bee169 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Sat, 13 Dec 2025 20:12:11 +0200 Subject: [PATCH] clear currency cache --- .../Espo/Classes/Jobs/SyncCurrencyRates.php | 2 +- .../CurrencyRecordRate/AfterDelete.php | 2 +- .../CurrencyRecordRate/AfterSave.php | 2 +- .../Espo/Tools/Currency/RateService.php | 2 +- .../Espo/Tools/Currency/SyncManager.php | 41 +++++++++---------- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/application/Espo/Classes/Jobs/SyncCurrencyRates.php b/application/Espo/Classes/Jobs/SyncCurrencyRates.php index bfbd68bb4f..9aa971cfa2 100644 --- a/application/Espo/Classes/Jobs/SyncCurrencyRates.php +++ b/application/Espo/Classes/Jobs/SyncCurrencyRates.php @@ -43,6 +43,6 @@ class SyncCurrencyRates implements JobDataLess public function run(): void { - $this->syncManager->syncToConfig(); + $this->syncManager->refreshCache(); } } diff --git a/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterDelete.php b/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterDelete.php index b59bc6e473..8ece39a6b2 100644 --- a/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterDelete.php +++ b/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterDelete.php @@ -53,7 +53,7 @@ class AfterDelete implements DeleteHook $code = $entity->getRecord()->getCode(); try { - $this->syncManager->syncCodeToConfig($code); + $this->syncManager->updateCode($code); } catch (NotEnabled $e) { throw new Conflict($e->getMessage(), previous: $e); } diff --git a/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterSave.php b/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterSave.php index e8fdcaa264..5a559ef2ff 100644 --- a/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterSave.php +++ b/application/Espo/Classes/RecordHooks/CurrencyRecordRate/AfterSave.php @@ -52,7 +52,7 @@ class AfterSave implements SaveHook $code = $entity->getRecord()->getCode(); try { - $this->syncManager->syncCodeToConfig($code); + $this->syncManager->updateCode($code); } catch (NotEnabled $e) { throw new Conflict($e->getMessage(), previous: $e); } diff --git a/application/Espo/Tools/Currency/RateService.php b/application/Espo/Tools/Currency/RateService.php index 2e9e58d76e..d0e45ee1af 100644 --- a/application/Espo/Tools/Currency/RateService.php +++ b/application/Espo/Tools/Currency/RateService.php @@ -93,7 +93,7 @@ class RateService $this->writeOne($code, $value); } - $this->syncManager->syncToConfig(); + $this->syncManager->refreshCache(); $this->databasePopulator->process(); } diff --git a/application/Espo/Tools/Currency/SyncManager.php b/application/Espo/Tools/Currency/SyncManager.php index 85bf3492b6..08c1f3330e 100644 --- a/application/Espo/Tools/Currency/SyncManager.php +++ b/application/Espo/Tools/Currency/SyncManager.php @@ -31,11 +31,12 @@ namespace Espo\Tools\Currency; use Espo\Core\Currency\ConfigDataProvider; use Espo\Core\Utils\Config\ConfigWriter; +use Espo\Core\Utils\Config\SystemConfig; +use Espo\Core\Utils\DataCache; use Espo\Entities\CurrencyRecord; use Espo\ORM\EntityManager; use Espo\ORM\Query\UpdateBuilder; use Espo\Tools\Currency\Exceptions\NotEnabled; -use Traversable; /** * @since 9.3.0 @@ -43,11 +44,15 @@ use Traversable; */ class SyncManager { + private string $cacheKey = 'currencyRates'; + public function __construct( private ConfigDataProvider $configDataProvider, private EntityManager $entityManager, private ConfigWriter $configWriter, private RateEntryProvider $rateEntryProvider, + private DataCache $dataCache, + private SystemConfig $systemConfig, ) {} public function sync(): void @@ -56,7 +61,7 @@ class SyncManager $this->syncInTransaction(); }); - $this->syncToConfig(); + $this->refreshCache(); } private function syncInTransaction(): void @@ -114,24 +119,20 @@ class SyncManager ->find(); } - public function syncToConfig(): void + public function refreshCache(): void { $this->entityManager->getTransactionManager()->run(function () { $this->syncToConfigInTransaction(); }); + + $this->clearCache(); } private function syncToConfigInTransaction(): void { $this->lock(); - $rates = []; - - foreach ($this->getActiveCurrencyRecords() as $record) { - $rate = $this->rateEntryProvider->getRateForRecord($record) ?? '1.0'; - - $rates[$record->getCode()] = (float) $rate; - } + $rates = $this->configDataProvider->getCurrencyRates()->toAssoc(); $this->configWriter->set('currencyRates', $rates); $this->configWriter->save(); @@ -140,7 +141,7 @@ class SyncManager /** * @throws NotEnabled */ - public function syncCodeToConfig(string $code): void + public function updateCode(string $code): void { $rates = $this->configDataProvider->getCurrencyRates()->toAssoc(); @@ -150,18 +151,16 @@ class SyncManager $this->configWriter->set('currencyRates', $rates); $this->configWriter->save(); + + $this->clearCache(); } - /** - * @return Traversable - */ - private function getActiveCurrencyRecords(): Traversable + private function clearCache(): void { - return $this->entityManager - ->getRDBRepositoryByClass(CurrencyRecord::class) - ->where([ - CurrencyRecord::FIELD_STATUS => CurrencyRecord::STATUS_ACTIVE, - ]) - ->find(); + if (!$this->systemConfig->useCache()) { + return; + } + + $this->dataCache->clear($this->cacheKey); } }