From 3f3bf866ddd7b2806f3ef648cb7ee7f2803f0740 Mon Sep 17 00:00:00 2001 From: andrewrowanwallee Date: Mon, 9 Feb 2026 14:17:02 +0100 Subject: [PATCH] Release 7.3.1 --- CHANGELOG.md | 7 +++++ CHANGELOG_de-DE.md | 7 +++++ README.md | 8 +++--- composer.json | 2 +- docs/de/documentation.html | 2 +- docs/en/documentation.html | 2 +- docs/fr/documentation.html | 2 +- docs/it/documentation.html | 2 +- .../Strategy/WebHookTransactionStrategy.php | 26 ++++++++++++++++++- .../PaymentMethodRouteDecorator.php | 20 +++++++++++++- .../Service/PaymentMethodFilterService.php | 2 +- .../Controller/AccountOrderController.php | 8 +++--- src/Core/Util/Analytics/Analytics.php | 2 +- src/Core/Util/Payload/TransactionPayload.php | 12 ++++----- 14 files changed, 79 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cbbc44..ea69e86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 7.3.1 +- Shopware 6.7.7.0 compatibility +- Fix for missing payment icons +- Fixed issue with 'Entire Set' coupons returning error due to totals mismatch +- Fixed issue with orphaned order_transactions causing an admin UI failure +- Fixed error thrown when customers who aren't logged in attempt to download an invoice + # 7.3.0 - Headless storefront support diff --git a/CHANGELOG_de-DE.md b/CHANGELOG_de-DE.md index 26c128f..15a6683 100644 --- a/CHANGELOG_de-DE.md +++ b/CHANGELOG_de-DE.md @@ -1,3 +1,10 @@ +# 7.3.1 +- Kompatibilität mit Shopware 6.7.7.0 +- Fehlende Zahlungssymbole behoben +- Problem mit „Gesamtes Set“-Gutscheinen aufgrund von Summenabweichungen behoben +- Problem mit verwaisten Bestelltransaktionen behoben, die zu einem Fehler in der Admin-Oberfläche führten +- Ein Fehler wurde behoben, der auftrat, wenn nicht angemeldete Kunden versuchten, eine Rechnung herunterzuladen. + # 7.3.0 - Headless Storefront unterstützung diff --git a/README.md b/README.md index 7d652f7..a14a947 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ Please note that this plugin is for versions 6.5, 6.6 or 6.7. For the 6.4 plugin ## Documentation -- For English documentation click [here](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.0/docs/en/documentation.html) -- Für die deutsche Dokumentation klicken Sie [hier](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.0/docs/de/documentation.html) -- Pour la documentation Française, cliquez [ici](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.0/docs/fr/documentation.html) -- Per la documentazione in tedesco, clicca [qui](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.0/docs/it/documentation.html) +- For English documentation click [here](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.1/docs/en/documentation.html) +- Für die deutsche Dokumentation klicken Sie [hier](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.1/docs/de/documentation.html) +- Pour la documentation Française, cliquez [ici](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.1/docs/fr/documentation.html) +- Per la documentazione in tedesco, clicca [qui](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.3.1/docs/it/documentation.html) ## Installation diff --git a/composer.json b/composer.json index 0becadc..fa9c91d 100644 --- a/composer.json +++ b/composer.json @@ -59,5 +59,5 @@ "vrpayment/sdk": "^4.0.0" }, "type": "shopware-platform-plugin", - "version": "7.3.0" + "version": "7.3.1" } diff --git a/docs/de/documentation.html b/docs/de/documentation.html index cf0182a..413ba6b 100644 --- a/docs/de/documentation.html +++ b/docs/de/documentation.html @@ -23,7 +23,7 @@
  • - + Source
  • diff --git a/docs/en/documentation.html b/docs/en/documentation.html index 8e63bd1..cddf243 100644 --- a/docs/en/documentation.html +++ b/docs/en/documentation.html @@ -23,7 +23,7 @@
  • - + Source
  • diff --git a/docs/fr/documentation.html b/docs/fr/documentation.html index 44b86c3..4afed24 100644 --- a/docs/fr/documentation.html +++ b/docs/fr/documentation.html @@ -23,7 +23,7 @@
  • - + Source
  • diff --git a/docs/it/documentation.html b/docs/it/documentation.html index 57282f3..b0a8ca7 100644 --- a/docs/it/documentation.html +++ b/docs/it/documentation.html @@ -23,7 +23,7 @@
  • - + Source
  • diff --git a/src/Core/Api/WebHooks/Strategy/WebHookTransactionStrategy.php b/src/Core/Api/WebHooks/Strategy/WebHookTransactionStrategy.php index f0b75f7..4c3aa6d 100644 --- a/src/Core/Api/WebHooks/Strategy/WebHookTransactionStrategy.php +++ b/src/Core/Api/WebHooks/Strategy/WebHookTransactionStrategy.php @@ -119,7 +119,9 @@ class WebHookTransactionStrategy extends WebHookStrategyBase implements WebhookS $orderId = $transaction->getMetaData()[TransactionPayload::VRPAYMENT_METADATA_ORDER_ID]; if (!empty($orderId) && !$transaction->getParent()) { $this->executeLocked($orderId, $context, function () use ($orderId, $transaction, $context, $request, $token) { - $this->transactionService->upsert($transaction, $context); + if ($this->allowUpsert($transaction, $orderId, $context)) { + $this->transactionService->upsert($transaction, $context); + } $orderTransactionId = $transaction->getMetaData()[TransactionPayload::VRPAYMENT_METADATA_ORDER_TRANSACTION_ID]; $orderTransaction = $this->getOrderTransaction($orderId, $context); $this->logger->info("OrderId: {orderId} Current state: {state}", [ @@ -178,4 +180,26 @@ class WebHookTransactionStrategy extends WebHookStrategyBase implements WebhookS return new JsonResponse(['data' => $request->jsonSerialize()], $status); } + + /** + * Checks the incoming transaction ID against the current transaction ID of the order. + * If they don’t match, the saved transaction in the database remains unchanged. + * + * @param Transaction $transaction The transaction data retrieved from the portal. + * @param string $orderId The order ID of the current transaction. + * @param Context $context The operational context providing settings and environment for transaction processing. + * @return bool Returns a value that determines whether to upsert the transaction into the database. + */ + private function allowUpsert(Transaction $transaction, string $orderId, Context $context): bool + { + try { + $transactionEntity = $this->transactionService->getByOrderId($orderId, $context); + if ($transactionEntity->getTransactionId() !== $transaction->getId()) { + return false; + } + } catch (\Throwable $e) { + + } + return true; + } } diff --git a/src/Core/Checkout/PaymentMethod/SalesChannel/PaymentMethodRouteDecorator.php b/src/Core/Checkout/PaymentMethod/SalesChannel/PaymentMethodRouteDecorator.php index 24f5635..5dc08ee 100644 --- a/src/Core/Checkout/PaymentMethod/SalesChannel/PaymentMethodRouteDecorator.php +++ b/src/Core/Checkout/PaymentMethod/SalesChannel/PaymentMethodRouteDecorator.php @@ -76,7 +76,7 @@ class PaymentMethodRouteDecorator extends AbstractPaymentMethodRoute $response = $this->decorated->load($request, $context, $criteria); $currentRoute = $request->attributes->get('_route'); - if ($currentRoute === 'frontend.checkout.finish.page') { + if ($currentRoute === 'frontend.checkout.finish.page' || !$this->allowFilterPaymentMethods($request)) { return $response; } @@ -100,4 +100,22 @@ class PaymentMethodRouteDecorator extends AbstractPaymentMethodRoute ) ); } + + /** + * We prevent filtering methods unless onlyAvailable is true. + * This is because the filterPaymentMethods() function creates unnecessary pending transactions in the + * portal when logged-in users navigate between pages. + * The onlyAvailable flag applies rule-based filtering of payment methods and is usually true on checkout pages, + * so we apply filterPaymentMethods() only when relevant. + * + * @param Request $request + * @return bool + */ + private function allowFilterPaymentMethods(Request $request): bool + { + if ($request->query->getBoolean('onlyAvailable') || $request->request->getBoolean('onlyAvailable')) { + return true; + } + return false; + } } diff --git a/src/Core/Checkout/Service/PaymentMethodFilterService.php b/src/Core/Checkout/Service/PaymentMethodFilterService.php index 34d5585..4fddcfa 100644 --- a/src/Core/Checkout/Service/PaymentMethodFilterService.php +++ b/src/Core/Checkout/Service/PaymentMethodFilterService.php @@ -262,7 +262,7 @@ class PaymentMethodFilterService new EqualsFilter('salesChannels.id', $salesChannelContext->getSalesChannelId()) ); $criteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING)); - + $criteria->addAssociation('media'); // Re-fetch the entities to ensure we have valid objects with all associations. $result = $this->paymentMethodRepository->search($criteria, $salesChannelContext->getContext()); /** @var \Shopware\Core\Checkout\Payment\PaymentMethodEntity $method */ diff --git a/src/Core/Storefront/Account/Controller/AccountOrderController.php b/src/Core/Storefront/Account/Controller/AccountOrderController.php index d280746..23c368d 100644 --- a/src/Core/Storefront/Account/Controller/AccountOrderController.php +++ b/src/Core/Storefront/Account/Controller/AccountOrderController.php @@ -6,7 +6,7 @@ namespace VRPaymentPayment\Core\Storefront\Account\Controller; use Psr\Log\LoggerInterface; use Shopware\Core\{ - Checkout\Cart\Exception\CustomerNotLoggedInException, + Checkout\Cart\CartException, Checkout\Customer\CustomerEntity, PlatformRequest, System\SalesChannel\SalesChannelContext @@ -133,14 +133,14 @@ class AccountOrderController extends StorefrontController * Helper to retrieve the currently logged-in customer. * * @return CustomerEntity - * @throws CustomerNotLoggedInException + * @throws CartException */ protected function getLoggedInCustomer(): CustomerEntity { $request = $this->requestStack->getCurrentRequest(); if (!$request) { - throw new CustomerNotLoggedInException(); + throw CartException::customerNotLoggedIn(); } /** @var SalesChannelContext|null $context */ @@ -150,6 +150,6 @@ class AccountOrderController extends StorefrontController return $context->getCustomer(); } - throw new CustomerNotLoggedInException(); + throw CartException::customerNotLoggedIn(); } } diff --git a/src/Core/Util/Analytics/Analytics.php b/src/Core/Util/Analytics/Analytics.php index 0f7e435..4c9e174 100644 --- a/src/Core/Util/Analytics/Analytics.php +++ b/src/Core/Util/Analytics/Analytics.php @@ -26,7 +26,7 @@ class Analytics { self::SHOP_SYSTEM => 'shopware', self::SHOP_SYSTEM_VERSION => '6', self::SHOP_SYSTEM_AND_VERSION => 'shopware-6', - self::PLUGIN_SYSTEM_VERSION => '7.3.0', + self::PLUGIN_SYSTEM_VERSION => '7.3.1', ]; } diff --git a/src/Core/Util/Payload/TransactionPayload.php b/src/Core/Util/Payload/TransactionPayload.php index 736ead9..b42bee9 100644 --- a/src/Core/Util/Payload/TransactionPayload.php +++ b/src/Core/Util/Payload/TransactionPayload.php @@ -197,7 +197,7 @@ class TransactionPayload extends AbstractPayload 'merchant_reference' => $this->fixLength($this->order->getOrderNumber(), 100), 'meta_data' => [ self::VRPAYMENT_METADATA_ORDER_ID => $this->order->getId(), - self::VRPAYMENT_METADATA_ORDER_TRANSACTION_ID => $this->order->getTransactions()->first()->getId(), + self::VRPAYMENT_METADATA_ORDER_TRANSACTION_ID => $this->transaction->getOrderTransactionId(), self::VRPAYMENT_METADATA_SALES_CHANNEL_ID => $this->salesChannelContext->getSalesChannel()->getId(), self::VRPAYMENT_METADATA_CUSTOMER_NAME => $customerName, ], @@ -378,7 +378,7 @@ class TransactionPayload extends AbstractPayload $rate = $calculatedTax->getTaxRate(); $amount = $this->calculateDiscountAmount($calculatedTax); - $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate); + $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate, $discount->getId()); } } else { $taxRules = $calculatedPrice->getTaxRules(); @@ -387,12 +387,12 @@ class TransactionPayload extends AbstractPayload foreach ($taxRules as $taxRule) { $rate = $taxRule->getTaxRate(); $amount = $calculatedPrice->getTotalPrice(); - $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate); + $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate, $discount->getId()); } } else { $rate = $this->getDefaultTaxRate(); $amount = $calculatedPrice->getTotalPrice(); - $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate); + $lineItems[] = $this->createDiscountLineItem($discountName, $amount, $rate, $discount->getId()); } } } @@ -403,7 +403,7 @@ class TransactionPayload extends AbstractPayload * @param float $rate * @return LineItemCreate */ - private function createDiscountLineItem(string $discountName, float $amount, float $rate): LineItemCreate + private function createDiscountLineItem(string $discountName, float $amount, float $rate, string $discountId): LineItemCreate { $lineItem = new LineItemCreate(); @@ -422,7 +422,7 @@ class TransactionPayload extends AbstractPayload ->setShippingRequired(false) ->setSku($discountSkuName, 200) ->setType(LineItemType::DISCOUNT) - ->setUniqueId('coupon-' . $discountSkuName); + ->setUniqueId('coupon-' . $discountSkuName . '-' . $discountId); $taxRate = new TaxCreate([ 'title' => 'Discount Tax: ' . $rate,