diff --git a/AtlDiscountExtension-main/composer.json b/AtlDiscountExtension-main/composer.json index 3b86f4c..15454b4 100644 --- a/AtlDiscountExtension-main/composer.json +++ b/AtlDiscountExtension-main/composer.json @@ -1,7 +1,7 @@ { "name": "atl/discount-extension", "description": "Discount Extension", - "version": "1.0.0", + "version": "1.0.2", "type": "shopware-platform-plugin", "license": "proprietary", "authors": [ diff --git a/AtlDiscountExtension-main/src/.DS_Store b/AtlDiscountExtension-main/src/.DS_Store deleted file mode 100644 index 99a426c..0000000 Binary files a/AtlDiscountExtension-main/src/.DS_Store and /dev/null differ diff --git a/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php b/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php index ca5c6d9..c43f05f 100644 --- a/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php +++ b/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php @@ -58,13 +58,6 @@ class CheckDiscountEligibility extends Command { $io = new ShopwareStyle($input, $output); - $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag'); - - if (empty($tagId)) { - $io->warning('Customer tag assignment in plugin configuration is missing.'); - return self::FAILURE; - } - $expiredDiscounts = $this->getExpiredDiscounts(); if (empty($expiredDiscounts)) { @@ -75,6 +68,14 @@ class CheckDiscountEligibility extends Command $tags = []; $discounts = []; foreach ($expiredDiscounts as $expiredDiscount) { + $salesChannelId = $expiredDiscount->getCustomer()->getSalesChannelId(); + $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag', $salesChannelId); + + if (empty($tagId)) { + $io->warning('Customer tag assignment in plugin configuration is missing.'); + return self::FAILURE; + } + $tags[] = [ 'customerId' => $expiredDiscount->getCustomerId(), 'tagId' => $tagId @@ -111,6 +112,7 @@ class CheckDiscountEligibility extends Command RangeFilter::LTE => $expirationDate->format(\DATE_ATOM), ] )); + $criteria->addAssociation('customer'); $criteria->setLimit(999); return $this->repeatDiscountRepository->search($criteria, Context::createDefaultContext())->getElements(); diff --git a/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php b/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php index 677ada9..d1fcf16 100644 --- a/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php +++ b/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php @@ -76,14 +76,15 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface $orderDeliveryId = $event->getEntityId(); $orderDelivery = $this->getOrderDelivery($orderDeliveryId, $event); + $salesChannelId = $orderDelivery->getOrder()->getSalesChannelId(); // In case no order delivery could be found - return if (empty($orderDelivery)) { return; } - $amountDiscountableLineItems = $this->getAmountDiscountableLineItems($orderDelivery->getPositions(), $event); - $minAmountDiscountableLineItems = $this->systemConfigService->get('AtlDiscountExtension.config.minAmountDiscountableLineItems'); + $minAmountDiscountableLineItems = $this->systemConfigService->get('AtlDiscountExtension.config.minAmountDiscountableLineItems', $salesChannelId); + $amountDiscountableLineItems = $this->getAmountDiscountableLineItems($orderDelivery->getPositions(), $minAmountDiscountableLineItems, $salesChannelId, $event); if ($amountDiscountableLineItems < $minAmountDiscountableLineItems) { return; @@ -91,8 +92,8 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface $customer = $orderDelivery->getOrder()->getOrderCustomer()->getCustomer(); - // Tag the customer and trace timestamp in 'spwn_repeat_discount' table - $this->tagCustomer($customer, $event); + // Tag the customer and trace last order date in 'spwn_repeat_discount' table + $this->tagCustomer($customer, $salesChannelId, $event); } /** @@ -112,11 +113,20 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface /** * @param OrderDeliveryPositionCollection $positions + * @param int $minAmountDiscountableLineItems + * @param string $salesChannelId + * @param StateMachineTransitionEvent $event * @return int */ - private function getAmountDiscountableLineItems(OrderDeliveryPositionCollection $positions, StateMachineTransitionEvent $event): int + private function getAmountDiscountableLineItems + ( + OrderDeliveryPositionCollection $positions, + int $minAmountDiscountableLineItems, + string $salesChannelId, + StateMachineTransitionEvent $event + ): int { - $customFieldName = $this->getCustomFieldName($event); + $customFieldName = $this->getCustomFieldName($event, $salesChannelId); // In case no custom field was assigned in the plugin config - return if ($customFieldName === '') { @@ -127,9 +137,14 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface foreach($positions as $position) { $customFields = $position->getOrderLineItem()->getPayload()['customFields']; - // Checks if the custom field is set to true - if ($customFields[$customFieldName] === true) { - $amountDiscountableLineItems++; + // Checks if the custom field exists and is set to true + if (!empty($customFields[$customFieldName]) && $customFields[$customFieldName] === true) { + $amountDiscountableLineItems += $position->getQuantity(); + } + + // Break if min amount is already reached + if ($amountDiscountableLineItems >= $minAmountDiscountableLineItems) { + break; } } @@ -138,18 +153,19 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface /** * @param StateMachineTransitionEvent $event + * @param string $salesChannelId * @return string */ - private function getCustomFieldName(StateMachineTransitionEvent $event): string + private function getCustomFieldName(StateMachineTransitionEvent $event, string $salesChannelId): string { - $customFieldId = $this->systemConfigService->get('AtlDiscountExtension.config.customField'); + $customFieldId = $this->systemConfigService->get('AtlDiscountExtension.config.customField', $salesChannelId); $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('id', $customFieldId)); /** @var CustomFieldEntity $customField */ $customField = $this->customFieldRepository->search($criteria, $event->getContext())->first(); - + // In case no custom field was assigned in the plugin config - return if (empty($customField)) { return ''; @@ -160,12 +176,13 @@ class StateMachineTransitionSubscriber implements EventSubscriberInterface /** * @param CustomerEntity $customer + * @param string $salesChannelId * @param StateMachineTransitionEvent $event * @return void */ - private function tagCustomer(CustomerEntity $customer, StateMachineTransitionEvent $event): void + private function tagCustomer(CustomerEntity $customer, string $salesChannelId, StateMachineTransitionEvent $event): void { - $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag'); + $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag', $salesChannelId); if (empty($tagId)) { return;