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,