Compare commits

..

7 Commits

Author SHA1 Message Date
andrewrowanwallee 922f66e784 Release 7.2.0 2026-01-14 15:43:19 +01:00
andrewrowanwallee 089555e77f Release 7.1.6 2025-11-24 11:56:40 +01:00
andrewrowanwallee 55bdb5c640 Release 7.1.5 2025-11-11 13:52:29 +01:00
andrewrowanwallee d1a78fedcf Release 7.1.4 2025-10-30 16:49:17 +01:00
andrewrowanwallee d7ea44d506 Release 7.1.3 2025-10-27 12:47:17 +01:00
andrewrowanwallee fa480808b9 Release 7.1.2 2025-10-06 12:23:20 +02:00
andrewrowanwallee 017bb0e416 Release 7.1.1 2025-09-22 12:00:10 +02:00
47 changed files with 2010 additions and 792 deletions
+29
View File
@@ -1,3 +1,32 @@
# 7.2.0
- Datenbanktabelle umbenannt, um Namenskonflikte mit älteren Plugins zu vermeiden.
- Problem mit fehlgeschlagenen Rückerstattungen bei Zahlungen mit Rechnungen behoben.
# 7.1.6
- Improved rounding handling to force 2 decimal places
- Removed references to unused classes
- Fixed some type errors
- Further improved 0 amount transaction; state transitions
# 7.1.5
- Improved analytics
- Improved error handling for refunding amount 0 and too many items
# 7.1.4
- Updated SDK to 4.8.1
# 7.1.3
- Fixed issue with radio button/switch settings not saving
- Fixed issue with error screen sporadically happening after failed payments
# 7.1.2
- Support the ability to have different spaces for differet sales channels
- Fixed issue where Twint would not appear sometimes
# 7.1.1
- Updated documentation
- Fixed issue with addresses not being correctly synced
# 7.1.0 # 7.1.0
## Feature ## Feature
- Support subscription payment methods - Support subscription payment methods
+29
View File
@@ -1,3 +1,32 @@
# 7.2.0
- Datenbanktabelle umbenannt, um Namenskonflikte mit älteren Plugins zu vermeiden.
- Problem mit fehlgeschlagenen Rückerstattungen bei Zahlungen mit Rechnungen behoben.
# 7.1.6
- Verbesserte Rundungsbehandlung für zwei Dezimalstellen
- Entfernte Verweise auf ungenutzte Klassen
- Behebung einiger Typfehler
- Weitere Verbesserung von Transaktionen mit dem Betrag 0 und Zustandsübergängen
# 7.1.5
- Verbesserte Analysefunktionen
- Verbesserte Fehlerbehandlung bei Rückerstattungen von 0 Beträgen und zu vielen Artikeln
# 7.1.4
- Aktualisiertes SDK - 4.8.1
# 7.1.3
Problem behoben, bei dem die Einstellungen von Optionsfeldern/Schaltern nicht gespeichert wurden.
Problem behoben, bei dem nach fehlgeschlagenen Zahlungen sporadisch ein Fehlerbildschirm angezeigt wurde.
# 7.1.2
- Unterstützung der Möglichkeit, unterschiedliche Bereiche für verschiedene Vertriebskanäle zu nutzen.
- Problem behoben, bei dem Twint manchmal nicht angezeigt wurde.
# 7.1.1
- Dokumentation aktualisiert
- Problem behoben, bei dem Adressen nicht korrekt synchronisiert wurden.
# 7.1.0 # 7.1.0
Unterstützung für Abonnement-Zahlungsmethoden Unterstützung für Abonnement-Zahlungsmethoden
Support für Shopware 6.7.2.0 Support für Shopware 6.7.2.0
+1 -1
View File
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier same "printed page" as the copyright notice for easier
identification within third-party archives. identification within third-party archives.
Copyright 2025 VR Payment GmbH Copyright 2026 VR Payment GmbH
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
+35 -10
View File
@@ -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 ## Documentation
- For English documentation click [here](@WalleeDocPath(/docs/en/documentation.html)) - For English documentation click [here](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.2.0/docs/en/documentation.html)
- Für die deutsche Dokumentation klicken Sie [hier](@WalleeDocPath(/docs/de/documentation.html)) - Für die deutsche Dokumentation klicken Sie [hier](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.2.0/docs/de/documentation.html)
- Pour la documentation Française, cliquez [ici](@WalleeDocPath(/docs/fr/documentation.html)) - Pour la documentation Française, cliquez [ici](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.2.0/docs/fr/documentation.html)
- Per la documentazione in tedesco, clicca [qui](@WalleeDocPath(/docs/it/documentation.html)) - Per la documentazione in tedesco, clicca [qui](https://docs.plugin-documentation.vr-payment.de/vr-payment/shopware-6/7.2.0/docs/it/documentation.html)
## Installation ## Installation
@@ -28,26 +28,51 @@ Please note that this plugin is for versions 6.5, 6.6 or 6.7. For the 6.4 plugin
Copy Copy
composer require vrpayment/shopware-6 composer require vrpayment/shopware-6
php bin/console plugin:refresh php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment php bin/console plugin:install --activate --clearCache VRPayment
``` ```
### Manual Installation ### Manual Installation
1. Download the latest [Release](../../releases) 1. Download the latest [Release](../../releases)
2. Extract the ZIP to custom/plugins/VRPaymentPayment. 2. Extract the ZIP to custom/plugins/VRPayment.
```bash ```bash
Copy Copy
bin/console plugin:refresh bin/console plugin:refresh
bin/console plugin:install --activate --clearCache VRPaymentPayment bin/console plugin:install --activate --clearCache VRPayment
```
## Update
### Via Administration
1. Go to Shopware Admin > Extensions > My extensions.
2. Find VRPaymentPayment.
3. Click Update.
### Via CLI
1. Deploy the new plugin files (replace the folder in custom/plugins/VRPaymentPayment or upload/install a new ZIP).
2. Run:
```bash
bin/console plugin:refresh
bin/console plugin:update --clearCache VRPaymentPayment
bin/console cache:clear
``` ```
## Configuration ## Configuration
### API Credentials ### API Credentials
1. Navigate to Shopware Admin > Settings > VRPayment Payment. 1. Navigate to Shopware Admin > Settings > VRPayment.
2. Enter your Space ID, User ID, and API Key (obtained from the [VR Payment Portal](https://gateway.vr-payment.de/)). 2. Enter your Space ID, User ID, and API Key (obtained from the [VR Payment Portal](https://gateway.vr-payment.de/)).
### VRPayment does not appear in Settings
1. You should run the following commmand
```bash
Copy
bin/build-administration.sh
```
### Payment Methods ### Payment Methods
Configure supported methods (e.g., credit cards, Apple Pay) via the [VR Payment Portal](https://gateway.vr-payment.de/). Configure supported methods (e.g., credit cards, Apple Pay) via the [VR Payment Portal](https://gateway.vr-payment.de/).
@@ -69,7 +94,7 @@ ________________________________________________________________________________
| Shopware 6 version | Plugin major version | Supported until | | Shopware 6 version | Plugin major version | Supported until |
|-------------------------------|------------------------|------------------------| |-------------------------------|------------------------|------------------------|
| Shopware 6.7.x | 7.x | Further notice | | Shopware 6.7.x | 7.x | Further notice |
| Shopware 6.6.x | 6.x | December 2025 | | Shopware 6.6.x | 6.x | March 2026 |
| Shopware 6.5.x | 5.x | October 2024 | | Shopware 6.5.x | 5.x | October 2024 |
----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------
@@ -78,7 +103,7 @@ ________________________________________________________________________________
```bash ```bash
Copy Copy
tail -f var/log/vrpayment_payment*.log tail -f var/log/vrpayment*.log
``` ```
### Common Issues: ### Common Issues:
+1 -1
View File
@@ -59,5 +59,5 @@
"vrpayment/sdk": "^4.0.0" "vrpayment/sdk": "^4.0.0"
}, },
"type": "shopware-platform-plugin", "type": "shopware-platform-plugin",
"version": "7.1.0" "version": "7.2.0"
} }
+138 -54
View File
@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment."> <meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment.">
<link rel="canonical" href="@WalleeCanonicalPath(https://plugin-documentation.wallee.com/wallee-payment, VRPaymentPayment/docs/de/documentation.html)" /> <link rel="canonical" href="https://plugin-documentation.wallee.com/wallee-payment/shopware-6/master/VRPaymentPayment/docs/de/documentation.html" />
<title>VR Payment Zahlungs-Plugin für Shopware 6</title> <title>VR Payment Zahlungs-Plugin für Shopware 6</title>
<link href="assets/monokai-sublime.css" rel="stylesheet" /> <link href="assets/monokai-sublime.css" rel="stylesheet" />
<link href="assets/base.css" rel="stylesheet" /> <link href="assets/base.css" rel="stylesheet" />
@@ -23,7 +23,7 @@
</a> </a>
</li> </li>
<li> <li>
<a href="@WalleeReleasePath()"> <a href="https://github.com/vr-payment/shopware-6/releases/tag/7.2.0/">
Source Source
</a> </a>
</li> </li>
@@ -152,7 +152,7 @@
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6 <pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6
php bin/console plugin:refresh php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -177,7 +177,69 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh <pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div>
</div>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_vrpayment_erscheint_nicht_in_den_einstellungen">
<div class="section-title">
<h2>
<span class="title-number">4.4</span>VRPayment erscheint nicht in den Einstellungen </h2>
</div>
<div class="section-body">
<div class="paragraph">
<p>Folgender Befehl muss ausgeführt werden</p>
</div><div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/build-administration.sh</code></pre>
</div>
</div> </div>
</div> </div>
</div> <div class="chapter" id="_update">
<div class="chapter-title">
<h1>
<span class="title-number">5</span>Update </h1>
</div>
<div class="chapter-body">
<div class="section" id="_via_administration">
<div class="section-title">
<h2>
<span class="title-number">5.1</span>Via Administration </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Gehe zu Shopware Admin &gt; Erweiterungen &gt; Meine Erweiterungen.</p>
</li>
<li>
<p>Suche nach VRPaymentPayment.</p>
</li>
<li>
<p>Klicke auf Aktualisieren.</p>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_via_cli">
<div class="section-title">
<h2>
<span class="title-number">5.2</span>Via CLI </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Stelle die neuen Plugin-Dateien bereit (ersetze den Ordner <code>custom/plugins/VRPaymentPayment</code> oder lade ein neues ZIP hoch/installiere es).</p>
</li>
<li>
<p>Führe aus:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/console plugin:refresh
bin/console plugin:update --clearCache VRPaymentPayment
bin/console cache:clear</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -187,7 +249,7 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
</div> <div class="chapter" id="portal-startup-guide"> </div> <div class="chapter" id="portal-startup-guide">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">5</span>Portal-Startanleitung </h1> <span class="title-number">6</span>Portal-Startanleitung </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -206,7 +268,7 @@ Wählen Sie das passende Abo aus es sollte E-Commerce-Transaktionen unterst
</div> <div class="section" id="_erstellen_sie_den_api_schlüssel"> </div> <div class="section" id="_erstellen_sie_den_api_schlüssel">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.1</span>Erstellen Sie den API-Schlüssel: </h2> <span class="title-number">6.1</span>Erstellen Sie den API-Schlüssel: </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -292,7 +354,7 @@ Bitte beachten Sie, dass das Laden der Rollen einige Sekunden dauern kann.
</div> <div class="section" id="_zahlungsmethoden_einrichten"> </div> <div class="section" id="_zahlungsmethoden_einrichten">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.2</span>Zahlungsmethoden einrichten </h2> <span class="title-number">6.2</span>Zahlungsmethoden einrichten </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -354,7 +416,7 @@ Bitte beachten Sie, dass die Konnektoren doppelt erscheinen, da einer für Zahlu
</div> <div class="chapter" id="_shop_startanleitung"> </div> <div class="chapter" id="_shop_startanleitung">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">6</span>Shop-Startanleitung </h1> <span class="title-number">7</span>Shop-Startanleitung </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -364,7 +426,7 @@ Bitte beachten Sie, dass die Konnektoren doppelt erscheinen, da einer für Zahlu
<div class="olist loweralpha"> <div class="olist loweralpha">
<ol class="loweralpha" type="a"> <ol class="loweralpha" type="a">
<li> <li>
<p>Navigieren Sie zu <strong>Shopware Admin → Einstellungen → Erweiterungen → VR Payment Payment</strong> und klicken Sie auf Speichern.</p> <p>Navigieren Sie zu <strong>Shopware Admin → Einstellungen → Erweiterungen → VR Payment</strong> und klicken Sie auf Speichern.</p>
</li> </li>
<li> <li>
<p>Geben Sie Ihre <code>Space ID</code>, <code>User ID</code>, und <code>API Key</code> ein.</p> <p>Geben Sie Ihre <code>Space ID</code>, <code>User ID</code>, und <code>API Key</code> ein.</p>
@@ -493,7 +555,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="chapter" id="_transaktionszustandsdiagramm"> </div> <div class="chapter" id="_transaktionszustandsdiagramm">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">7</span>Transaktionszustandsdiagramm </h1> <span class="title-number">8</span>Transaktionszustandsdiagramm </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -503,7 +565,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_zustandsabbildung_von_shopware_bestellungen"> </div> <div class="section" id="_zustandsabbildung_von_shopware_bestellungen">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.1</span>Zustandsabbildung von Shopware-Bestellungen </h2> <span class="title-number">8.1</span>Zustandsabbildung von Shopware-Bestellungen </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -511,7 +573,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_allgemeine_anmerkungen_zu_bestellstatus"> </div> <div class="section" id="_allgemeine_anmerkungen_zu_bestellstatus">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.1.1</span>Allgemeine Anmerkungen zu Bestellstatus </h3> <span class="title-number">8.1.1</span>Allgemeine Anmerkungen zu Bestellstatus </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -521,7 +583,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_zustandsabbildung_des_shopware_zahlungsstatus"> </div> <div class="section" id="_zustandsabbildung_des_shopware_zahlungsstatus">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.2</span>Zustandsabbildung des Shopware-Zahlungsstatus </h2> <span class="title-number">8.2</span>Zustandsabbildung des Shopware-Zahlungsstatus </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -548,7 +610,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_allgemeine_anmerkungen_zu_zahlungsstatus"> </div> <div class="section" id="_allgemeine_anmerkungen_zu_zahlungsstatus">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.2.1</span>Allgemeine Anmerkungen zu Zahlungsstatus </h3> <span class="title-number">8.2.1</span>Allgemeine Anmerkungen zu Zahlungsstatus </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -558,7 +620,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_zustandsabbildung_des_shopware_lieferstatus"> </div> <div class="section" id="_zustandsabbildung_des_shopware_lieferstatus">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.3</span>Zustandsabbildung des Shopware-Lieferstatus </h2> <span class="title-number">8.3</span>Zustandsabbildung des Shopware-Lieferstatus </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -584,7 +646,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="chapter" id="_transaktionsverwaltung"> </div> <div class="chapter" id="_transaktionsverwaltung">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">8</span>Transaktionsverwaltung </h1> <span class="title-number">9</span>Transaktionsverwaltung </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -592,7 +654,7 @@ Bitte beachten Sie, dass diese Option leer bleiben sollte, wenn Sie die Space Vi
</div> <div class="section" id="_bestellung_abschließen_erfassen"> </div> <div class="section" id="_bestellung_abschließen_erfassen">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.1</span>Bestellung abschließen (erfassen) </h2> <span class="title-number">9.1</span>Bestellung abschließen (erfassen) </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -620,7 +682,7 @@ Wenn der Abschluss in VR Payment ausstehend ist, bleibt die Bestellung im Status
</div> <div class="section" id="_transaktion_stornieren"> </div> <div class="section" id="_transaktion_stornieren">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.2</span>Transaktion stornieren </h2> <span class="title-number">9.2</span>Transaktion stornieren </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -644,7 +706,7 @@ Sie können nur Transaktionen stornieren, die noch nicht abgeschlossen sind.
</div> <div class="section" id="_rückerstattung_einer_transaktion"> </div> <div class="section" id="_rückerstattung_einer_transaktion">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.3</span>Rückerstattung einer Transaktion </h2> <span class="title-number">9.3</span>Rückerstattung einer Transaktion </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -670,7 +732,7 @@ Es kann einige Zeit dauern, bis Sie die Rückerstattung in Shopware sehen. Rück
</div> <div class="section" id="_bestellungen_auf_on_hold"> </div> <div class="section" id="_bestellungen_auf_on_hold">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.4</span>Bestellungen auf On Hold </h2> <span class="title-number">9.4</span>Bestellungen auf On Hold </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -692,7 +754,7 @@ Es kann einige Zeit dauern, bis Sie die Rückerstattung in Shopware sehen. Rück
</div> <div class="section" id="_einschränkungen_der_synchronisierung_zwischen_whitelabelname_und_shopware"> </div> <div class="section" id="_einschränkungen_der_synchronisierung_zwischen_whitelabelname_und_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.5</span>Einschränkungen der Synchronisierung zwischen VR Payment und Shopware </h2> <span class="title-number">9.5</span>Einschränkungen der Synchronisierung zwischen VR Payment und Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -703,7 +765,7 @@ Es kann einige Zeit dauern, bis Sie die Rückerstattung in Shopware sehen. Rück
</div> <div class="section" id="_tokenisierung"> </div> <div class="section" id="_tokenisierung">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.6</span>Tokenisierung </h2> <span class="title-number">9.6</span>Tokenisierung </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -723,7 +785,7 @@ Die Tokenisierung ist für Gast-Checkouts nicht verfügbar
</div> <div class="section" id="_wiederkehrende_zahlungen"> </div> <div class="section" id="_wiederkehrende_zahlungen">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.7</span>Wiederkehrende Zahlungen </h2> <span class="title-number">9.7</span>Wiederkehrende Zahlungen </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -733,7 +795,7 @@ Tokenisierung unterstützt, kann er für Abonnements verwendet werden. Die wiede
</div> <div class="section" id="_hauptfunktionen"> </div> <div class="section" id="_hauptfunktionen">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.8</span>Hauptfunktionen </h2> <span class="title-number">9.8</span>Hauptfunktionen </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -758,7 +820,7 @@ Tokenisierung unterstützt, kann er für Abonnements verwendet werden. Die wiede
</div> <div class="section" id="_fehlerbehebung"> </div> <div class="section" id="_fehlerbehebung">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.9</span>Fehlerbehebung </h2> <span class="title-number">9.9</span>Fehlerbehebung </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -768,7 +830,7 @@ Tokenisierung unterstützt, kann er für Abonnements verwendet werden. Die wiede
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">COPY <pre class="highlight"><code class="language-bash" data-lang="bash">COPY
tail -f var/log/whitelabelname_payment*.log</code></pre> tail -f var/log/whitelabelname*.log</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -790,7 +852,7 @@ tail -f var/log/whitelabelname_payment*.log</code></pre>
</div> <div class="section" id="_faqs"> </div> <div class="section" id="_faqs">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.10</span>FAQs </h2> <span class="title-number">9.10</span>FAQs </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -819,7 +881,7 @@ A: Ja, das Plugin unterstützt Wallets wie Apple Pay.</p>
</div> <div class="chapter" id="_änderungsprotokoll"> </div> <div class="chapter" id="_änderungsprotokoll">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">9</span>Änderungsprotokoll </h1> <span class="title-number">10</span>Änderungsprotokoll </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -828,7 +890,7 @@ A: Ja, das Plugin unterstützt Wallets wie Apple Pay.</p>
</div> <div class="chapter" id="_mitwirken"> </div> <div class="chapter" id="_mitwirken">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">10</span>Mitwirken </h1> <span class="title-number">11</span>Mitwirken </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -839,7 +901,7 @@ A: Ja, das Plugin unterstützt Wallets wie Apple Pay.</p>
</div> <div class="chapter" id="_support"> </div> <div class="chapter" id="_support">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">11</span>Support </h1> <span class="title-number">12</span>Support </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -888,135 +950,157 @@ A: Ja, das Plugin unterstützt Wallets wie Apple Pay.</p>
<span class="item-number">4.3</span> <span class="item-number">4.3</span>
<span class="item-title">Via Composer (Recommended)</span> <span class="item-title">Via Composer (Recommended)</span>
</a> </a>
</li> <li class="nav-level-2">
<a href="#_vrpayment_erscheint_nicht_in_den_einstellungen">
<span class="item-number">4.4</span>
<span class="item-title">VRPayment erscheint nicht in den Einstellungen</span>
</a>
</li> </ul>
</li> <li class="nav-level-1">
<a href="#_update">
<span class="item-number">5</span>
<span class="item-title">Update</span>
</a>
<ul class="nav">
<li class="nav-level-2">
<a href="#_via_administration">
<span class="item-number">5.1</span>
<span class="item-title">Via Administration</span>
</a>
</li> <li class="nav-level-2">
<a href="#_via_cli">
<span class="item-number">5.2</span>
<span class="item-title">Via CLI</span>
</a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#portal-startup-guide"> <a href="#portal-startup-guide">
<span class="item-number">5</span> <span class="item-number">6</span>
<span class="item-title">Portal-Startanleitung</span> <span class="item-title">Portal-Startanleitung</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_erstellen_sie_den_api_schlüssel"> <a href="#_erstellen_sie_den_api_schlüssel">
<span class="item-number">5.1</span> <span class="item-number">6.1</span>
<span class="item-title">Erstellen Sie den API-Schlüssel:</span> <span class="item-title">Erstellen Sie den API-Schlüssel:</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_zahlungsmethoden_einrichten"> <a href="#_zahlungsmethoden_einrichten">
<span class="item-number">5.2</span> <span class="item-number">6.2</span>
<span class="item-title">Zahlungsmethoden einrichten</span> <span class="item-title">Zahlungsmethoden einrichten</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_shop_startanleitung"> <a href="#_shop_startanleitung">
<span class="item-number">6</span> <span class="item-number">7</span>
<span class="item-title">Shop-Startanleitung</span> <span class="item-title">Shop-Startanleitung</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_transaktionszustandsdiagramm"> <a href="#_transaktionszustandsdiagramm">
<span class="item-number">7</span> <span class="item-number">8</span>
<span class="item-title">Transaktionszustandsdiagramm</span> <span class="item-title">Transaktionszustandsdiagramm</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_zustandsabbildung_von_shopware_bestellungen"> <a href="#_zustandsabbildung_von_shopware_bestellungen">
<span class="item-number">7.1</span> <span class="item-number">8.1</span>
<span class="item-title">Zustandsabbildung von Shopware-Bestellungen</span> <span class="item-title">Zustandsabbildung von Shopware-Bestellungen</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_allgemeine_anmerkungen_zu_bestellstatus"> <a href="#_allgemeine_anmerkungen_zu_bestellstatus">
<span class="item-number">7.1.1</span> <span class="item-number">8.1.1</span>
<span class="item-title">Allgemeine Anmerkungen zu Bestellstatus</span> <span class="item-title">Allgemeine Anmerkungen zu Bestellstatus</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_zustandsabbildung_des_shopware_zahlungsstatus"> <a href="#_zustandsabbildung_des_shopware_zahlungsstatus">
<span class="item-number">7.2</span> <span class="item-number">8.2</span>
<span class="item-title">Zustandsabbildung des Shopware-Zahlungsstatus</span> <span class="item-title">Zustandsabbildung des Shopware-Zahlungsstatus</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_allgemeine_anmerkungen_zu_zahlungsstatus"> <a href="#_allgemeine_anmerkungen_zu_zahlungsstatus">
<span class="item-number">7.2.1</span> <span class="item-number">8.2.1</span>
<span class="item-title">Allgemeine Anmerkungen zu Zahlungsstatus</span> <span class="item-title">Allgemeine Anmerkungen zu Zahlungsstatus</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_zustandsabbildung_des_shopware_lieferstatus"> <a href="#_zustandsabbildung_des_shopware_lieferstatus">
<span class="item-number">7.3</span> <span class="item-number">8.3</span>
<span class="item-title">Zustandsabbildung des Shopware-Lieferstatus</span> <span class="item-title">Zustandsabbildung des Shopware-Lieferstatus</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_transaktionsverwaltung"> <a href="#_transaktionsverwaltung">
<span class="item-number">8</span> <span class="item-number">9</span>
<span class="item-title">Transaktionsverwaltung</span> <span class="item-title">Transaktionsverwaltung</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_bestellung_abschließen_erfassen"> <a href="#_bestellung_abschließen_erfassen">
<span class="item-number">8.1</span> <span class="item-number">9.1</span>
<span class="item-title">Bestellung abschließen (erfassen)</span> <span class="item-title">Bestellung abschließen (erfassen)</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_transaktion_stornieren"> <a href="#_transaktion_stornieren">
<span class="item-number">8.2</span> <span class="item-number">9.2</span>
<span class="item-title">Transaktion stornieren</span> <span class="item-title">Transaktion stornieren</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_rückerstattung_einer_transaktion"> <a href="#_rückerstattung_einer_transaktion">
<span class="item-number">8.3</span> <span class="item-number">9.3</span>
<span class="item-title">Rückerstattung einer Transaktion</span> <span class="item-title">Rückerstattung einer Transaktion</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_bestellungen_auf_on_hold"> <a href="#_bestellungen_auf_on_hold">
<span class="item-number">8.4</span> <span class="item-number">9.4</span>
<span class="item-title">Bestellungen auf On Hold</span> <span class="item-title">Bestellungen auf On Hold</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_einschränkungen_der_synchronisierung_zwischen_whitelabelname_und_shopware"> <a href="#_einschränkungen_der_synchronisierung_zwischen_whitelabelname_und_shopware">
<span class="item-number">8.5</span> <span class="item-number">9.5</span>
<span class="item-title">Einschränkungen der Synchronisierung zwischen VR Payment und Shopware</span> <span class="item-title">Einschränkungen der Synchronisierung zwischen VR Payment und Shopware</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_tokenisierung"> <a href="#_tokenisierung">
<span class="item-number">8.6</span> <span class="item-number">9.6</span>
<span class="item-title">Tokenisierung</span> <span class="item-title">Tokenisierung</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_wiederkehrende_zahlungen"> <a href="#_wiederkehrende_zahlungen">
<span class="item-number">8.7</span> <span class="item-number">9.7</span>
<span class="item-title">Wiederkehrende Zahlungen</span> <span class="item-title">Wiederkehrende Zahlungen</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_hauptfunktionen"> <a href="#_hauptfunktionen">
<span class="item-number">8.8</span> <span class="item-number">9.8</span>
<span class="item-title">Hauptfunktionen</span> <span class="item-title">Hauptfunktionen</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_fehlerbehebung"> <a href="#_fehlerbehebung">
<span class="item-number">8.9</span> <span class="item-number">9.9</span>
<span class="item-title">Fehlerbehebung</span> <span class="item-title">Fehlerbehebung</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_faqs"> <a href="#_faqs">
<span class="item-number">8.10</span> <span class="item-number">9.10</span>
<span class="item-title">FAQs</span> <span class="item-title">FAQs</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_änderungsprotokoll"> <a href="#_änderungsprotokoll">
<span class="item-number">9</span> <span class="item-number">10</span>
<span class="item-title">Änderungsprotokoll</span> <span class="item-title">Änderungsprotokoll</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_mitwirken"> <a href="#_mitwirken">
<span class="item-number">10</span> <span class="item-number">11</span>
<span class="item-title">Mitwirken</span> <span class="item-title">Mitwirken</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_support"> <a href="#_support">
<span class="item-number">11</span> <span class="item-number">12</span>
<span class="item-title">Support</span> <span class="item-title">Support</span>
</a> </a>
</li> </ul> </li> </ul>
+140 -56
View File
@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment."> <meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment.">
<link rel="canonical" href="@WalleeCanonicalPath(https://plugin-documentation.wallee.com/wallee-payment, VRPaymentPayment/docs/en/documentation.html)" /> <link rel="canonical" href="https://plugin-documentation.wallee.com/wallee-payment/shopware-6/master/VRPaymentPayment/docs/en/documentation.html" />
<title>VR Payment Shopware 6 Documentation</title> <title>VR Payment Shopware 6 Documentation</title>
<link href="assets/monokai-sublime.css" rel="stylesheet" /> <link href="assets/monokai-sublime.css" rel="stylesheet" />
<link href="assets/base.css" rel="stylesheet" /> <link href="assets/base.css" rel="stylesheet" />
@@ -23,7 +23,7 @@
</a> </a>
</li> </li>
<li> <li>
<a href="@WalleeReleasePath()"> <a href="https://github.com/vr-payment/shopware-6/releases/tag/7.2.0/">
Source Source
</a> </a>
</li> </li>
@@ -39,7 +39,7 @@
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>The VR Payment Payment Plugin integrates modern payment processing into Shopware 6, offering features like iFrame-based payments, refunds, captures, and PCI compliance. It supports seamless integration with the VR Payment Portal for managing transactions and payment methods.</p> <p>The VR Payment Plugin integrates modern payment processing into Shopware 6, offering features like iFrame-based payments, refunds, captures, and PCI compliance. It supports seamless integration with the VR Payment Portal for managing transactions and payment methods.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Important: Please note that only Major (e.g. 6.x.0.0) and Minor (e.g. 6.0.x.0) update will be tested for compatibility within a 2 weeks after release.</p> <p>Important: Please note that only Major (e.g. 6.x.0.0) and Minor (e.g. 6.0.x.0) update will be tested for compatibility within a 2 weeks after release.</p>
</div> </div> </div> </div>
@@ -127,7 +127,7 @@
</div> </div>
</li> </li>
<li> <li>
<p>Activate the VR Payment Payment plugin from the Plugin Manager.</p> <p>Activate the VR Payment plugin from the Plugin Manager.</p>
</li> </li>
</ol> </ol>
</div> </div> </div> </div>
@@ -148,7 +148,7 @@
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6 <pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6
php bin/console plugin:refresh php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -173,7 +173,69 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh <pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div>
</div>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_vrpayment_does_not_appear_in_settings">
<div class="section-title">
<h2>
<span class="title-number">4.4</span>VRPayment does not appear in Settings </h2>
</div>
<div class="section-body">
<div class="paragraph">
<p>You should run the following commmand</p>
</div><div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/build-administration.sh</code></pre>
</div>
</div> </div>
</div> </div>
</div> <div class="chapter" id="_update">
<div class="chapter-title">
<h1>
<span class="title-number">5</span>Update </h1>
</div>
<div class="chapter-body">
<div class="section" id="_via_administration">
<div class="section-title">
<h2>
<span class="title-number">5.1</span>Via Administration </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Go to Shopware Admin &gt; Extensions &gt; My extensions.</p>
</li>
<li>
<p>Find VRPaymentPayment.</p>
</li>
<li>
<p>Click Update.</p>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_via_cli">
<div class="section-title">
<h2>
<span class="title-number">5.2</span>Via CLI </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Deploy the new plugin files (replace the folder in <code>custom/plugins/VRPaymentPayment</code> or upload/install a new ZIP).</p>
</li>
<li>
<p>Run:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/console plugin:refresh
bin/console plugin:update --clearCache VRPaymentPayment
bin/console cache:clear</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -183,7 +245,7 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
</div> <div class="chapter" id="portal-startup-guide"> </div> <div class="chapter" id="portal-startup-guide">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">5</span>Portal Startup Guide </h1> <span class="title-number">6</span>Portal Startup Guide </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -202,7 +264,7 @@ Please select the proper subscription plan - it should support ecommerce transac
</div> <div class="section" id="_create_the_api_key"> </div> <div class="section" id="_create_the_api_key">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.1</span>Create the API key: </h2> <span class="title-number">6.1</span>Create the API key: </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -288,7 +350,7 @@ Please note that Roles might be loading for few seconds
</div> <div class="section" id="_setup_payment_methods"> </div> <div class="section" id="_setup_payment_methods">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.2</span>Setup Payment Methods </h2> <span class="title-number">6.2</span>Setup Payment Methods </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -350,7 +412,7 @@ Please note that the connectors seems duplicated but it because one is for Physi
</div> <div class="chapter" id="_shop_startup_guide"> </div> <div class="chapter" id="_shop_startup_guide">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">6</span>Shop Startup Guide </h1> <span class="title-number">7</span>Shop Startup Guide </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -360,7 +422,7 @@ Please note that the connectors seems duplicated but it because one is for Physi
<div class="olist loweralpha"> <div class="olist loweralpha">
<ol class="loweralpha" type="a"> <ol class="loweralpha" type="a">
<li> <li>
<p>Navigate to <strong>Shopware Admin</strong><strong>Settings</strong><strong>Extensions</strong><strong>VR Payment Payment</strong> and click on <strong>Save</strong>.</p> <p>Navigate to <strong>Shopware Admin</strong><strong>Settings</strong><strong>Extensions</strong><strong>VR Payment</strong> and click on <strong>Save</strong>.</p>
</li> </li>
<li> <li>
<p>Enter your <code>Space ID</code>, <code>User ID</code>, and <code>API Key</code></p> <p>Enter your <code>Space ID</code>, <code>User ID</code>, and <code>API Key</code></p>
@@ -489,7 +551,7 @@ Please note that if you do not use the Space View Id; this option should stay em
</div> <div class="chapter" id="_transaction_state_graph"> </div> <div class="chapter" id="_transaction_state_graph">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">7</span>Transaction State graph </h1> <span class="title-number">8</span>Transaction State graph </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -501,7 +563,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="section" id="_state_mapping_of_shopware_orders"> </div> <div class="section" id="_state_mapping_of_shopware_orders">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.1</span>State mapping of Shopware orders </h2> <span class="title-number">8.1</span>State mapping of Shopware orders </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -509,7 +571,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="section" id="_general_remarks_regarding_order_statuses"> </div> <div class="section" id="_general_remarks_regarding_order_statuses">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.1.1</span>General remarks regarding order statuses </h3> <span class="title-number">8.1.1</span>General remarks regarding order statuses </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -519,7 +581,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="section" id="_state_mapping_of_shopware_payment_status"> </div> <div class="section" id="_state_mapping_of_shopware_payment_status">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.2</span>State mapping of Shopware payment status </h2> <span class="title-number">8.2</span>State mapping of Shopware payment status </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -546,7 +608,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="section" id="_general_remarks_regarding_payment_statuses"> </div> <div class="section" id="_general_remarks_regarding_payment_statuses">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.2.1</span>General remarks regarding payment statuses </h3> <span class="title-number">8.2.1</span>General remarks regarding payment statuses </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -556,7 +618,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="section" id="_state_mapping_of_shopware_delivery_status"> </div> <div class="section" id="_state_mapping_of_shopware_delivery_status">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.3</span>State mapping of Shopware delivery status </h2> <span class="title-number">8.3</span>State mapping of Shopware delivery status </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -582,7 +644,7 @@ can be found in the <a href="https://gateway.vr-payment.de/en-us/doc/payment/tra
</div> <div class="chapter" id="_transaction_management"> </div> <div class="chapter" id="_transaction_management">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">8</span>Transaction management </h1> <span class="title-number">9</span>Transaction management </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -592,7 +654,7 @@ Shopware. However, there are some limitations (see below).</p>
</div> <div class="section" id="_complete_capture_an_order"> </div> <div class="section" id="_complete_capture_an_order">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.1</span>Complete (capture) an order </h2> <span class="title-number">9.1</span>Complete (capture) an order </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -626,7 +688,7 @@ the fulfill state is reached. Initially the transaction will be in the <code>Aut
</div> <div class="section" id="_void_a_transaction"> </div> <div class="section" id="_void_a_transaction">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.2</span>Void a transaction </h2> <span class="title-number">9.2</span>Void a transaction </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -650,7 +712,7 @@ You can only void transactions that are not yet completed.
</div> <div class="section" id="_refund_of_a_transaction"> </div> <div class="section" id="_refund_of_a_transaction">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.3</span>Refund of a transaction </h2> <span class="title-number">9.3</span>Refund of a transaction </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -677,7 +739,7 @@ It can take some time until you see the refund in Shopware. Refunds will only be
</div> <div class="section" id="_on_hold_orders"> </div> <div class="section" id="_on_hold_orders">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.4</span>On hold orders </h2> <span class="title-number">9.4</span>On hold orders </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -701,7 +763,7 @@ within the defined time frame, VR Payment will generate a manual task which you
</div> <div class="section" id="_limitations_of_the_synchronization_between_whitelabelname_and_shopware"> </div> <div class="section" id="_limitations_of_the_synchronization_between_whitelabelname_and_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.5</span>Limitations of the synchronization between VR Payment and Shopware </h2> <span class="title-number">9.5</span>Limitations of the synchronization between VR Payment and Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -717,7 +779,7 @@ your Shopware backend.</p>
</div> <div class="section" id="_tokenization"> </div> <div class="section" id="_tokenization">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.6</span>Tokenization </h2> <span class="title-number">9.6</span>Tokenization </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -738,7 +800,7 @@ Tokenization is not available for guest checkouts.
</div> <div class="section" id="_recurring_payments"> </div> <div class="section" id="_recurring_payments">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.7</span>Recurring payments </h2> <span class="title-number">9.7</span>Recurring payments </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -748,7 +810,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="section" id="_key_features"> </div> <div class="section" id="_key_features">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.8</span>Key Features </h2> <span class="title-number">9.8</span>Key Features </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -773,7 +835,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="section" id="_troubleshooting"> </div> <div class="section" id="_troubleshooting">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.9</span>Troubleshooting </h2> <span class="title-number">9.9</span>Troubleshooting </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -782,7 +844,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
<p>Logs: Check payment logs with:</p> <p>Logs: Check payment logs with:</p>
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname_payment*.log</code></pre> <pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname*.log</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -804,7 +866,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="section" id="_faqs"> </div> <div class="section" id="_faqs">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.10</span>FAQs </h2> <span class="title-number">9.10</span>FAQs </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -836,7 +898,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="chapter" id="_changelog"> </div> <div class="chapter" id="_changelog">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">9</span>Changelog </h1> <span class="title-number">10</span>Changelog </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -845,7 +907,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="chapter" id="_contributing"> </div> <div class="chapter" id="_contributing">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">10</span>Contributing </h1> <span class="title-number">11</span>Contributing </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -856,7 +918,7 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
</div> <div class="chapter" id="_support"> </div> <div class="chapter" id="_support">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">11</span>Support </h1> <span class="title-number">12</span>Support </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -905,135 +967,157 @@ tokenization, it can be used for subscriptions. The recurring payment is fully m
<span class="item-number">4.3</span> <span class="item-number">4.3</span>
<span class="item-title">Manual Installation</span> <span class="item-title">Manual Installation</span>
</a> </a>
</li> <li class="nav-level-2">
<a href="#_vrpayment_does_not_appear_in_settings">
<span class="item-number">4.4</span>
<span class="item-title">VRPayment does not appear in Settings</span>
</a>
</li> </ul>
</li> <li class="nav-level-1">
<a href="#_update">
<span class="item-number">5</span>
<span class="item-title">Update</span>
</a>
<ul class="nav">
<li class="nav-level-2">
<a href="#_via_administration">
<span class="item-number">5.1</span>
<span class="item-title">Via Administration</span>
</a>
</li> <li class="nav-level-2">
<a href="#_via_cli">
<span class="item-number">5.2</span>
<span class="item-title">Via CLI</span>
</a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#portal-startup-guide"> <a href="#portal-startup-guide">
<span class="item-number">5</span> <span class="item-number">6</span>
<span class="item-title">Portal Startup Guide</span> <span class="item-title">Portal Startup Guide</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_create_the_api_key"> <a href="#_create_the_api_key">
<span class="item-number">5.1</span> <span class="item-number">6.1</span>
<span class="item-title">Create the API key:</span> <span class="item-title">Create the API key:</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_setup_payment_methods"> <a href="#_setup_payment_methods">
<span class="item-number">5.2</span> <span class="item-number">6.2</span>
<span class="item-title">Setup Payment Methods</span> <span class="item-title">Setup Payment Methods</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_shop_startup_guide"> <a href="#_shop_startup_guide">
<span class="item-number">6</span> <span class="item-number">7</span>
<span class="item-title">Shop Startup Guide</span> <span class="item-title">Shop Startup Guide</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_transaction_state_graph"> <a href="#_transaction_state_graph">
<span class="item-number">7</span> <span class="item-number">8</span>
<span class="item-title">Transaction State graph</span> <span class="item-title">Transaction State graph</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_state_mapping_of_shopware_orders"> <a href="#_state_mapping_of_shopware_orders">
<span class="item-number">7.1</span> <span class="item-number">8.1</span>
<span class="item-title">State mapping of Shopware orders</span> <span class="item-title">State mapping of Shopware orders</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_general_remarks_regarding_order_statuses"> <a href="#_general_remarks_regarding_order_statuses">
<span class="item-number">7.1.1</span> <span class="item-number">8.1.1</span>
<span class="item-title">General remarks regarding order statuses</span> <span class="item-title">General remarks regarding order statuses</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_state_mapping_of_shopware_payment_status"> <a href="#_state_mapping_of_shopware_payment_status">
<span class="item-number">7.2</span> <span class="item-number">8.2</span>
<span class="item-title">State mapping of Shopware payment status</span> <span class="item-title">State mapping of Shopware payment status</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_general_remarks_regarding_payment_statuses"> <a href="#_general_remarks_regarding_payment_statuses">
<span class="item-number">7.2.1</span> <span class="item-number">8.2.1</span>
<span class="item-title">General remarks regarding payment statuses</span> <span class="item-title">General remarks regarding payment statuses</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_state_mapping_of_shopware_delivery_status"> <a href="#_state_mapping_of_shopware_delivery_status">
<span class="item-number">7.3</span> <span class="item-number">8.3</span>
<span class="item-title">State mapping of Shopware delivery status</span> <span class="item-title">State mapping of Shopware delivery status</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_transaction_management"> <a href="#_transaction_management">
<span class="item-number">8</span> <span class="item-number">9</span>
<span class="item-title">Transaction management</span> <span class="item-title">Transaction management</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_complete_capture_an_order"> <a href="#_complete_capture_an_order">
<span class="item-number">8.1</span> <span class="item-number">9.1</span>
<span class="item-title">Complete (capture) an order</span> <span class="item-title">Complete (capture) an order</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_void_a_transaction"> <a href="#_void_a_transaction">
<span class="item-number">8.2</span> <span class="item-number">9.2</span>
<span class="item-title">Void a transaction</span> <span class="item-title">Void a transaction</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_refund_of_a_transaction"> <a href="#_refund_of_a_transaction">
<span class="item-number">8.3</span> <span class="item-number">9.3</span>
<span class="item-title">Refund of a transaction</span> <span class="item-title">Refund of a transaction</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_on_hold_orders"> <a href="#_on_hold_orders">
<span class="item-number">8.4</span> <span class="item-number">9.4</span>
<span class="item-title">On hold orders</span> <span class="item-title">On hold orders</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_limitations_of_the_synchronization_between_whitelabelname_and_shopware"> <a href="#_limitations_of_the_synchronization_between_whitelabelname_and_shopware">
<span class="item-number">8.5</span> <span class="item-number">9.5</span>
<span class="item-title">Limitations of the synchronization between VR Payment and Shopware</span> <span class="item-title">Limitations of the synchronization between VR Payment and Shopware</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_tokenization"> <a href="#_tokenization">
<span class="item-number">8.6</span> <span class="item-number">9.6</span>
<span class="item-title">Tokenization</span> <span class="item-title">Tokenization</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_recurring_payments"> <a href="#_recurring_payments">
<span class="item-number">8.7</span> <span class="item-number">9.7</span>
<span class="item-title">Recurring payments</span> <span class="item-title">Recurring payments</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_key_features"> <a href="#_key_features">
<span class="item-number">8.8</span> <span class="item-number">9.8</span>
<span class="item-title">Key Features</span> <span class="item-title">Key Features</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_troubleshooting"> <a href="#_troubleshooting">
<span class="item-number">8.9</span> <span class="item-number">9.9</span>
<span class="item-title">Troubleshooting</span> <span class="item-title">Troubleshooting</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_faqs"> <a href="#_faqs">
<span class="item-number">8.10</span> <span class="item-number">9.10</span>
<span class="item-title">FAQs</span> <span class="item-title">FAQs</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_changelog"> <a href="#_changelog">
<span class="item-number">9</span> <span class="item-number">10</span>
<span class="item-title">Changelog</span> <span class="item-title">Changelog</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_contributing"> <a href="#_contributing">
<span class="item-number">10</span> <span class="item-number">11</span>
<span class="item-title">Contributing</span> <span class="item-title">Contributing</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_support"> <a href="#_support">
<span class="item-number">11</span> <span class="item-number">12</span>
<span class="item-title">Support</span> <span class="item-title">Support</span>
</a> </a>
</li> </ul> </li> </ul>
+166 -82
View File
@@ -5,15 +5,15 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment."> <meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment.">
<link rel="canonical" href="@WalleeCanonicalPath(https://plugin-documentation.wallee.com/wallee-payment, VRPaymentPayment/docs/fr/documentation.html)" /> <link rel="canonical" href="https://plugin-documentation.wallee.com/wallee-payment/shopware-6/master/VRPaymentPayment/docs/fr/documentation.html" />
<title>Wallee Payment Plugin pour Shopware 6</title> <title>VR Payment Plugin pour Shopware 6</title>
<link href="assets/monokai-sublime.css" rel="stylesheet" /> <link href="assets/monokai-sublime.css" rel="stylesheet" />
<link href="assets/base.css" rel="stylesheet" /> <link href="assets/base.css" rel="stylesheet" />
</head> </head>
<body class="documentation"> <body class="documentation">
<div class="layout-wrapper"> <div class="layout-wrapper">
<div class="layout-title"> <div class="layout-title">
<h1>Wallee Payment Plugin pour Shopware 6</h1> <h1>VR Payment Plugin pour Shopware 6</h1>
<h2>Documentation</h2> </div> <h2>Documentation</h2> </div>
<div class="layout-navigation"> <div class="layout-navigation">
<ul class="nav"> <ul class="nav">
@@ -23,7 +23,7 @@
</a> </a>
</li> </li>
<li> <li>
<a href="@WalleeReleasePath()"> <a href="https://github.com/vr-payment/shopware-6/releases/tag/7.2.0/">
Source Source
</a> </a>
</li> </li>
@@ -39,7 +39,7 @@
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>Le plugin de paiement Wallee intègre un traitement moderne des paiements dans Shopware 6, offrant des fonctionnalités telles que les paiements basés sur iFrame, les remboursements, les captures et la conformité PCI. Il permet une intégration transparente avec le portail Wallee pour la gestion des transactions et des méthodes de paiement.</p> <p>Le plugin de paiement VR Payment intègre un traitement moderne des paiements dans Shopware 6, offrant des fonctionnalités telles que les paiements basés sur iFrame, les remboursements, les captures et la conformité PCI. Il permet une intégration transparente avec le portail VR Payment pour la gestion des transactions et des méthodes de paiement.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Important : Veuillez noter que seules les mises à jour majeures (par exemple 6.x.0.0) et mineures (par exemple 6.0.x.0) seront testées pour la compatibilité dans les 2 semaines suivant la publication.</p> <p>Important : Veuillez noter que seules les mises à jour majeures (par exemple 6.x.0.0) et mineures (par exemple 6.0.x.0) seront testées pour la compatibilité dans les 2 semaines suivant la publication.</p>
</div> </div> </div> </div>
@@ -54,7 +54,7 @@
</div><div class="paragraph"> </div><div class="paragraph">
<p><strong>PHP</strong>: Version minimale requise pour votre installation Shopware (e.g., 7.4+).</p> <p><strong>PHP</strong>: Version minimale requise pour votre installation Shopware (e.g., 7.4+).</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p><strong>Compte Wallee</strong>: Obtenir Space ID, User ID, et clé API du <strong>Portail Wallee</strong> (voir le <a href="#portal-startup-guide">Guide de démarrage du Portail</a>).</p> <p><strong>Compte VR Payment</strong>: Obtenir Space ID, User ID, et clé API du <strong>Portail VR Payment</strong> (voir le <a href="#portal-startup-guide">Guide de démarrage du Portail</a>).</p>
</div> </div> </div> </div>
</div> <div class="chapter" id="compatibility"> </div> <div class="chapter" id="compatibility">
<div class="chapter-title"> <div class="chapter-title">
@@ -125,7 +125,7 @@
</div> </div>
</li> </li>
<li> <li>
<p>Activez le plugin wallee Payment à partir du gestionnaire de plugins</p> <p>Activez le plugin VR Payment à partir du gestionnaire de plugins</p>
</li> </li>
</ol> </ol>
</div> </div> </div> </div>
@@ -146,7 +146,7 @@
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6 <pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6
php bin/console plugin:refresh php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -167,14 +167,76 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
</div><div class="listingblock"> </div><div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh <pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div> </div>
</div> </div> </div> </div>
</div> <div class="section" id="_si_vrpayment_n_apparaît_pas_dans_les_paramètres">
<div class="section-title">
<h2>
<span class="title-number">4.4</span>Si VRPayment n&#8217;apparaît pas dans les paramètres </h2>
</div>
<div class="section-body">
<div class="paragraph">
<p>Vous devez exécuter la commande suivante</p>
</div><div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/build-administration.sh</code></pre>
</div>
</div> </div>
</div> </div>
</div> <div class="chapter" id="_mise_à_jour">
<div class="chapter-title">
<h1>
<span class="title-number">5</span>Mise à jour </h1>
</div>
<div class="chapter-body">
<div class="section" id="_via_l_administration">
<div class="section-title">
<h2>
<span class="title-number">5.1</span>Via ladministration </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Allez dans Shopware Admin &gt; Extensions &gt; Mes extensions.</p>
</li>
<li>
<p>Recherchez VRPaymentPayment.</p>
</li>
<li>
<p>Cliquez sur Mettre à jour.</p>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_via_la_cli">
<div class="section-title">
<h2>
<span class="title-number">5.2</span>Via la CLI </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Déployez les nouveaux fichiers du plugin (remplacez le dossier <code>custom/plugins/VRPaymentPayment</code> ou téléversez/installez un nouveau ZIP).</p>
</li>
<li>
<p>Exécutez :</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/console plugin:refresh
bin/console plugin:update --clearCache VRPaymentPayment
bin/console cache:clear</code></pre>
</div>
</div>
</li>
</ol>
</div> </div>
</div> </div> </div> </div>
</div> <div class="chapter" id="portal-startup-guide"> </div> <div class="chapter" id="portal-startup-guide">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">5</span>Guide de démarrage pour le Portail </h1> <span class="title-number">6</span>Guide de démarrage pour le Portail </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -193,7 +255,7 @@ Veuillez sélectionner le plan d&#8217;abonnement approprié - il doit prendre e
</div> <div class="section" id="_créez_la_clé_api"> </div> <div class="section" id="_créez_la_clé_api">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.1</span>Créez la clé API: </h2> <span class="title-number">6.1</span>Créez la clé API: </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -279,7 +341,7 @@ Veuillez noter que le chargement des rôles peut durer quelques secondes.
</div> <div class="section" id="_configurer_les_modes_de_paiement"> </div> <div class="section" id="_configurer_les_modes_de_paiement">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.2</span>Configurer les modes de paiement </h2> <span class="title-number">6.2</span>Configurer les modes de paiement </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -341,7 +403,7 @@ Veuillez noter que les connecteurs semblent faire double emploi, mais c&#8217;es
</div> <div class="chapter" id="_guide_de_démarrage_pour_shopware"> </div> <div class="chapter" id="_guide_de_démarrage_pour_shopware">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">6</span>Guide de démarrage pour Shopware </h1> <span class="title-number">7</span>Guide de démarrage pour Shopware </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -351,7 +413,7 @@ Veuillez noter que les connecteurs semblent faire double emploi, mais c&#8217;es
<div class="olist loweralpha"> <div class="olist loweralpha">
<ol class="loweralpha" type="a"> <ol class="loweralpha" type="a">
<li> <li>
<p>Naviguez vers <strong>Shopware Admin → Paramètres → Extensions → Wallee Payment</strong> et cliquez sur Sauvegarder.</p> <p>Naviguez vers <strong>Shopware Admin → Paramètres → Extensions → VR Payment</strong> et cliquez sur Sauvegarder.</p>
</li> </li>
<li> <li>
<p>Entrez votre <code>Space ID</code>, <code>User ID</code>, et <code>clé API</code></p> <p>Entrez votre <code>Space ID</code>, <code>User ID</code>, et <code>clé API</code></p>
@@ -374,7 +436,7 @@ Veuillez noter que les connecteurs semblent faire double emploi, mais c&#8217;es
<li> <li>
<p><strong>Méthodes de Paiment</strong></p> <p><strong>Méthodes de Paiment</strong></p>
<div class="paragraph"> <div class="paragraph">
<p>Les méthodes de paiement disponibles à la caisse sont gérées par le Portail Wallee. Si vous souhaitez désactiver une méthode de paiement, vous devez la désactiver à partir du portail.</p> <p>Les méthodes de paiement disponibles à la caisse sont gérées par le Portail VR Payment. Si vous souhaitez désactiver une méthode de paiement, vous devez la désactiver à partir du portail.</p>
</div> </div>
<div class="admonitionblock note"> <div class="admonitionblock note">
<table> <table>
@@ -480,17 +542,17 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div> <div class="chapter" id="_différents_etats_pour_une_transaction"> </div> <div class="chapter" id="_différents_etats_pour_une_transaction">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">7</span>Différents Etats pour une Transaction </h1> <span class="title-number">8</span>Différents Etats pour une Transaction </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>Le processus de paiement de wallee est complètement standardisé pour chaque méthode de paiement que vous pouvez traiter. Cela vous permet d&#8217;ajouter simplement une méthode de paiement ou un processeur sans modifier la configuration de votre Shopware. Une vue d&#8217;ensemble des états et des processus de paiement de wallee peut être trouvée dans la <a href="https://gateway.vr-payment.de/en-us/doc/payment/transaction-process" target="_blank">documentation sur les paiments.</a>.</p> <p>Le processus de paiement de VR Payment est complètement standardisé pour chaque méthode de paiement que vous pouvez traiter. Cela vous permet d&#8217;ajouter simplement une méthode de paiement ou un processeur sans modifier la configuration de votre Shopware. Une vue d&#8217;ensemble des états et des processus de paiement de VR Payment peut être trouvée dans la <a href="https://gateway.vr-payment.de/en-us/doc/payment/transaction-process" target="_blank">documentation sur les paiments.</a>.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Dans la section suivante, nous vous donnons un aperçu de la façon dont les états de wallee sont mappés dans le graphique des états de Shopware pour les commandes et les états de paiement.</p> <p>Dans la section suivante, nous vous donnons un aperçu de la façon dont les états de VR Payment sont mappés dans le graphique des états de Shopware pour les commandes et les états de paiement.</p>
</div> <div class="section" id="_cartographie_des_différents_états_d_une_commande_de_shopware"> </div> <div class="section" id="_cartographie_des_différents_états_d_une_commande_de_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.1</span>Cartographie des différents états dune commande de Shopware </h2> <span class="title-number">8.1</span>Cartographie des différents états dune commande de Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -498,7 +560,7 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div> <div class="section" id="_remarque_générales_concernant_les_status_des_commandes"> </div> <div class="section" id="_remarque_générales_concernant_les_status_des_commandes">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.1.1</span>Remarque générales concernant les status des commandes </h3> <span class="title-number">8.1.1</span>Remarque générales concernant les status des commandes </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -508,11 +570,11 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div> <div class="section" id="_cartographie_des_différents_états_du_paiement_de_shopware"> </div> <div class="section" id="_cartographie_des_différents_états_du_paiement_de_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.2</span>Cartographie des différents états du paiement de Shopware </h2> <span class="title-number">8.2</span>Cartographie des différents états du paiement de Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
<p>Vous trouverez ci-dessous un diagramme qui montre lassociation des différents états de Shopware pour l&#8217;état de paiement pour wallee, ainsi que des informations supplémentaires sur les transitions entre les états.</p> <p>Vous trouverez ci-dessous un diagramme qui montre lassociation des différents états de Shopware pour l&#8217;état de paiement pour VR Payment, ainsi que des informations supplémentaires sur les transitions entre les états.</p>
</div><div class="imageblock"> </div><div class="imageblock">
<div class="content"> <div class="content">
<img src="resource/shopware_6_stage_graph_order.svg" alt="shopware 6 stage graph order"/> <img src="resource/shopware_6_stage_graph_order.svg" alt="shopware 6 stage graph order"/>
@@ -520,7 +582,7 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div><div class="olist glossary"> </div><div class="olist glossary">
<ol class="glossary"> <ol class="glossary">
<li> <li>
<p>Si la transaction est <code>Autorisée</code> dans wallee, le statut du paiement de la commande dans le Shopware est marqué comme étant <code>En Cours</code>.</p> <p>Si la transaction est <code>Autorisée</code> dans VR Payment, le statut du paiement de la commande dans le Shopware est marqué comme étant <code>En Cours</code>.</p>
</li> </li>
<li> <li>
<p>Si la transaction échoue avant ou pendant le processus d&#8217;autorisation, le statut du paiement de la commande du Shopware est marqué comme <code>Échouée</code>.</p> <p>Si la transaction échoue avant ou pendant le processus d&#8217;autorisation, le statut du paiement de la commande du Shopware est marqué comme <code>Échouée</code>.</p>
@@ -529,13 +591,13 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
<p>Si la transaction échoue après l&#8217;autorisation, le statut du paiement de la commande du Shopware est marqué comme <code>Annulée</code>.</p> <p>Si la transaction échoue après l&#8217;autorisation, le statut du paiement de la commande du Shopware est marqué comme <code>Annulée</code>.</p>
</li> </li>
<li> <li>
<p>Si la facture de la transaction dans wallee est marquée comme <code>Payée</code> ou <code>Non Applicable</code>, le statut du paiement de la commande dans le Shopware est marqué comme <code>Payée</code>.</p> <p>Si la facture de la transaction dans VR Payment est marquée comme <code>Payée</code> ou <code>Non Applicable</code>, le statut du paiement de la commande dans le Shopware est marqué comme <code>Payée</code>.</p>
</li> </li>
</ol> </ol>
</div> <div class="section" id="_remarques_générales_concernant_les_différents_status_pour_les_paiements"> </div> <div class="section" id="_remarques_générales_concernant_les_différents_status_pour_les_paiements">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.2.1</span>Remarques générales concernant les différents status pour les paiements </h3> <span class="title-number">8.2.1</span>Remarques générales concernant les différents status pour les paiements </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -545,7 +607,7 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div> <div class="section" id="_carthographie_des_différents_états_de_livraison_chez_shopware"> </div> <div class="section" id="_carthographie_des_différents_états_de_livraison_chez_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.3</span>Carthographie des différents états de livraison chez Shopware </h2> <span class="title-number">8.3</span>Carthographie des différents états de livraison chez Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -557,10 +619,10 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div><div class="olist glossary"> </div><div class="olist glossary">
<ol class="glossary"> <ol class="glossary">
<li> <li>
<p>Si la transaction est <code>confirmée</code> dans wallee, le statut de livraison de la commande dans le Shopware est indiqué comme étant <code>En Attente</code>.</p> <p>Si la transaction est <code>confirmée</code> dans VR Payment, le statut de livraison de la commande dans le Shopware est indiqué comme étant <code>En Attente</code>.</p>
</li> </li>
<li> <li>
<p>Si la transaction dans wallee est marquée comme <code>Délivrée</code>, le statut de livraison de la commande Shopware est marqué comme <code>Ouvert</code>.</p> <p>Si la transaction dans VR Payment est marquée comme <code>Délivrée</code>, le statut de livraison de la commande Shopware est marqué comme <code>Ouvert</code>.</p>
</li> </li>
<li> <li>
<p>Si la transaction est en statut <code>Déclinée</code>, <code>Échouée</code> ou <code>Annulée</code>, le statut de livraison de la commande du Shopware est marqué comme <code>Annulée</code>.</p> <p>Si la transaction est en statut <code>Déclinée</code>, <code>Échouée</code> ou <code>Annulée</code>, le statut de livraison de la commande du Shopware est marqué comme <code>Annulée</code>.</p>
@@ -571,15 +633,15 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
</div> <div class="chapter" id="_gestion_des_transactions"> </div> <div class="chapter" id="_gestion_des_transactions">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">8</span>Gestion des Transactions </h1> <span class="title-number">9</span>Gestion des Transactions </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>Vous pouvez capturer, annuler et rembourser des transactions directement depuis le backend de Shopware. Veuillez noter que si vous remboursez, annulez ou capturez des transactions dans wallee, les événements seront synchronisés dans Shopware. Cependant, il y a quelques limitations (voir ci-dessous).</p> <p>Vous pouvez capturer, annuler et rembourser des transactions directement depuis le backend de Shopware. Veuillez noter que si vous remboursez, annulez ou capturez des transactions dans VR Payment, les événements seront synchronisés dans Shopware. Cependant, il y a quelques limitations (voir ci-dessous).</p>
</div> <div class="section" id="_complete_capture_an_order"> </div> <div class="section" id="_complete_capture_an_order">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.1</span>Complete (capture) an order </h2> <span class="title-number">9.1</span>Complete (capture) an order </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -593,7 +655,7 @@ Veuillez noter que si vous n&#8217;utilisez pas Space View Id, cette option doit
<div class="title">Note</div> <div class="title">Note</div>
</td> </td>
<td class="content"> <td class="content">
Lorsque le paiement est en attente dans wallee, la commande reste en attente. Lorsque le paiement est en attente dans VR Payment, la commande reste en attente.
</td> </td>
</tr> </tr>
</table> </table>
@@ -604,14 +666,14 @@ Lorsque le paiement est en attente dans wallee, la commande reste en attente.
</div><div class="paragraph"> </div><div class="paragraph">
<p><strong>Finalisation du paiement de manière différée</strong></p> <p><strong>Finalisation du paiement de manière différée</strong></p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Les détaillants souhaitent souvent autoriser les transactions et lancer le processus d&#8217;exécution une fois que tous les articles peuvent être expédiés. Cela est également possible avec wallee.</p> <p>Les détaillants souhaitent souvent autoriser les transactions et lancer le processus d&#8217;exécution une fois que tous les articles peuvent être expédiés. Cela est également possible avec VR Payment.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Cependant, certains processus doivent être suivis. Si vous avez configuré la finalisation du paiement pour qu&#8217;il soit différé, vous devez capturer la transaction avant d&#8217;initier l&#8217;expédition, car il peut toujours arriver quune finalisation échoue. Si vous voulez être sûr de ne pas expédier d&#8217;articles pour lesquels vous n&#8217;avez pas été payé, vous devez reporter l&#8217;expédition jusqu&#8217;à ce que l&#8217;état <code>Confirmé</code> soit atteint. Au départ, la transaction sera dans l&#8217;état <code>Autorisé</code> dans wallee et <code>En cours</code> dans Shopware. Si vous souhaitez lancer le processus d&#8217;exécution, assurez-vous de lancer le processus d&#8217;achèvement comme décrit ci-dessus. Une fois le processus terminé avec succès, la commande passera à l&#8217;état <code>Confirmée</code> dans wallee et à l&#8217;état Payée dans Shopware. Vous pouvez maintenant lancer le processus de livraison .</p> <p>Cependant, certains processus doivent être suivis. Si vous avez configuré la finalisation du paiement pour qu&#8217;il soit différé, vous devez capturer la transaction avant d&#8217;initier l&#8217;expédition, car il peut toujours arriver quune finalisation échoue. Si vous voulez être sûr de ne pas expédier d&#8217;articles pour lesquels vous n&#8217;avez pas été payé, vous devez reporter l&#8217;expédition jusqu&#8217;à ce que l&#8217;état <code>Confirmé</code> soit atteint. Au départ, la transaction sera dans l&#8217;état <code>Autorisé</code> dans VR Payment et <code>En cours</code> dans Shopware. Si vous souhaitez lancer le processus d&#8217;exécution, assurez-vous de lancer le processus d&#8217;achèvement comme décrit ci-dessus. Une fois le processus terminé avec succès, la commande passera à l&#8217;état <code>Confirmée</code> dans VR Payment et à l&#8217;état Payée dans Shopware. Vous pouvez maintenant lancer le processus de livraison .</p>
</div> </div> </div> </div>
</div> <div class="section" id="_annuler_une_transaction"> </div> <div class="section" id="_annuler_une_transaction">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.2</span>Annuler une transaction </h2> <span class="title-number">9.2</span>Annuler une transaction </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -635,7 +697,7 @@ Vous ne pouvez annuler que les transactions qui ne sont pas encore complétée..
</div> <div class="section" id="_remboursement_d_une_transaction"> </div> <div class="section" id="_remboursement_d_une_transaction">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.3</span>Remboursement d&#8217;une transaction </h2> <span class="title-number">9.3</span>Remboursement d&#8217;une transaction </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -661,11 +723,11 @@ Il peut s&#8217;écouler un certain temps avant que vous ne voyiez le remboursem
</div> <div class="section" id="_commandes_en_attente"> </div> <div class="section" id="_commandes_en_attente">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.4</span>Commandes en attente </h2> <span class="title-number">9.4</span>Commandes en attente </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
<p>La livraison ne doit pas être effectuée tant que l&#8217;état de la livraison est en attente. Cela se produit lorsque la transaction dans wallee n&#8217;a pas atteint l&#8217;état Confirmé.</p> <p>La livraison ne doit pas être effectuée tant que l&#8217;état de la livraison est en attente. Cela se produit lorsque la transaction dans VR Payment n&#8217;a pas atteint l&#8217;état Confirmé.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Il y a essentiellement deux raisons pour lesquelles cela peut se produire :</p> <p>Il y a essentiellement deux raisons pour lesquelles cela peut se produire :</p>
</div><div class="ulist"> </div><div class="ulist">
@@ -674,27 +736,27 @@ Il peut s&#8217;écouler un certain temps avant que vous ne voyiez le remboursem
<p>La transaction n&#8217;est pas terminée. Dans ce cas, vous devez compléter la transaction comme indiqué ci-dessus..</p> <p>La transaction n&#8217;est pas terminée. Dans ce cas, vous devez compléter la transaction comme indiqué ci-dessus..</p>
</li> </li>
<li> <li>
<p>Nous ne sommes pas en mesure de déterminer si vous devez honorer la commande. La décision de livraison est prise automatiquement. Si cela ne se produit pas dans le délai défini, wallee génère une tâche manuelle que vous devez observer et suivre les instructions.</p> <p>Nous ne sommes pas en mesure de déterminer si vous devez honorer la commande. La décision de livraison est prise automatiquement. Si cela ne se produit pas dans le délai défini, VR Payment génère une tâche manuelle que vous devez observer et suivre les instructions.</p>
</li> </li>
</ul> </ul>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Vous trouverez plus d&#8217;informations sur les tâches manuelles dans notre <a href="https://gateway.vr-payment.de/en-us/doc/manual-tasks" target="_blank">Documentation sur les Tâches Manuelles.</a>.</p> <p>Vous trouverez plus d&#8217;informations sur les tâches manuelles dans notre <a href="https://gateway.vr-payment.de/en-us/doc/manual-tasks" target="_blank">Documentation sur les Tâches Manuelles.</a>.</p>
</div> </div> </div> </div>
</div> <div class="section" id="_limites_de_la_synchronisation_entre_wallee_et_shopware"> </div> <div class="section" id="_limites_de_la_synchronisation_entre_whitelabelname_et_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.5</span>Limites de la synchronisation entre wallee et Shopware </h2> <span class="title-number">9.5</span>Limites de la synchronisation entre VR Payment et Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
<p>Veuillez noter que les captures, annulations et remboursements effectués dans wallee sont synchronisés. Cependant, il y a quelques limitations. Dans wallee, vous pouvez modifier le <strong>prix unitaire</strong> et <strong>la quantité</strong> en une seule fois. Cela n&#8217;est pas possible dans le backend du Shopware. Nous vous recommandons donc d&#8217;effectuer les remboursements toujours dans le backend de Shopware et non dans wallee. Si un remboursement ne peut pas être synchronisé, il sera envoyé au processeur, mais il se peut que vous ne le voyiez pas dans votre backend Shopware.</p> <p>Veuillez noter que les captures, annulations et remboursements effectués dans VR Payment sont synchronisés. Cependant, il y a quelques limitations. Dans VR Payment, vous pouvez modifier le <strong>prix unitaire</strong> et <strong>la quantité</strong> en une seule fois. Cela n&#8217;est pas possible dans le backend du Shopware. Nous vous recommandons donc d&#8217;effectuer les remboursements toujours dans le backend de Shopware et non dans VR Payment. Si un remboursement ne peut pas être synchronisé, il sera envoyé au processeur, mais il se peut que vous ne le voyiez pas dans votre backend Shopware.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Vous pouvez trouver plus d&#8217;informations sur les remboursements dans wallee dans notre <a href="https://gateway.vr-payment.de/en-us/doc/payment/refund" target="_blank">Documentation sur les Remboursements.</a>.</p> <p>Vous pouvez trouver plus d&#8217;informations sur les remboursements dans VR Payment dans notre <a href="https://gateway.vr-payment.de/en-us/doc/payment/refund" target="_blank">Documentation sur les Remboursements.</a>.</p>
</div> </div> </div> </div>
</div> <div class="section" id="_tokenisation"> </div> <div class="section" id="_tokenisation">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.6</span>Tokenisation </h2> <span class="title-number">9.6</span>Tokenisation </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -714,7 +776,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
</div> <div class="section" id="_paiements_récurrents"> </div> <div class="section" id="_paiements_récurrents">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.7</span>Paiements récurrents </h2> <span class="title-number">9.7</span>Paiements récurrents </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -723,7 +785,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
</div> <div class="section" id="_caractéristiques_pricinpales"> </div> <div class="section" id="_caractéristiques_pricinpales">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.8</span>Caractéristiques Pricinpales </h2> <span class="title-number">9.8</span>Caractéristiques Pricinpales </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -732,13 +794,13 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
<p><strong>Intégration iFrame</strong>: Intégrez des formulaires de paiement directement dans votre checkout.</p> <p><strong>Intégration iFrame</strong>: Intégrez des formulaires de paiement directement dans votre checkout.</p>
</li> </li>
<li> <li>
<p><strong>Remboursements &amp; Captures</strong>: Déclenchez des remboursements complets/partiels et des captures à partir de Shopware ou du portail Wallee.</p> <p><strong>Remboursements &amp; Captures</strong>: Déclenchez des remboursements complets/partiels et des captures à partir de Shopware ou du portail VR Payment.</p>
</li> </li>
<li> <li>
<p><strong>Support Multi-Magasins</strong>: Gérez les configurations sur plusieurs magasins.</p> <p><strong>Support Multi-Magasins</strong>: Gérez les configurations sur plusieurs magasins.</p>
</li> </li>
<li> <li>
<p><strong>Mises à jour automatiques</strong>: Les méthodes de paiement se synchronisent dynamiquement via l&#8217;API Wallee.</p> <p><strong>Mises à jour automatiques</strong>: Les méthodes de paiement se synchronisent dynamiquement via l&#8217;API VR Payment.</p>
</li> </li>
<li> <li>
<p><strong>Paiements récurrents</strong>: Effectuez des paiements récurrents avec les abonnements (Shopware Commercial) et VRPayment.</p> <p><strong>Paiements récurrents</strong>: Effectuez des paiements récurrents avec les abonnements (Shopware Commercial) et VRPayment.</p>
@@ -748,7 +810,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
</div> <div class="section" id="_troubleshooting"> </div> <div class="section" id="_troubleshooting">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.9</span>Troubleshooting </h2> <span class="title-number">9.9</span>Troubleshooting </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -757,7 +819,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
<p>Logs: Vérifiez les logs des payments avec:</p> <p>Logs: Vérifiez les logs des payments avec:</p>
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname_payment*.log</code></pre> <pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname*.log</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -769,7 +831,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
<p>Assurez-vous que la commande <code>composer update whitelabelname/shopware-6</code> est exécutée après les mises à jour.</p> <p>Assurez-vous que la commande <code>composer update whitelabelname/shopware-6</code> est exécutée après les mises à jour.</p>
</li> </li>
<li> <li>
<p>Vérifier que les identifiants de l&#8217;API correspondent à votre compte Wallee.</p> <p>Vérifier que les identifiants de l&#8217;API correspondent à votre compte VR Payment.</p>
</li> </li>
</ul> </ul>
</div> </div>
@@ -779,7 +841,7 @@ La tokenisation n&#8217;est pas disponible pour les paiements par les invités.
</div> <div class="section" id="_faqs"> </div> <div class="section" id="_faqs">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.10</span>FAQs </h2> <span class="title-number">9.10</span>FAQs </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -795,7 +857,7 @@ A: Vous devez vérifier que les webhooks ont été correctement créés. Pour ce
</div> </div>
</div><div class="paragraph"> </div><div class="paragraph">
<p><strong>Q: Ce plugin prend-il en charge les paiements en un clic ?</strong> <p><strong>Q: Ce plugin prend-il en charge les paiements en un clic ?</strong>
A: Oui, via la tokenisation dans le portail Wallee.</p> A: Oui, via la tokenisation dans le portail VR Payment.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p><strong>Q: Comment gérer la conformité PCI ?</strong> <p><strong>Q: Comment gérer la conformité PCI ?</strong>
A: Le plugin utilise l&#8217;intégration iFrame, réduisant les exigences PCI à SAQ-A.</p> A: Le plugin utilise l&#8217;intégration iFrame, réduisant les exigences PCI à SAQ-A.</p>
@@ -807,7 +869,7 @@ A: Oui, le plugin prend en charge les portefeuilles comme Apple Pay.</p>
</div> <div class="chapter" id="_changelog"> </div> <div class="chapter" id="_changelog">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">9</span>Changelog </h1> <span class="title-number">10</span>Changelog </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -816,7 +878,7 @@ A: Oui, le plugin prend en charge les portefeuilles comme Apple Pay.</p>
</div> <div class="chapter" id="_contribuer"> </div> <div class="chapter" id="_contribuer">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">10</span>Contribuer </h1> <span class="title-number">11</span>Contribuer </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -827,7 +889,7 @@ A: Oui, le plugin prend en charge les portefeuilles comme Apple Pay.</p>
</div> <div class="chapter" id="_support"> </div> <div class="chapter" id="_support">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">11</span>Support </h1> <span class="title-number">12</span>Support </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -876,135 +938,157 @@ A: Oui, le plugin prend en charge les portefeuilles comme Apple Pay.</p>
<span class="item-number">4.3</span> <span class="item-number">4.3</span>
<span class="item-title">Via Composer (Recommended)</span> <span class="item-title">Via Composer (Recommended)</span>
</a> </a>
</li> <li class="nav-level-2">
<a href="#_si_vrpayment_n_apparaît_pas_dans_les_paramètres">
<span class="item-number">4.4</span>
<span class="item-title">Si VRPayment n&amp;#8217;apparaît pas dans les paramètres</span>
</a>
</li> </ul>
</li> <li class="nav-level-1">
<a href="#_mise_à_jour">
<span class="item-number">5</span>
<span class="item-title">Mise à jour</span>
</a>
<ul class="nav">
<li class="nav-level-2">
<a href="#_via_l_administration">
<span class="item-number">5.1</span>
<span class="item-title">Via ladministration</span>
</a>
</li> <li class="nav-level-2">
<a href="#_via_la_cli">
<span class="item-number">5.2</span>
<span class="item-title">Via la CLI</span>
</a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#portal-startup-guide"> <a href="#portal-startup-guide">
<span class="item-number">5</span> <span class="item-number">6</span>
<span class="item-title">Guide de démarrage pour le Portail</span> <span class="item-title">Guide de démarrage pour le Portail</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_créez_la_clé_api"> <a href="#_créez_la_clé_api">
<span class="item-number">5.1</span> <span class="item-number">6.1</span>
<span class="item-title">Créez la clé API:</span> <span class="item-title">Créez la clé API:</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_configurer_les_modes_de_paiement"> <a href="#_configurer_les_modes_de_paiement">
<span class="item-number">5.2</span> <span class="item-number">6.2</span>
<span class="item-title">Configurer les modes de paiement</span> <span class="item-title">Configurer les modes de paiement</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_guide_de_démarrage_pour_shopware"> <a href="#_guide_de_démarrage_pour_shopware">
<span class="item-number">6</span> <span class="item-number">7</span>
<span class="item-title">Guide de démarrage pour Shopware</span> <span class="item-title">Guide de démarrage pour Shopware</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_différents_etats_pour_une_transaction"> <a href="#_différents_etats_pour_une_transaction">
<span class="item-number">7</span> <span class="item-number">8</span>
<span class="item-title">Différents Etats pour une Transaction</span> <span class="item-title">Différents Etats pour une Transaction</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_cartographie_des_différents_états_d_une_commande_de_shopware"> <a href="#_cartographie_des_différents_états_d_une_commande_de_shopware">
<span class="item-number">7.1</span> <span class="item-number">8.1</span>
<span class="item-title">Cartographie des différents états dune commande de Shopware</span> <span class="item-title">Cartographie des différents états dune commande de Shopware</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_remarque_générales_concernant_les_status_des_commandes"> <a href="#_remarque_générales_concernant_les_status_des_commandes">
<span class="item-number">7.1.1</span> <span class="item-number">8.1.1</span>
<span class="item-title">Remarque générales concernant les status des commandes</span> <span class="item-title">Remarque générales concernant les status des commandes</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_cartographie_des_différents_états_du_paiement_de_shopware"> <a href="#_cartographie_des_différents_états_du_paiement_de_shopware">
<span class="item-number">7.2</span> <span class="item-number">8.2</span>
<span class="item-title">Cartographie des différents états du paiement de Shopware</span> <span class="item-title">Cartographie des différents états du paiement de Shopware</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_remarques_générales_concernant_les_différents_status_pour_les_paiements"> <a href="#_remarques_générales_concernant_les_différents_status_pour_les_paiements">
<span class="item-number">7.2.1</span> <span class="item-number">8.2.1</span>
<span class="item-title">Remarques générales concernant les différents status pour les paiements</span> <span class="item-title">Remarques générales concernant les différents status pour les paiements</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_carthographie_des_différents_états_de_livraison_chez_shopware"> <a href="#_carthographie_des_différents_états_de_livraison_chez_shopware">
<span class="item-number">7.3</span> <span class="item-number">8.3</span>
<span class="item-title">Carthographie des différents états de livraison chez Shopware</span> <span class="item-title">Carthographie des différents états de livraison chez Shopware</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_gestion_des_transactions"> <a href="#_gestion_des_transactions">
<span class="item-number">8</span> <span class="item-number">9</span>
<span class="item-title">Gestion des Transactions</span> <span class="item-title">Gestion des Transactions</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_complete_capture_an_order"> <a href="#_complete_capture_an_order">
<span class="item-number">8.1</span> <span class="item-number">9.1</span>
<span class="item-title">Complete (capture) an order</span> <span class="item-title">Complete (capture) an order</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_annuler_une_transaction"> <a href="#_annuler_une_transaction">
<span class="item-number">8.2</span> <span class="item-number">9.2</span>
<span class="item-title">Annuler une transaction</span> <span class="item-title">Annuler une transaction</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_remboursement_d_une_transaction"> <a href="#_remboursement_d_une_transaction">
<span class="item-number">8.3</span> <span class="item-number">9.3</span>
<span class="item-title">Remboursement d&amp;#8217;une transaction</span> <span class="item-title">Remboursement d&amp;#8217;une transaction</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_commandes_en_attente"> <a href="#_commandes_en_attente">
<span class="item-number">8.4</span> <span class="item-number">9.4</span>
<span class="item-title">Commandes en attente</span> <span class="item-title">Commandes en attente</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_limites_de_la_synchronisation_entre_wallee_et_shopware"> <a href="#_limites_de_la_synchronisation_entre_whitelabelname_et_shopware">
<span class="item-number">8.5</span> <span class="item-number">9.5</span>
<span class="item-title">Limites de la synchronisation entre wallee et Shopware</span> <span class="item-title">Limites de la synchronisation entre VR Payment et Shopware</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_tokenisation"> <a href="#_tokenisation">
<span class="item-number">8.6</span> <span class="item-number">9.6</span>
<span class="item-title">Tokenisation</span> <span class="item-title">Tokenisation</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_paiements_récurrents"> <a href="#_paiements_récurrents">
<span class="item-number">8.7</span> <span class="item-number">9.7</span>
<span class="item-title">Paiements récurrents</span> <span class="item-title">Paiements récurrents</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_caractéristiques_pricinpales"> <a href="#_caractéristiques_pricinpales">
<span class="item-number">8.8</span> <span class="item-number">9.8</span>
<span class="item-title">Caractéristiques Pricinpales</span> <span class="item-title">Caractéristiques Pricinpales</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_troubleshooting"> <a href="#_troubleshooting">
<span class="item-number">8.9</span> <span class="item-number">9.9</span>
<span class="item-title">Troubleshooting</span> <span class="item-title">Troubleshooting</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_faqs"> <a href="#_faqs">
<span class="item-number">8.10</span> <span class="item-number">9.10</span>
<span class="item-title">FAQs</span> <span class="item-title">FAQs</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_changelog"> <a href="#_changelog">
<span class="item-number">9</span> <span class="item-number">10</span>
<span class="item-title">Changelog</span> <span class="item-title">Changelog</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_contribuer"> <a href="#_contribuer">
<span class="item-number">10</span> <span class="item-number">11</span>
<span class="item-title">Contribuer</span> <span class="item-title">Contribuer</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_support"> <a href="#_support">
<span class="item-number">11</span> <span class="item-number">12</span>
<span class="item-title">Support</span> <span class="item-title">Support</span>
</a> </a>
</li> </ul> </li> </ul>
+152 -68
View File
@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment."> <meta name="keywords" value="VR Payment, Shopware, Shopware Plugin, Payment, Payment Integration, Documentation"><meta name="description" value="The documentation for the Shopware 6 plugin that enables processing payments with VR Payment.">
<link rel="canonical" href="@WalleeCanonicalPath(https://plugin-documentation.wallee.com/wallee-payment, VRPaymentPayment/docs/it/documentation.html)" /> <link rel="canonical" href="https://plugin-documentation.wallee.com/wallee-payment/shopware-6/master/VRPaymentPayment/docs/it/documentation.html" />
<title>VR Payment Shopware 6 Documentation</title> <title>VR Payment Shopware 6 Documentation</title>
<link href="assets/monokai-sublime.css" rel="stylesheet" /> <link href="assets/monokai-sublime.css" rel="stylesheet" />
<link href="assets/base.css" rel="stylesheet" /> <link href="assets/base.css" rel="stylesheet" />
@@ -23,7 +23,7 @@
</a> </a>
</li> </li>
<li> <li>
<a href="@WalleeReleasePath()"> <a href="https://github.com/vr-payment/shopware-6/releases/tag/7.2.0/">
Source Source
</a> </a>
</li> </li>
@@ -39,7 +39,7 @@
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>Il Wallee Payment Plugin integra l&#8217;elaborazione moderna dei pagamenti in Shopware 6, offrendo funzionalità come pagamenti basati su iFrame, rimborsi, acquisizioni e conformità PCI. Supporta l&#8217;integrazione perfetta con il [Portale VR Payment](<a href="https://gateway.vr-payment.de/" class="bare">https://gateway.vr-payment.de/</a>) per la gestione delle transazioni e dei metodi di pagamento.</p> <p>Il VR Payment Plugin integra l&#8217;elaborazione moderna dei pagamenti in Shopware 6, offrendo funzionalità come pagamenti basati su iFrame, rimborsi, acquisizioni e conformità PCI. Supporta l&#8217;integrazione perfetta con il <a href="https://gateway.vr-payment.de/" target="_blank">Portale VR Payment</a> per la gestione delle transazioni e dei metodi di pagamento.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Importante: Si prega di notare che solo gli aggiornamenti Major (ad es. 6.x.0.0) e Minor (ad es. 6.0.x.0) saranno testati per la compatibilità entro 2 settimane dal rilascio.</p> <p>Importante: Si prega di notare che solo gli aggiornamenti Major (ad es. 6.x.0.0) e Minor (ad es. 6.0.x.0) saranno testati per la compatibilità entro 2 settimane dal rilascio.</p>
</div> </div> </div> </div>
@@ -54,7 +54,7 @@
</div><div class="paragraph"> </div><div class="paragraph">
<p>PHP: Versione minima richiesta dalla vostra installazione di Shopware (ad es. 7.4+).</p> <p>PHP: Versione minima richiesta dalla vostra installazione di Shopware (ad es. 7.4+).</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Account Wallee: Ottenere Space ID, User ID e API Key dal <a href="#portal-startup-guide">Pannello di Controllo Wallee.</a>.</p> <p>Account VR Payment: Ottenere Space ID, User ID e API Key dal <a href="#portal-startup-guide">Pannello di Controllo VR Payment.</a>.</p>
</div> </div> </div> </div>
</div> <div class="chapter" id="compatibility"> </div> <div class="chapter" id="compatibility">
<div class="chapter-title"> <div class="chapter-title">
@@ -125,7 +125,7 @@
</div> </div>
</li> </li>
<li> <li>
<p>Attivate il plugin Wallee Payment dal Gestore Plugin.</p> <p>Attivate il plugin VR Payment dal Gestore Plugin.</p>
</li> </li>
</ol> </ol>
</div> </div> </div> </div>
@@ -146,7 +146,7 @@
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6 <pre class="highlight"><code class="language-bash" data-lang="bash">composer require vrpayment/shopware-6
php bin/console plugin:refresh php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -171,7 +171,69 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh <pre class="highlight"><code class="language-bash" data-lang="bash">php bin/console plugin:refresh
php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></pre> php bin/console plugin:install --activate --clearCache VRPayment</code></pre>
</div>
</div>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_vrpayment_non_appare_nelle_impostazioni">
<div class="section-title">
<h2>
<span class="title-number">4.4</span>VRPayment non appare nelle impostazioni </h2>
</div>
<div class="section-body">
<div class="paragraph">
<p>Dovrebbe eseguire il seguente comando</p>
</div><div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/build-administration.sh</code></pre>
</div>
</div> </div>
</div> </div>
</div> <div class="chapter" id="_aggiornamento">
<div class="chapter-title">
<h1>
<span class="title-number">5</span>Aggiornamento </h1>
</div>
<div class="chapter-body">
<div class="section" id="_tramite_amministrazione">
<div class="section-title">
<h2>
<span class="title-number">5.1</span>Tramite Amministrazione </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Vai su Shopware Admin &gt; Estensioni &gt; Le mie estensioni.</p>
</li>
<li>
<p>Trova VRPaymentPayment.</p>
</li>
<li>
<p>Clicca su Aggiorna.</p>
</li>
</ol>
</div> </div>
</div> <div class="section" id="_tramite_cli">
<div class="section-title">
<h2>
<span class="title-number">5.2</span>Tramite CLI </h2>
</div>
<div class="section-body">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Distribuisci i nuovi file del plugin (sostituisci la cartella <code>custom/plugins/VRPaymentPayment</code> oppure carica/installa un nuovo ZIP).</p>
</li>
<li>
<p>Esegui:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">bin/console plugin:refresh
bin/console plugin:update --clearCache VRPaymentPayment
bin/console cache:clear</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -181,7 +243,7 @@ php bin/console plugin:install --activate --clearCache VRPaymentPayment</code></
</div> <div class="chapter" id="portal-startup-guide"> </div> <div class="chapter" id="portal-startup-guide">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">5</span>Guida Rapida al Portale </h1> <span class="title-number">6</span>Guida Rapida al Portale </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -200,7 +262,7 @@ Selezionate il piano di abbonamento appropriato: dovrebbe supportare le transazi
</div> <div class="section" id="_create_la_chiave_api"> </div> <div class="section" id="_create_la_chiave_api">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.1</span>Create la chiave API: </h2> <span class="title-number">6.1</span>Create la chiave API: </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -286,7 +348,7 @@ Si prega di notare che il caricamento dei ruoli potrebbe richiedere alcuni secon
</div> <div class="section" id="_configurate_i_metodi_di_pagamento"> </div> <div class="section" id="_configurate_i_metodi_di_pagamento">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">5.2</span>Configurate i Metodi di Pagamento </h2> <span class="title-number">6.2</span>Configurate i Metodi di Pagamento </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -348,7 +410,7 @@ Si prega di notare che i connettori sembrano duplicati, ma è perché uno è per
</div> <div class="chapter" id="_guida_rapida_al_shop"> </div> <div class="chapter" id="_guida_rapida_al_shop">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">6</span>Guida Rapida al Shop </h1> <span class="title-number">7</span>Guida Rapida al Shop </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="olist arabic"> <div class="olist arabic">
@@ -358,7 +420,7 @@ Si prega di notare che i connettori sembrano duplicati, ma è perché uno è per
<div class="olist loweralpha"> <div class="olist loweralpha">
<ol class="loweralpha" type="a"> <ol class="loweralpha" type="a">
<li> <li>
<p>Navigate su <strong>Shopware Admin → Impostazioni → Estensioni → VR Payment Payment</strong> e cliccate su Salva.</p> <p>Navigate su <strong>Shopware Admin → Impostazioni → Estensioni → VR Payment</strong> e cliccate su Salva.</p>
</li> </li>
<li> <li>
<p>Inserite il vostro Space ID, User ID, e API Key</p> <p>Inserite il vostro Space ID, User ID, e API Key</p>
@@ -381,7 +443,7 @@ Si prega di notare che i connettori sembrano duplicati, ma è perché uno è per
<li> <li>
<p><strong>Metodi di Pagamento</strong></p> <p><strong>Metodi di Pagamento</strong></p>
<div class="paragraph"> <div class="paragraph">
<p>I metodi di pagamento disponibili al checkout sono gestiti dal [Portale VR Payment](<a href="https://gateway.vr-payment.de/" class="bare">https://gateway.vr-payment.de/</a>). Se desiderate disabilitare un metodo di pagamento, dovrete disabilitarlo dal portale.</p> <p>I metodi di pagamento disponibili al checkout sono gestiti dal <a href="https://gateway.vr-payment.de/" target="_blank">Portale VR Payment</a>. Se desiderate disabilitare un metodo di pagamento, dovrete disabilitarlo dal portale.</p>
</div> </div>
<div class="admonitionblock note"> <div class="admonitionblock note">
<table> <table>
@@ -487,17 +549,17 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="chapter" id="_grafico_dello_stato_della_transazione"> </div> <div class="chapter" id="_grafico_dello_stato_della_transazione">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">7</span>Grafico dello Stato della Transazione </h1> <span class="title-number">8</span>Grafico dello Stato della Transazione </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
<p>Il processo di pagamento di Wallee è completamente standardizzato per ogni metodo di pagamento che potete elaborare. Questo vi dà la possibilità di aggiungere semplicemente un metodo di pagamento o un processore senza modifiche all&#8217;interno della vostra configurazione di Shopware. Una panoramica degli stati e dei processi di pagamento di Wallee è disponibile nella <a href="https://gateway.vr-payment.de/en-us/doc/payment/transaction-process" target="_blank">Documentazione sui Pagamenti</a>.</p> <p>Il processo di pagamento di VR Payment è completamente standardizzato per ogni metodo di pagamento che potete elaborare. Questo vi dà la possibilità di aggiungere semplicemente un metodo di pagamento o un processore senza modifiche all&#8217;interno della vostra configurazione di Shopware. Una panoramica degli stati e dei processi di pagamento di VR Payment è disponibile nella <a href="https://gateway.vr-payment.de/en-us/doc/payment/transaction-process" target="_blank">Documentazione sui Pagamenti</a>.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Nella sezione seguente, forniamo una panoramica di come gli stati di Wallee sono mappati nel grafico degli stati di Shopware per gli ordini e gli stati di pagamento.</p> <p>Nella sezione seguente, forniamo una panoramica di come gli stati di VR Payment sono mappati nel grafico degli stati di Shopware per gli ordini e gli stati di pagamento.</p>
</div> <div class="section" id="_mappatura_degli_stati_degli_ordini_di_shopware"> </div> <div class="section" id="_mappatura_degli_stati_degli_ordini_di_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.1</span>Mappatura degli Stati degli Ordini di Shopware </h2> <span class="title-number">8.1</span>Mappatura degli Stati degli Ordini di Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -505,7 +567,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="section" id="_osservazioni_generali_riguardo_agli_stati_degli_ordini"> </div> <div class="section" id="_osservazioni_generali_riguardo_agli_stati_degli_ordini">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.1.1</span>Osservazioni Generali Riguardo agli Stati degli Ordini </h3> <span class="title-number">8.1.1</span>Osservazioni Generali Riguardo agli Stati degli Ordini </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -515,7 +577,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="section" id="_mappatura_dello_stato_di_pagamento_di_shopware"> </div> <div class="section" id="_mappatura_dello_stato_di_pagamento_di_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.2</span>Mappatura dello Stato di Pagamento di Shopware </h2> <span class="title-number">8.2</span>Mappatura dello Stato di Pagamento di Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -542,7 +604,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="section" id="_osservazioni_generali_riguardo_agli_stati_di_pagamento"> </div> <div class="section" id="_osservazioni_generali_riguardo_agli_stati_di_pagamento">
<div class="section-title"> <div class="section-title">
<h3> <h3>
<span class="title-number">7.2.1</span>Osservazioni Generali Riguardo agli Stati di Pagamento </h3> <span class="title-number">8.2.1</span>Osservazioni Generali Riguardo agli Stati di Pagamento </h3>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -552,7 +614,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="section" id="_mappatura_dello_stato_di_spedizione_di_shopware"> </div> <div class="section" id="_mappatura_dello_stato_di_spedizione_di_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">7.3</span>Mappatura dello Stato di Spedizione di Shopware </h2> <span class="title-number">8.3</span>Mappatura dello Stato di Spedizione di Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -578,7 +640,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="chapter" id="_gestione_delle_transazioni"> </div> <div class="chapter" id="_gestione_delle_transazioni">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">8</span>Gestione delle Transazioni </h1> <span class="title-number">9</span>Gestione delle Transazioni </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -586,7 +648,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
</div> <div class="section" id="_completare_acquisire_un_ordine"> </div> <div class="section" id="_completare_acquisire_un_ordine">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.1</span>Completare (Acquisire) un Ordine </h2> <span class="title-number">9.1</span>Completare (Acquisire) un Ordine </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -600,7 +662,7 @@ Si prega di notare che se non utilizzate lo Space View Id, questa opzione dovreb
<div class="title">Note</div> <div class="title">Note</div>
</td> </td>
<td class="content"> <td class="content">
Quando il completamento è in sospeso in Wallee, l&#8217;ordine rimarrà nello stato "in sospeso". Quando il completamento è in sospeso in VR Payment, l&#8217;ordine rimarrà nello stato "in sospeso".
</td> </td>
</tr> </tr>
</table> </table>
@@ -618,7 +680,7 @@ Quando il completamento è in sospeso in Wallee, l&#8217;ordine rimarrà nello s
</div> <div class="section" id="_annullare_una_transazione"> </div> <div class="section" id="_annullare_una_transazione">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.2</span>Annullare una transazione </h2> <span class="title-number">9.2</span>Annullare una transazione </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -642,7 +704,7 @@ Puoi annullare solo le transazioni che non sono ancora state completate
</div> <div class="section" id="_rimborso_di_una_transazione"> </div> <div class="section" id="_rimborso_di_una_transazione">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.3</span>Rimborso di una Transazione </h2> <span class="title-number">9.3</span>Rimborso di una Transazione </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -668,11 +730,11 @@ Potrebbe volerci un po' di tempo prima che vediate il rimborso in Shopware. I ri
</div> <div class="section" id="_ordini_in_attesa"> </div> <div class="section" id="_ordini_in_attesa">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.4</span>Ordini in Attesa </h2> <span class="title-number">9.4</span>Ordini in Attesa </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
<p>La spedizione non dovrebbe essere effettuata mentre lo stato di spedizione è Hold. Questo accade quando la transazione in Wallee non ha raggiunto lo stato di evasione.</p> <p>La spedizione non dovrebbe essere effettuata mentre lo stato di spedizione è Hold. Questo accade quando la transazione in VR Payment non ha raggiunto lo stato di evasione.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Ci sono essenzialmente due motivi per cui questo può accadere:</p> <p>Ci sono essenzialmente due motivi per cui questo può accadere:</p>
</div><div class="ulist"> </div><div class="ulist">
@@ -681,27 +743,27 @@ Potrebbe volerci un po' di tempo prima che vediate il rimborso in Shopware. I ri
<p>La transazione non è completata. In questo caso, dovete completare la transazione come scritto sopra.</p> <p>La transazione non è completata. In questo caso, dovete completare la transazione come scritto sopra.</p>
</li> </li>
<li> <li>
<p>Non siamo in grado di dire se dovete evadere l&#8217;ordine. La decisione di spedizione viene presa automaticamente. Se ciò non accade entro il periodo di tempo definito, Wallee genererà un&#8217;attività manuale che dovreste osservare e seguire le istruzioni.</p> <p>Non siamo in grado di dire se dovete evadere l&#8217;ordine. La decisione di spedizione viene presa automaticamente. Se ciò non accade entro il periodo di tempo definito, VR Payment genererà un&#8217;attività manuale che dovreste osservare e seguire le istruzioni.</p>
</li> </li>
</ul> </ul>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Potete trovare maggiori informazioni sulle attività manuali nella nostra <a href="https://gateway.vr-payment.de/en-us/doc/manual-tasks" target="_blank">Documentazione sulle Attività Manuali.</a>.</p> <p>Potete trovare maggiori informazioni sulle attività manuali nella nostra <a href="https://gateway.vr-payment.de/en-us/doc/manual-tasks" target="_blank">Documentazione sulle Attività Manuali.</a>.</p>
</div> </div> </div> </div>
</div> <div class="section" id="_limitazioni_della_sincronizzazione_tra_wallee_e_shopware"> </div> <div class="section" id="_limitazioni_della_sincronizzazione_tra_whitelabelname_e_shopware">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.5</span>Limitazioni della Sincronizzazione tra Wallee e Shopware </h2> <span class="title-number">9.5</span>Limitazioni della Sincronizzazione tra VR Payment e Shopware </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
<p>Si prega di notare che le acquisizioni, le annullazioni e i rimborsi effettuati in Wallee vengono sincronizzati. Tuttavia, ci sono alcune limitazioni. All&#8217;interno di Wallee, potete modificare contemporaneamente <strong>il prezzo unitario</strong> e <strong>la quantità</strong>. Questo non può essere fatto nel backend di Shopware. Raccomandiamo pertanto di effettuare sempre i rimborsi all&#8217;interno del backend di Shopware e non all&#8217;interno di Wallee. Se un rimborso non può essere sincronizzato, verrà inviato al processore, ma potrebbe essere che non lo vediate all&#8217;interno del vostro backend di Shopware.</p> <p>Si prega di notare che le acquisizioni, le annullazioni e i rimborsi effettuati in VR Payment vengono sincronizzati. Tuttavia, ci sono alcune limitazioni. All&#8217;interno di VR Payment, potete modificare contemporaneamente <strong>il prezzo unitario</strong> e <strong>la quantità</strong>. Questo non può essere fatto nel backend di Shopware. Raccomandiamo pertanto di effettuare sempre i rimborsi all&#8217;interno del backend di Shopware e non all&#8217;interno di VR Payment. Se un rimborso non può essere sincronizzato, verrà inviato al processore, ma potrebbe essere che non lo vediate all&#8217;interno del vostro backend di Shopware.</p>
</div><div class="paragraph"> </div><div class="paragraph">
<p>Potete trovare maggiori informazioni sui Rimborsi in Wallee nella nostra <a href="https://gateway.vr-payment.de/en-us/doc/payment/refund" target="_blank">Documentazione sui Rimborsi.</a>.</p> <p>Potete trovare maggiori informazioni sui Rimborsi in VR Payment nella nostra <a href="https://gateway.vr-payment.de/en-us/doc/payment/refund" target="_blank">Documentazione sui Rimborsi.</a>.</p>
</div> </div> </div> </div>
</div> <div class="section" id="_tokenization"> </div> <div class="section" id="_tokenization">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.6</span>Tokenization </h2> <span class="title-number">9.6</span>Tokenization </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -721,7 +783,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="section" id="_pagamenti_ricorrenti"> </div> <div class="section" id="_pagamenti_ricorrenti">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.7</span>Pagamenti ricorrenti </h2> <span class="title-number">9.7</span>Pagamenti ricorrenti </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -730,7 +792,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="section" id="_key_features"> </div> <div class="section" id="_key_features">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.8</span>Key Features </h2> <span class="title-number">9.8</span>Key Features </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -755,7 +817,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="section" id="_risoluzione_dei_problemi"> </div> <div class="section" id="_risoluzione_dei_problemi">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.9</span>Risoluzione dei Problemi </h2> <span class="title-number">9.9</span>Risoluzione dei Problemi </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="ulist"> <div class="ulist">
@@ -764,7 +826,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
<p>Logs: Controlla i log dei pagamenti con:</p> <p>Logs: Controlla i log dei pagamenti con:</p>
<div class="listingblock"> <div class="listingblock">
<div class="content"> <div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname_payment*.log</code></pre> <pre class="highlight"><code class="language-bash" data-lang="bash">tail -f var/log/whitelabelname*.log</code></pre>
</div> </div>
</div> </div>
</li> </li>
@@ -786,7 +848,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="section" id="_faqs"> </div> <div class="section" id="_faqs">
<div class="section-title"> <div class="section-title">
<h2> <h2>
<span class="title-number">8.10</span>FAQs </h2> <span class="title-number">9.10</span>FAQs </h2>
</div> </div>
<div class="section-body"> <div class="section-body">
<div class="paragraph"> <div class="paragraph">
@@ -818,7 +880,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="chapter" id="_changelog"> </div> <div class="chapter" id="_changelog">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">9</span>Changelog </h1> <span class="title-number">10</span>Changelog </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -827,7 +889,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="chapter" id="_contribuzione"> </div> <div class="chapter" id="_contribuzione">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">10</span>Contribuzione </h1> <span class="title-number">11</span>Contribuzione </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -838,7 +900,7 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
</div> <div class="chapter" id="_support"> </div> <div class="chapter" id="_support">
<div class="chapter-title"> <div class="chapter-title">
<h1> <h1>
<span class="title-number">11</span>Support </h1> <span class="title-number">12</span>Support </h1>
</div> </div>
<div class="chapter-body"> <div class="chapter-body">
<div class="paragraph"> <div class="paragraph">
@@ -887,135 +949,157 @@ La tokenizzazione non è disponibile per i checkout degli ospiti.
<span class="item-number">4.3</span> <span class="item-number">4.3</span>
<span class="item-title">Installazione manuale</span> <span class="item-title">Installazione manuale</span>
</a> </a>
</li> <li class="nav-level-2">
<a href="#_vrpayment_non_appare_nelle_impostazioni">
<span class="item-number">4.4</span>
<span class="item-title">VRPayment non appare nelle impostazioni</span>
</a>
</li> </ul>
</li> <li class="nav-level-1">
<a href="#_aggiornamento">
<span class="item-number">5</span>
<span class="item-title">Aggiornamento</span>
</a>
<ul class="nav">
<li class="nav-level-2">
<a href="#_tramite_amministrazione">
<span class="item-number">5.1</span>
<span class="item-title">Tramite Amministrazione</span>
</a>
</li> <li class="nav-level-2">
<a href="#_tramite_cli">
<span class="item-number">5.2</span>
<span class="item-title">Tramite CLI</span>
</a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#portal-startup-guide"> <a href="#portal-startup-guide">
<span class="item-number">5</span> <span class="item-number">6</span>
<span class="item-title">Guida Rapida al Portale</span> <span class="item-title">Guida Rapida al Portale</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_create_la_chiave_api"> <a href="#_create_la_chiave_api">
<span class="item-number">5.1</span> <span class="item-number">6.1</span>
<span class="item-title">Create la chiave API:</span> <span class="item-title">Create la chiave API:</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_configurate_i_metodi_di_pagamento"> <a href="#_configurate_i_metodi_di_pagamento">
<span class="item-number">5.2</span> <span class="item-number">6.2</span>
<span class="item-title">Configurate i Metodi di Pagamento</span> <span class="item-title">Configurate i Metodi di Pagamento</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_guida_rapida_al_shop"> <a href="#_guida_rapida_al_shop">
<span class="item-number">6</span> <span class="item-number">7</span>
<span class="item-title">Guida Rapida al Shop</span> <span class="item-title">Guida Rapida al Shop</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_grafico_dello_stato_della_transazione"> <a href="#_grafico_dello_stato_della_transazione">
<span class="item-number">7</span> <span class="item-number">8</span>
<span class="item-title">Grafico dello Stato della Transazione</span> <span class="item-title">Grafico dello Stato della Transazione</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_mappatura_degli_stati_degli_ordini_di_shopware"> <a href="#_mappatura_degli_stati_degli_ordini_di_shopware">
<span class="item-number">7.1</span> <span class="item-number">8.1</span>
<span class="item-title">Mappatura degli Stati degli Ordini di Shopware</span> <span class="item-title">Mappatura degli Stati degli Ordini di Shopware</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_osservazioni_generali_riguardo_agli_stati_degli_ordini"> <a href="#_osservazioni_generali_riguardo_agli_stati_degli_ordini">
<span class="item-number">7.1.1</span> <span class="item-number">8.1.1</span>
<span class="item-title">Osservazioni Generali Riguardo agli Stati degli Ordini</span> <span class="item-title">Osservazioni Generali Riguardo agli Stati degli Ordini</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_mappatura_dello_stato_di_pagamento_di_shopware"> <a href="#_mappatura_dello_stato_di_pagamento_di_shopware">
<span class="item-number">7.2</span> <span class="item-number">8.2</span>
<span class="item-title">Mappatura dello Stato di Pagamento di Shopware</span> <span class="item-title">Mappatura dello Stato di Pagamento di Shopware</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-3"> <li class="nav-level-3">
<a href="#_osservazioni_generali_riguardo_agli_stati_di_pagamento"> <a href="#_osservazioni_generali_riguardo_agli_stati_di_pagamento">
<span class="item-number">7.2.1</span> <span class="item-number">8.2.1</span>
<span class="item-title">Osservazioni Generali Riguardo agli Stati di Pagamento</span> <span class="item-title">Osservazioni Generali Riguardo agli Stati di Pagamento</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_mappatura_dello_stato_di_spedizione_di_shopware"> <a href="#_mappatura_dello_stato_di_spedizione_di_shopware">
<span class="item-number">7.3</span> <span class="item-number">8.3</span>
<span class="item-title">Mappatura dello Stato di Spedizione di Shopware</span> <span class="item-title">Mappatura dello Stato di Spedizione di Shopware</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_gestione_delle_transazioni"> <a href="#_gestione_delle_transazioni">
<span class="item-number">8</span> <span class="item-number">9</span>
<span class="item-title">Gestione delle Transazioni</span> <span class="item-title">Gestione delle Transazioni</span>
</a> </a>
<ul class="nav"> <ul class="nav">
<li class="nav-level-2"> <li class="nav-level-2">
<a href="#_completare_acquisire_un_ordine"> <a href="#_completare_acquisire_un_ordine">
<span class="item-number">8.1</span> <span class="item-number">9.1</span>
<span class="item-title">Completare (Acquisire) un Ordine</span> <span class="item-title">Completare (Acquisire) un Ordine</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_annullare_una_transazione"> <a href="#_annullare_una_transazione">
<span class="item-number">8.2</span> <span class="item-number">9.2</span>
<span class="item-title">Annullare una transazione</span> <span class="item-title">Annullare una transazione</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_rimborso_di_una_transazione"> <a href="#_rimborso_di_una_transazione">
<span class="item-number">8.3</span> <span class="item-number">9.3</span>
<span class="item-title">Rimborso di una Transazione</span> <span class="item-title">Rimborso di una Transazione</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_ordini_in_attesa"> <a href="#_ordini_in_attesa">
<span class="item-number">8.4</span> <span class="item-number">9.4</span>
<span class="item-title">Ordini in Attesa</span> <span class="item-title">Ordini in Attesa</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_limitazioni_della_sincronizzazione_tra_wallee_e_shopware"> <a href="#_limitazioni_della_sincronizzazione_tra_whitelabelname_e_shopware">
<span class="item-number">8.5</span> <span class="item-number">9.5</span>
<span class="item-title">Limitazioni della Sincronizzazione tra Wallee e Shopware</span> <span class="item-title">Limitazioni della Sincronizzazione tra VR Payment e Shopware</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_tokenization"> <a href="#_tokenization">
<span class="item-number">8.6</span> <span class="item-number">9.6</span>
<span class="item-title">Tokenization</span> <span class="item-title">Tokenization</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_pagamenti_ricorrenti"> <a href="#_pagamenti_ricorrenti">
<span class="item-number">8.7</span> <span class="item-number">9.7</span>
<span class="item-title">Pagamenti ricorrenti</span> <span class="item-title">Pagamenti ricorrenti</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_key_features"> <a href="#_key_features">
<span class="item-number">8.8</span> <span class="item-number">9.8</span>
<span class="item-title">Key Features</span> <span class="item-title">Key Features</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_risoluzione_dei_problemi"> <a href="#_risoluzione_dei_problemi">
<span class="item-number">8.9</span> <span class="item-number">9.9</span>
<span class="item-title">Risoluzione dei Problemi</span> <span class="item-title">Risoluzione dei Problemi</span>
</a> </a>
</li> <li class="nav-level-2"> </li> <li class="nav-level-2">
<a href="#_faqs"> <a href="#_faqs">
<span class="item-number">8.10</span> <span class="item-number">9.10</span>
<span class="item-title">FAQs</span> <span class="item-title">FAQs</span>
</a> </a>
</li> </ul> </li> </ul>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_changelog"> <a href="#_changelog">
<span class="item-number">9</span> <span class="item-number">10</span>
<span class="item-title">Changelog</span> <span class="item-title">Changelog</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_contribuzione"> <a href="#_contribuzione">
<span class="item-number">10</span> <span class="item-number">11</span>
<span class="item-title">Contribuzione</span> <span class="item-title">Contribuzione</span>
</a> </a>
</li> <li class="nav-level-1"> </li> <li class="nav-level-1">
<a href="#_support"> <a href="#_support">
<span class="item-number">11</span> <span class="item-number">12</span>
<span class="item-title">Support</span> <span class="item-title">Support</span>
</a> </a>
</li> </ul> </li> </ul>
@@ -251,9 +251,9 @@ class PaymentMethodConfigurationService {
{ {
$data = []; $data = [];
$paymentMethodData = []; $paymentMethodData = [];
$salesChannelPaymentMethodData = [];
$criteria = (new Criteria())->addFilter(new EqualsFilter('state', 'ACTIVE')); $criteria = (new Criteria())->addFilter(new EqualsFilter('state', 'ACTIVE'))
->addFilter(new EqualsFilter('spaceId', $this->getSpaceId()));
/** /**
* @var $vRPaymentPMConfigurationRepository * @var $vRPaymentPMConfigurationRepository
@@ -344,40 +344,67 @@ class PaymentMethodConfigurationService {
$paymentMethodConfigurations = $this->getPaymentMethodConfigurations(); $paymentMethodConfigurations = $this->getPaymentMethodConfigurations();
$this->logger->debug('Updating payment methods', $paymentMethodConfigurations); $this->logger->debug('Updating payment methods', $paymentMethodConfigurations);
/**
* @var $paymentMethodConfiguration \VRPayment\Sdk\Model\PaymentMethodConfiguration
*/
foreach ($paymentMethodConfigurations as $paymentMethodConfiguration) { foreach ($paymentMethodConfigurations as $paymentMethodConfiguration) {
$entity = $this->getPaymentMethodConfigurationEntity(
$paymentMethodConfigurationEntity = $this->getPaymentMethodConfigurationEntity( $paymentMethodConfiguration->getSpaceId(),
$paymentMethodConfiguration->getSpaceId(), $paymentMethodConfiguration->getId(),
$paymentMethodConfiguration->getId(), $context
$context
); );
$id = is_null($paymentMethodConfigurationEntity) ? Uuid::randomHex() : $paymentMethodConfigurationEntity->getId(); $configId = $entity ? $entity->getId() : Uuid::randomHex();
$technicalName = $paymentMethodConfiguration->getName();
$paymentMethodId = $this->getOrCreatePaymentMethodId(
$technicalName,
VRPaymentPaymentHandler::class,
$context
);
$data = [ $data = [
'id' => $id, 'id' => $configId,
'paymentMethodConfigurationId' => $paymentMethodConfiguration->getId(), 'paymentMethodConfigurationId' => $paymentMethodConfiguration->getId(),
'paymentMethodId' => $id, 'paymentMethodId' => $paymentMethodId,
'data' => json_decode(strval($paymentMethodConfiguration), true), 'data' => json_decode(strval($paymentMethodConfiguration), true),
'sortOrder' => $paymentMethodConfiguration->getSortOrder(), 'sortOrder' => $paymentMethodConfiguration->getSortOrder(),
'spaceId' => $paymentMethodConfiguration->getSpaceId(), 'spaceId' => $paymentMethodConfiguration->getSpaceId(),
'state' => CreationEntityState::ACTIVE, 'state' => CreationEntityState::ACTIVE,
]; ];
$this->upsertPaymentMethod($id, $paymentMethodConfiguration, $context); try {
$this->upsertPaymentMethod($paymentMethodId, $paymentMethodConfiguration, $context);
try { $this->container
$this->container->get(PaymentMethodConfigurationEntityDefinition::ENTITY_NAME . '.repository')->upsert([$data], $context); ->get(PaymentMethodConfigurationEntityDefinition::ENTITY_NAME . '.repository')
} catch (\Exception $e) { ->upsert([$data], $context);
$this->logger->error($e->getMessage(), [$e->getTraceAsString()]); } catch (\Exception $e) {
} $this->logger->error($e->getMessage(), [$e->getTraceAsString()]);
}
} }
} }
private function getOrCreatePaymentMethodId(string $technicalName, string $handlerIdentifier, Context $context): string
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('technicalName', $technicalName));
$criteria->setLimit(1);
$existing = $this->paymentMethodRepository->search($criteria, $context)->first();
if ($existing !== null) {
return $existing->getId();
}
$paymentMethodId = Uuid::randomHex();
$this->paymentMethodRepository->upsert([[
'id' => $paymentMethodId,
'handlerIdentifier' => $handlerIdentifier,
'technicalName' => $technicalName,
'name' => $technicalName,
'active' => false,
]], $context);
return $paymentMethodId;
}
/** /**
* Fetch active merchant payment methods from VRPayment API * Fetch active merchant payment methods from VRPayment API
* *
@@ -467,53 +494,6 @@ class PaymentMethodConfigurationService {
return $configurations->getElements(); return $configurations->getElements();
} }
/**
* Update or insert Payment Method
*
* @param string $id
* @param \VRPayment\Sdk\Model\PaymentMethodConfiguration $paymentMethodConfiguration
* @param \Shopware\Core\Framework\Context $context
*
* @throws \VRPayment\Sdk\ApiException
* @throws \VRPayment\Sdk\Http\ConnectionException
* @throws \VRPayment\Sdk\VersioningException
*/
protected function upsertPaymentMethod(
string $id,
PaymentMethodConfiguration $paymentMethodConfiguration,
Context $context
): void
{
/** @var PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(
VRPaymentPayment::class,
$context
);
$data = [
'id' => $id,
'handlerIdentifier' => VRPaymentPaymentHandler::class,
'pluginId' => $pluginId,
'position' => $paymentMethodConfiguration->getSortOrder() - 100,
'afterOrderEnabled' => true,
'active' => true,
'translations' => $this->getPaymentMethodConfigurationTranslation($paymentMethodConfiguration, $context),
'technicalName' => $paymentMethodConfiguration->getName(),
];
$data['mediaId'] = $this->upsertMedia($id, $paymentMethodConfiguration, $context);
$data = array_filter($data);
try {
$this->paymentMethodRepository->upsert([$data], $context);
} catch (\Exception $e) {
$this->logger->error($e->getMessage(), [$e->getTraceAsString()]);
}
}
/** /**
* @param \VRPayment\Sdk\Model\PaymentMethodConfiguration $paymentMethodConfiguration * @param \VRPayment\Sdk\Model\PaymentMethodConfiguration $paymentMethodConfiguration
* @param \Shopware\Core\Framework\Context $context * @param \Shopware\Core\Framework\Context $context
@@ -605,54 +585,102 @@ class PaymentMethodConfigurationService {
} }
/** /**
* Upload Payment Method icons * Update or insert Payment Method
* */
* @param string $id protected function upsertPaymentMethod(
* @param \VRPayment\Sdk\Model\PaymentMethodConfiguration $paymentMethodConfiguration string $id,
* @param \Shopware\Core\Framework\Context $context PaymentMethodConfiguration $paymentMethodConfiguration,
* Context $context
* @return string|null ): void {
/** @var PluginIdProvider $pluginIdProvider */
$pluginIdProvider = $this->container->get(PluginIdProvider::class);
$pluginId = $pluginIdProvider->getPluginIdByBaseClass(
VRPaymentPayment::class,
$context
);
$data = [
'id' => $id,
'handlerIdentifier' => VRPaymentPaymentHandler::class,
'pluginId' => $pluginId,
'position' => $paymentMethodConfiguration->getSortOrder() - 100,
'afterOrderEnabled' => true,
'active' => true,
'translations' => $this->getPaymentMethodConfigurationTranslation($paymentMethodConfiguration, $context),
'technicalName' => $paymentMethodConfiguration->getName(),
];
$mediaId = $this->upsertMedia($id, $paymentMethodConfiguration, $context);
if ($mediaId) {
$data['mediaId'] = $mediaId;
}
try {
$this->paymentMethodRepository->upsert([$data], $context);
} catch (\Exception $e) {
$this->logger->error($e->getMessage(), [$e->getTraceAsString()]);
}
}
/**
* Upload or update Payment Method icons
*/ */
protected function upsertMedia(string $id, PaymentMethodConfiguration $paymentMethodConfiguration, Context $context): ?string protected function upsertMedia(string $id, PaymentMethodConfiguration $paymentMethodConfiguration, Context $context): ?string
{ {
try { try {
$existingRecord = $this->getMediaDefaultFolderForPaymentMethod($paymentMethodConfiguration, $context); $folderKey = 'payment_method_' . $paymentMethodConfiguration->getId();
if ($existingRecord->count() > 0) { // Check existing default folder
$id = $existingRecord->first()->getId(); $criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('entity', $folderKey));
$existingFolder = $this->mediaDefaultFolderRepository->search($criteria, $context);
$folderId = $id;
if ($existingFolder->count() > 0) {
$folderId = $existingFolder->first()->getId();
} }
// Ensure default folder
$this->mediaDefaultFolderRepository->upsert([ $this->mediaDefaultFolderRepository->upsert([
[ [
'id' => $id, 'id' => $folderId,
'associationFields' => [], 'associationFields' => [],
'entity' => 'payment_method_' . $paymentMethodConfiguration->getId(), 'entity' => $folderKey,
], ],
], $context); ], $context);
// Ensure media folder
$this->mediaFolderRepository->upsert([ $this->mediaFolderRepository->upsert([
[ [
'id' => $id, 'id' => $folderId,
'defaultFolderId' => $id, 'defaultFolderId' => $folderId,
'name' => $paymentMethodConfiguration->getName(), 'name' => $paymentMethodConfiguration->getName(),
'useParentConfiguration' => false, 'useParentConfiguration' => false,
'configuration' => [], 'configuration' => [],
], ],
], $context); ], $context);
/** // Media insert/update
* @var \Shopware\Core\Content\Media\MediaDefinition
*/ // detect if collision, return existing id
$existingId = $this->checkMediaAlreadyExists($paymentMethodConfiguration->getResolvedImageUrl(), $context);
if ($existingId) {
return $existingId;
}
$mediaDefinition = $this->container->get(MediaDefinition::class); $mediaDefinition = $this->container->get(MediaDefinition::class);
$this->mediaSerializer->setRegistry($this->serializerRegistry); $this->mediaSerializer->setRegistry($this->serializerRegistry);
$data = [ $data = [
'id' => $id, 'id' => $id,
'title' => $paymentMethodConfiguration->getName(), 'title' => $paymentMethodConfiguration->getName(),
'url' => $paymentMethodConfiguration->getResolvedImageUrl(), 'url' => $paymentMethodConfiguration->getResolvedImageUrl(),
'mediaFolderId' => $id, 'mediaFolderId' => $folderId,
]; ];
$data = $this->mediaSerializer->deserialize(new Config([], [], []), $mediaDefinition, $data); $data = $this->mediaSerializer->deserialize(new Config([], [], []), $mediaDefinition, $data);
$this->mediaRepository->upsert([$data], $context); $this->mediaRepository->upsert([$data], $context);
return $id; return $id;
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->critical($e->getMessage(), [$e->getTraceAsString()]); $this->logger->critical($e->getMessage(), [$e->getTraceAsString()]);
@@ -660,6 +688,22 @@ class PaymentMethodConfigurationService {
} }
} }
private function checkMediaAlreadyExists($paymentMethodUrl, $context) {
// detect if collision, return existing id
if (preg_match('#/([^/]+)\.[^/.]+$#', $paymentMethodUrl, $matches)) {
$filename = $matches[1];
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('fileName', $filename));
$existing = $this->mediaRepository->search($criteria, $context)->first();
if ($existing) {
return $existing->getId();
}
return false;
}
/** /**
* Retrieves media default folder for a given payment method configuration. * Retrieves media default folder for a given payment method configuration.
* *
@@ -13,6 +13,7 @@ use Symfony\Component\{
}; };
use VRPaymentPayment\Core\{ use VRPaymentPayment\Core\{
Api\Refund\Service\RefundService, Api\Refund\Service\RefundService,
Api\Transaction\Service\TransactionService,
Settings\Service\SettingsService Settings\Service\SettingsService
}; };
@@ -41,16 +42,23 @@ class RefundController extends AbstractController
*/ */
protected $logger; protected $logger;
/**
* @var \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService
*/
protected $transactionService;
/** /**
* RefundController constructor. * RefundController constructor.
* *
* @param \VRPaymentPayment\Core\Api\Refund\Service\RefundService $refundService * @param \VRPaymentPayment\Core\Api\Refund\Service\RefundService $refundService
* @param \VRPaymentPayment\Core\Settings\Service\SettingsService $settingsService * @param \VRPaymentPayment\Core\Settings\Service\SettingsService $settingsService
* @param \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService $transactionService
*/ */
public function __construct(RefundService $refundService, SettingsService $settingsService) public function __construct(RefundService $refundService, SettingsService $settingsService, TransactionService $transactionService)
{ {
$this->settingsService = $settingsService; $this->settingsService = $settingsService;
$this->refundService = $refundService; $this->refundService = $refundService;
$this->transactionService = $transactionService;
} }
/** /**
@@ -82,11 +90,23 @@ class RefundController extends AbstractController
$quantity = (int)$request->request->get('quantity'); $quantity = (int)$request->request->get('quantity');
$lineItemId = $request->request->get('lineItemId'); $lineItemId = $request->request->get('lineItemId');
if ($quantity === null || $quantity <= 0) {
return new Response('refundQuantityZero', Response::HTTP_BAD_REQUEST);
}
$settings = $this->settingsService->getSettings($salesChannelId); $settings = $this->settingsService->getSettings($salesChannelId);
$apiClient = $settings->getApiClient(); $apiClient = $settings->getApiClient();
$transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId); $transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId);
$maxQuantity = $this->refundService->getMaxRefundableQuantity($transaction, $context, $lineItemId);
if ($quantity > $maxQuantity) {
return new Response('refundExceedsQuantity', Response::HTTP_BAD_REQUEST);
}
$refund = $this->refundService->create($transaction, $context, $lineItemId, $quantity); $refund = $this->refundService->create($transaction, $context, $lineItemId, $quantity);
if ($refund === null) { if ($refund === null) {
return new Response('Refund was not created. Please check the refund amound or if the item was not refunded before', Response::HTTP_BAD_REQUEST); return new Response('Refund was not created. Please check the refund amound or if the item was not refunded before', Response::HTTP_BAD_REQUEST);
} }
@@ -111,14 +131,27 @@ class RefundController extends AbstractController
$transactionId = $request->request->get('transactionId'); $transactionId = $request->request->get('transactionId');
$refundableAmount = $request->request->get('refundableAmount'); $refundableAmount = $request->request->get('refundableAmount');
if ($refundableAmount === null || $refundableAmount <= 0.0) {
return new Response('refundAmountZero', Response::HTTP_BAD_REQUEST);
}
$settings = $this->settingsService->getSettings($salesChannelId); $settings = $this->settingsService->getSettings($salesChannelId);
$apiClient = $settings->getApiClient(); $apiClient = $settings->getApiClient();
$transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId); $transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId);
$completed = (float) $transaction->getCompletedAmount();
$refunded = (float) $transaction->getRefundedAmount();
$maxRefund = round($completed - $refunded, 2);
if ($refundableAmount > $maxRefund) {
return new Response('refundExceedsAmount', Response::HTTP_BAD_REQUEST);
}
$refund = $this->refundService->createRefundByAmount($transaction, $refundableAmount, $context); $refund = $this->refundService->createRefundByAmount($transaction, $refundableAmount, $context);
if ($refund === null) { if ($refund === null) {
return new Response('refundExceedsAmount', Response::HTTP_BAD_REQUEST); return new Response('refundExceedsAmount', Response::HTTP_BAD_REQUEST);
} }
return new Response(null, Response::HTTP_NO_CONTENT); return new Response(null, Response::HTTP_NO_CONTENT);
+68 -1
View File
@@ -12,7 +12,11 @@ use Shopware\Core\{
}; };
use VRPayment\Sdk\{ use VRPayment\Sdk\{
Model\Refund, Model\Refund,
Model\Transaction Model\Transaction,
Model\CriteriaOperator,
Model\EntityQueryFilter,
Model\EntityQueryFilterType,
Model\EntityQuery,
}; };
use VRPaymentPayment\Core\{ use VRPaymentPayment\Core\{
Api\Refund\Entity\RefundEntity, Api\Refund\Entity\RefundEntity,
@@ -241,4 +245,67 @@ class RefundService
->first(); ->first();
} }
/**
* Get total refunded quantity for transaction's line item by lineItemId.
*
* @param \VRPayment\Sdk\Model\Transaction $transaction
* @param \Shopware\Core\Framework\Context $context
* @param string $lineItemId
*
* @return int
*/
public function getRefundedQuantity(Transaction $transaction, Context $context, string $lineItemId): int {
$transactionEntity = $this->getTransactionEntityByTransactionId($transaction->getId(), $context);
$settings = $this->settingsService->getSettings($transactionEntity->getSalesChannel()->getId());
$apiClient = $settings->getApiClient();
$entityQueryFilter = (new EntityQueryFilter())
->setType(EntityQueryFilterType::LEAF)
->setOperator(CriteriaOperator::EQUALS)
->setFieldName('transaction.id')
->setValue($transaction->getId());
$query = (new EntityQuery())->setFilter($entityQueryFilter);
$refunds = $apiClient->getRefundService()->search($settings->getSpaceId(), $query);
$refundedQuantity = 0;
foreach ($refunds as $refund) {
foreach ($refund->getReductions() as $reduction) {
if ($reduction->getLineItemUniqueId() === $lineItemId) {
$refundedQuantity += (int) $reduction->getQuantityReduction();
}
}
}
return $refundedQuantity;
}
/**
* Get maximum quantity of available items to refund for line item.
*
* @param \VRPayment\Sdk\Model\Transaction $transaction
* @param \Shopware\Core\Framework\Context $context
* @param string $lineItemId
*
* @return int
*/
public function getMaxRefundableQuantity(Transaction $transaction, Context $context, string $lineItemId): int {
$originalQuantity = 0;
foreach ($transaction->getLineItems() as $lineItem) {
if ($lineItem->getUniqueId() === $lineItemId) {
$originalQuantity = (int) $lineItem->getQuantity();
break;
}
}
$refundedQuantity = $this->getRefundedQuantity($transaction, $context, $lineItemId);
$maxQuantity = $originalQuantity - $refundedQuantity;
return $maxQuantity;
}
} }
@@ -32,7 +32,7 @@ use VRPaymentPayment\Core\Api\Refund\Entity\RefundEntityDefinition;
*/ */
class TransactionEntityDefinition extends EntityDefinition { class TransactionEntityDefinition extends EntityDefinition {
public const ENTITY_NAME = 'vrpayment_transaction'; public const ENTITY_NAME = 'vrpayment_transaction_data';
/** /**
* @return string * @return string
@@ -15,6 +15,7 @@ use Shopware\Core\{
System\SalesChannel\SalesChannelContext System\SalesChannel\SalesChannelContext
}; };
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent; use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use VRPayment\Sdk\Model\{ use VRPayment\Sdk\Model\{
AddressCreate, AddressCreate,
@@ -44,8 +45,12 @@ use VRPaymentPayment\Core\{
Settings\Service\SettingsService, Settings\Service\SettingsService,
Util\LocaleCodeProvider, Util\LocaleCodeProvider,
Util\Payload\CustomProducts\CustomProductsLineItemTypes, Util\Payload\CustomProducts\CustomProductsLineItemTypes,
Util\Payload\TransactionPayload Util\Payload\TransactionPayload,
Util\Analytics\Analytics
}; };
use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Commercial\Subscription\Framework\Struct\SubscriptionContextStruct;
/** /**
* Class TransactionService * Class TransactionService
@@ -185,10 +190,20 @@ class TransactionService
$orderTransaction->getPaymentMethodId(), $orderTransaction->getPaymentMethodId(),
$orderTransaction->getOrder()->getSalesChannelId() $orderTransaction->getOrder()->getSalesChannelId()
); );
$_SESSION['transactionId'] = null;
$_SESSION['arrayOfPossibleMethods'] = null; $salesChannelContext->getContext()->addExtension(
$_SESSION['addressCheck'] = null; 'checkoutState',
$_SESSION['currencyCheck'] = null; new ArrayEntity([
'transactionId' => null,
'addressHash' => null,
'currency' => null,
])
);
$salesChannelContext->getContext()->addExtension(
'possibleMethods',
new ArrayEntity(['ids' => []])
);
$this->holdDelivery($orderTransaction->getOrder()->getId(), $salesChannelContext->getContext()); $this->holdDelivery($orderTransaction->getOrder()->getId(), $salesChannelContext->getContext());
@@ -207,9 +222,14 @@ class TransactionService
$spaceId = $settings->getSpaceId(); $spaceId = $settings->getSpaceId();
} }
$sdkTransaction = $settings->getApiClient()->getTransactionService()->create($spaceId, $sdkTransactionCreate); $apiClient = $settings->getApiClient();
Analytics::addHeaders($apiClient, [
Analytics::SUBSCRIPTION_TRANSACTION => true
]);
$sdkTransaction = $apiClient->getTransactionService()->create($spaceId, $sdkTransactionCreate);
if ($sdkTransaction->valid()) { if ($sdkTransaction->valid()) {
return $settings->getApiClient()->getTransactionService()->processWithoutUserInteraction($spaceId, $sdkTransaction->getId()); return $apiClient->getTransactionService()->processWithoutUserInteraction($spaceId, $sdkTransaction->getId());
} }
throw new \Exception("The transacion is not valid and could not be created."); throw new \Exception("The transacion is not valid and could not be created.");
@@ -367,7 +387,7 @@ class TransactionService
* *
* @return \Shopware\Core\Checkout\Order\OrderEntity * @return \Shopware\Core\Checkout\Order\OrderEntity
*/ */
protected function getOrderEntity(string $orderId, Context $context): OrderEntity public function getOrderEntity(string $orderId, Context $context): OrderEntity
{ {
try { try {
$criteria = (new Criteria([$orderId]))->addAssociations(['deliveries']); $criteria = (new Criteria([$orderId]))->addAssociations(['deliveries']);
@@ -502,24 +522,22 @@ class TransactionService
/** /**
* @param SalesChannelContext $salesChannelContext * @param SalesChannelContext $salesChannelContext
* @param CheckoutConfirmPageLoadedEvent|null $event *
* @return int * @return int
*/ */
public function createPendingTransaction(SalesChannelContext $salesChannelContext, ?CheckoutConfirmPageLoadedEvent $event = null): int public function createPendingTransaction(SalesChannelContext $salesChannelContext, $event = null): int
{ {
$expiredTransaction = true; $expiredTransaction = true;
$transactionId = $_SESSION['transactionId'] ?? null; $transactionId = $_SESSION['transactionId'] ?? null;
$settings = $this->settingsService->getValidSettings($salesChannelContext->getSalesChannel()->getId()); $settings = $this->settingsService->getValidSettings($salesChannelContext->getSalesChannel()->getId());
if (!$settings) {
throw new \Exception('Space settings not configured');
}
if ($transactionId) { if ($transactionId) {
$transactionService = $settings->getApiClient()->getTransactionService(); $transactionService = $settings->getApiClient()->getTransactionService();
$pendingTransaction = $transactionService->read($settings->getSpaceId(), $transactionId); $pendingTransaction = $transactionService->read($settings->getSpaceId(), $transactionId);
$failedStates = [ if ($pendingTransaction->getState() === TransactionState::PENDING) {
TransactionState::DECLINE,
TransactionState::FAILED,
TransactionState::VOIDED,
];
if (!in_array($pendingTransaction->getState(), $failedStates)) {
$expiredTransaction = false; $expiredTransaction = false;
} }
} }
@@ -528,75 +546,21 @@ class TransactionService
$settings = $this->settingsService->getValidSettings($salesChannelContext->getSalesChannel()->getId()); $settings = $this->settingsService->getValidSettings($salesChannelContext->getSalesChannel()->getId());
$customer = $salesChannelContext->getCustomer(); $customer = $salesChannelContext->getCustomer();
$customerBillingAddress = $customer->getActiveBillingAddress();
$billingAddress = new AddressCreate();
$customerAddressEntity = $customer->getActiveBillingAddress();
$familyName = "";
if (!empty($customerAddressEntity->getLastName())) {
$familyName = $customerAddressEntity->getLastName();
} else {
if (!empty($customer->getLastName())) {
$familyName = $customer->getLastName();
}
}
$billingAddress->setFamilyName($familyName);
$givenName = "";
if (!empty($customerAddressEntity->getFirstName())) {
$givenName = $customerAddressEntity->getFirstName();
} else {
if (!empty($customer->getFirstName())) {
$givenName = $customer->getFirstName();
}
}
$billingAddress->setGivenName($givenName);
$billingAddress->setOrganizationName($customerBillingAddress->getCompany());
$billingAddress->setPhoneNumber($customerAddressEntity->getPhoneNumber());
$billingAddress->setCountry($customerBillingAddress->getCountry()->getIso());
$postalState = $customerBillingAddress?->getCountryState()?->getName() ?? '';
if (empty($postalState)) {
$postalState = $customerBillingAddress?->getCountryState()?->getShortCode() ?? '';
}
$billingAddress->setPostalState($postalState);
$billingAddress->setPostCode($customerBillingAddress->getZipcode());
$billingAddress->setStreet($customerBillingAddress->getStreet());
$billingAddress->setEmailAddress($customer->getEmail());
if (!empty($customer->getBirthday())) {
$birthday = new \DateTime();
$birthday->setTimestamp($customer->getBirthday()->getTimestamp());
$birthday = $birthday->format('Y-m-d');
$billingAddress->setDateOfBirth($birthday);
}
$salutation = "";
if (!(
empty($customerAddressEntity->getSalutation()) ||
empty($customerAddressEntity->getSalutation()->getDisplayName())
)) {
$salutation = $customerAddressEntity->getSalutation()->getDisplayName();
} else {
if (!empty($customer->getSalutation())) {
$salutation = $customer->getSalutation()->getDisplayName();
}
}
$billingAddress->setGender(strtolower($customerAddressEntity->getSalutation()->getSalutationKey()) === 'mr' ? Gender::MALE : Gender::FEMALE);
$billingAddress->setSalutation($salutation);
$lineItems = []; $lineItems = [];
if ($event) { if ($event) {
$cartLineItems = $event->getPage()->getCart()->getLineItems()->getElements(); if ($event instanceof CheckoutConfirmPageLoadedEvent) {
foreach ($cartLineItems as $cartLineItem) { $cartLineItems = $event->getPage()->getCart()->getLineItems()->getElements();
if ($cartLineItem->getType() === CustomProductsLineItemTypes::LINE_ITEM_TYPE_CUSTOMIZED_PRODUCTS) { foreach ($cartLineItems as $cartLineItem) {
continue; if ($cartLineItem->getType() === CustomProductsLineItemTypes::LINE_ITEM_TYPE_CUSTOMIZED_PRODUCTS) {
continue;
}
$lineItems[] = $this->createTempLineItem($cartLineItem);
}
} elseif ($event instanceof AccountEditOrderPageLoadedEvent) {
$order = $event->getPage()->getOrder();
foreach ($order->getLineItems() as $orderLineItem) {
$lineItems[] = $this->createTempLineItem($orderLineItem);
} }
$lineItems[] = $this->createTempLineItem($cartLineItem);
} }
} }
@@ -608,8 +572,17 @@ class TransactionService
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
$homeUrl = $protocol . $_SERVER['HTTP_HOST']; $homeUrl = $protocol . $_SERVER['HTTP_HOST'];
$currency = $salesChannelContext->getCurrency()->getIsoCode(); $currency = $salesChannelContext->getCurrency()->getIsoCode();
$billingAddress = $this->buildAddress($salesChannelContext, $customer->getActiveBillingAddress());
$shippingAddress = $this->buildAddress($salesChannelContext, $customer->getActiveShippingAddress());
if (!$settings) {
throw new \Exception('Space settings not configured');
}
$transactionPayload = (new TransactionCreate()) $transactionPayload = (new TransactionCreate())
->setBillingAddress($billingAddress) ->setBillingAddress($billingAddress)
->setShippingAddress($shippingAddress)
->setLineItems($lineItems) ->setLineItems($lineItems)
->setCurrency($currency) ->setCurrency($currency)
->setSpaceViewId($settings->getSpaceViewId()) ->setSpaceViewId($settings->getSpaceViewId())
@@ -618,8 +591,11 @@ class TransactionService
->setCustomerEmailAddress($customer->getEmail()) ->setCustomerEmailAddress($customer->getEmail())
->setCustomerId($customerId) ->setCustomerId($customerId)
->setSuccessUrl($homeUrl . '?success') ->setSuccessUrl($homeUrl . '?success')
->setFailedUrl($homeUrl . '?fail') ->setFailedUrl($homeUrl . '?fail');
->setTokenizationMode(TokenizationMode::FORCE_CREATION);
if($this->isSubscription($salesChannelContext)) {
$transactionPayload->setTokenizationMode(TokenizationMode::FORCE_CREATION);
}
$transactionService = $settings->getApiClient()->getTransactionService(); $transactionService = $settings->getApiClient()->getTransactionService();
$transaction = $transactionService->create($settings->getSpaceId(), $transactionPayload); $transaction = $transactionService->create($settings->getSpaceId(), $transactionPayload);
@@ -644,25 +620,14 @@ class TransactionService
$transaction = $settings->getApiClient()->getTransactionService()->read($settings->getSpaceId(), $transactionId); $transaction = $settings->getApiClient()->getTransactionService()->read($settings->getSpaceId(), $transactionId);
$pendingTransaction->setVersion($transaction->getVersion()); $pendingTransaction->setVersion($transaction->getVersion());
$customerBillingAddress = $salesChannelContext->getCustomer()->getActiveBillingAddress();
$billingAddress = new AddressCreate();
$billingAddress->setStreet($customerBillingAddress->getStreet());
$billingAddress->setCity($customerBillingAddress->getCity());
$billingAddress->setCountry($customerBillingAddress->getCountry()->getIso());
$billingAddress->setPostCode($customerBillingAddress->getZipcode());
$postalState = $customerBillingAddress?->getCountryState()?->getName() ?? '';
if (empty($postalState)) {
$postalState = $customerBillingAddress?->getCountryState()?->getShortCode() ?? '';
}
$billingAddress->setPostalState($postalState);
$billingAddress->setOrganizationName($customerBillingAddress->getCompany());
$currency = $salesChannelContext->getCurrency()->getIsoCode(); $currency = $salesChannelContext->getCurrency()->getIsoCode();
$pendingTransaction->setCurrency($currency); $pendingTransaction->setCurrency($currency);
$billingAddress = $this->buildAddress($salesChannelContext, $salesChannelContext->getCustomer()->getActiveBillingAddress());
$shippingAddress = $this->buildAddress($salesChannelContext, $salesChannelContext->getCustomer()->getActiveShippingAddress());
$pendingTransaction->setBillingAddress($billingAddress); $pendingTransaction->setBillingAddress($billingAddress);
$pendingTransaction->setShippingAddress($shippingAddress);
$settings->getApiClient()->getTransactionService() $settings->getApiClient()->getTransactionService()
->update($settings->getSpaceId(), $pendingTransaction); ->update($settings->getSpaceId(), $pendingTransaction);
@@ -752,20 +717,105 @@ class TransactionService
return $chargeAttempts ? $chargeAttempts[0] : null; return $chargeAttempts ? $chargeAttempts[0] : null;
} }
/** private function createTempLineItem($productData): LineItemCreate
* @param LineItem $productData {
* @return LineItemCreate $lineItem = new LineItemCreate();
*/
private function createTempLineItem(LineItem $productData): LineItemCreate
{
$lineItem = new LineItemCreate();
$lineItem->setName($productData->getLabel());
$lineItem->setUniqueId($productData->getId());
$lineItem->setSku($productData->getId());
$lineItem->setQuantity($productData->getQuantity());
$lineItem->setAmountIncludingTax($productData->getPrice()->getUnitPrice());
$lineItem->setType(LineItemType::PRODUCT);
return $lineItem; $roundedPrice = $this->round($productData->getPrice()->getUnitPrice());
if ($productData instanceof LineItem) {
$lineItem->setName($productData->getLabel());
$lineItem->setUniqueId($productData->getId());
$lineItem->setSku($productData->getReferencedId() ?? $productData->getId());
$lineItem->setQuantity($productData->getQuantity());
$lineItem->setAmountIncludingTax($roundedPrice);
} elseif ($productData instanceof OrderLineItemEntity) {
$lineItem->setName($productData->getLabel());
$lineItem->setUniqueId($productData->getId());
$lineItem->setSku($productData->getProductId() ?? $productData->getIdentifier() ?? $productData->getId());
$lineItem->setQuantity($productData->getQuantity());
$lineItem->setAmountIncludingTax($roundedPrice);
} else {
throw new \InvalidArgumentException('Unsupported line item type: ' . get_class($productData));
}
$lineItem->setType(LineItemType::PRODUCT);
return $lineItem;
}
/**
* Build a VRPayment address from Shopware customer address.
*
* @param \Shopware\Core\System\SalesChannel\SalesChannelContext $salesChannelContext
* @param \Shopware\Core\Checkout\Customer\Aggregate\CustomerAddress\CustomerAddressEntity $addressEntity
* @return \VRPayment\Sdk\Model\AddressCreate
*/
private function buildAddress(
SalesChannelContext $salesChannelContext,
\Shopware\Core\Checkout\Customer\Aggregate\CustomerAddress\CustomerAddressEntity $addressEntity
): AddressCreate {
$customer = $salesChannelContext->getCustomer();
$address = new AddressCreate();
$address->setFamilyName($addressEntity->getLastName() ?: $customer->getLastName() ?: '');
$address->setGivenName($addressEntity->getFirstName() ?: $customer->getFirstName() ?: '');
$address->setOrganizationName($addressEntity->getCompany());
$address->setPhoneNumber($addressEntity->getPhoneNumber());
$address->setCountry($addressEntity->getCountry()->getIso());
$postalState = $addressEntity?->getCountryState()?->getName()
?: $addressEntity?->getCountryState()?->getShortCode()
?: '';
$address->setPostalState($postalState);
$address->setPostCode($addressEntity->getZipcode());
$address->setStreet($addressEntity->getStreet());
$address->setEmailAddress($customer->getEmail());
if (!empty($customer->getBirthday())) {
$birthday = (new \DateTimeImmutable())
->setTimestamp($customer->getBirthday()->getTimestamp())
->format('Y-m-d');
$address->setDateOfBirth($birthday);
}
$salutationEntity = $addressEntity->getSalutation() ?: $customer->getSalutation();
$address->setSalutation($salutationEntity?->getDisplayName() ?? '');
$address->setGender(
strtolower($salutationEntity?->getSalutationKey() ?? '') === 'mr'
? Gender::MALE
: Gender::FEMALE
);
return $address;
}
/**
* Checks if it's subscription context.
*
* @param \Shopware\Core\System\SalesChannel\SalesChannelContext $salesChannelContext
* @return bool
*/
private function isSubscription(SalesChannelContext $salesChannelContext): bool {
$extensionName = 'subscription';
if (class_exists(\Shopware\Commercial\Subscription\Framework\Struct\SubscriptionContextStruct::class)) {
$extensionName = SubscriptionContextStruct::SUBSCRIPTION_EXTENSION;
}
if ($salesChannelContext->hasExtension($extensionName)) {
return true;
}
return false;
}
/**
* @param $amount
* @param int $precision
*
* @return float
*/
private function round($value, $precision = 2): float {
return \round($value, $precision);
} }
} }
@@ -224,8 +224,18 @@ class WebHookController extends AbstractController {
// Configuration // Configuration
$salesChannelId = $salesChannelId == 'null' ? null : $salesChannelId; $salesChannelId = $salesChannelId == 'null' ? null : $salesChannelId;
$this->settings = $this->settingsService->getSettings($salesChannelId); $this->settings = $this->settingsService->getSettings($salesChannelId);
$signature = $request->server->get('HTTP_X_SIGNATURE'); $signature = $request->server->get('HTTP_X_SIGNATURE');
$requestJson = json_decode($request->getContent(), true); $requestJson = json_decode($request->getContent(), true);
if ($requestJson['eventId'] == null && $requestJson['entityId'] == null && $requestJson['listenerEntityId'] == null && $requestJson['listenerEntityId'] == null && $requestJson['listenerEntityTechnicalName'] == null && $requestJson['spaceId'] == null) {
throw new \InvalidArgumentException('Empty webhook');
}
if (!$this->settings->getSpaceId() || !$this->settings->getUserId() || !$this->settings->getApplicationKey()) {
throw new \InvalidArgumentException('Not correct webhook configuration for salesChannelId: ' . $salesChannelId . ' Debug: ' . var_dump($requestJson));
}
$apiClient = $this->settings->getApiClient(); $apiClient = $this->settings->getApiClient();
$callBackData->assign($requestJson); $callBackData->assign($requestJson);
@@ -125,7 +125,9 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
$orderTransactionId = $transaction->getOrderTransactionId(); $orderTransactionId = $transaction->getOrderTransactionId();
$orderTransaction = $this->orderTransactionRepository->search( $orderTransaction = $this->orderTransactionRepository->search(
(new Criteria([$orderTransactionId])) (new Criteria([$orderTransactionId]))
->addAssociation('order'), $context ->addAssociation('order')
->addAssociation('stateMachineState'),
$context
)->getEntities()->first(); )->getEntities()->first();
$contextSource = $context->getSource(); $contextSource = $context->getSource();
@@ -133,7 +135,9 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
$salesChannelContextId = $contextSource->getSalesChannelId(); $salesChannelContextId = $contextSource->getSalesChannelId();
} }
$parameters = new SalesChannelContextServiceParameters($salesChannelContextId, $request->getSession()->get("sw-context-token", Random::getAlphanumericString(32)), originalContext: $context); $contextToken = $this->getContextToken($request);
$parameters = new SalesChannelContextServiceParameters($salesChannelContextId, $contextToken, originalContext: $context);
$salesChannelContext = $this->salesChannelContextService->get($parameters); $salesChannelContext = $this->salesChannelContextService->get($parameters);
$redirectUrl = $transaction->getReturnUrl(); $redirectUrl = $transaction->getReturnUrl();
@@ -149,7 +153,10 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
$request->getSession()->remove('transactionId'); $request->getSession()->remove('transactionId');
$errorMessage = 'An error occurred during the communication with external payment gateway : ' . $e->getMessage(); $errorMessage = 'An error occurred during the communication with external payment gateway : ' . $e->getMessage();
$this->logger->critical($errorMessage); $this->logger->critical($errorMessage);
throw PaymentException::customerCanceled($transaction->getOrderTransaction()->getId(), $errorMessage); if ($orderTransaction->getState()?->getTechnicalName() === OrderTransactionStates::STATE_CANCELLED) {
throw PaymentException::asyncFinalizeInterrupted($orderTransaction->getOrder()->getId(), $errorMessage);
}
throw PaymentException::customerCanceled($transaction->getOrderTransactionId(), $errorMessage);
} }
} }
@@ -173,7 +180,9 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
$orderTransactionId = $transaction->getOrderTransactionId(); $orderTransactionId = $transaction->getOrderTransactionId();
$orderTransaction = $this->orderTransactionRepository->search( $orderTransaction = $this->orderTransactionRepository->search(
(new Criteria([$orderTransactionId])) (new Criteria([$orderTransactionId]))
->addAssociation('order'), $context ->addAssociation('order')
->addAssociation('stateMachineState'),
$context
)->getEntities()->first(); )->getEntities()->first();
if ($orderTransaction->getOrder()->getAmountTotal() > 0) { if ($orderTransaction->getOrder()->getAmountTotal() > 0) {
@@ -194,7 +203,7 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
]); ]);
$request->getSession()->remove('transactionId'); $request->getSession()->remove('transactionId');
$this->logger->info($errorMessage); $this->logger->info($errorMessage);
throw PaymentException::customerCanceled($transaction->getOrderTransaction()->getId(), $errorMessage); throw PaymentException::customerCanceled($orderTransactionId, $errorMessage);
} }
} else { } else {
$this->orderTransactionStateHandler->paid($orderTransaction->getId(), $context); $this->orderTransactionStateHandler->paid($orderTransaction->getId(), $context);
@@ -202,7 +211,11 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
$token = $request->getSession()->get('sw-context-token'); $token = $request->getSession()->get('sw-context-token');
if ($token) { if ($token) {
$salesChannelId = $transactionEntity->getSalesChannelId(); $orderEntity = $this->pluginTransactionService->getOrderEntity(
$orderTransaction->getOrder()->getId(),
$context
);
$salesChannelId = $orderEntity->getSalesChannelId();
$parameters = new SalesChannelContextServiceParameters($salesChannelId, $token, originalContext: $context); $parameters = new SalesChannelContextServiceParameters($salesChannelId, $token, originalContext: $context);
$salesChannelContext = $this->salesChannelContextService->get($parameters); $salesChannelContext = $this->salesChannelContextService->get($parameters);
@@ -419,7 +432,9 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
{ {
$lineItemCreate = new \VRPayment\Sdk\Model\LineItemCreate(); $lineItemCreate = new \VRPayment\Sdk\Model\LineItemCreate();
$lineItemCreate->setAmountIncludingTax($lineItem->getAmountIncludingTax()); $roundedPrice = $this->round($lineItem->getAmountIncludingTax());
$lineItemCreate->setAmountIncludingTax($roundedPrice);
$attributes = $lineItem->getAttributes(); $attributes = $lineItem->getAttributes();
$attributesCreate = []; $attributesCreate = [];
@@ -456,4 +471,28 @@ class VRPaymentPaymentHandler extends AbstractPaymentHandler
return $lineItemCreate; return $lineItemCreate;
} }
/**
* @param $amount
* @param int $precision
*
* @return float
*/
private function round($value, $precision = 2): float {
return \round($value, $precision);
}
private function getContextToken(Request $request): string
{
$headerContextToken = $request->headers->get('sw-context-token');
if ($headerContextToken) {
return $headerContextToken;
}
$sessionContextToken = $request->getSession()->get("sw-context-token");
if (!$sessionContextToken) {
return $sessionContextToken;
}
return Random::getAlphanumericString(32);
}
} }
@@ -4,33 +4,42 @@ namespace VRPaymentPayment\Core\Storefront\Checkout\Subscriber;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Shopware\Core\{Checkout\Order\Aggregate\OrderTransaction\OrderTransactionCollection, use Shopware\Core\{Checkout\Order\Aggregate\OrderTransaction\OrderTransactionCollection,
Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates, Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates,
Checkout\Order\OrderEntity, Checkout\Order\OrderEntity,
Content\MailTemplate\Service\Event\MailBeforeValidateEvent}; Content\MailTemplate\Service\Event\MailBeforeValidateEvent};
use Shopware\Core\Checkout\Payment\PaymentMethodCollection;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\System\SalesChannel\SalesChannelContext; use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
use Shopware\Storefront\Page\Account\PaymentMethod\AccountPaymentMethodPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent; use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use VRPaymentPayment\Core\{Api\Transaction\Service\OrderMailService, use VRPaymentPayment\Core\{Api\Transaction\Service\TransactionService,
Api\Transaction\Service\TransactionService, Checkout\PaymentHandler\VRPaymentPaymentHandler,
Checkout\PaymentHandler\VRPaymentPaymentHandler, Settings\Service\SettingsService,
Settings\Service\SettingsService, Settings\Struct\Settings,
Settings\Struct\Settings, Util\PaymentMethodUtil};
Util\PaymentMethodUtil};
use VRPaymentPayment\Core\Api\PaymentMethodConfiguration\Service\PaymentMethodConfigurationService; use VRPaymentPayment\Core\Api\PaymentMethodConfiguration\Service\PaymentMethodConfigurationService;
use VRPaymentPayment\Sdk\{Model\AddressCreate, use VRPaymentPayment\Sdk\{Model\AddressCreate,
Model\ChargeAttempt, Model\ChargeAttempt,
Model\CreationEntityState, Model\CreationEntityState,
Model\CriteriaOperator, Model\CriteriaOperator,
Model\EntityQuery, Model\EntityQuery,
Model\EntityQueryFilter, Model\EntityQueryFilter,
Model\EntityQueryFilterType, Model\EntityQueryFilterType,
Model\LineItemAttributeCreate, Model\LineItemAttributeCreate,
Model\LineItemCreate, Model\LineItemCreate,
Model\LineItemType, Model\LineItemType,
Model\TaxCreate, Model\TaxCreate,
Model\Transaction, Model\Transaction,
Model\TransactionCreate, Model\TransactionCreate,
Model\TransactionPending}; Model\TransactionPending};
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
/** /**
* Class CheckoutSubscriber * Class CheckoutSubscriber
@@ -65,6 +74,9 @@ class CheckoutSubscriber implements EventSubscriberInterface
*/ */
private $paymentMethodUtil; private $paymentMethodUtil;
/** @var EntityRepository */
private EntityRepository $paymentMethodRepository;
/** /**
* CheckoutSubscriber constructor. * CheckoutSubscriber constructor.
* *
@@ -72,13 +84,15 @@ class CheckoutSubscriber implements EventSubscriberInterface
* @param \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService $transactionService * @param \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService $transactionService
* @param \VRPaymentPayment\Core\Settings\Service\SettingsService $settingsService * @param \VRPaymentPayment\Core\Settings\Service\SettingsService $settingsService
* @param \VRPaymentPayment\Core\Util\PaymentMethodUtil $paymentMethodUtil * @param \VRPaymentPayment\Core\Util\PaymentMethodUtil $paymentMethodUtil
* @param EntityRepository $paymentMethodRepository
*/ */
public function __construct(PaymentMethodConfigurationService $paymentMethodConfigurationService, TransactionService $transactionService, SettingsService $settingsService, PaymentMethodUtil $paymentMethodUtil) public function __construct(PaymentMethodConfigurationService $paymentMethodConfigurationService, TransactionService $transactionService, SettingsService $settingsService, PaymentMethodUtil $paymentMethodUtil, EntityRepository $paymentMethodRepository)
{ {
$this->paymentMethodConfigurationService = $paymentMethodConfigurationService; $this->paymentMethodConfigurationService = $paymentMethodConfigurationService;
$this->transactionService = $transactionService; $this->transactionService = $transactionService;
$this->settingsService = $settingsService; $this->settingsService = $settingsService;
$this->paymentMethodUtil = $paymentMethodUtil; $this->paymentMethodUtil = $paymentMethodUtil;
$this->paymentMethodRepository = $paymentMethodRepository;
} }
/** /**
@@ -99,7 +113,9 @@ class CheckoutSubscriber implements EventSubscriberInterface
public static function getSubscribedEvents(): array public static function getSubscribedEvents(): array
{ {
return [ return [
CheckoutConfirmPageLoadedEvent::class => ['onConfirmPageLoaded', 1], CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmLoaded',
AccountEditOrderPageLoadedEvent::class => 'onAccountOrderEditLoaded',
AccountPaymentMethodPageLoadedEvent::class => 'onAccountPaymentMethodLoaded',
"subscription." . CheckoutConfirmPageLoadedEvent::class => ['onConfirmPageLoaded', 1], "subscription." . CheckoutConfirmPageLoadedEvent::class => ['onConfirmPageLoaded', 1],
MailBeforeValidateEvent::class => ['onMailBeforeValidate', 1], MailBeforeValidateEvent::class => ['onMailBeforeValidate', 1],
]; ];
@@ -154,9 +170,10 @@ class CheckoutSubscriber implements EventSubscriberInterface
} }
/** /**
* @param \Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent $event * @param CheckoutConfirmPageLoadedEvent $event
* @return void
*/ */
public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void public function onCheckoutConfirmLoaded(CheckoutConfirmPageLoadedEvent $event): void
{ {
try { try {
$salesChannelContext = $event->getSalesChannelContext(); $salesChannelContext = $event->getSalesChannelContext();
@@ -169,7 +186,7 @@ class CheckoutSubscriber implements EventSubscriberInterface
$createdTransactionId = $this->transactionService->createPendingTransaction($salesChannelContext, $event); $createdTransactionId = $this->transactionService->createPendingTransaction($salesChannelContext, $event);
$this->updateTempTransactionIfNeeded($salesChannelContext, $createdTransactionId); $this->updateTempTransactionIfNeeded($salesChannelContext, $createdTransactionId);
$this->getAvailablePaymentMethods($settings, $createdTransactionId); $this->getAvailablePaymentMethods($settings, $createdTransactionId, $salesChannelContext);
$this->setPossiblePaymentMethods($settings->getSpaceId(), $event); $this->setPossiblePaymentMethods($settings->getSpaceId(), $event);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error($e->getMessage()); $this->logger->error($e->getMessage());
@@ -177,10 +194,74 @@ class CheckoutSubscriber implements EventSubscriberInterface
} }
} }
/**
* @param AccountEditOrderPageLoadedEvent $event
* @return void
*/
public function onAccountOrderEditLoaded(AccountEditOrderPageLoadedEvent $event): void
{
try {
$this->handlePaymentMethodFiltering($event);
} catch (\Throwable $e) {
$this->logger->error($e->getMessage());
$this->removeVRPaymentPaymentMethodFromConfirmPage($event);
}
}
/**
* @param AccountPaymentMethodPageLoadedEvent $event
* @return void
*/
public function onAccountPaymentMethodLoaded(AccountPaymentMethodPageLoadedEvent $event): void
{
try {
$this->handlePaymentMethodFiltering($event);
} catch (\Throwable $e) {
$this->logger->error($e->getMessage());
$this->removeVRPaymentPaymentMethodFromConfirmPage($event);
}
}
/** /**
* @param \Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent $event * @param \Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent $event
*/ */
private function removeVRPaymentPaymentMethodFromConfirmPage(CheckoutConfirmPageLoadedEvent $event): void public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
{
try {
$this->handlePaymentMethodFiltering($event);
} catch (\Throwable $e) {
$this->logger->error($e->getMessage());
$this->removeVRPaymentPaymentMethodFromConfirmPage($event);
}
}
/**
* @param $event
* @return void
*/
private function handlePaymentMethodFiltering($event): void
{
$salesChannelContext = $event->getSalesChannelContext();
$settings = $this->settingsService->getValidSettings($salesChannelContext->getSalesChannel()->getId());
if (is_null($settings)) {
$this->logger->notice('Removing payment methods because settings are invalid');
$this->removeVRPaymentPaymentMethodFromConfirmPage($event);
return;
}
$createdTransactionId = $this->transactionService->createPendingTransaction($salesChannelContext, $event);
$this->updateTempTransactionIfNeeded($salesChannelContext, $createdTransactionId);
$this->getAvailablePaymentMethods($settings, $createdTransactionId, $salesChannelContext);
$this->setPossiblePaymentMethods($settings->getSpaceId(), $event);
}
/**
* @param $event
* @return void
*/
private function removeVRPaymentPaymentMethodFromConfirmPage($event): void
{ {
$paymentMethodCollection = $event->getPage()->getPaymentMethods(); $paymentMethodCollection = $event->getPage()->getPaymentMethods();
$paymentMethodIds = $this->paymentMethodUtil->getVRPaymentPaymentMethodIds($event->getContext()); $paymentMethodIds = $this->paymentMethodUtil->getVRPaymentPaymentMethodIds($event->getContext());
@@ -194,7 +275,7 @@ class CheckoutSubscriber implements EventSubscriberInterface
* @param int $createdTransactionId * @param int $createdTransactionId
* @return void * @return void
*/ */
private function getAvailablePaymentMethods(Settings $settings, int $createdTransactionId): void private function getAvailablePaymentMethods(Settings $settings, int $createdTransactionId, SalesChannelContext $salesChannelContext): void
{ {
$transactionService = $settings->getApiClient()->getTransactionService(); $transactionService = $settings->getApiClient()->getTransactionService();
$possiblePaymentMethods = $transactionService->fetchPaymentMethods( $possiblePaymentMethods = $transactionService->fetchPaymentMethods(
@@ -204,9 +285,13 @@ class CheckoutSubscriber implements EventSubscriberInterface
); );
$arrayOfPossibleMethods = []; $arrayOfPossibleMethods = [];
foreach ($possiblePaymentMethods as $possiblePaymentMethod) { foreach ($possiblePaymentMethods as $possiblePaymentMethod) {
$arrayOfPossibleMethods[] = $possiblePaymentMethod->getid(); $arrayOfPossibleMethods[] = $possiblePaymentMethod->getId();
} }
$_SESSION['arrayOfPossibleMethods'] = $arrayOfPossibleMethods;
$salesChannelContext->getContext()->addExtension(
'possibleMethods',
new ArrayEntity(['ids' => $arrayOfPossibleMethods])
);
} }
/** /**
@@ -214,48 +299,102 @@ class CheckoutSubscriber implements EventSubscriberInterface
* @param CheckoutConfirmPageLoadedEvent $event * @param CheckoutConfirmPageLoadedEvent $event
* @return void * @return void
*/ */
private function setPossiblePaymentMethods(int $spaceId, CheckoutConfirmPageLoadedEvent $event): void private function setPossiblePaymentMethods(int $spaceId, $event): void
{ {
$localPaymentMethods = []; $paymentIds = [];
$paymentMethodConfigurations = $this->paymentMethodConfigurationService->getAllPaymentMethodConfigurations($spaceId, $event->getSalesChannelContext()->getContext()); $paymentMethodCollection = $event->getPage()->getPaymentMethods();
foreach ($paymentMethodConfigurations as $paymentMethodConfiguration) {
$localPaymentMethods[$paymentMethodConfiguration->getId()] = $paymentMethodConfiguration->getPaymentMethodConfigurationId(); foreach ($paymentMethodCollection as $paymentMethodCollectionItem) {
$isVRPaymentPM = VRPaymentPaymentHandler::class === $paymentMethodCollectionItem->getHandlerIdentifier();
if (!$isVRPaymentPM) {
$paymentIds[] = $paymentMethodCollectionItem->getId();
}
} }
$paymentMethodCollection = $event->getPage()->getPaymentMethods(); $allowedWLMethods = [];
foreach ($paymentMethodCollection as $paymentMethodCollectionItem) { $paymentMethodConfigurations = $this->paymentMethodConfigurationService
$isVRPaymentPM = VRPaymentPaymentHandler::class == $paymentMethodCollectionItem->getHandlerIdentifier(); ->getAllPaymentMethodConfigurations($spaceId, $event->getSalesChannelContext()->getContext());
if (!$isVRPaymentPM) {
foreach ($paymentMethodConfigurations as $paymentMethodConfiguration) {
if ($paymentMethodConfiguration->getPaymentMethod() === null) {
continue; continue;
} }
$paymentMethodConfigurationId = $localPaymentMethods[$paymentMethodCollectionItem->getId()]; $pmId = $paymentMethodConfiguration->getPaymentMethod()->getId();
if (!\in_array($paymentMethodConfigurationId, $_SESSION['arrayOfPossibleMethods'])) { $pmConfigId = $paymentMethodConfiguration->getPaymentMethodConfigurationId();
$paymentMethodCollection->remove($paymentMethodCollectionItem->getId()); $allowedIds = $this->getAllowedPaymentMethodIds($event->getSalesChannelContext());
if ($paymentMethodConfiguration->getSpaceId() === $spaceId
&& \in_array($pmConfigId, $allowedIds, true)) {
$allowedWLMethods[] = $pmId;
} }
} }
}
/** $allPaymentIds = array_unique(array_merge($paymentIds, $allowedWLMethods));
* @param SalesChannelContext $salesChannelContext $collection = new PaymentMethodCollection();
* @param int $createdTransactionId if (!empty($allPaymentIds)) {
* @return void $criteria = new Criteria($allPaymentIds);
*/ $criteria->addFilter(new EqualsFilter('active', true));
private function updateTempTransactionIfNeeded(SalesChannelContext $salesChannelContext, int $createdTransactionId): void $criteria->addFilter(
{ new EqualsFilter('salesChannels.id', $event->getSalesChannelContext()->getSalesChannelId())
$addressCheck = $_SESSION['addressCheck'] ?? null; );
$currencyCheck = $_SESSION['currencyCheck'] ?? null; $criteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING));
$customer = $salesChannelContext->getCustomer(); $result = $this->paymentMethodRepository->search($criteria, $event->getContext());
$addressHash = md5(json_encode((array)$customer)); foreach ($result->getEntities() as $method) {
$currency = $salesChannelContext->getCurrency()->getIsoCode(); if (!$collection->has($method->getId())) {
if (($addressCheck && $currencyCheck) && $addressCheck !== $addressHash || $currencyCheck !== $currency) { $collection->add($method);
if ($createdTransactionId) { }
$this->transactionService->updateTempTransaction($salesChannelContext, $createdTransactionId);
} }
$_SESSION['arrayOfPossibleMethods'] = null;
$_SESSION['addressCheck'] = $addressHash;
$_SESSION['currencyCheck'] = $currency;
} }
$event->getPage()->setPaymentMethods($collection);
} }
/**
* @param SalesChannelContext $salesChannelContext
* @param int $createdTransactionId
* @return void
*/
private function updateTempTransactionIfNeeded(SalesChannelContext $salesChannelContext, int $createdTransactionId): void
{
$ctx = $salesChannelContext->getContext();
/** @var ArrayEntity|null $ext */
$ext = $ctx->getExtension('checkoutState');
$oldAddressHash = $ext instanceof ArrayEntity ? $ext->get('addressHash') : null;
$oldCurrency = $ext instanceof ArrayEntity ? $ext->get('currency') : null;
$customer = $salesChannelContext->getCustomer();
$addressHash = md5(json_encode((array) $customer));
$currency = $salesChannelContext->getCurrency()->getIsoCode();
$needsUpdate = ($oldAddressHash !== $addressHash) || ($oldCurrency !== $currency);
if ($needsUpdate) {
if ($createdTransactionId) {
$this->transactionService->updateTempTransaction($salesChannelContext, $createdTransactionId);
}
$ctx->addExtension('possibleMethods', new ArrayEntity(['ids' => []]));
$ctx->addExtension(
'checkoutState',
new ArrayEntity([
'addressHash' => $addressHash,
'currency' => $currency,
])
);
}
}
/**
* @param SalesChannelContext $salesChannelContext
* @return array
*/
private function getAllowedPaymentMethodIds(SalesChannelContext $salesChannelContext): array
{
$ext = $salesChannelContext->getContext()->getExtension('possibleMethods');
return $ext instanceof ArrayEntity ? ($ext->get('ids') ?? []) : [];
}
} }
+4 -2
View File
@@ -15,6 +15,7 @@ class Analytics {
public const SHOP_SYSTEM_VERSION = 'x-meta-shop-system-version'; public const SHOP_SYSTEM_VERSION = 'x-meta-shop-system-version';
public const SHOP_SYSTEM_AND_VERSION = 'x-meta-shop-system-and-version'; public const SHOP_SYSTEM_AND_VERSION = 'x-meta-shop-system-and-version';
public const PLUGIN_SYSTEM_VERSION = 'x-meta-plugin-version'; public const PLUGIN_SYSTEM_VERSION = 'x-meta-plugin-version';
public const SUBSCRIPTION_TRANSACTION = 'x-meta-subscription-transaction';
/** /**
* @return array * @return array
@@ -25,16 +26,17 @@ class Analytics {
self::SHOP_SYSTEM => 'shopware', self::SHOP_SYSTEM => 'shopware',
self::SHOP_SYSTEM_VERSION => '6', self::SHOP_SYSTEM_VERSION => '6',
self::SHOP_SYSTEM_AND_VERSION => 'shopware-6', self::SHOP_SYSTEM_AND_VERSION => 'shopware-6',
self::PLUGIN_SYSTEM_VERSION => '7.1.0', self::PLUGIN_SYSTEM_VERSION => '7.2.0',
]; ];
} }
/** /**
* @param \VRPayment\Sdk\ApiClient $apiClient * @param \VRPayment\Sdk\ApiClient $apiClient
*/ */
public static function addHeaders(ApiClient &$apiClient) public static function addHeaders(ApiClient &$apiClient, array $additionalHeaders = [])
{ {
$data = self::getDefaultData(); $data = self::getDefaultData();
$data = array_merge($data, $additionalHeaders);
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
$apiClient->addDefaultHeader($key, $value); $apiClient->addDefaultHeader($key, $value);
} }
+36 -19
View File
@@ -231,9 +231,16 @@ class TransactionPayload extends AbstractPayload
->setShippingAddress($shippingAddress) ->setShippingAddress($shippingAddress)
->setShippingMethod($transactionData['shipping_method']); ->setShippingMethod($transactionData['shipping_method']);
$paymentConfiguration = $this->getPaymentConfiguration($this->salesChannelContext->getPaymentMethod()->getId()); $paymentConfiguration = $this->getPaymentConfiguration(
$this->salesChannelContext->getPaymentMethod()->getId(),
$this->settings->getSpaceId()
);
$transactionPayload->setAllowedPaymentMethodConfigurations([$paymentConfiguration->getPaymentMethodConfigurationId()]); if ($paymentConfiguration) {
$transactionPayload->setAllowedPaymentMethodConfigurations([
$paymentConfiguration->getPaymentMethodConfigurationId()
]);
}
$successUrl = $this->transaction->getReturnUrl() . '&status=paid'; $successUrl = $this->transaction->getReturnUrl() . '&status=paid';
$failedUrl = $this->getFailUrl($this->order->getId()) . '&status=fail'; $failedUrl = $this->getFailUrl($this->order->getId()) . '&status=fail';
@@ -390,7 +397,9 @@ class TransactionPayload extends AbstractPayload
$discountTitle = sprintf('DISCOUNT: %s', $discountName); $discountTitle = sprintf('DISCOUNT: %s', $discountName);
} }
$lineItem->setAmountIncludingTax($amount) $roundedAmount = self::round($amount);
$lineItem->setAmountIncludingTax($roundedAmount)
->setName($discountTitle) ->setName($discountTitle)
->setQuantity(1) ->setQuantity(1)
->setShippingRequired(false) ->setShippingRequired(false)
@@ -513,12 +522,14 @@ class TransactionPayload extends AbstractPayload
$amount = self::round($amount + $shopLineItem->getPrice()->getCalculatedTaxes()->getAmount()); $amount = self::round($amount + $shopLineItem->getPrice()->getCalculatedTaxes()->getAmount());
} }
$roundedAmount = self::round($amount);
$lineItem = (new LineItemCreate()) $lineItem = (new LineItemCreate())
->setName($this->fixLength($shopLineItem->getLabel(), 150)) ->setName($this->fixLength($shopLineItem->getLabel(), 150))
->setUniqueId($uniqueId) ->setUniqueId($uniqueId)
->setSku($sku) ->setSku($sku)
->setQuantity($shopLineItem->getQuantity() ?? 1) ->setQuantity($shopLineItem->getQuantity() ?? 1)
->setAmountIncludingTax($amount); ->setAmountIncludingTax($roundedAmount);
if (!empty($shopLineItem->getType()) && $shopLineItem->getType() == CustomProductsLineItemTypes::LINE_ITEM_TYPE_CUSTOMIZED_PRODUCTS) { if (!empty($shopLineItem->getType()) && $shopLineItem->getType() == CustomProductsLineItemTypes::LINE_ITEM_TYPE_CUSTOMIZED_PRODUCTS) {
@@ -637,9 +648,10 @@ class TransactionPayload extends AbstractPayload
$amount = self::round($amount + $this->order->getShippingCosts()->getCalculatedTaxes()->getAmount()); $amount = self::round($amount + $this->order->getShippingCosts()->getCalculatedTaxes()->getAmount());
} }
$roundedAmount = self::round($amount);
$lineItem = (new LineItemCreate()) $lineItem = (new LineItemCreate())
->setAmountIncludingTax($amount) ->setAmountIncludingTax($roundedAmount)
->setName($this->fixLength($shippingName . ' ' . $this->translator->trans('vrpayment.payload.shipping.lineItem'), 150)) ->setName($this->fixLength($shippingName . ' ' . $this->translator->trans('vrpayment.payload.shipping.lineItem'), 150))
->setQuantity($this->order->getShippingCosts()->getQuantity() ?? 1) ->setQuantity($this->order->getShippingCosts()->getQuantity() ?? 1)
->setSku($this->fixLength($shippingName . '-Shipping', 200)) ->setSku($this->fixLength($shippingName . '-Shipping', 200))
@@ -687,9 +699,11 @@ class TransactionPayload extends AbstractPayload
->setRate($taxRate) ->setRate($taxRate)
->setTitle('Tax rate: '.$taxRate); ->setTitle('Tax rate: '.$taxRate);
$roundedAmount = self::round($amount);
$name = $taxRate . '%-' . $shippingName; $name = $taxRate . '%-' . $shippingName;
$lineItem = (new LineItemCreate()) $lineItem = (new LineItemCreate())
->setAmountIncludingTax($amount) ->setAmountIncludingTax($roundedAmount)
->setName($this->fixLength($name . ' ' . $this->translator->trans('vrpayment.payload.shipping.lineItem'), 150)) ->setName($this->fixLength($name . ' ' . $this->translator->trans('vrpayment.payload.shipping.lineItem'), 150))
->setQuantity($this->order->getShippingCosts()->getQuantity() ?? 1) ->setQuantity($this->order->getShippingCosts()->getQuantity() ?? 1)
->setSku($this->fixLength($name . '-Shipping', 200)) ->setSku($this->fixLength($name . '-Shipping', 200))
@@ -761,7 +775,8 @@ class TransactionPayload extends AbstractPayload
->setSku('Adjustment-Line-Item') ->setSku('Adjustment-Line-Item')
->setQuantity(1); ->setQuantity(1);
/** @noinspection PhpParamsInspection */ /** @noinspection PhpParamsInspection */
$lineItem->setAmountIncludingTax($adjustmentPrice) $roundedAdjustmentPrice = self::round($adjustmentPrice);
$lineItem->setAmountIncludingTax($roundedAdjustmentPrice)
->setType(($adjustmentPrice > 0) ? LineItemType::FEE : LineItemType::DISCOUNT); ->setType(($adjustmentPrice > 0) ? LineItemType::FEE : LineItemType::DISCOUNT);
if (!$lineItem->valid()) { if (!$lineItem->valid()) {
@@ -899,19 +914,21 @@ class TransactionPayload extends AbstractPayload
return $addressPayload; return $addressPayload;
} }
/** /**
* @param string $id * @param string $paymentMethodId
* * @param int $spaceId
* @return \VRPaymentPayment\Core\Api\PaymentMethodConfiguration\Entity\PaymentMethodConfigurationEntity * @return PaymentMethodConfigurationEntity|null
*/ */
protected function getPaymentConfiguration(string $id): PaymentMethodConfigurationEntity protected function getPaymentConfiguration(string $paymentMethodId, int $spaceId): ?PaymentMethodConfigurationEntity
{ {
$criteria = (new Criteria([$id])); $criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('paymentMethodId', $paymentMethodId));
$criteria->addFilter(new EqualsFilter('spaceId', $spaceId));
return $this->container->get('vrpayment_payment_method_configuration.repository') return $this->container->get('vrpayment_payment_method_configuration.repository')
->search($criteria, $this->salesChannelContext->getContext()) ->search($criteria, $this->salesChannelContext->getContext())
->getEntities()->first(); ->first();
} }
/** /**
* Get failure URL * Get failure URL
@@ -31,7 +31,7 @@ class Migration1590156974TransactionEntity extends MigrationStep {
public function update(Connection $connection): void public function update(Connection $connection): void
{ {
$connection->executeStatement(' $connection->executeStatement('
CREATE TABLE IF NOT EXISTS `vrpayment_transaction` ( CREATE TABLE IF NOT EXISTS `vrpayment_transaction_tmp` (
`id` BINARY(16) NOT NULL, `id` BINARY(16) NOT NULL,
`data` JSON NOT NULL, `data` JSON NOT NULL,
`payment_method_id` BINARY(16) NOT NULL, `payment_method_id` BINARY(16) NOT NULL,
@@ -42,7 +42,7 @@ class Migration1590646356RefundEntity extends MigrationStep {
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `refund_id_UNIQUE` (`refund_id`), UNIQUE KEY `refund_id_UNIQUE` (`refund_id`),
KEY `fk.vrp_refund.transaction_id` (`transaction_id`), KEY `fk.vrp_refund.transaction_id` (`transaction_id`),
CONSTRAINT `fk.vrp_refund.transaction_id` FOREIGN KEY (`transaction_id`) REFERENCES `vrpayment_transaction` (`transaction_id`) ON DELETE CASCADE CONSTRAINT `fk.vrp_refund.transaction_id` FOREIGN KEY (`transaction_id`) REFERENCES `vrpayment_transaction_tmp` (`transaction_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
'); ');
} }
@@ -30,7 +30,7 @@ class Migration1590646356TransactionEntity extends MigrationStep {
public function update(Connection $connection): void public function update(Connection $connection): void
{ {
try { try {
$connection->executeStatement('ALTER TABLE `vrpayment_transaction` ADD COLUMN `confirmation_email_sent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`;'); $connection->executeStatement('ALTER TABLE `vrpayment_transaction_tmp` ADD COLUMN `confirmation_email_sent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`;');
}catch (\Exception $exception){ }catch (\Exception $exception){
// column probably exists // column probably exists
} }
@@ -33,19 +33,19 @@ class Migration1605701048TransactionEntity extends MigrationStep
try { try {
$connection->executeStatement(' $connection->executeStatement('
ALTER TABLE `vrpayment_transaction` ALTER TABLE `vrpayment_transaction_tmp`
ADD `order_version_id` binary(16) NOT NULL AFTER `transaction_id`; ADD `order_version_id` binary(16) NOT NULL AFTER `transaction_id`;
'); ');
$connection->executeStatement(' $connection->executeStatement('
UPDATE `vrpayment_transaction` t1 UPDATE `vrpayment_transaction_tmp` t1
INNER JOIN `order` t2 INNER JOIN `order` t2
ON t1.order_id = t2.id ON t1.order_id = t2.id
SET t1.order_version_id = t2.version_id; SET t1.order_version_id = t2.version_id;
'); ');
$connection->executeStatement(' $connection->executeStatement('
ALTER TABLE `vrpayment_transaction` ALTER TABLE `vrpayment_transaction_tmp`
DROP FOREIGN KEY `fk.vrp_transaction.order_id`, DROP FOREIGN KEY `fk.vrp_transaction.order_id`,
DROP FOREIGN KEY `fk.vrp_transaction.order_transaction_id`, DROP FOREIGN KEY `fk.vrp_transaction.order_transaction_id`,
DROP FOREIGN KEY `fk.vrp_transaction.payment_method_id`, DROP FOREIGN KEY `fk.vrp_transaction.payment_method_id`,
@@ -53,7 +53,7 @@ class Migration1605701048TransactionEntity extends MigrationStep
'); ');
$connection->executeStatement(' $connection->executeStatement('
ALTER TABLE `vrpayment_transaction` ALTER TABLE `vrpayment_transaction_tmp`
ADD CONSTRAINT `fk.vrp_transaction_order_id` FOREIGN KEY (`order_id`, `order_version_id`) ADD CONSTRAINT `fk.vrp_transaction_order_id` FOREIGN KEY (`order_id`, `order_version_id`)
REFERENCES `order` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE, REFERENCES `order` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `fk.vrp_transaction_payment_method_id` FOREIGN KEY (`payment_method_id`) ADD CONSTRAINT `fk.vrp_transaction_payment_method_id` FOREIGN KEY (`payment_method_id`)
@@ -30,7 +30,7 @@ class Migration1684240994TransactionEntity extends MigrationStep {
public function update(Connection $connection): void public function update(Connection $connection): void
{ {
try { try {
$connection->executeStatement('ALTER TABLE `vrpayment_transaction` ADD COLUMN `erp_merchant_id` VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`;'); $connection->executeStatement('ALTER TABLE `vrpayment_transaction_tmp` ADD COLUMN `erp_merchant_id` VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`;');
}catch (\Exception $exception){ }catch (\Exception $exception){
// column probably exists // column probably exists
} }
@@ -0,0 +1,323 @@
<?php declare(strict_types=1);
namespace VRPaymentPayment\Migration;
use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Migration\MigrationStep;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
/**
* Class Migration1766067106TransactionEntity
*
* @package VRPaymentPayment\Migration
*/
class Migration1766067106TransactionEntity extends MigrationStep
{
/**
* get creation timestamp
*
* @return int
*/
public function getCreationTimestamp(): int
{
return 1766067106;
}
/**
* update non-destructive changes
*
* @param \Doctrine\DBAL\Connection $connection
*/
public function update(Connection $connection): void
{
$oldTableName = 'vrpayment_transaction';
$tempTableName = 'vrpayment_transaction_tmp';
$realTableName = 'vrpayment_transaction_data';
$logger = new Logger('vrpayment_migration');
$logger->pushHandler(new StreamHandler(dirname(__DIR__, 5) . '/var/log/vrpayment-migration.log'));
$logger->info(
'Migration start', [
'old_table_exists' => $this->tableExists($connection, $oldTableName),
'temp_table_exists' => $this->tableExists($connection, $tempTableName),
'real_table_exists' => $this->tableExists($connection, $realTableName),
]
);
if ($this->tableExists($connection, $tempTableName)) {
// If _temp table exists, it means that this is a fresh installation.
$logger->info('Fresh installation detected.');
$connection->executeStatement(
sprintf('RENAME TABLE `%s` TO `%s`', $tempTableName, $realTableName)
);
$logger->info('Fresh installation finished.');
} else {
// If _temp does not exist, it means that this could be a version upgrade.
$logger->info('Possible plugin upgrade detected.');
if ($this->tableExists($connection, $oldTableName) && !$this->isOldPluginTable($connection, $oldTableName)) {
$logger->info('Old vrpayment_transaction table detected.');
// If vrpayment_transaction already exists and does not belong to old plugin,
// it means that this is indeed a version update.
$this->syncTransactionTable($connection, $oldTableName);
$logger->info('Old vrpayment_transaction table sync finished.');
$this->syncRefundTable($connection, $oldTableName);
$logger->info('Old vrpayment_refund table sync finished.');
$connection->executeStatement(
sprintf('RENAME TABLE `%s` TO `%s`', $oldTableName, $realTableName)
);
$logger->info('Old vrpayment_transaction table renaming completed.');
}
$logger->info('Possible plugin upgrade finished.');
// If vrpayment_transaction exists and it does belong to old plugin,
// it means we must run it in parallel.
}
$logger->info('Migration finished.');
return;
}
/**
* Check if table exists.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
*
* @return bool
*/
public function tableExists(Connection $connection, string $table): bool {
$result = $connection->fetchOne('SHOW TABLES LIKE :table', ['table' => $table]);
return $result !== false && $result !== null;
}
/**
* Check if table belongs to old plugin.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
*
* @return bool
*/
public function isOldPluginTable(Connection $connection, string $table): bool {
$oldTableExclusiveColumns = [
'finalized_at' => 'datetime',
'refunded_at' => 'datetime',
'initial_transaction_mode' => 'varchar',
'manual_capture' => 'tinyint',
'partial_refunded_at' => 'datetime',
'refunded_amount' => 'double',
'amount_to_refund' => 'double',
];
$resultColumns = $connection->fetchAllAssociative(
'SELECT LOWER(COLUMN_NAME) AS column_name, LOWER(DATA_TYPE) AS data_type
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = :table',
['table' => $table]
);
$dbColumns = [];
foreach($resultColumns as $column) {
$dbColumns[$column['column_name']] = $column['data_type'];
}
$oldPluginTable = true;
foreach($oldTableExclusiveColumns as $columnName => $columnType) {
if(!isset($dbColumns[$columnName])) {
$oldPluginTable = false;
break;
}
if ($dbColumns[$columnName] !== $columnType) {
$oldPluginTable = false;
break;
}
}
return $oldPluginTable;
}
/**
* Synchronizes the transaction table with the current/latest version.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
*/
private function syncTransactionTable(Connection $connection, string $table): void {
$this->addColumnIfMissing($connection, $table, 'confirmation_email_sent', "TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`");
$this->addColumnIfMissing($connection, $table, 'erp_merchant_id', "VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`");
$this->addColumnIfMissing($connection, $table, 'data', "LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`data`)) AFTER `erp_merchant_id`");
$this->addColumnIfMissing($connection, $table, 'payment_method_id', "BINARY(16) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'order_id', "BINARY(16) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'order_transaction_id', "BINARY(16) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'space_id', "INT(10) UNSIGNED NOT NULL");
$this->addColumnIfMissing($connection, $table, 'state', "VARCHAR(255) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'sales_channel_id', "BINARY(16) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'transaction_id', "INT(10) UNSIGNED NOT NULL");
$this->addColumnIfMissing($connection, $table, 'order_version_id', "BINARY(16) NOT NULL AFTER `transaction_id`");
$this->addColumnIfMissing($connection, $table, 'created_at', "DATETIME(3) NOT NULL");
$this->addColumnIfMissing($connection, $table, 'updated_at', "DATETIME(3) DEFAULT NULL");
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.order_id', "KEY `fk.vrp_transaction.order_id` (`order_id`)");
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.order_transaction_id', "KEY `fk.vrp_transaction.order_transaction_id` (`order_transaction_id`)");
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.payment_method_id', "KEY `fk.vrp_transaction.payment_method_id` (`payment_method_id`)");
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.sales_channel_id', "KEY `fk.vrp_transaction.sales_channel_id` (`sales_channel_id`)");
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction', "KEY `fk.vrp_transaction` (`order_id`,`order_version_id`)");
$this->ensureForeignKey(
$connection,
$table,
'fk.vrp_transaction_order_id',
['order_id', 'order_version_id'],
'order',
['id', 'version_id'],
'CASCADE',
'CASCADE'
);
$this->ensureForeignKey(
$connection,
$table,
'fk.vrp_transaction_payment_method_id',
['payment_method_id'],
'payment_method',
['id'],
'RESTRICT',
'CASCADE'
);
$this->ensureForeignKey(
$connection,
$table,
'fk.vrp_transaction_sales_channel_id',
['sales_channel_id'],
'sales_channel',
['id'],
'RESTRICT',
'CASCADE'
);
}
/**
* Synchronizes the parts of the refund table related to transactions with the current/latest version.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
*/
private function syncRefundTable(Connection $connection, string $table): void {
$refundTable = 'vrpayment_refund';
$this->ensureIndexBySql($connection, $refundTable, 'fk.vrp_refund.transaction_id', "KEY `fk.vrp_refund.transaction_id` (`transaction_id`)");
$this->ensureForeignKey(
$connection,
$refundTable,
'fk.vrp_refund.transaction_id',
['transaction_id'],
$table,
['transaction_id'],
'CASCADE',
null
);
}
/**
* Adds column to the table if it's missing.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
* @param string $column
* @param string $sqlFragment
*/
private function addColumnIfMissing(Connection $connection, string $table, string $column, string $sqlFragment): void {
if ($this->columnExists($connection, $table, $column)) {
return;
}
$connection->executeStatement(
sprintf("ALTER TABLE `%s` ADD COLUMN `%s` %s", $table, $column, $sqlFragment)
);
}
/**
* Adds index to the table if it's missing.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
* @param string $indexName
* @param string $sqlFragment
*/
private function ensureIndexBySql(Connection $connection, string $table, string $indexName, string $sqlFragment): void {
if ($this->indexExists($connection, $table, $indexName)) {
return;
}
$connection->executeStatement(
sprintf("ALTER TABLE `%s` ADD %s", $table, $sqlFragment)
);
}
/**
* Adds foreign key constraint to the table if it's missing.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
* @param string $constraintName
* @param string $columns
* @param string $refTable
* @param string $refColumns
* @param string|null $onDelete
* @param string|null $onUpdate
*/
private function ensureForeignKey(
Connection $connection,
string $table,
string $constraintName,
array $columns,
string $refTable,
array $refColumns,
?string $onDelete,
?string $onUpdate
): void {
if ($this->foreignKeyExists($connection, $table, $constraintName)) {
return;
}
$columnsList = '`' . implode('`,`', $columns) . '`';
$refColumnsList = '`' . implode('`,`', $refColumns) . '`';
$connection->executeStatement(
sprintf(
"ALTER TABLE `%s`
ADD CONSTRAINT `%s` FOREIGN KEY (%s)
REFERENCES `%s` (%s)%s%s",
$table,
$constraintName,
$columnsList,
$refTable,
$refColumnsList,
$onDelete ? " ON DELETE {$onDelete}" : "",
$onUpdate ? " ON UPDATE {$onUpdate}" : ""
)
);
}
/**
* Check if foreign key constraint exists.
*
* @param \Doctrine\DBAL\Connection $connection
* @param string $table
* @param string $constraintName
*
* @return bool
*/
private function foreignKeyExists(Connection $connection, string $table, $constraintName): bool {
$result = $connection->fetchOne(
"SELECT 1 FROM information_schema.referential_constraints
WHERE constraint_schema = DATABASE()
AND table_name = ?
AND constraint_name = ?
LIMIT 1",
[$table,$constraintName]
);
return $result !== false && $result !== null;
}
/**
* update destructive changes
*
* @param \Doctrine\DBAL\Connection $connection
*/
public function updateDestructive(Connection $connection): void
{
// implement update destructive
}
}
@@ -70,14 +70,17 @@ Component.register('vrpayment-order-action-refund-by-amount', {
}); });
}).catch((errorResponse) => { }).catch((errorResponse) => {
try { try {
var errorTitle; var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
var errorMessage; var errorMessage;
if (errorResponse.response.data == 'refundExceedsAmount') { switch(errorResponse.response.data) {
errorTitle = this.$tc('vrpayment-order.refundAction.refundExceedsTotalError.title'); case 'refundAmountZero':
errorMessage = this.$tc('vrpayment-order.refundAction.refundExceedsTotalError.messageRefundAmountExceedsAvailableBalance'); errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundAmountIsZero');
} else { break;
errorTitle = errorResponse.response.data.errors[0].title; case 'refundExceedsAmount':
errorMessage = errorResponse.response.data.errors[0].detail; errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundAmountExceedsAvailableBalance');
break;
default:
errorMessage = errorResponse.response.data.errors[0].detail;
} }
this.createNotificationError({ this.createNotificationError({
title: errorTitle, title: errorTitle,
@@ -9,6 +9,7 @@
:max="this.$parent.$parent.itemRefundableQuantity" :max="this.$parent.$parent.itemRefundableQuantity"
:min="0" :min="0"
v-model="refundQuantity" v-model="refundQuantity"
number-type="int"
:label="$tc('vrpayment-order.refund.refundQuantity.label')"> :label="$tc('vrpayment-order.refund.refundQuantity.label')">
</mt-number-field> </mt-number-field>
@@ -68,9 +68,21 @@ Component.register('vrpayment-order-action-refund', {
}); });
}).catch((errorResponse) => { }).catch((errorResponse) => {
try { try {
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
var errorMessage;
switch(errorResponse.response.data) {
case 'refundQuantityZero':
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundQuantityIsZero');
break;
case 'refundExceedsQuantity':
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundQuantityExceedsAvailableBalance');
break;
default:
errorMessage = errorResponse.response.data.errors[0].detail;
}
this.createNotificationError({ this.createNotificationError({
title: errorResponse.response.data.errors[0].title, title: errorTitle,
message: errorResponse.response.data.errors[0].detail, message: errorMessage,
autoClose: false autoClose: false
}); });
} catch (e) { } catch (e) {
@@ -78,9 +78,12 @@
"successTitle": "Erfolg", "successTitle": "Erfolg",
"maxAvailableItemsToRefund": "Maximal Verfügbare Artikel zum Erstatten", "maxAvailableItemsToRefund": "Maximal Verfügbare Artikel zum Erstatten",
"maxAvailableAmountToRefund": "Maximal verfügbarer Erstattungsbetrag", "maxAvailableAmountToRefund": "Maximal verfügbarer Erstattungsbetrag",
"refundExceedsTotalError": { "refundCreateError": {
"title": "Fehler beim Erstellen der Rückerstattung.", "errorTitle": "Fehler beim Erstellen der Rückerstattung.",
"messageRefundAmountExceedsAvailableBalance": "Der Rückerstattungsbetrag übersteigt das verfügbare Guthaben." "messageRefundAmountExceedsAvailableBalance": "Der Rückerstattungsbetrag übersteigt das verfügbare Guthaben.",
"messageRefundAmountIsZero": "Der Rückerstattungsbetrag muss größer als 0 sein.",
"messageRefundQuantityExceedsAvailableBalance": "Rückerstattung nach Menge überschreitet die maximal verfügbare Anzahl an Artikeln zur Rückerstattung.",
"messageRefundQuantityIsZero": "Rückerstattung nach Menge muss größer als 0 sein."
} }
}, },
"transactionHistory": { "transactionHistory": {
@@ -9,7 +9,6 @@
"void": "Cancel authorization", "void": "Cancel authorization",
"refund-whole-line-item": "Refund whole line item", "refund-whole-line-item": "Refund whole line item",
"refund-line-item-by-quantity": "Refund by quantity", "refund-line-item-by-quantity": "Refund by quantity",
"refund-line-item-selected": "Rembourser sélectionnés",
"refund-line-item-selected": "Refund selected", "refund-line-item-selected": "Refund selected",
"refund-line-item-parial": "Partial refund" "refund-line-item-parial": "Partial refund"
} }
@@ -79,9 +78,12 @@
"successTitle": "Success", "successTitle": "Success",
"maxAvailableItemsToRefund": "Maximum available items to refund", "maxAvailableItemsToRefund": "Maximum available items to refund",
"maxAvailableAmountToRefund": "Maximum available amount to refund", "maxAvailableAmountToRefund": "Maximum available amount to refund",
"refundExceedsTotalError": { "refundCreateError": {
"title": "Error while creating the refund.", "errorTitle": "Error while creating the refund.",
"messageRefundAmountExceedsAvailableBalance": "Refund amount exceeds available balance." "messageRefundAmountExceedsAvailableBalance": "Refund amount exceeds available balance.",
"messageRefundAmountIsZero": "Refund amount must be greater than 0.",
"messageRefundQuantityExceedsAvailableBalance": "Refund by quantity exceeds maximum available items to refund.",
"messageRefundQuantityIsZero": "Refund by quantity must be greater than 0."
} }
}, },
"transactionHistory": { "transactionHistory": {
@@ -78,9 +78,12 @@
"successTitle": "Succès", "successTitle": "Succès",
"maxAvailableItemsToRefund": "Nombre maximum d'articles disponibles pour le remboursement", "maxAvailableItemsToRefund": "Nombre maximum d'articles disponibles pour le remboursement",
"maxAvailableAmountToRefund": "Montant maximal disponible pour le remboursement", "maxAvailableAmountToRefund": "Montant maximal disponible pour le remboursement",
"refundExceedsTotalError": { "refundCreateError": {
"title": "Erreur lors de la création du remboursement.", "errorTitle": "Erreur lors de la création du remboursement.",
"messageRefundAmountExceedsAvailableBalance": "Le montant du remboursement dépasse le solde disponible." "messageRefundAmountExceedsAvailableBalance": "Le montant du remboursement dépasse le solde disponible.",
"messageRefundAmountIsZero": "Le montant du remboursement doit être supérieur à 0.",
"messageRefundQuantityExceedsAvailableBalance": "Le remboursement par quantité dépasse le nombre maximal darticles remboursables.",
"messageRefundQuantityIsZero": "Le remboursement par quantité doit être supérieur à 0."
} }
}, },
"transactionHistory": { "transactionHistory": {
@@ -78,9 +78,12 @@
"successTitle": "Successo", "successTitle": "Successo",
"maxAvailableItemsToRefund": "Numero massimo di articoli disponibili da rimborsare", "maxAvailableItemsToRefund": "Numero massimo di articoli disponibili da rimborsare",
"maxAvailableAmountToRefund": "Importo massimo disponibile per il rimborso", "maxAvailableAmountToRefund": "Importo massimo disponibile per il rimborso",
"refundExceedsTotalError": { "refundCreateError": {
"title": "Errore durante la creazione del rimborso.", "errorTitle": "Errore durante la creazione del rimborso.",
"messageRefundAmountExceedsAvailableBalance": "LL'importo del rimborso supera il saldo disponibile." "messageRefundAmountExceedsAvailableBalance": "LL'importo del rimborso supera il saldo disponibile.",
"messageRefundAmountIsZero": "L'importo del rimborso deve essere superiore a 0.",
"messageRefundQuantityExceedsAvailableBalance": "Il rimborso per quantità supera il numero massimo di articoli rimborsabili.",
"messageRefundQuantityIsZero": "Il rimborso per quantità deve essere maggiore di 0."
} }
}, },
"transactionHistory": { "transactionHistory": {
@@ -7,16 +7,16 @@
:inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_WEBHOOKS_UPDATE_ENABLED]" :inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_WEBHOOKS_UPDATE_ENABLED]"
:customInheritationCheckFunction="checkBoolFieldInheritance"> :customInheritationCheckFunction="checkBoolFieldInheritance">
<template #content="props"> <template #content="props">
<mt-switch <sw-switch-field
:name="CONFIG_STOREFRONT_WEBHOOKS_UPDATE_ENABLED" :name="CONFIG_STOREFRONT_WEBHOOKS_UPDATE_ENABLED"
bordered bordered
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.advancedOptions.webhooksUpdateEnabled.label')" :label="$tc('vrpayment-settings.settingForm.advancedOptions.webhooksUpdateEnabled.label')"
:helpText="$tc('vrpayment-settings.settingForm.advancedOptions.webhooksUpdateEnabled.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.advancedOptions.webhooksUpdateEnabled.tooltipText')"
:disabled="props.isInherited" :disabled="props.isInherited"
:checked="props.currentValue" :value="props.currentValue"
@update:checked="props.updateCurrentValue"> @update:value="props.updateCurrentValue">
</mt-switch> </sw-switch-field>
</template> </template>
</sw-inherit-wrapper> </sw-inherit-wrapper>
@@ -25,16 +25,16 @@
:inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_PAYMENTS_UPDATE_ENABLED]" :inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_PAYMENTS_UPDATE_ENABLED]"
:customInheritationCheckFunction="checkBoolFieldInheritance"> :customInheritationCheckFunction="checkBoolFieldInheritance">
<template #content="props"> <template #content="props">
<mt-switch <sw-switch-field
:name="CONFIG_STOREFRONT_PAYMENTS_UPDATE_ENABLED" :name="CONFIG_STOREFRONT_PAYMENTS_UPDATE_ENABLED"
bordered bordered
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.advancedOptions.paymentsUpdateEnabled.label')" :label="$tc('vrpayment-settings.settingForm.advancedOptions.paymentsUpdateEnabled.label')"
:helpText="$tc('vrpayment-settings.settingForm.advancedOptions.paymentsUpdateEnabled.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.advancedOptions.paymentsUpdateEnabled.tooltipText')"
:disabled="props.isInherited" :disabled="props.isInherited"
:checked="props.currentValue" :value="props.currentValue"
@update:checked="props.updateCurrentValue"> @update:value="props.updateCurrentValue">
</mt-switch> </sw-switch-field>
</template> </template>
</sw-inherit-wrapper> </sw-inherit-wrapper>
</div> </div>
@@ -14,8 +14,8 @@
{% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_space_id %} {% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_space_id %}
<sw-inherit-wrapper <sw-inherit-wrapper
v-model:value="actualConfigData[CONFIG_SPACE_ID]" v-model:value="actualConfigData[CONFIG_SPACE_ID]"
:inheritedValue="selectedSalesChannelId === null ? null : allConfigs['null'][CONFIG_SPACE_ID]" :inheritedValue="getInheritedValue(CONFIG_SPACE_ID)"
:customInheritationCheckFunction="checkNumberFieldInheritance"> @update:value="onSwitchInput">
<template #content="props"> <template #content="props">
<mt-number-field <mt-number-field
:name="CONFIG_SPACE_ID" :name="CONFIG_SPACE_ID"
@@ -23,7 +23,7 @@
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.credentials.spaceId.label')" :label="$tc('vrpayment-settings.settingForm.credentials.spaceId.label')"
:helpText="$tc('vrpayment-settings.settingForm.credentials.spaceId.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.credentials.spaceId.tooltipText')"
:disabled="props.isInherited || !acl.can('vrpayment.editor')" :disabled="!acl.can('vrpayment.editor')"
:model-value="props.currentValue" :model-value="props.currentValue"
:error="spaceIdErrorState" :error="spaceIdErrorState"
@update:model-value="props.updateCurrentValue"> @update:model-value="props.updateCurrentValue">
@@ -35,7 +35,7 @@
{% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_user_id %} {% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_user_id %}
<sw-inherit-wrapper <sw-inherit-wrapper
v-model:value="actualConfigData[CONFIG_USER_ID]" v-model:value="actualConfigData[CONFIG_USER_ID]"
:inheritedValue="selectedSalesChannelId === null ? null : allConfigs['null'][CONFIG_USER_ID]" :inheritedValue="getInheritedValue(CONFIG_USER_ID)"
:customInheritationCheckFunction="checkNumberFieldInheritance"> :customInheritationCheckFunction="checkNumberFieldInheritance">
<template #content="props"> <template #content="props">
<mt-number-field <mt-number-field
@@ -44,7 +44,7 @@
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.credentials.userId.label')" :label="$tc('vrpayment-settings.settingForm.credentials.userId.label')"
:helpText="$tc('vrpayment-settings.settingForm.credentials.userId.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.credentials.userId.tooltipText')"
:disabled="props.isInherited || !acl.can('vrpayment.editor')" :disabled="!acl.can('vrpayment.editor')"
:model-value="props.currentValue" :model-value="props.currentValue"
:error="userIdErrorState" :error="userIdErrorState"
@update:model-value="props.updateCurrentValue"> @update:model-value="props.updateCurrentValue">
@@ -56,7 +56,7 @@
{% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_application_key %} {% block vrpayment_settings_content_card_channel_config_credentials_card_container_settings_application_key %}
<sw-inherit-wrapper <sw-inherit-wrapper
v-model:value="actualConfigData[CONFIG_APPLICATION_KEY]" v-model:value="actualConfigData[CONFIG_APPLICATION_KEY]"
:inheritedValue="selectedSalesChannelId === null ? null : allConfigs['null'][CONFIG_APPLICATION_KEY]" :inheritedValue="getInheritedValue(CONFIG_APPLICATION_KEY)"
:customInheritationCheckFunction="checkTextFieldInheritance"> :customInheritationCheckFunction="checkTextFieldInheritance">
<template #content="props"> <template #content="props">
<mt-password-field <mt-password-field
@@ -66,7 +66,7 @@
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.credentials.applicationKey.label')" :label="$tc('vrpayment-settings.settingForm.credentials.applicationKey.label')"
:helpText="$tc('vrpayment-settings.settingForm.credentials.applicationKey.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.credentials.applicationKey.tooltipText')"
:disabled="props.isInherited || !acl.can('vrpayment.editor')" :disabled="!acl.can('vrpayment.editor')"
:model-value="props.currentValue" :model-value="props.currentValue"
:error="applicationKeyErrorState" :error="applicationKeyErrorState"
@update:model-value="props.updateCurrentValue"> @update:model-value="props.updateCurrentValue">
@@ -6,7 +6,7 @@ import constants from '../../page/vrpayment-settings/configuration-constants'
const {Component, Mixin} = Shopware; const {Component, Mixin} = Shopware;
Component.register('sw-vrpayment-credentials', { Component.register('sw-vrpayment-credentials', {
template: template, template,
name: 'VRPaymentCredentials', name: 'VRPaymentCredentials',
@@ -29,7 +29,9 @@ Component.register('sw-vrpayment-credentials', {
}, },
selectedSalesChannelId: { selectedSalesChannelId: {
required: true type: [String, null],
required: false,
default: null
}, },
spaceIdFilled: { spaceIdFilled: {
type: Boolean, type: Boolean,
@@ -68,38 +70,42 @@ Component.register('sw-vrpayment-credentials', {
}; };
}, },
computed: {
currentConfig() {
if (this.selectedSalesChannelId && this.allConfigs[this.selectedSalesChannelId]) {
return this.allConfigs[this.selectedSalesChannelId];
}
return this.allConfigs['null'] || {};
}
},
methods: { methods: {
checkTextFieldInheritance(value) {
return !value || value.length <= 0;
},
checkTextFieldInheritance(value) { checkNumberFieldInheritance(value) {
if (typeof value !== 'string') { return value == null || value === '';
return true; },
}
return value.length <= 0; checkBoolFieldInheritance(value) {
}, return typeof value !== 'boolean';
},
checkNumberFieldInheritance(value) {
if (typeof value !== 'number') {
return true;
}
return value.length <= 0;
},
checkBoolFieldInheritance(value) {
return typeof value !== 'boolean';
},
// Emits the 'check-api-connection-event' with the current API connection parameters. // Emits the 'check-api-connection-event' with the current API connection parameters.
// Used to trigger API connection testing from this component. // Used to trigger API connection testing from this component.
emitCheckApiConnectionEvent() { emitCheckApiConnectionEvent() {
const apiConnectionParams = { const apiConnectionParams = {
spaceId: this.actualConfigData[constants.CONFIG_SPACE_ID], spaceId: this.currentConfig[constants.CONFIG_SPACE_ID],
userId: this.actualConfigData[constants.CONFIG_USER_ID], userId: this.currentConfig[constants.CONFIG_USER_ID],
applicationKey: this.actualConfigData[constants.CONFIG_APPLICATION_KEY] applicationKey: this.currentConfig[constants.CONFIG_APPLICATION_KEY]
}; };
this.$emit('check-api-connection-event', apiConnectionParams); this.$emit('check-api-connection-event', apiConnectionParams);
},
getInheritedValue(key) {
return this.allConfigs['null']?.[key] ?? null;
} }
} }
}); });
@@ -55,16 +55,16 @@
:inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_LINE_ITEM_CONSISTENCY_ENABLED]" :inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_LINE_ITEM_CONSISTENCY_ENABLED]"
:customInheritationCheckFunction="checkBoolFieldInheritance"> :customInheritationCheckFunction="checkBoolFieldInheritance">
<template #content="props"> <template #content="props">
<mt-switch <sw-switch-field
:name="CONFIG_LINE_ITEM_CONSISTENCY_ENABLED" :name="CONFIG_LINE_ITEM_CONSISTENCY_ENABLED"
bordered bordered
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.options.lineItemConsistencyEnabled.label')" :label="$tc('vrpayment-settings.settingForm.options.lineItemConsistencyEnabled.label')"
:helpText="$tc('vrpayment-settings.settingForm.options.lineItemConsistencyEnabled.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.options.lineItemConsistencyEnabled.tooltipText')"
:disabled="props.isInherited" :disabled="props.isInherited"
:checked="props.currentValue" :value="props.currentValue"
@update:checked="props.updateCurrentValue"> @update:value="props.updateCurrentValue">
</mt-switch> </sw-switch-field>
</template> </template>
</sw-inherit-wrapper> </sw-inherit-wrapper>
{% endblock %} {% endblock %}
@@ -75,16 +75,16 @@
:inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_EMAIL_ENABLED]" :inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_EMAIL_ENABLED]"
:customInheritationCheckFunction="checkBoolFieldInheritance"> :customInheritationCheckFunction="checkBoolFieldInheritance">
<template #content="props"> <template #content="props">
<mt-switch <sw-switch-field
:name="CONFIG_EMAIL_ENABLED" :name="CONFIG_EMAIL_ENABLED"
bordered bordered
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.options.emailEnabled.label')" :label="$tc('vrpayment-settings.settingForm.options.emailEnabled.label')"
:helpText="$tc('vrpayment-settings.settingForm.options.emailEnabled.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.options.emailEnabled.tooltipText')"
:disabled="props.isInherited" :disabled="props.isInherited"
:checked="props.currentValue" :value="props.currentValue"
@update:checked="props.updateCurrentValue"> @update:value="props.updateCurrentValue">
</mt-switch> </sw-switch-field>
</template> </template>
</sw-inherit-wrapper> </sw-inherit-wrapper>
{% endblock %} {% endblock %}
@@ -7,16 +7,16 @@
:inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_INVOICE_DOWNLOAD_ENABLED]" :inheritedValue="selectedSalesChannelId == null ? null : allConfigs['null'][CONFIG_STOREFRONT_INVOICE_DOWNLOAD_ENABLED]"
:customInheritationCheckFunction="checkBoolFieldInheritance"> :customInheritationCheckFunction="checkBoolFieldInheritance">
<template #content="props"> <template #content="props">
<mt-switch <sw-switch-field
:name="CONFIG_STOREFRONT_INVOICE_DOWNLOAD_ENABLED" :name="CONFIG_STOREFRONT_INVOICE_DOWNLOAD_ENABLED"
bordered bordered
:mapInheritance="props" :mapInheritance="props"
:label="$tc('vrpayment-settings.settingForm.storefrontOptions.invoiceDownloadEnabled.label')" :label="$tc('vrpayment-settings.settingForm.storefrontOptions.invoiceDownloadEnabled.label')"
:helpText="$tc('vrpayment-settings.settingForm.storefrontOptions.invoiceDownloadEnabled.tooltipText')" :helpText="$tc('vrpayment-settings.settingForm.storefrontOptions.invoiceDownloadEnabled.tooltipText')"
:disabled="props.isInherited" :disabled="props.isInherited"
:checked="props.currentValue" :value="props.currentValue"
@update:checked="props.updateCurrentValue"> @update:value="props.updateCurrentValue">
</mt-switch> </sw-switch-field>
</template> </template>
</sw-inherit-wrapper> </sw-inherit-wrapper>
</div> </div>
@@ -1,146 +1,145 @@
{% block vrpayment_settings %} {% block vrpayment_settings %}
<sw-page class="vrpayment-settings"> <sw-page class="vrpayment-settings">
{% block vrpayment_settings_header %} {% block vrpayment_settings_header %}
<template #smart-bar-header> <template #smart-bar-header>
<h2> <h2>
{{ $tc('sw-settings.index.title') }} {{ $tc('sw-settings.index.title') }}
<mt-icon name="small-arrow-medium-right" size="16px"></mt-icon> <mt-icon name="small-arrow-medium-right" size="16px"></mt-icon>
{{ $tc('vrpayment-settings.header') }} {{ $tc('vrpayment-settings.header') }}
</h2> </h2>
</template> </template>
{% endblock %} {% endblock %}
{% block vrpayment_settings_actions %} {% block vrpayment_settings_actions %}
<template #smart-bar-actions> <template #smart-bar-actions>
{% block vrpayment_settings_actions_save %} {% block vrpayment_settings_actions_save %}
<mt-button <mt-button
v-model:value="isSaveSuccessful" v-model:value="isSaveSuccessful"
class="sw-settings-login-registration__save-action" class="sw-settings-login-registration__save-action"
variant="primary" variant="primary"
:isLoading="isLoading" :isLoading="isLoading"
:disabled="isLoading" :disabled="isLoading"
@click="onSave"> @click="onSave">
{{ $tc('vrpayment-settings.settingForm.save') }} {{ $tc('vrpayment-settings.settingForm.save') }}
</mt-button> </mt-button>
{% endblock %} {% endblock %}
</template> </template>
{% endblock %} {% endblock %}
{% block vrpayment_settings_content %} {% block vrpayment_settings_content %}
<template #content> <template #content>
{% block vrpayment_settings_content_card %} {% block vrpayment_settings_content_card %}
<mt-card-view> <mt-card-view>
{% block vrpayment_settings_content_card_channel_config %} {% block vrpayment_settings_content_card_channel_config %}
<sw-sales-channel-config v-model:value="config" <sw-sales-channel-config v-model:value="config"
ref="configComponent" ref="configComponent"
:domain="CONFIG_DOMAIN"> :domain="CONFIG_DOMAIN">
{% block vrpayment_settings_content_card_channel_config_sales_channel %} {% block vrpayment_settings_content_card_channel_config_sales_channel %}
<template #select="{ onInput, selectedSalesChannelId, salesChannel }"> <template #select="{ onInput, selectedSalesChannelId, salesChannel }">
{% block vrpayment_settings_content_card_channel_config_sales_channel_card %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card %}
<mt-card title="Sales Channel Switch"> <mt-card title="Sales Channel Switch">
{% block vrpayment_settings_content_card_channel_config_sales_channel_card_title %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card_title %}
<sw-entity-single-select <sw-single-select
v-model:value="selectedSalesChannelId" :value="selectedSalesChannelId"
labelProperty="translated.name" :options="salesChannel.map(sc => ({ id: sc.id, name: sc.translated.name }))"
valueProperty="id" labelProperty="name"
:mapInheritance="props" valueProperty="id"
:isLoading="isLoading" :isLoading="isLoading"
entity="sales_channel" @update:value="onInput"
@update:value="onInput"> />
</sw-entity-single-select> {% endblock %}
{% endblock %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer %}
{% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer %} <template #footer>
<template #footer>
{% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container %}
<sw-container columns="2fr 1fr" gap="0px 30px"> <sw-container columns="2fr 1fr" gap="0px 30px">
{% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container_text %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container_text %}
<p>{{ $tc('vrpayment-settings.salesChannelCard.button.description') }}</p> <p>{{ $tc('vrpayment-settings.salesChannelCard.button.description') }}</p>
{% endblock %} {% endblock %}
{% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container_button %} {% block vrpayment_settings_content_card_channel_config_sales_channel_card_footer_container_button %}
<sw-button <sw-button
variant="primary" variant="primary"
v-model:value="isSetDefaultPaymentSuccessful" v-model:value="isSetDefaultPaymentSuccessful"
:isLoading="isSettingDefaultPaymentMethods" :isLoading="isSettingDefaultPaymentMethods"
@click="onSetPaymentMethodDefault"> @click="onSetPaymentMethodDefault">
{{ $tc('vrpayment-settings.salesChannelCard.button.label') }} {{ $tc('vrpayment-settings.salesChannelCard.button.label') }}
</sw-button> </sw-button>
{% endblock %} {% endblock %}
</sw-container> </sw-container>
{% endblock %} {% endblock %}
</template> </template>
{% endblock %} {% endblock %}
</mt-card> </mt-card>
{% endblock %} {% endblock %}
</template> </template>
{% endblock %} {% endblock %}
{% block vrpayment_settings_content_card_channel_config_cards %} {% block vrpayment_settings_content_card_channel_config_cards %}
<template #content="{ actualConfigData, allConfigs, selectedSalesChannelId }"> <template #content="{ actualConfigData, allConfigs, selectedSalesChannelId }">
<div v-if="actualConfigData"> <div v-if="actualConfigData">
<sw-vrpayment-credentials <sw-vrpayment-credentials
:actualConfigData="actualConfigData" :actualConfigData="actualConfigData"
:allConfigs="allConfigs" :allConfigs="allConfigs"
:selectedSalesChannelId="selectedSalesChannelId" :selectedSalesChannelId="selectedSalesChannelId"
:spaceIdErrorState="spaceIdErrorState" :spaceIdErrorState="spaceIdErrorState"
:userIdErrorState="userIdErrorState" :userIdErrorState="userIdErrorState"
:applicationKeyErrorState="applicationKeyErrorState" :applicationKeyErrorState="applicationKeyErrorState"
:spaceIdFilled="spaceIdFilled" :spaceIdFilled="spaceIdFilled"
:userIdFilled="userIdFilled" :userIdFilled="userIdFilled"
:applicationKeyFilled="applicationKeyFilled" :applicationKeyFilled="applicationKeyFilled"
:isLoading="isLoading" :isLoading="isLoading"
:isTesting="isTesting" :isTesting="isTesting"
@check-api-connection-event="onCheckApiConnection" @check-api-connection-event="onCheckApiConnection"
></sw-vrpayment-credentials> ></sw-vrpayment-credentials>
<sw-vrpayment-options <sw-vrpayment-options
:actualConfigData="actualConfigData" :actualConfigData="actualConfigData"
:allConfigs="allConfigs" :allConfigs="allConfigs"
:isLoading="isLoading" :isLoading="isLoading"
:selectedSalesChannelId="selectedSalesChannelId" :selectedSalesChannelId="selectedSalesChannelId"
> >
</sw-vrpayment-options> </sw-vrpayment-options>
<sw-vrpayment-storefront-options <sw-vrpayment-storefront-options
:actualConfigData="actualConfigData" :actualConfigData="actualConfigData"
:allConfigs="allConfigs" :allConfigs="allConfigs"
:isLoading="isLoading" :isLoading="isLoading"
:selectedSalesChannelId="selectedSalesChannelId" :selectedSalesChannelId="selectedSalesChannelId"
> >
</sw-vrpayment-storefront-options> </sw-vrpayment-storefront-options>
<sw-vrpayment-advanced-options <sw-vrpayment-advanced-options
:actualConfigData="actualConfigData" :actualConfigData="actualConfigData"
:allConfigs="allConfigs" :allConfigs="allConfigs"
:isLoading="isLoading" :isLoading="isLoading"
:selectedSalesChannelId="selectedSalesChannelId" :selectedSalesChannelId="selectedSalesChannelId"
> >
</sw-vrpayment-advanced-options> </sw-vrpayment-advanced-options>
</div> </div>
</template> </template>
{% endblock %} {% endblock %}
</sw-sales-channel-config> </sw-sales-channel-config>
{% endblock %} {% endblock %}
{% block vrpayment_settings_content_card_loading %} {% block vrpayment_settings_content_card_loading %}
<mt-loader v-if="isLoading"></mt-loader> <mt-loader v-if="isLoading"></mt-loader>
{% endblock %} {% endblock %}
</mt-card-view> </mt-card-view>
{% endblock %} {% endblock %}
</template> </template>
{% endblock %} {% endblock %}
</sw-page> </sw-page>
{% endblock %} {% endblock %}
@@ -68,7 +68,7 @@ Component.register('vrpayment-settings', {
watch: { watch: {
config: { config: {
handler(configData) { handler(configData) {
const defaultConfig = this.$refs.configComponent.allConfigs.null; const defaultConfig = (this.$refs.configComponent.allConfigs || {}).null || {};
const salesChannelId = this.$refs.configComponent.selectedSalesChannelId; const salesChannelId = this.$refs.configComponent.selectedSalesChannelId;
if (salesChannelId === null) { if (salesChannelId === null) {
File diff suppressed because one or more lines are too long
@@ -10,6 +10,7 @@
<service id="VRPaymentPayment\Core\Api\Refund\Controller\RefundController" public="true"> <service id="VRPaymentPayment\Core\Api\Refund\Controller\RefundController" public="true">
<argument type="service" id="VRPaymentPayment\Core\Api\Refund\Service\RefundService"/> <argument type="service" id="VRPaymentPayment\Core\Api\Refund\Service\RefundService"/>
<argument type="service" id="VRPaymentPayment\Core\Settings\Service\SettingsService"/> <argument type="service" id="VRPaymentPayment\Core\Settings\Service\SettingsService"/>
<argument type="service" id="VRPaymentPayment\Core\Api\Transaction\Service\TransactionService"/>
<call method="setLogger"> <call method="setLogger">
<argument type="service" id="monolog.logger.vrpayment_payment"/> <argument type="service" id="monolog.logger.vrpayment_payment"/>
</call> </call>
@@ -31,6 +31,7 @@
<argument id="VRPaymentPayment\Core\Api\Transaction\Service\TransactionService" type="service"/> <argument id="VRPaymentPayment\Core\Api\Transaction\Service\TransactionService" type="service"/>
<argument id="VRPaymentPayment\Core\Settings\Service\SettingsService" type="service"/> <argument id="VRPaymentPayment\Core\Settings\Service\SettingsService" type="service"/>
<argument id="VRPaymentPayment\Core\Util\PaymentMethodUtil" type="service"/> <argument id="VRPaymentPayment\Core\Util\PaymentMethodUtil" type="service"/>
<argument id="payment_method.repository" type="service"/>
<call method="setLogger"> <call method="setLogger">
<argument type="service" id="monolog.logger.vrpayment_payment"/> <argument type="service" id="monolog.logger.vrpayment_payment"/>
</call> </call>
@@ -0,0 +1,25 @@
{
"base": "/bundles/vrpaymentpayment/administration/",
"entryPoints": {
"v-r-payment-payment": {
"css": [
"/bundles/vrpaymentpayment/administration/assets/v-r-payment-payment-D4AH6HY2.css"
],
"dynamic": [],
"js": [
"/bundles/vrpaymentpayment/administration/assets/v-r-payment-payment-Cp2eQSV_.js"
],
"legacy": false,
"preload": []
}
},
"legacy": false,
"metadatas": {},
"version": [
"7.1.0",
7,
1,
0
],
"viteServer": null
}
@@ -0,0 +1,11 @@
{
"main.js": {
"file": "assets/v-r-payment-payment-Cp2eQSV_.js",
"name": "v-r-payment-payment",
"src": "main.js",
"isEntry": true,
"css": [
"assets/v-r-payment-payment-D4AH6HY2.css"
]
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.sw-order-detail .sw-tabs{margin-top:40px}.sw-order-detail .sw-order-detail-base .mt-card-view__content{overflow-x:visible;overflow-y:visible}.vrpayment-order-detail__data{display:grid}.vrpayment-order-detail__heading{padding-top:15px}