From 82d746509040992387014489fe454317eab61af3 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Mon, 4 May 2026 16:00:58 +0200 Subject: [PATCH 01/15] Read timezone from config --- .../Gateway/Api/Reader/TimezoneReader.php | 28 ++++ .../Gateway/Local/Reader/TimezoneReader.php | 67 ++++++++++ .../Shopware/Premapping/TimezoneReader.php | 124 ++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php create mode 100644 src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php create mode 100644 src/Profile/Shopware/Premapping/TimezoneReader.php diff --git a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php new file mode 100644 index 000000000..3a6a38bab --- /dev/null +++ b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php @@ -0,0 +1,28 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader; + +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\MigrationContextInterface; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; +use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; + +#[Package('fundamentals@after-sales')] +class TimezoneReader extends ApiReader +{ + public function supports(MigrationContextInterface $migrationContext): bool + { + return $migrationContext->getProfile() instanceof ShopwareProfileInterface + && $migrationContext->getGateway()->getName() === ShopwareApiGateway::GATEWAY_NAME; + } + + protected function getApiRoute(): string + { + return 'SwagMigrationTimeZone'; + } +} diff --git a/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php new file mode 100644 index 000000000..798fd1036 --- /dev/null +++ b/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php @@ -0,0 +1,67 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader; + +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\Gateway\Reader\ReaderInterface; +use SwagMigrationAssistant\Migration\MigrationContextInterface; +use SwagMigrationAssistant\Migration\TotalStruct; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; +use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; + +#[Package('fundamentals@after-sales')] +class TimezoneReader implements ReaderInterface +{ + public function supports(MigrationContextInterface $migrationContext): bool + { + return $migrationContext->getProfile() instanceof ShopwareProfileInterface + && $migrationContext->getGateway()->getName() === ShopwareLocalGateway::GATEWAY_NAME; + } + + public function supportsTotal(MigrationContextInterface $migrationContext): bool + { + return false; + } + + public function read(MigrationContextInterface $migrationContext): array + { + $result = [ + 'timezone' => null, + ]; + + $fields = $migrationContext->getConnection()->getCredentialFields(); + if (!isset($fields['installationRoot']) || !\is_string($fields['installationRoot']) || $fields['installationRoot'] === '') { + return []; + } + + $basePath = $fields['installationRoot']; + + $configFile = \rtrim($basePath, '/\\') . '/config.php'; + if (!\is_file($configFile) || !\is_readable($configFile)) { + return []; + } + + $swConfig = include $configFile; + if (!\is_array($swConfig)) { + return []; + } + + if (!isset($swConfig['db']['timezone']) || !\is_string($swConfig['db']['timezone']) || $swConfig['db']['timezone'] === '') { + return []; + } + + $result['timezone'] = $swConfig['db']['timezone']; + + return [$result]; + } + + public function readTotal(MigrationContextInterface $migrationContext): ?TotalStruct + { + return null; + } +} diff --git a/src/Profile/Shopware/Premapping/TimezoneReader.php b/src/Profile/Shopware/Premapping/TimezoneReader.php new file mode 100644 index 000000000..7f8346c27 --- /dev/null +++ b/src/Profile/Shopware/Premapping/TimezoneReader.php @@ -0,0 +1,124 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Profile\Shopware\Premapping; + +use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\Gateway\Reader\ReaderInterface; +use SwagMigrationAssistant\Migration\MigrationContextInterface; +use SwagMigrationAssistant\Migration\Premapping\AbstractPremappingReader; +use SwagMigrationAssistant\Migration\Premapping\PremappingChoiceStruct; +use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; +use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader as ApiTimezoneReader; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader\TimezoneReader as LocalTimezoneReader; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; +use SwagMigrationAssistant\Profile\Shopware\Gateway\ShopwareGatewayInterface; +use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; + +#[Package('fundamentals@after-sales')] +class TimezoneReader extends AbstractPremappingReader +{ + private const MAPPING_NAME = 'source_timezone'; + + private const SOURCE_ID = 'timezone'; + + private array $validTimezones; + + public function __construct( + private readonly ApiTimezoneReader $apiTimezoneReader, + private readonly LocalTimezoneReader $localTimezoneReader, + ) { + $this->validTimezones = \array_flip(\DateTimeZone::listIdentifiers()); + } + + public function supports(MigrationContextInterface $migrationContext, array $entityGroupNames): bool + { + return $migrationContext->getProfile() instanceof ShopwareProfileInterface + && \in_array($migrationContext->getGateway()->getName(), [ + ShopwareApiGateway::GATEWAY_NAME, + ShopwareLocalGateway::GATEWAY_NAME, + ], true); + } + + public static function getMappingName(): string + { + return self::MAPPING_NAME; + } + + public function getPremapping(Context $context, MigrationContextInterface $migrationContext): PremappingStruct + { + $this->fillConnectionPremappingDictionary($migrationContext); + + $choices = $this->getChoices(); + + $sourceTimezone = $this->readSourceTimezone($migrationContext); + + if ($sourceTimezone === null || !isset($this->validTimezones[$sourceTimezone])) { + return new PremappingStruct(self::getMappingName(), [], $choices); + } + + $destinationTimezone = $sourceTimezone; + + if (isset($this->connectionPremappingDictionary[self::SOURCE_ID])) { + $configuredDestination = $this->connectionPremappingDictionary[self::SOURCE_ID]->getDestinationUuid(); + + if (isset($this->validTimezones[$configuredDestination])) { + $destinationTimezone = $configuredDestination; + } + } + + return new PremappingStruct( + self::getMappingName(), + [ + new PremappingEntityStruct( + self::SOURCE_ID, + $sourceTimezone, + $destinationTimezone + ), + ], + $choices + ); + } + + private function readSourceTimezone(MigrationContextInterface $migrationContext): ?string + { + $gateway = $this->getReader($migrationContext); + if (!$gateway instanceof ShopwareGatewayInterface) { + return null; + } + + $result = $gateway->read($migrationContext); + + $timezone = $result[0]['timezone'] ?? null; + + if (!\is_string($timezone) || $timezone === '' || !isset($this->validTimezones[$timezone])) { + return null; + } + + return $timezone; + } + + private function getChoices(): array + { + return array_map( + static fn (string $timezone): PremappingChoiceStruct => new PremappingChoiceStruct($timezone, $timezone), + \DateTimeZone::listIdentifiers() + ); + } + + private function getReader(MigrationContextInterface $migrationContext): ReaderInterface + { + if ($this->apiTimezoneReader->supports($migrationContext)) { + return $this->apiTimezoneReader; + } + + return $this->localTimezoneReader; + } +} From 6f3a0b57814d2d8d88a36f8643d61da1156e8dbf Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 09:35:05 +0200 Subject: [PATCH 02/15] Fix threads --- src/DependencyInjection/shopware.php | 5 + src/Migration/EnvironmentInformation.php | 11 ++ .../Shopware/Converter/CustomerConverter.php | 4 +- .../NewsletterRecipientConverter.php | 5 +- .../Shopware/Converter/OrderConverter.php | 2 +- .../Shopware/Converter/ProductConverter.php | 4 +- .../Shopware/Converter/PromotionConverter.php | 6 +- .../Shopware/Converter/ShopwareConverter.php | 86 ++++++++-- .../Gateway/Api/Reader/EnvironmentReader.php | 11 ++ .../Gateway/Api/Reader/TimezoneReader.php | 28 --- .../Gateway/Api/ShopwareApiGateway.php | 1 + .../Local/Reader/EnvironmentReader.php | 104 ++++++++++- .../Gateway/Local/Reader/TimezoneReader.php | 67 -------- .../Gateway/Local/ShopwareLocalGateway.php | 3 +- .../Shopware/Premapping/TimezoneReader.php | 53 +++--- .../src/module/swag-migration/snippet/de.json | 3 +- .../src/module/swag-migration/snippet/en.json | 3 +- .../Converter/ShopwareConverterTest.php | 162 ++++++++++++++++++ .../Converter/TestShopwareConverter.php | 69 ++++++++ .../Gateway/ApiEnvironmentReaderTest.php | 55 ++++++ .../Gateway/Local/EnvironmentReaderTest.php | 98 +++++++++++ .../config_does_not_return_array/config.php | 8 + .../empty_database_timezone/config.php | 12 ++ .../missing_database_timezone/config.php | 10 ++ .../environment_reader/valid/config.php | 12 ++ .../Shopware/Gateway/LocalGatewayTest.php | 4 + .../Gateway/ShopwareApiGatewayTest.php | 2 + .../Premapping/TimezoneReaderTest.php | 159 +++++++++++++++++ 28 files changed, 834 insertions(+), 153 deletions(-) delete mode 100644 src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php delete mode 100644 src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php create mode 100644 tests/Profile/Shopware/Converter/ShopwareConverterTest.php create mode 100644 tests/Profile/Shopware/Converter/TestShopwareConverter.php create mode 100644 tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/config_does_not_return_array/config.php create mode 100644 tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/empty_database_timezone/config.php create mode 100644 tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/missing_database_timezone/config.php create mode 100644 tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/valid/config.php create mode 100644 tests/Profile/Shopware/Premapping/TimezoneReaderTest.php diff --git a/src/DependencyInjection/shopware.php b/src/DependencyInjection/shopware.php index e0dc2f43e..91c232f03 100644 --- a/src/DependencyInjection/shopware.php +++ b/src/DependencyInjection/shopware.php @@ -169,6 +169,7 @@ use SwagMigrationAssistant\Profile\Shopware\Premapping\OrderStateReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\PaymentMethodReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\SalutationReader; +use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader as PremappingTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\TransactionStateReader; use SwagMigrationAssistant\Profile\Shopware\Writer\ProductOptionRelationWriter; use SwagMigrationAssistant\Profile\Shopware\Writer\ProductPropertyRelationWriter; @@ -965,6 +966,10 @@ $services->set(NewsletterRecipientStatusReader::class) ->tag('shopware.migration.pre_mapping_reader'); + $services->set(PremappingTimezoneReader::class) + ->args([service(GatewayRegistry::class)]) + ->tag('shopware.migration.pre_mapping_reader'); + $services->set(ProductOptionRelationWriter::class) ->parent(AbstractWriter::class) ->args([ diff --git a/src/Migration/EnvironmentInformation.php b/src/Migration/EnvironmentInformation.php index b7176d235..807dcc810 100644 --- a/src/Migration/EnvironmentInformation.php +++ b/src/Migration/EnvironmentInformation.php @@ -32,6 +32,7 @@ public function __construct( protected string $sourceSystemLocale = '', protected string $targetSystemLocale = '', protected ?string $fingerprint = null, + protected ?string $timezone = null, ) { } @@ -123,4 +124,14 @@ public function setFingerprint(?string $fingerprint): void { $this->fingerprint = $fingerprint; } + + public function getTimezone(): ?string + { + return $this->timezone; + } + + public function setTimezone(?string $timezone): void + { + $this->timezone = $timezone; + } } diff --git a/src/Profile/Shopware/Converter/CustomerConverter.php b/src/Profile/Shopware/Converter/CustomerConverter.php index 979fbe7b7..c3a9a154c 100644 --- a/src/Profile/Shopware/Converter/CustomerConverter.php +++ b/src/Profile/Shopware/Converter/CustomerConverter.php @@ -153,8 +153,8 @@ public function convert( $this->convertValue($converted, 'firstName', $data, 'firstname'); $this->convertValue($converted, 'lastName', $data, 'lastname'); $this->convertValue($converted, 'customerNumber', $data, 'customernumber'); - $this->convertValue($converted, 'birthday', $data, 'birthday', self::TYPE_DATETIME); - $this->convertValue($converted, 'lockedUntil', $data, 'lockeduntil', self::TYPE_DATETIME); + $this->convertValue($converted, 'birthday', $data, 'birthday', self::TYPE_DATE, $this->context); + $this->convertValue($converted, 'lockedUntil', $data, 'lockeduntil', self::TYPE_DATETIME, $this->context); $this->setAccountType($data, $converted); $this->setPassword($data, $converted); diff --git a/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php b/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php index 97347cba6..a361ce947 100644 --- a/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php +++ b/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php @@ -50,6 +50,7 @@ public function convert( Context $context, MigrationContextInterface $migrationContext, ): ConvertStruct { + $this->migrationContext = $migrationContext; $connection = $migrationContext->getConnection(); $this->connectionId = $connection->getId(); $this->runId = $migrationContext->getRunUuid(); @@ -84,8 +85,8 @@ public function convert( $converted['id'] = $this->mainMapping['entityId']; $this->convertValue($converted, 'email', $data, 'email'); - $this->convertValue($converted, 'createdAt', $data, 'added', 'datetime'); - $this->convertValue($converted, 'confirmedAt', $data, 'double_optin_confirmed', 'datetime'); + $this->convertValue($converted, 'createdAt', $data, 'added', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'confirmedAt', $data, 'double_optin_confirmed', self::TYPE_DATETIME, $this->context); if (isset($data['address'])) { $address = $data['address']; diff --git a/src/Profile/Shopware/Converter/OrderConverter.php b/src/Profile/Shopware/Converter/OrderConverter.php index f9e354858..3a019dc5d 100644 --- a/src/Profile/Shopware/Converter/OrderConverter.php +++ b/src/Profile/Shopware/Converter/OrderConverter.php @@ -187,7 +187,7 @@ public function convert( ]; $converted['totalRounding'] = $converted['itemRounding']; - $this->convertValue($converted, 'orderDateTime', $data, 'ordertime', self::TYPE_DATETIME); + $this->convertValue($converted, 'orderDateTime', $data, 'ordertime', self::TYPE_DATETIME, $this->context); if (isset($data['status'])) { $stateMapping = $this->mappingService->getMapping( diff --git a/src/Profile/Shopware/Converter/ProductConverter.php b/src/Profile/Shopware/Converter/ProductConverter.php index 34f7479ed..816f7ad92 100644 --- a/src/Profile/Shopware/Converter/ProductConverter.php +++ b/src/Profile/Shopware/Converter/ProductConverter.php @@ -452,7 +452,7 @@ private function getProductData(array &$data, array $converted): array unset($data['active']); } - $this->convertValue($converted, 'createdAt', $data, 'datum', self::TYPE_DATETIME); + $this->convertValue($converted, 'createdAt', $data, 'datum', self::TYPE_DATETIME, $this->context); $this->convertValue($converted, 'isCloseout', $data, 'laststock', self::TYPE_BOOLEAN); $this->convertValue($converted, 'markAsTopseller', $data, 'topseller', self::TYPE_BOOLEAN); $this->convertValue($converted, 'allowNotification', $data, 'notification', self::TYPE_BOOLEAN); @@ -471,7 +471,7 @@ private function getProductData(array &$data, array $converted): array $this->convertValue($converted, 'minPurchase', $data['detail'], 'minpurchase', self::TYPE_INTEGER); $this->convertValue($converted, 'purchaseUnit', $data['detail'], 'purchaseunit', self::TYPE_FLOAT); $this->convertValue($converted, 'referenceUnit', $data['detail'], 'referenceunit', self::TYPE_FLOAT); - $this->convertValue($converted, 'releaseDate', $data['detail'], 'releasedate', self::TYPE_DATETIME); + $this->convertValue($converted, 'releaseDate', $data['detail'], 'releasedate', self::TYPE_DATE); $this->convertValue($converted, 'shippingFree', $data['detail'], 'shippingfree', self::TYPE_BOOLEAN); $this->setPurchasePrices($data, $converted); diff --git a/src/Profile/Shopware/Converter/PromotionConverter.php b/src/Profile/Shopware/Converter/PromotionConverter.php index 4f046ff4b..992aad745 100644 --- a/src/Profile/Shopware/Converter/PromotionConverter.php +++ b/src/Profile/Shopware/Converter/PromotionConverter.php @@ -56,6 +56,8 @@ public function getSourceIdentifier(array $data): string public function convert(array $data, Context $context, MigrationContextInterface $migrationContext): ConvertStruct { + $this->migrationContext = $migrationContext; + $this->generateChecksum($data); $this->context = $context; @@ -92,8 +94,8 @@ public function convert(array $data, Context $context, MigrationContextInterface $this->setCustomerRule($data, $converted, $migrationContext); $this->convertValue($converted, 'name', $data, 'description'); - $this->convertValue($converted, 'validFrom', $data, 'valid_from', self::TYPE_DATETIME); - $this->convertValue($converted, 'validUntil', $data, 'valid_to', self::TYPE_DATETIME); + $this->convertValue($converted, 'validFrom', $data, 'valid_from', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'validUntil', $data, 'valid_to', self::TYPE_DATETIME, $this->context); $this->convertValue($converted, 'maxRedemptionsGlobal', $data, 'numberofunits', self::TYPE_INTEGER); $this->convertValue($converted, 'maxRedemptionsPerCustomer', $data, 'numorder', self::TYPE_INTEGER); diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 587c68526..73212e719 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -7,6 +7,7 @@ namespace SwagMigrationAssistant\Profile\Shopware\Converter; +use Shopware\Core\Defaults; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Connection\Helper\ConnectionNameSanitizer; @@ -23,10 +24,16 @@ abstract class ShopwareConverter extends Converter protected const TYPE_INVERT_BOOLEAN = 'invert_bool'; protected const TYPE_INTEGER = 'int'; protected const TYPE_FLOAT = 'float'; + protected const TYPE_DATE = 'date'; protected const TYPE_DATETIME = 'datetime'; protected MigrationContextInterface $migrationContext; + /** + * @var array + */ + protected array $timezoneCache = []; + public function getSourceIdentifier(array $data): string { return $data['id']; @@ -60,6 +67,7 @@ protected function convertValue( array &$sourceData, string $sourceKey, string $castType = self::TYPE_STRING, + ?Context $context = null, ): void { if (isset($sourceData[$sourceKey]) && $sourceData[$sourceKey] !== '') { switch ($castType) { @@ -79,12 +87,23 @@ protected function convertValue( $sourceValue = (float) $sourceData[$sourceKey]; break; - case self::TYPE_DATETIME: + case self::TYPE_DATE: $sourceValue = $sourceData[$sourceKey]; if (!$this->validDate($sourceValue)) { return; } + break; + case self::TYPE_DATETIME: + if (!$context instanceof Context) { + return; + } + + $sourceValue = $this->convertDateTime((string) $sourceData[$sourceKey], $context); + if ($sourceValue === null) { + return; + } + break; default: $sourceValue = (string) $sourceData[$sourceKey]; @@ -94,17 +113,6 @@ protected function convertValue( unset($sourceData[$sourceKey]); } - protected function validDate(string $value): bool - { - try { - new \DateTime($value); - - return true; - } catch (\Exception) { - return false; - } - } - /** * @param array $attributes * @param list $excludeList @@ -162,6 +170,16 @@ protected function getAttributes( if (isset($mapping['additionalData']['columnType']) && $mapping['additionalData']['columnType'] === 'float') { $value = (float) $value; } + + if (isset($mapping['additionalData']['columnType']) && $mapping['additionalData']['columnType'] === 'datetime') { + $convertedValue = $this->convertDateTime((string) $value, $context); + + if ($convertedValue === null) { + continue; + } + + $value = $convertedValue; + } } } @@ -174,4 +192,48 @@ protected function getAttributes( return $result; } + + private function validDate(string $value): bool + { + try { + new \DateTime($value); + + return true; + } catch (\Exception) { + return false; + } + } + + private function convertDateTime(string $value, Context $context): ?string + { + if ($value === '') { + return null; + } + + $connectionId = $this->migrationContext->getConnection()->getId(); + if (!isset($this->timezoneCache[$connectionId])) { + $this->timezoneCache[$connectionId] = $this->mappingService->getValue( + $connectionId, + 'source_timezone', + 'timezone', + $context + ) ?? ''; + } + + try { + $timezone = $this->timezoneCache[$connectionId]; + + if ($timezone === '') { + return (new \DateTimeImmutable($value))->format(Defaults::STORAGE_DATE_TIME_FORMAT); + } + + $date = new \DateTimeImmutable($value, new \DateTimeZone($timezone)); + + return $date + ->setTimezone(new \DateTimeZone('UTC')) + ->format(Defaults::STORAGE_DATE_TIME_FORMAT); + } catch (\Throwable) { + return null; + } + } } diff --git a/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php b/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php index 5c9382b9d..67396734f 100644 --- a/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php +++ b/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php @@ -28,6 +28,11 @@ class EnvironmentReader implements EnvironmentReaderInterface { private ?HttpClientInterface $client = null; + /** + * @var array + */ + private array $cachedEnvironmentInformation = []; + public function __construct(private readonly ConnectionFactoryInterface $connectionFactory) { } @@ -37,6 +42,10 @@ public function __construct(private readonly ConnectionFactoryInterface $connect */ public function read(MigrationContextInterface $migrationContext): array { + if (isset($this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()])) { + return $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()]; + } + $information = [ 'environmentInformation' => [], 'requestStatus' => new RequestStatusStruct(), @@ -54,6 +63,8 @@ public function read(MigrationContextInterface $migrationContext): array ); } + $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()] = $information; + return $information; } diff --git a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php deleted file mode 100644 index 3a6a38bab..000000000 --- a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php +++ /dev/null @@ -1,28 +0,0 @@ - - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader; - -use Shopware\Core\Framework\Log\Package; -use SwagMigrationAssistant\Migration\MigrationContextInterface; -use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; -use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; - -#[Package('fundamentals@after-sales')] -class TimezoneReader extends ApiReader -{ - public function supports(MigrationContextInterface $migrationContext): bool - { - return $migrationContext->getProfile() instanceof ShopwareProfileInterface - && $migrationContext->getGateway()->getName() === ShopwareApiGateway::GATEWAY_NAME; - } - - protected function getApiRoute(): string - { - return 'SwagMigrationTimeZone'; - } -} diff --git a/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php b/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php index 0af3fca5d..415c7ec7b 100644 --- a/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php +++ b/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php @@ -161,6 +161,7 @@ public function readEnvironmentInformation(MigrationContextInterface $migrationC $environmentDataArray['defaultShopLanguage'], $targetLocaleCode, $this->generateFingerprint($environmentDataArray), + timezone: $environmentDataArray['timezone'] ?? null, ); } diff --git a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php index 2bb7fb446..6539f9758 100644 --- a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php +++ b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php @@ -12,24 +12,53 @@ use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Gateway\Reader\EnvironmentReaderInterface; use SwagMigrationAssistant\Migration\MigrationContextInterface; +use Symfony\Component\Filesystem\Filesystem; +/** + * @phpstan-type ReadArray array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string, config: array, timezone: string} + */ #[Package('fundamentals@after-sales')] class EnvironmentReader extends AbstractReader implements EnvironmentReaderInterface { + private const SOURCE_ROOT_KEY = 'installationRoot'; + private const TIMEZONE_KEY = 'timezone'; + private const DB_KEY = 'db'; + + private const ARRAY_OPEN = '['; + private const ARRAY_CLOSE = ']'; + private const NULL = 'null'; + private const TRIM_QUOTATION = '\'"'; + + private const CONFIG_FILE_NAME = 'config.php'; + + /** + * @var array + */ + private array $cachedEnvironmentInformation = []; + /** - * @return array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string} + * @return ReadArray */ public function read(MigrationContextInterface $migrationContext): array { + if (isset($this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()])) { + return $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()]; + } + $locale = $this->getDefaultShopLocale($migrationContext); - return [ + $environmentInformation = [ 'defaultShopLanguage' => $locale, 'host' => $this->getHost($migrationContext), 'additionalData' => $this->getAdditionalData($migrationContext), 'defaultCurrency' => $this->getDefaultCurrency($migrationContext), 'config' => $this->getConfig($migrationContext), + 'timezone' => $this->getTimezone($migrationContext), ]; + + $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()] = $environmentInformation; + + return $environmentInformation; } /** @@ -120,4 +149,75 @@ private function getAdditionalData(MigrationContextInterface $migrationContext): return \array_values($shops); } + + private function getTimezone(MigrationContextInterface $migrationContext): string + { + $fields = $migrationContext->getConnection()->getCredentialFields(); + if (!isset($fields[self::SOURCE_ROOT_KEY]) || !\is_string($fields[self::SOURCE_ROOT_KEY]) || $fields[self::SOURCE_ROOT_KEY] === '') { + return ''; + } + + $basePath = $fields[self::SOURCE_ROOT_KEY]; + $configFile = \rtrim($basePath, '/\\') . '/' . self::CONFIG_FILE_NAME; + + $fileSystem = new Filesystem(); + + try { + if (!$fileSystem->exists($configFile)) { + return ''; + } + + $fileContent = $fileSystem->readFile($configFile); + $timezone = $this->readDbTimezoneFromConfig($fileContent); + + return $timezone ?? ''; + } catch (\Throwable) { + return ''; + } + } + + private function readDbTimezoneFromConfig(string $phpFileContent): ?string + { + $tokens = token_get_all($phpFileContent); + $inDbArray = false; + $arrayDepth = 0; + + foreach ($tokens as $index => $token) { + $value = \is_array($token) ? \trim($token[1], self::TRIM_QUOTATION) : $token; + + if (!$inDbArray && $value === self::DB_KEY) { + $inDbArray = true; + continue; + } + + if (!$inDbArray) { + continue; + } + + if ($token === self::ARRAY_OPEN) { + ++$arrayDepth; + } elseif ($token === self::ARRAY_CLOSE) { + --$arrayDepth; + if ($arrayDepth === 0) { + return null; + } + } + + if ($arrayDepth === 1 && $value === self::TIMEZONE_KEY) { + for ($j = $index + 1; isset($tokens[$j]); ++$j) { + $next = $tokens[$j]; + + if (\is_array($next) && $next[0] === \T_CONSTANT_ENCAPSED_STRING) { + return \stripcslashes(\trim($next[1], self::TRIM_QUOTATION)); + } + + if (\is_array($next) && \strtolower($next[1]) === self::NULL) { + return null; + } + } + } + } + + return null; + } } diff --git a/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php deleted file mode 100644 index 798fd1036..000000000 --- a/src/Profile/Shopware/Gateway/Local/Reader/TimezoneReader.php +++ /dev/null @@ -1,67 +0,0 @@ - - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader; - -use Shopware\Core\Framework\Log\Package; -use SwagMigrationAssistant\Migration\Gateway\Reader\ReaderInterface; -use SwagMigrationAssistant\Migration\MigrationContextInterface; -use SwagMigrationAssistant\Migration\TotalStruct; -use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; -use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; - -#[Package('fundamentals@after-sales')] -class TimezoneReader implements ReaderInterface -{ - public function supports(MigrationContextInterface $migrationContext): bool - { - return $migrationContext->getProfile() instanceof ShopwareProfileInterface - && $migrationContext->getGateway()->getName() === ShopwareLocalGateway::GATEWAY_NAME; - } - - public function supportsTotal(MigrationContextInterface $migrationContext): bool - { - return false; - } - - public function read(MigrationContextInterface $migrationContext): array - { - $result = [ - 'timezone' => null, - ]; - - $fields = $migrationContext->getConnection()->getCredentialFields(); - if (!isset($fields['installationRoot']) || !\is_string($fields['installationRoot']) || $fields['installationRoot'] === '') { - return []; - } - - $basePath = $fields['installationRoot']; - - $configFile = \rtrim($basePath, '/\\') . '/config.php'; - if (!\is_file($configFile) || !\is_readable($configFile)) { - return []; - } - - $swConfig = include $configFile; - if (!\is_array($swConfig)) { - return []; - } - - if (!isset($swConfig['db']['timezone']) || !\is_string($swConfig['db']['timezone']) || $swConfig['db']['timezone'] === '') { - return []; - } - - $result['timezone'] = $swConfig['db']['timezone']; - - return [$result]; - } - - public function readTotal(MigrationContextInterface $migrationContext): ?TotalStruct - { - return null; - } -} diff --git a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php index beb5b777f..b010da23a 100644 --- a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php +++ b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php @@ -148,7 +148,8 @@ public function readEnvironmentInformation( $environmentData['defaultCurrency'], $environmentData['defaultShopLanguage'], $targetLocaleCode, - $this->generateFingerprint($environmentData) + $this->generateFingerprint($environmentData), + timezone: $environmentData['timezone'], ); } diff --git a/src/Profile/Shopware/Premapping/TimezoneReader.php b/src/Profile/Shopware/Premapping/TimezoneReader.php index 7f8346c27..cb962cdf6 100644 --- a/src/Profile/Shopware/Premapping/TimezoneReader.php +++ b/src/Profile/Shopware/Premapping/TimezoneReader.php @@ -9,31 +9,30 @@ use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Log\Package; -use SwagMigrationAssistant\Migration\Gateway\Reader\ReaderInterface; +use SwagMigrationAssistant\Migration\Gateway\GatewayRegistryInterface; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Migration\Premapping\AbstractPremappingReader; use SwagMigrationAssistant\Migration\Premapping\PremappingChoiceStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; -use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader as ApiTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; -use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader\TimezoneReader as LocalTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; -use SwagMigrationAssistant\Profile\Shopware\Gateway\ShopwareGatewayInterface; use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; -#[Package('fundamentals@after-sales')] +#[Package('after-sales')] class TimezoneReader extends AbstractPremappingReader { private const MAPPING_NAME = 'source_timezone'; private const SOURCE_ID = 'timezone'; + /** + * @var array + */ private array $validTimezones; public function __construct( - private readonly ApiTimezoneReader $apiTimezoneReader, - private readonly LocalTimezoneReader $localTimezoneReader, + private readonly GatewayRegistryInterface $gatewayRegistry, ) { $this->validTimezones = \array_flip(\DateTimeZone::listIdentifiers()); } @@ -56,15 +55,16 @@ public function getPremapping(Context $context, MigrationContextInterface $migra { $this->fillConnectionPremappingDictionary($migrationContext); - $choices = $this->getChoices(); + $choices = $this->getTimeZoneList(); - $sourceTimezone = $this->readSourceTimezone($migrationContext); + $sourceTimezone = $this->readSourceTimezone($migrationContext, $context); - if ($sourceTimezone === null || !isset($this->validTimezones[$sourceTimezone])) { - return new PremappingStruct(self::getMappingName(), [], $choices); - } + $description = $sourceTimezone ?? 'No source time zone'; + $destinationTimezone = ''; - $destinationTimezone = $sourceTimezone; + if ($sourceTimezone !== null && isset($this->validTimezones[$sourceTimezone])) { + $destinationTimezone = $sourceTimezone; + } if (isset($this->connectionPremappingDictionary[self::SOURCE_ID])) { $configuredDestination = $this->connectionPremappingDictionary[self::SOURCE_ID]->getDestinationUuid(); @@ -79,7 +79,7 @@ public function getPremapping(Context $context, MigrationContextInterface $migra [ new PremappingEntityStruct( self::SOURCE_ID, - $sourceTimezone, + $description, $destinationTimezone ), ], @@ -87,16 +87,11 @@ public function getPremapping(Context $context, MigrationContextInterface $migra ); } - private function readSourceTimezone(MigrationContextInterface $migrationContext): ?string + private function readSourceTimezone(MigrationContextInterface $migrationContext, Context $context): ?string { - $gateway = $this->getReader($migrationContext); - if (!$gateway instanceof ShopwareGatewayInterface) { - return null; - } - - $result = $gateway->read($migrationContext); + $environmentData = $this->gatewayRegistry->getGateway($migrationContext)->readEnvironmentInformation($migrationContext, $context); - $timezone = $result[0]['timezone'] ?? null; + $timezone = $environmentData->getTimezone(); if (!\is_string($timezone) || $timezone === '' || !isset($this->validTimezones[$timezone])) { return null; @@ -105,20 +100,14 @@ private function readSourceTimezone(MigrationContextInterface $migrationContext) return $timezone; } - private function getChoices(): array + /** + * @return array + */ + private function getTimeZoneList(): array { return array_map( static fn (string $timezone): PremappingChoiceStruct => new PremappingChoiceStruct($timezone, $timezone), \DateTimeZone::listIdentifiers() ); } - - private function getReader(MigrationContextInterface $migrationContext): ReaderInterface - { - if ($this->apiTimezoneReader->supports($migrationContext)) { - return $this->apiTimezoneReader; - } - - return $this->localTimezoneReader; - } } diff --git a/src/Resources/app/administration/src/module/swag-migration/snippet/de.json b/src/Resources/app/administration/src/module/swag-migration/snippet/de.json index 0e35c33e6..68df9d980 100644 --- a/src/Resources/app/administration/src/module/swag-migration/snippet/de.json +++ b/src/Resources/app/administration/src/module/swag-migration/snippet/de.json @@ -371,7 +371,8 @@ "salesChannel": "Newsletter-Verkaufskanal", "newsletter_status": "Newsletter-Status", "shipping_availability_rule": "Versandartverfügbarkeit", - "user": "Administration Benutzer" + "user": "Administration Benutzer", + "source_timezone": "Zeitzone" } }, "loadingScreenCard": { diff --git a/src/Resources/app/administration/src/module/swag-migration/snippet/en.json b/src/Resources/app/administration/src/module/swag-migration/snippet/en.json index c74c446b1..f9afc9ea2 100644 --- a/src/Resources/app/administration/src/module/swag-migration/snippet/en.json +++ b/src/Resources/app/administration/src/module/swag-migration/snippet/en.json @@ -371,7 +371,8 @@ "salesChannel": "Newsletter Sales Channel", "newsletter_status": "Newsletter status", "shipping_availability_rule": "Shipping method availability", - "user": "Administration user" + "user": "Administration user", + "source_timezone": "Timezone" } }, "loadingScreenCard": { diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php new file mode 100644 index 000000000..6c971fec5 --- /dev/null +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -0,0 +1,162 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Test\Profile\Shopware\Converter; + +use PHPUnit\Framework\TestCase; +use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\Log\Package; +use Shopware\Core\Framework\Uuid\Uuid; +use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; +use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; +use SwagMigrationAssistant\Migration\Mapping\MappingServiceInterface; +use SwagMigrationAssistant\Migration\MigrationContext; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; +use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; + +#[Package('after-sales')] +class ShopwareConverterTest extends TestCase +{ + private Context $context; + + private SwagMigrationConnectionEntity $connection; + + protected function setUp(): void + { + $this->context = Context::createDefaultContext(); + $this->connection = new SwagMigrationConnectionEntity(); + $this->connection->setId(Uuid::randomHex()); + $this->connection->setProfileName(Shopware55Profile::PROFILE_NAME); + $this->connection->setGatewayName(ShopwareLocalGateway::GATEWAY_NAME); + $this->connection->setCredentialFields([]); + } + + public function testConvertValueConvertsDateTimeWithMappedSourceTimezoneToUtcStorageFormat(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getValue') + ->with($this->connection->getId(), 'source_timezone', 'timezone', $this->context) + ->willReturn('Europe/Berlin'); + + $converter = $this->createConverter($mappingService); + + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00', $this->context); + + static::assertSame(['createdAt' => '2026-05-01 11:30:00.000'], $converted); + static::assertSame([], $source); + } + + public function testConvertValueCachesSourceTimezonePerConnection(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getValue') + ->willReturn('Europe/Berlin'); + + $converter = $this->createConverter($mappingService); + + [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00', $this->context); + [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00', $this->context); + + static::assertSame('2026-05-01 11:00:00.000', $firstConverted['createdAt']); + static::assertSame('2026-05-01 12:00:00.000', $secondConverted['createdAt']); + } + + public function testConvertValueDoesNotConvertDateTimeWithoutContext(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->never())->method('getValue'); + + $converter = $this->createConverter($mappingService); + + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00'); + + static::assertSame([], $converted); + static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); + } + + public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getValue') + ->willReturn('Not/A_Timezone'); + + $converter = $this->createConverter($mappingService); + + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00', $this->context); + + static::assertSame([], $converted); + static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); + } + + public function testConvertValueKeepsValidDateValueUnchanged(): void + { + $converter = $this->createConverter($this->createMock(MappingServiceInterface::class)); + + [$converted, $source] = $converter->convertDateValue('2026-05-01'); + + static::assertSame(['birthday' => '2026-05-01'], $converted); + static::assertSame([], $source); + } + + public function testConvertValueDoesNotConvertInvalidDateValue(): void + { + $converter = $this->createConverter($this->createMock(MappingServiceInterface::class)); + + [$converted, $source] = $converter->convertDateValue('not a date'); + + static::assertSame([], $converted); + static::assertSame(['birthday' => 'not a date'], $source); + } + + public function testGetAttributesConvertsDateTimeCustomFieldWithMappedSourceTimezone(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getMapping') + ->with($this->connection->getId(), 'product_custom_field', 'release_time', $this->context) + ->willReturn([ + 'id' => Uuid::randomHex(), + 'additionalData' => [ + 'columnType' => 'datetime', + ], + ]); + $mappingService->expects($this->once()) + ->method('getValue') + ->with($this->connection->getId(), 'source_timezone', 'timezone', $this->context) + ->willReturn('Europe/Berlin'); + + $converter = $this->createConverter($mappingService); + + $converted = $converter->convertAttributes( + ['release_time' => '2026-05-01 12:30:00'], + 'product', + 'shopware', + $this->context + ); + + static::assertSame([ + 'migration_shopware_product_release_time' => '2026-05-01 11:30:00.000', + ], $converted); + } + + private function createConverter(MappingServiceInterface $mappingService): TestShopwareConverter + { + $converter = new TestShopwareConverter( + $mappingService, + $this->createMock(LoggingServiceInterface::class) + ); + $converter->setMigrationContext(new MigrationContext( + $this->connection, + new Shopware55Profile() + )); + + return $converter; + } +} diff --git a/tests/Profile/Shopware/Converter/TestShopwareConverter.php b/tests/Profile/Shopware/Converter/TestShopwareConverter.php new file mode 100644 index 000000000..a46991470 --- /dev/null +++ b/tests/Profile/Shopware/Converter/TestShopwareConverter.php @@ -0,0 +1,69 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Test\Profile\Shopware\Converter; + +use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\Converter\ConvertStruct; +use SwagMigrationAssistant\Migration\MigrationContextInterface; +use SwagMigrationAssistant\Profile\Shopware\Converter\ShopwareConverter; + +#[Package('fundamentals@after-sales')] +class TestShopwareConverter extends ShopwareConverter +{ + public function supports(MigrationContextInterface $migrationContext): bool + { + return true; + } + + public function convert(array $data, Context $context, MigrationContextInterface $migrationContext): ?ConvertStruct + { + return null; + } + + public function setMigrationContext(MigrationContextInterface $migrationContext): void + { + $this->migrationContext = $migrationContext; + } + + /** + * @return array{0: array, 1: array} + */ + public function convertDateTimeValue(string $value, ?Context $context = null): array + { + $converted = []; + $source = ['createdAt' => $value]; + + $this->convertValue($converted, 'createdAt', $source, 'createdAt', self::TYPE_DATETIME, $context); + + return [$converted, $source]; + } + + /** + * @return array{0: array, 1: array} + */ + public function convertDateValue(string $value): array + { + $converted = []; + $source = ['birthday' => $value]; + + $this->convertValue($converted, 'birthday', $source, 'birthday', self::TYPE_DATE); + + return [$converted, $source]; + } + + /** + * @param array $attributes + * + * @return array|null + */ + public function convertAttributes(array $attributes, string $entityName, string $connectionName, ?Context $context = null): ?array + { + return $this->getAttributes($attributes, $entityName, $connectionName, [], $context); + } +} diff --git a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php index ab8df2a42..89a0982b9 100644 --- a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php @@ -18,6 +18,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Shopware\Core\Framework\Log\Package; +use Shopware\Core\Framework\Uuid\Uuid; use SwagMigrationAssistant\Exception\MigrationException; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; use SwagMigrationAssistant\Migration\Gateway\HttpSimpleClient; @@ -249,4 +250,58 @@ public function testGetsEnvironmentInformation(): void static::assertEquals(['version' => 'test'], $response['environmentInformation']); static::assertEquals(new RequestStatusStruct(), $response['requestStatus']); } + + public function testReadCachesEnvironmentInformationPerConnection(): void + { + $mock = new MockHandler([ + new Response(200, [], (string) json_encode(['data' => ['timezone' => 'Europe/Berlin']])), + new Response(200, [], (string) json_encode(['data' => ['timezone' => 'Europe/London']])), + new Response(200, [], (string) json_encode(['data' => ['timezone' => 'UTC']])), + ]); + + $handler = HandlerStack::create($mock); + + $client = new HttpSimpleClient([ + 'base_uri' => 'api/', + 'auth' => ['apiUser', 'apiKey', 'digest'], + 'handler' => $handler, + ]); + + $connectionFactory = $this->createMock(ConnectionFactory::class); + $connectionFactory + ->expects($this->exactly(3)) + ->method('createApiClient') + ->willReturn($client); + + $environmentReader = new EnvironmentReader($connectionFactory); + + $firstMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); + $secondMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); + $thirdMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); + + $firstResponse = $environmentReader->read($firstMigrationContext); + $cachedFirstResponse = $environmentReader->read($firstMigrationContext); + + $secondResponse = $environmentReader->read($secondMigrationContext); + + $thirdResponse = $environmentReader->read($thirdMigrationContext); + + static::assertSame(['timezone' => 'Europe/Berlin'], $firstResponse['environmentInformation']); + static::assertSame(['timezone' => 'Europe/Berlin'], $cachedFirstResponse['environmentInformation']); + + static::assertSame(['timezone' => 'Europe/London'], $secondResponse['environmentInformation']); + + static::assertSame(['timezone' => 'UTC'], $thirdResponse['environmentInformation']); + } + + private function createMigrationContextWithConnectionId(string $connectionId): MigrationContext + { + $connection = new SwagMigrationConnectionEntity(); + $connection->setId($connectionId); + + return new MigrationContext( + $connection, + new Shopware55Profile() + ); + } } diff --git a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php index 7aa4a643b..c944d4b4e 100644 --- a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php @@ -7,12 +7,16 @@ namespace SwagMigrationAssistant\Test\Profile\Shopware\Gateway\Local; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Shopware\Core\Framework\Log\Package; +use Shopware\Core\Framework\Uuid\Uuid; +use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\CustomerDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Connection\ConnectionFactory; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader\EnvironmentReader; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; use SwagMigrationAssistant\Test\Mock\Gateway\Dummy\Local\DummyLocalGateway; @@ -60,4 +64,98 @@ public function testRead(): void static::assertSame('en_GB', $additionalData['children'][0]['locale']['locale']); static::assertSame('39', $additionalData['children'][0]['category_id']); } + + #[DataProvider('timezoneFixtureProvider')] + public function testReadReadsTimezoneFromInstallationRootConfig(string $fixtureName, string $expectedTimezone): void + { + $credentialFields = $this->connection->getCredentialFields(); + static::assertIsArray($credentialFields); + + $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/' . $fixtureName; + $this->connection->setCredentialFields($credentialFields); + + $data = $this->environmentReader->read($this->migrationContext); + + static::assertSame($expectedTimezone, $data['timezone']); + } + + public function testReadCachesEnvironmentInformationPerConnection(): void + { + $credentialFields = $this->connection->getCredentialFields(); + static::assertIsArray($credentialFields); + + $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/valid'; + $this->connection->setCredentialFields($credentialFields); + + $firstData = $this->environmentReader->read($this->migrationContext); + + $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/empty_database_timezone'; + $this->connection->setCredentialFields($credentialFields); + + $cachedData = $this->environmentReader->read($this->migrationContext); + $secondMigrationContext = $this->createMigrationContextWithConnection( + $this->createConnection($credentialFields) + ); + $secondConnectionData = $this->environmentReader->read($secondMigrationContext); + + static::assertSame('Europe/Berlin', $firstData['timezone']); + static::assertSame('Europe/Berlin', $cachedData['timezone']); + static::assertSame('', $secondConnectionData['timezone']); + } + + /** + * @return array + */ + public static function timezoneFixtureProvider(): array + { + return [ + 'valid timezone' => [ + 'fixtureName' => 'valid', + 'expectedTimezone' => 'Europe/Berlin', + ], + 'config does not return array' => [ + 'fixtureName' => 'config_does_not_return_array', + 'expectedTimezone' => '', + ], + 'empty database timezone' => [ + 'fixtureName' => 'empty_database_timezone', + 'expectedTimezone' => '', + ], + 'missing database timezone' => [ + 'fixtureName' => 'missing_database_timezone', + 'expectedTimezone' => '', + ], + ]; + } + + /** + * @param array $credentialFields + */ + private function createConnection(array $credentialFields): SwagMigrationConnectionEntity + { + $connection = new SwagMigrationConnectionEntity(); + $connection->setId(Uuid::randomHex()); + $connection->setCredentialFields($credentialFields); + $connection->setProfileName(Shopware55Profile::PROFILE_NAME); + $connection->setGatewayName(ShopwareLocalGateway::GATEWAY_NAME); + + return $connection; + } + + private function createMigrationContextWithConnection(SwagMigrationConnectionEntity $connection): MigrationContext + { + $migrationContext = new MigrationContext( + $connection, + new Shopware55Profile(), + null, + new CustomerDataSet(), + $this->runId, + 0, + 10 + ); + + $migrationContext->setGateway(new DummyLocalGateway()); + + return $migrationContext; + } } diff --git a/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/config_does_not_return_array/config.php b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/config_does_not_return_array/config.php new file mode 100644 index 000000000..828748973 --- /dev/null +++ b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/config_does_not_return_array/config.php @@ -0,0 +1,8 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return 'invalid'; diff --git a/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/empty_database_timezone/config.php b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/empty_database_timezone/config.php new file mode 100644 index 000000000..03c4bc135 --- /dev/null +++ b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/empty_database_timezone/config.php @@ -0,0 +1,12 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'db' => [ + 'timezone' => '', + ], +]; diff --git a/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/missing_database_timezone/config.php b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/missing_database_timezone/config.php new file mode 100644 index 000000000..97db6e9a5 --- /dev/null +++ b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/missing_database_timezone/config.php @@ -0,0 +1,10 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'db' => [], +]; diff --git a/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/valid/config.php b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/valid/config.php new file mode 100644 index 000000000..9b4f6e05a --- /dev/null +++ b/tests/Profile/Shopware/Gateway/Local/_fixtures/environment_reader/valid/config.php @@ -0,0 +1,12 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'db' => [ + 'timezone' => 'Europe/Berlin', + ], +]; diff --git a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php index 14b243045..d03349e83 100644 --- a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php @@ -221,6 +221,7 @@ public function testGenerateFingerprintWithConfig(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', + 'timezone' => 'Europe/Berlin', 'config' => [ 'esdKey' => 'test-esd-key', 'installationDate' => '2023-01-01 00:00:00', @@ -248,6 +249,7 @@ public function testGenerateFingerprintWithConfig(): void static::assertNotNull($response->getFingerprint()); static::assertIsString($response->getFingerprint()); + static::assertSame('Europe/Berlin', $response->getTimezone()); } public function testGenerateFingerprintWithoutConfig(): void @@ -283,6 +285,7 @@ public function testGenerateFingerprintWithoutConfig(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', + 'timezone' => '', ]); $localTableReader = new TableReader(new ConnectionFactory()); @@ -340,6 +343,7 @@ public function testGenerateFingerprintWithoutEsdKey(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', + 'timezone' => '', 'config' => [ 'installationDate' => '2023-01-01 00:00:00', ], diff --git a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php index d71223b64..f5abec1bf 100644 --- a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php @@ -120,6 +120,7 @@ public function testReadEnvironmentInformation(): void $connectionFactory = new ConnectionFactory(); $apiReader = new ProductReader($connectionFactory); $environmentReader = new EnvironmentDummyReader($connectionFactory); + $environmentReader->setDummyData(['timezone' => 'Europe/Berlin']); $tableReader = new TableReader($connectionFactory); $tableCountReader = new TableCountDummyReader($connectionFactory, new DummyLoggingService()); @@ -136,6 +137,7 @@ public function testReadEnvironmentInformation(): void static::assertSame('Shopware', $response->getSourceSystemName()); static::assertSame('___VERSION___', $response->getSourceSystemVersion()); static::assertSame('foo', $response->getSourceSystemDomain()); + static::assertSame('Europe/Berlin', $response->getTimezone()); } public function testReadEnvironmentInformationWithoutSourceDefaultLanguage(): void diff --git a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php new file mode 100644 index 000000000..eb145dc6d --- /dev/null +++ b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php @@ -0,0 +1,159 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Test\Profile\Shopware\Premapping; + +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\Log\Package; +use Shopware\Core\Framework\Uuid\Uuid; +use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; +use SwagMigrationAssistant\Migration\EnvironmentInformation; +use SwagMigrationAssistant\Migration\Gateway\GatewayInterface; +use SwagMigrationAssistant\Migration\Gateway\GatewayRegistryInterface; +use SwagMigrationAssistant\Migration\MigrationContext; +use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; +use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; +use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; +use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; + +#[Package('after-sales')] +class TimezoneReaderTest extends TestCase +{ + private Context $context; + + protected function setUp(): void + { + $this->context = Context::createDefaultContext(); + } + + public function testSupportsShopwareApiAndLocalGateways(): void + { + $reader = new TimezoneReader($this->createMock(GatewayRegistryInterface::class)); + + static::assertTrue($reader->supports($this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME), [])); + static::assertTrue($reader->supports($this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME), [])); + } + + public function testGetPremappingUsesDetectedSourceTimezone(): void + { + $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME); + $reader = $this->createReader($migrationContext, 'Europe/Berlin'); + $premapping = $reader->getPremapping($this->context, $migrationContext); + + static::assertSame(TimezoneReader::getMappingName(), $premapping->getEntity()); + static::assertNotEmpty($premapping->getChoices()); + static::assertCount(1, $premapping->getMapping()); + static::assertSame('timezone', $premapping->getMapping()[0]->getSourceId()); + static::assertSame('Europe/Berlin', $premapping->getMapping()[0]->getDescription()); + static::assertSame('Europe/Berlin', $premapping->getMapping()[0]->getDestinationUuid()); + } + + public function testGetPremappingKeepsConfiguredDestinationTimezone(): void + { + $connection = $this->createConnection(ShopwareLocalGateway::GATEWAY_NAME); + $connection->setPremapping([ + new PremappingStruct(TimezoneReader::getMappingName(), [ + new PremappingEntityStruct('timezone', 'Europe/Berlin', 'America/New_York'), + ]), + ]); + + $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME, $connection); + $reader = $this->createReader($migrationContext, 'Europe/Berlin'); + $premapping = $reader->getPremapping($this->context, $migrationContext); + + static::assertSame('America/New_York', $premapping->getMapping()[0]->getDestinationUuid()); + } + + #[DataProvider('missingSourceTimezoneProvider')] + public function testGetPremappingReturnsSelectableRowWhenSourceTimezoneCannotBeRead(?string $sourceTimezone): void + { + $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME); + $reader = $this->createReader($migrationContext, $sourceTimezone); + $premapping = $reader->getPremapping($this->context, $migrationContext); + + static::assertNotEmpty($premapping->getChoices()); + static::assertCount(1, $premapping->getMapping()); + static::assertSame('timezone', $premapping->getMapping()[0]->getSourceId()); + static::assertSame('No source time zone', $premapping->getMapping()[0]->getDescription()); + static::assertSame('', $premapping->getMapping()[0]->getDestinationUuid()); + } + + public function testGetPremappingUsesEnvironmentInformationForApiGateway(): void + { + $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); + $reader = $this->createReader($migrationContext, 'UTC'); + $premapping = $reader->getPremapping($this->context, $migrationContext); + + static::assertSame('UTC', $premapping->getMapping()[0]->getDestinationUuid()); + } + + /** + * @return array + */ + public static function missingSourceTimezoneProvider(): array + { + return [ + 'missing source timezone' => ['sourceTimezone' => null], + 'empty source timezone' => ['sourceTimezone' => ''], + 'invalid source timezone' => ['sourceTimezone' => 'Not/A_Timezone'], + ]; + } + + private function createReader(MigrationContext $migrationContext, ?string $timezone): TimezoneReader + { + $gateway = $this->createMock(GatewayInterface::class); + $gateway->expects($this->once()) + ->method('readEnvironmentInformation') + ->with($migrationContext, $this->context) + ->willReturn($this->createEnvironmentInformation($timezone)); + + $gatewayRegistry = $this->createMock(GatewayRegistryInterface::class); + $gatewayRegistry->expects($this->once()) + ->method('getGateway') + ->with($migrationContext) + ->willReturn($gateway); + + return new TimezoneReader($gatewayRegistry); + } + + private function createEnvironmentInformation(?string $timezone): EnvironmentInformation + { + return new EnvironmentInformation( + 'Shopware', + '5.5.0', + '', + timezone: $timezone + ); + } + + private function createMigrationContext(string $gatewayName, ?SwagMigrationConnectionEntity $connection = null): MigrationContext + { + $gateway = $this->createMock(GatewayInterface::class); + $gateway->method('getName')->willReturn($gatewayName); + + return new MigrationContext( + $connection ?? $this->createConnection($gatewayName), + new Shopware55Profile(), + $gateway + ); + } + + private function createConnection(string $gatewayName): SwagMigrationConnectionEntity + { + $connection = new SwagMigrationConnectionEntity(); + $connection->setId(Uuid::randomHex()); + $connection->setProfileName(Shopware55Profile::PROFILE_NAME); + $connection->setGatewayName($gatewayName); + $connection->setCredentialFields([]); + + return $connection; + } +} From 52bbb670beb4d94c97fae7ae94faa6d42e624f57 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 11:51:01 +0200 Subject: [PATCH 03/15] Fix tests --- .../Profile/Shopware/Converter/ShopwareConverterTest.php | 8 ++++---- tests/acceptance/fixtures/MigrationConnection.ts | 4 +++- tests/acceptance/fixtures/shopware5-source/config.php | 7 +++++++ tests/acceptance/tests/MigrationTest.spec.ts | 5 +++++ 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 tests/acceptance/fixtures/shopware5-source/config.php diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index 6c971fec5..c951c778e 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -47,7 +47,7 @@ public function testConvertValueConvertsDateTimeWithMappedSourceTimezoneToUtcSto [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00', $this->context); - static::assertSame(['createdAt' => '2026-05-01 11:30:00.000'], $converted); + static::assertSame(['createdAt' => '2026-05-01 10:30:00.000'], $converted); static::assertSame([], $source); } @@ -63,8 +63,8 @@ public function testConvertValueCachesSourceTimezonePerConnection(): void [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00', $this->context); [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00', $this->context); - static::assertSame('2026-05-01 11:00:00.000', $firstConverted['createdAt']); - static::assertSame('2026-05-01 12:00:00.000', $secondConverted['createdAt']); + static::assertSame('2026-05-01 10:00:00.000', $firstConverted['createdAt']); + static::assertSame('2026-05-01 11:00:00.000', $secondConverted['createdAt']); } public function testConvertValueDoesNotConvertDateTimeWithoutContext(): void @@ -142,7 +142,7 @@ public function testGetAttributesConvertsDateTimeCustomFieldWithMappedSourceTime ); static::assertSame([ - 'migration_shopware_product_release_time' => '2026-05-01 11:30:00.000', + 'migration_shopware_product_release_time' => '2026-05-01 10:30:00.000', ], $converted); } diff --git a/tests/acceptance/fixtures/MigrationConnection.ts b/tests/acceptance/fixtures/MigrationConnection.ts index 8bb94358f..325fde3d3 100644 --- a/tests/acceptance/fixtures/MigrationConnection.ts +++ b/tests/acceptance/fixtures/MigrationConnection.ts @@ -1,4 +1,5 @@ import { test as base, expect } from '@shopware-ag/acceptance-test-suite'; +import { join } from 'node:path'; import type { FixtureTypes } from '@fixtures/AcceptanceTest'; export interface MigrationConnectionStruct { @@ -11,6 +12,7 @@ export interface MigrationConnectionStruct { export const MigrationConnection = base.extend({ MigrationConnection: async ({ AdminApiContext, DatabaseCredentials }, use) => { const connectionName = 'shopware'; + const installationRoot = join(process.cwd(), 'fixtures', 'shopware5-source'); const createResponse = await AdminApiContext.post('/api/swag-migration-connection', { data: { @@ -43,7 +45,7 @@ export const MigrationConnection = base.extend({ dbUser: DatabaseCredentials.user, dbPassword: DatabaseCredentials.password, dbName: DatabaseCredentials.database, - installationRoot: '/tmp', + installationRoot, }, }, }); diff --git a/tests/acceptance/fixtures/shopware5-source/config.php b/tests/acceptance/fixtures/shopware5-source/config.php new file mode 100644 index 000000000..ccb4cbfa6 --- /dev/null +++ b/tests/acceptance/fixtures/shopware5-source/config.php @@ -0,0 +1,7 @@ + [ + 'timezone' => 'Europe/Berlin', + ], +]; diff --git a/tests/acceptance/tests/MigrationTest.spec.ts b/tests/acceptance/tests/MigrationTest.spec.ts index 25aac624c..4fa5be043 100644 --- a/tests/acceptance/tests/MigrationTest.spec.ts +++ b/tests/acceptance/tests/MigrationTest.spec.ts @@ -75,6 +75,11 @@ test.describe('Migration Tests @migration @visual', () => { } } + await page + .locator('.swag-migration-tab-card__title') + .filter({ hasText: 'Shipping method availability' }) + .click(); + await expect(page).toHaveScreenshot('data-selection-assigment-without-errors.png', { mask }); }); From 1bd38be68aec1b3fa33a0daf2a5f38ae0053a835 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 13:12:53 +0200 Subject: [PATCH 04/15] Fix tests --- .../Gateway/ApiEnvironmentReaderTest.php | 20 ++++++++----------- .../Gateway/ShopwareApiGatewayTest.php | 2 ++ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php index 89a0982b9..7ff61bb3f 100644 --- a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php @@ -43,10 +43,7 @@ public function testEmptyClientReturnsRequestStatus(): void $environmentReader = new EnvironmentReader($connectionFactory); - $migrationContext = new MigrationContext( - new SwagMigrationConnectionEntity(), - new Shopware55Profile(), - ); + $migrationContext = $this->createMigrationContext(); $response = $environmentReader->read($migrationContext); @@ -83,10 +80,7 @@ public function testResponseExceptions( $client = new HttpSimpleClient($options); - $migrationContext = new MigrationContext( - new SwagMigrationConnectionEntity(), - new Shopware55Profile(), - ); + $migrationContext = $this->createMigrationContext(); $connectionFactory = $this->createMock(ConnectionFactory::class); $connectionFactory @@ -233,10 +227,7 @@ public function testGetsEnvironmentInformation(): void $client = new HttpSimpleClient($options); - $migrationContext = new MigrationContext( - new SwagMigrationConnectionEntity(), - new Shopware55Profile() - ); + $migrationContext = $this->createMigrationContext(); $connectionFactory = $this->createMock(ConnectionFactory::class); $connectionFactory @@ -304,4 +295,9 @@ private function createMigrationContextWithConnectionId(string $connectionId): M new Shopware55Profile() ); } + + private function createMigrationContext(): MigrationContext + { + return $this->createMigrationContextWithConnectionId(Uuid::randomHex()); + } } diff --git a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php index f5abec1bf..a7293cb00 100644 --- a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php @@ -11,6 +11,7 @@ use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Log\Package; use Shopware\Core\Framework\Test\TestCaseBase\KernelTestBehaviour; +use Shopware\Core\Framework\Uuid\Uuid; use SwagMigrationAssistant\Exception\MigrationException; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; use SwagMigrationAssistant\Migration\EnvironmentInformation; @@ -75,6 +76,7 @@ public function testReadFailed(): void public function testReadEnvironmentInformationFailed(): void { $connection = new SwagMigrationConnectionEntity(); + $connection->setId(Uuid::randomHex()); $connection->setCredentialFields([ 'endpoint' => 'testing', 'apiUser' => 'testing', From 8dea1cc282617b9bc411e64473c027cf6ecad511 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 14:11:34 +0200 Subject: [PATCH 05/15] Fix acceptance tests --- .../data-selection-assigment-with-errors.png | Bin 102842 -> 104862 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/data-selection-assigment-with-errors.png b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/data-selection-assigment-with-errors.png index bfc5d659f1b304dc1cdbc7be64814907e20bfe33..d93cfe061fb714a8c6e9fbcd57e1c38a0ff646a5 100644 GIT binary patch literal 104862 zcmc$`Wl)@5vo=aX5(t{0!Gk*l8C*ip!JXj2-Q6L$ySux)6EwKHyE}sq^G)(R@2;;- z)!COApu3_w3AiDuaYJZxQoIO*7%eu;YqUMGVzv)QF1?c)x^1SP1Q0@EHAV2w&AM^ z&8M2_xdfoy z25o+YUXB(lXa^_WhJn)Jg!B0 zjHDi#1oTG+Z)IfVhp1^7q&(t0C?g0kQ#E97!eC%#LX8Ro{ZogrY;0 z7=^De8|6;t=QHV|W9Yj=!us+ob`3-*TAW@-8$QbaiqnF7$AN$P=+%4$3#Tseb~=*i z^c(NbF+b1Fedo8R>>u7am-_py5)VZ#A^y8#xB_VoKk;n`rr(?7ZcT<`KfAXx5I}y7 zwGhcM+rz5g9qQ2|&nz(+47d;+!F(Q{{;8YuycX8}xA(FL1XI3x58XJld{;_j1~~gJ zu7=V;>cY4ldfM$d$CZhhA9Tt54yTPzoV(+|)`=R8_Pf+bGm$~~7rxELt8XMKhHA0Z zr3~)JBV?SS36=}^Dgqd}hI`d^`y?tBo9P62SZS_w=88>lj`Je{~SMq z#lBvpRyyuG7w-HSd(~!Y`q%g z^8#f9&YguJ%hZy34KrM2)*@i&sb zEIG_l*6xtq8@g=_UeEh?D{EIY{w$~u1P^oLd>QHI1o6eB&2@B^BG~E8k7d+0Xev0S z&1a)j^0&0hx*ZNz@RcOQ-x#c1wX5X__5O3TH_9*OwKtFFt@5^TXY6PabWEt58>FSA zB!Di~w=#<+ zPoD8jGG~>BytYB0=DNgO#Ti!_H7>VH4mUgxIoFwb*hxl4?b)(6Uz9PsA3Tu@HdHx~ zg$Kffk*&JW&Ww8|X}d@Hbxup=0J8nDzSz{ee#6w+0t||ihrJ%-QfJupEACIx-5$|}WcllrCcPuz(0CRKWLBmbil19)eh0_=gl$*~<{WOv1y(Dq z5;WNsouHXXhs~z~cTBnODnr-YqB3Mj;py82Zu_Z~30kx{w>FPcF2kZ~H8-NNxZ% zgZ|N;-dC;{8=0%EcbaX^%_Sw`N=l$rCl5aG4LWTpmJHFN$CakRL9bVZi)noT~@ES567Bad*Qj59+fH&{T*IRU@wFecXAM64;f{*iD z0?U!G+-;fE!2v+f)3di8-rd6~Dng*CQIXLHunmtkL`2y*0`pd`UX{o(*Z#w4^J`IA~K9wrW(Z? z-~QDZ{NS5wua|3ZXrf}+_Db`5@xZ*cRT4i0_UaKRC3StBs;#KVYC7}#1zfJE_?sV+ zcedIJnJH$Wl*T`uA5XJSS~?KP6&l$@^HSnR?Li_)*$1vgI+fb{dmcJ%geBYG(C6v|+Lcf@&(=@4O`V zE$;8#o$PId*U~dP9v=%2bcOjvgdcRc=e?ZxT3PrUxohcU@goqSW|8)rVCAd``6 zS-n{z5sz5TOFHipujycac&g=k1Vv?XPR>>`3)r~M5}V--5nr3v>C)`0SEa?2`(t2{ z@^o$|!axOSuKs$n`Qn3jnDWi`hu>lkL$y6!{Uz1)$sLqrt)`tp^gBE>Tr?RY7w>JlvsaU%F&u&Jq>w5{Ss^FZZ| z&F4d#6Va6rQJdiRfW$k0uYolny(cIzaIa_T_bL z7pm_IPFHZXok<2gF=W{+^%(EJP9VKQafrG(r)qb-=mwO$-Ri!}l*AO*`zR@q9>` zIme^?vTm!5S3sdKzOpi+A+sHhNE>q1-B1bMR8vmW^mlUkV|cP+;oo#S9J9&FC|787 zxLnUGD<|OM;?8ucH+tS(4ulr%YI}grkB&^QxE>A*VewJ+yL>!g;g(o6ERBp>y&z{R zD{b1I@5uuu|{3^$qz72$2&H4i5=A zDu-vTtQ!+sjvhzd22q)J%v;TW-N^OepIVR$W(;wRBZg$;^N&5yGQX$^nJ-(RtMl{u ze|hY5+goa7Oqh?9|HxF=I*&B!oS`5uXGbOE-{+67Yp_6tmtB{<8h4p1-uoB*f>N4CZ-$5Y%hycJFgDiD^E2T*Nsx1 zn42nFtY9rXYupUUNztK05^uyI5$nIlC-;xucj2S3^O$Jv*yNWYl(Xa9TQhen3=I_W*<5DJaZ^`YZYwZ+1so zt%c=fMB;2eT#vh%?QdrxeY!xwBwK2CTi5pTk0j!cuus2zZ|xlMiOy`cuT-w4k(A%^ zh5ww%l2PmEOREBEsb|^yT+QM{QEAOJxBHda8s)nd6L&~lz^8V~@DmRbPAS=!wmsYS z*5Hf++-zNZdqEFDibGaRYHZYYCs0`X@&^^lR2$MjjvM*fBvvCA=c6U~w^sTR?3YRH zCK>J7dFVsIU~D~w845@7nFj)e$r7hSrbPS%rg5cU$YN zQ@@jEtu7DdaDU`w#BgFi(KA_P*&Li^w=BVsp2{W~i{{j()6XYZ!uj@2^*Tm(;eiLa z{goEcefYWdb#~uio6Du`LOa}p(75S^Sb~@c-^^Z*=3qNsa59e+x>+NTFZLw-z@c<3 z*!WF zS%$!Z-s($Q91p-?-X{()xVk0Cc{-m zGj|DWbneQEGx8kjM*5p)M+j3~2CYu;X&X}pdLe1?VYG6!)_7Agp%{G9E@X$vS;tK0 zn)6!r7A$vtwdGu;R7eB_+t5)bumbRwkxrvP?DgdOK zeFYBQfsx6aBb5c^#+t zOP04BKM+cmpU=}h@722OILOL%8D78hy6E%jc8{k6Vu^AWLQ z;i4Fo7P6$Byj#Q8d8bnH&^p|?c#~}9H8$GggUxcZeuzna5~$nw77x;@Q$QaZ>wGm4 zEX3@*X0-0U$)2>rUk$O>wMb;>8+HvIIxR%6=1Jwu^tfj9VmDmsL-#UNG+r88Zqff#Q)43!?73yz@KWRtdAzCxQuOH*j@NS1k0?lAsjy(Pm%~K2 z&jU_lhbTz-UTk{`*B)Kw?@k_K*%!RFRfZ{WcGDn$9UbA(hU%POc6?9c0R{@HoSh2G zwn1?X5ySUUW$rTuCMKplixY)Qx@`UI%uHOpvV=tF z_?N3}giq89@vVpNfYM_-`+ot7G2m#$GE)BHIvYSU z^%6vjfhIS({SD=CSpR!D1a$Dc0g-&*11^0@4oT}IGK%e>vv?|pgS4iV4j#?!Y*i$? z`$g(`@uVC*7Gvsdv6wkZ*SDIzlc;_h)mRdT2N06Qg|5?qnT&4Cp2cNiWE@P z!7+)oEGcPsJF@tG*61?+KIhvUWBRm$HoL@ap{g6&WliPTeP=0%5fo7IJYV*Lj6P96 z%1epFROqQZf0wpnYvrZp82mf!_A^&1=az4C2Dq5tr>vML=n7(|*6&X}`g?7;yz^tc z8|lKqLDEud51R%#T5wLznXHVt z`MVEU3@H*Ba<3vN5Gkdu2-!w>DfbVrc4-|P90tO0R>^$w4LWyrFsAaCD7$ou3MJH} zFRLlfrEtnCDjH0CET_;w+X@JJB!ui##dPE}_0}=j#JP7t(d~DXh2UzCsKsVCV}J6O zqCA^KPb7AY%j8<(L!|D3kFO+X(e_+qoNDV1XsK&2HcyG12$3t2^;s#OPYfwnXJg6G ze|{-m2*e#sNC3+9PR4VyIx#pHn&9DLQJ$?2HE6L8Y#a0fXEgXQg9~3;zcyJ<%NvC* zRS-3wkh-COKgi9PL=$??O`ky(O<+*QikrN=az=_W^F(`NzC)xRo3u~6%laVl@E$JC z&AsWOh7u+wm~f;m$4LD)lOp{q^WcHs-Ab4#U%JT*?V#9e>1_;2SIy4~g4(`38$m%q zvB{#Y5nn1=vGQ4-mOhz?S-s(kHORjsNpFs4JJ&)HRYc#2+RWudk+tXp>o}cGqPn zq@F6OIjw!Jcu}Rq<4AeZWCn87GboAs(dK%(_L`^`Qu}!K4(FCW8%0`bBTHbp!J0j_ zQht><)%NlhnQm`jtpN&^X-=Uh>eM$TZWZ;@xEh}QrHbr%$98wk7_|G@qpnIV1`d~_ zzUkrf@V1rD1}94u8!P?^yQFlXob?{v)K@e*(`czDh+na%5A_VnMcX5p zFvcT85c_s=4Di=#wO6sEB7E&B>q2iO_zj*A(C*RU`WJ!_vh>Z9xtOk%^>Cdcl4 z9okT3dTXRlZ?GmotU`T}pw);V$=FNk@l0 zu9V<lAkFrCw>JDO|UJ|d{?TIhyv!s-&s_G&?#QlDT zdQek^mnXnU<98NjO-)Uam)mXJ!*;8W&yLY)p^Tl|-I?%Ge08;)fWWJ0t)gG|ms*t~ z>{Ko;4~p=?_Qki!zPU9e;&U{mo^-0E^72HG^+%#$-6M(^7#L^Zv~CtPD7w;+&GtHh z(R20curOlvy<8#IQKQQ}8Rl5lPh1z_@hgN(2SfW@hXYCU0;+u-ElqOaG)YH38CUs_ zl)mW@5={})_fnmd*YUKPEg8X{zDVTLtoorz9^{(*JMqG~9h^bVX)TGEY3>o<6=T)4 zX&QS^9>*}#W>R$;3B?ahiD_u}K7cy}+x99KFZx=`ex|Y$4dYsnvB=;!$dcJ{x~00zHpE>uB!aldKvHBqVIcmnKq>923DdBnxQGro-iOr zlZGHP_rBNO{dMH&0C<-SEXWyf#&gS{9Rnj#_{Cbr_<<@i>vB!TS|8Ia31l^ zK`a1gFW)a6DTG2=AyBNqI!Xnry)Zt5V|%YW3?Z6|@o?+mi9Ba%<)rNdxHXw|9lRJL zg#womIaYZX@U76yG-?ZjjT;atXn}TpjLID$vaceR^Mxt+fn*e0kTP#ZRwRS@=rifH z2xe66{OD1^xyCe|&%R!5Xef(S#=XgaPn27q{I_fR6)E9Tvi&A8W)q23p}t_F2z+FT z_-C915ELi)3Zzr5x!>wrZ*Lz^7*|qKl9E!5rIbN>|6Z%*M$dGx^93|p+4(NIqJR4m zi{bgcKRoEXW0|Z_MhF_Of%>Ssleq#fFNnobVox{#Q!-4}_b7ajqY`aTPI3Q0Eln*v zN?h)SdM9`j%G2rb=Bxu%ZH2?rGr*9+bwsYakL+9nB#-x@6U6V?ewv87FZpbJOZHCi zalWm4Oa3*?gtxTS;5|l6tnJZ>HmWIQRKcN(>5~UX)_hh*3{mB*D{9)Ak}dO#i!k_F zFWW>|ljlp7?-z@8Q05S)z3#Y^QBcF|LA4f{#v^^%fvYc1;3O%kB^NCPu3;|r2mvwp zQL`4(inywb%C@{0|g<-k_ljKx;#ZxsyZ ztuEATM%&Uuzbt;|$JP_yPQr!s`!noJm*$b=*mlVLxiUn&eDVkKZSwZ4N~|IePpzI; ze-)#01akrVn!%xqcqObuG$XxT&SKGPx<%+wK{i#_p3Fw?oS6}|^4|ZMOd6J7S00w~ zdr3;lAG&P#6XxoxHP_69RiSWFG0)bW!|T@LPg>}H zq;>7CB6d?NJ{9b_di&PJ!#V~9Y#lN3pqm|zHd@jZ%-gn|)4#&F_q}~mL7LIPy#c+vJe^}mcACznR8`@oKcPsK>dTUcEs`Ny*`O4r;wm&4s;l+l|f4`~%n1 zIHzTP-6SVRwmMnuGkzo$L4rJA$3wv9WBC#)CkvObzQ3YU%G%N-$b-V#z~^3Gv%8bX zQ(AV`LPF%wp!Fc|;y9!7Q9TLGe;1o?*@MG*r*(MV>VfmvM8JFtw(p!88ZER!kroK} z-MgkS=|eJfM87EY$Ih)yP|9)fR`n6BirW#G1&GS7_My4_-DD{uZ2qYRK zt@OFY$@#|F#QS4M7LM~hH2Bo{Z0U6n-kP_&vtp)8wdt2dW{W7lk8Snkaft*@hNXc&n6jVEwy{ckG&Bb zx4V~5SdP1(V9Ti66kp$N&m*YfCO|4-L{YQwy(^FobK8y_0t z*SK6Y(mti3G8IsXK*;zp?G<@XFJS*4lv^!J(AB!_VqkVzC;AR+ES+bh&$0^4Z7Xlc zOV9Dq{q)Aaih0cL@0g+8m_Q@I+xQGfXLcmulHe`cR}AaPsSL&${#}x30=0Q^HmX_z zm;8sS)Tk`Ac8Kp`Kfi$@z5nn6{tg0aCrj;}y>qkOf+4b~|0T783(z$=Sf;W6Z|7m0 z5$$Kla$#U>i%MCbp!Z);)0tFO+p@T_=}im9U)jmR_cLe19+ZxQ*)cHvekge7Q{n&b>~y6@hFG4oFg#!{VPn#VxCjyM#O&&Q*gnuL z`B(9**{duDS=xUtv4FJ6WSM2d{lhweKA0|;B?yic%`$Tk@b;b4ggV5TiYnJ3p?#R} z#Q&^j<;GF@Lip#5iSR&A|LQjsk zx1ds=Y5zXHU1Kg5HpNT1*=*&wF>1mp37nUJ5uriBiWt|q2^3v@6rxZ3=BNJL(xf7*A>Z2e<1k;8KFoFs*EOPaZsbS*^Nodd!+pHGxvjJXpL3=lS5m;k z3IH*1Cv(;POUHLf7z_bn_HW%e#S;MxwNk&}X^6_taO*5rN%SCRvkIM1%Qe^DX(U5P zkEU{U|C(k&Anr})XJQ_$A1qU|bp$!QmFWyC+y+()>`%RaX4|>6C+`La+AQf|Bxb z_rJ+#w%LG`@l8URZ{r2E=~Dro-@RyAxbKRu6Wl%MNJ7_tBHh1r@?3uENoc3cL3ne8 zl|X)S<7IWZbq8(~iHn{mzv^B7CkRtu4aJMO&b6ikfwCoA*Z^ zmRaMkcT61Zw+c4vEV4yBW(2vLbjD}?xqU@b>G0-e193J!ULM`JS~5-9 zb16K#qGYTH1D@vLc|<~GEg8@=VKXuPn`(*;a}ntEX1)CM{Oh!xMxANDTWuQAY3PtB zD!lXbtPs29v9VJo>rlM371*tO1=BV*V4j=KEZTz zhx%5?<$U@+=JQ!f`NL^yCTM^QGCr0!--(6M7pR>}C}4z@iS*nJ6s^{%Aw{v`?VEMd`EbW_kJyz;dVkBSN%PAE@fHn8($dkp<&Fi2YS=kT<{y#^n?=0}5V{DBO#lq~-t%{#6QztSC-yI?pO9JKJwsQI}Kn?&-4pu?&lk94sN<9h1S? zgi-@&NzEjk`(l^2cdBD$P$XEm_1UH~y#)i5^cWmhaJ~bWU#{qkW-F!|Y4UoqzgRWb z^1xyh+&|3N)_lZ^H5#1%iK;bRq$xOmuzPmC$yt<0LCH?caPqtx*FsFTMCW8BGcK@K zfcxAwG81H`^N~8g-YhSX0SBJNKN&64K!4v{(cbbY`(L5kTkuh=1TA0&dT& zCFSVyH<#GsRs0POMjaZ8QPvc!`Eof7E3ISHEhlou_rscofskJeb`DmF@B?Pny3pO* z)}UzITSmzwOP;SmqD(F+r8^lLlo7*xWGk9_Lz0&y;irV4pSRR~11Kqlml1kn@$Ate zF!}5__(98xfI~>QXCmt9#>62%P9bTn{V8ge7KcmnwmSBKiIMbkw=DzvelgatUmc65 zmYU^T&3Q$cbYt~#uyH`Er_PLjt&fpjO|rC|kxP=cO6Nkb+gyiQfyd zSwIFjx(S~_AT3M|HFQau>5b8kXE4ENx%^?4J`&_B`VE~XY+xjl+pfw+SiG0Bgt;PP z?D0*OYF|D+P0OTj@$BuvJK^-~xz0+Up|sZNFf`ojB}^$B`Mfo?M6TNGKL>uCP*eH9 zpE^30{bF`d@4Wj&n82INOV7Ku++?@>^J7HBoTT*RFbaaf38Gt~Bmo6ZjSjo{bJ=*L z5avw9hL8vEQMw77so}6|oz>Eh+Lw;N7{q*fj1PQnm5ut|zIO?427@A75*un!R)Zf; zOCt+fmO)NeY4ukV;V1951>UI2iSlK#=NsOS6sc-wgtwr585tQW>s+s{!>&ii5K6yy zO|C2?sMm<;S)(;qB_)881NiKV@IX6IP7MT92@;ay%ocD$z-=1~;rp1f#sQ3NSID~p zrAn^4fri%N6|ZkITlkZ;TScMG08E4Qd4f)>iV-{b919I6K8R)ql=JH=X4LYe7wro2 zfcg0CLAzC?{%Re?%(q0@F+Zi;6C`W0UQ#_-$T|k8FdyK)-Kv>LQIb}NVSTp6Enfu3 z$No_d^T#5TYOGgjf>Q`$u7tob(q_yU+TU9Jy?z2YO32mP*FSCIRJ>Jr< zSfI|VB4>s*DE_@oK@1KWt-{tys&R)rLj1*S3TyFED3Zxho;D+M6QhlObO)fXy$DT7 zNRy&H2!(=EmW{x<*El7m1q;k`ch+`&dN-cQXVEld_zNyYBp~t|gMoJEr7kh%y!FEs zVoE?u()x?`xe!T5&;;uNt9*v5`_tHU+mtRLW~&6Xo@#j&%iR2DRoo*^z*XR8 z(D?w=GrkTv;ClIlh zs6fPgD)QX~WBvUKW}LVOT%`C`h1%vO(+KO4{W}?vLmWV|Qk5XAnfPQ?+QC|4hST=_ z?S^6rikt~LYyy%28jMTPfyi%=F)VLEW1vK%rA4?V-`HSh?0r_*GgKAjor_Ge&|DWS zr50*5IWEsH`y%At7~rfvaRX>8Cq{oQ)g=;};JowA77+#@F3xwy@~+jE^Zr5>wcz0? z(J3h_)n?GbRkQ;Su+CuV^M~-&y4VnNy8P%U=khh#+%WzXER!ht+1yxXR9Ce&NgjKs z#PQ+40A!#`e#&gRJ`F1u(9*5@HN0 zeNsDhfZFdbtUs7I6j9W3D+8?H5i}067%T!K@i{rXUUHTjb7j&v$_ok_Or}Lh60>u8 zS@@WEpM{(g2HXk&+Hm)Wn?@uE@2jnA8N#Ha0oeYp<11qc>vUWkr8tWBV6Ze6zqr|0 zOFavP4`LV&tn=V|v9Nj$432JNSSCI)5OEZcFfb z8%W?PB~Kpu(bF@wr-$)OZ{IJFA};)@=)8v*^0n^Z%OKF4zVxj=`;z{&;cen#%rq1$ z&Z<=kfmabiYC%W;NbM?3L-RWpVbE6V{UkG)tDim=dIU}N6zS?4vf40X6LfUgZtR$; z6r!owSuq{X%`5oAl*h|f25{{=&FNy+l%u>TiIO^ag+yZn;0sGmt^|?;aL^9QuMCqO zaYNHQ!lMohI_M3Oo;@)@VH77m>V1w+!C)_D-uEk%MgoXgAZp`^i9IT?apg&s+hf1W`7K7!Uz1bb| zv%5R*DQ6!u{^u>K^~B+kJ;~l>(fUX)Pjt(}!r`!r$K!c;W~KEhv8n|9=y=fR&SC4L zh1T7ntrw#cddflHJ;ujPjJSl^8v`_(3?(snF;-<Ja0f#)ZH$M6OCl=7L9FfldIO?oWQ0LFQ51^tuY218VuWsBr z%TPb1Xs&X{u%!@~()^i8Saa>SLy`_~ydLa~iLum1)fg4`nxPVrO|YgAvn4MZt+STKCI_E28_3jB08_O?kj zUq2B4{WwJkz=_#Ow z2*kt9!|@_)`T&oC(JPtny(#5O_5vRON-IVE%WM*^(&@QIV|B04K9FxW04|J1f(;j)9-LHlffV4q1i< zvIMtX#b7s0_Qi`#px-#{y<%E(Tl!^2S{_=&b7($lnH%0|R~iBjPY7!=b+Jt_=azqZu$Ow7K|g12EbV)75DyJZKy1h_fahozv)8xCWq~noXbnH!) z-@#2i^E_2sht>FP7ov)#0ml4*mhngNqVVFrnA2BA%+)BP1Qw|%>JG<^U#cVup=i)M!HD*iPabl!){u;?e$0|duDum z=d{ce=;ehUr;uTdiq?zI{Nn2r%~1g%BE)S^dFoWcCl%|yY2lN2zk*+xdd*=-UZ9w& zj(E!sZiAua>)IuCKa{j4>gX0z3=A6AK6;|*iK>_OzAyT7Jeby|FTnj7q~)q=omuS# zW>w3%a1q%94%ta8)70(@i`qa`)>^x}3~cKI5!YHLJf&i}r?g=Y26p&*5q;F%+C8Q*5{mj3Upb%k*3@RoGHu~%H%4_W_hh6j4I9oV7ORL~pAHYP z=P?I|PSg!J=^u$p$f8OQ3F*F%f(H_qi`*~F2uafQhsOzVgyaYw6;ecdeO9wiQge|^ zwPN+Z!-hKZfSd|pb2kaY(ISlK80MHka-~(WT3gn?TYJ83|QYlJui zjQW;c;!gp)Gw>~myDj$Yl+Q#HCrx!L$YfHD{DdhlqXUF2C zY2dwi9$QAJ^#Zh-JX1q#oFi>5w#jl0DMV&Sx%hT%qWzi9kArtMlv_k~nY?hh;Wm7Hv z3WstECj5nTb87|`)-HSxQnxzYxkhr({Yu&|nFGZq zCq8>vauyrwPzijFx>=f-E>DgZRAAQd56Z(LDW^aVVJIV7?%t1e0>rgt-;MAjbQ)3JEZlt!s)P<(nh8f9|Ex6-HA zG#u4&Xw<$D`my}p2sXp4F%e;NJwwZ!*o5b0d-+8ck zm?<;N*iNl=3nCpDU!|SG-(j+gRhrFu2()C*A z?sAHEyg?M1JJ;mDUb7I8Yz&{UUy`&Frq?Ovd-LplVDh~Ikch03U1x|Z{fgF##TLFR zLj9o_EGF`bx`K=jb}Ci+3K6(>?TELJtXT@{W?l3lrfJ{k&I>YpmW#Um(%2||Hj~Zj zfZQsBrL3e(e#ZHAsfY(~aSZaQnG2CX_eCXt*Xc}vtK3P#PvLAQX+3>Iez`o~@m#E^ z@c{(hm#ZI#?R;t3>tyfIqLAtC0IB?(ZglE(2 zx;i#O-!&NVcukvt#`H;YmskEAz&pv<=AtV8o0QBeHE22&bvfuC^}O zBaWhKG5O@^&t;jSJ4h#ivgX3!UqU}^6Qd__Ue_}ofznJGY_&kg=X8Zwh^<4w=XQSL z)YzXW8n`lYm8_RUfBwh)17v;|M`WEh9yPuGd-=7w9|vAt?`HX2tXlObLV?8zaTkL1R@ z9?Vs7onjx76_RIuPnC{x@=L(w<;G;I!?y)ozS4nE?yQrX<&8VlVZ&>DpmY;OZ1v{33B@yn6pWNk*Hc5~Np zYIeRQjQG>%T5i|Y?5$xf&MV8{udG{MB=u2pVu5kB&`a@_xS8L+mL5y)+YWS*xx6I= z*l31%7jZs%o)}Q?ZawU0qRxx37f89?@k1UGsHD@CxM!(~lS`+{7hBD#WL=8w>3CL( z9MSX4)7jRR-9q*+CPT+D*eb;AkR=FeUUTbdN& zd2Xgh84pgN;$_-|bCnmVhuy?TY77NKNO{yh|8?^LsrR#3#toAxvnYkMe^QIfQ*o=A z$Zz}o@}*plVhHUAkVBn%9KO`nKJyA;Ok%kt>K0S4mPLH>3stJm^4V&=I z&;)d7JwtA>AgeX&?J!?y2u{xw`kVOoFPA@UUl1PhxYQkoU6Pvaul^|Hi_j}9W|;{< zZb;|uyXLiu{3xi#|0?kC-bz|)sa5A!UUURSOf{k;EMDVB&sXZu`2K?yIKD7qdH_z^ z^3smwa~i&*YqWPuw^M4z=}L9|83^6}py}Po($@ZWbp6d8eQaBO2J`HUGi`i$4W1Zs z7lsYvNF5a?!l!B^2)QyVzNr7b+NV*G1p&0J|ufi7H0a zWc{M(D6yZ+FL2Ul?&}Tt+iY)Q+)M%*ob8M94J8ttsgkjV~}SF}eYzKY%?h1e!%ZbxGDJdT2nl zcR57F4z>}WACk{cJ-RM*`G(Rl`)ipBnqmJ3!ehYPNZQymFDevVqT{YSkp33ZR5N7& zMWPh+u5PKDYHYW*Lj5HZEfRmOv5*f57t^9bZNw?b2K#FQi(|JpEwXT9zb2!q%EDa5 zva8tm{u2w(R7yz^fyshBV6Nv&;!3DPPpE!n)(wBvKotgEG&9+sT^67QWES&c7&+B% z2gxa~vgyo1=fMr5;+ihd24K9EkMf{+t+%{R&G)eGlbjP4Gs*z-+8@y;DX*CQCanaz z2Bc3XhzkU%9d`fn2-My~GylC+m?R6$c?WR+UcCrhEnnB@1}d5wQOQ?sg$2`R1bkK#8cB-E@-sD-p^#D4d;gOA$cK_HX^K?0Kt> zSMBijRCU&g|9Pjt#wfez=gBPegU^b~^7KfWi2uHVz?+>&!M6-oCT%o0fy>8HsD3}H zBc>r=?NbZZS~xHe?wIGrveOBI|`EZ1c>$V zewi5#w`i&rC?%_@G%7{wVoR2ssVV($H5j#0SXg`y{%RwXiOSzpr8}Yd6taf}B?kFM z56Rc-nSuX#1%&t95fnp9Fo>*q@;Bk{{SEB7s%65psxT~~rYrmWA8F-(99N|jQzd^f z&y*nq;692{3(Y@k3Ik(IFUgEB(YLh~3uVLo`P4}byyGa*R?R6{ld6r35ND5HN;G{3 zO*Tvc+aGcv9RcI3YPOgP)ii{cqcBP%e;k6}CC+X{uUhD8vW_a!=T4)EmBI z*_&wmg>xE1)V6zaV*U@Sn=d)v@KoPBAqczfjcq@VgnO=g?pSt=B>A;G+(g1^H2JI(h0y$m0FWib)dVN% z%YaW~TH?W1S6cRA7m_TesY(yWEEBV_zq* zneNJXu;I(7H#^pNxSilT33Vlu7`JsnAYU4uqSMtor8z$Y_13Tnv? z%mKTry7A7chac`twUeK*k%xm{N#KY2-kr24sikhhTgjl(2o^MPuz((SCmxYZ9;LPH z+D{+xOkzX2!=4&t;MPa?{ox`noW@#nu7SYgaQAW4^#5@8 zmQi&z+qNhP34~z59fAjUhedFA_u%gCB*ER?-Q6{~>%!gL-MNe8%Rc+Gvu|tny+60T zSN}*RbFs#(nl(lrz4yxXboX^}I2p#CPt()jw!dbK$pG?up5#vbGgqBBTE08VWB{j_ z_SQLZweHQZwhDUdPB=#?sJ3Me)9;hWDI zY=hJo%n}U|C7V=d(D$$5;g`f6mo}V$B4q#^N`4e_H8o}5 z!fcW+PvKx0y}y0$#3)3xuH3f8WOuZGbaF5Jv6o>xd7iWb5qRhtM-gxO1!i#^gaAweWVpiJ*3=Ii~1_d=rfvtvgJ!VSa%%!(jc^Dm}5xuVLT}B-A)zuxF zgr6`H25L%B#-hD3X;$nMuV;~IlOSCK{;tU#LrVc@-;6c|q#Gb#-KopI7W9o%XCA_9} zY<8Y6E6w5RGbbsjp{bnhK?VaP{FOhHv*nit7AkLJZmXO10~$IIcIGPy-ozv|AdE1=0qviPX!Wt2%DD#9M^S$^#q~8(F7g|@#XibbBV|#+r9r04$9xN ziikpv+2AyvZ1PC<*Q+RaP&U*h_mENJk<=Cp=+i#s_e`}gYhClVeqs{Qh~^bHkJ;k{ z8v5cLIlPscnYPdOL*drZB5(5glsh#^ym2K*II=QOI9A0xL!zJ1&>eXF@$V{)vIpwI z65-?(s>*kup`PUnDd^jeRv2u-i`K&jZkdgD*3|h1I2<>~PoOquK2*GHB9tt<50_9W zlVC1xs(E5_BBarf{D@rCffzK-9~^6+=3?t-sf@1`LK{@;@E3#g!$((-S`fG)BW~xIFDBZrz^Slg>!2^ zkbev)sWA<8+#3ti?;AvL=0Nn**g;l%gsTXuwQ{X6Aku!!qp{@N_Pu- z5aw`Q#Ta8BIL=xBgw(5cuX&+MF^E_$q|n46Dy=w)q(wG+_DNCG7IXWgByopl(7!Pz z5}&@>+TL!OMyftJXcvTSy^gO<2hCu9<>kD$!Iq38>VwTf_BofI1X=78a~mY*o_Nn8 zR`nmP4}8OUJ~#0fqbxFiH_~(sdy{|JO{Eil{=aQb_2-NI zALMHPcP+J2a8}W0XWWCI#NBhPLGnunnfsh3A)7$pKWQ4+SFHRQRm{c& zXELdeFMB1H0L!5^qov({g&&r^5z;TPX7AGmuE8XOgCfk}uRxb`wXQJuv>rJr!FdV1 zjnmYK(gFy+g~?xqg^l|n?LULvnEzSLU`7FOuvYnQv<4*#CpRIvUZHYvF=!=9pDNm0L0>hNG5PC9DSqhQ=%`D zG610UR3h0>^erVJhhbKx?E<{UPJ-*LQ*Z^dVPwaqnsugcgK?FhldB61J&S%|5QAKq z7F>uhS&UxM3{liCWx~;hWrwGbY7qhLo~MPppC<-&-)8;^X!?~rh~o-t^+9d&Cm-cr zd%F=xK#=G_g~^|BeOw+=E-wp%Di0!EoWS|!TYK#!#(@Ot~Jb#5^_bZ@vL(uHIA+q0?LeMmOJ)X{sq^0w(aEbd3H* zhtQn80LqH7k3TsLA*nxUZ@+Gi{zltC&_=zHlfCLM7N9=q{-@jp153%$b+tP6UPLvQ z<>)uUa<%dot2}qYt&MH5v)F8DHVhP`!HN|Wa8Lx4k^I8O)oQip0{7Bw3QDh{ zOEK1)%YQyxBqt}ANDP>W-4s0s*T(}M!?8Kh|?D?_cY~4 z8+PXcfYoQooPFukMm)fpvum4g=k)8cS}hXA{&EBO^G_+_2fjJG303j-MdX1&fdY)| zG&kC!uF}1UiKe8ieC`F~%-*1}W0q*OZ~c72gouE-yNTlPWx|?J zQ_3%3jXlo3c6Zop+yJ!`G1`C3L;l6*PDuwPUi*w!=Yfb5ylyf+iK+`A5s#>BsO8Fw zRq>9K5``a6Hs#CORd_jtVpbF>FJYOlZIXj5^{SuW$`z7Ju_lwJKEnM#` z?T(Sl@(Pcq`$}esqQt^g^5~qWGtL_)j&j1VS6(q_7$v=ex$+>sds75zA<5LF!GC*; z_K`_e?Q`wwo(vOId~KH~R1k)z>Vzb_`KP7^^XdS-$`IU4SDGw>9x&(f3k$#02Yl^n zi*wjeeH8gS+tSNHGoNz<6}#b@>J69?f=BAWhE_iidefQx_jK_hX;cee222@T_&3sh zhhPUSP%y7p5J9^FTEPWIvF1Tipa}2Jl|6+GVTI>qk+bio_}~b8#y{m=yz`pzAK1t$ zbm41MaSQ&FfOyGID(UY-R~4oP4QzaU3;VkHmqjgd%ZK#5Cj4Mv;bK!pF#RpU>2F|U z-gwPGv4q$Ot^5{Md2LH;B^A(&j)DFE6bkzH^r8R}%&RUW-Ai8YPm%8Q^EFbIar=2Y z-7KU5mZSM24PSo;Y*per2nTGIAa{;|e^I(9Zlt$|yo&t&Um$(Z#anFErNTqIcRl+$ zAVI7^A?}N4*J2}@j>Xi5?w=X8{2_&|KmU88Q_WRXKgp=6R&Mk-3+VxAbfMg6FP1F} z3}wS@^+N8I5qWCRD^2?9HotJsjCY0vM?xCWk&8ZMZKH81fM$Eav8?lzn=3#7Q|4Rjm5QsC zrl}-C*{3kR4C)s8IH?yU+0iiF;6{W>V1cxcJQA2!=x5530rtE7^}=E#etF4xlpSN2 z-7=0`2`$?%6&9?)BVbb8mab(5NQ*G}N{hD_hM9vXrAh{ZB<5QN~cf^l=d}Zl<3k$mA5iFm=*#CEXM#=sUq#`YADYQ=hnv{NjT#+Whqb zZy9GOhwD?^=wotI)OuHm7GBuKWUMg2S|P;S^3&v1hQ(ZifMOrf zeTjJxQ37N*g9*~Z?UqsPC17h5FY7t$Wk6h&!CvUMZ6&>rqzHL4e}uL=MvJ@7;J8$W z<#~U$aD>JE)YYqsC+7y%T;naEASF2kP}s8&+2!(2Obt|gnJ11+#p%$Q08D=18=cS} z@Esm(z6@ARD`$Wwio2(Ql-}fIV>BE&rxkHx@i-7VaWad9DflF;rd;Izv=DnG*Xw-c zm;|uDyIw&QGeMitXSH~WEmMNCy*ytY*=9*{I=_aV8Fd4AHl}P`7HFjgL?K7qEUeEB z(ufV{pWN=ISgToBB_6|blNy}t=X5SM`-*FMveK1}8&*%Q>zzQieOa5Gq2O8)Oq!F# zWi}j+?c?<5+@A`gCi7op`M|DJ|lIre6Q zoTVXv&D)s(@WlTBw2HKRPV$^k(#kV~JUfv+F zN(RweYS><*dzr_!DaUV4iOtZzJf`yz_UX&1zi#8=9tLwM0 zLUf>ppS=m&ELa1^mn88=8p1T#V|~`uVm(Y5oH-ODKbG&hHSvc#f+mP_r znM^D&$ueP4ijB^-8jq-|DxoMsDKRYT_O#Q!>gDJd+>`gUkoRpnIUD`L*5Fxz6ji-f zKRamjl`Su1wZDQ!skDi>e^EM3)t(tZpAn-{Q)>RYZK>vivMnN8^bXPW1;2$B5|6VE zUg-W&F1jl&4kPlZi(z6hM6rdfhtPi^#2hnjEiZZLt9(t@W^EBg41K2apEcfsSz>v3 zD2zDYi4<1;3@CRe<($+p0YV{I4`97Kj?ku7T6c;XnxI&#SFdfBHbg=z6+jcqMQMJ> zq()mwu%&(sQ&W2Jf7Fi8pyk??=WQQ6ba8t66mNI6daM%rV;kwf*_p$hJa$Q=BI^Zt8GRNi?&mcU>N247i+na)Qf~&2A93Vo5@Wc)%!qr7bf# zdmR_;bl*jcDgv0a^i~#lc4I@U+EnJiCHPWt8_|*PAX%PAZZ3nGr=Ps`8n^@V)rzO2 zxGndYjdf2H@0)_A#+kY^o4u@3Bb~vB>mGR>EHts{j7u~8IKuE3ipKD$C?#QHI!9}U zI6LqPE9(jwv0%&6`c&Bqy=!Z`HB`;Ua+i_&+ib%cT};*=p$#hHRr(^vAMvvc4Exie zTCZIuJ(rsO79L%GEZtY`t4gW*o~w>_EVj$Mi0%U0P+gxCfZQG3H{eoOKYayiH>@L~ zH2d;Zy3uKyYmxH=An|AjD*J~;4gNe~Iloac>(3g!>SCL^=Z|%34GHS1coG$bFN)S0b+I#y1l)pSE(gVwsvVU%LvC_|BQ6u3}tGHwJJ= zS|hC<90*1*%h3%d6s%7^Lxy=TuRWxKxMbQoqg}r=7H-1n3U2| z5wr`Z$Jmit9^k)v7>~o@t0hUGE|PdRLRWKgaWEnP;f!HImf<7O3>hO~6M`aUx1;3A zM;KUWsO2kLepI?Ebb~^fqzM0LVjo=i(2pGM`*lRP2>LJ9haE9$GM?(KX`~bM%oBy9 z->-M)Pk8Vhvn+gY*`3G|(BUhXoe-=FzxhExtOU2D$rKaRD1xPj4+N))L_J7dTy)9U z=0hSNGfS#zBv^-6L&I?x4SpZf>2NZvk8>`vj4bRqoaqg3Or$2)j$f#6Vr9j&niHWr z3#TKIGexbzhfTk zdm{uQIl zAOb`hYFZ+kUo{Y6bd;!3ifAsYF&7jjmBp)PP+`4m0jA_6s0f%TB*vGC*t>rkMDz=< zh(v#ph$!p(oEk1^r`+JD>d_I0#BVl(iUNaa(79W-q9<)A2*|Lx{ z@~}YKgJTKVB0fn?ufZE8kCVKe_*R_BgU4sS-+4BjYu^N02XdaAf*`vwM<=YJWJ^3W z(-s5>ea9S_qhZ4sFy(?^dAtnRJ?G{l^jr8aXGkQcq#SyfN19jo5f6>5S5?x*-gPBr zS$mLXCYC__Wd}p1>NH`0tZGYTudnnq{r}3be~OEZs>-V+HzHd!;T!gTTmKj$#05W? z$wiX*Aa4q;ZSOZEW2ZZ)$qt*vf=TI^7Le-Dcuv6n8+!5NL_tXEoT zTJ5)RJ%If6QvBsPi8K4V!+Vln3qOeaq|j9FOA>XmrW@BM#ktTRov5a_C%sR*V=ZJ-;{*9m(eSC1QbM>i|U_>`174!k&4L_IX=Bt?fcw zK@fRMu(byb%D0A4&f})9VhmA1G2$hAH^ptS=fIK5^(8D0hQu-KJw(ss5Q8YNCauOQ zpva}8f{QyR!K2b3)>(9H`xi1?#$MBq#!ahn4_QA^7NhxwhhX)3@}Um-P`WvjqfZ-T z0EnH`!M7Z=&;=nFGr4IK!kDNh6LZ?u7 z_F(5@f81Kqi!=x|JVf!$hvTFp6|XbMf3tys#_1)j&cr1DwKFIdo!CLW8YRf~X|9Ig z)Zm*CE~&KCR@icNg`-H*mlq+o9e1+9z4_`4Ly;I|>@Be_l(N#ihLq2$vG0}vkD1M8 zp_oN!dh^kh@k>AeXHqHm;n&l;4OroWYFFRakiiC&u_;L@7T4`BWPtnSgXZY7&s7zt zM;)K>5Tixb-SFjP7sG><5XRZFzFg&6>t@jMyw>z(So#IdQpD3pQQH}cDfg^Lcs@RBKv&r#fu8WdJggg zliOkxG7Qa2B?jnigNV5px(ML3vW+=A7BuWg0n8y3BVlcbJC%C3LsE>#J=^&l!8UYT zTrkZMIZi`7$)Nt@e{3nP#$?l*z6U#(H-He;!Y4=bbM0R^6_I913VFB8ED&+9?PkAC zR)NmE9CAnWXd}vuPl+alWj-N#l#2fvmcFU)Z$jZ8Vq${i4TP@A5k<+iL{q1=XBPKz z7heFoG9>%g;*&?pxg#~r$DYAMDq~^5S};g_VlohSz>{^_wz(*#s)()Ni+HQ`{-w{u zUE~O&GbsId@MP?FsE_m5f6B)aNnBQ}!3wa=d@F@Pow&7T$=8CoMXd2iwrf$Lhh%+S z60}2UIBbVgRwi>#djt>~lHf!^7k=Dsbh*S57e4C*3P}o~RO|J?gH%F)vBcv@5q{e& z$rP@*j+jVkgA%ZGzI?j_$yF*nTDQ(xsrOnSs=7UKic7(Cr}=c{uo#yFMw!I#dGJ{Y z5>BRp;rOh@FgT~8rxJ09mg;4`)M+gx)iF@Zm*JXYXKwF08Ot>^9S{8-iMa5~5M-)>B z-npG0(hxReYkW8lrAh@{eN(;A3VJW)@nAFlsdwBVh(-@ec<_tt&h-)vapt$q)|w-r zK;=kTfjbu51AS$BKYRBIlLU*KjnT*;OU=?|&LEsGv2Au)iL=u%hn7y&_3p+d(gJ6Q zaFgj(X!F%(3a&YRUz4@nVDldEVZjA9q51M6i|#!Q04Xt*lcJ!8DGgm!GB6F_@)5yu zZD-T;ex`O%hIHX^uS(MXTXS&Q#ZKkkMXbia!N9cirhm1m+?UFkGJ(Oby67NI-I$_p zCmQ7Qx|q8)ik|vxHQ})J5&g=ti8rX`A0yPr`+VLvBD`L6jkU4{mkTqY+EFcM`bYy0 zzj$IgcQ3yDr4kF(JjXxOl$eQcM{2ajwKn(|^@Mtvwgx_nGb{xi$z?yuI8MjmNR?@s zzhrzK&3@OgSdv}KFx3@DHC8qSSAb3}){;FL*lW1|Xdd)|Mxf1 z*`i1U+e{5IKms$Ous6UXjRQ;~0iuQ{N2)MZR{>u`?C9|G^1UxF)M@QmscRQdFt1BG z4-GfAbwu2q?eQ42*EmOMb}Z+sJG-ru3`cuR*Qh!}*y}ljSDimQO??6HKOjRQy>+%o zY}xBuD}XaSsxd)o;p9?RUxb++1z;w$_O%Cyq}yu_w$)lf<_>q9Fo)L-54NC^heK$h z{f;@tI{_%aR(19vnF$$ZF+GtbS;={yql3KA3wqn+;}*9YA4q!kX`9(LbCr#wwW$^J zYatGTDy-*}m{h)gpDAFkndngK!v%WY_%hQI+Z`L7{CmzNA{-YkCA={5LXp{eKAM;I zGnEZRT-VD?FpJ5V3zPFXhMs=Y)I&fTJwqDcNBrUMFcQ~@Z2ey?p?7L+pKbpucq!hAbvsna! zxUm!a{O20nmO-nTFSqROp0nwzsCDH{%N+R9sZ?-s+iD26wyK9kvux)!HyDb=$30JC zu|&2P;-pQoaKU{;%jPxq)ornK)U3bwM9HvW>(vuwTG<)cMMuK`h)lOaXy+@ z@XIat?q2Tm(=?7N;ph7Kn*+I5Nd!}FZ5&QdeL6uxz3?mU*ETVi*q6Cx(5OGZgAcZ&fNp1HA6&d!Rv z_NAjeKO-_Y6ycmIZ3hwhnG`m-DxK~0c1j`*S|R!)t=IRqIu^Bg^PpUnfq{1r>{;cV!r%*p^&Oq!-ZI1LA><5__V3ZaiKrEYH%?j z5?fI&r)&w!S*IlJjq6VAhIKOY)WGB%Fru6fZ?YByW|35mb=hV!88D5;8AG{_GV z79`@ew0Z(4Hg@KM!mLOv>X9o6)A3vnW*{?JZLS+oPA~;9;H)Y>J0E5$hFn-KB;}li zHlGeOkk&;DlJW(u0BpFCqIWODlS-<=$B|$5qU?C^SRQ%^BhlTLAC4bRNJKGm<*&b( z?Z_|#yMeh0$5_KDje*Ti`YB=)ESAT%njRcG!d!FJ*|?&{X`Gb+QnjL=&+|6O3lcuh zlLJP9sGh8hbJiA@WxX52JCM%^^`^0kx3O1A)LSiIBr~Kq?;so1T_~8IpqEdPe5+R% z!)5pc0AMJV9}AH0QnOYaGYr~Pzmm3pLIHIIdUw~DO^=aXb$NqV)HbmYok;+G9I~Hm zx4)kaXsl2d?`bdCZtJ8SB=I7O35FOm#>U^j*&G7rY8y616TRoWQE8Bg2N=4p4Jr)p zd~UB+Z+ywe8wW-N7t(6d9*mw|82h}9OU>r$>u+ukeV{srQ5lh>L1d2|T+E6^ZKpI* z*!a+Zt;1=v9W4W1-RGtMy>q9Cp$0RSWR6+nK%f?yrI_l`37F7FN|<+TJSXhUjO|zu zv$^v)ml!yum}L;$s5f(5cxSHOWXF0nVY4U5)p;Q0FTG|f;sRv5h52;coT|vYC?Ir7 z#7-HuwWq^_Q(#jN;3JWwDhYbfhWDX(Uzt{;iFKd#xDzY87J8z2+|VT0syKbw;}#Pp zT=VKin*i=%`8~y zT5O(FDr&yck}ZmD0r>K2jMa4}`;Ob5wgTqA!=NPliEQ7xHmMY>0rUL${S#=@bq==F>)|I0_sZREqI!U-Eni@_#vK1RB zzr2sg5JZoBnK=$mBi3lJc5mF10T3<`LaEl6YEyYv@kLu$=pNnKztPChm25=7G*w$ z?`dwz*p?JX6g7ujS!-S?M>En-k`Iq(DAw8dqnc8k5<~m&@|J@#O$xTjVp#Trn{TYV~dD^Oi&eYvP~)B*^?@wnq1E8q$m^?QH# z;!)6|$iRgBVS$t&dsik(R;0}#Kb{CuuxUEbq%rk6HFWdq?oZC`pM4$6okG(Zn_?2h z(}gx_`Szr~?WeG$ZLcR>{ zjh~xov9Z_*2lzN>K4u{j+;u0R!)c-3iUoXCM)a_9?Sw9e$nzWQ<5Bg&OM`Nzo#_|2 zK50CM6J1z-#<{Few0an%sUx!z9lYJ#!#000En0OI&CsJy%>4N*UiXkBdWEC;B|Wh8*f7=bO=d^61#JUYtVJW5qEaA^ICB}^7QAgF}2~LR(LjD zcIm9YOJbfBov?#o23+eMY@rKE;+h6S2jP=e@O3K6K4M!$Ot+d&x+Gp2Gg=%>F;fOE z*0K1)%&!`KHaE9by)uYsC7k%6CNFBb0tgu}k$pqV#-$o@M6m-=aalQ|`gD+xzXsYN zCoKovlVR>p@t&M-$8EoVzoeW@=%Mrtm!pnWV`<2J6~-t$nF6KjxbHQI}erTW+-G$0zsJ;(n>RLnW4pg=QzWHya9uq`Z3JMS|#r#!2@h zb7C@P?J0P8pXEn_a8PGD;zG+K(V$iJYhL@So2Uj~OWF>il=fI$(zT}4;DGi^t$xeP zK6nNjFIj)jhf%Y656W$k>7RWmpbC@5LIn=lw-&eR3;wQ~9wsRCw>zyDWXX*mzE^|< z(B9iAC+pQ-^rb)&0!`~m8&s(&$=9GK(dSi(NbwmXQ>L@!%-k_M!Xp}raagR+aDH*A zR|&mmgX*ot``}4lSeAcz-&fd{T)fE$_aZafcqgW$<(qw-$X%JxqJ{qbHlE z+(9XS)g%)Ipq)#oF7~@P_;>o3XV#?;=F)=ef+g9vY>Na(=cUGhQD}}&zl1JWQe=|K zou^KxhqVYVQfAL_jEiN8$dyG8mH{>+wxG>s9$&3RCXM<6AMMeQ^2zPN2RedIY2-w+ zbsa2eO#f2uO8|!_r~Fv2xtAh?eU$Bf?Y6B*#4yVJVPxQRi(hb5$yrA9SwCUa=aYeJ z39VF}xCn=_>$cj;6*(%8gMO31SPxdl?$16Ekkdy{Vk6Fo_9hRF7ab8noKzUuODp{6 z&p%iSB6LDX@_avff{{-mSH6gn+dQ+R<<6C%jv2p}JG4f^?6wi!#24&qm+J!R6)5%!rwwwnkU#ScLHM$Mp#;z zRNWKjW+2_DnQT=+dDp_@)Arh8`qcA?W)g3L++(uqWLcyp-rQAOO3YzTMk|B4G6$z? z)C-3s1E|HC_wBZFn8AEfi;Xc!Bh~C_Y-MhzsssZrsgBA)Y1L6yPR0C6bbA<=2_q(2 zgHFY-l8ozSl-Uedv+`sk%y;zGMCm+PIkxd>GR&!6QJOce;(AX> z_Ac8Z@6l;#fgFca_K^|84O@_7d4e2^I(wx_bUTIV0iGPz5@$VGf}xG6Lw1C3i6}B< zj)El~!2_pKDljXhlF4eW-t(kXrDreBk>-W<+u01=kig1GqT!v*d9PqzZ}426|4EMm zV0dU^VyIvtaFjUn*LI-0g9y(7x5RY+G^>;fD6_Pxiqh#g*{%V~%a}izQtYHGoY$pZ z<{I7k@d3?*JlI#Z+m8b@pQ~6Zr~pf!q!;*pKXm{LrcC+xX6x`)Gfutr!VYYLCy7M5 zm0aI5MM2-)iW%m6(6T0#sjy3t082l3rHkd~oeNpc&o;eVCjU{*hgSx5v+Vp$F|F1E z#i+M9J%<%aYjh=&%W`K_E<{ABkG*aArMdI_Q){foV-yC9#o&Z-n}N*e;@h|2J7l8; zvl*6n$+$FRM;LEU3#lJKrZHQCIUEV5Ql<94&_A6q?dOY#HwP;eV zwtVUd@VWimwMUOT!-9q8>r6(fKwT+SDdp48YaQ)`8N47gLBsY=RV}2W$+d?y1ov8B z@68^ss-$TcK=L`rCD~=TOoLYKx5zO!F%7aSkO~k6WS2`uOKAMDs^3RDGJwS4fQB%n34tMdVLS5Wl^8eTs>ts1?p3;2iC z`~URB<5y~PuH(!6q;tIk4bzlG<-~^~a!VT<7QH31PZxiAc_262Z(bX127DUTA(3fl z++~P^qCkxpX2CcCB^iy|FCgFOKciao_1xYjtmREkjqqjh&2|57bQW_$5F#e}1BCJH zZ}s+Pp43S&Dq4=m3ecsEu8b(Vo;JNXY$WZh5$-j0_fg{ycQm`3V4z+}Q`ejOp7VNJ zFPOsY&M^grhL}u)C~I;bo1SuzN;bpWI8PBS2{h5Z&KKiU$>x8sKLUh;Q{qTeM{m(< z?vca1{%(nvh~OKrbf0);=(dHg(f$((=&%2*S_<+hkS;8EVcNMd#PGYA%U&`@hd)bb zI$j9je!4xn4oUM^*DVSA1_x#ro*6%yH~R3n`aLXH>e!NF-s1cfj<7FcHAbr~OJg4? zYFoH0D00+t`ciZymY;bq zOEUUQAE_3%{SO2pPe4qu=QBNJJJ-I1Cvi<*b#<=p#<|b48QWcTl+P};Vn-Q4k+rL2 zvQSQPrJukCBJ|`@BPBGQ1{Pl&_(?3=WO-24$jS9m%|B#zoMU;1|A^lh+!l|U^gN#! z4eQZ^(xWt!*S@w?n|5-Q4q^BIbC11DF~) zAmSGJ&P_$aTEy!)?7MJ#am|U&Wsxjvs7X8D=I}Tl;1i(hghk$SPM-se`_YJ>| zpn-M9X2t399>O*DB5!7cH*91dXteu|^ysuv;vrSFbP*5Tne*4t_?f+{&PP4eM-#=$ zk0nKhPDE!*4wv`Ocg4YJhBSbVg!(nvzECfZLl7&>e;`7&I(c4nK-FDkx5mM8GoZ!; z;t=#V^jfQyL+6g9hI-@Nr!z-?77q)cWIV$*UUt%fQ)#f)aj;0l!FWZ8y{OLxuT91(ZxVL3yINd{XlYCHx8bPwS@LMqnFdVf(G0u0=fQ@=;PW>A60bWj`+$Mc)p9I3jMa!brzXev$;4%m*aRe z!=Ua2sLVtg4%e90U}_67jf2b6sf!h3*~ifIt>&eN*38z&f|l(+hUX)gXOblTZ#g|qYP*T6)Qxi{xyutFeRMXsy&{RSFXHuX%(Tsu z4&!-25XMM4yDuk}dCSoEj^93pi53rIt{v_1=yxEa8RlxXVb3RugRKr{fKEDFIr+K} zFM`O*OYlV}FACs6ay6LXz6g=;L$VFE3CT+2eHIrc#O)OMSY~kb=3Ghi(dY_k!Hs;Z+4?KsN9P93eID_DFU{H1 z0pq6Bf8r>wG4^uuv$=Ya-uh?G76uC+y@}#M zHI~TauBk7RLQ75$mbUG1ebuW#?%_P;4L6j_nLoHpoO7RukDW!lzf znLNC=O6BKXt<1eP9?SVUfMTN}s8>Cv-&qU00ZRlG8C7pz0ma0Wn@F3~Nz5Oal)fvX zot5q*y~eA*zOxvsSsgr2FOE(5uD25}Iv7(E7?1^`i{_A`B9SWh&A%^zF>^cYpB|(O zPUf6OM?>XXgTU|jflUqUG8iC8B4coeFHy#@OFc3?`RruBmUo46Y;G*fG?I1S^ID;H z65EK(N1b`cv)0eR$l(8IuIDcW(Im4->bSKwduVjzM*FS)y#6zFNimKP2@u+N`GI57 zahT2HjPy*oaopkqTa(S3DCJRN{(zwFVhO6>x{^}7%#YMD@F{{>BBS2RmIIYb+#U}| zSGPAXY7&j1AboH3=hq+=++3)yOMoh%C*`52A3~r4%Z!aLpV*#H;9s>^k1;aqH=_f( zAjBUdLb8LAIbIt0NqxS$Q`2>;)u+(E5rbj%`e63@XhpUXJCNs+~R z<+tGZgtEHB5b;5mPYpMNAPAHj-=xwpgG5kHncv6tAWb;-fGyPelRDs2^muRY-0hUh zz(B~$7qg|uoFW>oHE7XD!WS5KBE3W-1Y>9nSn@*-FIOiyiH%Jn>;;d{j|KjWuAjJk zc(g3$UAd?z{9cK?&qeUw+aC@TLl9C6`a?jflh=y0bVWSeQU4*AMyg`)cOGRI36d@N z7Zz4Gj*H|W#p!LG?e>5KGMEr3jLOFVB(5X7rYRzXfP*GSe~|sCf3=|VxsM$8F|^wm zs}l;i6j(YG)s0l!(&4$@f#358AkBQ(YPQ+D!qr{rBakjgiGAlty~1YcPOvUO;eVD( z%jMT^Q?w5+=E!MAB8-o-RuZh$X%~SqY9@;3A7jF%Jrgf8^`{j_pQ>P!{NfHDZnM@H zTIZDjZVR<{lHzkszp5`2w!&NV$E$yGj?R;EAm)Ga8u>gL0WsPSCRL}@o7ZRYiM+L3 z`{?vg;`xMiIR3Uf?Z?_6^Jw*WMD3~mnD_Wj%kYXN?g*^v(aB*ASu|VsXal6o>Sqfp zvbnnTtToNF(x#%i%_fD`CzFE$mi;Q&H{i1efJ;1pE{E%{$C%E`eXL+mn+?f>MQW`9 zL_7k~$4cZWH4LLd&x*E`S=Pu!aH@rzuj=;(3` zqhBOuJf=H{OZTCAud#m9bK|1`_l#(n#JnPcNt=)I}t^;iyt>HPDLc1u)3~!nwgWx4sX)F zBtw0ra@e$fdnNz8D}m)2_iMp7>h$W7YVN|}nR6=Mj)Z4EBW%Xo^@NjFECZMN_bUtK zZ#Swz0{$au0l)3SN4aY) zh%rRSsVV5Vt2fuWn@vO}VT8fm;C9@C^wiE=!_P(ejPN?A5?VDJ3Y54IP&)kzZM7qk zH>%Qh>J?&n=Zscs_7PG1gECXQU^uGF{;xHm9_Ygmgx8aT!JNQB)d8W@rQ2Foxl)|t zB~cdQ|DKePinQ1z_x*d9WoeO6Te~+hH>dlio&5JlYLxXuHMCKck;FZAO|7g;?Roc5 zkmz1Gy>9`iyJ+V~l451^hh<={Lh=r5wWL>Mwt@4r@VB~a#-y@rz&~%ImE9v! z=Fg8{PEB?^URfKY82?mOUUg!x7wG=i1xepP!lFMz+T|5v{5`xT{yNBj?uq;VNzqR# z$W_J3-AE;JC+trJ*eB#}p4-aF2M+p{zYelzHVYq3|HyDQ3kTXH-JMB(%bQLy3z(CX zG_d8ac6Usu@2!8wLzu^1A-9!Q31uatl@rMb?Da681OBD@fjhLA-tU{wasN%Wr5RO} z;`!%7kl&8ea6Xn&8`9VOKPR<#b-V&de@2eqpZXW{)BnktGKHI0>4HVr8__MMDth}7 zQ5QX2M1ODf@n9Vn+vIWp!J#2aJvG>VX#AUeAccZxg9%0661PhY_rJ&<;xq49^Xq$z z9`cs?Dg`+>r{vM(tV6!kj^jBF@#?CqPz9ekj1c_SeJ8>E8WWu+)733^NV5)Y3+e?G zVg{BxVP5KiI}=NQ!G)D7cD2nstt%6q5r&qu{Y+~%;27m&0MT8LjQbPdJ4#If=`U^w)8>QJvaS22c;-F z&?3J`L3VTlcuCWHdB-(h?47l&SF}$)A?Y&Pn8*N>WxXmh<|tW8&S+Db&b;J)+%oQ6MPiwj7EBegO=u1-T-k$sIK zvEm~AGV(<+@qF@vJLiu&4wUbsgMfzgOsqIvaiv2X#RvMUzW!N1Ur1_|!4=V*l;Z;e za_Zu5iLT1~Bt6lhnm`zAb(L(^y7;*R0ZdqiUgKrlYeipnJJ|@Fn}q@~nXo%1UD;e( zx%H~x!{m^_5uD~5dO6sO09imd9d<~ou|Czpg6ixQqeW;FR7x33&?(ikKei>``aY1D?z?0XO?11tTK+z;1#RdrF$ zzHki7IF`ARKHnCf3`Vfc)FTkBj}@tbQ?~wqlz(Q8*W1Qh<_aADxTNsdonx-P_TA$c z?8Jho8UW3P=m3Kwnk*Xg7b&h*_Z??VV>&5uVNr}h6Q7idR*3$56_s{4SeVj1_Kck` z&Jw`Ns|0%6@Y~}GxgFX1$oGN{gvCZ-)GxSpRAHhhF|zp$1_Pf=fBGkLYDy{!LZ$iN zVi*@-5KovYMPMo>d76E{zbBr~rL<3+oo^`v(JWhn)Oi^G zi*a~c{tq?$%yDBza}nRIei4xv%gLTjAbBJ8FzAp786&${@3;(Vm|W= z-J5q>A-Wnt3=I*JNu;~8&xDzellkIji#*hD*!EZ?EOaDA!Oh8Uybab{_4{fkLQs-q(iP_EO1E?5b4N#SqQFtpid2++6s(Wo^>ot;TlHLVq~PTo?Ww!wt? zTaSXg`G1dYyKnyZyNxJUPG_&HOsHXAKz|?fUK6+Wq(m-Qeq6X!#in2k?RGA`CP)bU zXw0%cu^As6c;|593}h11(P3yCEomPmv9od#vs_s7a#khAmT$IA^Ms8mqG8j;QYFXrAms;Mq+ z7sLhv0xAg7RTQKvy`v%^UAlA;=@5E{pwguG4x#tndzVfKJwWKah8|i-CgA&i-#7Q( zHM8!lxik0tm9@^}cRYik$YEB{mqW0|O}%W*IjtGH;V?$#I%gc*)b zAb0X5N+_1kjz#eez5#`tzMtsX2`it(xsS~8a1`5xovB~m0} z*ZgVJ*}LZQp$u#KQ<`Xf!nf2XY|)Eh`ov`C{FMK8@bf232NS}IMW<1lbE~{!du86= zq`s~~&DHb|nz{vzLun(pExw|lNAOuUlhlG&BmvXxJ4&EO(T4-G(X^CMd$R}f(vzE% z!fPQ3l_sUH*%`N7li;#~=Pv$%%WU^FPc`4V_qmzY{j_n>m%J@L2clWdZs6SXj-+(h zve-ptsPz4}3K5|q7W?Hz`0@){$XjKjx=3SO-gdZv%eVhfL&S5x)DO}prz=1Xf5iLK zc-fARzvR_j70Q83aOpu~a6tyAOp>()TH$Th-MKyrHOz7N*B4;&uZmQuV~oT1j*x(JJ-(uGMuQ@P z41?Ap1{4J{Hw4!h{)E#0t29|+&iHp^|Eg0MR2HlMP`-W;{`#Lf|NnhA*8flH*$=1+ zrVb}o3&YF#@r8}5D))^};jERHpFgz8MG;(_m6eyC{^8wqUdDpMpXCGoBwOn27+>FP zisXqRE#4cOe7`!su#hAmcOLcU{9If>U>bwPbyxSMklK-n$@xQCnBhp|-^F@9Mg*i7 zvjT2Cu-t|Fh-Z1Ln46e9G?9(Qc+TaWg_=LTwcVYY;coA{S!9&F%g-b(YKPVmb&*lDIYu19|^RRW&-F z$u;J0Bg`Gye>KX#gGoL9f2{ZYmvzS=2uVg)KlhwO_UZC4nQh6bsj91wf?jg8dn&DB z0A>GPKS(hMm6F`SifXOzLBb6;0QkZHfL0Kf^H13hpIYvF+FxjI-HD#*-LS}}pK z@l7KJsq=j{D;W+lgZao6rF_!s$(9-~A>SEP|En&R>EZ8^rGZ)Q^VRr}W>2#^ex(3z+|w z=9PNSG_HzFJ2IJ)s${?|$xah)ltQojzSPiQ+r*-X!Eo>J1p=t1X(GTG=_= z=MkST3Khr*M(FHa?6;8njD7cqJOI#nJfM^!LTu)FOO=^58QdiM405Tm1Ocw z%)SX)4Pz-5=gNC8SB>hBlQJ9Iq|AFFAA&?^j+w^)_oPh;$CbIgY8hwp3&p7_gwd9doyPHqLiMv1 zb2yzXdr1H3=QWJbZ$j6Dr1iSO5wp1bFP}mQ(+%fi6Ph*qQ_E`z^2pOi5b{*%J8{dg z%6(gF3k$33`+4Z!_)8ESJG{81m1ljzPA^6Dx*kyfS0zgO%e4~4eT(o~;hI=u$zM?W zZDLOmykh*v=+LPC!m@h6BQ8Fiij2%b&#ZbCQz4c#EpY8$6zVGdBC9F)Bcp2SX8Xe! zAq*!ApYx)$Yt;)zR%Y(2&3N8D346)bzX!B^WlH&o0fX&gMoCZ3dV?+__a&3Ggil5n zihILp;vz3UIFY?JA!bZSv-OC)^2#1>J=*?-jYsmwZ=l?|#DdoetbZq>RjUZ|dF6|T z-X~`)r=VwOO-s1^5fdpZyg7kz`_uPsdy~(y(Da@lTSpH7Nz(1@p%^S^^SS7`i;kkU z3JXWhQSL*j@RcgxvL5XK_#enlj_{W5w{4Xom7lE8{*{ z464oW8*;8czjfUi66pXg)lakk8S>CO%pS5q1h`L~6EK7P$g^B;ljw_=zZv1eX^Me9 zcr5lwFpbmgq^3HbHvPq>XSiZId|}sAh6ekd-nUa#y`$!CuAC^Zw^`p_klLKRkXwE< z2TvC~C^OZzxxuNC#i&P>FkB%WEod5z8uGVC-p=i*)wf02Y~&>=6gDU|H6Kt_9S>vw z04u4Yeo(B`pYsFtCGD68Dd+xOvy)T~eu`|_jeb9QR~#RNNB=W{SX@J}C%yZ>%$#AME72WkkjwTbeA@N1!mY()w$4-Yu zSu1u}<*5Iw|7(v>@5_`rMGPpD%wiv-d=l{!=RWIU79!7HmKXnk*jNg@llUK2u>6Mo z=Ta+Nmv7zrQQQ$CB%i9QtDDAHz;JU8{aE{MNcNPH@^LQo$$y5|P1OI(iK2YHuX^v} zKQ7j;i|oX(#9^+!`fzDNfAalxf?Qj280Vu+ zZ|)JN`i6F`DoPCcdZklMxj#5!ez3^lGsEt?3!3N~%1_$FFD!iafDFICI7pv4FfVV_ z68j9I@r-o6OYJyi{dN8WL-q$PLrJPR*B^2hk7}fJ9xiO$S33P2fGVxTO)UL_ZS_a~ zT9#V1aKuzFJu}{@T81x=b%!cP!ci{pRslUqZl$Lcrsux+8nc+RZF?+eng4 zSIUUq9E(5XeKE>bBdfiuCSPz$%Xuq3t=NZhb~wKD>jFL1hfa?D9C`|Z%$%GsePuFt zj~)4+-Z79E(WoZ7TWn*~J7IK-Q-2Uw$qY5%vT%!Wh!d>rNV0|8N|RH} zr?H44)SXd=&+g0PS?dR9!i+pyY8EqDU^d?e68i4aa_WBV%!0h1-{1Ak@cg=R&HWX@ zW_if*GHK(E7UbopZMlvHo4v0( z{~|l>xH)%q*;{o_@w^a5HeA~BNuS5AtrvD`uzbTNW;&6CL6pP0@jAXUzSjKb1Rl^U z+sd&okl5ahsAF){t3$szpMdjMN4WWYUJOkTA^4Sk{9!86zVa*c``zuGjl_cp4bj|( zVxM;~IL@*})zaJ8}{CJXKcAG$;dQ_dQEC*E9L7e#jVZ!5~_EGLOcg>HY zTgn!$TW{oM*Y8^B)_m{%#;ztqPgDdkUiq~uQaw=ri}Z`KMy4NjH}CzgPhDB{7T7jR z(w4bAe#YJk_ZG6ndn>&vBzag2WK={!58a&*5fD4Y|P z@r4Z!khQ$9ZBARxUG~NuwzCMkKib+g+~L&rZC;U7ouU`D#EgGTyi!$M<(&8Q9McMdX34Zi|)cY?JA|eJF zL6Xn?tc?008TYi_CdXjwI9)F9FA}E>tBj@opZIQ0(r#Ju&TobU=M;S{7y9m07naNqo{VMp|XM&N*0fpUKq!Xgj=c-gP!5w&S7MZZlyMo*!xt zlN!l;O4ty#_or~v{rRT`+a+1|w6taWmIG3}x!cvvsTPi2?&ZtGubKqnuvv^`BpR-} zg=LR7(1rn|A^_^oSlvRQVCnqcrSwI|6)^*#=ee|>72Uvt7;=pIEwB2XM?la;|oh}C#PQ$9QX)k-4 zJUve}^dw2RUZ*>Lk*nAo*Pug6P&|AQG)G=~bi3gPyZ?fPPL0ca^PMzyBhl!3$zUlw z+f2O2zO-{sBIu`}EZx_rd+`#eWsj6XFES9YUcBWGeHp3u z=3*+S60T9vzIg|#W&5Z|O@5=WknE^~x$D?S6S>v5sZ-tocDNG;@y8C*01^*V9b zDsyk^PAm|{mtURez1Z_=o78zc29ykb#1#w5O_ZOrPG$S~-HnoL{uPFSLVIsc8BWur zd4PQnL*Da+?kdlu=d$`~%8jO0LU)aidl##o5QBI7)78brC%X{z*APsIjMn*T5!BYf z{!i!$Gt$?>n*6c<`tGr!$X)+82_Hf4-3oawKSAfq|5>4(4&M1nUtHr zd-4=%gQ?1)rpglW$2|Xedz4(5Z^wcaM>CO(G+IJ};p8oMb_~)Lsqi6RRF@Cz`oqQ4 z^xWF%l14ZV_f(k{87Xxw*w>e4ZpR&}VlfK_H=+VJxCN{zG5_7`K6aMk!ooFcP$<>f zJK?*x^-VSE=4DGp+n{g;(HDOkVqvikFWw@gG`FKs*q_&7D4c(5SMHgU5C$8TdZGBL zYAe>jGYIjtFe{7v5qZkN+2#c|?X;%We`5Etj$@j$)qKdXvJ%$W_0Ck;8n#wdw3)J6 zZ#PR3oYWfLXV)v^&ICjXD?D#IGv&-a+-0yK7A+(pov3M}I zW2$+4ni9K*)F~ERtnk!9wv8&uq10ymfDX_05H&{wo8>Y0`|w9NI7T=?xDRhau9#Oi zC)-;Ph3Ix+tC6y(K9Qb%EOuvhs(IO!0+9+@Un5KA^ElBk%1^)BKOXc|fIs|aB+g(A z-4~%#>`xid1d+kftf-DA1XRZiw@9nz)Hrx=PG{NHgydw%(CiXSp+|{4J2E@AV+)mT zv_A-H3%T=2FqK$hH*%z+XPCRdjx~09)S!a))W0B9Fneq$rYOnYH=#BfuWYaItmTZH~iL zknK``dlt6NndftB)U)39A|<5@dQ6+9C4ctv?AJ@-DyB0nT896?Dz${l6&N>sB+kSH zSwP)nNkVqJhtV+i=1gWE#(tBy29J#@!C@!#U>{>{ez9X|h3o#l4S!8~`Y+liN2ig6 zNZ=a1kw;Jle1@S&m2n~RR)>dVJ@|0PYR<3sH9L5~Q&*!w9{k6uKO2oXLxe6b7l$mS zTOS1)Yl?=31h`x@E^J0V&iF|q(fMKS_oBy+ z>Hvgm!qRYE0e61&*}mS<0?}Q-nVxvzJ;4dITP9F#C99*%U40Lit;;N0;ajMlyyu+p z7#etNm-p$y#j_`cTvNq#_+^V2(LL{^deznkntbDq=1qsy4T1E1nfEY8I3J%3OoBU(?$1?48;8>AQ$-af1*f{GjAZniM6;m)n~ z7RnW67j&eSH@O^hRWa=#_gGHScm5`*V#L$(8ZzN`kGB-DFSa`ZXi9z>tA~E=($(vt z`9(>Ir>{dwTs(_XZrmVFOkZ(xbmj$<4Xtv9&yl;C7xg;&_cKcs(81+|T+7}Dz;usK zzx}ty95L$DOLNK(ClZX4z%gczN@;5NS#SVEilV{=B-g02iETKT(qy^y##y-ONV?v9 zN3MjH4VY9IHg~wM1KhiJ)*6huh(r@jDlOoqT3iM0xXN{cQ}(~@IOKcs_FLqgn4)DD zS5DlIP1fs+Ar6tr5Ps-Mvq%c$WUXCvu2Bc^YfGx`Oe?58bzHZH)_N@N1nQ6xt*xlH zIaKX~EJ<;sg?O6CzG>)B*UgTaKU-Cu`UtrhoE zYh=vXWy&Ub5%q3^@H}Iw@w(N7WsA-78t=B_T>|*?d$dYFgMtRC=64%ij0JCtrlkZD&5aQ(;YEZQcoRhsy*k+9Dv?Q(sZROxUEI}}BfUOuT z8>;D@qTwi*;0rKH;; zlIFhFPOtKxx}M;r47Ice~3>q=lwiIT{aJ&*mznr$W33F z#^R%SJtw`8R(eKRsU25zvTKY&}N89=gIG1o8LCfDLjTze6v^WR(?DL|96_F2br!;P*;6+$x#~dOATbR+3fB1j>zQOR0=PH& zUXBpGKU_c0UeJh6drU@{qto*@+P)w%?%bMY@>!I3uWR^wu*VU7GHUUg2K2>RELs=Y zKgO6@mEl1~8(P?}PILu)aa9PvIHB?>|5@u9-vaS)L#@_D&cR1mzu=Kob^~>4TxTzK zMdK-?sq}bEn{C=#)6hrLpQB|rMw`*k+yMhw$Z=aD#Li@F05KBhlJ`qcC!fBXb}$4h9l~OQHF$c-2j(}Pn)&Ffw8&OOe6P6(W4lL?X{H^ zra%y0ooPSl4?6q4U5?4v2W{cVXweJb;M3T7c{jF`43WJZ!$N|nZCRzLci}-8DyK{O z8;{6rl2prAV`JvenO$1eRH&=(@&J$|&iXRL;Lfa5Peo*br#d7DWR?)^P}D{|;pQoP zETgRyI|#r?sH8F%Ml4?qB!fBeQBKpJ&kr_=4$$MgE{j=!pIa@}z;MT(_IGkAHVrhd zkI`1)`~y-dLoU;iv)}`E%3%JwI$jE{Qr#19Ok{$+V#8$pNrJH5ip=g|V%F1<7W7g- z`L-wYk#*|r%7xedq}RMG@16|*$_T=tw*Dkg>9m7zXNZ@rK80p_;I`l|97wb(KE8GB z?D#Bxm&$O=nJik6nm<1r_*Vga$L(_e<}T)6PF^fv9>ZKlq5rTM#0lU2o5u7NaUW9@ zjJbYH(JkEk_uh|+ND&0Jt%#c^u>qwZEn{zIcMK=V%r-?-iV%RAZ<(a!xFKM_l*D~$ zfA31II7OSkGT1IB+)gBEvP3x%k*tfSWB1N!v9*s;Oweg#$YrAiD5UWj{y}M_<%8~_ z>3q3dH$Y6z@a_*cgUQnp-E3V0b3C_Tok^0BysQd{r~&(mdIzBxx@oOrcvhftZ{g_h z54$6X5w0n*d*_E_VB<-kmA4QxC#w1&_PcV1Ki**Z2yfFg_XcIr!wails9~cG>CL44 z^rN!JK@7ZLa`MSKF`0Fq6b=3EcQ37)mYnws#?8Y}lI)81hH<8ZcrX(2NW zMNYG_*i3ZJ3sUdy7z&0JTVw?9oX$buAnII%U9>>xq$B@y?(+Dn|KoZ+HILY0SA+|L zjrEb+9nkjUMh>0L#r!dJ^|vjz`ImYvAe!^JjT-fxk*Uk3nbA%a`dTJ1$E~PL``yj$ zm$rl`3`eefe!piLu-RB2`lQ23k9ATXb8nrA@T&A{d+ojRs<>$!tk6`~>f&OAQf*iv zrT$yfZ_At4IZUKDV5?P*)Y zZ;q#&vvYyK@KuDxM69b$JjyCOgg5bRwM%L|1?}I=PS&M0TGuJ>8y93d0diqnWl&1d z-yl1v`y2#y*i3%s*9&>-u`ST-5tv=0njJ`W;xbRKq-nb_|NgyR(HT9e(*?-Yh?8HO zWU%Y5FRO8R0ocK*2CbRiIO=iUOwy!e|JFd6VG(OP;wUeAXJz}f<|-L1XF z={Z$)Q1h^5-61j018aXHyx%e_@^wbr*GAn%jhJ$WmV*vY7*eeKAbxRAcB7CaR$+G4 zUH022D7p9H)PbESB}UK>+J~c*C49<3wZO{u5-$$7I^b91I<0rym<{l=pj4d%Ec+Xj z@&mxstnGOgB`PHz^yu;pqp+_6b(Pq~pjPP^Dn1?7NRSM2;bHdZlw6K6v9CW~QRdGs z`JPc(xsR_3*#4e^R$`1rWmMMi&MLNSYaK*7AjcI12zL}eR8%5`+@K~N{bX)mC^4V+;v~>9_FXQyCkEFY`bOHyr1{amig~SlX1FQmR z-asRdJU~+io4hzOC3G#9Mmm0;d?(_UOTTQjB(XW}!NW)La!Sn4^1TEjBBF6~yj_n2 zvm*xuDG6gYe|@^ z03M0#+6EC^$mH`e^0n>kdc{2TuDPBMU&c$HCe4cruBR)-$xVVz2w<0PW=;-ekgcZR z?bG};WsKx?=IN;wPo_PRZx+_E5*3(;Ydos4S1z{^7G8{9q0%?EvSLe%_z9ZCvazooQ|X&^JpYcDRis2EaMm#`S54!KELm}zj%#DMgPKw-6+-0~Xt?cn&KnJ!o!i+z@CC!SH4lLaZ%un) zX*em0n?TrE;CsF%q5UcP^t7bwjl*{(*b3*>>s6)CHcb4&l9L#$H@h#}u7~*1$%az= zRh1HbM6|N1TlB%X?dNfCJ=P;mo26q)kc;AaZes0Dy&vFPi{F{8OtgBT@AI019GN`- z9Zo2HKmwC?Q-XammtAfBLX{SG>vA8I?*>y7gW{%m91WXz8eW7l zt63mBHx8Eu_UpWM>zZ%FlQAOGQn2Z>dCvIih~S*F<3kEJs{F+gnb&Bba?6>S8R|{? zwV11XPnMSFcYgCq2Y&di$4@K09jAsj3tNs!us@>4^So&YWVW0qJnv5CxqaS{63V^9 zhsvnCqvK=L&0C;`3`=+CIV&ic+ngyqEb&rudt0wodQT-qps2~~?hii(m%W4cWzm%cV*iQP;8>O^F&MQk7LKbI0v^G)Ui)NZu?V2j-K3w z_lECbEj+TLzxtI-ogq3aLG}czs{693Gn;Nn2{9|fQ%+jpijVc${%Q>IO7ChPHaP#F z+*k}pq~nSU3v1w^jtbTo4d#?Z%RgzGOE>MDRmc=aFB>vVB;h~B>a=H^_ozAW^XfA8 z^?c)0%WTPwh4n_#Uhx(UM}2OTeF~;EMi1-8(NXD34ZMbb!`%MA(Tx6ge27N5x|-(} zs<}wB+GM77u}JI1)j%CxZ#M#cx~~^YaN{}s3b?kgxR1Av4$nm3Gzz>V>!{yoL#VM{ zceZw(1%dcwD!1OTlR%l{zPB7B|B^^AMGaiAT+f=wNu4tOt#aZqY{C=GfEenWfe8xK z*XwPlfj#y%tP18@$W#?unopR$E*&l;{USJFl{R5OY{cHl{GFB(l%s(>p!jCe;zAQ1 z@O{r0QJ&Wsk!0mi=-v}7Fj=0X>zUfyT+8Tq@t7?D=iNm45e~jC<(M>m6Hn48Ib}i9 zWzbc2*6zm8Z*S(?p*gO$=TTAy3BGql|X( z1e3C!Uvz;fZxeOIALHLl09=s(o2uLh-hs@tr+aI^W1I+C4ZvpYW<@R}hd_wjUClr2 z7%Gl_&u=D{klyr#zdIhgM~Og&Gn?;lm@YOfryx?s4CXg-Meowcc;TGHj0Cr^=_E8f zL-vgqbRM0=lhHL_K1V>krJlEi6lp%#fF3pM)!+#|2&Uk^i7mj_MzRuG%6XW%r+$^>R&>keQQ)`}?VH2oG&oHWMQ??DZwu|kR$x`4f_6jGH<{C))Rg{(D+))W z1g7$Xoss71dxuZAnKY-F3_YLX_j4aV-JkxII!F_2r*KuRzqM23SFGabd{0<sO6VS0qmU2RF7(tL&HG6p?oDKZC^l?Ok?lWSk;|+r0Zz zYXRxv=SPJ9?m_ETss8l9L6lyM##pdZR7Uy(JQHwNw?@}(2i%zWOU%Fsh~OKl{!Rb^=2 zZ!49LWDsPM__oIA8XPX(Bti2q(Zyr;Asjj_=6q}CzL1VNN)z)lF@~bm>E%^kkQG~j zyJDy3Cn=|^4C@r6-hMc64|NU=I;vla2Pbly4yU^utVn@3&#wFmSy-Ezglb~HKP-=t(EwuSg@+Bb^qRmvf-$%g!f|mh+ZjCc)^in!qg}*WMY0uuy&s#TgV zGccF5(NMQF)bOZ#*fmh#RCmww)pzmVLXQwsQd)z=XSErX9a&8M1 zXYRhW2T0i3IyP_= zj)5|sGPG5KO?1DcIRu4 zLL+oUg7~4CCLOv5-i;%4Tt*<-UaO@v!JNqSyKd*i=YAfs9h^p>@dN?T3dLaZIIg#(#%dw2fyOMNP@ulxV*A{cc0>&&j$L+JF=R!A1qrpsrM1-&e z(V^_<@}Kq&@sZIQ>L-N_kwOfp<*5wlRrqM@YEwv4KkOageF2`KS5nkG!raz7-7x1T zu=;{IC(AG(1|STwd?i@suvU-mH{C(Bk&XIR*`JzMGp6N|Ne$MmfN|K)h4(~EKdgI` zmyK+dcL6f!&n~OV0_F=jqohcs^Gb?G7FBf&|NU&(bQ{MSHHaOKvb*I?j6BaY+6I1A zQ{);Da7=M_GRR}F zW6ccN-7846u?iOIZra@Ye!NGSSZF>}FUkB|K1EhQ{l)#BVf0z2SxHPJwlHlu9dmTkc_@{lRBL#mLvee@rQ30f`k7x8(yfE2VSY8V{fa;9Tp5qg9dzkO zVy&Vy0D)>u*~nGc?Y209 zNEI$2AWkDpR$td0^+5GL{@7aEBhw7+Sq!e1WO5`Lbg`HO_Ol1i;GDP&ie(4uT&<41 zRu)P_TkZ~o5-Z?p?a@F^cMEw?sQxi>bEjx{U-(gXb3Cz;Y;afrx4oI6IWyajIQnNITatHv9psS>n5{R>fqb-_X1kf#H7`;s=bf<) zL9*F;2XpjKI&=-4I_e|-jTb7wq)ic~h zRt@Er?``g%M{ZbEeo=rV!B~tMR+X&7S*NWAAkTO!86cYZ4V*9)eqAA$T2k|J^j}{9 z{nO$=XiLR3a3FnUpq2}NbKQ$NhF#dhuJ^~x1;@{=&R$`RFYM6JD+(|D6M=qM4qqL1^RCDuJ+N( z6o2NvAOso_yX6>>%2^XaT( z$?%l2X?oUO!ecwNx|CWHPEaP22gsc#_-WQ&L-%941mg?>gPR<-W1J@si?<+2O`0`n z!FltZx)brs-Bp;C(h(BUrl!yqO+l=`8g)<`Ts^L|n>tCTvNCZJ%=BC7m33W(vi_+M)EM&5#$W(m> zOqrmNLTGjE%EHfRg7gVB<=1AGCvrQWHz47d^xm`Wt&?)gUse+Blb=G$wF)A{cQ zUBH`2vsk@ZRDOo-&b};;q-wHE0x^Y$jYFf0@KNKUf6la%d-j!b-^>w%GP>4XQpVtV zx(cW|>ISs8jT~#N=vJlHBVC|_DSUDJFe_Y~tdht=TYmsp_$uA8L)s_3=gTK%<-;12_e37#kQh(G3bN)ki=qH48oh;MTWd>;wKl@br)NR! z{sJe7)uwYpW3gRI!{r{`Mx^CPV6tshGTZ8hn71WmJ4OJwT>Qvj^#L)*fw#eBmrMJI z(h5n4GSlp#uvO`2eu0_+T7t4HWt}=Utr?c8mc%ZZdS-`2ff}{M`Zl5A{HixJ!z8+o zR4Ye0^zN&&V8;;$G9=VFbJd2S)~5{oMgikRITkZJc{w{I_k>|ATTBW0ss!5_zg^`t zx%!1%2aiKq92A|ht{+x0(aiqxmB6Jg@uK$CRmm62^nWi^h=7hPW3%Do)B@k zZu`EK@kAke4IFf)YX(|qt(W`GMcItkDM~0Fs0ZEkf03bu54J=*g7`^nW%AXMf)Iev#PRCh{Hoi%@8KiI|ILc zWcAl4=ZeQq`pE`Upquiv{a{gUZr1WbW@Za}3&n0FSBK^7JSIcTq>>UnGd7(anqFcT za|9(< za06yi;loi!WW_v;S6^BB59_5G5!!PQ2G$9h*DzhWz3g|~>DR%W-nr&F60?=HHR0Qv zzEY@X84+Df4KbF}mCi4CmFtJyj_Ofoi((WWh@yIh+?`~YNEQo)gES&j%rAsy&@3zZ zU@3(mgob$v-n8IWdKkKg3D^g41PcVvGtZfBj;JzY$1w)F5@gkHEX`EHRcAYQ@E~kQ z1tT759Jhb)*SlPO>*}QJ%jSs|2KOnUyk`!5?W;9h5y}cNqYSPV-aE74)ucdyX(1%x zSQYN|o-Y-^xifCYI34zhod!^^=qs*M7wywiXT!NS-N~G;$h__t!kU-|a&Lc8!uO{o z-tMYC7g{RS&qFN)0&e;53>^6`v7N@8Q1nXOpHwc7QP%~{&|4xE=Gl#Uy5rN(Tl&d=Cpo#`~wl*Na`IVoT;K zBL#CwVleJPYgLHWt%$A@E&DL0UH8e^Q1VyL`acF`L@(+x3 znEN@5{sc4T+ z$yw1eFD{XrT)UkG&=TD-kdTW=&HD;^LrRy%kuoI2G*D0iR$BS61WBimdhrGuBL!mg z6&w_HE4EWQGSZ!y?MrQp+&#IaO4IxT++{HU$^vRFZBd7{FC!YJx}!!4JhiU9l{4-2 z{>laB-SYIWKoQwn6E&t&^*-%~Yn|yQh6>eY>&~32c02nTqhVRqMX)N1FNkIBiCWdf zoJ{<>vCPqQfLAtaLZIC_j5H?T(1|H8$F&bNQdUXa8w;}CPAx8d`n8y4i`&M+P1z24 zoM%9u9-=BNj^P^j%Z?VcQOyTfQgL@HWYb@1e4d@IbS*#Q>}t0R5iiJraW%W;;$b-#YJ(pMw?rl99^*1n?^=n6_J+^vMS5LZBU4j& zBx%>1MTWlEYL)qvlCwV7nu>~q=F2Cw7^aF2Ur$k~Ycqi9&|B7mJa&1$y8VC~+rGAL z5j|^F|5NaQ9S;-iuB^0}7=RzH_LGyZ+uGXpv(iOsaGMOhV?z8U7{D~Y{(Iqr-QP2! z==_Ss(oO}2EgEpHf$8&U-iE0PFc?J*;8MmL^G?`JA1Q!UcwICOHEI}I8V!O*Jx)8| z)S?Xc7s@`8MMuCZZoJg{XQ_eGw zz)4q6XliBKPy@o6o-iQa3=}6E6V>f~H1wnd5?F_-1-DW-F4jrAjJF z)^}utUaV4&D71~NjBzOz9kONrp+fa{z=}LZ{~S#VrInr%?5wS?4Sk4@b-DNhFB1Hw z%ocAO+OGSuf89bhlDF}>3IGK~pH zNq_a@k$bX~z_!~{vdv4MZM?p>hd^|$9x+sxz)0*4r5Dq_OuG{9O!OB7C!cL^6bI|= zN%#LPD@+v_|JwQ-FdG4syRS9*d1_(0YDYPzD!(f@VJa^(ex2j^A}}_IYV4$_h+VJw zu(PG(<4FU^=5VHpja8GYm|;-Mk%mU7F&d~h6B8GxP=Db}hznG5uNIQfk{S)!maGA2 zvttw5)IDwhbT^M0%jSJtCiLd)oYqGTbPdinAP5I1*yrM6ET?)ZJ=FVyI{ddG z(Cw93o1WMDUmAg)DBqnKke#Tz^Ql^sq&fs~g-tkwT8Bk#|6O2}6ijsB@G2hk{7Q{0 zcfPI4;XsygEet4+cH!9$P#cSznc1#uADQkODL2K@GnN5QY*;xOehTkuCegVn1tx2& zluZW(5Qj8c?8a9HLdD@Hm5~f1Yzamhnowm;+>TAJw+D>AjdYjG6dH!xSqm9oFUj3n zbQ)3K@262eiGkFVtJ3Jok%^)|RihXOhEQBQ1H!y>?4g3216_aA0|D@jq7{}((E*J}%}L#I&S(e?U+La&Qy>aaLM33E{WW#WVmEyEUY(o)qv0c8{8+a2J$mRq zlzTI`kannr|K{DHp$UzX#mYHnSy2G@v)=rs1HZXsDi*-(#s28H4(P<$X{6_{Pc7CJ z!3N&a8#U)R@@CZR6{t7u2kh=PKc9*>hP$u?H3r3%bQdgPvQz)&1;iTJ?`&+2w70F+ zJx4naTJ7-$LUaD&5$%5-pPsloQFL|T=zci8Ik`-BRIIVhX-8dH4xv^UPMlWy0;_Yf zpy$BHThk#<&r8?!c>bWh9B2?dl5f&$d9O*%JF9)LEN}Jvj-Xm6ZkjdFP^mPfq9WNL zU=0}`q-}gT!L&^>8kP|gtb=q{@x9}JNiKI2EBS$wu6B>=WOw$0&?1Jp34`Lly!O@j zlWr9}b(6eoy5mybjnKtr$hu!IvYfK&6gUVuceOb4U%^+(Pm^hg+dc@LYnuv2q|}`3 z4re#N4taHGO8~XohMi+O4hDj4%M01xop}b zW@r*oFU|IMU5p$=NE zk&mP|&(*Gf0GU3xc5`8}(T>dCEYv!T9>+~C`Q->@Rc|l2R_S{&;2DWz0W@tl!HK+` zS3Lq{7@<&CReR^x z{nL;X;=j3vt@BD=wqu?tOe3Y}?o|oakIP8?hk;Ik zMT{SuvXHl{2|luu9XLAa=Ugw;J21bUl)LArKUBn$oU)M$ykxVm-?1}3^=a?qa@&3^ zd-~qBn66%j?NzJm?tD6w$|`UB-S!icLQs<8n*?(CE)*he(s((?QCX4zC%jo%a*Rp3sTRNc z@keD?*Ann`lGl97(Q1y5XbRZns_G|%@AV(CiL>|`kt9y@RAIVgETS&ShP?;?No0DM zi{PI---N1+ax1hN+Ed7G`}ujC7-)`%R4iF$m(apo&eVG)ZY_YGjv`o+MasAF0lRl3 zd|9TFw7-x!l#SkL7@V_9;jUo1%sIT>O4pMcOfhSl6B1PDc^ZN zQMY|_%g(*lI~BsKG?w2g7IF^H99+yJ>#W7M?~fY&l--g8-|AsyfNYgaCqG;iHXVIq&NQ8S=gP9~Z^ zjBRZutL6?|gP@vqlG1Y{YYu|W1M@j(!oZM<;8Eq0V2ZOAbI&jhjo=4cyCYp`RuHzb zOF{v`>Wz7r6~szvsaZ!x6uI2>XFzDwyuS+))_{dvnhM`$wW$%a8#WX=cHcO8JmOv%%yW2^bQ$dqTcQG%fi zMKXJh#>a=*di+bgUpe@P)*C;-s4q5|k$WW5B3Ol&e?lX=-Sj7f50q}Tk9Km%TuydG zXiozUw1w??q*YVk>z$|U*n9N$ZPOwwsdfs&-Q}U(DVdSU+1$%pw)ZQLm5B;-oq7p!iRE^k@@hlQSx|ABf zu|YhWDXjKvG|ZTV^LDMQx?aXWmt-sRWiyA%cw)@$RbRd`V5)gI(_ldLA+X#u_vM6x zshFpBBQrA}(95f;ijg5jpu_`~85<#jBO6_r{HX5a(9D49mZ#QyX`*hp^vNg00#~6D z$1gcGAJ#+`Qx&tdlom(Tz2!R>vl@9gJ0@t&C)$OXncQI(vft|+r;N=jTZvhzp_iw4 z2b<|{W6~J;gcOd~QVOSDr5Kf;;4yWRW|`R6PHvDJci+{R`WEG+GaH(AwoZOBr1j_5KI9I-1p0kfc7f!iTOYX3rr$`EV9Mz5B(_}{} zjDZ{rahaqVK&B4i?^YH#U6!Hb*Gb(ud|1jlBixP_%kUGPb6j_bHW|Cx!5e7@P2=z8 zr>7lWWIpsHkHOziQ7o9^&@RBDt7My|46J58)JoZc;HB<`~sY?y0$z;N>T6QZO9 zr;`k(W&E?A+C}-W4A~*%jNEx-R!NMQ*O&CS+`CsB$r9SV*U#;p0-Dql(kAGiVS-jM zIejr}W7SEK&pNLL<}e|bmWX}B?9ZJoRjj9{ztOi_jgVCpYBH%sVe)%z=y?wx=|aKA zuIy)SjF*E$`>&~LNI9-=WEIE2*us{`DeJaQC%yZ8JP$@CBw{{2U@#35^XrF(#ir4M zCg{bk6ovEq1}V%dMSWcjMfwvGbgyV~qB1Y*=*b#(T01T4$XjM!m}f$2C^z~Us<2db zgbw3PQ+p~HNP8+RgU<&Q%N$PEN{0Pfh@#48^btO7rotd>?d!m_ItcSh$BDf76Ov+4 zZw|?9LZ!AiKZm0C^qlEi(z?Wl-FuJQB6kttg!PEm%Y+br$%(JbMcbcj1q3=}MnXU1 zliVH-IE)); zr)vEtlmaYTHZ&hd*RE%4LL-H*^mU)?Iie#dbMw9Ug$rI?n zLEzYaWj7s9V#F0?h#PEU(}h7baHO?TNq~(&W=k(P#jkL;M3X4gJ{S z(wC4HpA4VL+gcMta+%H6Al*PenOeQN>mw3YqRhISWx>nNupFKz!DtR8^lF$%>4dyq zKcAs(Ku1km=`wD|2G=23?oVTP=R~t6u^EvrVwf%0rEXwOm`Sfmc+G#}j%b@qFqc^< z*U1I|2^8>Os5j42nW*7xVEgnO+sujEQM{m#*X)8mDe$+b(z{qo@j-Fn6kAyz0nIE2 zcu!;1uOQQa{U9$-Z#te>L+dt+$LAvy^$L0g>Y}*ML-+O!86mqIhM(nu`fbtaKZ!jl z^1@2OyYn1~$}Fxv=;g6l_IL^pwpV9kLWX3OS6gcW+u-|5Z_=(&cXF4S1cgLcsZ$%a zK-Da9CYl=fC-rh5G^N~bOc2$f__pviBAJbB@|HgcNM zPrS(IZnb6KA)7_S2d@f2AGyBX(dBknmih_g)&zY7y|WrolTiP<(45h8QP;(O?I_Jd zW1gJzkoTEF;ZSAHEorqDW$^4AL=Dn*okLL9lQcp^CoD#-3cFizZubs*RFSB)gU;38(jm!g)IH5*IY)}cr_r#ep+1D9 zJT3TOr+=zQHdyfzGS~)e@|yf`Cu=MW6Jthbg0Q?1DU`H*rm^eP5fG}Cq0)71>b8OH z^b=}2FQt}R?MzfHMNE|Yh3fX! zMdu9kR+M-1JM*pxmmb^m^yJz;+G_sdI+5NS=yoDqM8CzU0w~y>QPV^Dm{V*HE_A+a z3Q^W&OksCc-gebn+qN*KFH91M_zrDqVE9zN@+TKik^3P5j>T&s>rnANHG-y=zj(zb zH$)q*v$9=4Zq+KWR?E7!IreN<6(T$MFXC@tU>o69>zDCi|GqF zpZG3{#9z;*4%6tMaszC0L|%|MiVx*+5H`S2O3zt(vnMtW8BekE{R2_$hlIr_lsmlZ zK8uCOm)SYQ6qZSbuoxhb&;V5n(p6TA3W3pbN?5_QqmK)ucCy1_rUZSWCVossnH(c) zmVex=)`Qh+VLlbwaA;MlfUozBT|X|E8Qxuulp_o{^;_*E?+VZ^STu_X&4B2?%lJfw zB#pMW)FJsTzx0iaeVh~=15&OcF2&bAO=l&bOUA}1#j7Nm0=W{(7F?%NjgVhNXN)p}w&g$r(09>BS#{+a{Cvy^(W$bLqj<5F()E038t^I&a4%*DeE z`?wmiz3cBgi1mWCsBUd9?K`_`G$%qrqB|M`=BN;OmGGV}aLC4@*BGP>K_-0RCXeeB zYX`**gXq3**dExY{npPJ={Fmk+OJp>?zUc#_)yvniP^fzpZid&Rw)v27C_x6o!z1N zNeewr$sD!I1E&N-9?I+aIl1cAh}q>(>^`mU>`d;TOar7+F{jUC`DTaP6zp$8%XDv~ zZpRO&ZoA9*2n^UnMQ|wS=j3U-#%{emRQqGGb7MJXJ5)ZJ>Q{+au(^56gZoKdX3Z$W zAKaAO9cf1Ww%4y)Rlj31pG6354y9b>?9K>2iBc_;0~`~OgPnLDUjWz$RE3GU!$CN7 z0A+Dnx~B-$j1nF4WvXY?wa7-ibr)cY=OL+ggz$NVfaUH_wjN}~%=i{L6H76= zRIM7e=4(X}O!gIZH1%id2@dRNR*}-INc>EjbOcV9;Q4WST}bO^nz{!|`f+%cb=$4edi%Ob zDEgLX7jf>^gi+zcVNAH?qtrS(G#?T^iGcv!UM87XW|j{jFOklEOa;vy&{?pWLJhk+ zQr$+#NR{}DWRTD$myn`6cOGTBhn%gwEe_w!hqqOx zxbxe$(ty49il^@4MhnbB*R3pRzwkuiTalAXI;hjJ?5(FA-X&wv<3Cpd--io?`}Pm) zQn2xP;rr>~t&0&V_bb>bc}|uN-k@UqHHVoPB2Jd-(-RsUp1q~J8}eJor zP>v(NB-OGohbFZ81X!25!Vv0*Z}IcH+u`xpy)q=vbkW@d3B>8M);;f>{F32ItEwn_ z3qY8^t%nL(NMpz3F@3TTGG{Kxx~HgeVQ?eDlKJAviN31Y#So>pmiRB7zsr*+u~*+~BuW|00hmh1nQVTSuR??0XR{E&WU{p+U z8u;Dzr-Px$l&T^Y$y`qUdu0Run`t(vo?iWn6TFrZY~u1x?uG|hd%+u%Z)XI|{Zyr( zUhU;K?F02E3yJEFh)iyN$sJAPi|@43uUu*xu~>Moy*OKUfoe=*ZU@31TUELw$q5Np zP%kf>`zu30I7@x{C`46f_oTZ?r!Ar=)K&cwplEa%IW)YNz-fImciHznLH`dL5R&)v zQ_I9v9IPauP9I}WqqO5lXFy=0#OM*K55)QdrvRrPc6WX62$hpH3_ZaPz~~j=*kkiwt!cxmk-f z*S;a+i1d~G2D~bl9=4kL4E!6LOWbeH#Sf+qap7!9b^YPy>(K3GSc3jQ5OxyC1;TPH z(QXVJ{_1fiUxZ>3<-FQhQpd=#xeV)*2NWhX#?W*A#>A!J&P9@47TYrr^SybCo5f($ zDXhNVZ{xi6Ju^2@hI6|xTRDGH8akJ7b#O;X$c2A+_cTDW3fsqP3zl;;%J~KHsh_x{ z<|L;yZ!F!erpLssJCApo0U??Q97y<$2b|dL~~6=1y8`M&SmMjDaMt|DO?FmJPhGeDK*s7mNlh7 z$wF&y&B8ql*$y@T7*!C%VW|Go{nu^ZuYyZ@-#t$S@7^|knQ+|F=**Y8Dh>CXt2K1f zGgW5lXif{MRgVZx@WMW$=j2;}764+9-IAa6Trzn6)K(tOyOh?PR97F{<2*R>tU@;C zP*!^mi0bU=FPND1ny2lr@rnqP|FLK4 z@8QjGJ<^}Iya0a7S*K9|%_ieYj=S{@;rdR}N(v;veEE+4EoW@ z@V5{mK5Y%IYF^G|l7Wkz8>53uOd*jY`05Bh&J)Z^g967R)h9Wv$(|4jSj^dPFOv)} z7d`j0o~;K!xI8xpq@kzp88xyKW@;U`zE$Es3<=cg88u$zQ8Sc;>t~Uke@Ivvs?jer zxq)h1PJWERyZ{Q!7c)V_!CEa8-ZqvaB|a=|n0#s+PQ|K7whfz_*wIM9j?Cyav~4vk zs;|u#QQ|*6`}>{70TXmRDb_y{ekaMiRN=zMMA2H}#Ldd~Albo(!(nClC#(i%M075; z@0<_v#xmmyh%`THRmVm|P?s1i!)E_XJy)x!p&> zz7Czb6hM!&ZtJ!n*!9e{uYY5>=WNM9f$;(^p}Hw(alrL>p8&{a-k)_vGi{gbG?(jG zY2bJHq)tL{xcz?9l$LWPC35sjXlt5NzPEa0i|=Sum4~Y{>99bq10iX=Rb{w*B7dfv;E1FssH`nHAkw?uB@8@LFD%a@Uy= zg+(LY2W|sd1jCdiIE6hiS*-nBexPLOHy{zsLLi!Tr;PP%?oLVyVh_?QKX#`wToQmDOhBInFx=HAb^!ilCt3*0AiL*KrK*U6|-a zGS3SPZQ)!6!BXhwz!**7&RBf(SEbZBuue4WTVwI}&W_V-0& zxlwQRQsC|bx8Mz`#TEpdi=?(p(V)?zDyl8`hL&Cgnwil}_#Vf;5?P6{9iAQsDY5Og z-{3R|_(FP&MDY=Q#d=TaECkmly5u=l3%slkZ;XUpbpu!1vnLX}ZMUIwJ!9`swlZh2 zvc~XyEa}f%$)1^boERvKVbRHdhvf7NrQa zQSo%)ksZ$Oh#T^in5VhqmTa7yDxue3o~FT@EzTLzxRWyT(BMv0UhH^IOux(k55-oY zA3<}KVr$rJ-37vk;u%-xT^Lu>&kW*x585L$z;$T4Ma;0OF)F$j1k+PlNoBJ0JtL}Z zX2HI#XP}dmC>stvE3dOtQuHh-ACxXl93Pau*@g(?wFT?Gsd$A^YT@Z^Nl0@;JS+F$ zC?IogG9v&0jQO@>Ha#twx`lk%fmyJ%I_|o^<(ywS1+82#p4>~3hl~q zrYBqQwarG2humTi7_$x=k7)&_Ux6@v)7M?Wh|b?7oRaEICZ-bYIPB*9f;%GRW0bFT z?@CXG?RYTyHC;f;yaDUoQ!UT-Dzik(jl;(Zq70H z+F8AA<?1GHoCrs|Z~4w5FG4+bK(o*U^D9AKu2j!$w_7G$I*QwhiKR>~Z%VYK*1v z_~Brkov(iIw|Itt?C{g?%782JjrRV4G-(VybyZ%MVa|mq!Va0;(~JhBl~e66qEBj- z5+@1tTjuWAl=;lwjaKdl5F4uwpv)N@Ur(H_tLyYZW`p=0*m&O~p*t`iQT0wyJT$fp z)Tw$cw;gvh-W$6}n?ff&qch}naJp_7F=|Q@?0Qm`&o4P{t!GU4a%ZvJoekfj^!E(%3c2#E&8j|n->sva<35KAV=!(1wC39@VViLJ?halm zGqYn7be28Z){CTGEjH_Qo4Gz_4K#@^6d#P4e$P(CK@9vCrkg-?*~BZ*zXGrJW8Ziu zQ&E1WtNqbjinHsSRgk|mkl7Bp+sWkI5^ri<2rza?3Y;78U1lEB;}F%Qg`nxc*q#EG1}`( zAGP0HzXnPRJY7$F_`^v81w#cp&AA$GM1<<%6j-#1C%GI*9=ya&-=eNr)B#%H{>kqG z9^1wd?*hdOBZtEjR6h<&!`9!d%wHgjy1Wlc6zx^m)O`^=3+gt0>-h*NE_Y;59;UVJ zgUeBS)vnZ6JOtqzwHvw{(;LDtkR=Qbkd^myC)ODh%aj}hKByC_A{ur)7_c@bDfN5M+!i(;PomF>XAXd=2m}Ay^@ut%l%z0_;S3>eo&0p|yM>Sac^#1g6 z_hK9YH9#Yui0=4fX@)-qokzLnDIa=bOH45LRH9*5N{m!)i#@jd79=r5aHC|HD~A>I z0KqI#VP$uX+}S<#?0n&=Gjr5+@k*tUF+1bQX`)bNlA#97lcjyC++JKqXTDzDIi)5 zH=SSWZ3KCe%{Kx%6fivT_m7*Q&WbkUH;DBCP_>P%t1 zau79sFF8-p!mB-!I4x3EeEZ$ghN!7ZM@G*WXyuWDvE|T5{F_J$83$Td0USDkdc%!d z%szE#g&7@b6<{dgMp;_oa@svp&n~fnSKm}-k`~lhXSN*M*_TxtY)^mj-9lZ5GvI)K zF$RN7-)ri^mG^yy#$Q`DF31s+hXv{#S{(S67JsO@sev&v+c8DHZGgZ|hBas?`8F0p zngf725k!hMOC5q5D=U-H(1@4<+$H(TFYU34{chYV{gATQup9`bEWw`Bm4Z~E4RzIl zNR5~ske(_178iW-O#MdY2iT@__-lVW{za~3FKLqZd7YSMm+puB%9eHmnZna&glh{+ z8Mv&5mWh>nFGZfL?AAo%<(2z9oK7m!O~KDP2Bii$f4VFFd7IMjUmFVNL=dH{w&tnl zGRI=N5>w3RLXv4Uon|yr>ooc~2rVAxq8r>-iKKH0A+gJ>w;mv)vBH?-YahD+(28^t z)Y2en3xmV5{CCWXu^KAW%c77}lQ4ORs5PBi&e)2sH@zA<7SU>2KnTt5jINrXMsEMm z_5^kxhskLc{^)K{$i)PM zXkTcV7;19KMWlSK*>oARsDV;;#+FOXAEc(Z=~M7b$-w$7ncH~p$@8q^`16yaEKy|B z5Jlzb0?lc}kkf&HMC@93)l!uNOg?MDPEC@w$g>~ckwVg2Qzop!LTOCfR0T5Qh)+Mf zM9Og3p;C->YmQVp0kcPKTYdAKQ&LDMWxc)$T|B11Rvyt?Vt%7~g?5TH1Yf`{LZqd_ z%oY>5k2vrlz8BfF?&dQ)9trkzW~+(*=WLdCy=#gB-08&3!?KQR*feeev`R=G?jJ{G za(K2PI12rFltyC;9HfhiaS`T!hC?}GOv%>zw93{ZRWRy|rW0t(iG4ze8TBRwx^~q*!pTz@Lb$|y@ubP+#{jp-k@Q^3>m*>gO$vBDPi0+i=$5^Zp@bpDO^eYbfrjcV4&EH&N98Y%k%^d0!Q17&L!FGhK#ao+? z%9FW;ORv526So5CZ$>lUj0z>A+$xsYp}qAsC0118_(j~^JFgBq2KWf8@K>6L&*JWq zZwqp6U~`d~@t_ktzCJ#ysop8#5M;#2>uyz*3lqyasS7S8YZ}1U?zJ&-Qhigc3K9-t zA-k(4^&Wd8X*DjxUL;cU-Q67w%m)2W&KY1wmCJ^xoJTrD)Iqo~FO`sTi{r(8(iL98 z?B=tw|HNXlL+)8j#Gd2t#2j}ppQ5L9kvTl)Xo(FL?(;+dS94AD(VS5m0zCD!9{umG zVmMKEXZa>W@8SHi=?>8w1YX|%`~0H?&VRu_0yRIA!HY`dKyY%At-Me{JZG{z`JOw< zc9QLE4J~?p=Y)mr(j_e%0-1Aoo1{t2Y&{h;Fx<@sbeykKX}vZ#LY`*MVYp*Ons zqvyY?_?qSvy&w2>uXcfR;upJ&q?OnDw}Pk=pi{|xgIM+aa8sJ~-CFBSuJPVjfi+GH z$L7--oRNsLcG0#ZrsV+qk2`~wE{zRVl_#ud?zJukcG17j5Y5LYn>mKTI0v7TF4^69 z@tN|H=#wH#OMJ+MhTK6KWo|nTBVMaV&VOTP0w}OPU4nxcI0KoDw8zsbaZ5~ zbUbPfetNq%P4ZDih1}b%uH1GVS|+*O;N2fWe|dHaJ<<%XCP6Zu3+c0y750L#9MtEG z`9?Z_^Xlp7@tF9ITab+xeUiXYTpL~Ku@vHgV_u&6%q%fDcW7h>IthgWqGaDkJZ%|c z-B|M!u)AJt>-j})en8zUKSh1T4(=%8jLrLNOQaZPMZYS6M%Q=e4M!QnzE6|d8~Dei<(X_R8s~a7qQWg{tmn9kH96tz z<@f}vOo~4Y3nRgGusP00XBFZ%`OLlv-uEZ_KcZ~fUD5f9X{$-dijX|f_!k7+NK{dT=-h-^CId+p>_|yqedP)T?@B| z#Je&G6*anab-mM`o4!0;q1C+xO3h^DvtG$wuUv%kk7V)e0o@nZKa-19s2+O%o!|bm zA-KQA+grOW?rvAptK=QkUWicpbYNSLLHUKbn)=jDOItDL=~lspG0Kbd@D|ODvo_0s zn)CF$(6z96sy1VVF1Q#~SmjnS_i~N4ZlaBFIJw5X<)R;pcG@ROsnh^b=(=d@E^mMR zGO^>wEnb$YRpSwte9Pu|0kqNU3|`Mk36T*WBa|FV9O#VHfwC)Bn6FJ%7I+(Hp$4Z| zR9|%HTFutN`xfCxXz_pHkL zSB#?x#EZktvoyfMZQC@_v65_zmxCe_oax7wTjP_g#!}WwoK=+yEY9cq2j%6*%aIYE zA=inC$(ut*H9OF=U#m+Kd4Bt&kcalS7x9X;S1hcGvWcEoH?ks*UE?H|dMBv`Cl;fq zyLT>`Wibz3VUe>9zqn{Y=9zJ|W!m=z^zO3f zSU@6vdwfTIqb-Vd3coK-Kqe*l+6vnAnNLeAk%dubHpNBw*Igo3W_MNB&XPHh1i;Ss zBa}f)Xb>Q`+Dz@qLRMbSw?V=oto}cJ0rF|vH(hnf7h)2hN!HbU8@b%9=# z0<}9Dw zyd)faNzb2SYmiZ9pZC-IQKdyN-_cqPMu%*N+C-h>(rQ3!|2An}S${sirsxbdOQ_f{uUFhUbv`P3g*_sJLdp&slS8hC7+cai(n)B24UXi)ez zF7B+IqmiKf&y;4~ zfmWR!Y^)FW%U=R&jyK1)`9P;xnP$HPsrm1!zgS#6ex2PBLGP@-3qdzNugkC2jZn`w zC!@5F+$19AM0eKb7mvGt=)j){9@mYH!*F>#K!ga{crChsaP;)l3EopJAv-W=GAx^P z3I3265+7ZE2Hzdw;qlaF-+z{s^*ZZ+7YsjrgqqO)qEQX^6fUIIMYCzu@YrsO;oQ~I zed<7aASV8+^!6PLj!u<*Thf>}9 zAN?m~^ViS*8}+;tEw8cnur(FG?n+!du^{l*VOZSRZI-!Tfj`CDuZExBhWT?-h8V?C zrdTo5R-rT2AUg_uj+gtF{G^QOi14+xLM{5a50`N@NE`s0=i=@Ub(zugk~J z^bb#dxWJB3nhYLtG`>umI~Gqp2xMy1)H%3P7q}V&JI!Gy2cq85)GRC9!^_>9Xezv( z?M0ua1wGxHSfgwkkspf{2G|D@}n83O@tX0<|1wgGH^qXk7bLo9rsDDf&b`9s_T%2F! zfl$TW)P32GHaIX1e)c>#EHw7~-JNQ%G5Y~?N+|C4;ty?&ZrSNR_Xhl5t}z_!=sd!0 z=_1DiNy-o%u=DeEJ`Z7_t;L>iXVue=Cw`1^iyi|zGJ(!|Y>8vr8jah1VQd%i7Z)Hz zV#X+yb}@fudVPn^XySz)QSQzs2tSPQ!pDV82*1qQ*Lj3w1jPv$iGDHY%~n9nut0 z@(2jTvZ6b?QMS!qqRv^15zJsC)sJ87TCXV#q^PtD%WyUXGxKl6p$1>Uox@vSEp3D#K0zLHIafT9QM#lW$J-dG?QPyMLEDeM* z(m-a_t6l0fDRhl$&n-a?R`0+w63018uEF>Vg+b6nhZM_oEE=3BrbKq7$+tQw#cUQP z#wkwy{GSK!TcuB4O@M(2AJuwlFwUB;bA&u?l;}utqj*^Hvj~r{+8c0HnhfF->(d{cl zgYg`?R3&B1BHX_r&|4}n&4RjV4MI+{{M8atCC4p-QI5I;6FE8Ck7p;^dQ+H;W1b~e z0Nh|--j*2mYqA;yZV5*lX$reT1HMC@#C&TA#-%{^(%jF}8H`jqoB0lJk2pn&JfZK( z9HhTA*aVQe_LUE=XvBmWLMuhx*K^c)u8!0oa&EWgpkunCRh>N%5*~cwby5Ae{(4+SS<^CFyQL6fyJ_SDyKZ`yn64&4f4yiBWTbuz)louk4fy|2M6KHeK!BPt9OB+gn* zvCW7+5WyMn7ZgL=g~(u#+~oD=%nD|6=xbW`*my(Nf@kel{<<>$ z{x^neYX`5R%tYWtWEF}{UabI#O)=cpH5}xZ08gyt@jdLIS1UG&T^yXQPOBI2dMvls zOoFBwrB(ab&NOe3csw%XIJnlp&jCrS1E}frzRKJFIOFK0q7YhK{f~5j(8YYvn0Ykg zm5mM1r+H{#q$C`f{1@}>MZ#Yjv@->>7ZMB6Nme>S>wipKZAWXs{mbDDaJE|b)1@qQ z)fXVaoXh*LonDQlr>f?fKkxygBm#JvRI>YaahE-!F59B^8~%c_ zj<-rpfj5{}QnONC`=?8q;Wtg%%p19W_l=KOzn7-JIEFhneE(tO{is(vn{)h7WMjBb z($(c;I()!jf<&X{Hmo$FQF6*!Z={ZSvS zWUXwyn*|xHlSf;9s`&@sO}6ls{(zGPtb{Yl9e*>OCh=i#Tb4Z=MubeDu(BRPVG>wt zvZa7g&f+))H`+VNi)+58rOA+$pwnpiSKF{Ji@_a!o(fz)bH-&8Xs0moipLI{Q#{|e z9!e6xUz{};55P#F>kEYr6Lv`9sh#&?8XR7ll2(bOa%>Kli~1N$c{XY%_3ZZi=^f_& zwrlw$7yW*N@teiwb+D_r`!E;9n(0H68GKd})c`Q~(#HFQ*4uB7d~Bttt@FSm9pT$YMFrjvFjLB+>=bA4QE)Zb#DR{ZGze2G7V3 z{UzCP_Jjh@4wTbHdT*A)+>X~gbAeTZ9y{O8j5+Qm2>6ktm($>^cG|p!%HNxJzXKu# z2}sI1G$q*LRpFt4{WAcOSf36IypA1vu)P`@{f5i;)?O=X5hPwaxf0|A5M?0I;uW)k zYGq!0oRu0AnDcyBaI!$xQn-zoxEAR_;9T!EEjqc_s<8Fw%{EmE%C$Lc70^-u;<|X*H^$ zKZ9_-RWA{g+n~WCU->FN11UfQ{ja7PEBxoW-y;yKqem7Mb}^Z(J}hrZs=hfN*srzU z+g!*aZ^_K~D(=iG6*{WyfXn0|8ix1)(JVlM#=s{s8KW^)FOkXMV-sPHL^Wcc&UJ{f z?O6D~vC$09Ry~zHk)c8-ne^|YM*bkSe=fLui|3JN^%(kk8zgeX@DqFkL8Zbh1fO~V zKkj{m4njeLce5bO?J*AN|8M}s^xcSan{|B(Uowy7 zA8uJ~tlJ;^uvUU1Lx05W9&G=Z<|D-rXrR1?Dyz*?aH4ac zdXBu93GkAKD;7x#*DUIElN3%FDwC>hm7mwg+u_}WwgXuANCjT5Qeu?Obrdrh_QsQ+ zG$a`#+R?|Hb*QXheT_2SmP~^cE_3sKbdU#Z@Wbu0@FNrr?wEb|t0fWv;eU1@%l~LB z{I9O2`|J8e(l>$I!r*gJ;71c5Ty)+yk%v2>@4wyk)$}%mPwMz}{P$-g784hCDKZ=k{w>aaopA&74@C^PWU*}ob^YcZ zS_Ki_S{@AT(qs^j2_VH)3Gu#eS2XwKsjHy9b|tlOnS=|4$~#=<%Qoc%%{rS{mE17u zPaS`QnjPhFfPBSU+kEW0tigZyzF4qcBJ{?|6R_9L4RQxyxm*7Wn$32CGaF{1JAgB} z^Q@)CpWkUUUY!52M<8SC)Tz7d3%dZGEPiJG!^zdBW3n{Jt|S z-HBX4?L38o6gFlGhrS25-ud5@m2&$ZA`o-?rn95t!@-Lc78_zRKE1*~O#ITALb;`e zS^sB;gIjEPX(*gMF$)cBhgIJ-pUE!F?{2J^bz{1N&bb1I%El?pK#z0Vgnk_3GJ6Fe z5DWbUk76mc<7h40ld&1U5Tt^h0dSpSO;u3%KSi?*Mz;QlW=oz0{t?Y4 zfsZ+Ip<}bAMwQ06%JdieEVz>P%D3z(I7j&!ZlS{Nd-mL74q)S(69p!9-AW5vfI*!P zw|TD%xHT06@%gbMug&_Gn@+8Erq2lK*q9C1!b`M0rn#@`F>Cn&jcONL_^;;n#=KOT zr@q$Qz@UD@i7e3;fw~*JnO-M*U5t*~Z+6IRj^iI||9s`qJY1ZbBz^V5-Ssk8jovv{ z&+1!k{$f?Z@K%yfPzTPO7whKIgcOLoN!ksBrdyh|&*v3mR%*7g{XGe|;_RZ{u%&c? z)f@&Fn~&!ihOuj9bjr6ZWCFa0+9g2SYo?ox<9h`e0hu1N^2R-kPZ3<+|4K1OvCW-R zmN*=2>31+QTNMCc>tix5kqwPlu5W+ODfy?-JWtdwF(GofNDY`}Y_`wS<`z?y8d7$1 z;I5^=!FWX<)5Ad`cWrQxA+3<*!L~X!PH&iPz;AI(_yfQYk z1z8soYw?ztHLLE~^_;eR7F%Ho-DM|bh~IZjSzTi+S=jT6&n2#SZKioH99ouV?7O!h zfxIfT@rtR5!tww<;fUasqJv?JKjDrndI^V6O#T!;-f9#Ux3!h0W3?pv6gK*tlm2og z?7QBsFZ;->R)mAGwS{(XewYtv`DV>JQ0J!7+h`;HYZ^cE-y5Zz$EObA{vBe}o!ty( z(K&S3PB1{AFjS)U=n?m7i09y+nO~`*9u(ZOBkygt8{GR@S3nBifOKc+p>{>tK$!J2 zu_&$_3`S1?G0%p~_Thk6ufzI6W_Kw5$6T3rOOLcIR_toZsd>b?U2eaiH^`WYHKLbc zqo`1d?9ta!(M1vRVpN$7Y%59$H8+sqm2-IM^b-Gvq8BCMjbUc-t?bc@K{eo5DVtHK6l$O9NQY z3bfI&yw(uyL|w^4W%jXzfPsU-i|#5p7ai5gN(H|j@*hq0@ViWZO#u1}L=0ix>Rh}{ z4nl@kY9h+qt-bYY&cw7+*3(4Y5TyPcajkGx;&C#g3Kbv5N5o{S3(Jf230k(>5Tji7 z!LZY-kM^t{cI*LW*X_zE*LUgw7Nz?xi6DqqMJOQ1geOi+<<52O3*5AB*Q%~AJTz6&YMw4V!#9BVviS6BNPNB%F}H#UZPu^~9B2P9GCiXUMsK(PTPww~ zX+}>3ey9&UU-{}ksq5r93onGdFC%tBIuD)X6X#k9C3KOvlN)&P@s;i&orDp11+lm7OFWYCFg&%&b;?-&*w*z2S153S=h!O2{N&S0Ogf zg+{{I77H+6D);cCrlEEo7;9C_pvN5CO}x1r<;s{t)~+1bsf^a<54OKk(k?f&~HXAug{Kcbv?k3SH9 zi;n`=IV5S@&EqPb%c%?b*C|E7?Lv>G7g)dy?C)q5fi%m8mGf!gm0>DM5-E{t<-YIA zXouEuDowgZZCh$xYp79thbu;Z1v(L1|0U1~&lX;SNp~U9k^BUkn_5mHKp!`Q!IVf14xNgKR9Wm^w}xNSh3#qQPgaf;7KsTv5J$Vow?K)91oPdeyGen zdOG+n56lS6k)5t4+mstR(v}#T3cO#Us56$br}8G~7_Zg&LD@mULMc-{{KVS|xgs6K zUXhKpB1v{es9SI3g6~b7r|=z*gDRZK28(TQ9|YmGKW7zv+KVo@K+Fa@046K%+{sVX zn%z|ioyx@W*}BY>cka)6c{$s4H0X^eG^Z2bWFqd;@Sw!Bl}8#N$h|D$2f!@+oCud3@*SgCf*Ok#F!!t(XRfo9+3_7+{s*ABjcmuW}dl zJOE+3U|KH1PJD}YFXc2WG5%y;av{6e3Z>MyF-evp_-GfWT7E@F9j*p zQGHzOnE2{dhlE_eOi9*(qy+r+i`$WlFphEZ`W#hfr z3ScL1i)(E4eRFX1e8gUvZVPF`D9u=NXh526Nx0l-P~?eA=X#pLu!ocU{p%2uzyS%o z&K~~d|AJ!l>s9{uHt+D^g78qr{fmAA!I!`Jp|n548ZY3AD*S=^>-gWc6#Y+Qu~8bl zrzI{`lksE@s@;qqpl^@u(5;{9=SW`oHE3s(Q)qQ>G{~1{x#_YPRN+OkP8Eos%GkftyJ|vi9HWjhFbh9H z$66NaXPz~qMy=|%J+k-_)7s0yFOQlGQeA~?P2wjxMR<`ge=AqG(glmUaG3aKxI^lo z@!!yk#0)yq8<7D5zUrXz?5$;yy8cznK1NviY;386!`Z?X`-QV-Q040CIP(XS^~*OS zsQ(INXdL~j7nf||L8J2%Xa_hL>G`w7T2-n*XShb&xH3E(j;MHBD{48q{wej2KT*JN zH2=kch3=@1M$80Uw_$|V}R2H;CvNA)&q>Wm2>GES&7El(NS zKOoQ23pnIiztNU2=q+L#Q7uU1E49zMMrG`APNKOh(2!qYAM^Vyrrk_j{u0v$>}X6~ z;g)eU?_t~hd`7`KD9%8&J#Mh|D@kem!XToK*6NB(2e2w|LH_bqW%HKej&by+)+D{c54UkHDfCP zMrVgzyMPp_1kIOb*^tZXfb87)$g6ODa(-C=uSOl^W|#AG^47 z$fCUM3j3R)IP6-jtyiTM&~bmX|HIx}N5%1OYr;eb2?R)j2TMY53&Gt21b4R(+}$-H zgai%2-JPa!m*8#M!W(s(SmaSN5}?y`Rm` zE^X>dM(@oP1C^|wL&S9`@u(-6WP=G1kPkNn}d;5Ze^l5Byyk0EP zo85IZnE3^Z5YoT}vPdNN5;8(_Q*i6&pM=rbD^crRDe*Z$k|$SFZ{s$H+hn6t8M{@I zKX;UQ>p#dwtx4V-FJAiAMNGf8itO5-uYER}FXfA2{v$z5 zH;=`g>@qnBWok(@hBhFl)H&oz#(G}6iSyAZY}QMf{XxE!Zf#?3{aX)tB{kQ}YxB3& z-|yi~0i$};rjy^?;p}OcRQfU5cJtfq6TM4aovErLILC(%oEJG67kPXSWUoCG@;GQs zj;3VcCSSKY4iWx`(-`wUM;Lz+Oy~-ub2u9S38MPCjbz(@AoI{K>A(%0ZQ3!r@*_#( zuRC_ejVh12BYp-uJlF(%{GDa+4LkM3JYm9fv9Yfzu#y3c*WyNg(D&$RY4i3~1My!( zI_`fe4MgYF`HdwvDIO@mQRYA}8(CsT9*gd8fnH%a_@BPam00_kT(%TrGcuqsb zt{YLN4Bmxj#;CjN8q@2$A{zJul}W=N#g1SxIk>_;^GgPX(mI@-9ZtJVdB`D{cxY&C zj;6Yu9Yr&Jk{YZ!2(d-5RH$pGDD08~!(%`8M^)NSHHqTlMHSYlsa1$XS1Ab9JD$Ro zm!o``oer?}$vGx(M~M{A6ajkW7h&XtJVq$~J;8XWx_6iPta50_h@-J-m^QtWdLQhk zf9PLD5r85CSqjTv+eN{OURk}_olQQPY!P2@ zes0Zwcc$ZJz_V&+gy;Ccf~h&sIU38yTCBG!Ps4v|s6`Fd+eb@nu#@bygiMoo zo72_r!Kwon^c>-}S)KLW1VCe0vPcmYe)(mTa*e0xMV$jee+OsYO8eWofk4dG zyjh|qtM$!Rzc$-<=8#R7&T1+Mx#Z1*_-Snog4*pYp?#4tO_aSC>h?9e@--+ z@yYlON^Fj`?`x(QC8>9Z_3fGKYKPl|)d7(_bj->b=~nCTH2H6%ycacbayTIgy ze1=D~nNA%wriLM%d3mq#?-s}upOSCWXXFMj!AKJ0o)F`(m<~3Cih~UVwt@`1f-H@j zk_;7D*Wb10nnxN6q+ayAJoy%Zr27DT@?A(kZY^@G^|@2*cwijz244jLP*_DNc2YH zVSwlGcE_F@{v1)s&fC>xg+}v;Cv>Um)B)eJ?NOyyPVXoSy!W!)dI%2Ba(>V}mFusj zToSY%6`o5xpLAq#E012yk-s3|KXtqFqY=kMo`j5(@h#t^s@~?o7a~zp88&O-wFTn0 zxBfR_)xq?$mlt`js<=-#vwqGm*Hu}2>sp->^35IvK2)r8vdI006L1gQOM3ZLR{BvQ z{(`wj5jdmGZo+O1DxlJi81LPW& zBOMeX)zkYl(L{Dqg$=w@7-5++BcN{nKMnsr`1YURU#tIze*r-Czla9=fB5&G@NXIv z=|}f`zxkV4OD}t?v|mc4xXnXVCHrC-=?<{K#<+u0+3~Mbofksd%eqWtbWa>|U35*U zRd&)a)TQ(VtB&@;KSLqXe?zdG=qRd2{|sPHM*jk^jVhhZwYSr%gg~+TH?R9QCI(?U zr}E9Kl49iJUzPvl;LqiHHunT`WX;_azxfBT=eyze0h%d~|L+i%&RYFAT{5Mqs(PJJ zX{m~&_o>B!YY!fhR1*P3VE{qN|4BG$I|UNx@)${n?;B^5T{mn9~aA2o{~nr>3?9Xg4jR6*mybde~1DN*8n1(-F}5=dL)Rb3wpy)s68Tj~@K$JM00TK?t>FvN$@?L`O! z`Gw&DYnUDB<{#&A5A3?5t?S)-u&qNz@qO<+53`<&TwR)$WQ@fde9vTdz42SYz_BVP z%8btTeNYOghh6MxGGF~4)@$VIS?E^i)Fk_;-tM}&g$fKweev8$(-GHIv*%a&n?L~& zDskbKPlj5CFU{~l@LR%g)Z_zbWEs>Fr2MPJGv zIbPORV}Iu|&iZ^$D3sO2yxfQ`dMT`vP+YW5ILD%p>8e1XKzHnIqnd40eTdfi$+i$d zw#>p)5dij_{v*_Uzd{FYV$M^l+M#{UEJ{G0{K1KMSXA{Klm~?M8VuqaR%<4HbYV{2 zPC4wUsP%Lf3pNR0n4#Dc^i@9IswQQVo_IYoGBEn1!9;7r0VLgBX01&ja6HD4eC^KQ zE&QqM-@raGb&inkksI8nmaI-a37`lAJ!o!0zYxw<$~SsNK_=9Vs$9SS}6z;ZE5Z6!}}+ z_W0j`Ga0-$lA0QKNUz2FwccpN<2F{;WPkl50pOWG<&s$TqJN^qS{n8xvy4usBS9J! z&F^`xO6?`W?ffLM>_g9$q|L{Pr0>erYn% zDS}v#_3UEsGpvK1R~xl$>~$i(Pxg|Xn!&aB5I%OAf@|9o|(wUG1H zs!!i!jEY2B_T2o}D28optn*K%;xC{-S^os=AyI{Ve5BFZeXyp3e+pb=Hg59z#QPtB zDYVPzLKU%O)jx`^PmSr)6#h=Ct%NVVEVqX1dHuBfJF=qZ-rt)ou*0)t!UM?sCOsh#3X zn}wXzD__vFPqP*HeP@z-s$bJjV`KsD8SSi}ZF=*Qo@6`w(I`7q*W7i`$J-(avKPQK zcju<myh?mr^;Ql+rP3o&jX4P z)6!#P7V(OCjr@&=zA|TDj0>(xM1j!3RUnxj@8k+8Y})H`$Z6(6`TV*SpD~`tMuU@? zAfQDE?z|u;KF~X&TQ@kT{PCL{08(JqT*|XibZJ$25F)lqWlRg#u2#O+60QvCc_Po9 z^B-x&PnGtgI7h22){pBLjw7Ql6ItA^D}GG3NfSGpYh|`7svhF-OCK#)v30R1KY(~G zD*|~bX@7$!O`9DQBC7(!qc!e}7NMf#w`-J5q^n`x;+O01gYauP)~zOW`Nw+ zu%{oetJX|SdfW&0v$47BhHYtmMOq-i{OMY@HcP4RhqIP)9F@#<-{JYvv~Sk2wB&(x zuLp>To^X9wV~Le~scY4z6WYTsE}OiOe(fdV3(l4B@+pXHjt%m}_?7(IvLD(Xmyjc3 zH8JXLr3rlnSoTFt(O7t<1&OQ;Y^foSH=v&F)X%|0NLfyS+P~+MH+$X=KQ#PRMES?q zSFQP(PzXflwM!EV*q?9bDSt-CLSY{~)+Aj^$Mj`?v7eo<9dLVWjB(f2mw)4wDe*GW zL1hv}UBHjr{&!Vn6m0p!Ia|~qBclzVj7j@EUY+o}tLlP)Ko{K91_qP`TS$i-Ik)o7 zkSwcLZ6X?q8`tA_g6(ZWoE47WhRMIDvHmi*CTTmEBRfjuqMZdJ@G*DH=uEo!k%ht1 z@E2K1Q7rIitIplh0NpB6IHxIm2uR=M`>)F=0>mrw_@5b9$8aBoPipIr)MJbJQ8Ezt z#wWtSu%$6p3xo^-q+M^T$i-q%6YdQ+aH6P)p#zkN%taPjwV8X9%$Io|XjAwTY3ag5 zP6uRWnxE8ce_!eA1)5O5d%q~Mg#9mKnT^NGf2%#xy-I$g-;^}I@crU0B@iy>_GK(z zIoCimU=fmC_c#H0d6Wc?YK&Z5_Nd9`ie}pHo8w!;JsfHoE_*4tF?W$qfMi7)jpmo> zP$hF=a$y~69(X$d`(%A2AffnOVCgr&SGim9!P$f zQ!9fV+U}3LZn%=4oEkk23)R7^dPBWHMOpVq(=OnbEgTpd7#J8E)0$7Ihz&&rA=~** zl6(g9Ip0g*o+xSP|1vfZc?ud;d$ECHoCPAjLgiOoSb`W1KP;J=cc2n zF;-euR#8!5F`VX;%;S8&R}>fsic!hlvmd%G@~l2s>*|{rYXa8-4B`GQte(7vW~=>n znf!@HmIj;VRhtJL4Z6wa9KYNBq8IEkp-SP;%Ev~_G9w3ll-wLfHjQIrV|^-*vmz^A zvyRC0%8lKxynmv@fV!ihq&cP`J&nr04b(nD6MQwbqvSln9I@Gy7tlS}hfoEEiWCI)QxkOZpR|_b^pLLpjbivF{ zJ3@89PejppZA^lS8UX1j7h(sNcdZ|Nv0$3$v)>b2t+r<72o6@iU+@xnAua*I^zTI0`+Ev zCXYMt`Cm1ly2!I5IX(a(A@^i*xv_?V&TspWfFfSf*SpeI{x2v zqjEeHzs|QS#@jRQFS=eJTQ{SL>_EY`1J&h54`(=4qX<4ZG&o1;M=8TnPdsaCm_}Ky zPy3hSYbS50N3on}M5`NWj*h|5C&akEH`3f$C>Hyns$ z(5k&VP-PT)oa?!}gbB)--AS#Do5PV>(FliZMTlTBXpflp(y;2}ct zjd9R~e`YT89Eg34Mmgcb&@Ld`6GpZ`8O>@tzDr`*k`Gqv$A~RhJo(Tag6Dbom|e{Q z9t2wsJdHLX;o?XE zIgu#&{mqV$XLGIaq#?k0Z>%lp-JnFqnrp# zN!7v>wDuum?Sq5V+SV%ge%*NOyKKnl#E^1oimF+{?5H;ARE-{9Zj5|AF#*WeQ`r!b z6{WK&Ka|$x<>3+d!0r8BC2iv95gj#6_j?_HcsxtIMU3nzHDB-U6WIH!q6aYXkB+sr zTuf>`)&wdI$2mM0Uw{<~3OXGNrZT1$_4aa1=jY26CNsY{LL3ox`#!6!9e#5 zmu7{EnykA};L{-cVfmP0SJUk)n;Nz`Agl>Pt8{N;(NLmU=lM3BY?|bp8Z<$q+EFtk z%7*6Z)zaDZS-mYb`SmLf4a#Hl!r0d)gj;$U8GECB98Aeeh6(KyR+|@$n|xfIZb(1~BHK9L&olkk%H@eQ8*M)R)LV962rN4U{ciG_Q6>9{rg#948?^A{+VkKU zC0`15I;N+0-w~Pv77E4)dgYncUgqoE|j+tE8R!jOF zh{#c-T2no5?v-SPCfxMChdZjARs}UUC0nH^R4&muQ#tGbh!<#xUDpWUT7nx5lfIW? z<-ZuCK4&41wV=@96Y+1Duy}j2IjvNIld5)dru;ner1m?jD8!2|S|m2RhZ7yGxkR&t zA1@3Q+6lEGS=_*R&P{3W&>-$=C)sWrODpTG<96Xr11S&9fN^o})YGPybHf%2m zrIW|b7MLER4{U9t?w$sv80TGij}@{{wPxi>M8@znT$M*J*Gb(26(d_X+zP~@2o)N! z@nb;80&`sRHW9SrwB90J7n1557a>`=pq38P!7b2%eWd@j%0-b(sM;b9A2*c`yfc78 zX4CJal+zx=%h>s_vRqHwY|C48k;VI_=nm6w z^l$`NB7Qj;8$32Wrdx}a6E^SV`uZXG1$>v6sC>^jyrtgDPuT*^MHvVN42^^zt=7MA zz*5XeOJ|`9*k^wq|9y;z|G&%{7(IWgDP+64<#c;d7T`%GNw} zk7k|&%ibYXHZj8Sc7f|$c%s90((@Q;?D=`&nx-}#jx%k3fjT1uySZ#4Kqx5O^;bRA zfFJEG+#Q06ykD5pGy3FSo(t@{h6BS-+JIdxGzUB{dz1njDTyUil|)A7yxNz1xB9EL z3QD&&(2gk^_6b^x1WhrWOj6oOeY+;1fIgxOwAejOURb_x*o=v+n~v zkVl7Cq?Z|-q)tDZSNyJUz;h8h0M7Z_GH1L8*nwjTC0qBdx7eNKU9T^g`(g-e&NYDk zL@~Pq*v|_O+L~-n_Q0UqT{OnAeBnTYcie`boJ+r|-UKTa|x6t<9*KwNCQh11lmFlodbZGp{Z>VkZunXZU7X zMn|i3d8aRT9XH0|Yo(Ne*Lz#l`5E?dxv$9vz%1`>4SU0Gp9h3+^SGYDN2kHT<(XzL zLvjUD*pFf1ay{|$1)-y;)YR>1A5mCY(alXJUYI1EpJud> ze5v_SwtCrM@X{vQAKmA@9M8)YS=e4}jn7@#U=XnIC=dXi8liwCa`_-}TAmcz=faEI ztWIf58&y#=1?2S@?7XM&%li+U>=mNCIaYS{armuO7W`*-eeG1n>c$SCWQfak{)6@g z?3f|9k69Df*ryoD^=k?~9s3s5NrZAmiMV{0-c=(Xx$!j;xb}wY2z&`3Lly1jM>mav zU1kO!PAoRUt+n`Eora%)e+}mc3+l4aJ1MzS_|g~dw*%QM`==qpFK2hj-&#QH#&GHh zhS1rgZ`(hgNc8qy8NhjuI?=EM^qozK`udtJ{KzLy z&9@K!lx?A*DMgxTQ?wW2>S7t(4jNQ#ELhbZmr4$Z?{G)`8WLX67_H~EK9CO-(dpg$ zVeu~6mMQCVEyy~bigWLquW!Wy>owR#RySfbwt3^ffCL; zC_=$NSTPD-@h0Q3xPhU!fTF``k=bLk@w9~x6XcPn$)JXqOMwH0i1}p-)zyQqH-VL4 zMh!%{`pPZkuCxZBormsm(6#%jGX71}m8^kTzr>|WanQE632bSc^JG;qG}>WHu+-jEw?+=;(CL#d9u#JC)`l_V{Go$kt@^ppgBcclB1FI71wpa{pFt< z)voK>w4>Z_sO%@;_s0EiYT%dGURP{#4ycyiO3no109v`qcc9Y^5LqoVyITlEcQ>N7~L z^pJskKiRnK`1*HP=B4uqA>rv24g|=e+LPrQp*)<;cKqt>>bS#ym`@;zH&0F41J0D8 z?;rSBP#cgv#!_&4!2|RsW@@3ZbFsjj%9`SO&|Chmd;~}9cI$@UFX^V=MGeh$jVq>` z=_Fg?eay~r9?N=wHl#S(`oK9N2Ji5&H7-3sk~a)54pb6wS2h!i`%4!?(viYmvA6i( zcX!8|R7HtC^cUQXk!6NqItPcnjNcIF)gw`Umo z$<@l}3QjuzC2r34xgyKPkWX=dBqtS()O;z^PCL=grXlV8P1c@wbLo;4RCskuM^l_2 z`&>_7;?iAubW^Wi7i0iU8n1j+lJ&9=?bZ*6W&G5>0- zohs1OLPd*q?6BLM(oDB|vZ_9eg@ta=aCl@efIUwgh#3k}llwIki`hCpq7|*0+q-+mo8)KsjTOm!BUH@-=q6i>zO4dD_8=?)Y^P$9 z$re)ug6mjQr_Ps5YVgrgq zJQMfcb$g{{>`)SmAT&4Jj3L1DgITKcqxmbsH7}}7r@&!uK=bM{$iB9opy7BOclF0Y z`aMx{k5^t}TX{obhHQBx!8r8~ni^~-l)IE%yb|_%=1qN4_-=1whBj?&(mah7J54q! z(%#e5Jx&r7Y?ap>xBDdw%XGvM)NVJkrxmx%40^8mfz^t#-1vEL$VpP!M-^qOt&55F z$45t6bP9?bjq#_iWt)&Km+oMsLs3ZI`GHd2w&QtbahvPDqwn1@H`=y+KdkL*khrqb zBaenupZQ$L)Yrz&kFa*_m(>qGkJgU{eQj?zS!-QSeMq#D&A?E!TsAD6?nDE@Q#;oA z&@ZU$LoVgtTgq3;!py0^IA=R^1S4IR$}T?bO0g<)bCrg3Qni?oH^b8~*Ve~^U;v|8nRF=h`u1~+#+e8vtY>6MfVgrwq$SSxYTCL7 zCf3U|*gEs8fZfiC{26rpaB8x-SkQ@z`Rwv!k3k-RQ1ivBcJy^S&CB?*flBXk{Ug%T zYV>E`w>)2}b!e$BZm*}mgt$ z=Y3e-aGQtU?yW6OU@)%>yggkXSuVcySj};_k}2n!(c1Gbz7`2|iS+TsA|A`W2uL-& zrDbv4ohbh1Vb(qTh<@;X$n(6io1@wcX|t7E3@A9|%}UFh0X#(1|2hd2lX;BpZIR~E zvq#l%RcSJG3fG>WA12zjF%?~TpO=*6 zMF$8=&nIvT(Iyz!;#-98%5xt(UfWavc%(X9R{pl7w&S{!?l>mAgf-W7 zzIc9zKvv?mr5XKZ@7hCdMqq2zlUk5gfxMF(dUcZ>C7}*V8EgDr-|siGx|e#kt&evk z=;5d_OB#C@Wms#Kk1Gp~-9^k1%mG%WjuxUsntYhO>#5H1CtkCou&JuVGc*XMWr(0{ zXfg-w#b{d&8klUlZfVc5oEPn6PX_5G_gnj=tb&rpu^O_8HP^`8c|8DeG}sy2y43Sk zWwG<~!wX_+85$S^eGB(l0w-WVa({Ja+Yg=8u1+%}EpkV|ApiBa%RrRZ7O}F$Sr7I} zRP)+W>47=6c6I^+`2OLp+P5v%5@AnVNCe?)8v-k}H7|!A{i2(AX-iEBY*l{RZI5_R z;!HCYxI(ca^!|W}|2D4he}jdPzxRL8IS)fe`N7H?PSyd-MS_$U+K@*eCoOtAOQ74j z6Gt~Bz+RQo$orN#uflDU$S|MQAi0W_ojFN)A}lgGjmEDoNb2AR>E>%So@jOwF1NiE zNdRX8P6a@aKFp@LZ@#hNVEIa2pZ+B>vdyn((*4-ZgY6wpdbFG+stqQ9reKjbEOv-C zolQ#QlV(8wCvXt|)sFuU>6H`JDEk$_F&AxQjAv@Bdzqa!xM@9IJL%~$b++w3)P8`~ zbd72g`(TIGMH&8Kbkw&D#cti~)cdu<<_x#4dSxQeg=X%>#G$BrH|2IaJoY;YX7{zV z*Vj|5&jM>(=k(IJXCWy+$8CB?)||Jpp5++*UkRno*-6Wb@}WrC~MOTxP5s6WR9#$zQ#|qa3zk zqW019I*h7e7wZbUJ`7*I>i~Epkk5ePlFD&bJ~Vr!q{y~pMkQO5J1Ogc#4ebT<<2h6 zHjQ=TKA3Lyg>ug=yAj77BQKe4#-HD}pzEHhedTa9+%#KvLdrwy&@otaVe`u0<$CPb z0X>@)q^>e4RA=b!(P=+1yF-f&zps5l(g}sCbQ?k1oe)?v-#BNkYlrmZ2HPxzImE+W zy|#Ed_I85;;b~(~8CrW`DxRe6opHnY=Bm!Pu*PS03KxqMS9w{5S7}@#a(2$M)*2hl z5=Xz;2ay@xVQtKCap8YuN;YzO)aPxn+p$9}1(KV+PYkmvonow$ARo0JY-CE1Zaf_e zapfiF-@Um}c2PS65`ScCRDqc@{H7o+?>rO^03>p9PN?$c(<-L{@zJiz2;m&E6q4u^ zAAva^i|kAxc6T&l5jbq1fw$i zG)kM53kxD&d#!Qx){BS&)VxxnLe=g^*N2uk zoACfPw%6z6>57wp68;_4@2kDj0m+jMz^I{NjgkU|hx>le?+6`XY8q;6lu3JVy&KK) zsPp?l>NRD__Dk;NPT6>}i;I<7mcGv%jE_~&+3v*K8r>|hRq}+XFk317C7bcts#J%xB?qih?*d8e`;=-se8%AzpYo{wbp^{`$HhQ=q7CkjhXAjwW$s+ zLV;nWb%E1tBVa&YI%r%JNUQmyiNl+O$(m0$gW$CKY#xo+_||2QZ4XBSWUE1ZW`Gss zPmqdO@Mu4D!CJzX7R7i6=q7>GY<7n(&vJDe+!SZzqGfkwZN&o{YL-HYGG)#%LK5oe zPR`YXbHlbLKOdKOD`C5ItH{4pdlmo8nQMeWc4GpU{7WtN;ZiN_atd~n)l6p#>wt%6WrN!ob><_UBODbKlv_8?-WU#47M9>7R2c?9|e5dnl}A4e6T9foXBA~9-+*(MWgP$y4%EW31^}t4WJCjX?B>X zxb$&%m$DHYouwBXLM%wZ@ad-bIL}5<)#<9CmHpU*n8|LmqWUh_t%h~k!AIhV)#KAX z?;C&m_sQu@afbkozJ!6R9;MoM+n#%}G8Kg96Rx4mnK?o4$w!MB#19nVAsm zn3b8dyP4@&9bX{kY%SeVB4&ku!PQ69<>d0dje$LW(14&yX<25D?o6bJ9Zf(rN<^W^Wg%poiK`j_Oy^TSeKC6ftnoSnpEHYp$_IT>XQn!c$poBUbbLvK>6DB%o(OdRerbJ53FP+x2 zC$OIirJNo%{eum}!P0V2>CDp|ZSu{?MuyYbGPr!7bgk~=3mwo1#V>i?%!As@DP|$- z{$3~%9bM{AD(k{oiDoy(VXay5`_A2?}XYio=qYpM+Wlp)wh zJu{{1Dwuhh!n@MaFeaPu-uz50y-f+v3y%rxEZ!Af-8yHPnbjwDXG}sk_1mB9tBHeg(WlXJ{2blNnzve^m!Rxt z1+^GW&z$p`$OB;Ppt$~i#g1(cJPo?`3h#`p9h`FWc~j|DRieI+>ZD9H?yPF&?TW<- z^$tUNqscW?Njpih%@BesmMsSx^3~=@9v_nRAJ;9})o0NU4FugPL`O#G<5zttL&ZE@ zqie#=;ku`>85cg=*W#@sa0B-lgeh}5 zL!Q^WTno1TuB9&+tOl|i*({vKNXGY_g0Wq1_F>G|7pU_vPOVja_+fpEu#p($l{?7u zCKjO}FfE?UNCn%>m=e4kxKXTcxzN9DsM&U?EBeyddN7pga&;vu(a|K$+^(iqyncJJ zHlu$^mvnPu-sRhD<+|igFTtde^kU--uK}S~dO3!r{ZnWCg!#L^N(pCk%Q}`AK@c_> z-5@jF<-!L}uLhB%ngmT6t%t^`o>XVF?w&DBHo?cTc_T;P0>HAmNtS!KN2?kLDGivW zNwcnOWiGl{L{0ge+cMaQWFQdWCMraf>g?D0YScR1-?@0|**4`_atKoTESOiYyVEUX~qo(g}! z=2;s%{TZRZp28$YLyTL_&bC4#5%aX;}?II67d%R4cD;OAnc z@^hG*h{p_W>Y3uAugVG<(MAon=CRIAs+D)1u#fjvBs^Cgw-E0nDyM3X zNB)u6s{8aW&i3L7is-@QZ(Z0j6?SgLdf- zEY?yd$NK}c-{X1O9#$vl-qk4dLuAh|xq47=HvQ77y9m5s(2Ysbe517bv0F-dP!$b3 zwrL&{fOF3*YKWVjK~?8JhT%h1;sgus(+w2I_FBD^noVhE6LXvS$xV@MjOhQaod2`@ z%PQ|Yv3(SVQ~qgV^W|yLaiV+6G_MrDp0fh&mkjxO>?&@0ogEof7uS@sj+*Ot-|gd) zJ?y4$_BLFTX-HX$LJuky;X3t!f!r!qRaikiLtO6l({6&!du`f5Wz@7?r?KL&fn*~$ z1O0=8TSC^E;70w&&*p82DR8kZX-em)ZX4qZ>GtqE{>a*o@>ohEt- zokH=-TT8{BEV0!_E4>Lgn4p%PN^tdcfWRD>?(0ygBAsn^;KRh5p$gwpdHbuG!rZ;% z=wnRuj;QhEhHBiaqehJ7%m7F1z|x`me&W46He+&=W)ACj_cUp`21Qt7;97mWeeM0# zg&WdH*VPpQar^0@B4-hCY)rDVL zf~Uai9$&O1US<(ku98t9Inmc`zpfTZm^XNPiQf;DeQeL7E^inG zxzz>VoX?1x7|b{;^bNlCjZkW`uE$c|;)40e@+Y{s@|!HeX?=!S<1uWnVQG9A)3$*+kp; za@ouQ8Hp2pb%n9I`881DOfGrXs!lQXRk{Lp3OQ@vUgyv*diHv#_TxjBPBCh38T}ij z52|2vamQvQ9-y(-O6G{L<7HYVbQlX`@;2s1&lCT&l4xvKBK0HCVhj zjBbCtU3Za)R+9MHvn3NMn?&+vmqEXTbscVf#yD<4G45Af-GXdxQf~Y8ir+Coez5GB zoJcTlb3|gX5NC6#&qwnz@xn2$Y-K_GEH$=@9|@FvN{S+wpj-M8loOp%;(k!E6P5K$eB{;&SeBRjFLDE^XC0Rs zr4#8*O5lQ1!VQk>6ceY%oY}jXQyycksgpHWb*?Q(LB#U+6em4u)W1*+{DLfP4Vby7 zjT}}K%PA7$MuzKLFD>^SNHf{YC?4;r?syYdiYAlW-M~etOP5;{wWYM=;Gqdt@V7`aKty>1#80NKZ8{rr5qkgHusEJ+O-)PM%v~Ki^^z6DP*Si79oas}+ihkUcfy z0bY)s>7=ul5QvLnEIORyjTv?>Ts3+<|EqGUc-OAtkREH}lw`TcP9cZQ`_V0lx@b&> zZn@EoaRV~78*9#ijPA0EsOk0&UM?YS*PX9pY3c$k-QOCUAQ8jbq7e$NJSKui6VL_Sa zADAdDy!#pau5r9Fhm*BjFTG_ABjW8{`Q>f@1A4x_DU88&wH zr&|KnA=<@iVRgm4T2b1S-XWAzBAaEmbMe=E$$TfV1Ub4ew=tNj2B`1#G#2UBhAkw$ zi$6G)P8E%LP}8a#J7KxirT)TG`WIV_FlReI&)=o5_@{(l5oEwTqJ&=&;1;h7qn%;nLPr zy5|{C_+WdRb$uw6fH6*YVx-(Z_*up)_3g2h6(g&lWE>V(a|c8uH9Fg)5qk)BNcvXm z@z}k52)qXR;#vwQw7#tnK}cFIz)rt6_UWYb2q%E8eY95|o}(;xr!jP#1Vw+{nQbFJOv=SAfj4B=gQO)Q5@#8%DSYU5|E&96z9kYjpj7j!g{1}Jn znZ?kV?z`Eb!Z%w^JffjXsy;3Lp^~$K~2Vb2nL^nzlT-@eU7X}xqmsXKwCUT2k2qIkO>uiIv zS%e(5iK!EGZebe{nC{jc-`?01ZKEMPPQ!vDb95#dbgS2iPiB~#RPWV0e3)Ow3}$AU zdG$bW9I9)uX{j739Gz?|Il7(y zz#HXD>$8x7Gnw6ZK zW4mXAZ2~53*yfQS_Y+fd8fO$eG+{vTsl0rO&S{WVE^S^MCDRMfo)rl+{^R4HMJ@Jy z`j4Em?+Ic_)*(=wzOQU!4K2DQygrP&y z5yAz%&pAz;NjwGcagItjE=J}W14H8LVT8w8IyGRY#xZs-y011U&^AIfu!h)ODM5 zY%^QhwzQ_>A0!p_dvHNrE$VBprI+-3iP;vergL}5pBrggt4|@qTomxp_gKPqPj0Dy z!Dubqd2g@!nEC8?)90@phEL|2nVpK^r}&qp%=BotUWfqm*d{J-S+;ML9phk)Y!wmD z+wE4O^mTDT?H~Mk*SyTUs>dkHTWq%Z!DkVl^V8Qmndx?qS{vKw>rP7!2xompM6+$b zt_eKJx?GO2^w+l*EWaI?cz+6Ic2f13sYVxeR3t==|C1!_SJI5z`g8BF;uP^)wQob{VYUCzp%;S^f6|eNmo05C#;1UGq zd{|x?Gw;iFnf0L<9!s#3XGhpfHFaWhNW>Ur+m4#ctOvIUS>>*dN-AB?y$k^xoU zE98uKxVUUlc11cHmeHz;y*ObT#Q5*(?z|7_h(}`v>lx5&`wrPbLdDDAa|6b^7#ZJd zt_+wq#aYc;`Nw7I^B)09<{@(8cPg}Wdmo~>Mt{E7XCe^$frQV~Tt#7&?cu$Zow{9x z7L4-Z=V-G>6FfF|{G5B&bM;{d#`bHE>@Bx1kL`V^bkbn&J+~$pwWZ6-I~dKvX4zb} zH&T6gXor((#87M6YQ(bZs2aooRwK<^m-9JBOtX5;n*Ng3JzhduQ%g9XcS4^u^AwHN zhwwH~FXIla<_?vOVm>l795@s>H-oBm$H~i2PNjvD9br|DrDw+# zN5>6k-yb1;@d^4Ar?~a`&My{_SNdK2EcU5Ii9tOb(*^3&AU{I+FXTxq?2exre|k`R z5r({x78SsM3VD;t2{HlyeSo1fH{Er82vl;ZC)j!VJj}NQ@Ujn!{D;)S|0p^1-|t2M zT_wa%awB{0mY)@0(?^|Z8}D43UW-qG#WC&` zK#<>eq(g#7YHzrth0f4L3o;k=rG_ok#_)>%o=!W+@gN=_Cl}%oc48g`L0Q<%xc2BN z1K*wV>6fi=V!Sj1%j>?earn&QwLHjqFZwQu0w!|u@NBh=Qs`@+uZ>}%5&X>;FhzO^ zl|OshdA#%ed8660u&oIBArBsf9Uw;qGe=gZ&MH@~!i!|*j!+76ThU{hOBW^+*#PE` zFwC3enyRr05XKV(|8ie7opdKk#2+9Ntgz(--^rvBD;Cu8nF7h{;(oN?YHZ3_bee<0 zuwCHnPAw@7TAcp4Q3C=6;MfVj5#@C-OqazQq)$#cAh1`+H%h&n53-dZC7lFo zGlS72T7kY$Hla@^igW~NupkH z8uZlHAK5%N+%eO!Z|5NKv2?1|oBcXCZ(V2ouGzEY{b=4SdzfKNcw|gi<67VZPt5Z} ztfF`Vfdc(`pUhSQkUslzi{7kwvvW<_$1*fitI67%ll&ZCjJwo~lWHu|h`fAT1|Rzw ze?4z<5?ihOhBo+`Ec*5YvmGSEI`^@f+Kg1s6o^$^POcm8m7u|)5Lgm^A1J5vJI6o~ zJb{t^hW4^ZemX90^*MTyXlIL^i^X?dK7CreO_)s(!Pj_Wru>$qo@F7E!aUPMe@!LFk< ziDQdql$SS*5oX&&D~0%oO>-D(Yu>n#ktB{KE2Qig!jN#RlYWSKs4`2_b!ZQPlvWoT zI=Gh-S(?g)%kr5Wlf0CTtlFN9N?0smLWFL7vC7WPg~X-CJgF|4GSijv%7C)J=pL<5 z!uk3*SR+^U;)3RA6gn6#H%z$2!;na?d13ldDlgoh4NC3gU{nJJa!N(X0UQfzXq%p( zTE|#jc#+!6`r)KanzQ&ZZT;=EotLPHR65;p^3aX>|JU4i2Q~Gz>qh;Du7xBN5N@Tsr!Gnfg6oi?Xt?}(WIzi3-_7#!}ec>ZQQ)msN!fVee{gv z-cRjxJ385p*jFm{{&87ud%dIAPn!nb>{BSLN-uLRk8ltXgX+#?&wWlFW z{MaZcCgCG5J<%~E@GCknG$tHkpVCayOpFwWuQ?xHfU?bSRJ~$XBdeV%9ue`FNm1@7 zH;?z{(A+<}wDg&qFv04b_m3vzh9&mluDdKGuG-+OFGcT{PN9>>eXka5lO@czMyxpE zFFwfoDpO|hd-rJMyn*XmBdYksM<3>g$u3DX_YV%PMhcl{Ew7!&>FGHIwM5A6GYWBu z+d(5*SLjbV7*Dxy38!DSXu{D|>fhRaj@Q3>Jw_p5caw3U#Mw-?RF*zY-!vaXVwWaIMxv{iY4EJ`4 z;4hwe4(`-)+4p%g=r9?9s(Mascm4Vu#vA*u9g7`8eSY<)2O*54(%d)u<2y^;L<^tf z{~45QVJG!zPy07x2o#_y?x=>@J;Yv_j$^7N>JsOPJi7!1U9+O`F+9ar`y4KvrFNSFzZH;$}0tP1x(7* z!hSYq&*FD7?>a{0A8N3PHyvBMp10l|kkU--VDY2$4fyt~+4=M8_( zBM`_JXqqq3wB5D*vJ~cJqZIo%Eqq{H6I&nnS>Ln@H%hN?Du*3x;J)MY=#PeJmhJ1; zJv1rJGQQSA7v6Y#=LGd-Zg69-^Q-K+)j;m8*oZ1>2`e`C+;zKGxcX=`r?aET8gKHa zb2Q#Z6)WO23%>2Xf#DyQTN!9n7#R}Q6|A((fFvkk8S7jJ+5o>ge;_#D!LV@m#Zz7k z0hpOK)2Wh}?7V+#nZaMZ35QU){WMm2WxtErycgv0JshF(y;7a%Caqqyy?<@Dz|XY8 zJqhKyQP}&uy3QL@P_TPlk+Sr}+P*p|OP!8r6FK73_`FFBQ_g(z_atpKzrQ-e)y6JsRP=9n+H>&$M8r zq=G5Z!i9hF$;{8-INnwZq3LdozwI38`)zeKzQ5fOZ&js694cKIy4O;Z**9xV`t>qY z_2|eu&$^Y?oUTxnQ%k|=k%U$An`oq@6}|(Np4ZMq+oQlS*k`K~v+^7~IG4Vz11x8D z`o|W%@T6NM&+|7T``6IzuOymOXp!h8E+q+j_NWwApC}{5N>GPIl|?9PS^0cs)_dgh z&Zg(pm}_5nBvn4*?F=K1t$%j~nyv0tJVo;-aU-jS@PMqS>tL_a*JR{iJ!)H?aQC7= zgXOPtGxm#fd=_3!{j1bm<)<-aN$>Wrhw9!vG}Q{U$WrNZ1Z(W7;%?mL+sl`JH~f_P za5&4>u+|+~^X}+)hzrgI<^oKdiJmEwj!-}qx*eJXMkB1_FPL+OMoOBqvHeCWcW7RE zSzt&~Fy8F%ev081<}~+){V4Uef4QLNOWrmfVTkl#dM;7ds1A>>at>^@bV9oo@`5HL z?OBb!UiCm88Ix8PmY5cnpDHok#OE;vWz@j@S1;YNXuNM!sb{7q3DFb94X?*-%!&Ep zJK~B@T2b9Lk)`5@Mw$uDN}RxMaRIPnV7j|u--Sv1?kNQV<(2%W2q%m(;LE(P;M?$T9$!et{CAPmtWf z#js7$0b!zH|GN8r`k((_c-?)a3zmC-oz{jQ=nMatto+md1vIoN!PkZX?WWV~f32cY z^R%?|Mt>SzSLy428PkCLpUkb~SWZv1l*>S&P@eJi5N=>E<}V8TBqCv7z1AZ}(%PkmdEj_^@=%VK)=}jwO%%woZk)zZSd=rxSG0h9 zVT!G+$JC635?l1QV_@J|+TPm~+u8Y!r6wOXUxU-q(w>G}0j>O0%XBU{u%5*AgAZHV zyGS1PiE?_WA#hyV+?GiuQty%`Go5}grT9X}E@zD>0Q~|KsSA@~{_`G@%-Wn--}gIE zdLF|XuZ;kiyMUfCdB1I1%WS3~}YZBDfP1a_d-MNSJ(g!e8zwjI62 z-_)4g$qkm9tRBHG^>|M;l7gDscd)QsbY<*d2JEoyOTDM$X<#G>RH##SnXx&TO4R!} zI8xUlkDBq=m^{YUWMF{JzvsNNjjpSsJPGt|;jXSES2+dX+NKP4r^t2?Wr-O4)^>P{06l9SFlXpQzF4Q|!ZlvNtc&vT5WSxBR#!>#+iq@Dfe!IKTQULf<#vM}!mKcwFi-p)_j9YK zWm#Zca*EKM+ez2S0Y7xiCIOprCX8XVqjxVGi$i;z&wN8->A2lS&Bb0gn$>MF!NFPa z>_Y?+`F3dLx6~&FCoMh6nsaoc9OG^`8jn49WAABi zKgP?c;}S|iweHlCv?pQ?JCkks>Ewok+6cqO#OFJ|h)-XN+YN;)Lpc{3%8ZKiE4C+l z%fzTCs0-_QTN+5IX%Z-Tn{;xWd1rhDD-Z~~|I~(gZeqRUOF%MDCTts5+KBz5MhL%4 zma6?4Bxwxu*~?q05`ZtdGlT8)$;2*h;CseyVXX$eTUlCN9;1m zm0IlfDZ7Mnn~Dm%-`vFx>l=?0_O-h!Rf}tp+Qz&x)=g|;eAlFt#^a4uPj+%|k}zhO z3yJZwdG4LNm5m$?1wx@jv*mzuE|>RL`UEu`?rHmMjZR6#)b--?Ifkw>2z6~!oFh5RazA+n!9_&=8Lw1H(8Yf*=qM|mAOPAN* zQ$yA@1UA{Iy%SsMa8D+dFiAJNH-oH~n;1Kgzi$m1jKNu<< z_%|%T{_mZkCaxyP*c&|#z8^upZOqAE-Jq!G%3%E=QV#ddW|6Z(d*zLb!nix4zw_VM zUSBIRoE#TR2EVPo(_GD0^R=xsO20?sKym!CzS!v1&6dd8>(pL;7)qEV9PYBz#(KHG zktmPa9F>_&vzhinD(Aeh$N7dW<>@%TGE%FIn2VU3i}-p~p@@!BtgUAf7|-uZ-0%h+ z*lOMidU(rSoaOAx^`}c8;|&yuXCo1aw(<%^_aeM!9IdQYQHW+gNod2GEG=-@c0#JB zW)^*D|M!=Z3H;mxgQ3H(Ysvbf)i{>5P1mJ9r#-&->GSS~2O)7{==HUB)_6qYxYG*5 zp;|Bg?N&`wk=+ zg|g;9X81z&vcq2`;LYO1yg&ySeC-0YpNDD7+5tF4)Ii`j?7IWeorkF2c)K!vdm~Nb z6SGXPCN@BNRpMRK%4Jasr^UIk^U&znnq4POyR1X^i`6w;OA5};hqxPTLcZH*Ir-da zvn85JHx%-#^afL{w+Bx+|HsLC184;x98<9Yp_5zm-F!KO?btAZ z+=OMjbP2cTw>^tk`UItCQ94;-laaS4RAfBd&i(R$B~X7IMsFFbT>=$9d=5Z*M#_f*hto)Ail{1|utAlXj|C1|&~w(wM~ z%$w_7lcp}0MX$bls?%jjxhw=cyb`Y0E>nE&50wc&DAj8sY#TgZIH z`s!DF;I!#d4pd7pmYql3Z$_ttjHL@Lqi?Y|EKnTPaFmTf9>SxH-jLL(2F;T^zwUX##n)7X))3I6$tKQ098;=p?w zbYCtTbr>D@EWE>hnU=FR=B6yM@Cs#)p+vo)FZ2VA?E0|1&rsvd;I-XndN*V*{Iqit zJ0F%lH&+=`=!c6ho(3P*vZ$o=NRk@)M5=M_ID?_&dhdgk;quP3X1NiEqdH&#u)L++ z>l?d|_K;tajb4DoZclk!6$*crbVA4g!wgOgHSkM1uI1A1F=Ue(eAYroJjo^^Vq`*- z5Y(JFf8C+zP&%KZOTUc0Ebj%_Z#NvT<+8j*8n=OVPU*2DTIRihbD06fg z!-3MRp9Ttq$9B%&9-6NwvMPr|0hTK5a~BoMV+16z2(?Tne8*-!{>pY0tkkaKPDkb9NvjJJ|D0QZb!oS9B3yw}4ow zbJ6Y(-OHskQzj|>HTLuZ{pkkiAFiC$;H!jB4YXc zRsM4*%a3S~UggozK|h)GVM@h|zm$u{9Mm{0p54)IfZrf3R|>E}yu95*uE2#kY`YvX zE$3@lk*#&*f_@rmYCk~!<0|mvh$l@kSV=;QO#n|#a*0cN+i~HF20@z0%rboWYk=rEG*#)~o2h~;9re&~*!ctoRgpLy*4fFA zg3ytlJ|V$o{MT5RcIW0s5MgWU0&8vqJIV?l>3acS8mZm*bBDK~jl2FSN#e_D$99%t3d8;Gng7WS+&A@7 zymq;FM%N@DTXygPlIOWK+%P`srlj#l=>)}j=4$Un7hh%N!pSD1tIAtDkPDUBbME|lpxRmxnxu92Rp!(8Lj(uK= z8nRmnq9Y)raI=v>tFj)XnQxkG^B}69g0YX`A_%4b5&aP@l`rTtH-DL$d7^ms_A03s z+n_BV{%~#;ogwpA0uWT>Kit~oJ4qmPTk(4!lhBqTT+d?2DrwB(VDlJw>DnW$w1N$8 zq*R%Z;;fiK;WO>}n}7TDd*K1S%!1eXK_Dp`nLEmNuA$sR=-cGUyuHF5Ko(rv4e5ZT z(+plbsjBR>vW14C9)iib_uR%rU6!LL%8{6=2g>;@t8d)T>wQnoM&~z+bN1%CC7?Dw z+=$KOdlDz^eZ ze)Q}Q9S2hCNv*5<&7U3yaT?8QTT+Fs_2El?5j@z$`|=Otv|3Y3{FWGQa$R86{(aGu zH~x4fH8{mELO|Fa&m~j?)2IsWNy&K~chXnfX7S{X%zTW5!4xLlwkQrX*%2R3&44p? zO<3Q^Dlw5z&Y-I4;;)CQ9!TPCG#&md{B@I#o&lp}lJy;+|ceXEgg{|R7$HkbTwQKW9yI|QmQukKE;~W_} z`)eiNi@AKW>qIPu$IWB7x}!b!^u43Vpt{7&VH%%8Ah1RdN%`| z%`C;nE5INtM=u}LW!O+Ed&lnEw*-6@N+)P}`%i+2>vp$^tJwh!aJb0TWEqqtZOuiQ zk&*SxyNktJL4yMHbMwEX4Fv4sx)K>PK93QWUYpe~qY*sb-d{e48LjlnfX<=b1P_E$ zZ?ALdeQssUe>K(f=X3d#B5+WX#d{6J9TClH7xo{*I{DNt@l4db0?w#k_`cDrXtJP? z2m&T%AR7|sV8(r*`zdf%>;LQ?NRRpqi9t~SX6@(!Flf)p{{dN`-Z!WJ914I?Ro+AQ z0ac=A<7WzTdI1DL#s~mgSj!y{b^9TPAW%ZE>$m7I)W1VYYcm)_WTOwxmU$BpMzXp~ z)mpaf8bpxR9wGjoO=g^(E`Pdorj~OjCCd_0QjINow4jXjPT)`Y!AY(0cm)-=$hl4??*W$1B1pf-c-W-8vY@xaK`g zex``%J}=(ly%Rk5Z&7r`2vY z_~!Q$^592wKN&o+jqgF?&aBIy5zspGsD1w6@7c&!c?ZEK_KJi#aQ5FLMc{+qcQ|&7 zOKuuHiF7(`sz22z#mpAYR2LfhF+7s9|Jnn|=>|m#F{O-FFz4wFAZIDc>l2%AkdvMU zpHYE#hb}9av;|Q%{+o&WGv08Vv5(c`!{n5brOxaE^yl}aTgcba`Ecm6pPxO!BQoi! z(yZeS%d9;38yZJ*kY!7541XBW$ee<#DYrU%i&Vy>);YOVDddDx`up}`IXUFZCf?EIw;{K<89z9 zHYOs+e{P<3B#u|#!S~+Toqd)bYCqF#VfLTa=5SdG>=V@gqTM);rmS(6`zbAvNUig+59)RAT!L2l2j@0msxgT0F8+b%;J;p>(K1$GB7=6A=>EC6J>wN?Ep%QbZb zZ`fqkM#f;ls|g;xEplSflUe=Q_pNQ$Y^LZb{nqODp|M3%Y_eR)$+%o)d8A>rf*msJ zZu0)&Vvq0fc=e`%=kVS! zhZN8LLhB;+AF-2I>f9nxwC=M0cDQ{{XX6IhFHLogN@k)AS}w%dlek)_*`aWP()P{M zv~A}ly?eJs>NnNS3$5U*Vz+f8y8vxta{1`p8LrJ33h7U8$-)IwZobN$^DJ6F+0A~u z2n6UHn^Y1s$A}|B;L^br*Sy!>Z14 zOJ5S?r!KN!>s4SH@n;5$I`5%Kd0mU>BC~ZHQEHGi@yj!d6uV5rlk6NUOi7-<9K9EcGm{9c;9$3A{YK&I#rL^iupdTIwyK(2*wDv;w0)6*ZdX-@ zzQ~wzYZDnSnzDkj;(YhF!y`4bK0OQ>;^FERLGDIQ>4-bd{ODHM8e`ajyODSj*NlrU zeo`b-8f?-`ThvA&qa>%@$dA$G8Ub$^_{>hV6F_|w6OXxt6|h2+aA##I{8HNktqXfB zo2Exa8wMH@YFQCOL`j8Ya`izaqOLpx=3?S6w`4N~RuZKD8vkcMmCiZ*%w4(TRh4 zc4X;zd_1%Et6YE;rN_6nC&t?=UY0lQ!LZ?Nhc>t?@r>w~L4?2PNWq`2Um(k%EkMY) zV@svl1BR<7U*k&hG2G1*~spSN{SF^X&QmMP-fu s8{|nW8E6`rT%Yg~3RLmZsmpKyRGV;3M?XaPOpj3h735`+wDE`k0YP;Oe*gdg literal 102842 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 literal 104862 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 diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt index 404c2e518..28d865e75 100644 --- a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt +++ b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt @@ -238,8 +238,7 @@ Environment information (JSON): "sourceSystemCurrency": "EUR", "sourceSystemLocale": "de-DE", "targetSystemLocale": "en-GB", - "fingerprint": "[uuid]", - "timezone": "Europe\/Berlin" + "fingerprint": "[uuid]" } Pre-mapping (JSON): @@ -251,8 +250,8 @@ Pre-mapping (JSON): { "extensions": [], "sourceId": "timezone", - "description": "Europe\/Berlin", - "destinationUuid": "Europe\/Berlin" + "description": "No source time zone", + "destinationUuid": "Africa\/Abidjan" } ], "choices": [] From a4c333ae9b9c0d7bcb8f5318d252e4a80a5079c8 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Mon, 18 May 2026 13:21:31 +0200 Subject: [PATCH 11/15] Fix threads --- src/DependencyInjection/shopware54.php | 72 ++++++++++++------- src/DependencyInjection/shopware55.php | 72 ++++++++++++------- src/DependencyInjection/shopware56.php | 72 ++++++++++++------- src/DependencyInjection/shopware57.php | 72 ++++++++++++------- src/Exception/MigrationException.php | 12 ++++ .../Shopware/Converter/ShopwareConverter.php | 31 ++++++-- .../Gateway/Api/Reader/TimezoneReader.php | 15 +++- .../Shopware/Premapping/TimezoneReader.php | 9 ++- .../Converter/ShopwareConverterTest.php | 49 ++++++++++++- .../Shopware/Gateway/ApiReaderTest.php | 22 ++++++ .../Premapping/TimezoneReaderTest.php | 18 ++--- 11 files changed, 327 insertions(+), 117 deletions(-) diff --git a/src/DependencyInjection/shopware54.php b/src/DependencyInjection/shopware54.php index 59104b996..55d33303e 100644 --- a/src/DependencyInjection/shopware54.php +++ b/src/DependencyInjection/shopware54.php @@ -100,19 +100,23 @@ $services->set(Shopware54ProductConverter::class) ->parent(ProductConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54ProductOptionRelationConverter::class) ->parent(ProductOptionRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54ProductPropertyRelationConverter::class) ->parent(ProductPropertyRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54TranslationConverter::class) ->parent(TranslationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CategoryAttributeConverter::class) ->parent(CategoryAttributeConverter::class) @@ -120,27 +124,33 @@ $services->set(Shopware54CategoryConverter::class) ->parent(CategoryConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54MediaFolderConverter::class) ->parent(MediaFolderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54MediaConverter::class) ->parent(MediaConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CustomerConverter::class) ->parent(CustomerConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CustomerWishlistConverter::class) ->parent(CustomerWishlistConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54OrderConverter::class) ->parent(OrderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54OrderDocumentAttributeConverter::class) ->parent(OrderDocumentAttributeConverter::class) @@ -148,7 +158,8 @@ $services->set(Shopware54OrderDocumentConverter::class) ->parent(OrderDocumentConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CustomerGroupAttributeConverter::class) ->parent(CustomerAttributeConverter::class) @@ -156,53 +167,66 @@ $services->set(Shopware54CustomerGroupConverter::class) ->parent(CustomerGroupConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54PropertyGroupOptionConverter::class) ->parent(PropertyGroupOptionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54NumberRangeConverter::class) ->parent(NumberRangeConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CurrencyConverter::class) ->parent(CurrencyConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54LanguageConverter::class) ->parent(LanguageConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54SalesChannelConverter::class) ->parent(SalesChannelConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54NewsletterRecipientConverter::class) ->parent(NewsletterRecipientConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54ShippingMethodConverter::class) ->parent(ShippingMethodConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54ProductReviewConverter::class) ->parent(ProductReviewConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54SeoUrlConverter::class) ->parent(SeoUrlConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54CrossSellingConverter::class) ->parent(CrossSellingConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54MainVariantRelationConverter::class) ->parent(MainVariantRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware54PromotionConverter::class) ->parent(PromotionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); }; diff --git a/src/DependencyInjection/shopware55.php b/src/DependencyInjection/shopware55.php index b1ded36b7..7a3cf24c4 100644 --- a/src/DependencyInjection/shopware55.php +++ b/src/DependencyInjection/shopware55.php @@ -100,19 +100,23 @@ $services->set(Shopware55ProductConverter::class) ->parent(ProductConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55ProductOptionRelationConverter::class) ->parent(ProductOptionRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55ProductPropertyRelationConverter::class) ->parent(ProductPropertyRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55TranslationConverter::class) ->parent(TranslationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CategoryAttributeConverter::class) ->parent(CategoryAttributeConverter::class) @@ -120,23 +124,28 @@ $services->set(Shopware55CategoryConverter::class) ->parent(CategoryConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55MediaFolderConverter::class) ->parent(MediaFolderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55MediaConverter::class) ->parent(MediaConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CustomerConverter::class) ->parent(CustomerConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55OrderConverter::class) ->parent(OrderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55OrderDocumentAttributeConverter::class) ->parent(OrderDocumentAttributeConverter::class) @@ -144,7 +153,8 @@ $services->set(Shopware55OrderDocumentConverter::class) ->parent(OrderDocumentConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CustomerGroupAttributeConverter::class) ->parent(CustomerAttributeConverter::class) @@ -152,57 +162,71 @@ $services->set(Shopware55CustomerGroupConverter::class) ->parent(CustomerGroupConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CustomerWishlistConverter::class) ->parent(CustomerWishlistConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55PropertyGroupOptionConverter::class) ->parent(PropertyGroupOptionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55NumberRangeConverter::class) ->parent(NumberRangeConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CurrencyConverter::class) ->parent(CurrencyConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55LanguageConverter::class) ->parent(LanguageConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55SalesChannelConverter::class) ->parent(SalesChannelConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55NewsletterRecipientConverter::class) ->parent(NewsletterRecipientConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55ShippingMethodConverter::class) ->parent(ShippingMethodConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55ProductReviewConverter::class) ->parent(ProductReviewConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55SeoUrlConverter::class) ->parent(SeoUrlConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55CrossSellingConverter::class) ->parent(CrossSellingConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55MainVariantRelationConverter::class) ->parent(MainVariantRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware55PromotionConverter::class) ->parent(PromotionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); }; diff --git a/src/DependencyInjection/shopware56.php b/src/DependencyInjection/shopware56.php index 5276d1429..8811de4a4 100644 --- a/src/DependencyInjection/shopware56.php +++ b/src/DependencyInjection/shopware56.php @@ -100,19 +100,23 @@ $services->set(Shopware56ProductConverter::class) ->parent(ProductConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56ProductOptionRelationConverter::class) ->parent(ProductOptionRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56ProductPropertyRelationConverter::class) ->parent(ProductPropertyRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56TranslationConverter::class) ->parent(TranslationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CategoryAttributeConverter::class) ->parent(CategoryAttributeConverter::class) @@ -120,27 +124,33 @@ $services->set(Shopware56CategoryConverter::class) ->parent(CategoryConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56MediaFolderConverter::class) ->parent(MediaFolderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56MediaConverter::class) ->parent(MediaConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CustomerConverter::class) ->parent(CustomerConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CustomerWishlistConverter::class) ->parent(CustomerWishlistConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56OrderConverter::class) ->parent(OrderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56OrderDocumentAttributeConverter::class) ->parent(OrderDocumentAttributeConverter::class) @@ -148,7 +158,8 @@ $services->set(Shopware56OrderDocumentConverter::class) ->parent(OrderDocumentConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CustomerGroupAttributeConverter::class) ->parent(CustomerAttributeConverter::class) @@ -156,53 +167,66 @@ $services->set(Shopware56CustomerGroupConverter::class) ->parent(CustomerGroupConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56PropertyGroupOptionConverter::class) ->parent(PropertyGroupOptionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56NumberRangeConverter::class) ->parent(NumberRangeConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CurrencyConverter::class) ->parent(CurrencyConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56LanguageConverter::class) ->parent(LanguageConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56SalesChannelConverter::class) ->parent(SalesChannelConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56NewsletterRecipientConverter::class) ->parent(NewsletterRecipientConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56ShippingMethodConverter::class) ->parent(ShippingMethodConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56ProductReviewConverter::class) ->parent(ProductReviewConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56SeoUrlConverter::class) ->parent(SeoUrlConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56CrossSellingConverter::class) ->parent(CrossSellingConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56MainVariantRelationConverter::class) ->parent(MainVariantRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware56PromotionConverter::class) ->parent(PromotionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); }; diff --git a/src/DependencyInjection/shopware57.php b/src/DependencyInjection/shopware57.php index fcfe55967..8e1b0dbd6 100644 --- a/src/DependencyInjection/shopware57.php +++ b/src/DependencyInjection/shopware57.php @@ -100,19 +100,23 @@ $services->set(Shopware57ProductConverter::class) ->parent(ProductConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57ProductOptionRelationConverter::class) ->parent(ProductOptionRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57ProductPropertyRelationConverter::class) ->parent(ProductPropertyRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57TranslationConverter::class) ->parent(TranslationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CategoryAttributeConverter::class) ->parent(CategoryAttributeConverter::class) @@ -120,27 +124,33 @@ $services->set(Shopware57CategoryConverter::class) ->parent(CategoryConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57MediaFolderConverter::class) ->parent(MediaFolderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57MediaConverter::class) ->parent(MediaConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CustomerConverter::class) ->parent(CustomerConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CustomerWishlistConverter::class) ->parent(CustomerWishlistConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57OrderConverter::class) ->parent(OrderConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57OrderDocumentAttributeConverter::class) ->parent(OrderDocumentAttributeConverter::class) @@ -148,7 +158,8 @@ $services->set(Shopware57OrderDocumentConverter::class) ->parent(OrderDocumentConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CustomerGroupAttributeConverter::class) ->parent(CustomerAttributeConverter::class) @@ -156,53 +167,66 @@ $services->set(Shopware57CustomerGroupConverter::class) ->parent(CustomerGroupConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57PropertyGroupOptionConverter::class) ->parent(PropertyGroupOptionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57PromotionConverter::class) ->parent(PromotionConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57NumberRangeConverter::class) ->parent(NumberRangeConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57MainVariantRelationConverter::class) ->parent(MainVariantRelationConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CurrencyConverter::class) ->parent(CurrencyConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57LanguageConverter::class) ->parent(LanguageConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57SalesChannelConverter::class) ->parent(SalesChannelConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57NewsletterRecipientConverter::class) ->parent(NewsletterRecipientConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57ShippingMethodConverter::class) ->parent(ShippingMethodConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57ProductReviewConverter::class) ->parent(ProductReviewConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57SeoUrlConverter::class) ->parent(SeoUrlConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); $services->set(Shopware57CrossSellingConverter::class) ->parent(CrossSellingConverter::class) - ->tag('shopware.migration.converter'); + ->tag('shopware.migration.converter') + ->tag('kernel.reset', ['method' => 'reset']); }; diff --git a/src/Exception/MigrationException.php b/src/Exception/MigrationException.php index 755ab62cb..508d9f632 100644 --- a/src/Exception/MigrationException.php +++ b/src/Exception/MigrationException.php @@ -107,6 +107,8 @@ class MigrationException extends HttpException final public const MAIN_VARIANT_RELATION_MISSING_ID_AND_ORDER_NUMBER = 'SWAG_MIGRATION__MAIN_VARIANT_RELATION_MISSING_ID_AND_ORDER_NUMBER'; + final public const READER_REGISTRY_USAGE_NOT_ALLOWED = 'SWAG_MIGRATION__READER_REGISTRY_USAGE_NOT_ALLOWED'; + public static function associationEntityRequiredMissing(string $entity, string $missingEntity): self { return new self( @@ -567,4 +569,14 @@ public static function mainVariantRelationMissingIdAndOrderNumber(): self 'MainVariantRelation requires ID and order number.', ); } + + public static function readerRegistryUsageNotAllowed(string $class): self + { + return new self( + Response::HTTP_INTERNAL_SERVER_ERROR, + self::READER_REGISTRY_USAGE_NOT_ALLOWED, + 'The reader "{{ reader }}" is an internal helper and must not be resolved through the ReaderRegistry.', + ['reader' => $class] + ); + } } diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 263cf325f..22110951a 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -17,6 +17,7 @@ use SwagMigrationAssistant\Migration\Logging\Log\ConvertDateTimeFailedLog; use SwagMigrationAssistant\Migration\Mapping\Lookup\LanguageLookup; use SwagMigrationAssistant\Migration\MigrationContextInterface; +use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; use Symfony\Contracts\Service\ResetInterface; #[Package('fundamentals@after-sales')] @@ -30,6 +31,8 @@ abstract class ShopwareConverter extends Converter implements ResetInterface protected const TYPE_DATE = 'date'; protected const TYPE_DATETIME = 'datetime'; + private const CONVERT_VALUE_LOG_ENTITY_NAME = 'shopware_converter_convert_value'; + protected MigrationContextInterface $migrationContext; /** @@ -102,7 +105,11 @@ protected function convertValue( break; case self::TYPE_DATETIME: - $sourceValue = $this->convertDateTime((string) $sourceData[$sourceKey]); + $sourceValue = $this->convertDateTime( + (string) $sourceData[$sourceKey], + self::CONVERT_VALUE_LOG_ENTITY_NAME + ); + if ($sourceValue === null) { return; } @@ -175,7 +182,7 @@ protected function getAttributes( } if (isset($mapping['additionalData']['columnType']) && $mapping['additionalData']['columnType'] === 'datetime') { - $convertedValue = $this->convertDateTime((string) $value); + $convertedValue = $this->convertDateTime((string) $value, $entityName); if ($convertedValue === null) { continue; @@ -207,7 +214,7 @@ protected function validDate(string $value): bool } } - private function convertDateTime(string $value): ?string + private function convertDateTime(string $value, string $entityName): ?string { if ($value === '') { return null; @@ -230,6 +237,7 @@ private function convertDateTime(string $value): ?string ->withSourceData(['dateTime' => $value]) ->withExceptionMessage($exception->getMessage()) ->withException($exception) + ->withEntityName($entityName) ->build(ConvertDateTimeFailedLog::class) ); @@ -237,6 +245,19 @@ private function convertDateTime(string $value): ?string } } + /** + * We do not want to add an optional context to the + * "ShopwareConverter::convertValue()" method, as this would break the API + * + * That is why: + * the timezone is read from the connection premapping because the converter has + * no Shopware "Context" available. + * + * "MappingServiceInterface::getMapping()" requires a "Context". + * The timezone is a premapping configuration, so reading it from + * "$migrationContext->getConnection()->getPremapping()" keeps it available + * during conversion without DAL. + */ private function getTimezoneFromPremapping(): ?string { $runId = $this->migrationContext->getRunUuid(); @@ -247,12 +268,12 @@ private function getTimezoneFromPremapping(): ?string $timezone = null; $premapping = $this->migrationContext->getConnection()->getPremapping(); foreach ($premapping ?? [] as $item) { - if ($item->getEntity() !== 'source_timezone') { + if ($item->getEntity() !== TimezoneReader::MAPPING_NAME) { continue; } foreach ($item->getMapping() as $mapping) { - if ($mapping->getSourceId() === 'timezone') { + if ($mapping->getSourceId() === TimezoneReader::SOURCE_ID) { $timezone = $mapping->getDestinationUuid() === '' ? null : $mapping->getDestinationUuid(); } } diff --git a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php index f6dffae51..7853285e1 100644 --- a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php +++ b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php @@ -8,14 +8,27 @@ namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader; use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Exception\MigrationException; use SwagMigrationAssistant\Migration\MigrationContextInterface; +/** + * This API helper is used only by the Shopware timezone premapping. + * + * This is intentionally not a regular migration reader and must not be resolved + * through the ReaderRegistry during the migration process. It + * only exists to fetch the source system timezone from the Migration Connector + * API in the premapping. + * + * The class extends ApiReader only to reuse the existing API client/request + * handling for connector endpoints instead of duplicating that logic here. + */ #[Package('after-sales')] class TimezoneReader extends ApiReader { public function supports(MigrationContextInterface $migrationContext): bool { - return false; + // TimezoneReader must not be resolved through the ReaderRegistry + throw MigrationException::readerRegistryUsageNotAllowed(self::class); } protected function getApiRoute(): string diff --git a/src/Profile/Shopware/Premapping/TimezoneReader.php b/src/Profile/Shopware/Premapping/TimezoneReader.php index 186cca853..4ce794c3a 100644 --- a/src/Profile/Shopware/Premapping/TimezoneReader.php +++ b/src/Profile/Shopware/Premapping/TimezoneReader.php @@ -22,9 +22,9 @@ #[Package('after-sales')] class TimezoneReader extends AbstractPremappingReader { - private const MAPPING_NAME = 'source_timezone'; + public const MAPPING_NAME = 'source_timezone'; - private const SOURCE_ID = 'timezone'; + public const SOURCE_ID = 'timezone'; /** * @var array @@ -59,7 +59,6 @@ public function getPremapping(Context $context, MigrationContextInterface $migra $sourceTimezone = $this->readSourceTimezone($migrationContext); - $description = $sourceTimezone ?? 'No source time zone'; $destinationTimezone = ''; if ($sourceTimezone !== null && isset($this->validTimezones[$sourceTimezone])) { @@ -79,7 +78,7 @@ public function getPremapping(Context $context, MigrationContextInterface $migra [ new PremappingEntityStruct( self::SOURCE_ID, - $description, + 'Source system time zone', $destinationTimezone ), ], @@ -94,7 +93,7 @@ private function readSourceTimezone(MigrationContextInterface $migrationContext) } $timezoneResult = $this->timezoneReader->read($migrationContext); - $timezone = $timezoneResult[0]['timezone'] ?? null; + $timezone = $timezoneResult[0][self::SOURCE_ID] ?? null; if (!\is_string($timezone) || $timezone === '' || !isset($this->validTimezones[$timezone])) { return null; } diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index fcc11d2cf..09cd9f704 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -12,6 +12,8 @@ use Shopware\Core\Framework\Log\Package; use Shopware\Core\Framework\Uuid\Uuid; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; +use SwagMigrationAssistant\Migration\Logging\Log\Builder\MigrationLogEntry; +use SwagMigrationAssistant\Migration\Logging\Log\ConvertDateTimeFailedLog; use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Mapping\MappingServiceInterface; use SwagMigrationAssistant\Migration\MigrationContext; @@ -123,6 +125,12 @@ public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone( $loggingService = $this->createMock(LoggingServiceInterface::class); $loggingService->expects($this->once()) ->method('log') + ->with(static::callback(static function (MigrationLogEntry $logEntry): bool { + static::assertSame(ConvertDateTimeFailedLog::getCode(), $logEntry->getCode()); + static::assertSame('shopware_converter_convert_value', $logEntry->getEntityName()); + + return true; + })) ->willReturnSelf(); $this->setSourceTimezone('Not/A_Timezone'); @@ -183,6 +191,45 @@ public function testGetAttributesConvertsDateTimeCustomFieldWithMappedSourceTime ], $converted); } + public function testGetAttributesLogsEntityNameWhenDateTimeCustomFieldCannotBeConverted(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getMapping') + ->with($this->connection->getId(), 'product_custom_field', 'release_time', $this->context) + ->willReturn([ + 'id' => Uuid::randomHex(), + 'additionalData' => [ + 'columnType' => 'datetime', + ], + ]); + $mappingService->expects($this->never())->method('getValue'); + + $loggingService = $this->createMock(LoggingServiceInterface::class); + $loggingService->expects($this->once()) + ->method('log') + ->with(static::callback(static function (MigrationLogEntry $logEntry): bool { + static::assertSame(ConvertDateTimeFailedLog::getCode(), $logEntry->getCode()); + static::assertSame('product', $logEntry->getEntityName()); + + return true; + })) + ->willReturnSelf(); + + $this->setSourceTimezone('Not/A_Timezone'); + + $converter = $this->createConverter($mappingService, $loggingService); + + $converted = $converter->convertAttributes( + ['release_time' => '2026-05-01 12:30:00'], + 'product', + 'shopware', + $this->context + ); + + static::assertNull($converted); + } + private function createConverter( MappingServiceInterface $mappingService, ?LoggingServiceInterface $loggingService = null, @@ -218,7 +265,7 @@ private function setSourceTimezone(?string $timezone): void $this->connection->setPremapping([ new PremappingStruct(TimezoneReader::getMappingName(), [ - new PremappingEntityStruct('timezone', $timezone, $timezone), + new PremappingEntityStruct(TimezoneReader::SOURCE_ID, $timezone, $timezone), ]), ]); } diff --git a/tests/Profile/Shopware/Gateway/ApiReaderTest.php b/tests/Profile/Shopware/Gateway/ApiReaderTest.php index f670eaf77..33122ea88 100644 --- a/tests/Profile/Shopware/Gateway/ApiReaderTest.php +++ b/tests/Profile/Shopware/Gateway/ApiReaderTest.php @@ -18,6 +18,7 @@ use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\ProductDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\ProductReader; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Connection\ConnectionFactory; use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; use Symfony\Component\HttpFoundation\Response as SymfonyResponse; @@ -106,4 +107,25 @@ public function testReadGatewayException(): void static::fail('MigrationException not thrown'); } + + public function testTimezoneReaderCannotBeResolvedThroughReaderRegistry(): void + { + $migrationContext = new MigrationContext( + new SwagMigrationConnectionEntity(), + new Shopware55Profile(), + ); + $reader = new TimezoneReader($this->createMock(ConnectionFactory::class)); + + try { + $reader->supports($migrationContext); + } catch (MigrationException $e) { + static::assertSame(SymfonyResponse::HTTP_INTERNAL_SERVER_ERROR, $e->getStatusCode()); + static::assertSame(MigrationException::READER_REGISTRY_USAGE_NOT_ALLOWED, $e->getErrorCode()); + static::assertSame(TimezoneReader::class, $e->getParameters()['reader']); + + return; + } + + static::fail('MigrationException not thrown'); + } } diff --git a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php index 44c87af27..461be62e8 100644 --- a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php +++ b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php @@ -44,14 +44,14 @@ public function testSupportsShopwareApiAndLocalGateways(): void public function testGetPremappingUsesDetectedSourceTimezone(): void { $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); - $reader = $this->createReader([['timezone' => 'Europe/Berlin']]); + $reader = $this->createReader([[TimezoneReader::SOURCE_ID => 'Europe/Berlin']]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertSame(TimezoneReader::getMappingName(), $premapping->getEntity()); static::assertNotEmpty($premapping->getChoices()); static::assertCount(1, $premapping->getMapping()); - static::assertSame('timezone', $premapping->getMapping()[0]->getSourceId()); - static::assertSame('Europe/Berlin', $premapping->getMapping()[0]->getDescription()); + static::assertSame(TimezoneReader::SOURCE_ID, $premapping->getMapping()[0]->getSourceId()); + static::assertSame('Source system time zone', $premapping->getMapping()[0]->getDescription()); static::assertSame('Europe/Berlin', $premapping->getMapping()[0]->getDestinationUuid()); } @@ -60,7 +60,7 @@ public function testGetPremappingKeepsConfiguredDestinationTimezone(): void $connection = $this->createConnection(ShopwareLocalGateway::GATEWAY_NAME); $connection->setPremapping([ new PremappingStruct(TimezoneReader::getMappingName(), [ - new PremappingEntityStruct('timezone', 'Europe/Berlin', 'America/New_York'), + new PremappingEntityStruct(TimezoneReader::SOURCE_ID, 'Europe/Berlin', 'America/New_York'), ]), ]); @@ -75,20 +75,20 @@ public function testGetPremappingKeepsConfiguredDestinationTimezone(): void public function testGetPremappingReturnsSelectableRowWhenSourceTimezoneCannotBeRead(?string $sourceTimezone): void { $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); - $reader = $this->createReader([['timezone' => $sourceTimezone]]); + $reader = $this->createReader([[TimezoneReader::SOURCE_ID => $sourceTimezone]]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertNotEmpty($premapping->getChoices()); static::assertCount(1, $premapping->getMapping()); - static::assertSame('timezone', $premapping->getMapping()[0]->getSourceId()); - static::assertSame('No source time zone', $premapping->getMapping()[0]->getDescription()); + static::assertSame(TimezoneReader::SOURCE_ID, $premapping->getMapping()[0]->getSourceId()); + static::assertSame('Source system time zone', $premapping->getMapping()[0]->getDescription()); static::assertSame('', $premapping->getMapping()[0]->getDestinationUuid()); } public function testGetPremappingUsesEnvironmentInformationForApiGateway(): void { $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); - $reader = $this->createReader([['timezone' => 'UTC']]); + $reader = $this->createReader([[TimezoneReader::SOURCE_ID => 'UTC']]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertSame('UTC', $premapping->getMapping()[0]->getDestinationUuid()); @@ -100,7 +100,7 @@ public function testGetPremappingDoesNotReadSourceTimezoneForLocalGateway(): voi $reader = $this->createReader(null, 0); $premapping = $reader->getPremapping($this->context, $migrationContext); - static::assertSame('No source time zone', $premapping->getMapping()[0]->getDescription()); + static::assertSame('Source system time zone', $premapping->getMapping()[0]->getDescription()); static::assertSame('', $premapping->getMapping()[0]->getDestinationUuid()); } From 1e0a58f63b2d78666df52b350b243db5e3bc86cc Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Mon, 18 May 2026 13:40:19 +0200 Subject: [PATCH 12/15] Fix threads --- .../Shopware/Converter/ShopwareConverter.php | 14 +++++--- .../Converter/ShopwareConverterTest.php | 35 ++++++++++++++++--- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 22110951a..31dbc727e 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -12,6 +12,7 @@ use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Connection\Helper\ConnectionNameSanitizer; use SwagMigrationAssistant\Migration\Converter\Converter; +use SwagMigrationAssistant\Migration\DataSelection\DataSet\DataSet; use SwagMigrationAssistant\Migration\DataSelection\DefaultEntities; use SwagMigrationAssistant\Migration\Logging\Log\Builder\MigrationLogBuilder; use SwagMigrationAssistant\Migration\Logging\Log\ConvertDateTimeFailedLog; @@ -31,7 +32,7 @@ abstract class ShopwareConverter extends Converter implements ResetInterface protected const TYPE_DATE = 'date'; protected const TYPE_DATETIME = 'datetime'; - private const CONVERT_VALUE_LOG_ENTITY_NAME = 'shopware_converter_convert_value'; + private const CONVERT_VALUE_LOG_ENTITY_NAME = 'shopware_converter_convert_value_log_entity'; protected MigrationContextInterface $migrationContext; @@ -105,10 +106,13 @@ protected function convertValue( break; case self::TYPE_DATETIME: - $sourceValue = $this->convertDateTime( - (string) $sourceData[$sourceKey], - self::CONVERT_VALUE_LOG_ENTITY_NAME - ); + $dataset = $this->migrationContext->getDataSet(); + $entityName = self::CONVERT_VALUE_LOG_ENTITY_NAME; + if ($dataset instanceof DataSet) { + $entityName = $dataset::getEntity(); + } + + $sourceValue = $this->convertDateTime((string) $sourceData[$sourceKey], $entityName); if ($sourceValue === null) { return; diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index 09cd9f704..b42a1745b 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -12,6 +12,7 @@ use Shopware\Core\Framework\Log\Package; use Shopware\Core\Framework\Uuid\Uuid; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; +use SwagMigrationAssistant\Migration\DataSelection\DataSet\DataSet; use SwagMigrationAssistant\Migration\Logging\Log\Builder\MigrationLogEntry; use SwagMigrationAssistant\Migration\Logging\Log\ConvertDateTimeFailedLog; use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; @@ -19,6 +20,7 @@ use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; +use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\ProductDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; @@ -127,7 +129,7 @@ public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone( ->method('log') ->with(static::callback(static function (MigrationLogEntry $logEntry): bool { static::assertSame(ConvertDateTimeFailedLog::getCode(), $logEntry->getCode()); - static::assertSame('shopware_converter_convert_value', $logEntry->getEntityName()); + static::assertSame('shopware_converter_convert_value_log_entity', $logEntry->getEntityName()); return true; })) @@ -142,6 +144,30 @@ public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone( static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); } + public function testConvertValueLogsDataSetEntityNameWhenDateTimeCannotBeConverted(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->never())->method('getValue'); + $loggingService = $this->createMock(LoggingServiceInterface::class); + $loggingService->expects($this->once()) + ->method('log') + ->with(static::callback(static function (MigrationLogEntry $logEntry): bool { + static::assertSame(ConvertDateTimeFailedLog::getCode(), $logEntry->getCode()); + static::assertSame(ProductDataSet::getEntity(), $logEntry->getEntityName()); + + return true; + })) + ->willReturnSelf(); + $this->setSourceTimezone('Not/A_Timezone'); + + $converter = $this->createConverter($mappingService, $loggingService, '', new ProductDataSet()); + + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00'); + + static::assertSame([], $converted); + static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); + } + public function testConvertValueKeepsValidDateValueUnchanged(): void { $converter = $this->createConverter($this->createMock(MappingServiceInterface::class)); @@ -234,23 +260,24 @@ private function createConverter( MappingServiceInterface $mappingService, ?LoggingServiceInterface $loggingService = null, string $runUuid = '', + ?DataSet $dataSet = null, ): TestShopwareConverter { $converter = new TestShopwareConverter( $mappingService, $loggingService ?? $this->createMock(LoggingServiceInterface::class) ); - $converter->setMigrationContext($this->createMigrationContext($runUuid)); + $converter->setMigrationContext($this->createMigrationContext($runUuid, $dataSet)); return $converter; } - private function createMigrationContext(string $runUuid = ''): MigrationContext + private function createMigrationContext(string $runUuid = '', ?DataSet $dataSet = null): MigrationContext { return new MigrationContext( $this->connection, new Shopware55Profile(), null, - null, + $dataSet, $runUuid ); } From 72ddec1a56be80b4fbc711effb66d607af538e36 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Mon, 18 May 2026 14:42:49 +0200 Subject: [PATCH 13/15] Fix test --- src/Exception/MigrationException.php | 4 + .../Shopware/Converter/ShopwareConverter.php | 24 +- .../Converter/ShopwareConverterTest.php | 2 +- .../linux/migration-log-sw5.txt | 1122 +---------------- tests/acceptance/tests/MigrationTest.spec.ts | 2 +- 5 files changed, 19 insertions(+), 1135 deletions(-) diff --git a/src/Exception/MigrationException.php b/src/Exception/MigrationException.php index 508d9f632..f2db21293 100644 --- a/src/Exception/MigrationException.php +++ b/src/Exception/MigrationException.php @@ -11,6 +11,7 @@ use Shopware\Core\Framework\DataAbstractionLayer\Field\Field; use Shopware\Core\Framework\HttpException; use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\Gateway\Reader\ReaderInterface; use Symfony\Component\HttpFoundation\Response; /** @@ -570,6 +571,9 @@ public static function mainVariantRelationMissingIdAndOrderNumber(): self ); } + /** + * @param class-string $class + */ public static function readerRegistryUsageNotAllowed(string $class): self { return new self( diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 31dbc727e..f6c8e3984 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -32,8 +32,6 @@ abstract class ShopwareConverter extends Converter implements ResetInterface protected const TYPE_DATE = 'date'; protected const TYPE_DATETIME = 'datetime'; - private const CONVERT_VALUE_LOG_ENTITY_NAME = 'shopware_converter_convert_value_log_entity'; - protected MigrationContextInterface $migrationContext; /** @@ -107,7 +105,7 @@ protected function convertValue( break; case self::TYPE_DATETIME: $dataset = $this->migrationContext->getDataSet(); - $entityName = self::CONVERT_VALUE_LOG_ENTITY_NAME; + $entityName = null; if ($dataset instanceof DataSet) { $entityName = $dataset::getEntity(); } @@ -218,7 +216,7 @@ protected function validDate(string $value): bool } } - private function convertDateTime(string $value, string $entityName): ?string + private function convertDateTime(string $value, ?string $entityName): ?string { if ($value === '') { return null; @@ -236,14 +234,16 @@ private function convertDateTime(string $value, string $entityName): ?string ->setTimezone(new \DateTimeZone('UTC')) ->format(Defaults::STORAGE_DATE_TIME_FORMAT); } catch (\Throwable $exception) { - $this->loggingService->log( - MigrationLogBuilder::fromMigrationContext($this->migrationContext) - ->withSourceData(['dateTime' => $value]) - ->withExceptionMessage($exception->getMessage()) - ->withException($exception) - ->withEntityName($entityName) - ->build(ConvertDateTimeFailedLog::class) - ); + $logBuilder = MigrationLogBuilder::fromMigrationContext($this->migrationContext) + ->withSourceData(['dateTime' => $value]) + ->withExceptionMessage($exception->getMessage()) + ->withException($exception); + + if ($entityName !== null) { + $logBuilder->withEntityName($entityName); + } + + $this->loggingService->log($logBuilder->build(ConvertDateTimeFailedLog::class)); return null; } diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index b42a1745b..a2714dc4e 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -129,7 +129,7 @@ public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone( ->method('log') ->with(static::callback(static function (MigrationLogEntry $logEntry): bool { static::assertSame(ConvertDateTimeFailedLog::getCode(), $logEntry->getCode()); - static::assertSame('shopware_converter_convert_value_log_entity', $logEntry->getEntityName()); + static::assertNull($logEntry->getEntityName()); return true; })) diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt index 28d865e75..b833f8115 100644 --- a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt +++ b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt @@ -250,7 +250,7 @@ Pre-mapping (JSON): { "extensions": [], "sourceId": "timezone", - "description": "No source time zone", + "description": "Source system time zone", "destinationUuid": "Africa\/Abidjan" } ], @@ -17950,1123 +17950,3 @@ Source data (JSON): "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.png" } ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600", - "file_size": "261981", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed_720x600", - "file_size": "284428", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/SAS.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "SAS", - "file_size": "195131", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/SAS.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Logo-teapavilion.gif", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Logo-teapavilion", - "file_size": "1768", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Logo-teapavilion.gif" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Logo-the-deli-garage.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Logo-the-deli-garage", - "file_size": "6168", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Logo-the-deli-garage.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Kwon-Logo.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Kwon-Logo", - "file_size": "7654", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Kwon-Logo.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Logo-Wibit-Sports.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Logo-Wibit-Sports", - "file_size": "47449", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Logo-Wibit-Sports.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Logo-Sonnenschirm-Versand.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Logo-Sonnenschirm-Versand", - "file_size": "5018", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Logo-Sonnenschirm-Versand.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Logo-stop-the-water.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Logo-stop-the-water", - "file_size": "18017", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Logo-stop-the-water.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600", - "file_size": "484959", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600", - "file_size": "179560", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600", - "file_size": "351869", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Wecker-Blaues-Haus.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Wecker-Blaues-Haus", - "file_size": "82106", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Wecker-Blaues-Haus.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600503e314a8c7e0.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed_720x600503e314a8c7e0", - "file_size": "295236", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600503e314a8c7e0.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a", - "file_size": "495601", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c", - "file_size": "190413", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715", - "file_size": "272089", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678", - "file_size": "295759", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50", - "file_size": "210975", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c", - "file_size": "283905", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Reisetasche-Gladstone-Canvas_720x600503e31ee23285.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Reisetasche-Gladstone-Canvas_720x600503e31ee23285", - "file_size": "265431", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Reisetasche-Gladstone-Canvas_720x600503e31ee23285.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378", - "file_size": "361517", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/shopware_packshot_professional_edition_72dpi_rgb.png", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "shopware_packshot_professional_edition_72dpi_rgb", - "file_size": "157116", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/shopware_packshot_professional_edition_72dpi_rgb.png" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Rennanzug-Jim-Clark-Style-FIA-Tasche.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Rennanzug-Jim-Clark-Style-FIA-Tasche", - "file_size": "51491", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Rennanzug-Jim-Clark-Style-FIA-Tasche.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Bumerang503f2d5c77b6b.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Bumerang503f2d5c77b6b", - "file_size": "32798", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Bumerang503f2d5c77b6b.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Buecher-ESD.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "B\u00fccher-ESD", - "file_size": "156505", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Buecher-ESD.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Buecher-ESD503f59dbb325c.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "B\u00fccher-ESD503f59dbb325c", - "file_size": "156505", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Buecher-ESD503f59dbb325c.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "VINTAGEDRIVER-Collection-Basecap-beige_720x600", - "file_size": "69793", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600", - "file_size": "96624", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Navigator-Lederhaube-braun_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Navigator-Lederhaube-braun_720x600", - "file_size": "37898", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Navigator-Lederhaube-braun_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Navigator-Lederhaube-Braun-Ohr-Detail_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Navigator-Lederhaube-Braun-Ohr-Detail_720x600", - "file_size": "108911", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Navigator-Lederhaube-Braun-Ohr-Detail_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed_720x600", - "file_size": "52926", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600", - "file_size": "97708", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600", - "file_size": "30661", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600", - "file_size": "43863", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600", - "file_size": "47399", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600", - "file_size": "36038", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Fahrerbrille-Chronos-Seitenansicht_720x600", - "file_size": "44830", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Reisetasche-Gladstone-Canvas_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Reisetasche-Gladstone-Canvas_720x600", - "file_size": "41880", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Reisetasche-Gladstone-Canvas_720x600.jpg" -} - ------ Log Entry [count] ----- -ID: [uuid] -Level: warning -Code: SWAG_MIGRATION_MEDIA_FILE_MISSING -Profile name: shopware55 -Gateway name: local -Created at: [timestamp] -Entity: media -Source data (JSON): -{ - "media": { - "id": "[uuid]", - "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg", - "entity": "media", - "run_id": "[uuid]", - "written": "1", - "media_id": "[uuid]", - "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600", - "file_size": "54580", - "processed": "0", - "created_at": "[timestamp]", - "updated_at": "[timestamp]", - "process_failure": "0" - }, - "media_id": "[uuid]", - "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg" -} - diff --git a/tests/acceptance/tests/MigrationTest.spec.ts b/tests/acceptance/tests/MigrationTest.spec.ts index 25aac624c..2d3c5761d 100644 --- a/tests/acceptance/tests/MigrationTest.spec.ts +++ b/tests/acceptance/tests/MigrationTest.spec.ts @@ -234,7 +234,7 @@ test.describe('Migration Tests @migration @visual', () => { }); await test.step('Verify migrated entities', async () => { - await EntityCounter.assert('swag_migration_logging', 702); + await EntityCounter.assert('swag_migration_logging', 662); await EntityCounter.assertBaseline(baseline); }); From 6cc3b91a3285bb4b37feec34cf7dce96c37c084c Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Mon, 18 May 2026 15:06:28 +0200 Subject: [PATCH 14/15] Fix test --- .../linux/migration-log-sw5.txt | 1120 +++++++++++++++++ tests/acceptance/tests/MigrationTest.spec.ts | 2 +- 2 files changed, 1121 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt index b833f8115..0c372993d 100644 --- a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt +++ b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt @@ -17950,3 +17950,1123 @@ Source data (JSON): "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.png" } +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600", + "file_size": "261981", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed_720x600", + "file_size": "284428", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/SAS.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "SAS", + "file_size": "195131", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/SAS.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Logo-teapavilion.gif", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Logo-teapavilion", + "file_size": "1768", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Logo-teapavilion.gif" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Logo-the-deli-garage.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Logo-the-deli-garage", + "file_size": "6168", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Logo-the-deli-garage.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Kwon-Logo.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Kwon-Logo", + "file_size": "7654", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Kwon-Logo.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Logo-Wibit-Sports.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Logo-Wibit-Sports", + "file_size": "47449", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Logo-Wibit-Sports.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Logo-Sonnenschirm-Versand.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Logo-Sonnenschirm-Versand", + "file_size": "5018", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Logo-Sonnenschirm-Versand.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Logo-stop-the-water.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Logo-stop-the-water", + "file_size": "18017", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Logo-stop-the-water.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600", + "file_size": "484959", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600", + "file_size": "179560", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600", + "file_size": "351869", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Wecker-Blaues-Haus.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Wecker-Blaues-Haus", + "file_size": "82106", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Wecker-Blaues-Haus.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600503e314a8c7e0.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed_720x600503e314a8c7e0", + "file_size": "295236", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600503e314a8c7e0.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a", + "file_size": "495601", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600503e31501615a.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c", + "file_size": "190413", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600503e318e0644c.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715", + "file_size": "272089", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600503e31a32a715.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678", + "file_size": "295759", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600503e31c4b7678.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50", + "file_size": "210975", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600503e31c74bf50.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c", + "file_size": "283905", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600503e31ca5767c.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Reisetasche-Gladstone-Canvas_720x600503e31ee23285.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Reisetasche-Gladstone-Canvas_720x600503e31ee23285", + "file_size": "265431", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Reisetasche-Gladstone-Canvas_720x600503e31ee23285.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378", + "file_size": "361517", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600503e322fb4378.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/shopware_packshot_professional_edition_72dpi_rgb.png", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "shopware_packshot_professional_edition_72dpi_rgb", + "file_size": "157116", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/shopware_packshot_professional_edition_72dpi_rgb.png" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Rennanzug-Jim-Clark-Style-FIA-Tasche.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Rennanzug-Jim-Clark-Style-FIA-Tasche", + "file_size": "51491", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Rennanzug-Jim-Clark-Style-FIA-Tasche.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Bumerang503f2d5c77b6b.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Bumerang503f2d5c77b6b", + "file_size": "32798", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Bumerang503f2d5c77b6b.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Buecher-ESD.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "B\u00fccher-ESD", + "file_size": "156505", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Buecher-ESD.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Buecher-ESD503f59dbb325c.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "B\u00fccher-ESD503f59dbb325c", + "file_size": "156505", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Buecher-ESD503f59dbb325c.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "VINTAGEDRIVER-Collection-Basecap-beige_720x600", + "file_size": "69793", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600", + "file_size": "96624", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/VINTAGEDRIVER-Collection-Basecap-beige-Rueckansicht_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Navigator-Lederhaube-braun_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Navigator-Lederhaube-braun_720x600", + "file_size": "37898", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Navigator-Lederhaube-braun_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Navigator-Lederhaube-Braun-Ohr-Detail_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Navigator-Lederhaube-Braun-Ohr-Detail_720x600", + "file_size": "108911", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Navigator-Lederhaube-Braun-Ohr-Detail_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed_720x600", + "file_size": "52926", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Balmoral-Flatcap-Tweed-Rueckansicht_720x600", + "file_size": "97708", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Balmoral-Flatcap-Tweed-Rueckansicht_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damen-Halbfinger-aus-Peccary-Leder_720x600", + "file_size": "30661", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damen-Halbfinger-aus-Peccary-Leder_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Damenhandschuhe-aus-Peccary-zweifarbig_720x600", + "file_size": "43863", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Damenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600", + "file_size": "47399", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Hinten_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600", + "file_size": "36038", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Ansicht-von-Vorne_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Fahrerbrille-Chronos-Seitenansicht_720x600", + "file_size": "44830", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Fahrerbrille-Chronos-Seitenansicht_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Reisetasche-Gladstone-Canvas_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Reisetasche-Gladstone-Canvas_720x600", + "file_size": "41880", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Reisetasche-Gladstone-Canvas_720x600.jpg" +} + +----- Log Entry [count] ----- +ID: [uuid] +Level: warning +Code: SWAG_MIGRATION_MEDIA_FILE_MISSING +Profile name: shopware55 +Gateway name: local +Created at: [timestamp] +Entity: media +Source data (JSON): +{ + "media": { + "id": "[uuid]", + "uri": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg", + "entity": "media", + "run_id": "[uuid]", + "written": "1", + "media_id": "[uuid]", + "file_name": "Herrenhandschuhe-aus-Peccary-zweifarbig_720x600", + "file_size": "54580", + "processed": "0", + "created_at": "[timestamp]", + "updated_at": "[timestamp]", + "process_failure": "0" + }, + "media_id": "[uuid]", + "source_path": "media\/image\/Herrenhandschuhe-aus-Peccary-zweifarbig_720x600.jpg" +} + diff --git a/tests/acceptance/tests/MigrationTest.spec.ts b/tests/acceptance/tests/MigrationTest.spec.ts index 2d3c5761d..25aac624c 100644 --- a/tests/acceptance/tests/MigrationTest.spec.ts +++ b/tests/acceptance/tests/MigrationTest.spec.ts @@ -234,7 +234,7 @@ test.describe('Migration Tests @migration @visual', () => { }); await test.step('Verify migrated entities', async () => { - await EntityCounter.assert('swag_migration_logging', 662); + await EntityCounter.assert('swag_migration_logging', 702); await EntityCounter.assertBaseline(baseline); }); From baf55f15708ae747f606b9a3b5420566078b1d5c Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Tue, 19 May 2026 07:10:46 +0200 Subject: [PATCH 15/15] Fix threads --- src/Profile/Shopware/Converter/ShopwareConverter.php | 2 +- src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index f6c8e3984..d081bddf4 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -37,7 +37,7 @@ abstract class ShopwareConverter extends Converter implements ResetInterface /** * @var array */ - protected array $timezoneCache = []; + private array $timezoneCache = []; public function reset(): void { diff --git a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php index 7853285e1..3c8c2528b 100644 --- a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php +++ b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php @@ -22,7 +22,7 @@ * The class extends ApiReader only to reuse the existing API client/request * handling for connector endpoints instead of duplicating that logic here. */ -#[Package('after-sales')] +#[Package('fundamentals@after-sales')] class TimezoneReader extends ApiReader { public function supports(MigrationContextInterface $migrationContext): bool

5`9O{Ha3s2I4)gJffYkIbc*=DLpeaS-K4FC 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 T>#a85i<9Xki$C)WZ$17uo7=%= From 9f47c5d930673a44ff4f7f1eedca81c93d02d175 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 14:48:30 +0200 Subject: [PATCH 06/15] Fix acceptance tests --- tests/acceptance/fixtures/MigrationConnection.ts | 8 +++++++- tests/acceptance/fixtures/shopware5-source/config.php | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/fixtures/MigrationConnection.ts b/tests/acceptance/fixtures/MigrationConnection.ts index 325fde3d3..dd6b2c199 100644 --- a/tests/acceptance/fixtures/MigrationConnection.ts +++ b/tests/acceptance/fixtures/MigrationConnection.ts @@ -1,4 +1,5 @@ import { test as base, expect } from '@shopware-ag/acceptance-test-suite'; +import { copyFile } from 'node:fs/promises'; import { join } from 'node:path'; import type { FixtureTypes } from '@fixtures/AcceptanceTest'; @@ -12,7 +13,12 @@ export interface MigrationConnectionStruct { export const MigrationConnection = base.extend({ MigrationConnection: async ({ AdminApiContext, DatabaseCredentials }, use) => { const connectionName = 'shopware'; - const installationRoot = join(process.cwd(), 'fixtures', 'shopware5-source'); + const installationRoot = '/tmp'; + + await copyFile( + join(process.cwd(), 'fixtures', 'shopware5-source', 'config.php'), + join(installationRoot, 'config.php'), + ); const createResponse = await AdminApiContext.post('/api/swag-migration-connection', { data: { diff --git a/tests/acceptance/fixtures/shopware5-source/config.php b/tests/acceptance/fixtures/shopware5-source/config.php index ccb4cbfa6..9b4f6e05a 100644 --- a/tests/acceptance/fixtures/shopware5-source/config.php +++ b/tests/acceptance/fixtures/shopware5-source/config.php @@ -1,4 +1,9 @@ + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ return [ 'db' => [ From 2ce580813e327fd30effdd96e0af2849858a5b1c Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Thu, 7 May 2026 15:00:12 +0200 Subject: [PATCH 07/15] Fix acceptance tests --- .../linux/migration-log-sw5.txt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt index 46f35dba1..404c2e518 100644 --- a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt +++ b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/migration-log-sw5.txt @@ -238,11 +238,25 @@ Environment information (JSON): "sourceSystemCurrency": "EUR", "sourceSystemLocale": "de-DE", "targetSystemLocale": "en-GB", - "fingerprint": "[uuid]" + "fingerprint": "[uuid]", + "timezone": "Europe\/Berlin" } Pre-mapping (JSON): [ + { + "extensions": [], + "entity": "source_timezone", + "mapping": [ + { + "extensions": [], + "sourceId": "timezone", + "description": "Europe\/Berlin", + "destinationUuid": "Europe\/Berlin" + } + ], + "choices": [] + }, { "extensions": [], "entity": "order_state", From e3bb9c5f36e747dacfb4c0e25912a41b0292b846 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Fri, 8 May 2026 07:55:47 +0200 Subject: [PATCH 08/15] Fix threads --- .../Shopware/Converter/ShopwareConverter.php | 8 ++++---- .../Gateway/Local/Reader/EnvironmentReader.php | 16 ++++++++-------- .../Gateway/Local/ShopwareLocalGateway.php | 2 +- .../Shopware/Converter/ShopwareConverterTest.php | 16 ++++++++++++++++ .../Gateway/Local/EnvironmentReaderTest.php | 12 ++++++------ .../Shopware/Gateway/LocalGatewayTest.php | 4 ++-- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 73212e719..09abb70c8 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -30,7 +30,7 @@ abstract class ShopwareConverter extends Converter protected MigrationContextInterface $migrationContext; /** - * @var array + * @var array */ protected array $timezoneCache = []; @@ -211,19 +211,19 @@ private function convertDateTime(string $value, Context $context): ?string } $connectionId = $this->migrationContext->getConnection()->getId(); - if (!isset($this->timezoneCache[$connectionId])) { + if (!\array_key_exists($connectionId, $this->timezoneCache)) { $this->timezoneCache[$connectionId] = $this->mappingService->getValue( $connectionId, 'source_timezone', 'timezone', $context - ) ?? ''; + ); } try { $timezone = $this->timezoneCache[$connectionId]; - if ($timezone === '') { + if ($timezone === null) { return (new \DateTimeImmutable($value))->format(Defaults::STORAGE_DATE_TIME_FORMAT); } diff --git a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php index 6539f9758..4e1eb0dab 100644 --- a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php +++ b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php @@ -15,7 +15,7 @@ use Symfony\Component\Filesystem\Filesystem; /** - * @phpstan-type ReadArray array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string, config: array, timezone: string} + * @phpstan-type EnvironmentInfo array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string, config: array, timezone: string|null} */ #[Package('fundamentals@after-sales')] class EnvironmentReader extends AbstractReader implements EnvironmentReaderInterface @@ -32,12 +32,12 @@ class EnvironmentReader extends AbstractReader implements EnvironmentReaderInter private const CONFIG_FILE_NAME = 'config.php'; /** - * @var array + * @var array */ private array $cachedEnvironmentInformation = []; /** - * @return ReadArray + * @return EnvironmentInfo */ public function read(MigrationContextInterface $migrationContext): array { @@ -150,11 +150,11 @@ private function getAdditionalData(MigrationContextInterface $migrationContext): return \array_values($shops); } - private function getTimezone(MigrationContextInterface $migrationContext): string + private function getTimezone(MigrationContextInterface $migrationContext): ?string { $fields = $migrationContext->getConnection()->getCredentialFields(); if (!isset($fields[self::SOURCE_ROOT_KEY]) || !\is_string($fields[self::SOURCE_ROOT_KEY]) || $fields[self::SOURCE_ROOT_KEY] === '') { - return ''; + return null; } $basePath = $fields[self::SOURCE_ROOT_KEY]; @@ -164,15 +164,15 @@ private function getTimezone(MigrationContextInterface $migrationContext): strin try { if (!$fileSystem->exists($configFile)) { - return ''; + return null; } $fileContent = $fileSystem->readFile($configFile); $timezone = $this->readDbTimezoneFromConfig($fileContent); - return $timezone ?? ''; + return $timezone === '' ? null : $timezone; } catch (\Throwable) { - return ''; + return null; } } diff --git a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php index b010da23a..0a5b376d5 100644 --- a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php +++ b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php @@ -149,7 +149,7 @@ public function readEnvironmentInformation( $environmentData['defaultShopLanguage'], $targetLocaleCode, $this->generateFingerprint($environmentData), - timezone: $environmentData['timezone'], + timezone: $environmentData['timezone'] ?? null, ); } diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index c951c778e..116a403cf 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -67,6 +67,22 @@ public function testConvertValueCachesSourceTimezonePerConnection(): void static::assertSame('2026-05-01 11:00:00.000', $secondConverted['createdAt']); } + public function testConvertValueCachesMissingSourceTimezonePerConnection(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->once()) + ->method('getValue') + ->willReturn(null); + + $converter = $this->createConverter($mappingService); + + [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00', $this->context); + [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00', $this->context); + + static::assertSame('2026-05-01 12:00:00.000', $firstConverted['createdAt']); + static::assertSame('2026-05-01 13:00:00.000', $secondConverted['createdAt']); + } + public function testConvertValueDoesNotConvertDateTimeWithoutContext(): void { $mappingService = $this->createMock(MappingServiceInterface::class); diff --git a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php index c944d4b4e..cca657231 100644 --- a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php @@ -66,7 +66,7 @@ public function testRead(): void } #[DataProvider('timezoneFixtureProvider')] - public function testReadReadsTimezoneFromInstallationRootConfig(string $fixtureName, string $expectedTimezone): void + public function testReadReadsTimezoneFromInstallationRootConfig(string $fixtureName, ?string $expectedTimezone): void { $credentialFields = $this->connection->getCredentialFields(); static::assertIsArray($credentialFields); @@ -100,11 +100,11 @@ public function testReadCachesEnvironmentInformationPerConnection(): void static::assertSame('Europe/Berlin', $firstData['timezone']); static::assertSame('Europe/Berlin', $cachedData['timezone']); - static::assertSame('', $secondConnectionData['timezone']); + static::assertNull($secondConnectionData['timezone']); } /** - * @return array + * @return array */ public static function timezoneFixtureProvider(): array { @@ -115,15 +115,15 @@ public static function timezoneFixtureProvider(): array ], 'config does not return array' => [ 'fixtureName' => 'config_does_not_return_array', - 'expectedTimezone' => '', + 'expectedTimezone' => null, ], 'empty database timezone' => [ 'fixtureName' => 'empty_database_timezone', - 'expectedTimezone' => '', + 'expectedTimezone' => null, ], 'missing database timezone' => [ 'fixtureName' => 'missing_database_timezone', - 'expectedTimezone' => '', + 'expectedTimezone' => null, ], ]; } diff --git a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php index d03349e83..aff282585 100644 --- a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php @@ -285,7 +285,7 @@ public function testGenerateFingerprintWithoutConfig(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', - 'timezone' => '', + 'timezone' => null, ]); $localTableReader = new TableReader(new ConnectionFactory()); @@ -343,7 +343,7 @@ public function testGenerateFingerprintWithoutEsdKey(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', - 'timezone' => '', + 'timezone' => null, 'config' => [ 'installationDate' => '2023-01-01 00:00:00', ], From 516dbaf1e17d4b7913ea6c2a34fcde2812c649ee Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Tue, 12 May 2026 07:30:55 +0200 Subject: [PATCH 09/15] Fix threads --- src/DependencyInjection/shopware.php | 10 +- src/Migration/EnvironmentInformation.php | 11 -- .../Logging/Log/ConvertDateTimeFailedLog.php | 30 +++++ .../Shopware/Converter/CustomerConverter.php | 4 +- .../NewsletterRecipientConverter.php | 4 +- .../Shopware/Converter/OrderConverter.php | 2 +- .../Shopware/Converter/ProductConverter.php | 2 +- .../Shopware/Converter/PromotionConverter.php | 4 +- .../Shopware/Converter/ShopwareConverter.php | 72 +++++++---- .../Gateway/Api/Reader/EnvironmentReader.php | 11 -- .../Gateway/Api/Reader/TimezoneReader.php | 25 ++++ .../Gateway/Api/ShopwareApiGateway.php | 1 - .../Local/Reader/EnvironmentReader.php | 97 +------------- .../Gateway/Local/ShopwareLocalGateway.php | 1 - .../Shopware/Premapping/TimezoneReader.php | 16 +-- .../Converter/ShopwareConverterTest.php | 119 ++++++++++++------ .../Converter/TestShopwareConverter.php | 4 +- .../Gateway/ApiEnvironmentReaderTest.php | 47 +------ .../Gateway/Local/EnvironmentReaderTest.php | 92 +------------- .../Shopware/Gateway/LocalGatewayTest.php | 4 - .../Gateway/ShopwareApiGatewayTest.php | 3 +- .../Premapping/TimezoneReaderTest.php | 62 +++++---- .../fixtures/MigrationConnection.ts | 7 -- .../fixtures/shopware5-source/config.php | 12 -- tests/acceptance/tests/MigrationTest.spec.ts | 5 - 25 files changed, 251 insertions(+), 394 deletions(-) create mode 100644 src/Migration/Logging/Log/ConvertDateTimeFailedLog.php create mode 100644 src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php delete mode 100644 tests/acceptance/fixtures/shopware5-source/config.php diff --git a/src/DependencyInjection/shopware.php b/src/DependencyInjection/shopware.php index 91c232f03..3913c1437 100644 --- a/src/DependencyInjection/shopware.php +++ b/src/DependencyInjection/shopware.php @@ -115,6 +115,7 @@ use SwagMigrationAssistant\Profile\Shopware\DataSelection\WishlistDataSelection; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\ApiReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TableCountReader; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader as ApiTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; use SwagMigrationAssistant\Profile\Shopware\Gateway\Connection\ConnectionFactory; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader\AbstractReader; @@ -169,7 +170,7 @@ use SwagMigrationAssistant\Profile\Shopware\Premapping\OrderStateReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\PaymentMethodReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\SalutationReader; -use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader as PremappingTimezoneReader; +use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Premapping\TransactionStateReader; use SwagMigrationAssistant\Profile\Shopware\Writer\ProductOptionRelationWriter; use SwagMigrationAssistant\Profile\Shopware\Writer\ProductPropertyRelationWriter; @@ -966,8 +967,11 @@ $services->set(NewsletterRecipientStatusReader::class) ->tag('shopware.migration.pre_mapping_reader'); - $services->set(PremappingTimezoneReader::class) - ->args([service(GatewayRegistry::class)]) + $services->set(ApiTimezoneReader::class) + ->parent(ApiReader::class); + + $services->set(TimezoneReader::class) + ->args([service(ApiTimezoneReader::class)]) ->tag('shopware.migration.pre_mapping_reader'); $services->set(ProductOptionRelationWriter::class) diff --git a/src/Migration/EnvironmentInformation.php b/src/Migration/EnvironmentInformation.php index 807dcc810..b7176d235 100644 --- a/src/Migration/EnvironmentInformation.php +++ b/src/Migration/EnvironmentInformation.php @@ -32,7 +32,6 @@ public function __construct( protected string $sourceSystemLocale = '', protected string $targetSystemLocale = '', protected ?string $fingerprint = null, - protected ?string $timezone = null, ) { } @@ -124,14 +123,4 @@ public function setFingerprint(?string $fingerprint): void { $this->fingerprint = $fingerprint; } - - public function getTimezone(): ?string - { - return $this->timezone; - } - - public function setTimezone(?string $timezone): void - { - $this->timezone = $timezone; - } } diff --git a/src/Migration/Logging/Log/ConvertDateTimeFailedLog.php b/src/Migration/Logging/Log/ConvertDateTimeFailedLog.php new file mode 100644 index 000000000..2099d930b --- /dev/null +++ b/src/Migration/Logging/Log/ConvertDateTimeFailedLog.php @@ -0,0 +1,30 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Migration\Logging\Log; + +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\Logging\Log\Builder\AbstractMigrationLogEntry; + +#[Package('fundamentals@after-sales')] +readonly class ConvertDateTimeFailedLog extends AbstractMigrationLogEntry +{ + public static function getLevel(): string + { + return self::LOG_LEVEL_WARNING; + } + + public static function getCode(): string + { + return 'SWAG_MIGRATION_CONVERT_DATE_TIME'; + } + + public static function isUserFixable(): bool + { + return false; + } +} diff --git a/src/Profile/Shopware/Converter/CustomerConverter.php b/src/Profile/Shopware/Converter/CustomerConverter.php index c3a9a154c..d595ee092 100644 --- a/src/Profile/Shopware/Converter/CustomerConverter.php +++ b/src/Profile/Shopware/Converter/CustomerConverter.php @@ -153,8 +153,8 @@ public function convert( $this->convertValue($converted, 'firstName', $data, 'firstname'); $this->convertValue($converted, 'lastName', $data, 'lastname'); $this->convertValue($converted, 'customerNumber', $data, 'customernumber'); - $this->convertValue($converted, 'birthday', $data, 'birthday', self::TYPE_DATE, $this->context); - $this->convertValue($converted, 'lockedUntil', $data, 'lockeduntil', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'birthday', $data, 'birthday', self::TYPE_DATE); + $this->convertValue($converted, 'lockedUntil', $data, 'lockeduntil', self::TYPE_DATETIME); $this->setAccountType($data, $converted); $this->setPassword($data, $converted); diff --git a/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php b/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php index a361ce947..5f9fe2cc9 100644 --- a/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php +++ b/src/Profile/Shopware/Converter/NewsletterRecipientConverter.php @@ -85,8 +85,8 @@ public function convert( $converted['id'] = $this->mainMapping['entityId']; $this->convertValue($converted, 'email', $data, 'email'); - $this->convertValue($converted, 'createdAt', $data, 'added', self::TYPE_DATETIME, $this->context); - $this->convertValue($converted, 'confirmedAt', $data, 'double_optin_confirmed', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'createdAt', $data, 'added', self::TYPE_DATETIME); + $this->convertValue($converted, 'confirmedAt', $data, 'double_optin_confirmed', self::TYPE_DATETIME); if (isset($data['address'])) { $address = $data['address']; diff --git a/src/Profile/Shopware/Converter/OrderConverter.php b/src/Profile/Shopware/Converter/OrderConverter.php index c03fd2cb5..3f5fa8ec2 100644 --- a/src/Profile/Shopware/Converter/OrderConverter.php +++ b/src/Profile/Shopware/Converter/OrderConverter.php @@ -187,7 +187,7 @@ public function convert( ]; $converted['totalRounding'] = $converted['itemRounding']; - $this->convertValue($converted, 'orderDateTime', $data, 'ordertime', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'orderDateTime', $data, 'ordertime', self::TYPE_DATETIME); if (isset($data['status'])) { $stateMapping = $this->mappingService->getMapping( diff --git a/src/Profile/Shopware/Converter/ProductConverter.php b/src/Profile/Shopware/Converter/ProductConverter.php index 816f7ad92..b10774c3f 100644 --- a/src/Profile/Shopware/Converter/ProductConverter.php +++ b/src/Profile/Shopware/Converter/ProductConverter.php @@ -452,7 +452,7 @@ private function getProductData(array &$data, array $converted): array unset($data['active']); } - $this->convertValue($converted, 'createdAt', $data, 'datum', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'createdAt', $data, 'datum', self::TYPE_DATETIME); $this->convertValue($converted, 'isCloseout', $data, 'laststock', self::TYPE_BOOLEAN); $this->convertValue($converted, 'markAsTopseller', $data, 'topseller', self::TYPE_BOOLEAN); $this->convertValue($converted, 'allowNotification', $data, 'notification', self::TYPE_BOOLEAN); diff --git a/src/Profile/Shopware/Converter/PromotionConverter.php b/src/Profile/Shopware/Converter/PromotionConverter.php index 992aad745..3bff7ca4d 100644 --- a/src/Profile/Shopware/Converter/PromotionConverter.php +++ b/src/Profile/Shopware/Converter/PromotionConverter.php @@ -94,8 +94,8 @@ public function convert(array $data, Context $context, MigrationContextInterface $this->setCustomerRule($data, $converted, $migrationContext); $this->convertValue($converted, 'name', $data, 'description'); - $this->convertValue($converted, 'validFrom', $data, 'valid_from', self::TYPE_DATETIME, $this->context); - $this->convertValue($converted, 'validUntil', $data, 'valid_to', self::TYPE_DATETIME, $this->context); + $this->convertValue($converted, 'validFrom', $data, 'valid_from', self::TYPE_DATETIME); + $this->convertValue($converted, 'validUntil', $data, 'valid_to', self::TYPE_DATETIME); $this->convertValue($converted, 'maxRedemptionsGlobal', $data, 'numberofunits', self::TYPE_INTEGER); $this->convertValue($converted, 'maxRedemptionsPerCustomer', $data, 'numorder', self::TYPE_INTEGER); diff --git a/src/Profile/Shopware/Converter/ShopwareConverter.php b/src/Profile/Shopware/Converter/ShopwareConverter.php index 09abb70c8..263cf325f 100644 --- a/src/Profile/Shopware/Converter/ShopwareConverter.php +++ b/src/Profile/Shopware/Converter/ShopwareConverter.php @@ -13,11 +13,14 @@ use SwagMigrationAssistant\Migration\Connection\Helper\ConnectionNameSanitizer; use SwagMigrationAssistant\Migration\Converter\Converter; use SwagMigrationAssistant\Migration\DataSelection\DefaultEntities; +use SwagMigrationAssistant\Migration\Logging\Log\Builder\MigrationLogBuilder; +use SwagMigrationAssistant\Migration\Logging\Log\ConvertDateTimeFailedLog; use SwagMigrationAssistant\Migration\Mapping\Lookup\LanguageLookup; use SwagMigrationAssistant\Migration\MigrationContextInterface; +use Symfony\Contracts\Service\ResetInterface; #[Package('fundamentals@after-sales')] -abstract class ShopwareConverter extends Converter +abstract class ShopwareConverter extends Converter implements ResetInterface { protected const TYPE_STRING = 'string'; protected const TYPE_BOOLEAN = 'bool'; @@ -34,6 +37,11 @@ abstract class ShopwareConverter extends Converter */ protected array $timezoneCache = []; + public function reset(): void + { + $this->timezoneCache = []; + } + public function getSourceIdentifier(array $data): string { return $data['id']; @@ -67,7 +75,6 @@ protected function convertValue( array &$sourceData, string $sourceKey, string $castType = self::TYPE_STRING, - ?Context $context = null, ): void { if (isset($sourceData[$sourceKey]) && $sourceData[$sourceKey] !== '') { switch ($castType) { @@ -95,11 +102,7 @@ protected function convertValue( break; case self::TYPE_DATETIME: - if (!$context instanceof Context) { - return; - } - - $sourceValue = $this->convertDateTime((string) $sourceData[$sourceKey], $context); + $sourceValue = $this->convertDateTime((string) $sourceData[$sourceKey]); if ($sourceValue === null) { return; } @@ -172,7 +175,7 @@ protected function getAttributes( } if (isset($mapping['additionalData']['columnType']) && $mapping['additionalData']['columnType'] === 'datetime') { - $convertedValue = $this->convertDateTime((string) $value, $context); + $convertedValue = $this->convertDateTime((string) $value); if ($convertedValue === null) { continue; @@ -193,7 +196,7 @@ protected function getAttributes( return $result; } - private function validDate(string $value): bool + protected function validDate(string $value): bool { try { new \DateTime($value); @@ -204,25 +207,14 @@ private function validDate(string $value): bool } } - private function convertDateTime(string $value, Context $context): ?string + private function convertDateTime(string $value): ?string { if ($value === '') { return null; } - $connectionId = $this->migrationContext->getConnection()->getId(); - if (!\array_key_exists($connectionId, $this->timezoneCache)) { - $this->timezoneCache[$connectionId] = $this->mappingService->getValue( - $connectionId, - 'source_timezone', - 'timezone', - $context - ); - } - try { - $timezone = $this->timezoneCache[$connectionId]; - + $timezone = $this->getTimezoneFromPremapping(); if ($timezone === null) { return (new \DateTimeImmutable($value))->format(Defaults::STORAGE_DATE_TIME_FORMAT); } @@ -232,8 +224,42 @@ private function convertDateTime(string $value, Context $context): ?string return $date ->setTimezone(new \DateTimeZone('UTC')) ->format(Defaults::STORAGE_DATE_TIME_FORMAT); - } catch (\Throwable) { + } catch (\Throwable $exception) { + $this->loggingService->log( + MigrationLogBuilder::fromMigrationContext($this->migrationContext) + ->withSourceData(['dateTime' => $value]) + ->withExceptionMessage($exception->getMessage()) + ->withException($exception) + ->build(ConvertDateTimeFailedLog::class) + ); + return null; } } + + private function getTimezoneFromPremapping(): ?string + { + $runId = $this->migrationContext->getRunUuid(); + if (\array_key_exists($runId, $this->timezoneCache)) { + return $this->timezoneCache[$runId]; + } + + $timezone = null; + $premapping = $this->migrationContext->getConnection()->getPremapping(); + foreach ($premapping ?? [] as $item) { + if ($item->getEntity() !== 'source_timezone') { + continue; + } + + foreach ($item->getMapping() as $mapping) { + if ($mapping->getSourceId() === 'timezone') { + $timezone = $mapping->getDestinationUuid() === '' ? null : $mapping->getDestinationUuid(); + } + } + } + + $this->timezoneCache[$runId] = $timezone; + + return $timezone; + } } diff --git a/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php b/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php index 67396734f..5c9382b9d 100644 --- a/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php +++ b/src/Profile/Shopware/Gateway/Api/Reader/EnvironmentReader.php @@ -28,11 +28,6 @@ class EnvironmentReader implements EnvironmentReaderInterface { private ?HttpClientInterface $client = null; - /** - * @var array - */ - private array $cachedEnvironmentInformation = []; - public function __construct(private readonly ConnectionFactoryInterface $connectionFactory) { } @@ -42,10 +37,6 @@ public function __construct(private readonly ConnectionFactoryInterface $connect */ public function read(MigrationContextInterface $migrationContext): array { - if (isset($this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()])) { - return $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()]; - } - $information = [ 'environmentInformation' => [], 'requestStatus' => new RequestStatusStruct(), @@ -63,8 +54,6 @@ public function read(MigrationContextInterface $migrationContext): array ); } - $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()] = $information; - return $information; } diff --git a/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php new file mode 100644 index 000000000..f6dffae51 --- /dev/null +++ b/src/Profile/Shopware/Gateway/Api/Reader/TimezoneReader.php @@ -0,0 +1,25 @@ + + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader; + +use Shopware\Core\Framework\Log\Package; +use SwagMigrationAssistant\Migration\MigrationContextInterface; + +#[Package('after-sales')] +class TimezoneReader extends ApiReader +{ + public function supports(MigrationContextInterface $migrationContext): bool + { + return false; + } + + protected function getApiRoute(): string + { + return 'SwagMigrationTimezone'; + } +} diff --git a/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php b/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php index 415c7ec7b..0af3fca5d 100644 --- a/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php +++ b/src/Profile/Shopware/Gateway/Api/ShopwareApiGateway.php @@ -161,7 +161,6 @@ public function readEnvironmentInformation(MigrationContextInterface $migrationC $environmentDataArray['defaultShopLanguage'], $targetLocaleCode, $this->generateFingerprint($environmentDataArray), - timezone: $environmentDataArray['timezone'] ?? null, ); } diff --git a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php index 4e1eb0dab..1c1f1b5b8 100644 --- a/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php +++ b/src/Profile/Shopware/Gateway/Local/Reader/EnvironmentReader.php @@ -12,39 +12,18 @@ use Shopware\Core\Framework\Log\Package; use SwagMigrationAssistant\Migration\Gateway\Reader\EnvironmentReaderInterface; use SwagMigrationAssistant\Migration\MigrationContextInterface; -use Symfony\Component\Filesystem\Filesystem; /** - * @phpstan-type EnvironmentInfo array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string, config: array, timezone: string|null} + * @phpstan-type EnvironmentInfo array{defaultShopLanguage: string, host: string, additionalData: array, defaultCurrency: string, config: array} */ #[Package('fundamentals@after-sales')] class EnvironmentReader extends AbstractReader implements EnvironmentReaderInterface { - private const SOURCE_ROOT_KEY = 'installationRoot'; - private const TIMEZONE_KEY = 'timezone'; - private const DB_KEY = 'db'; - - private const ARRAY_OPEN = '['; - private const ARRAY_CLOSE = ']'; - private const NULL = 'null'; - private const TRIM_QUOTATION = '\'"'; - - private const CONFIG_FILE_NAME = 'config.php'; - - /** - * @var array - */ - private array $cachedEnvironmentInformation = []; - /** * @return EnvironmentInfo */ public function read(MigrationContextInterface $migrationContext): array { - if (isset($this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()])) { - return $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()]; - } - $locale = $this->getDefaultShopLocale($migrationContext); $environmentInformation = [ @@ -53,11 +32,8 @@ public function read(MigrationContextInterface $migrationContext): array 'additionalData' => $this->getAdditionalData($migrationContext), 'defaultCurrency' => $this->getDefaultCurrency($migrationContext), 'config' => $this->getConfig($migrationContext), - 'timezone' => $this->getTimezone($migrationContext), ]; - $this->cachedEnvironmentInformation[$migrationContext->getConnection()->getId()] = $environmentInformation; - return $environmentInformation; } @@ -149,75 +125,4 @@ private function getAdditionalData(MigrationContextInterface $migrationContext): return \array_values($shops); } - - private function getTimezone(MigrationContextInterface $migrationContext): ?string - { - $fields = $migrationContext->getConnection()->getCredentialFields(); - if (!isset($fields[self::SOURCE_ROOT_KEY]) || !\is_string($fields[self::SOURCE_ROOT_KEY]) || $fields[self::SOURCE_ROOT_KEY] === '') { - return null; - } - - $basePath = $fields[self::SOURCE_ROOT_KEY]; - $configFile = \rtrim($basePath, '/\\') . '/' . self::CONFIG_FILE_NAME; - - $fileSystem = new Filesystem(); - - try { - if (!$fileSystem->exists($configFile)) { - return null; - } - - $fileContent = $fileSystem->readFile($configFile); - $timezone = $this->readDbTimezoneFromConfig($fileContent); - - return $timezone === '' ? null : $timezone; - } catch (\Throwable) { - return null; - } - } - - private function readDbTimezoneFromConfig(string $phpFileContent): ?string - { - $tokens = token_get_all($phpFileContent); - $inDbArray = false; - $arrayDepth = 0; - - foreach ($tokens as $index => $token) { - $value = \is_array($token) ? \trim($token[1], self::TRIM_QUOTATION) : $token; - - if (!$inDbArray && $value === self::DB_KEY) { - $inDbArray = true; - continue; - } - - if (!$inDbArray) { - continue; - } - - if ($token === self::ARRAY_OPEN) { - ++$arrayDepth; - } elseif ($token === self::ARRAY_CLOSE) { - --$arrayDepth; - if ($arrayDepth === 0) { - return null; - } - } - - if ($arrayDepth === 1 && $value === self::TIMEZONE_KEY) { - for ($j = $index + 1; isset($tokens[$j]); ++$j) { - $next = $tokens[$j]; - - if (\is_array($next) && $next[0] === \T_CONSTANT_ENCAPSED_STRING) { - return \stripcslashes(\trim($next[1], self::TRIM_QUOTATION)); - } - - if (\is_array($next) && \strtolower($next[1]) === self::NULL) { - return null; - } - } - } - } - - return null; - } } diff --git a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php index 0a5b376d5..f0ee9b22b 100644 --- a/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php +++ b/src/Profile/Shopware/Gateway/Local/ShopwareLocalGateway.php @@ -149,7 +149,6 @@ public function readEnvironmentInformation( $environmentData['defaultShopLanguage'], $targetLocaleCode, $this->generateFingerprint($environmentData), - timezone: $environmentData['timezone'] ?? null, ); } diff --git a/src/Profile/Shopware/Premapping/TimezoneReader.php b/src/Profile/Shopware/Premapping/TimezoneReader.php index cb962cdf6..186cca853 100644 --- a/src/Profile/Shopware/Premapping/TimezoneReader.php +++ b/src/Profile/Shopware/Premapping/TimezoneReader.php @@ -9,12 +9,12 @@ use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Log\Package; -use SwagMigrationAssistant\Migration\Gateway\GatewayRegistryInterface; use SwagMigrationAssistant\Migration\MigrationContextInterface; use SwagMigrationAssistant\Migration\Premapping\AbstractPremappingReader; use SwagMigrationAssistant\Migration\Premapping\PremappingChoiceStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader as ApiTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; use SwagMigrationAssistant\Profile\Shopware\ShopwareProfileInterface; @@ -32,7 +32,7 @@ class TimezoneReader extends AbstractPremappingReader private array $validTimezones; public function __construct( - private readonly GatewayRegistryInterface $gatewayRegistry, + private readonly ApiTimezoneReader $timezoneReader, ) { $this->validTimezones = \array_flip(\DateTimeZone::listIdentifiers()); } @@ -57,7 +57,7 @@ public function getPremapping(Context $context, MigrationContextInterface $migra $choices = $this->getTimeZoneList(); - $sourceTimezone = $this->readSourceTimezone($migrationContext, $context); + $sourceTimezone = $this->readSourceTimezone($migrationContext); $description = $sourceTimezone ?? 'No source time zone'; $destinationTimezone = ''; @@ -87,12 +87,14 @@ public function getPremapping(Context $context, MigrationContextInterface $migra ); } - private function readSourceTimezone(MigrationContextInterface $migrationContext, Context $context): ?string + private function readSourceTimezone(MigrationContextInterface $migrationContext): ?string { - $environmentData = $this->gatewayRegistry->getGateway($migrationContext)->readEnvironmentInformation($migrationContext, $context); - - $timezone = $environmentData->getTimezone(); + if ($migrationContext->getConnection()->getGatewayName() !== ShopwareApiGateway::GATEWAY_NAME) { + return null; + } + $timezoneResult = $this->timezoneReader->read($migrationContext); + $timezone = $timezoneResult[0]['timezone'] ?? null; if (!\is_string($timezone) || $timezone === '' || !isset($this->validTimezones[$timezone])) { return null; } diff --git a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php index 116a403cf..fcc11d2cf 100644 --- a/tests/Profile/Shopware/Converter/ShopwareConverterTest.php +++ b/tests/Profile/Shopware/Converter/ShopwareConverterTest.php @@ -15,7 +15,10 @@ use SwagMigrationAssistant\Migration\Logging\LoggingServiceInterface; use SwagMigrationAssistant\Migration\Mapping\MappingServiceInterface; use SwagMigrationAssistant\Migration\MigrationContext; +use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; +use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; +use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; #[Package('after-sales')] @@ -38,52 +41,69 @@ protected function setUp(): void public function testConvertValueConvertsDateTimeWithMappedSourceTimezoneToUtcStorageFormat(): void { $mappingService = $this->createMock(MappingServiceInterface::class); - $mappingService->expects($this->once()) - ->method('getValue') - ->with($this->connection->getId(), 'source_timezone', 'timezone', $this->context) - ->willReturn('Europe/Berlin'); + $mappingService->expects($this->never())->method('getValue'); + $this->setSourceTimezone('Europe/Berlin'); $converter = $this->createConverter($mappingService); - [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00', $this->context); + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00'); static::assertSame(['createdAt' => '2026-05-01 10:30:00.000'], $converted); static::assertSame([], $source); } - public function testConvertValueCachesSourceTimezonePerConnection(): void + public function testConvertValueCachesSourceTimezonePerRun(): void { $mappingService = $this->createMock(MappingServiceInterface::class); - $mappingService->expects($this->once()) - ->method('getValue') - ->willReturn('Europe/Berlin'); + $mappingService->expects($this->never())->method('getValue'); + $this->setSourceTimezone('Europe/Berlin'); $converter = $this->createConverter($mappingService); - [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00', $this->context); - [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00', $this->context); + [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00'); + $this->setSourceTimezone('UTC'); + [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00'); static::assertSame('2026-05-01 10:00:00.000', $firstConverted['createdAt']); static::assertSame('2026-05-01 11:00:00.000', $secondConverted['createdAt']); } - public function testConvertValueCachesMissingSourceTimezonePerConnection(): void + public function testConvertValueUsesUpdatedSourceTimezoneForNewRun(): void { $mappingService = $this->createMock(MappingServiceInterface::class); - $mappingService->expects($this->once()) - ->method('getValue') - ->willReturn(null); + $mappingService->expects($this->never())->method('getValue'); + $this->setSourceTimezone('Europe/Berlin'); + + $converter = $this->createConverter($mappingService, null, Uuid::randomHex()); + + [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00'); + + $this->setSourceTimezone('UTC'); + $converter->setMigrationContext($this->createMigrationContext(Uuid::randomHex())); + + [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00'); + + static::assertSame('2026-05-01 10:00:00.000', $firstConverted['createdAt']); + static::assertSame('2026-05-01 13:00:00.000', $secondConverted['createdAt']); + } + + public function testConvertValueCachesMissingSourceTimezonePerRun(): void + { + $mappingService = $this->createMock(MappingServiceInterface::class); + $mappingService->expects($this->never())->method('getValue'); + $this->setSourceTimezone(null); $converter = $this->createConverter($mappingService); - [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00', $this->context); - [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00', $this->context); + [$firstConverted] = $converter->convertDateTimeValue('2026-05-01 12:00:00'); + $this->setSourceTimezone('Europe/Berlin'); + [$secondConverted] = $converter->convertDateTimeValue('2026-05-01 13:00:00'); static::assertSame('2026-05-01 12:00:00.000', $firstConverted['createdAt']); static::assertSame('2026-05-01 13:00:00.000', $secondConverted['createdAt']); } - public function testConvertValueDoesNotConvertDateTimeWithoutContext(): void + public function testConvertValueConvertsDateTimeWithoutContext(): void { $mappingService = $this->createMock(MappingServiceInterface::class); $mappingService->expects($this->never())->method('getValue'); @@ -92,20 +112,23 @@ public function testConvertValueDoesNotConvertDateTimeWithoutContext(): void [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00'); - static::assertSame([], $converted); - static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); + static::assertSame(['createdAt' => '2026-05-01 12:30:00.000'], $converted); + static::assertSame([], $source); } public function testConvertValueDoesNotConvertDateTimeWithInvalidMappedTimezone(): void { $mappingService = $this->createMock(MappingServiceInterface::class); - $mappingService->expects($this->once()) - ->method('getValue') - ->willReturn('Not/A_Timezone'); + $mappingService->expects($this->never())->method('getValue'); + $loggingService = $this->createMock(LoggingServiceInterface::class); + $loggingService->expects($this->once()) + ->method('log') + ->willReturnSelf(); + $this->setSourceTimezone('Not/A_Timezone'); - $converter = $this->createConverter($mappingService); + $converter = $this->createConverter($mappingService, $loggingService); - [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00', $this->context); + [$converted, $source] = $converter->convertDateTimeValue('2026-05-01 12:30:00'); static::assertSame([], $converted); static::assertSame(['createdAt' => '2026-05-01 12:30:00'], $source); @@ -143,10 +166,8 @@ public function testGetAttributesConvertsDateTimeCustomFieldWithMappedSourceTime 'columnType' => 'datetime', ], ]); - $mappingService->expects($this->once()) - ->method('getValue') - ->with($this->connection->getId(), 'source_timezone', 'timezone', $this->context) - ->willReturn('Europe/Berlin'); + $mappingService->expects($this->never())->method('getValue'); + $this->setSourceTimezone('Europe/Berlin'); $converter = $this->createConverter($mappingService); @@ -162,17 +183,43 @@ public function testGetAttributesConvertsDateTimeCustomFieldWithMappedSourceTime ], $converted); } - private function createConverter(MappingServiceInterface $mappingService): TestShopwareConverter - { + private function createConverter( + MappingServiceInterface $mappingService, + ?LoggingServiceInterface $loggingService = null, + string $runUuid = '', + ): TestShopwareConverter { $converter = new TestShopwareConverter( $mappingService, - $this->createMock(LoggingServiceInterface::class) + $loggingService ?? $this->createMock(LoggingServiceInterface::class) ); - $converter->setMigrationContext(new MigrationContext( - $this->connection, - new Shopware55Profile() - )); + $converter->setMigrationContext($this->createMigrationContext($runUuid)); return $converter; } + + private function createMigrationContext(string $runUuid = ''): MigrationContext + { + return new MigrationContext( + $this->connection, + new Shopware55Profile(), + null, + null, + $runUuid + ); + } + + private function setSourceTimezone(?string $timezone): void + { + if ($timezone === null) { + $this->connection->setPremapping([]); + + return; + } + + $this->connection->setPremapping([ + new PremappingStruct(TimezoneReader::getMappingName(), [ + new PremappingEntityStruct('timezone', $timezone, $timezone), + ]), + ]); + } } diff --git a/tests/Profile/Shopware/Converter/TestShopwareConverter.php b/tests/Profile/Shopware/Converter/TestShopwareConverter.php index a46991470..578f679df 100644 --- a/tests/Profile/Shopware/Converter/TestShopwareConverter.php +++ b/tests/Profile/Shopware/Converter/TestShopwareConverter.php @@ -34,12 +34,12 @@ public function setMigrationContext(MigrationContextInterface $migrationContext) /** * @return array{0: array, 1: array} */ - public function convertDateTimeValue(string $value, ?Context $context = null): array + public function convertDateTimeValue(string $value): array { $converted = []; $source = ['createdAt' => $value]; - $this->convertValue($converted, 'createdAt', $source, 'createdAt', self::TYPE_DATETIME, $context); + $this->convertValue($converted, 'createdAt', $source, 'createdAt', self::TYPE_DATETIME); return [$converted, $source]; } diff --git a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php index 7ff61bb3f..6fdd6e8ca 100644 --- a/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/ApiEnvironmentReaderTest.php @@ -242,47 +242,9 @@ public function testGetsEnvironmentInformation(): void static::assertEquals(new RequestStatusStruct(), $response['requestStatus']); } - public function testReadCachesEnvironmentInformationPerConnection(): void + private function createMigrationContext(): MigrationContext { - $mock = new MockHandler([ - new Response(200, [], (string) json_encode(['data' => ['timezone' => 'Europe/Berlin']])), - new Response(200, [], (string) json_encode(['data' => ['timezone' => 'Europe/London']])), - new Response(200, [], (string) json_encode(['data' => ['timezone' => 'UTC']])), - ]); - - $handler = HandlerStack::create($mock); - - $client = new HttpSimpleClient([ - 'base_uri' => 'api/', - 'auth' => ['apiUser', 'apiKey', 'digest'], - 'handler' => $handler, - ]); - - $connectionFactory = $this->createMock(ConnectionFactory::class); - $connectionFactory - ->expects($this->exactly(3)) - ->method('createApiClient') - ->willReturn($client); - - $environmentReader = new EnvironmentReader($connectionFactory); - - $firstMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); - $secondMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); - $thirdMigrationContext = $this->createMigrationContextWithConnectionId(Uuid::randomHex()); - - $firstResponse = $environmentReader->read($firstMigrationContext); - $cachedFirstResponse = $environmentReader->read($firstMigrationContext); - - $secondResponse = $environmentReader->read($secondMigrationContext); - - $thirdResponse = $environmentReader->read($thirdMigrationContext); - - static::assertSame(['timezone' => 'Europe/Berlin'], $firstResponse['environmentInformation']); - static::assertSame(['timezone' => 'Europe/Berlin'], $cachedFirstResponse['environmentInformation']); - - static::assertSame(['timezone' => 'Europe/London'], $secondResponse['environmentInformation']); - - static::assertSame(['timezone' => 'UTC'], $thirdResponse['environmentInformation']); + return $this->createMigrationContextWithConnectionId(Uuid::randomHex()); } private function createMigrationContextWithConnectionId(string $connectionId): MigrationContext @@ -295,9 +257,4 @@ private function createMigrationContextWithConnectionId(string $connectionId): M new Shopware55Profile() ); } - - private function createMigrationContext(): MigrationContext - { - return $this->createMigrationContextWithConnectionId(Uuid::randomHex()); - } } diff --git a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php index cca657231..9a480dbdc 100644 --- a/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php +++ b/tests/Profile/Shopware/Gateway/Local/EnvironmentReaderTest.php @@ -7,16 +7,12 @@ namespace SwagMigrationAssistant\Test\Profile\Shopware\Gateway\Local; -use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Shopware\Core\Framework\Log\Package; -use Shopware\Core\Framework\Uuid\Uuid; -use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Profile\Shopware\DataSelection\DataSet\CustomerDataSet; use SwagMigrationAssistant\Profile\Shopware\Gateway\Connection\ConnectionFactory; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\Reader\EnvironmentReader; -use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; use SwagMigrationAssistant\Profile\Shopware55\Shopware55Profile; use SwagMigrationAssistant\Test\Mock\Gateway\Dummy\Local\DummyLocalGateway; @@ -63,23 +59,10 @@ public function testRead(): void static::assertSame('1', $additionalData['children'][0]['main_id']); static::assertSame('en_GB', $additionalData['children'][0]['locale']['locale']); static::assertSame('39', $additionalData['children'][0]['category_id']); + static::assertArrayNotHasKey('timezone', $data); } - #[DataProvider('timezoneFixtureProvider')] - public function testReadReadsTimezoneFromInstallationRootConfig(string $fixtureName, ?string $expectedTimezone): void - { - $credentialFields = $this->connection->getCredentialFields(); - static::assertIsArray($credentialFields); - - $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/' . $fixtureName; - $this->connection->setCredentialFields($credentialFields); - - $data = $this->environmentReader->read($this->migrationContext); - - static::assertSame($expectedTimezone, $data['timezone']); - } - - public function testReadCachesEnvironmentInformationPerConnection(): void + public function testReadDoesNotReadTimezoneFromInstallationRootConfig(): void { $credentialFields = $this->connection->getCredentialFields(); static::assertIsArray($credentialFields); @@ -87,75 +70,8 @@ public function testReadCachesEnvironmentInformationPerConnection(): void $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/valid'; $this->connection->setCredentialFields($credentialFields); - $firstData = $this->environmentReader->read($this->migrationContext); - - $credentialFields['installationRoot'] = __DIR__ . '/_fixtures/environment_reader/empty_database_timezone'; - $this->connection->setCredentialFields($credentialFields); - - $cachedData = $this->environmentReader->read($this->migrationContext); - $secondMigrationContext = $this->createMigrationContextWithConnection( - $this->createConnection($credentialFields) - ); - $secondConnectionData = $this->environmentReader->read($secondMigrationContext); - - static::assertSame('Europe/Berlin', $firstData['timezone']); - static::assertSame('Europe/Berlin', $cachedData['timezone']); - static::assertNull($secondConnectionData['timezone']); - } - - /** - * @return array - */ - public static function timezoneFixtureProvider(): array - { - return [ - 'valid timezone' => [ - 'fixtureName' => 'valid', - 'expectedTimezone' => 'Europe/Berlin', - ], - 'config does not return array' => [ - 'fixtureName' => 'config_does_not_return_array', - 'expectedTimezone' => null, - ], - 'empty database timezone' => [ - 'fixtureName' => 'empty_database_timezone', - 'expectedTimezone' => null, - ], - 'missing database timezone' => [ - 'fixtureName' => 'missing_database_timezone', - 'expectedTimezone' => null, - ], - ]; - } - - /** - * @param array $credentialFields - */ - private function createConnection(array $credentialFields): SwagMigrationConnectionEntity - { - $connection = new SwagMigrationConnectionEntity(); - $connection->setId(Uuid::randomHex()); - $connection->setCredentialFields($credentialFields); - $connection->setProfileName(Shopware55Profile::PROFILE_NAME); - $connection->setGatewayName(ShopwareLocalGateway::GATEWAY_NAME); - - return $connection; - } - - private function createMigrationContextWithConnection(SwagMigrationConnectionEntity $connection): MigrationContext - { - $migrationContext = new MigrationContext( - $connection, - new Shopware55Profile(), - null, - new CustomerDataSet(), - $this->runId, - 0, - 10 - ); - - $migrationContext->setGateway(new DummyLocalGateway()); + $data = $this->environmentReader->read($this->migrationContext); - return $migrationContext; + static::assertArrayNotHasKey('timezone', $data); } } diff --git a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php index aff282585..14b243045 100644 --- a/tests/Profile/Shopware/Gateway/LocalGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/LocalGatewayTest.php @@ -221,7 +221,6 @@ public function testGenerateFingerprintWithConfig(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', - 'timezone' => 'Europe/Berlin', 'config' => [ 'esdKey' => 'test-esd-key', 'installationDate' => '2023-01-01 00:00:00', @@ -249,7 +248,6 @@ public function testGenerateFingerprintWithConfig(): void static::assertNotNull($response->getFingerprint()); static::assertIsString($response->getFingerprint()); - static::assertSame('Europe/Berlin', $response->getTimezone()); } public function testGenerateFingerprintWithoutConfig(): void @@ -285,7 +283,6 @@ public function testGenerateFingerprintWithoutConfig(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', - 'timezone' => null, ]); $localTableReader = new TableReader(new ConnectionFactory()); @@ -343,7 +340,6 @@ public function testGenerateFingerprintWithoutEsdKey(): void 'host' => 'sw55.local', 'additionalData' => [], 'defaultCurrency' => 'EUR', - 'timezone' => null, 'config' => [ 'installationDate' => '2023-01-01 00:00:00', ], diff --git a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php index a7293cb00..6ae5a5893 100644 --- a/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php +++ b/tests/Profile/Shopware/Gateway/ShopwareApiGatewayTest.php @@ -122,7 +122,7 @@ public function testReadEnvironmentInformation(): void $connectionFactory = new ConnectionFactory(); $apiReader = new ProductReader($connectionFactory); $environmentReader = new EnvironmentDummyReader($connectionFactory); - $environmentReader->setDummyData(['timezone' => 'Europe/Berlin']); + $environmentReader->setDummyData([]); $tableReader = new TableReader($connectionFactory); $tableCountReader = new TableCountDummyReader($connectionFactory, new DummyLoggingService()); @@ -139,7 +139,6 @@ public function testReadEnvironmentInformation(): void static::assertSame('Shopware', $response->getSourceSystemName()); static::assertSame('___VERSION___', $response->getSourceSystemVersion()); static::assertSame('foo', $response->getSourceSystemDomain()); - static::assertSame('Europe/Berlin', $response->getTimezone()); } public function testReadEnvironmentInformationWithoutSourceDefaultLanguage(): void diff --git a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php index eb145dc6d..67fa0dfae 100644 --- a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php +++ b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php @@ -13,12 +13,11 @@ use Shopware\Core\Framework\Log\Package; use Shopware\Core\Framework\Uuid\Uuid; use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity; -use SwagMigrationAssistant\Migration\EnvironmentInformation; use SwagMigrationAssistant\Migration\Gateway\GatewayInterface; -use SwagMigrationAssistant\Migration\Gateway\GatewayRegistryInterface; use SwagMigrationAssistant\Migration\MigrationContext; use SwagMigrationAssistant\Migration\Premapping\PremappingEntityStruct; use SwagMigrationAssistant\Migration\Premapping\PremappingStruct; +use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\Reader\TimezoneReader as ApiTimezoneReader; use SwagMigrationAssistant\Profile\Shopware\Gateway\Api\ShopwareApiGateway; use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway; use SwagMigrationAssistant\Profile\Shopware\Premapping\TimezoneReader; @@ -36,7 +35,7 @@ protected function setUp(): void public function testSupportsShopwareApiAndLocalGateways(): void { - $reader = new TimezoneReader($this->createMock(GatewayRegistryInterface::class)); + $reader = $this->createReader(null, 0); static::assertTrue($reader->supports($this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME), [])); static::assertTrue($reader->supports($this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME), [])); @@ -44,8 +43,8 @@ public function testSupportsShopwareApiAndLocalGateways(): void public function testGetPremappingUsesDetectedSourceTimezone(): void { - $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME); - $reader = $this->createReader($migrationContext, 'Europe/Berlin'); + $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); + $reader = $this->createReader([['timezone' => 'Europe/Berlin']]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertSame(TimezoneReader::getMappingName(), $premapping->getEntity()); @@ -66,7 +65,7 @@ public function testGetPremappingKeepsConfiguredDestinationTimezone(): void ]); $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME, $connection); - $reader = $this->createReader($migrationContext, 'Europe/Berlin'); + $reader = $this->createReader(null, 0); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertSame('America/New_York', $premapping->getMapping()[0]->getDestinationUuid()); @@ -75,8 +74,8 @@ public function testGetPremappingKeepsConfiguredDestinationTimezone(): void #[DataProvider('missingSourceTimezoneProvider')] public function testGetPremappingReturnsSelectableRowWhenSourceTimezoneCannotBeRead(?string $sourceTimezone): void { - $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME); - $reader = $this->createReader($migrationContext, $sourceTimezone); + $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); + $reader = $this->createReader([['timezone' => $sourceTimezone]]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertNotEmpty($premapping->getChoices()); @@ -89,12 +88,22 @@ public function testGetPremappingReturnsSelectableRowWhenSourceTimezoneCannotBeR public function testGetPremappingUsesEnvironmentInformationForApiGateway(): void { $migrationContext = $this->createMigrationContext(ShopwareApiGateway::GATEWAY_NAME); - $reader = $this->createReader($migrationContext, 'UTC'); + $reader = $this->createReader([['timezone' => 'UTC']]); $premapping = $reader->getPremapping($this->context, $migrationContext); static::assertSame('UTC', $premapping->getMapping()[0]->getDestinationUuid()); } + public function testGetPremappingDoesNotReadSourceTimezoneForLocalGateway(): void + { + $migrationContext = $this->createMigrationContext(ShopwareLocalGateway::GATEWAY_NAME); + $reader = $this->createReader(null, 0); + $premapping = $reader->getPremapping($this->context, $migrationContext); + + static::assertSame('No source time zone', $premapping->getMapping()[0]->getDescription()); + static::assertSame('', $premapping->getMapping()[0]->getDestinationUuid()); + } + /** * @return array */ @@ -107,31 +116,20 @@ public static function missingSourceTimezoneProvider(): array ]; } - private function createReader(MigrationContext $migrationContext, ?string $timezone): TimezoneReader + /** + * @param array{timezone: string|null}|null $timezoneResult + */ + private function createReader(?array $timezoneResult, int $readCount = 1): TimezoneReader { - $gateway = $this->createMock(GatewayInterface::class); - $gateway->expects($this->once()) - ->method('readEnvironmentInformation') - ->with($migrationContext, $this->context) - ->willReturn($this->createEnvironmentInformation($timezone)); - - $gatewayRegistry = $this->createMock(GatewayRegistryInterface::class); - $gatewayRegistry->expects($this->once()) - ->method('getGateway') - ->with($migrationContext) - ->willReturn($gateway); - - return new TimezoneReader($gatewayRegistry); - } + $timezoneReader = $this->createMock(ApiTimezoneReader::class); + $readExpectation = $timezoneReader->expects($this->exactly($readCount)) + ->method('read'); - private function createEnvironmentInformation(?string $timezone): EnvironmentInformation - { - return new EnvironmentInformation( - 'Shopware', - '5.5.0', - '', - timezone: $timezone - ); + if ($timezoneResult !== null) { + $readExpectation->willReturn($timezoneResult); + } + + return new TimezoneReader($timezoneReader); } private function createMigrationContext(string $gatewayName, ?SwagMigrationConnectionEntity $connection = null): MigrationContext diff --git a/tests/acceptance/fixtures/MigrationConnection.ts b/tests/acceptance/fixtures/MigrationConnection.ts index dd6b2c199..27c89cc45 100644 --- a/tests/acceptance/fixtures/MigrationConnection.ts +++ b/tests/acceptance/fixtures/MigrationConnection.ts @@ -1,6 +1,4 @@ import { test as base, expect } from '@shopware-ag/acceptance-test-suite'; -import { copyFile } from 'node:fs/promises'; -import { join } from 'node:path'; import type { FixtureTypes } from '@fixtures/AcceptanceTest'; export interface MigrationConnectionStruct { @@ -15,11 +13,6 @@ export const MigrationConnection = base.extend({ const connectionName = 'shopware'; const installationRoot = '/tmp'; - await copyFile( - join(process.cwd(), 'fixtures', 'shopware5-source', 'config.php'), - join(installationRoot, 'config.php'), - ); - const createResponse = await AdminApiContext.post('/api/swag-migration-connection', { data: { name: connectionName, diff --git a/tests/acceptance/fixtures/shopware5-source/config.php b/tests/acceptance/fixtures/shopware5-source/config.php deleted file mode 100644 index 9b4f6e05a..000000000 --- a/tests/acceptance/fixtures/shopware5-source/config.php +++ /dev/null @@ -1,12 +0,0 @@ - - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -return [ - 'db' => [ - 'timezone' => 'Europe/Berlin', - ], -]; diff --git a/tests/acceptance/tests/MigrationTest.spec.ts b/tests/acceptance/tests/MigrationTest.spec.ts index 4fa5be043..25aac624c 100644 --- a/tests/acceptance/tests/MigrationTest.spec.ts +++ b/tests/acceptance/tests/MigrationTest.spec.ts @@ -75,11 +75,6 @@ test.describe('Migration Tests @migration @visual', () => { } } - await page - .locator('.swag-migration-tab-card__title') - .filter({ hasText: 'Shipping method availability' }) - .click(); - await expect(page).toHaveScreenshot('data-selection-assigment-without-errors.png', { mask }); }); From a46760d9de1304daa9d6db5eaebbc5b189b79ef4 Mon Sep 17 00:00:00 2001 From: Dennis Garding Date: Tue, 12 May 2026 08:11:19 +0200 Subject: [PATCH 10/15] Fix tests --- .../Premapping/TimezoneReaderTest.php | 2 +- .../data-selection-assigment-with-errors.png | Bin 104862 -> 124875 bytes .../linux/migration-log-sw5.txt | 7 +++---- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php index 67fa0dfae..44c87af27 100644 --- a/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php +++ b/tests/Profile/Shopware/Premapping/TimezoneReaderTest.php @@ -117,7 +117,7 @@ public static function missingSourceTimezoneProvider(): array } /** - * @param array{timezone: string|null}|null $timezoneResult + * @param array|null $timezoneResult */ private function createReader(?array $timezoneResult, int $readCount = 1): TimezoneReader { diff --git a/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/data-selection-assigment-with-errors.png b/tests/acceptance/snapshots/MigrationTest.spec.ts/linux/data-selection-assigment-with-errors.png index d93cfe061fb714a8c6e9fbcd57e1c38a0ff646a5..7c8a6c47db5d4265b82862e291d03f4304501f11 100644 GIT binary patch literal 124875 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