From 539c330da686541ae35df4d9233f409418996b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Wed, 27 Mar 2019 14:40:03 +0100 Subject: [PATCH 001/107] change author to plentysystems AG --- meta/documents/changelog_de.md | 92 +++++++++++++++++- meta/documents/changelog_en.md | 91 ++++++++++++++++- meta/documents/support_contact_de.md | 6 +- meta/documents/support_contact_en.md | 6 +- meta/images/icon_author_md.png | Bin 3228 -> 18603 bytes meta/images/icon_author_sm.png | Bin 3228 -> 7193 bytes meta/images/icon_author_xs.png | Bin 3228 -> 768 bytes plugin.json | 6 +- .../Api/Request/DataProviderAbstract.php | 2 +- 9 files changed, 187 insertions(+), 16 deletions(-) mode change 100644 => 100755 meta/images/icon_author_md.png mode change 100644 => 100755 meta/images/icon_author_sm.png mode change 100644 => 100755 meta/images/icon_author_xs.png diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 7268c364..a39e3686 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,2 +1,90 @@ -Das Changelog wird zentralisiert in [github](https://github.com/PAYONE-GmbH/plentymarkets-7/blob/master/CHANGELOG.md) -gepflegt, das es sich um ein Open Source Projekt handelt. \ No newline at end of file +# Release Notes BS Payone + +## 1.1.0 (2019-03-27) + +### Geändert +- Supportübernahme durch plentysystems +- Icons getauscht und Beschreibungen aktualisiert/ergänzt + + +## 1.0.9 (2018-04-10) + +### Changed +- user_guide alert Text + + +## 1.0.8 (2018-25-09) + +### Changed +- Support Tab information +- Changelog + + +## 1.0.7 (2018-20-09) + +### Updated +- config.json / new Pluginformat + +### Added +- Translations + +### Changed +- Userguide +- guzzle/httpguzzle Version in dependency for PayPal compatibility + + +## 1.0.6 (2018-05-15) + +### Added +- Sofort display in frontend +- Paydirekt display in frontend +- invoice secure display in frontend +- PayPal display in frontend + +### Changed +- improve rendering of payment error popup + + +## 1.0.5 (2018-04-06) + +### Changed +- Logos and plugin name + + +## 1.0.4 (2018-03-27) + +### Changed +- documentation + + +## 1.0.3 (2018-03-26) + +### Added +- english documentation + +### Changed +- use current payone php api + + +## 1.0.2 (2018-03-21) + +### Changed +- use Scriptloader to include payone scripts in template + + +## 1.0.1 (2018-03-01) + +### Changed +- update plugin documentation + + +## 1.0.1 (2018-03-01) + +Plugin release supporting following payment methods: + +- invoice +- pre payment +- cash on delivery +- debit payment +- credit card +- credit card 3DS \ No newline at end of file diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index f37abed3..a39e3686 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1 +1,90 @@ -The changelog will be maintained at [github](https://github.com/PAYONE-GmbH/plentymarkets-7/blob/master/CHANGELOG.md). \ No newline at end of file +# Release Notes BS Payone + +## 1.1.0 (2019-03-27) + +### Geändert +- Supportübernahme durch plentysystems +- Icons getauscht und Beschreibungen aktualisiert/ergänzt + + +## 1.0.9 (2018-04-10) + +### Changed +- user_guide alert Text + + +## 1.0.8 (2018-25-09) + +### Changed +- Support Tab information +- Changelog + + +## 1.0.7 (2018-20-09) + +### Updated +- config.json / new Pluginformat + +### Added +- Translations + +### Changed +- Userguide +- guzzle/httpguzzle Version in dependency for PayPal compatibility + + +## 1.0.6 (2018-05-15) + +### Added +- Sofort display in frontend +- Paydirekt display in frontend +- invoice secure display in frontend +- PayPal display in frontend + +### Changed +- improve rendering of payment error popup + + +## 1.0.5 (2018-04-06) + +### Changed +- Logos and plugin name + + +## 1.0.4 (2018-03-27) + +### Changed +- documentation + + +## 1.0.3 (2018-03-26) + +### Added +- english documentation + +### Changed +- use current payone php api + + +## 1.0.2 (2018-03-21) + +### Changed +- use Scriptloader to include payone scripts in template + + +## 1.0.1 (2018-03-01) + +### Changed +- update plugin documentation + + +## 1.0.1 (2018-03-01) + +Plugin release supporting following payment methods: + +- invoice +- pre payment +- cash on delivery +- debit payment +- credit card +- credit card 3DS \ No newline at end of file diff --git a/meta/documents/support_contact_de.md b/meta/documents/support_contact_de.md index 3d344521..638557f3 100644 --- a/meta/documents/support_contact_de.md +++ b/meta/documents/support_contact_de.md @@ -1,5 +1,3 @@ -## Support +## Webseite -Zwischen arvatis media und Payone besteht für dieses Plugin keine Support- und Wartungsvereinbarung. -Bitte wenden Sie sich bei Fragem oder Problemen direkt an [Payone](https://www.bspayone.com/DE/de/contact-germany), -über E-Mail [tech.support@bspayone.com](mailto:tech.support@bspayone.com) oder Telefon [+49 431 25968-500](tel:+49 431 25968-500). \ No newline at end of file +[https://www.plentymarkets.eu/](https://www.plentymarkets.eu/) \ No newline at end of file diff --git a/meta/documents/support_contact_en.md b/meta/documents/support_contact_en.md index 6f146ef0..00c81cc2 100644 --- a/meta/documents/support_contact_en.md +++ b/meta/documents/support_contact_en.md @@ -1,5 +1,3 @@ -## Support +## Web page -arvatis media and Payone have no Support- and Maintenancecontract. -Please contact [Payone](https://www.bspayone.com/DE/en/contact-germany) if you experience any Problems or have a Question. -Or contact Payone via E-Mail [tech.support@bspayone.com](mailto:tech.support@bspayone.com) or Phone: [+49 431 25968-500](tel:+49 431 25968-500). \ No newline at end of file +[https://www.plentymarkets.co.uk/](https://www.plentymarkets.co.uk/) \ No newline at end of file diff --git a/meta/images/icon_author_md.png b/meta/images/icon_author_md.png old mode 100644 new mode 100755 index 7c3277b780b5d8ec05fe097a45dc171b37493ad6..99a33d1145db783d33d40e55149f6ba8ae1f2e54 GIT binary patch literal 18603 zcmc$Ghd-6?|NnIk$KHDrI%JPfDGr@N9U*&UuaK1_^BCDPdlVsiQ^-2Dlr1ZJyh+O5 z>v#Kn|A=2bdhocr&V60i>w3-S>v^3p^(RW?BrGHV0CE*&^iu%f(64YnL;(HR^B6sW zeh`>HRzicztG`)I`SH*bVrOOjm(VB1ul~Ul`O`h1hlFk_st*Vk;KZb)_!m8q#sF{u z6|{nu$JEBm8`Edn_0n6b&rW$&ZTQ)_?yb62e0uR@xTeNHh$|b*H6O$kJ|C170N15D z+q+{duW+8RPvVKt5HZ*yp&(=Yl=YPEscrhp;iM#K)hFESOn360_Zx2>DhW!sDZA!< zKJfLuRQR==VN=>P-Y_=n^#U9E|NW1xd=NENT#Sy{MvoksT3XQ9{lECQNbHosTV@JC zVjq=KO0p+l8A06M=Y!If+?j#%)ABL^G@8N?AD_J@E=$O z1Bw;ftynB9i&bLeo@=iOLjYG?BFZ`8&i~CM!Vu}aacG(Uka_BbicbvMb z!Ah{19(ADY@XQ>BLhnh~i@oS^9642imBGXW%=rd5=+Ds>DVM~CX?lQ)`tL}Ra;8J+ z1;7nyTznvz*0KrlcDplnQ1$a0UoiC`?1^0-dErB(0^Vmf+AbT_b!q$kivr4vQ)>;* z3EI8cTKMnw$rETZjXwk4NKJD2nDyuC6tpH{f(W=7b7yH%(saOTXOXE+2LHp$MwWex zNm58Q$I|w!vv$MDa97b01OJ$+fR%Ty790Ds5Lxy1W(n?HqrPwDa{n$4~Hdq?k# zwVmsA!;Q|iN0<+6X>Iw4ook2y-?MnXn^XOsNTqTi?(QgcW>;2pzazhIE zUrUgI<$A;qKTsFL9F<(&pjYJL? z1JDxp%Ith%oR8Ea@9AWkU*XW01d^>b-#;q`K|7Xt;U6IJhTbn6Nt zh3PCd@x%h2Cj`+Km-lg9^5<|dZqZqiAxqB?#HKik; zzlXSy5EtR^*XC>yZ1f^4Q{d#k=8KG+BO=q12n^G%EC>;ga#d~EkgC}BG~{+cU&^tf=tk2|s0j#b)#~oh7U0&O(cMBoY$# zk|kiYUHw=b%Of~-16>EFlKdlHUna74+5}g{v6@lGYlH zQsntFrV)5&K+)cBsy`Dn+g0C#=0X-dkQ&VJj28TFA2DsG!QMJivqRyYqPl&0;1(}y z?!dZKlfJ*NQE}a?H7Yvk3aLdNo2Qvt^Y<~?*~K77iSR!%jQZrWvU4i7*qSrqP)DW(TqN(Mv=u2KEM6e z$E%c^(hz`stwUD8{+&$0XFq)B8ZUN(dN>tcQ{Ew~dSjZ3)~R#*Z%pgbfnZO6@_D%d z({$YZ;fS_01PbvPIh?$u-E@q z{qnT8B=_f^$qE61TYngf4`Ir(zKV;|IO?(B8}V5uw8(|X1uq((ZgB#6W;*wOmv;qh zzN9XH5(2mWy!IWtd`Cf@#y4pO?6&pPHSHa_L z4$@{~fNNBFeGxw?mWah^SQpmzda%KJgL#1`mBS$9(-%%Z;g19|4M#PEq*$6Bf^QL# z#K|YV@1y`JHgxiIO8=ZK-nkKAf7p;*+$O9zKTVf-88hia4!v#CE5~HL<*=#hb;{

rhfmDqjR6N9EF`6G@n(nL7CO*Nr8 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 literal 3228 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 literal 3228 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 literal 3228 zcmV;N3}f?&P)4fA39ZlFTF|nUDkm17Sy2A*jfrAP6piTC1G8)p%+>R$O}OcI;_; zwAQv-Ev>fJw#OW8s}@nwqJomR999KE1(8LF3=l%r$ugPD+CK&gQalj2@6GbQ-=7|t z$-D12-@Es|@B6OCsZi;412cdNfRVsZzzx_DQk4+U1Z)Sk0M$Sh6`rQ}+=sL$2)qS6MTMtItyGoXbAW}wL>XtxvKF|D3eURJld9622|RWvI%zVlmL~>0 z3EWGCr>px?ReJjZOMr42OW_zc0GCtY*?aO*ReA>lRX{%(KjB;01I(bpv-8AK#Us=z z5lT2ou_hlIv9#mNp;pNwPw3{OaPrY}Ed7}O;V}_P=qBZdyg5#!ifimSqN z4{tXd9jO+IP{Jvq9rEX>$6tJ>TsAg^(_!KvkNy{_7RZX*tublllcRjcwDxG{w=;>lx6z@yj;`Cn|lKUA~BIFl^$*L2V`^W@Ep!9O3pqa zt)VC{?CRv1ZS8Do3W-$7O14eomSHY_GBTIG364tLVP#zxzunx%o8AC1kt#`68#>%P zG>4y$&81hiEoHA`Q&WfsHu!jZUqGZvBr|$vvheJDMirz_vPD&G7Yo)l^QA8=QkjW6 zQ|Ixs^0;xZD=jCxp=gXpH@ETNrZz$;wl9&AQq3&QW@y@IwO9%xp)@|pbImKK%(3v`O+*Eqpy?DNxS*2N64QGbNKhJYB z#%<^R^}eKEA*Mv6>Yrm{)g{H26zXX19hJ+XX@xj+O{6*%% z^{w6E`Kj)tdV!u)Qr$l$m${xSv80<6ICTCoHF@S&NwZF$Qj*ET097^5Q`C3GlTGvA@((4k*W2K`+&N}V>6Wo19DS0=X%bMcpL9U|4?dDQb$3legJ zHa3M=u|L47gF)8T2dV3fobl%!i z#w5WDtIohUuk-YO^Zj|`DNK$H^@b<-TYt4-?w*g^Xg`6 zOEs~`!RkwkO_>jT=?nAg&suqDcPBxE(@9(z8rKYTa^L7&2IZRfK!^dOmelb@0<#(t zDwVFmhPfr2={9z?*Bp%Ui;b;3y{+B!YL*NgZW!d^p>aJ-+a_65)5-kz8?Cwe`~F~; z;X*C-1{n700iN92o{;jWa1@^1(ZPt<>P(wNUtN}+&`j8bNtJEWczB#~yTPGoj62u0 zFt4hC`at4~?OH=oZe7#N%;ohonDF=9c}9-)q`GC8i&BFg2W_DkbE_Kp9 z?P9{xIyM?ymUZ1ACxw~1b)<6W8uyIKHRQ7!0#VL?`yk7cxFY52_6SqnI>>tmx(xe{ zESr|FY|(^Bb@hO3L!wkiIL0L_8VrvDD)5J6%vsUE`v!_tF~nsZseU}dm?(A42Tgq3 z5F}Obhhtn(-N-hBO0mv#+Y^%9Xu4G8g$~9Ss$ZEb{Gy#Vyq%;PEx{<4RX5NQG-mRC zWq)V-OLfx_^%wbBbBO!a`$$!``NAw%+hWLP&+C_!-cs2#xT;LORJW~dF?@&IX#Ta! z&+B{CN7@O64%{ZM0!{t4X}vNjQk>2C!Y)56>$*q>ZeQ1;yuFaF#ajcUtyGuw%U1e% zG2o$3TS*tZ9TA@XQvI&`l#(=-YIYyB&-W#JIt^PnC5lHrZ^a*08?DUl(Pf%ceVjIi z_E5XLeQIkv=|)2!%Ay*-@~s8CiOFiFNj14x?XRV_Gh*n*VIuk4cD0W{yRMnKUuBw9 z=O_-rFYfZEZRg+B2ZPkKt9`7GHZg0#G^xfFs+B6$yUm@5clWD}!b5tbVWb+NF#JYh zu(m#!)>6H*U+s@(U~Za8)x)k+qOc#rhQ=W6q4aM5zM(=Pw@q9X%3O@ zeBBYIOW{VSnN3d2kxFs(?AA2fn>rrR80>6Qcb&b{O)Ayzp1x{Jf2jbaX~(&C&9u5o zbEHySV3`a#=Vs8Vc;48?&rLUTCL0uM(-g1y_b9hMWSnbegEE|HVnDvi#$(P4OzGe~z?nw7gWRD@Dq3q^G*& zrD|3z)!7gF)C&@aoPC65Q$cnm8vZiW6eSJ#h;Iq=TR(2xLH#wP+!Xi@xy+e zI6GhNq*bMQZI3aX?yeo^&^^N7E0(kB#V@^GA=o)Wd z*wgS6B!ncCs&a?lu;V;>*mXX*xQO#giePN%z601td(PT%uV zr;S&p7qa%!Vy5?!xmH?B^+{uhMK$J~&~Q$XgX)Wl*fg(%9}Ukjtpr@8GMT$SZlN<` zZng1Px1B#t%%}c)y;(l1CwH8Y!^nKQX*F?HAfXim-i`<$0!mw?o&MRhq@D z(s&zge>ldbrV!hFA-w(wdpjc32ciTbF=Y+&H@AdLIY83VQUN@^rH!k~vMDc2>~6R- zLt|30!_Zy%E2S5KWtXskY2E`Q~+CjA#PvSB6mZiQp>YDI!rqa zU9gB$0C%iwp{lk^?utmIj!-nlmG3q3Nn=Rv44`Qul@ffxC>On3&*o+kD=$S$(2{an zxjqnO`to{1DsTjgN(J$D&(oLH^XA@w+$E7p9sY2P%c>d-Pn8iYBo)LDH@bJdkE`Bq zRNm)Gu&7jrSzOb}nAhuAv0t_vL@I^s?T9ezoqBFu*<^_qvm%vA#DM2^`WgJ{0e-i+ zO<4wkU}32a;|oT)XT6Vsix2RJFWN;ekxCu4oe}Q(sD*wn*YdNCt?ccH$Xykw)KDLY z^6;mv^j}=d#qT!o@7;dOoMDq}q+RdmXbhI^3$ScofNYz_g{4_s+&7EaeKHv!{ntgR z)1@;K;|*^oZ+PR`mVKNyrj}$LQH%Bz<@J)?MuS`4ynWzgQl^{|Hf=DHZ zRDwt)2qKk`3{pwiilAJoCK(1nwN%?>7zEW)ZI)pWR7+JY!yp(Tm6QSt3Z<&>GyzLx zCpK$t89g!;!m 'arvatis media GmbH', + 'vendor' => 'plentysystems AG', 'version' => 7, 'type' => 'Webshop', 'url' => $this->shopHelper->getPlentyDomain(), From d71e638e061e13dad0c5b073a5fcb46d283e29b7 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Wed, 27 Mar 2019 17:34:53 +0100 Subject: [PATCH 002/107] ADD instructions in user guide DE --- meta/documents/user_guide_de.md | 183 ++++++++++++++++++++++++++++---- 1 file changed, 162 insertions(+), 21 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index a67bd89f..9cace156 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -1,34 +1,175 @@ +

+ # BS PAYONE Payment für plentymarkets 7 -**Hinweis: Für den Alleinvertrieb, innerhalb Plentymarkets System, ist die PSG Projektmanagement GmbH zuständig. [Hier geht’s zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/)** +Das plentymarkets BS Payone Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. -Payment mit BS PAYONE überzeugt +Aktuell beinhaltet das plentymarkets BS Payone Plugin die folgenden Zahlungsarten: -Eine Lösung, ein Partner, ein Vertrag: Einfach & effizient. Technische Abwicklung und Finanzdienstleistungen aus einer Hand. +* Rechnung +* Gesicherte Rechnung +* Paydirekt +* Payolution Ratenzahlung +* PayPal +* RatePay Ratenzahlung +* Sofortüberweisung +* Vorkasse +* Kreditkarte +* Nachnahme +* Lastschrift -* Internationale Zahlungsabwicklung: Zugang zu internationalen und lokalen Zahlungsarten on demand. +## Erste Schritte -* Integriertes Risikomanagement: Minimierung von Zahlungsausfällen und Betrug. Für mehr Profitabilität. +**Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** -* Automatisches Debitorenmanagement: Effektive Entlastung der Buchhaltung durch Transaktionszuordnung und Kontenabgleich. +Zuerst aktivieren Sie die Zahlungsart einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . -* Zahlungsartenübergreifende Gutschriften: Schnelles Retourenmanagement. Mit automatisierten Gutschriften. +Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. -* Beste Referenzen, langjährige Erfahrung: Ausgewiesene Experten. Persönlicher Kundenservice. Bei jedem E-Commerce-Projekt. +## Einrichtung des Plugins -## Aktuell unterstützte Zahlarten +Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolgen direkt in der Plugin-Übersicht. Gehen Sie dazu wie im Folgenden beschrieben vor. -* Rechnung -* Vorkasse -* Nachnahme -* Lastschrift -* Kreditkarte -* Kreditkarte 3DS -* Gesicherte Rechnung -* PayPal -* Paydirekt -* Sofortüberweisung +### Grundeinstellungen vornehmen + +1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. +2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS Payone**. +→ Die Detailansicht des Plugins öffnet sich. +3. Öffnen Sie den Menüpunkt **Konfiguration**. +4. Klicken Sie auf **Grundeinstellungen**. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 1 vor. +5. **Speichern** Sie die Einstellungen. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 1: Payone Plugin: Grundeinstellungen vornehmen
+ Einstellung + + Erläuterung +
+ Merchant-Id + + Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei Payone erhalten haben. +
+ Portal-Id + + Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei Payone erhalten haben. +
+ Account-Id + + Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei Payone erhalten haben. +
+ Key + + Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei Payone erhalten haben. +
+ Modus + + Wahlen Sie zwischen den Optionen Test und Live. Wir empfehlen, während der Einrichtung des Plugins den Testmodus zu wählen. Währenddessen ist die Zahlungsart noch nicht in Ihrem Webshop verfügbar. Nach erfolgter Einrichtung wechseln Sie in den Livemodus und machen somit die Zahlungsart in Ihrem Webshop sichtbar. +
+ Autorisierungsmethode + + Preautorisierung:: Wählen Sie diese Option, wenn Sie für Payone-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
+ Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der Überprüfung durch Payone in Ihrem plentymarkets System gebucht werden soll. +
+ +### Zahlungsarten einrichten + +Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. -## Installationsanleitung +1. Öffnen Sie den Menüpunkt **Konfiguration** in der Detailansicht des Plugins. +2. Klicken Sie auf den Menüpunkt der Zahlungsart. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 2 vor. +5. **Speichern** Sie die Einstellungen. -[Hinweise zur Installation und Einrichtung](https://github.com/PAYONE-GmbH/plentymarkets-7/blob/master/README.md) \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 2: Payone Plugin: Zahlungsarten einrichten
+ Einstellung + + Erläuterung +
+ Aktiv + + Erklärung ... +
+ Name + + Erklärung ... +
+ Beschreibung + + Erklärung ... +
+ Minimaler Bestellwert + + Erklärung... +
+ Maximaler Bestellwert + + Erklärung ... +
+ Erlaubte Länder + + Erklärung ... +
From 6aed620745a10fe801ba0ff78811b0a3de381427 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 11:31:16 +0100 Subject: [PATCH 003/107] UPDATE changelog wording and format and ADD translation --- meta/documents/changelog_de.md | 91 +++++++++++++++------------------- meta/documents/changelog_en.md | 83 ++++++++++++++----------------- 2 files changed, 78 insertions(+), 96 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index a39e3686..3fd3860a 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,90 +1,81 @@ -# Release Notes BS Payone +# Release Notes für Payone ## 1.1.0 (2019-03-27) ### Geändert - Supportübernahme durch plentysystems -- Icons getauscht und Beschreibungen aktualisiert/ergänzt - +- Icons getauscht und Beschreibungen aktualisiert +- Updates an den User Guides in deutscher und englischer Sprache ## 1.0.9 (2018-04-10) -### Changed -- user_guide alert Text - +### Geändert +- Hinweistext im User Guide ergänzt ## 1.0.8 (2018-25-09) -### Changed -- Support Tab information -- Changelog - +### Geändert +- Informationen im Support-Tab aktualisiert +- Changelog aktualisiert ## 1.0.7 (2018-20-09) -### Updated -- config.json / new Pluginformat - -### Added -- Translations +### Geändert +- Aktualisierung der config.json Datei zur Bereitstellung des neuen Plugin-Formats -### Changed -- Userguide -- guzzle/httpguzzle Version in dependency for PayPal compatibility +### Hinzugefügt +- Übersetzungen hinzugefügt +### Geändert +- User Guide aktualisiert +- guzzle/httpguzzle Version hinzugefügt, um Kompatibilität mit PayPal zu erreichen ## 1.0.6 (2018-05-15) -### Added -- Sofort display in frontend -- Paydirekt display in frontend -- invoice secure display in frontend -- PayPal display in frontend - -### Changed -- improve rendering of payment error popup +### Hinzugefügt +- Die Zahlungsart Sofort wird jetzt im Frontend angezeigt +- Die Zahlungsart Paydirekt wird jetzt im Frontend angezeigt +- Die Zahlungsart Gesicherte Rechnung wird jetzt im Frontend angezeigt +- Die Zahlungsart PayPal wird jetzt im Frontend angezeigt +### Geändert +- Verbesserte Darstellung der Popup-Meldung bei fehlerhaften Zahlungen ## 1.0.5 (2018-04-06) -### Changed -- Logos and plugin name - +### Geändert +- Logos und Name des Plugins aktualisiert ## 1.0.4 (2018-03-27) -### Changed -- documentation - +### Geändert +- Dokumentation aktualisiert ## 1.0.3 (2018-03-26) -### Added -- english documentation - -### Changed -- use current payone php api +### Hinzugefügt +- Dokumentation in englischer Sprache hinzugefügt +### Geändert +- Die aktuelle Payone PHP API wird nun genutzt ## 1.0.2 (2018-03-21) -### Changed -- use Scriptloader to include payone scripts in template - +### Geändert +- Scriptloader wird nun genutzt, um Payone Skripte in Templates einzubinden ## 1.0.1 (2018-03-01) -### Changed -- update plugin documentation - +### Geändert +- Plugin-Dokumentation aktualisiert ## 1.0.1 (2018-03-01) -Plugin release supporting following payment methods: +Veröffentlichung des Plugins inklusive Unterstützung der folgenden Zahlungsarten: -- invoice -- pre payment -- cash on delivery -- debit payment -- credit card -- credit card 3DS \ No newline at end of file +- Rechnung +- Vorkasse +- Nachnahme +- Lastschrift +- Kreditkarte +- Kreditkarte 3DS diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index a39e3686..fba38170 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,90 +1,81 @@ -# Release Notes BS Payone +# Release Notes for Payone ## 1.1.0 (2019-03-27) -### Geändert -- Supportübernahme durch plentysystems -- Icons getauscht und Beschreibungen aktualisiert/ergänzt - +### Changed +- Support is now within the responsibility of plentysystems +- Added new icons and customised descriptions +- Updated German and English user guides ## 1.0.9 (2018-04-10) -### Changed -- user_guide alert Text - +### Changed +- Added alert text to user guide ## 1.0.8 (2018-25-09) -### Changed -- Support Tab information -- Changelog - +### Changed +- Updated information in the support tab +- Updated changelog ## 1.0.7 (2018-20-09) -### Updated -- config.json / new Pluginformat - -### Added -- Translations +### Updated +- Updated the config.json file to implement new plugin format -### Changed -- Userguide -- guzzle/httpguzzle Version in dependency for PayPal compatibility +### Added +- Added translations +### Changed +- Updated user guide +- Implemented guzzle/httpguzzle version in dependency for PayPal compatibility ## 1.0.6 (2018-05-15) ### Added -- Sofort display in frontend -- Paydirekt display in frontend -- invoice secure display in frontend -- PayPal display in frontend +- Sofort is now displayed in the front end +- Paydirekt is now displayed in the front end +- Secure invoice is now displayed in the front end +- PayPal is now displayed in the front end ### Changed -- improve rendering of payment error popup - +- Improved rendering of payment error message ## 1.0.5 (2018-04-06) -### Changed -- Logos and plugin name - +### Changed +- Updated logos and plugin name ## 1.0.4 (2018-03-27) -### Changed -- documentation - +### Changed +- Updated documentation ## 1.0.3 (2018-03-26) ### Added -- english documentation +- Added English documentation ### Changed -- use current payone php api - +- The current Payone PHP API is now used ## 1.0.2 (2018-03-21) ### Changed -- use Scriptloader to include payone scripts in template - +- Scriptloader is now used to include Payone scripts in templates ## 1.0.1 (2018-03-01) ### Changed -- update plugin documentation - +- Update plugin documentation ## 1.0.1 (2018-03-01) -Plugin release supporting following payment methods: +Plugin release supporting the following payment methods: -- invoice -- pre payment -- cash on delivery -- debit payment -- credit card -- credit card 3DS \ No newline at end of file +- Invoice +- Prepayment +- Cash on delivery +- Debit payment +- Credit card +- Credit card 3DS From ed3bc5acc096e323322a17270c8d2d4034cb0f74 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 11:36:11 +0100 Subject: [PATCH 004/107] remove line --- meta/documents/changelog_de.md | 1 - meta/documents/changelog_en.md | 1 - 2 files changed, 2 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 3fd3860a..789a35d4 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -70,7 +70,6 @@ - Plugin-Dokumentation aktualisiert ## 1.0.1 (2018-03-01) - Veröffentlichung des Plugins inklusive Unterstützung der folgenden Zahlungsarten: - Rechnung diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index fba38170..1715f05d 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -70,7 +70,6 @@ - Update plugin documentation ## 1.0.1 (2018-03-01) - Plugin release supporting the following payment methods: - Invoice From 00bac493b9a9854d781f4fe4e342aece6c32ab16 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 11:48:01 +0100 Subject: [PATCH 005/107] FIX labels DE + EN --- resources/lang/de/Config.properties | 32 ++++---- resources/lang/en/Config.properties | 118 ++++++++++++++-------------- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index a33425d0..47c7b1d1 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -1,8 +1,8 @@ GrundeinstellungenTab=Grundeinstellungen -midLabel=Merchant-Id -portalidLabel=Portal-Id -aidLabel=Account-Id -keyLabel=Key +midLabel=Merchant ID +portalidLabel=Portal ID +aidLabel=Account ID +keyLabel=Schlüssel modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live @@ -17,7 +17,7 @@ PAYONEPAYONEINVOICENameLabel=Name PAYONEPAYONEINVOICEDescriptionLabel=Beschreibung PAYONEPAYONEINVOICEMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEINVOICEMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEINVOICEAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEINVOICEAllowedCountriesLabel=Erlaubte Lieferländer GesicherteRechnungTab=Gesicherte Rechnung PAYONEPAYONEINVOICESECUREActiveLabel=Aktiv PAYONEPAYONEINVOICESECUREActivePossibleValue0=Nein @@ -26,7 +26,7 @@ PAYONEPAYONEINVOICESECURENameLabel=Name PAYONEPAYONEINVOICESECUREDescriptionLabel=Beschreibung PAYONEPAYONEINVOICESECUREMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEINVOICESECUREMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEINVOICESECUREAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEINVOICESECUREAllowedCountriesLabel=Erlaubte Lieferländer PaydirektTab=Paydirekt PAYONEPAYONEPAYDIREKTActiveLabel=Aktiv PAYONEPAYONEPAYDIREKTActivePossibleValue0=Nein @@ -35,7 +35,7 @@ PAYONEPAYONEPAYDIREKTNameLabel=Name PAYONEPAYONEPAYDIREKTDescriptionLabel=Beschreibung PAYONEPAYONEPAYDIREKTMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEPAYDIREKTMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEPAYDIREKTAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEPAYDIREKTAllowedCountriesLabel=Erlaubte Lieferländer PayolutionRatenzahlungTab=Payolution Ratenzahlung PAYONEPAYONEPAYOLUTIONINSTALLMENTActiveLabel=Aktiv PAYONEPAYONEPAYOLUTIONINSTALLMENTActivePossibleValue0=Nein @@ -43,7 +43,7 @@ PAYONEPAYONEPAYOLUTIONINSTALLMENTNameLabel=Name PAYONEPAYONEPAYOLUTIONINSTALLMENTDescriptionLabel=Beschreibung PAYONEPAYONEPAYOLUTIONINSTALLMENTMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEPAYOLUTIONINSTALLMENTMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEPAYOLUTIONINSTALLMENTAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEPAYOLUTIONINSTALLMENTAllowedCountriesLabel=Erlaubte Lieferländer PayPalTab=PayPal PAYONEPAYONEPAYPALActiveLabel=Aktiv PAYONEPAYONEPAYPALActivePossibleValue0=Nein @@ -52,7 +52,7 @@ PAYONEPAYONEPAYPALNameLabel=Name PAYONEPAYONEPAYPALDescriptionLabel=Beschreibung PAYONEPAYONEPAYPALMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEPAYPALMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEPAYPALAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEPAYPALAllowedCountriesLabel=Erlaubte Lieferländer RatePayRatenzahlungTab=RatePay Ratenzahlung PAYONEPAYONERATEPAYINSTALLMENTActiveLabel=Aktiv PAYONEPAYONERATEPAYINSTALLMENTActivePossibleValue0=Nein @@ -60,7 +60,7 @@ PAYONEPAYONERATEPAYINSTALLMENTNameLabel=Name PAYONEPAYONERATEPAYINSTALLMENTDescriptionLabel=Beschreibung PAYONEPAYONERATEPAYINSTALLMENTMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONERATEPAYINSTALLMENTMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONERATEPAYINSTALLMENTAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONERATEPAYINSTALLMENTAllowedCountriesLabel=Erlaubte Lieferländer SofortberweisungTab=Sofortüberweisung PAYONEPAYONESOFORTActiveLabel=Aktiv PAYONEPAYONESOFORTActivePossibleValue0=Nein @@ -69,7 +69,7 @@ PAYONEPAYONESOFORTNameLabel=Name PAYONEPAYONESOFORTDescriptionLabel=Beschreibung PAYONEPAYONESOFORTMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONESOFORTMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONESOFORTAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONESOFORTAllowedCountriesLabel=Erlaubte Lieferländer VorkasseTab=Vorkasse PAYONEPAYONEPREPAYMENTActiveLabel=Aktiv PAYONEPAYONEPREPAYMENTActivePossibleValue0=Nein @@ -78,7 +78,7 @@ PAYONEPAYONEPREPAYMENTNameLabel=Name PAYONEPAYONEPREPAYMENTDescriptionLabel=Beschreibung PAYONEPAYONEPREPAYMENTMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEPREPAYMENTMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEPREPAYMENTAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEPREPAYMENTAllowedCountriesLabel=Erlaubte Lieferländer KreditkarteTab=Kreditkarte PAYONEPAYONECREDITCARDActiveLabel=Aktiv PAYONEPAYONECREDITCARDActivePossibleValue0=Nein @@ -91,7 +91,7 @@ PAYONEPAYONECREDITCARDMinExpireTimeLabel=Minmiale Kartengültigkeit in Tagen PAYONEPAYONECREDITCARDDefaultStyleLabel=Kreditkartenfelder default style PAYONEPAYONECREDITCARDDefaultHeightInPxLabel=Kreditkartenfelder Höhe in px PAYONEPAYONECREDITCARDDefaultWidthInPxLabel=Kreditkartenfelder Breite in px -PAYONEPAYONECREDITCARDAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONECREDITCARDAllowedCountriesLabel=Erlaubte Lieferländer PAYONEPAYONECREDITCARDAllowedCardTypesLabel=Erlaubte Kartentypen PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesV=Visa PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesM=Mastercard @@ -111,7 +111,7 @@ PAYONEPAYONECASHONDELIVERYNameLabel=Name PAYONEPAYONECASHONDELIVERYDescriptionLabel=Beschreibung PAYONEPAYONECASHONDELIVERYMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONECASHONDELIVERYMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONECASHONDELIVERYAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONECASHONDELIVERYAllowedCountriesLabel=Erlaubte Lieferländer LastschriftTab=Lastschrift PAYONEPAYONEDIRECTDEBITActiveLabel=Aktiv PAYONEPAYONEDIRECTDEBITActivePossibleValue0=Nein @@ -120,7 +120,7 @@ PAYONEPAYONEDIRECTDEBITNameLabel=Name PAYONEPAYONEDIRECTDEBITDescriptionLabel=Beschreibung PAYONEPAYONEDIRECTDEBITMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEDIRECTDEBITMaxCartAmountLabel=Maximaler Bestellwert -PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=Erlaubte Länder +PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=Erlaubte Lieferländer DebuggingTab=Debugging debuggingActiveLabel=Aktiv debuggingActivePossibleValue0=Nein @@ -130,4 +130,4 @@ get = "get" set = "set" prepend = "prepend" push = "push" -getPrefix = "getPrefix" \ No newline at end of file +getPrefix = "getPrefix" diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index de89d5d5..a743fd7c 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -1,98 +1,98 @@ GrundeinstellungenTab=Basesettings -midLabel=Merchant-Id -portalidLabel=Portal-Id -aidLabel=Account-Id +midLabel=Merchant ID +portalidLabel=Portal ID +aidLabel=Account ID keyLabel=Key -modeLabel=Modus +modeLabel=Mode modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=authorization method +authTypeLabel=Authorization method authTypePossibleValue0=Preauthorization -authTypePossibleValue1=authorization +authTypePossibleValue1=Authorization RechnungTab=Invoice -PAYONEPAYONEINVOICEActiveLabel=Activ +PAYONEPAYONEINVOICEActiveLabel=Active PAYONEPAYONEINVOICEActivePossibleValue0=No PAYONEPAYONEINVOICEActivePossibleValue1=Yes PAYONEPAYONEINVOICENameLabel=Name PAYONEPAYONEINVOICEDescriptionLabel=Description -PAYONEPAYONEINVOICEMinCartAmountLabel=Min Order amount -PAYONEPAYONEINVOICEMaxCartAmountLabel=Max Order amount -PAYONEPAYONEINVOICEAllowedCountriesLabel=allowed Countries +PAYONEPAYONEINVOICEMinCartAmountLabel=Minimum order value +PAYONEPAYONEINVOICEMaxCartAmountLabel=Maximum order value +PAYONEPAYONEINVOICEAllowedCountriesLabel=Allowed countries of delivery GesicherteRechnungTab=Secured invoice -PAYONEPAYONEINVOICESECUREActiveLabel=Activ +PAYONEPAYONEINVOICESECUREActiveLabel=Active PAYONEPAYONEINVOICESECUREActivePossibleValue0=No PAYONEPAYONEINVOICESECUREActivePossibleValue1=Yes PAYONEPAYONEINVOICESECURENameLabel=Name PAYONEPAYONEINVOICESECUREDescriptionLabel=Description -PAYONEPAYONEINVOICESECUREMinCartAmountLabel=Min Order amount -PAYONEPAYONEINVOICESECUREMaxCartAmountLabel=Max Order amount -PAYONEPAYONEINVOICESECUREAllowedCountriesLabel=allowed Countries +PAYONEPAYONEINVOICESECUREMinCartAmountLabel=Minimum order value +PAYONEPAYONEINVOICESECUREMaxCartAmountLabel=Maximum order value +PAYONEPAYONEINVOICESECUREAllowedCountriesLabel=Allowed countries of delivery PaydirektTab=Paydirect -PAYONEPAYONEPAYDIREKTActiveLabel=Activ +PAYONEPAYONEPAYDIREKTActiveLabel=Active PAYONEPAYONEPAYDIREKTActivePossibleValue0=No PAYONEPAYONEPAYDIREKTActivePossibleValue1=Yes PAYONEPAYONEPAYDIREKTNameLabel=Name PAYONEPAYONEPAYDIREKTDescriptionLabel=Description -PAYONEPAYONEPAYDIREKTMinCartAmountLabel=Min Order amount -PAYONEPAYONEPAYDIREKTMaxCartAmountLabel=Max Order amount -PAYONEPAYONEPAYDIREKTAllowedCountriesLabel=allowed Countries +PAYONEPAYONEPAYDIREKTMinCartAmountLabel=Minimum order value +PAYONEPAYONEPAYDIREKTMaxCartAmountLabel=Maximum order value +PAYONEPAYONEPAYDIREKTAllowedCountriesLabel=Allowed countries of delivery PayolutionRatenzahlungTab=Payolution payment by installments -PAYONEPAYONEPAYOLUTIONINSTALLMENTActiveLabel=Activ +PAYONEPAYONEPAYOLUTIONINSTALLMENTActiveLabel=Active PAYONEPAYONEPAYOLUTIONINSTALLMENTActivePossibleValue0=No PAYONEPAYONEPAYOLUTIONINSTALLMENTNameLabel=Name PAYONEPAYONEPAYOLUTIONINSTALLMENTDescriptionLabel=Description -PAYONEPAYONEPAYOLUTIONINSTALLMENTMinCartAmountLabel=Min Order amount -PAYONEPAYONEPAYOLUTIONINSTALLMENTMaxCartAmountLabel=Max Order amount -PAYONEPAYONEPAYOLUTIONINSTALLMENTAllowedCountriesLabel=allowed Countries +PAYONEPAYONEPAYOLUTIONINSTALLMENTMinCartAmountLabel=Minimum order value +PAYONEPAYONEPAYOLUTIONINSTALLMENTMaxCartAmountLabel=Maximum order value +PAYONEPAYONEPAYOLUTIONINSTALLMENTAllowedCountriesLabel=Allowed countries of delivery PayPalTab=PayPal -PAYONEPAYONEPAYPALActiveLabel=Activ +PAYONEPAYONEPAYPALActiveLabel=Active PAYONEPAYONEPAYPALActivePossibleValue0=No PAYONEPAYONEPAYPALActivePossibleValue1=Yes PAYONEPAYONEPAYPALNameLabel=Name PAYONEPAYONEPAYPALDescriptionLabel=Description -PAYONEPAYONEPAYPALMinCartAmountLabel=Min Order amount -PAYONEPAYONEPAYPALMaxCartAmountLabel=Max Order amount -PAYONEPAYONEPAYPALAllowedCountriesLabel=allowed Countries +PAYONEPAYONEPAYPALMinCartAmountLabel=Minimum order value +PAYONEPAYONEPAYPALMaxCartAmountLabel=Maximum order value +PAYONEPAYONEPAYPALAllowedCountriesLabel=Allowed countries of delivery RatePayRatenzahlungTab=RatePay payment by installments -PAYONEPAYONERATEPAYINSTALLMENTActiveLabel=Activ +PAYONEPAYONERATEPAYINSTALLMENTActiveLabel=Active PAYONEPAYONERATEPAYINSTALLMENTActivePossibleValue0=No PAYONEPAYONERATEPAYINSTALLMENTNameLabel=Name PAYONEPAYONERATEPAYINSTALLMENTDescriptionLabel=Description -PAYONEPAYONERATEPAYINSTALLMENTMinCartAmountLabel=Min Order amount -PAYONEPAYONERATEPAYINSTALLMENTMaxCartAmountLabel=Max Order amount -PAYONEPAYONERATEPAYINSTALLMENTAllowedCountriesLabel=allowed Countries +PAYONEPAYONERATEPAYINSTALLMENTMinCartAmountLabel=Minimum order value +PAYONEPAYONERATEPAYINSTALLMENTMaxCartAmountLabel=Maximum order value +PAYONEPAYONERATEPAYINSTALLMENTAllowedCountriesLabel=Allowed countries of delivery SofortberweisungTab=Sofortüberweisung -PAYONEPAYONESOFORTActiveLabel=Activ +PAYONEPAYONESOFORTActiveLabel=Active PAYONEPAYONESOFORTActivePossibleValue0=No PAYONEPAYONESOFORTActivePossibleValue1=Yes PAYONEPAYONESOFORTNameLabel=Name PAYONEPAYONESOFORTDescriptionLabel=Description -PAYONEPAYONESOFORTMinCartAmountLabel=Min Order amount -PAYONEPAYONESOFORTMaxCartAmountLabel=Max Order amount -PAYONEPAYONESOFORTAllowedCountriesLabel=allowed Countries -VorkasseTab=Payment in advance -PAYONEPAYONEPREPAYMENTActiveLabel=Activ +PAYONEPAYONESOFORTMinCartAmountLabel=Minimum order value +PAYONEPAYONESOFORTMaxCartAmountLabel=Maximum order value +PAYONEPAYONESOFORTAllowedCountriesLabel=Allowed countries of delivery +VorkasseTab=Cash in advance +PAYONEPAYONEPREPAYMENTActiveLabel=Active PAYONEPAYONEPREPAYMENTActivePossibleValue0=No PAYONEPAYONEPREPAYMENTActivePossibleValue1=Yes PAYONEPAYONEPREPAYMENTNameLabel=Name PAYONEPAYONEPREPAYMENTDescriptionLabel=Description -PAYONEPAYONEPREPAYMENTMinCartAmountLabel=Min Order amount -PAYONEPAYONEPREPAYMENTMaxCartAmountLabel=Max Order amount -PAYONEPAYONEPREPAYMENTAllowedCountriesLabel=allowed Countries -KreditkarteTab=Creditcard -PAYONEPAYONECREDITCARDActiveLabel=Activ +PAYONEPAYONEPREPAYMENTMinCartAmountLabel=Minimum order value +PAYONEPAYONEPREPAYMENTMaxCartAmountLabel=Maximum order value +PAYONEPAYONEPREPAYMENTAllowedCountriesLabel=Allowed countries of delivery +KreditkarteTab=Credit card +PAYONEPAYONECREDITCARDActiveLabel=Active PAYONEPAYONECREDITCARDActivePossibleValue0=No PAYONEPAYONECREDITCARDActivePossibleValue1=Yes PAYONEPAYONECREDITCARDNameLabel=Name PAYONEPAYONECREDITCARDDescriptionLabel=Description -PAYONEPAYONECREDITCARDMinCartAmountLabel=Min Order amount -PAYONEPAYONECREDITCARDMaxCartAmountLabel=Max Order amount -PAYONEPAYONECREDITCARDMinExpireTimeLabel=Minmiale card validity in days -PAYONEPAYONECREDITCARDDefaultStyleLabel=Creditcard Fields default style -PAYONEPAYONECREDITCARDDefaultHeightInPxLabel=Creditcard Fields height in px -PAYONEPAYONECREDITCARDDefaultWidthInPxLabel=Creditcard Fields width in px -PAYONEPAYONECREDITCARDAllowedCountriesLabel=allowed Countries -PAYONEPAYONECREDITCARDAllowedCardTypesLabel=Erlaubte Kartentypen +PAYONEPAYONECREDITCARDMinCartAmountLabel=Minimum order amount +PAYONEPAYONECREDITCARDMaxCartAmountLabel=Maximum order amount +PAYONEPAYONECREDITCARDMinExpireTimeLabel=Minimum card validity in days +PAYONEPAYONECREDITCARDDefaultStyleLabel=Credit card fields default style +PAYONEPAYONECREDITCARDDefaultHeightInPxLabel=Credit card fields height in px +PAYONEPAYONECREDITCARDDefaultWidthInPxLabel=Credit card fields width in px +PAYONEPAYONECREDITCARDAllowedCountriesLabel=Allowed countries of delivery +PAYONEPAYONECREDITCARDAllowedCardTypesLabel=Allowed card types PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesV=Visa PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesM=Mastercard PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesA=Amex @@ -104,25 +104,25 @@ PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowed PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesJ=JCB PAYONEPAYONECREDITCARDAllowedCardTypesPossibleValuePAYONEPAYONECREDITCARDAllowedCardTypesP=China Union Pay NachnahmeTab=Cash on delivery -PAYONEPAYONECASHONDELIVERYActiveLabel=Activ +PAYONEPAYONECASHONDELIVERYActiveLabel=Active PAYONEPAYONECASHONDELIVERYActivePossibleValue0=No PAYONEPAYONECASHONDELIVERYActivePossibleValue1=Yes PAYONEPAYONECASHONDELIVERYNameLabel=Name PAYONEPAYONECASHONDELIVERYDescriptionLabel=Description -PAYONEPAYONECASHONDELIVERYMinCartAmountLabel=Min Order amount -PAYONEPAYONECASHONDELIVERYMaxCartAmountLabel=Max Order amount -PAYONEPAYONECASHONDELIVERYAllowedCountriesLabel=allowed Countries +PAYONEPAYONECASHONDELIVERYMinCartAmountLabel=Minimum order value +PAYONEPAYONECASHONDELIVERYMaxCartAmountLabel=Maximum order value +PAYONEPAYONECASHONDELIVERYAllowedCountriesLabel=Allowed countries of delivery LastschriftTab=Debit -PAYONEPAYONEDIRECTDEBITActiveLabel=Activ +PAYONEPAYONEDIRECTDEBITActiveLabel=Active PAYONEPAYONEDIRECTDEBITActivePossibleValue0=No PAYONEPAYONEDIRECTDEBITActivePossibleValue1=Yes PAYONEPAYONEDIRECTDEBITNameLabel=Name PAYONEPAYONEDIRECTDEBITDescriptionLabel=Description -PAYONEPAYONEDIRECTDEBITMinCartAmountLabel=Min Order amount -PAYONEPAYONEDIRECTDEBITMaxCartAmountLabel=Max Order amount -PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=allowed Countries +PAYONEPAYONEDIRECTDEBITMinCartAmountLabel=Minimum order value +PAYONEPAYONEDIRECTDEBITMaxCartAmountLabel=Maximum order value +PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=Allowed countries of delivery DebuggingTab=Debugging -debuggingActiveLabel=Activ +debuggingActiveLabel=Active debuggingActivePossibleValue0=No debuggingActivePossibleValue1=Yes has = "has" @@ -130,4 +130,4 @@ get = "get" set = "set" prepend = "prepend" push = "push" -getPrefix = "getPrefix" \ No newline at end of file +getPrefix = "getPrefix" From ebf6c443483e403513f702b16dd6385da6815a83 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 11:59:02 +0100 Subject: [PATCH 006/107] update user guide DE --- meta/documents/user_guide_de.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 9cace156..ef86c877 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -42,7 +42,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge 5. **Speichern** Sie die Einstellungen. - + @@ -108,6 +108,9 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. + +##### Zahlungsarten einrichten: + 1. Öffnen Sie den Menüpunkt **Konfiguration** in der Detailansicht des Plugins. 2. Klicken Sie auf den Menüpunkt der Zahlungsart. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 2 vor. 5. **Speichern** Sie die Einstellungen. @@ -174,4 +177,154 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop
Tab. 1: Payone Plugin: Grundeinstellungen vornehmenTab. 1: Grundeinstellungen vornehmen
Einstellung @@ -54,7 +54,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge
- Merchant-Id + Merchant ID Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei Payone erhalten haben. @@ -62,7 +62,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge
- Portal-Id + Portal ID Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei Payone erhalten haben. @@ -70,7 +70,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge
- Account-Id + Account ID Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei Payone erhalten haben. @@ -78,7 +78,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge
- Key + Schlüssel Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei Payone erhalten haben. @@ -113,7 +113,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop 5. **Speichern** Sie die Einstellungen. - + @@ -136,7 +136,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop Name @@ -144,7 +144,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop Beschreibung @@ -152,7 +152,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop Minimaler Bestellwert @@ -160,16 +160,18 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop Maximaler Bestellwert
Tab. 2: Payone Plugin: Zahlungsarten einrichtenTab. 2: Zahlungsarten einrichten
Einstellung @@ -128,7 +128,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop Aktiv - Erklärung ... + Wählen Sie die Option Ja, um die Zahlungsart zu aktivieren und somit im Webshop anzubieten.
Wählen Sie die Option Nein, wenn die Zahlungsart deaktiviert werden und damit nicht zur Verfügung stehen soll.
- Erklärung ... + Geben Sie einen Namen für die Zahlungsart ein. Dieser Name ist für Ihre Kunden im Webshop sichtbar.
- Erklärung ... + Geben Sie einen Beschreibungstext für die Zahlungsart ein. Dieser Text ist für Ihre Kunden im Webshop sichtbar.
- Erklärung... + Geben Sie einen minimalen Bestellwert ein, ab dem die Zahlungsart im Webshop verfügbar sein soll.
- Erklärung ... + Geben Sie einen maximalen Bestellwert ein, bis zu dem die Zahlungsart im Webshop verfügbar sein soll. Wird dieser Wert überschritten, ist die Zahlungsart nicht mehr verfügbar.
- Erlaubte Länder + Erlaubte Lieferländer - Erklärung ... + Geben Sie kommasepariert die Lieferländer aus, für die die Zahlungsart verfügbar sein soll.
+ +Für die Zahlungsart **Kreditkarte** können Sie zusätzliche Einstellungen vornehmen. Diese Einstellungen werden in Tabelle 3 beschrieben. From 2a229ca5f4ddc8ab8ea51796ae191d6ff20fd5e2 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 14:28:06 +0100 Subject: [PATCH 007/107] CHANGE labels --- resources/lang/de/Config.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index 47c7b1d1..b3e977a1 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -6,9 +6,9 @@ keyLabel=Schlüssel modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Autorisierungsmethode -authTypePossibleValue0=Preautorisierung -authTypePossibleValue1=Autorisierung +authTypeLabel=Art des Zahlungseinzugs +authTypePossibleValue0=manuell/Ereignisaktion +authTypePossibleValue1=direkt nach der Autorisierung RechnungTab=Rechnung PAYONEPAYONEINVOICEActiveLabel=Aktiv PAYONEPAYONEINVOICEActivePossibleValue0=Nein From 2d874b8843f3143928223c899829564cebf27777 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 14:57:11 +0100 Subject: [PATCH 008/107] CHANGE naming for event procedure --- src/Providers/PayoneServiceProvider.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index 00a07a7f..aaac9657 100644 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -112,8 +112,8 @@ public function boot( ); $captureProcedureTitle = [ - 'de' => PluginConstants::NAME . ' | Bestellung erfassen', - 'en' => PluginConstants::NAME . ' | Capture order', + 'de' => PluginConstants::NAME . ' | Zahlungseingang buchen', + 'en' => PluginConstants::NAME . ' | Book incoming payment', ]; $eventProceduresService->registerProcedure( PluginConstants::NAME, @@ -123,7 +123,7 @@ public function boot( ); $refundProcedureTitle = [ - 'de' => PluginConstants::NAME . ' | Gutschrift erstellen', + 'de' => PluginConstants::NAME . ' | Rückerstattung senden', 'en' => PluginConstants::NAME . ' | Refund order', ]; $eventProceduresService->registerProcedure( From 1740ebc6a50be79b09985a080504fbe494ceb9b2 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 15:52:52 +0100 Subject: [PATCH 009/107] CHANGE labels EN --- resources/lang/de/Config.properties | 4 ++-- resources/lang/en/Config.properties | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index b3e977a1..f154e204 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -7,8 +7,8 @@ modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live authTypeLabel=Art des Zahlungseinzugs -authTypePossibleValue0=manuell/Ereignisaktion -authTypePossibleValue1=direkt nach der Autorisierung +authTypePossibleValue0=Manuell/Ereignisaktion +authTypePossibleValue1=Direkt nach der Autorisierung RechnungTab=Rechnung PAYONEPAYONEINVOICEActiveLabel=Aktiv PAYONEPAYONEINVOICEActivePossibleValue0=Nein diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index a743fd7c..cad800dc 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -6,9 +6,9 @@ keyLabel=Key modeLabel=Mode modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Authorization method -authTypePossibleValue0=Preauthorization -authTypePossibleValue1=Authorization +authTypeLabel=Method for payment registration +authTypePossibleValue0=Manually/Event procedure +authTypePossibleValue1=Directly after authorisation RechnungTab=Invoice PAYONEPAYONEINVOICEActiveLabel=Active PAYONEPAYONEINVOICEActivePossibleValue0=No From f42cb600b8d53bab9083fa9888c79ad28ab4cca7 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Thu, 28 Mar 2019 18:11:22 +0100 Subject: [PATCH 010/107] FIX label ADD user guide EN --- meta/documents/user_guide_de.md | 175 +++++++++++++- meta/documents/user_guide_en.md | 340 ++++++++++++++++++++++++++-- resources/lang/en/Config.properties | 6 +- 3 files changed, 484 insertions(+), 37 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index ef86c877..fb803def 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -1,12 +1,12 @@ -# BS PAYONE Payment für plentymarkets 7 +# PAYONE Payment für plentymarkets 7 -Das plentymarkets BS Payone Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. +Das plentymarkets Payone Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. -Aktuell beinhaltet das plentymarkets BS Payone Plugin die folgenden Zahlungsarten: +Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: * Rechnung * Gesicherte Rechnung @@ -24,15 +24,15 @@ Aktuell beinhaltet das plentymarkets BS Payone Plugin die folgenden Zahlungsarte **Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** -Zuerst aktivieren Sie die Zahlungsart einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . +Aktivieren Sie die gewünschten Payone-Zahlungsarten einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. ## Einrichtung des Plugins -Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolgen direkt in der Plugin-Übersicht. Gehen Sie dazu wie im Folgenden beschrieben vor. +Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. -### Grundeinstellungen vornehmen +##### Grundeinstellungen vornehmen 1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. 2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS Payone**. @@ -94,11 +94,11 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge
- Autorisierungsmethode + Art des Zahlungseinzugs - Preautorisierung:: Wählen Sie diese Option, wenn Sie für Payone-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
- Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der Überprüfung durch Payone in Ihrem plentymarkets System gebucht werden soll. + Wählen Sie, wann und auf welche Weise Aufträge mit der Zahlungsart Payone in Ihrem plentymarkets System als bezahlt markiert werden sollen.
Manuell/Ereignisaktion: Wählen Sie diese Option, wenn Sie für Payone-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
+ Direkt nach der Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der anschließenden Autorisierung durch Payone in Ihrem plentymarkets System gebucht werden soll.
-Für die Zahlungsart **Kreditkarte** können Sie zusätzliche Einstellungen vornehmen. Diese Einstellungen werden in Tabelle 3 beschrieben. +**Hinweis**: Die Zahlungsart **Kreditkarte** stellt einen Sonderfall dar. Für diese Zahlungsart sind zusätzliche Einstellungen notwendig. Diese Einstellungen werden in Tabelle 3 beschrieben. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 3: Zahlungsart Kreditkarte einrichten
+ Einstellung + + Erläuterung +
+ Minimale Kartengültigkeit in Tagen + + Geben Sie die erforderliche minimale Kartengültigkeit an, über die eine Kreditkarte verfügen muss, um für die Zahlungsart akzeptiert zu werden. +
+ Kreditkartenfelder Default Style + + Standardmäßig ist hier voreingestellt, in welcher Farbe, Schriftgröße und Schriftart die Eingabefelder für die Kreditkartendaten für Kunden im Webshop angezeigt werden. Die Werte sind editierbar. +
+ Kreditkartenfelder Höhe in px + + Standardmäßig ist hier die Höhe der Eingabefelder in px voreingestellt. Der Wert ist editierbar. +
+ Kreditkartenfelder Breite in px + + Standardmäßig ist hier die Breite der Eingabefelder in px voreingestellt. Der Wert ist editierbar. +
+ Erlaubte Kartentypen + + Aktivieren Sie die Kartentypen, die für die Zahlungsart akzeptiert werden sollen. +
+ +## Template-Container verknüpfen + +Für die Zahlungsart Payone stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. +Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container hinterlegt, mit denen zur Individualisierung Contents verknüpft werden. + +##### Container verknüpfen: + +1. Öffnen Sie das Menü **CMS » Container-Verknüpfungen**. +2. Wählen Sie den gewünschten Content, der verknüpft werden soll. +3. Wählen Sie einen oder mehrere Container, in denen der zuvor gewählte Content dargestellt werden soll. Beachten Sie dazu die Erläuterungen in Tabelle 4. +4. **Speichern** Sie die Einstellungen.
→ Die Contents sind mit den Containern verknüpft. + + + + + + + + + + + + + + + + + +
Tab. 4: Container verknüpfen
+ Content + + Erläuterung +
+ Payone Order Confirmation Page Payment Data + + Verknüpfen Sie diesen Content mit dem Container **Script loader: After script loaded**, um +
+ Payone Checkout JS + + Verknüpfen Sie diesen Content mit dem Container **Script loader: After script loaded**, um +
+ +## Payone-Zahlung automatisch zurückzahlen + +Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über Payone zu automatisieren. + +##### Ereignisaktion einrichten: + +1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. +2. Klicken Sie auf **Ereignisaktion hinzufügen**.
+→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +3. Geben Sie einen Namen ein. +4. Wählen Sie das Ereignis gemäß Tabelle 5. +5. **Speichern** Sie die Einstellungen.
+→ Die Ereignisaktion wird angelegt. +6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 5 vor. +7. Setzen Sie ein Häkchen bei **Aktiv**. +8. **Speichern** Sie die Einstellungen.
+→ Die Ereignisaktion wird gespeichert. + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tab. 5: Ereignisaktion zur automatischen Rückzahlung der Payone-Zahlung +
+ Einstellung + + Option + + Auswahl +
EreignisDas Ereignis wählen, nach dem eine Rückzahlung erfolgen soll.
Filter 1Auftrag > ZahlungsartPlugin: PAYONE +
AktionPlugin > Payone | Rückerstattung senden
diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index cf13377e..0ec08128 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -1,35 +1,329 @@ -# BS PAYONE Payment for plentymarkets 7 + -**Hinweis: The Distribution in Plentymarkets system is controlled by PSG Projektmanagement GmbH. [Click here for Registration](https://www.psg-projektmanagement.de/bs-payone/)** +# PAYONE Payment for plentymarkets 7 -Payment with BS PAYONE convinces +The plentymarkets Payone plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. -One solution, one partner, one contract: simple & efficient. Technical handling and financial services from a single -source. +The plugin currently offers the following payment methods: -* International payment processing: access to international and local payment methods on demand. +* Invoice +* Secure invoice +* Paydirekt +* Payolution Payment in installments +* PayPal +* RatePay Payment in installments +* Sofortüberweisung +* Cash in advance +* Credit card +* Cash on Delivery +* Debit -* Integrated risk management: minimizing defaults and fraud. For more profitability. +## First steps -* Automatic Debtor Management: Effectively relieving the bookkeeping through transaction assignment and account reconciliation. +**Note: Before using the plugin, you have to register for a PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** -* Multi-payment refunds: Fast returns management. With automated refunds. +First of all, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. -* Best references, many years of experience: proven experts. Personal customer service. For every e-commerce project. +In addition, make sure that the payment method is included among the Permitted payment methods in the customer classes and that it is not listed among the Blocked payment methods in the shipping profiles. -## Currently supported payment methods +## Setting up the plugin -* invoice -* pre payment -* cash on delivery -* debit payment -* credit card -* credit card 3DS -* invoice secure -* PayPal -* Paydirekt -* Sofortüberweisung +The following steps for setting up the plentymarkets Payone plugin are carried out in the plugin overview of your plentymarkets system. Proceed as described below to set up the plugin. + +##### Carrying out the basic settings + +1. Go to **Plugin » Plugin overview**. +2. In the plugin list, click on the name of the plugin **BS Payone**. +→ The detail view of the plugin opens. +3. Open the menu entry **Configuration**. +4. Click on **Basic settings**. Carry out the settings according to the information provided in table 1. +5. **Save** the settings. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 1: Carrying out the basic settings
+ Setting + + Explanation +
+ Merchant ID + + Enter the customer number as received after the registration process with Payone. +
+ Portal ID + + Enter the payment portal ID as received after the registration process with Payone. +
+ Account ID + + Enter the account ID as received after the registration process with Payone. +
+ Key + + Enter the key as received after the registration process with Payone. +
+ Mode + + Select one of the options Test and Live. We recommend using the test mode while setting up the plugin. The test mode ensures that the payment method is not available in your online store during the setup process. After completing the setup of the plugin, select the live mode so that the payment method becomes visible in your online store. +
+ Method for payment registration + + Select when and how orders with the payment method Payone are marked as paid in your plentymarkets system.
Manually/Event procedure: Select this option if you wish to manually book incoming payment or to set up an event procedure booking incoming payment.
+ Directly after authorisation:: Select this option if incoming payment should be booked directly after completion of the checkout process in the online store and successful authorisation by Payone. +
+ +### Setting up payment methods + +In the following, you select the Payone payment methods that should be available for your customers in the online store. In addition, you carry out more detailed settings for the selected payment methods. Proceed as described below. + + +##### Setting up payment methods: + +1. Open the menu entry **Configuration** in the detail view of the plugin. +2. Click on the menu entry of the payment method. Carry out the settings according to the information provided in table 2. +5. **Save** the settings. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 2: Setting up payment methods
+ Setting + + Explanation +
+ Active + + Select the option Yes to activate the payment method and thus offer it in the online store.
Select the option No if the payment method should be deactivated and thus not be available. +
+ Name + + Enter a name for the payment method. This name is visible for your customers in the online store. +
+ Description + + Enter a description for the payment method. This text is visible for your customers in the online store. +
+ Minimum order value + + Enter a minimum order value for which the payment method should be available in the online store. +
+ Maximum order value + + Enter a maximum order value for which the payment method should be available in the online store. The payment method is not available for orders exceeding this value. +
+ Allowed countries of delivery + + Enter the countries of delivery (separated by a comma) for which the payment method should be available. +
+ +**Note:** The payment method Die Zahlungsart **Credit card** requires particular attention. Additional settings are necessary for this payment method. The settings are described in table 3. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tab. 3: Setting up the payment method Credit card
+ Setting + + Explanation +
+ Minimum card validity in days + + Enter the required minimum card validity in days that a credit card must have to be accepted for the payment method. +
+ Credit card fields default style + + Default settings are saved for the colour, font size and font used for the data fields into which customers enter their credit card data in the online store. The values are editable. +
+ Credit card fields height in px + + The height of the data fields in px is set by default. The value is editable. +
+ Credit card fields width in px + + The width of the data fields in px is set by default. The value is editable. +
+ Allowed card types + + Activate the card types that should be accepted for the payment method. +
+ +## Linking template containers + +You have multiple options to integrate the payment method Payone into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. + +##### Linking template containers: + +1. Go to **CMS » Container links**. +2. Select the content that should be linked. +3. Select one or more containers in which the previously selected content should be displayed. Pay attention to the information provided in table 4. +4. **Save** the settings.
→ The content is linked to the containers + + + + + + + + + + + + + + + + + +
Tab. 4: Linking template containers
+ Content + + Explanation +
+ Payone Order Confirmation Page Payment Data + + Link this content to the container Script loader: After script loaded to +
+ Payone Checkout JS + + Linkt his content to the container Script loader: After script loaded to +
+ +## Automatically refunding Payone payments + +Set up an event procedure to automatically refund a Payone payment. + +##### Setting up an event procedure: -## Installation guide +1. Go to **System » Orders » Events**. +2. Click on **Add event procedure**. +→ The **Create new event procedure** window opens. +3. Enter a name. +4. Select the event according to table 5. +5. **Save** the settings. +→ The event procedure is created. +6. Carry out the further settings according to table 5. +7. Place a check mark next to the option **Active**. +8. **Save** the settings. +→ The event procedure is saved. -[Information for installation and setup](https://github.com/PAYONE-GmbH/plentymarkets-7/blob/master/README.md) \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tab. 5: Event procedure for automatically refunding Payone payments +
+ Setting + + Option + + Selection +
EventSelect the event to trigger a refund.
Filter 1Order > Payment methodPlugin: PAYONE +
ProcedurePlugins > Payone | Refund order
diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index cad800dc..ffe3f93d 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -27,7 +27,7 @@ PAYONEPAYONEINVOICESECUREDescriptionLabel=Description PAYONEPAYONEINVOICESECUREMinCartAmountLabel=Minimum order value PAYONEPAYONEINVOICESECUREMaxCartAmountLabel=Maximum order value PAYONEPAYONEINVOICESECUREAllowedCountriesLabel=Allowed countries of delivery -PaydirektTab=Paydirect +PaydirektTab=Paydirekt PAYONEPAYONEPAYDIREKTActiveLabel=Active PAYONEPAYONEPAYDIREKTActivePossibleValue0=No PAYONEPAYONEPAYDIREKTActivePossibleValue1=Yes @@ -36,7 +36,7 @@ PAYONEPAYONEPAYDIREKTDescriptionLabel=Description PAYONEPAYONEPAYDIREKTMinCartAmountLabel=Minimum order value PAYONEPAYONEPAYDIREKTMaxCartAmountLabel=Maximum order value PAYONEPAYONEPAYDIREKTAllowedCountriesLabel=Allowed countries of delivery -PayolutionRatenzahlungTab=Payolution payment by installments +PayolutionRatenzahlungTab=Payolution payment in installments PAYONEPAYONEPAYOLUTIONINSTALLMENTActiveLabel=Active PAYONEPAYONEPAYOLUTIONINSTALLMENTActivePossibleValue0=No PAYONEPAYONEPAYOLUTIONINSTALLMENTNameLabel=Name @@ -53,7 +53,7 @@ PAYONEPAYONEPAYPALDescriptionLabel=Description PAYONEPAYONEPAYPALMinCartAmountLabel=Minimum order value PAYONEPAYONEPAYPALMaxCartAmountLabel=Maximum order value PAYONEPAYONEPAYPALAllowedCountriesLabel=Allowed countries of delivery -RatePayRatenzahlungTab=RatePay payment by installments +RatePayRatenzahlungTab=RatePay payment in installments PAYONEPAYONERATEPAYINSTALLMENTActiveLabel=Active PAYONEPAYONERATEPAYINSTALLMENTActivePossibleValue0=No PAYONEPAYONERATEPAYINSTALLMENTNameLabel=Name From e233b807aa6c1d75b01651e377bd60c6d7a6f19a Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 29 Mar 2019 11:43:46 +0100 Subject: [PATCH 011/107] change payone to BS PAYONE --- meta/documents/user_guide_de.md | 38 ++++++++++++++++----------------- meta/documents/user_guide_en.md | 32 +++++++++++++-------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index fb803def..ebe0e8eb 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -1,10 +1,10 @@ -# PAYONE Payment für plentymarkets 7 +# BS PAYONE Payment für plentymarkets 7 -Das plentymarkets Payone Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. +Das plentymarkets BS PAYONE Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: @@ -22,20 +22,20 @@ Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: ## Erste Schritte -**Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** +**Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein BS PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** -Aktivieren Sie die gewünschten Payone-Zahlungsarten einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . +Aktivieren Sie die gewünschten BS PAYONE-Zahlungsarten einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. ## Einrichtung des Plugins -Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. +Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. ##### Grundeinstellungen vornehmen 1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. -2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS Payone**. +2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS BS PAYONE**. → Die Detailansicht des Plugins öffnet sich. 3. Öffnen Sie den Menüpunkt **Konfiguration**. 4. Klicken Sie auf **Grundeinstellungen**. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 1 vor. @@ -57,7 +57,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Merchant ID - Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei Payone erhalten haben. + Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. @@ -65,7 +65,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Portal ID - Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei Payone erhalten haben. + Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. @@ -73,7 +73,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Account ID - Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei Payone erhalten haben. + Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. @@ -81,7 +81,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Schlüssel - Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei Payone erhalten haben. + Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei BS PAYONE erhalten haben. @@ -97,8 +97,8 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge Art des Zahlungseinzugs - Wählen Sie, wann und auf welche Weise Aufträge mit der Zahlungsart Payone in Ihrem plentymarkets System als bezahlt markiert werden sollen.
Manuell/Ereignisaktion: Wählen Sie diese Option, wenn Sie für Payone-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
- Direkt nach der Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der anschließenden Autorisierung durch Payone in Ihrem plentymarkets System gebucht werden soll. + Wählen Sie, wann und auf welche Weise Aufträge mit der Zahlungsart BS PAYONE in Ihrem plentymarkets System als bezahlt markiert werden sollen.
Manuell/Ereignisaktion: Wählen Sie diese Option, wenn Sie für BS PAYONE-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
+ Direkt nach der Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der anschließenden Autorisierung durch BS PAYONE in Ihrem plentymarkets System gebucht werden soll. @@ -106,7 +106,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets Payone Plugins erfolge ### Zahlungsarten einrichten -Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. +Im Folgenden legen Sie fest, welche BS PAYONE-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. ##### Zahlungsarten einrichten: @@ -235,7 +235,7 @@ Im Folgenden legen Sie fest, welche Payone-Zahlungsarten Ihren Kunden im Webshop ## Template-Container verknüpfen -Für die Zahlungsart Payone stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. +Für die Zahlungsart BS PAYONE stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container hinterlegt, mit denen zur Individualisierung Contents verknüpft werden. ##### Container verknüpfen: @@ -275,9 +275,9 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container -## Payone-Zahlung automatisch zurückzahlen +## BS PAYONE-Zahlung automatisch zurückzahlen -Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über Payone zu automatisieren. +Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS PAYONE zu automatisieren. ##### Ereignisaktion einrichten: @@ -295,7 +295,7 @@ Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über Pay @@ -323,7 +323,7 @@ Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über Pay - + diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 0ec08128..288d4a8e 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -1,10 +1,10 @@ # PAYONE Payment for plentymarkets 7 -The plentymarkets Payone plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. +The plentymarkets BS PAYONE plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. The plugin currently offers the following payment methods: @@ -22,7 +22,7 @@ The plugin currently offers the following payment methods: ## First steps -**Note: Before using the plugin, you have to register for a PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** +**Note: Before using the plugin, you have to register for a BS PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** First of all, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. @@ -30,12 +30,12 @@ In addition, make sure that the payment method is included among the Permitted p ## Setting up the plugin -The following steps for setting up the plentymarkets Payone plugin are carried out in the plugin overview of your plentymarkets system. Proceed as described below to set up the plugin. +The following steps for setting up the plentymarkets BS PAYONE plugin are carried out in the plugin overview of your plentymarkets system. Proceed as described below to set up the plugin. ##### Carrying out the basic settings 1. Go to **Plugin » Plugin overview**. -2. In the plugin list, click on the name of the plugin **BS Payone**. +2. In the plugin list, click on the name of the plugin **BS BS PAYONE**. → The detail view of the plugin opens. 3. Open the menu entry **Configuration**. 4. Click on **Basic settings**. Carry out the settings according to the information provided in table 1. @@ -57,7 +57,7 @@ The following steps for setting up the plentymarkets Payone plugin are carried o Merchant ID @@ -65,7 +65,7 @@ The following steps for setting up the plentymarkets Payone plugin are carried o Portal ID @@ -73,7 +73,7 @@ The following steps for setting up the plentymarkets Payone plugin are carried o Account ID @@ -81,7 +81,7 @@ The following steps for setting up the plentymarkets Payone plugin are carried o Key @@ -97,8 +97,8 @@ The following steps for setting up the plentymarkets Payone plugin are carried o Method for payment registration @@ -106,7 +106,7 @@ The following steps for setting up the plentymarkets Payone plugin are carried o ### Setting up payment methods -In the following, you select the Payone payment methods that should be available for your customers in the online store. In addition, you carry out more detailed settings for the selected payment methods. Proceed as described below. +In the following, you select the BS PAYONE payment methods that should be available for your customers in the online store. In addition, you carry out more detailed settings for the selected payment methods. Proceed as described below. ##### Setting up payment methods: @@ -235,7 +235,7 @@ In the following, you select the Payone payment methods that should be available ## Linking template containers -You have multiple options to integrate the payment method Payone into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. +You have multiple options to integrate the payment method BS PAYONE into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. ##### Linking template containers: @@ -274,9 +274,9 @@ You have multiple options to integrate the payment method Payone into your onlin
- Tab. 5: Ereignisaktion zur automatischen Rückzahlung der Payone-Zahlung + Tab. 5: Ereignisaktion zur automatischen Rückzahlung der BS PAYONE-Zahlung
AktionPlugin > Payone | Rückerstattung sendenPlugin > BS PAYONE | Rückerstattung senden
- Enter the customer number as received after the registration process with Payone. + Enter the customer number as received after the registration process with BS PAYONE.
- Enter the payment portal ID as received after the registration process with Payone. + Enter the payment portal ID as received after the registration process with BS PAYONE.
- Enter the account ID as received after the registration process with Payone. + Enter the account ID as received after the registration process with BS PAYONE.
- Enter the key as received after the registration process with Payone. + Enter the key as received after the registration process with BS PAYONE.
- Select when and how orders with the payment method Payone are marked as paid in your plentymarkets system.
Manually/Event procedure: Select this option if you wish to manually book incoming payment or to set up an event procedure booking incoming payment.
- Directly after authorisation:: Select this option if incoming payment should be booked directly after completion of the checkout process in the online store and successful authorisation by Payone. + Select when and how orders with the payment method BS PAYONE are marked as paid in your plentymarkets system.
Manually/Event procedure: Select this option if you wish to manually book incoming payment or to set up an event procedure booking incoming payment.
+ Directly after authorisation:: Select this option if incoming payment should be booked directly after completion of the checkout process in the online store and successful authorisation by BS PAYONE.
-## Automatically refunding Payone payments +## Automatically refunding BS PAYONE payments -Set up an event procedure to automatically refund a Payone payment. +Set up an event procedure to automatically refund a BS PAYONE payment. ##### Setting up an event procedure: @@ -294,7 +294,7 @@ Set up an event procedure to automatically refund a Payone payment. From 70d393d438c722e525799b96da82b428b27a2a5e Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 29 Mar 2019 13:19:36 +0100 Subject: [PATCH 012/107] ADD info on container links --- meta/documents/user_guide_de.md | 4 ++-- meta/documents/user_guide_en.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index ebe0e8eb..eba4c72e 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -261,7 +261,7 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Order Confirmation Page Payment Data @@ -269,7 +269,7 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Checkout JS diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 288d4a8e..ef3c6d25 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -260,7 +260,7 @@ You have multiple options to integrate the payment method BS PAYONE into your on Payone Order Confirmation Page Payment Data @@ -268,7 +268,7 @@ You have multiple options to integrate the payment method BS PAYONE into your on Payone Checkout JS From d6b36da8ac549a4a9acf6b8bba6afaa5b1607950 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 29 Mar 2019 13:38:43 +0100 Subject: [PATCH 013/107] ADD pmi info --- meta/documents/user_guide_de.md | 2 ++ meta/documents/user_guide_en.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index eba4c72e..4cf35feb 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -24,6 +24,8 @@ Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: **Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein BS PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** +Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Händlerportal ein und nehmen die folgenden Einstellungen vor: + Aktivieren Sie die gewünschten BS PAYONE-Zahlungsarten einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index ef3c6d25..122d41a5 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -24,6 +24,8 @@ The plugin currently offers the following payment methods: **Note: Before using the plugin, you have to register for a BS PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** +Upon receipt of your access data, log in to the BS PAYONE merchant portal and carry out the following settings: + First of all, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. In addition, make sure that the payment method is included among the Permitted payment methods in the customer classes and that it is not listed among the Blocked payment methods in the shipping profiles. From 23675aedba3aeff653f6c38883a550ed7eb18eb9 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Tue, 2 Apr 2019 16:37:56 +0200 Subject: [PATCH 014/107] ADD final changes to user guide --- meta/documents/user_guide_de.md | 14 +++++++++++--- meta/documents/user_guide_en.md | 12 ++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 4cf35feb..4ea5aeda 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -24,9 +24,17 @@ Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: **Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein BS PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** -Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Händlerportal ein und nehmen die folgenden Einstellungen vor: +Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. -Aktivieren Sie die gewünschten BS PAYONE-Zahlungsarten einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . +##### Einstellungen im PAYONE Merchant Interface vornehmen: + +1. Öffnen Sie das Menü **Konfiguration » Zahlungsportale**. +2. Öffnen Sie das Tab **Erweitert** des Zahlungsportals Ihres Shops. +3. Tragen Sie im Feld **TransactionStatusURL** eine URL nach dem Schema **DOMAIN/payment/payone/status** ein. Den Platzhalter **DOMAIN** durch die URL zu Ihrem Webshop ersetzen. +4. Wählen Sie als **Verfahren Hashwert-Prüfung** die Option **md5 oder sha2-384 (für Migration)**. +5. **Speichern** Sie die Einstellungen. + +Aktivieren Sie die gewünschten BS PAYONE-Zahlungsarten in Ihrem plentymarkets Backend einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. @@ -34,7 +42,7 @@ Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlun Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. -##### Grundeinstellungen vornehmen +##### Grundeinstellungen vornehmen: 1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. 2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS BS PAYONE**. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 122d41a5..f38d51ca 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -24,9 +24,17 @@ The plugin currently offers the following payment methods: **Note: Before using the plugin, you have to register for a BS PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** -Upon receipt of your access data, log in to the BS PAYONE merchant portal and carry out the following settings: +Upon receipt of your access data, log in to the BS PAYONE merchant interface and carry out the following settings. -First of all, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. +##### Carrying out settings in the BS PAYONE merchant interface + +1. Go to **Configuration » Payment portals**. +2. Open the **Extended Tab** of the payment portal belonging to your online store. +3. In the field **TransactionStatusURL**, enter a URL following the pattern **DOMAIN/payment/payone/status**. Replace **DOMAIN** with the URL of your online store. +4. For the option **Method hash calculation**, select the option **md5 or sha2-384 (during migration)**. +5. **Save** the settings. + +In your plentymarkets back end, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. In addition, make sure that the payment method is included among the Permitted payment methods in the customer classes and that it is not listed among the Blocked payment methods in the shipping profiles. From 1442b99659a844f03f69b512381ff2222705323b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Tue, 2 Apr 2019 18:40:29 +0200 Subject: [PATCH 015/107] plugin.json description, email and phone updated --- plugin.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugin.json b/plugin.json index 15e510eb..1e1ad473 100644 --- a/plugin.json +++ b/plugin.json @@ -7,11 +7,13 @@ "name": "Payone", "marketplaceName" : {"de":"BS Payone","en":"BS Payone"}, "shortDescription": { - "de": "Das offizielle Payone plugin für Plentymarkets. Das Payone Plugin setzt einen Checkout-Prozess auf Basis von Ceres voraus.", - "en": "The official Payone plugin for plentymarkets" + "de": "Das offizielle Payone plugin für plentymarkets Webshops. Das Payone Plugin setzt einen Checkout-Prozess auf Basis von Ceres voraus.", + "en": "The official Payone plugin for plentymarkets online stores" }, "description": "The official Payone plugin for plentymarkets", "author": "plentysystems AG", + "email": "sales@plentymarkets.com", + "phone": "+49 561 98 681 100", "keywords": ["Payone", "plentymarkets", "payment"], "categories": [3519], "type": "payment", From 3ff6f1e94e8789f69dfbf3d7a5ca158eca0dd327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Tue, 2 Apr 2019 20:40:28 +0200 Subject: [PATCH 016/107] fixed internal error on loading scripts, optimized script loading (scripts will just be loaded in checkout myaccount and orderconfirmation) --- resources/views/Partials/Javascript.twig | 3 +++ src/Models/PaymentConfig/ApiCredentials.php | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/resources/views/Partials/Javascript.twig b/resources/views/Partials/Javascript.twig index 21922857..8d89d3a8 100644 --- a/resources/views/Partials/Javascript.twig +++ b/resources/views/Partials/Javascript.twig @@ -1,3 +1,4 @@ +{% if (services.template.isCurrentTemplate('tpl.checkout') or services.template.isCurrentTemplate('tpl.my-account') or services.template.isCurrentTemplate('tpl.confirmation')) %} + +{% endif %} \ No newline at end of file diff --git a/src/Models/PaymentConfig/ApiCredentials.php b/src/Models/PaymentConfig/ApiCredentials.php index bccb6e94..45dd0d6c 100644 --- a/src/Models/PaymentConfig/ApiCredentials.php +++ b/src/Models/PaymentConfig/ApiCredentials.php @@ -24,7 +24,7 @@ public function __construct( /** * @return string */ - public function getKey(): string + public function getKey() { return $this->configRepo->get('key'); } @@ -32,7 +32,7 @@ public function getKey(): string /** * @return string */ - public function getAid(): string + public function getAid() { return $this->configRepo->get('aid'); } @@ -40,7 +40,7 @@ public function getAid(): string /** * @return string */ - public function getMid(): string + public function getMid() { return $this->configRepo->get('mid'); } @@ -48,7 +48,7 @@ public function getMid(): string /** * @return string */ - public function getPortalid(): string + public function getPortalid() { return $this->configRepo->get('portalid'); } @@ -56,7 +56,7 @@ public function getPortalid(): string /** * @return string */ - public function getMode(): string + public function getMode() { $mode = $this->configRepo->get('mode'); From 8f8f8d83446618d93b3d7bebf7107411e7740c54 Mon Sep 17 00:00:00 2001 From: Marvin Kanitz <> Date: Thu, 4 Apr 2019 15:01:35 +0200 Subject: [PATCH 017/107] reload checkout --- .../views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig | 2 +- .../views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT.twig | 2 +- .../PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT_MANDATE.twig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig index ca378c97..3ff65368 100644 --- a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig +++ b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig @@ -68,7 +68,7 @@ {% if errorMessage is empty %} diff --git a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT.twig b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT.twig index 50aeb913..64886229 100644 --- a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT.twig +++ b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT.twig @@ -49,7 +49,7 @@ {% if errorMessage is empty %} diff --git a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT_MANDATE.twig b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT_MANDATE.twig index 0c479be8..2334296c 100644 --- a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT_MANDATE.twig +++ b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_DIRECT_DEBIT_MANDATE.twig @@ -30,7 +30,7 @@ From 2e50d39a3bb5d018e403662aaa7cc8f68fd83ef4 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Tue, 9 Apr 2019 17:01:26 +0200 Subject: [PATCH 018/107] CHANGE information according to partner management --- meta/documents/user_guide_de.md | 2 +- meta/documents/user_guide_en.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 4ea5aeda..5705ab6c 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -22,7 +22,7 @@ Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: ## Erste Schritte -**Hinweis: Bevor Sie das Plugin nutzen, müssen Sie ein BS PAYONE Konto beantragen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** +**Hinweis: Die Nutzung dieses Plugins erfordert einen Freischaltcode, den Sie über die PSG Projektmanagement GmbH erhalten können. Unter bestimmten Voraussetzungen können Sie in Verbindung mit dieser Zahlart über die PSG Projektmanagement GmbH in den Genuss eines attraktiven Förderprogramms kommen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index f38d51ca..cf4ade6b 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -22,7 +22,7 @@ The plugin currently offers the following payment methods: ## First steps -**Note: Before using the plugin, you have to register for a BS PAYONE account. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** +**Note: The use of this plugin requires an access code which can be obtained from PSG Projektmanagement GmbH. Under certain conditions, you can take part in an attractive promotion program through PSG Projektmanagement GmbH in connnection with this payment method. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** Upon receipt of your access data, log in to the BS PAYONE merchant interface and carry out the following settings. From 63b1669cde8c34b402648450b9681fc4aed2c44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Wed, 10 Apr 2019 12:04:08 +0200 Subject: [PATCH 019/107] Change logging to the correct logging level Remove logging debug mode --- config.json | 23 ----------------- src/Adapter/Logger.php | 27 -------------------- src/Controllers/StatusController.php | 2 +- src/Helpers/ShopHelper.php | 11 -------- src/Providers/DataProviders/Javascript.php | 1 - src/Providers/PayoneRouteServiceProvider.php | 2 -- src/Services/Api.php | 18 ++++++------- src/Views/ErrorMessageRenderer.php | 3 +-- src/Views/PaymentRenderer.php | 3 +-- 9 files changed, 12 insertions(+), 78 deletions(-) diff --git a/config.json b/config.json index 3ae6bb26..2dd93a73 100644 --- a/config.json +++ b/config.json @@ -810,29 +810,6 @@ } } } - }, - "Config.DebuggingTab": { - "label": "Config.DebuggingTab", - "formFields": { - "debugging.active": { - "type": "selectBox", - "required": false, - "label": "Config.debuggingActiveLabel", - "options": { - "defaultValue": "0", - "selectBoxValues": [ - { - "value": "0", - "caption": "Config.debuggingActivePossibleValue0" - }, - { - "value": "1", - "caption": "Config.debuggingActivePossibleValue1" - } - ] - } - } - } } } } \ No newline at end of file diff --git a/src/Adapter/Logger.php b/src/Adapter/Logger.php index b4932158..53d849fc 100644 --- a/src/Adapter/Logger.php +++ b/src/Adapter/Logger.php @@ -69,12 +69,7 @@ public function debug( string $code, $additionalInfo = null ) { - if ($this->shopHelper->isDebugModeActive()) { - return $this->critical($code, $additionalInfo); - } - $this->getPlentyLogger()->debug(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -88,12 +83,7 @@ public function info( string $code, $additionalInfo = null ) { - if ($this->shopHelper->isDebugModeActive()) { - return $this->critical($code, $additionalInfo); - } - $this->getPlentyLogger()->info(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -107,12 +97,7 @@ public function notice( string $code, $additionalInfo = null ) { - if ($this->shopHelper->isDebugModeActive()) { - return $this->critical($code, $additionalInfo); - } - $this->getPlentyLogger()->notice(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -126,12 +111,7 @@ public function warning( string $code, $additionalInfo = null ) { - if ($this->shopHelper->isDebugModeActive()) { - return $this->critical($code, $additionalInfo); - } - $this->getPlentyLogger()->warning(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -146,7 +126,6 @@ public function error( $additionalInfo = null ) { $this->getPlentyLogger()->error(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -161,7 +140,6 @@ public function critical( $additionalInfo = null ) { $this->getPlentyLogger()->critical(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -176,7 +154,6 @@ public function alert( $additionalInfo = null ) { $this->getPlentyLogger()->alert(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -191,7 +168,6 @@ public function emergency( $additionalInfo = null ) { $this->getPlentyLogger()->emergency(PluginConstants::NAME . '::' . $code, $additionalInfo); - return $this; } @@ -205,7 +181,6 @@ public function logException( \Exception $exception ) { $this->getPlentyLogger()->logException($exception); - return $this; } @@ -219,7 +194,6 @@ public function setReferenceType( ) { $this->referenceType = $referenceType; $this->logger->setReferenceType($referenceType); - return $this; } @@ -233,7 +207,6 @@ public function setReferenceValue( ) { $this->referenceValue = $referenceValue; $this->logger->setReferenceValue($referenceValue); - return $this; } diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index e1ea3e08..8b1e9d54 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -10,7 +10,7 @@ use Plenty\Plugin\Http\Request; /** - * Class ConfigController + * Class StatusController */ class StatusController extends Controller { diff --git a/src/Helpers/ShopHelper.php b/src/Helpers/ShopHelper.php index 778ff845..36f395e9 100644 --- a/src/Helpers/ShopHelper.php +++ b/src/Helpers/ShopHelper.php @@ -79,17 +79,6 @@ public function getCurrentCurrency() return $config['currency'] ?? $this->getDefaultCurrency(); } - /** - * @return bool - */ - public function isDebugModeActive() - { - /** @var ConfigRepository $config */ - $config = pluginApp(ConfigRepository::class); - - return (bool) $config->get(PluginConstants::NAME . '.debugging.active'); - } - /** * @return string */ diff --git a/src/Providers/DataProviders/Javascript.php b/src/Providers/DataProviders/Javascript.php index 091e77d8..18888038 100644 --- a/src/Providers/DataProviders/Javascript.php +++ b/src/Providers/DataProviders/Javascript.php @@ -38,7 +38,6 @@ public function call( PluginConstants::NAME . '::Partials.Javascript', [ 'locale' => $helper->getCurrentLanguage(), - 'isDebugModeEnabled' => $helper->isDebugModeActive(), 'creditcardcheck' => $creditCardCheck, 'allowedCCTypes' => $creditcardTypes->getAllowedTypes(), 'defaultWidthInPx' => $style->getDefaultWidthInPx(), diff --git a/src/Providers/PayoneRouteServiceProvider.php b/src/Providers/PayoneRouteServiceProvider.php index 55bebfa5..d7dda8b6 100644 --- a/src/Providers/PayoneRouteServiceProvider.php +++ b/src/Providers/PayoneRouteServiceProvider.php @@ -16,8 +16,6 @@ class PayoneRouteServiceProvider extends RouteServiceProvider public function map(Router $router) { - $router->get('payment/payone/migrate/', 'Payone\Controllers\ConfigController@migrate'); - $router->post('payment/payone/status/', 'Payone\Controllers\StatusController@index'); $router->post('payment/payone/checkout/doAuth', 'Payone\Controllers\CheckoutController@doAuth'); diff --git a/src/Services/Api.php b/src/Services/Api.php index 4599c876..1dbcf967 100644 --- a/src/Services/Api.php +++ b/src/Services/Api.php @@ -70,7 +70,7 @@ public function doAuth($requestParams): AuthResponse $responseObject = AuthResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; } @@ -89,7 +89,7 @@ public function doPreAuth($requestParams): PreAuthResponse $responseObject = PreAuthResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_PRE_AUTH), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_PRE_AUTH), $response); return $responseObject; } @@ -109,7 +109,7 @@ public function doReversal($requestParams): Response $responseObject = ResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_REVERSAL), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_REVERSAL), $response); return $responseObject; } @@ -129,7 +129,7 @@ public function doCapture($requestParams): Response $responseObject = ResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_CAPTURE), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_CAPTURE), $response); return $responseObject; } @@ -149,7 +149,7 @@ public function doRefund($requestParams): Response $responseObject = ResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; } @@ -167,7 +167,7 @@ public function doReAuth($requestParams): Response $responseObject = ResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; } @@ -185,7 +185,7 @@ public function doDebit($requestParams): Response $responseObject = ResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; } @@ -203,7 +203,7 @@ public function doManagemandate($requestParams): ManagemandateResponse $responseObject = ManagemandateResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); - $this->logger->critical('Api.' . $this->getCallAction(self::REQUEST_TYPE_MANAGEMANDATE), $response); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_MANAGEMANDATE), $response); return $responseObject; } @@ -217,7 +217,7 @@ public function doManagemandate($requestParams): ManagemandateResponse public function doLibCall($call, $requestParams): array { $this->logger->setReferenceType(Logger::PAYONE_REQUEST_REFERENCE); - $this->logger->critical('Api.' . $this->getCallAction($call), $requestParams); + $this->logger->debug('Api.' . $this->getCallAction($call), $requestParams); try { $response = $this->libCall->call( diff --git a/src/Views/ErrorMessageRenderer.php b/src/Views/ErrorMessageRenderer.php index 7f897104..68256333 100644 --- a/src/Views/ErrorMessageRenderer.php +++ b/src/Views/ErrorMessageRenderer.php @@ -46,8 +46,7 @@ public function render($errorMessage) return $this->twig->render( PluginConstants::NAME . '::Partials.Error', [ - 'errorMessage' => $errorMessage, - 'isDebugModeEnabled' => $this->shopHelper->isDebugModeActive(), + 'errorMessage' => $errorMessage ] ); } diff --git a/src/Views/PaymentRenderer.php b/src/Views/PaymentRenderer.php index 0cf7e3b7..1700ea6d 100644 --- a/src/Views/PaymentRenderer.php +++ b/src/Views/PaymentRenderer.php @@ -85,8 +85,7 @@ public function render(PaymentAbstract $payment, $message) 'ccTypes' => $this->creditcardTypes->getAllowedTypes(), 'defaultWidthInPx' => $this->style->getDefaultWidthInPx(), 'defaultHeightInPx' => $this->style->getDefaultHeightInPx(), - 'defaultStyle' => $this->style->getDefaultStyle(), - 'isDebugModeEnabled' => $this->shopHelper->isDebugModeActive(), + 'defaultStyle' => $this->style->getDefaultStyle() ] ); } From ecf7666041ecc824a9550ad5b9aeb8f8cb455b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Wed, 10 Apr 2019 12:04:29 +0200 Subject: [PATCH 020/107] Update lang files --- resources/lang/de/Config.properties | 6 +++--- resources/lang/en/Config.properties | 6 +++--- src/Providers/PayoneServiceProvider.php | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index f154e204..515d3eb5 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -6,9 +6,9 @@ keyLabel=Schlüssel modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Art des Zahlungseinzugs -authTypePossibleValue0=Manuell/Ereignisaktion -authTypePossibleValue1=Direkt nach der Autorisierung +authTypeLabel=Art der Authorisierung +authTypePossibleValue0=Vorauthorisierung +authTypePossibleValue1=Authorisierung RechnungTab=Rechnung PAYONEPAYONEINVOICEActiveLabel=Aktiv PAYONEPAYONEINVOICEActivePossibleValue0=Nein diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index ffe3f93d..95dd8bd6 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -6,9 +6,9 @@ keyLabel=Key modeLabel=Mode modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Method for payment registration -authTypePossibleValue0=Manually/Event procedure -authTypePossibleValue1=Directly after authorisation +authTypeLabel=Authorization method +authTypePossibleValue0=Preauthorization +authTypePossibleValue1=Authorization RechnungTab=Invoice PAYONEPAYONEINVOICEActiveLabel=Active PAYONEPAYONEINVOICEActivePossibleValue0=No diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index aaac9657..65b280c8 100644 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -112,8 +112,8 @@ public function boot( ); $captureProcedureTitle = [ - 'de' => PluginConstants::NAME . ' | Zahlungseingang buchen', - 'en' => PluginConstants::NAME . ' | Book incoming payment', + 'de' => 'Versandbestätigung an ' . PluginConstants::NAME, + 'en' => 'Send shipping confirmation to ' . PluginConstants::NAME, ]; $eventProceduresService->registerProcedure( PluginConstants::NAME, From afd7ace3dcbba76a744bc1365ebbe03c4e16e450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Wed, 10 Apr 2019 13:27:19 +0200 Subject: [PATCH 021/107] Remove unused function and file FIx DataProvider object check --- src/Controllers/ConfigController.php | 267 ------------------ .../ConfirmationAdditionalPaymentData.php | 9 +- 2 files changed, 7 insertions(+), 269 deletions(-) delete mode 100644 src/Controllers/ConfigController.php diff --git a/src/Controllers/ConfigController.php b/src/Controllers/ConfigController.php deleted file mode 100644 index 6eba0b5e..00000000 --- a/src/Controllers/ConfigController.php +++ /dev/null @@ -1,267 +0,0 @@ -configRepo = $configRepo; - $this->paymentMethodRepo = $paymentMethodRepo; - $this->paymentHelper = $paymentHelper; - $this->shopHelper = $shopHelper; - } - - /** - * @param Request $request - */ - public function printConfig(Request $request) - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - - try { - return json_encode($this->configRepo->get(PluginConstants::NAME), JSON_PRETTY_PRINT) . - PHP_EOL . $request->get('configPath') . PHP_EOL . - json_encode($this->configRepo->get($request->get('configPath')), - JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return $e->getMessage(); - } - } - - public function migrate(CreatePaymentMethods $migration) - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $migration->run(); - - return __METHOD__; - } catch (\Exception $e) { - return $e->getMessage(); - } - } - - public function printAllPaymentMethods() - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - $paymentMethods = $this->paymentMethodRepo->all(); - - $text = ''; - foreach ($paymentMethods as $paymentMethod) { - $text .= $paymentMethod->id . ': ' . $paymentMethod->paymentKey . PHP_EOL; - } - - return $text; - } - - /** - * @param Request $request - * @param Api $api - * @param PreAuthDataProvider $provider - * @param BasketRepositoryContract $basket - * - * @return string|void - */ - public function doPreCheck( - Request $request, - Api $api, - PreAuthDataProvider $provider, - BasketRepositoryContract $basket - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $paymentCode = $request->get('paymentCode'); - $response = $api->doPreAuth( - $provider->getDataFromBasket($paymentCode, $basket->load()) - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param PreAuthDataProvider $provider - * @param BasketRepositoryContract $basket - * - * @return string|void - */ - public function testRequestData( - Request $request, - PreAuthDataProvider $provider, - BasketRepositoryContract $basket - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - return json_encode($provider->getDataFromBasket($request->get('paymentCode'), $basket->load()), - JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ShippingProfileRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printShippingProfiles( - Request $request, - ShippingProfileRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->get($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ItemShippingProfilesRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printItemShippingProfiles( - Request $request, - ItemShippingProfilesRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->find($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ParcelServicePresetRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printParcelServicePreset( - Request $request, - ParcelServicePresetRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->getPresetById($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } -} diff --git a/src/Providers/DataProviders/ConfirmationAdditionalPaymentData.php b/src/Providers/DataProviders/ConfirmationAdditionalPaymentData.php index 0ef54e65..25a01a0c 100644 --- a/src/Providers/DataProviders/ConfirmationAdditionalPaymentData.php +++ b/src/Providers/DataProviders/ConfirmationAdditionalPaymentData.php @@ -7,6 +7,7 @@ use Payone\Models\Api\AuthResponse; use Payone\Models\Api\Clearing\Bank; use Payone\Models\Api\PreAuthResponse; +use Payone\Models\Api\ResponseAbstract; use Payone\Models\ApiResponseCache; use Payone\PluginConstants; use Plenty\Modules\Order\Models\Order; @@ -37,12 +38,12 @@ public function call( $order = $arg[0]; $logger->setIdentifier(__METHOD__)->debug('Dataprovider.ConfirmationAdditionalPaymentData', $arg); - if (!($order instanceof Order)) { + if ( !is_array($order) || $order['id'] <= 0 ) { $logger->setIdentifier(__METHOD__)->debug('Dataprovider.ConfirmationAdditionalPaymentData', 'Not an order.'); return ''; } - $payments = $paymentRepositoryContract->getPaymentsByOrderId($order->id); + $payments = $paymentRepositoryContract->getPaymentsByOrderId($order['id']); foreach ($payments as $payment) { /** @var Payment $payment */ if (!$paymentHelper->isPayonePayment($payment->mopId)) { @@ -56,6 +57,10 @@ public function call( /** @var AuthResponse|PreAuthResponse $auth */ $auth = $paymentCache->loadAuth($payment->mopId); + if(!$auth instanceof ResponseAbstract) { + return ''; + } + $clearing = $auth->getClearing(); if (!$clearing || !($clearing instanceof Bank)) { continue; From e595dc2eb74e32ecd5e3578bf4419603517a9654 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Wed, 10 Apr 2019 13:59:55 +0200 Subject: [PATCH 022/107] some corrections in user guide DE --- meta/documents/user_guide_de.md | 74 +++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 5705ab6c..b7c6f4a6 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -104,11 +104,11 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo @@ -285,27 +285,83 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container
- Tab. 5: Event procedure for automatically refunding Payone payments + Tab. 5: Event procedure for automatically refunding BS PAYONE payments
- Verknüpfen Sie diesen Content mit dem Container **Script loader: After script loaded**, um + Verknüpfen Sie diesen Content mit dem Container Order confirmation: Additional payment information, um die BS PAYONE-Zahlungsarten auf der Bestellbestätigungsseite im Webshop anzuzeigen.
- Verknüpfen Sie diesen Content mit dem Container **Script loader: After script loaded**, um + Verknüpfen Sie diesen Content mit dem Container Script loader: After script loaded, um die BS PAYONE-Zahlungsarten während der Kaufabwicklung im Webshop anzuzeigen.
- Link this content to the container Script loader: After script loaded to + Link this content to the container Order confirmation: Additional payment information to display the BS PAYONE payment methods on the order confirmation page in the online store.
- Linkt his content to the container Script loader: After script loaded to + Link this content to the container Script loader: After script loaded to display the BS PAYONE payment methods during the checkout process in the online store.
- Art des Zahlungseinzugs + Art der Autorisierung - Wählen Sie, wann und auf welche Weise Aufträge mit der Zahlungsart BS PAYONE in Ihrem plentymarkets System als bezahlt markiert werden sollen.
Manuell/Ereignisaktion: Wählen Sie diese Option, wenn Sie für BS PAYONE-Zahlungen manuell oder per Ereignisaktion den Zahlungseingang buchen wollen.
- Direkt nach der Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseingang direkt nach dem Kaufabschluss im Webshop und der anschließenden Autorisierung durch BS PAYONE in Ihrem plentymarkets System gebucht werden soll. + Vorautorisierung: Wählen Sie diese Option, wenn die Zahlung beim Käufer nur vorgemerkt werden soll. Der Zahlungseinzug erfolgt dann durch eine Ereignisaktion, die beim Warenausgang ausgelöst werden muss (siehe Tabelle 5).
+ Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseinzug beim Käufer sofort stattfinden soll. Der Zahlungseingang wird somit direkt nach dem Kaufabschluss im Webshop in Ihrem plentymarkets System gebucht.
-## BS PAYONE-Zahlung automatisch zurückzahlen +## Automatische Versandbestätigung an BS PAYONE senden -Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS PAYONE zu automatisieren. +Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an BS PAYONE zu senden, sobald Sie den Auftrag versendet haben. + +**Hinweis:** Die Einrichtung dieser Ereignisaktion ist zwingend notwendig, wenn als **Art der Autorisierung** die Option **Vorautorisierung** gewählt wurde (siehe Tabelle 1). Haben Sie die Option **Autorisierung** gewählt, ist diese Ereignisaktion nicht nutzbar und nicht notwendig. ##### Ereignisaktion einrichten: 1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. -2. Klicken Sie auf **Ereignisaktion hinzufügen**.
+2. Klicken Sie auf **Ereignisaktion hinzufügen**. → Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. 3. Geben Sie einen Namen ein. 4. Wählen Sie das Ereignis gemäß Tabelle 5. -5. **Speichern** Sie die Einstellungen.
+5. **Speichern** Sie die Einstellungen. → Die Ereignisaktion wird angelegt. 6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 5 vor. 7. Setzen Sie ein Häkchen bei **Aktiv**. -8. **Speichern** Sie die Einstellungen.
+8. **Speichern** Sie die Einstellungen. +→ Die Ereignisaktion wird gespeichert. + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Tab. 5: Ereignisaktion zum Senden einer automatischen Versandbestätigung an BS PAYONE +
+ Einstellung + + Option + + Auswahl +
EreignisDas Ereignis wählen, nach dem die Versandbestätigung automatisch versendet werden soll, beispielsweise Auftragsänderung > Warenausgang gebucht
Filter 1Auftrag > ZahlungsartPlugin: PAYONE +
AktionPlugin > BS PAYONE | Versandbestätigung senden
+ +## BS PAYONE-Zahlung automatisch zurückzahlen + +Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS PAYONE zu automatisieren. + +##### Ereignisaktion einrichten: + +1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. +2. Klicken Sie auf **Ereignisaktion hinzufügen**. +→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +3. Geben Sie einen Namen ein. +4. Wählen Sie das Ereignis gemäß Tabelle 6. +5. **Speichern** Sie die Einstellungen. +→ Die Ereignisaktion wird angelegt. +6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 6 vor. +7. Setzen Sie ein Häkchen bei **Aktiv**. +8. **Speichern** Sie die Einstellungen. → Die Ereignisaktion wird gespeichert. From 21306deec43d72460e8dad206ceaaea0142d3512 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Wed, 10 Apr 2019 14:31:17 +0200 Subject: [PATCH 023/107] FIX authorisation and other labels --- resources/lang/de/Config.properties | 6 +++--- resources/lang/en/Config.properties | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index 515d3eb5..d7273163 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -6,9 +6,9 @@ keyLabel=Schlüssel modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Art der Authorisierung -authTypePossibleValue0=Vorauthorisierung -authTypePossibleValue1=Authorisierung +authTypeLabel=Art der Autorisierung +authTypePossibleValue0=Vorautorisierung +authTypePossibleValue1=Autorisierung RechnungTab=Rechnung PAYONEPAYONEINVOICEActiveLabel=Aktiv PAYONEPAYONEINVOICEActivePossibleValue0=Nein diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index 95dd8bd6..ca7ca5ba 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -1,4 +1,4 @@ -GrundeinstellungenTab=Basesettings +GrundeinstellungenTab=Basic settings midLabel=Merchant ID portalidLabel=Portal ID aidLabel=Account ID @@ -6,9 +6,9 @@ keyLabel=Key modeLabel=Mode modePossibleValue0=Test modePossibleValue1=Live -authTypeLabel=Authorization method -authTypePossibleValue0=Preauthorization -authTypePossibleValue1=Authorization +authTypeLabel=Authorisation method +authTypePossibleValue0=Preauthorisation +authTypePossibleValue1=Authorisation RechnungTab=Invoice PAYONEPAYONEINVOICEActiveLabel=Active PAYONEPAYONEINVOICEActivePossibleValue0=No From de1b1b31f4f32a0aad344a695151be6361e69508 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Wed, 10 Apr 2019 15:25:46 +0200 Subject: [PATCH 024/107] change user guide EN --- meta/documents/user_guide_de.md | 2 +- meta/documents/user_guide_en.md | 71 +++++++++++++++++++++++++++++---- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index b7c6f4a6..5b899baf 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -107,7 +107,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo Art der Autorisierung diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index cf4ade6b..e5eb2f39 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -104,12 +104,11 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie + Preauthorisation: Select this option if payment collection should only be prepared for the customer. The definite collection of payment has to be effected by an event procedure that should be triggered by booking outgoing items (see table 5).
+ Authorisation: Select this option if the payment should be collected from the customer immediately. Incoming payment is then booked directly after the customer has completed the checkout process in the online store.
- Tab. 5: Ereignisaktion zur automatischen Rückzahlung der BS PAYONE-Zahlung + Tab. 6: Ereignisaktion zur automatischen Rückzahlung der BS PAYONE-Zahlung
- Vorautorisierung: Wählen Sie diese Option, wenn die Zahlung beim Käufer nur vorgemerkt werden soll. Der Zahlungseinzug erfolgt dann durch eine Ereignisaktion, die beim Warenausgang ausgelöst werden muss (siehe Tabelle 5).
+ Vorautorisierung: Wählen Sie diese Option, wenn der Zahlungseinzug beim Käufer nur vorgemerkt werden soll. Der Zahlungseinzug erfolgt dann durch eine Ereignisaktion, die beim Warenausgang ausgelöst werden muss (siehe Tabelle 5).
Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseinzug beim Käufer sofort stattfinden soll. Der Zahlungseingang wird somit direkt nach dem Kaufabschluss im Webshop in Ihrem plentymarkets System gebucht.
- Method for payment registration + Authorisation method - Select when and how orders with the payment method BS PAYONE are marked as paid in your plentymarkets system.
Manually/Event procedure: Select this option if you wish to manually book incoming payment or to set up an event procedure booking incoming payment.
- Directly after authorisation:: Select this option if incoming payment should be booked directly after completion of the checkout process in the online store and successful authorisation by BS PAYONE. -
@@ -187,7 +186,7 @@ In the following, you select the BS PAYONE payment methods that should be availa -**Note:** The payment method Die Zahlungsart **Credit card** requires particular attention. Additional settings are necessary for this payment method. The settings are described in table 3. +**Note:** The payment method **Credit card** requires particular attention. Additional settings are necessary for this payment method. The settings are described in table 3. @@ -284,9 +283,11 @@ You have multiple options to integrate the payment method BS PAYONE into your on
Tab. 3: Setting up the payment method Credit card
-## Automatically refunding BS PAYONE payments +## Sending an automatic shipping confirmation to BS PAYONE -Set up an event procedure to automatically refund a BS PAYONE payment. +Set up an event procedure to send an automatic shipping confirmation to BS PAYONE as soon as you have shipped the order. + +**Note:** Sending up the following event procedure is mandatory if you have selected the option **Preauthorisation** as **Authorisation method** (see table 1). This event procedure is not necessary and cannot be used if you have selected the option **Authorisation**. ##### Setting up an event procedure: @@ -304,7 +305,61 @@ Set up an event procedure to automatically refund a BS PAYONE payment. + + + + + + + + + + + + + + + + + + + + + + + +
- Tab. 5: Event procedure for automatically refunding BS PAYONE payments + Tab. 5: Event procedure for sending an automatic shipping confirmation to BS PAYONE +
+ Setting + + Option + + Selection +
EventSelect the event after which an automatic shipping confirmation should be sent, e.g. Order change > Outgoing items booked
Filter 1Order > Payment methodPlugin: PAYONE +
ProcedurePlugins > Payone | Refund order
+ +## Automatically refunding BS PAYONE payments + +Set up an event procedure to automatically refund a BS PAYONE payment. + +##### Setting up an event procedure: + +1. Go to **System » Orders » Events**. +2. Click on **Add event procedure**. +→ The **Create new event procedure** window opens. +3. Enter a name. +4. Select the event according to table 6. +5. **Save** the settings. +→ The event procedure is created. +6. Carry out the further settings according to table 6. +7. Place a check mark next to the option **Active**. +8. **Save** the settings. +→ The event procedure is saved. + + + From 452c0aaff520ea5981e1859097233c618c458ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Fri, 12 Apr 2019 09:48:20 +0200 Subject: [PATCH 025/107] Update Version 1.1.0 --- plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.json b/plugin.json index 1e1ad473..d5115f85 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.0.9", + "version": "1.1.0", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From f22acdf0957ec3a1e52ef06bba0d06fc1fee9a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=AB?= Date: Fri, 12 Apr 2019 10:16:16 +0200 Subject: [PATCH 026/107] Remove unused file add require IO --- plugin.json | 2 +- resources/views/Partials/Error.twig | 6 +- src/Controllers/ConfigController.php | 267 --------------------------- 3 files changed, 2 insertions(+), 273 deletions(-) delete mode 100644 src/Controllers/ConfigController.php diff --git a/plugin.json b/plugin.json index d5115f85..75d31de7 100644 --- a/plugin.json +++ b/plugin.json @@ -20,7 +20,7 @@ "namespace": "Payone", "javaScriptFiles": [], "containers": [], - "require": [], + "require": ["IO"], "serviceProvider": "Payone\\Providers\\PayoneServiceProvider", "dependencies":{ "arvatis/payone-php-api":"2.2.*" diff --git a/resources/views/Partials/Error.twig b/resources/views/Partials/Error.twig index 0296dadd..cd534712 100755 --- a/resources/views/Partials/Error.twig +++ b/resources/views/Partials/Error.twig @@ -1,5 +1 @@ -{% if isDebugModeEnabled %} - {{ trans(errorMessage) }} -{% else %} - {{ trans('Payone::Template.orderErrorMessage') }} -{% endif %} \ No newline at end of file +{{ trans('Payone::Template.orderErrorMessage') }} \ No newline at end of file diff --git a/src/Controllers/ConfigController.php b/src/Controllers/ConfigController.php deleted file mode 100644 index 6eba0b5e..00000000 --- a/src/Controllers/ConfigController.php +++ /dev/null @@ -1,267 +0,0 @@ -configRepo = $configRepo; - $this->paymentMethodRepo = $paymentMethodRepo; - $this->paymentHelper = $paymentHelper; - $this->shopHelper = $shopHelper; - } - - /** - * @param Request $request - */ - public function printConfig(Request $request) - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - - try { - return json_encode($this->configRepo->get(PluginConstants::NAME), JSON_PRETTY_PRINT) . - PHP_EOL . $request->get('configPath') . PHP_EOL . - json_encode($this->configRepo->get($request->get('configPath')), - JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return $e->getMessage(); - } - } - - public function migrate(CreatePaymentMethods $migration) - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $migration->run(); - - return __METHOD__; - } catch (\Exception $e) { - return $e->getMessage(); - } - } - - public function printAllPaymentMethods() - { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - $paymentMethods = $this->paymentMethodRepo->all(); - - $text = ''; - foreach ($paymentMethods as $paymentMethod) { - $text .= $paymentMethod->id . ': ' . $paymentMethod->paymentKey . PHP_EOL; - } - - return $text; - } - - /** - * @param Request $request - * @param Api $api - * @param PreAuthDataProvider $provider - * @param BasketRepositoryContract $basket - * - * @return string|void - */ - public function doPreCheck( - Request $request, - Api $api, - PreAuthDataProvider $provider, - BasketRepositoryContract $basket - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $paymentCode = $request->get('paymentCode'); - $response = $api->doPreAuth( - $provider->getDataFromBasket($paymentCode, $basket->load()) - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param PreAuthDataProvider $provider - * @param BasketRepositoryContract $basket - * - * @return string|void - */ - public function testRequestData( - Request $request, - PreAuthDataProvider $provider, - BasketRepositoryContract $basket - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - return json_encode($provider->getDataFromBasket($request->get('paymentCode'), $basket->load()), - JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ShippingProfileRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printShippingProfiles( - Request $request, - ShippingProfileRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->get($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ItemShippingProfilesRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printItemShippingProfiles( - Request $request, - ItemShippingProfilesRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->find($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } - - /** - * @param Request $request - * @param ParcelServicePresetRepositoryContract $shippingProfileRepositoryContract - * - * @return string|void - */ - public function printParcelServicePreset( - Request $request, - ParcelServicePresetRepositoryContract $shippingProfileRepositoryContract - ) { - if (!$this->shopHelper->isDebugModeActive()) { - return; - } - try { - $shippingProviderId = $request->get('id'); - - /** @var \Plenty\Modules\Authorization\Services\AuthHelper $authHelper */ - $authHelper = pluginApp(AuthHelper::class); - $response = $authHelper->processUnguarded( - function () use ($shippingProfileRepositoryContract, $shippingProviderId) { - return $shippingProfileRepositoryContract->getPresetById($shippingProviderId); - } - ); - - return json_encode($response, JSON_PRETTY_PRINT); - } catch (\Exception $e) { - return PHP_EOL . - $e->getCode() . PHP_EOL . - $e->getMessage() . PHP_EOL . - $e->getTraceAsString(); - } - } -} From e70c419f948e6055028edc632314d5ae1c07c2a8 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 12 Apr 2019 17:49:01 +0200 Subject: [PATCH 027/107] add PSG contact data DE + EN --- meta/documents/user_guide_de.md | 12 +++++++++++- meta/documents/user_guide_en.md | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 5b899baf..70c52692 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -22,7 +22,17 @@ Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: ## Erste Schritte -**Hinweis: Die Nutzung dieses Plugins erfordert einen Freischaltcode, den Sie über die PSG Projektmanagement GmbH erhalten können. Unter bestimmten Voraussetzungen können Sie in Verbindung mit dieser Zahlart über die PSG Projektmanagement GmbH in den Genuss eines attraktiven Förderprogramms kommen. [Hier geht es zum Anmeldeformular](https://www.psg-projektmanagement.de/bs-payone/).** + + +Kontaktieren Sie uns:
+PSG Projektmanagement GmbH
+Meergässle 4
+89180 Berghülen
+Telefon: 07344-9592588
+E-Mail: plenty@psg-projektmanagement.de
+Internet: http://www.psg-projektmanagement.de Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index e5eb2f39..fe25c70e 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -22,7 +22,17 @@ The plugin currently offers the following payment methods: ## First steps -**Note: The use of this plugin requires an access code which can be obtained from PSG Projektmanagement GmbH. Under certain conditions, you can take part in an attractive promotion program through PSG Projektmanagement GmbH in connnection with this payment method. [Click here to access the registration form](https://www.psg-projektmanagement.de/bs-payone/).** + + +Contact us:
+Meergässle 4
+89180 Berghülen
+Phone: 07344-9592588
+E-mail: plenty@psg-projektmanagement.de
+Website: http://www.psg-projektmanagement.de Upon receipt of your access data, log in to the BS PAYONE merchant interface and carry out the following settings. From fd307fc0020929a083ca5924816e0a41d894a957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 2 May 2019 20:13:16 +0200 Subject: [PATCH 028/107] Fixed a problem that caused duplicate orders, debug log fixes --- meta/documents/changelog_de.md | 5 ++++ meta/documents/changelog_en.md | 5 ++++ plugin.json | 2 +- resources/lang/de/Controller.properties | 5 ++++ resources/lang/de/Payment.properties | 4 +++ resources/lang/en/Controller.properties | 5 ++++ resources/lang/en/Payment.properties | 4 +++ src/Controllers/CheckoutController.php | 25 +++++++++++++++---- src/Models/PaymentCache.php | 18 +++++++++++++ src/PluginConstants.php | 2 +- .../Api/Request/AuthDataProvider.php | 2 +- .../Api/Request/DataProviderAbstract.php | 8 ++++-- .../Api/Request/PreAuthDataProvider.php | 2 +- src/Services/PaymentCreation.php | 20 +++++++-------- 14 files changed, 86 insertions(+), 21 deletions(-) create mode 100644 resources/lang/de/Controller.properties create mode 100644 resources/lang/en/Controller.properties diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 789a35d4..7ad2e9e5 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.1 (2019-04-02) + +### Behoben +- Es wurde ein Problem behoben, was für Auftragsduplikate geführt hatte. + ## 1.1.0 (2019-03-27) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 1715f05d..09762f0c 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for Payone +## 1.1.1 (2019-04-02) + +### Fixed +- Fixed an issue that caused duplicate orders. + ## 1.1.0 (2019-03-27) ### Changed diff --git a/plugin.json b/plugin.json index 75d31de7..fb972688 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.0", + "version": "1.1.1", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/resources/lang/de/Controller.properties b/resources/lang/de/Controller.properties new file mode 100644 index 00000000..cda254fd --- /dev/null +++ b/resources/lang/de/Controller.properties @@ -0,0 +1,5 @@ +Status = "Status" +Success = "Success" +Checkout = "Checkout" +routeCalled = "route called" +redirecting = "redirecting" \ No newline at end of file diff --git a/resources/lang/de/Payment.properties b/resources/lang/de/Payment.properties index ec946c63..d184c7f6 100644 --- a/resources/lang/de/Payment.properties +++ b/resources/lang/de/Payment.properties @@ -1,3 +1,7 @@ minCartAmount = "minCartAmount" maxCartAmount = "maxCartAmount" countryNotAllowed = "countryNotAllowed" +createPayment = "createPayment" +updatePayment = "updatePayment" +updatingPayment = "updatingPayment" +createRefundPayment = "createRefundPayment" diff --git a/resources/lang/en/Controller.properties b/resources/lang/en/Controller.properties new file mode 100644 index 00000000..cda254fd --- /dev/null +++ b/resources/lang/en/Controller.properties @@ -0,0 +1,5 @@ +Status = "Status" +Success = "Success" +Checkout = "Checkout" +routeCalled = "route called" +redirecting = "redirecting" \ No newline at end of file diff --git a/resources/lang/en/Payment.properties b/resources/lang/en/Payment.properties index ec946c63..d184c7f6 100644 --- a/resources/lang/en/Payment.properties +++ b/resources/lang/en/Payment.properties @@ -1,3 +1,7 @@ minCartAmount = "minCartAmount" maxCartAmount = "maxCartAmount" countryNotAllowed = "countryNotAllowed" +createPayment = "createPayment" +updatePayment = "updatePayment" +updatingPayment = "updatingPayment" +createRefundPayment = "createRefundPayment" diff --git a/src/Controllers/CheckoutController.php b/src/Controllers/CheckoutController.php index a2ce968b..9aacf3b3 100644 --- a/src/Controllers/CheckoutController.php +++ b/src/Controllers/CheckoutController.php @@ -11,6 +11,7 @@ use Payone\Models\BankAccountCache; use Payone\Models\CreditCardCheckResponse; use Payone\Models\CreditCardCheckResponseRepository; +use Payone\Models\PaymentCache; use Payone\Models\SepaMandateCache; use Payone\PluginConstants; use Payone\Services\PaymentService; @@ -81,7 +82,7 @@ public function doAuth( BasketRepositoryContract $basket ) { $this->logger->setIdentifier(__METHOD__) - ->debug('CheckoutController', $this->request->all()); + ->debug('Controller.Checkout', $this->request->all()); if (!$this->sessionHelper->isLoggedIn()) { return $this->getJsonErrors([ 'message' => 'Your session expired. Please login and start a new purchase.', @@ -109,7 +110,7 @@ public function storeCCCheckResponse( CardExpireDate $validator ) { $this->logger->setIdentifier(__METHOD__) - ->debug('CheckoutController', $this->request->all()); + ->debug('Controller.Checkout', $this->request->all()); if (!$this->sessionHelper->isLoggedIn()) { return $this->getJsonErrors(['message' => 'Your session expired. Please login and start a new purchase.']); } @@ -165,7 +166,7 @@ public function storeAccountData( 'iban' => $this->request->get('iban'), 'bic' => $this->request->get('bic'), ]; - $this->logger->setIdentifier(__METHOD__)->debug('Router.routeCalled', $this->request->all()); + $this->logger->setIdentifier(__METHOD__)->debug('Controller.routeCalled', $this->request->all()); foreach ($formData as $key => $value) { if (empty($formData[$key])) { @@ -245,16 +246,30 @@ public function getSepaMandateStep(Twig $twig, SepaMandateCache $sepaMandateCach * * @return string */ - public function checkoutSuccess(BasketRepositoryContract $basketReopo, PaymentHelper $helper) + public function checkoutSuccess(BasketRepositoryContract $basketReopo, PaymentHelper $helper, PaymentCache $paymentCache) { $this->logger->setIdentifier(__METHOD__); $this->logger->debug('Controller.Success', $this->request->all()); + $transactionBasketId = $this->request->get('transactionBasketId'); + if(strlen($transactionBasketId)){ + $storedBasketId = $paymentCache->getActiveBasketId(); + if($storedBasketId === null){ + return $this->response->redirectTo('confirmation'); + } + if($storedBasketId != $transactionBasketId){ + return $this->response->redirectTo('payone/error'); + } + } + else{ + return $this->response->redirectTo('payone/error'); + } $basket = $basketReopo->load(); if (!$helper->isPayonePayment($basket->methodOfPaymentId)) { return $this->response->redirectTo('payone/error'); } + $paymentCache->resetActiveBasketId(); return $this->response->redirectTo('place-order'); } @@ -269,7 +284,7 @@ public function redirectWithNotice( ErrorMessageRenderer $messageRenderer ) { $this->logger->setIdentifier(__METHOD__); - $this->logger->debug('redirecting'); + $this->logger->debug('Controller.redirecting'); //info would be enought but is not shown in frontend $notificationService->error($messageRenderer->render('Payone::Template.orderErrorMessage')); diff --git a/src/Models/PaymentCache.php b/src/Models/PaymentCache.php index 5b2c132d..1966dc6f 100644 --- a/src/Models/PaymentCache.php +++ b/src/Models/PaymentCache.php @@ -56,6 +56,24 @@ public function deletePayment(string $paymentCode) ); } + public function setActiveBasketId($transactionBasketId){ + $this->sessionStorage->setSessionValue( + $this->getStorageKey('activeTransactionBasketId'), + $transactionBasketId + ); + } + + public function getActiveBasketId(){ + return $this->sessionStorage->getSessionValue($this->getStorageKey('activeTransactionBasketId')); + } + + public function resetActiveBasketId(){ + $this->sessionStorage->setSessionValue( + $this->getStorageKey('activeTransactionBasketId'), + null + ); + } + /** * @param string $paymentCode * diff --git a/src/PluginConstants.php b/src/PluginConstants.php index 4bc1cb8e..47ace757 100644 --- a/src/PluginConstants.php +++ b/src/PluginConstants.php @@ -5,5 +5,5 @@ class PluginConstants { const NAME = 'Payone'; - const VERSION = '1.0.6'; + const VERSION = '1.1.1'; } diff --git a/src/Providers/Api/Request/AuthDataProvider.php b/src/Providers/Api/Request/AuthDataProvider.php index bf466239..2f65eb30 100644 --- a/src/Providers/Api/Request/AuthDataProvider.php +++ b/src/Providers/Api/Request/AuthDataProvider.php @@ -42,7 +42,7 @@ public function getDataFromBasket(string $paymentCode, Basket $basket, string $r } if ($this->paymentHasRedirect($paymentCode)) { - $requestParams['redirect'] = $this->getRedirectUrls(); + $requestParams['redirect'] = $this->getRedirectUrls($basket->id); } if ($paymentCode == PayoneCCPaymentMethod::PAYMENT_CODE) { $requestParams['ccCheck'] = $this->getCreditCardData()->jsonSerialize(); diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index b6f5b48f..32168d1a 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -447,10 +447,14 @@ protected function paymentHasRedirect($paymentCode) /** * @return array */ - protected function getRedirectUrls() + protected function getRedirectUrls($transactionBasketId = "") { + $successParam = ''; + if(strlen($transactionBasketId)){ + $successParam = '?transactionBasketId='.$transactionBasketId; + } return [ - 'success' => $this->shopHelper->getPlentyDomain() . '/payment/payone/checkoutSuccess', + 'success' => $this->shopHelper->getPlentyDomain() . '/payment/payone/checkoutSuccess'.$successParam, 'error' => $this->shopHelper->getPlentyDomain() . '/payment/payone/error', 'back' => $this->shopHelper->getPlentyDomain() . '/checkout', ]; diff --git a/src/Providers/Api/Request/PreAuthDataProvider.php b/src/Providers/Api/Request/PreAuthDataProvider.php index c2d57a24..630a309f 100644 --- a/src/Providers/Api/Request/PreAuthDataProvider.php +++ b/src/Providers/Api/Request/PreAuthDataProvider.php @@ -40,7 +40,7 @@ public function getDataFromBasket(string $paymentCode, Basket $basket, string $r $requestParams['bankAccount'] = $this->getBankAccount(); } if ($this->paymentHasRedirect($paymentCode)) { - $requestParams['redirect'] = $this->getRedirectUrls(); + $requestParams['redirect'] = $this->getRedirectUrls($basket->id); } if ($paymentCode == PayoneCCPaymentMethod::PAYMENT_CODE) { $requestParams['ccCheck'] = $this->getCreditCardData()->jsonSerialize(); diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index b8c15fe3..5506aa6f 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -91,7 +91,7 @@ public function __construct( public function createPayment($mopId, ResponseAbstract $response, Basket $basket, ClearingAbstract $account = null) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.createPayment', + 'Payment.createPayment', [ 'paymentId' => $mopId, 'response' => $response, @@ -199,7 +199,7 @@ public function createPayment($mopId, ResponseAbstract $response, Basket $basket public function capturePayment(Payment $payment, Order $order) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.updatePayment', + 'Payment.updatePayment', [ 'payment' => $payment, 'order' => $order, @@ -227,7 +227,7 @@ public function capturePayment(Payment $payment, Order $order) public function reAuthorizePayment(Payment $payment, Response $response, Order $order) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.updatePayment', + 'Payment.updatePayment', [ 'payment' => $payment, 'response' => $response, @@ -277,7 +277,7 @@ public function reAuthorizePayment(Payment $payment, Response $response, Order $ public function createRefundPayment($paymentId, $response, $currency, $grandTotal, $parentPaymentId) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.createRefundPayment', + 'Payment.createRefundPayment', [ 'paymentId' => $paymentId, 'response' => $response, @@ -344,7 +344,7 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota public function assignPaymentToOrder(Payment $payment, Order $order) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.assignPaymentToOrder', + 'Payment.assignPaymentToOrder', [ 'payment' => $payment, 'orderId' => $order->id, @@ -395,7 +395,7 @@ public function findLastPayment($ownerId, $selectedPaymentId) public function updatePaymentStatus($txid, $txaction, $sequenceNumber) { $this->logger->setIdentifier(__METHOD__)->debug( - 'PaymentCreation.updatingPayment', + 'Payment.updatingPayment', [ 'txid' => $txid, 'txaction' => $txaction, @@ -411,7 +411,7 @@ public function updatePaymentStatus($txid, $txaction, $sequenceNumber) $this->logger->debug('PaymentCreation.updatingPayment', ['payments' => $payments]); if (!count($payments)) { $this->logger->debug( - 'PaymentCreation.updatingPayment', + 'Payment.updatingPayment', 'No payments found for txid' ); @@ -421,7 +421,7 @@ public function updatePaymentStatus($txid, $txaction, $sequenceNumber) foreach ($payments as $payment) { $newStatus = PayonePaymentStatus::getPlentyStatus($txaction); $this->logger->debug( - 'PaymentCreation.updatingPayment', + 'Payment.updatingPayment', [ 'payment' => $payment, 'oldStatus' => $payment->status, @@ -474,7 +474,7 @@ private function createOrUpdatePaymentProperty($payment, $pamentPropertyTypeId, } if ($property->typeId === $pamentPropertyTypeId) { $this->logger->debug( - 'PaymentCreation.updatingPayment', + 'Payment.updatingPayment', [ 'property' => $pamentPropertyTypeId, 'oldValue' => $property->value, @@ -487,7 +487,7 @@ private function createOrUpdatePaymentProperty($payment, $pamentPropertyTypeId, } $this->logger->debug( - 'PaymentCreation.updatingPayment', + 'Payment.updatingPayment', [ 'property' => $pamentPropertyTypeId, 'newValue' => $value, From 0e27a9bd26bfb0abe51860156c906c984721f486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Fri, 3 May 2019 12:24:49 +0200 Subject: [PATCH 029/107] An error causing the creation of duplicate orders during payment processing has been fixed --- meta/documents/changelog_de.md | 2 +- meta/documents/changelog_en.md | 2 +- src/Services/Auth.php | 1 + src/Services/PreAuth.php | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 7ad2e9e5..3c193a57 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -3,7 +3,7 @@ ## 1.1.1 (2019-04-02) ### Behoben -- Es wurde ein Problem behoben, was für Auftragsduplikate geführt hatte. +- Ein Fehler, der während der Zahlungsabwicklung zur Anlage von Auftragsduplikaten geführt hatte, wurde behoben. ## 1.1.0 (2019-03-27) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 09762f0c..3b369283 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -3,7 +3,7 @@ ## 1.1.1 (2019-04-02) ### Fixed -- Fixed an issue that caused duplicate orders. +- An error causing the creation of duplicate orders during payment processing has been fixed. ## 1.1.0 (2019-03-27) diff --git a/src/Services/Auth.php b/src/Services/Auth.php index b10e5e88..7e7c9bd1 100644 --- a/src/Services/Auth.php +++ b/src/Services/Auth.php @@ -92,6 +92,7 @@ public function executeAuth(Basket $basket) $payment = $this->createPayment($selectedPaymentId, $authResponse, $basket); $this->paymentCache->storePayment((string) $selectedPaymentId, $payment); + $this->paymentCache->setActiveBasketId($basket->id); return $authResponse; } diff --git a/src/Services/PreAuth.php b/src/Services/PreAuth.php index 1697733b..061632a9 100644 --- a/src/Services/PreAuth.php +++ b/src/Services/PreAuth.php @@ -85,6 +85,7 @@ public function executePreAuth(Basket $basket) $payment = $this->createPayment($selectedPaymentId, $preAuthResponse, $basket); $this->paymentCache->storePayment((string) $selectedPaymentId, $payment); + $this->paymentCache->setActiveBasketId($basket->id); return $preAuthResponse; } From f9dc5fce54807ba0ba799f5a15327e1a964dbf2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Fri, 3 May 2019 16:00:58 +0200 Subject: [PATCH 030/107] An error with the credit card type selection was fixed, changelog update --- meta/documents/changelog_de.md | 3 ++- meta/documents/changelog_en.md | 3 ++- resources/views/Partials/Javascript.twig | 4 +--- .../PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig | 15 +++++++-------- src/Models/CreditcardTypes.php | 5 ++++- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 3c193a57..c59eb523 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -3,7 +3,8 @@ ## 1.1.1 (2019-04-02) ### Behoben -- Ein Fehler, der während der Zahlungsabwicklung zur Anlage von Auftragsduplikaten geführt hatte, wurde behoben. +- Ein Fehler, der während der Zahlungsabwicklung zur Anlage von Auftragsduplikaten geführt hatte, wurde behoben +- Ein Fehler bei der Kreditkartentypauswahl wurde behoben ## 1.1.0 (2019-03-27) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 3b369283..db415047 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -3,7 +3,8 @@ ## 1.1.1 (2019-04-02) ### Fixed -- An error causing the creation of duplicate orders during payment processing has been fixed. +- An error causing the creation of duplicate orders during payment processing has been fixed +- An error with the credit card type selection was fixed ## 1.1.0 (2019-03-27) diff --git a/resources/views/Partials/Javascript.twig b/resources/views/Partials/Javascript.twig index 8d89d3a8..e547b0c4 100644 --- a/resources/views/Partials/Javascript.twig +++ b/resources/views/Partials/Javascript.twig @@ -26,9 +26,7 @@ ' ' + '' + ' ' + - '';; - - var request = {{ creditcardcheck|json_encode|raw }}; + ''; //Credit Card var allowedCCTypes = {{ allowedCCTypes|json_encode|raw }}; diff --git a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig index 3ff65368..0908ae8d 100644 --- a/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig +++ b/resources/views/Partials/PaymentForm/PAYONE_PAYONE_CREDIT_CARD.twig @@ -28,21 +28,20 @@
-
- -
-
-
-
-
-
+
+
+
+ +
+
+
+ Tab. 6: Event procedure for automatically refunding BS PAYONE payments
+ +## Ceres-Checkout anpassen + +Als Nächstes ist eine Anpassung im Ceres-Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum korrekt eingeben können. + + + +##### Ceres-Checkout anpassen: + +1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**.
→ Die Plugin-Übersicht wird geöffnet. +2. Klicken Sie auf **Ceres**.
→ Das Plugin wird geöffnet. +3. Klicken Sie im Verzeichnisbaum auf **Konfiguration**. +4. Wechseln Sie in das Tab **Kaufabwicklung und Mein Konto.** +5. Klappen Sie den Bereich **Rechnungsadressfelder im Adressformular anzeigen (DE)** auf. +6. Aktivieren Sie über die Checkbox die Option **Geburtsdatum**. +7. **Speichern** Sie die Einstellungen.
Im Checkout wird Ihren Kunden nun ein Feld zur Eingabe des Geburtsdatums angezeigt. + ## Template-Container verknüpfen Für die Zahlungsart BS PAYONE stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. @@ -304,16 +323,13 @@ Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an ##### Ereignisaktion einrichten: 1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. -2. Klicken Sie auf **Ereignisaktion hinzufügen**. -→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +2. Klicken Sie auf **Ereignisaktion hinzufügen**.
→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. 3. Geben Sie einen Namen ein. 4. Wählen Sie das Ereignis gemäß Tabelle 5. -5. **Speichern** Sie die Einstellungen. -→ Die Ereignisaktion wird angelegt. +5. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird angelegt. 6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 5 vor. 7. Setzen Sie ein Häkchen bei **Aktiv**. -8. **Speichern** Sie die Einstellungen. -→ Die Ereignisaktion wird gespeichert. +8. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird gespeichert.
@@ -358,16 +374,13 @@ Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS ##### Ereignisaktion einrichten: 1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. -2. Klicken Sie auf **Ereignisaktion hinzufügen**. -→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +2. Klicken Sie auf **Ereignisaktion hinzufügen**.
→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. 3. Geben Sie einen Namen ein. 4. Wählen Sie das Ereignis gemäß Tabelle 6. -5. **Speichern** Sie die Einstellungen. -→ Die Ereignisaktion wird angelegt. +5. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird angelegt. 6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 6 vor. 7. Setzen Sie ein Häkchen bei **Aktiv**. -8. **Speichern** Sie die Einstellungen. -→ Die Ereignisaktion wird gespeichert. +8. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird gespeichert.
From 7c9dfe30a26d09bbf36e7b10372a28de0efaabef Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 17 May 2019 15:15:22 +0200 Subject: [PATCH 040/107] fix changelog translation / wording --- meta/documents/changelog_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index b1217cb9..17f6e00b 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -3,7 +3,7 @@ ## 1.1.2 (2019-05-10) ### Changed -- The entry of the date of birth is now a mandatory field in the checkout process. This field must be activated in the Ceres settings for the checkout process. +- Entering the date of birth is now mandatory in the checkout process. The field for the date of birth must be activated in the Ceres settings for the checkout process. ### Added - Net orders can now be executed. From 23ee00c449508f6502880537440b985f4fc28be2 Mon Sep 17 00:00:00 2001 From: Denise Breidenbach Date: Fri, 17 May 2019 16:36:51 +0200 Subject: [PATCH 041/107] add translation user guide en fix formatting in user guides de + en --- meta/documents/user_guide_de.md | 3 +-- meta/documents/user_guide_en.md | 39 +++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 7cbf6d5a..065d9f38 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -253,10 +253,9 @@ Im Folgenden legen Sie fest, welche BS PAYONE-Zahlungsarten Ihren Kunden im Webs
- ## Ceres-Checkout anpassen -Als Nächstes ist eine Anpassung im Ceres-Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum korrekt eingeben können. +Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum korrekt eingeben können.
+## Adjusting the Ceres checkout + +In the next step, an adjustment to your Ceres checkout settings is necessary. These adjustments need to be made so that customers using PAYONE for payment processes can enter their date of birth correctly. + + + +##### Adjusting the Ceres checkout: + +1. Go to **Plugins » Plugin overview**.
→ The plugin overview opens. +2. Click on **Ceres**.
→ The plugin opens. +3. Click on **Configuration** in the directory tree. +4. Click on the **Checkout and My account** tab. +5. Open the **Show invoice address fields in the address form (DE)** area. +6. Use the check box to activate the option **Date of birth**. +7. **Save** the settings.
A field for entering the date of birth is now displayed for your customers in the checkout area. + ## Linking template containers You have multiple options to integrate the payment method BS PAYONE into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. @@ -302,16 +319,13 @@ Set up an event procedure to send an automatic shipping confirmation to BS PAYON ##### Setting up an event procedure: 1. Go to **System » Orders » Events**. -2. Click on **Add event procedure**. -→ The **Create new event procedure** window opens. +2. Click on **Add event procedure**.
→ The **Create new event procedure** window opens. 3. Enter a name. 4. Select the event according to table 5. -5. **Save** the settings. -→ The event procedure is created. +5. **Save** the settings.
→ The event procedure is created. 6. Carry out the further settings according to table 5. 7. Place a check mark next to the option **Active**. -8. **Save** the settings. -→ The event procedure is saved. +8. **Save** the settings.
→ The event procedure is saved.
@@ -356,16 +370,13 @@ Set up an event procedure to automatically refund a BS PAYONE payment. ##### Setting up an event procedure: 1. Go to **System » Orders » Events**. -2. Click on **Add event procedure**. -→ The **Create new event procedure** window opens. +2. Click on **Add event procedure**.
→ The **Create new event procedure** window opens. 3. Enter a name. 4. Select the event according to table 6. -5. **Save** the settings. -→ The event procedure is created. +5. **Save** the settings.
→ The event procedure is created. 6. Carry out the further settings according to table 6. 7. Place a check mark next to the option **Active**. -8. **Save** the settings. -→ The event procedure is saved. +8. **Save** the settings.
→ The event procedure is saved. @@ -85,7 +85,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo Portal ID @@ -93,7 +93,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo Account ID @@ -101,7 +101,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo Schlüssel @@ -126,7 +126,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo ### Zahlungsarten einrichten -Im Folgenden legen Sie fest, welche BS PAYONE-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. +Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. ##### Zahlungsarten einrichten: @@ -273,7 +273,7 @@ Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit Ihre Kunden ## Template-Container verknüpfen -Für die Zahlungsart BS PAYONE stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. +Für die Zahlungsart PAYONE stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container hinterlegt, mit denen zur Individualisierung Contents verknüpft werden. ##### Container verknüpfen: @@ -299,7 +299,7 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Order Confirmation Page Payment Data @@ -307,15 +307,15 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Checkout JS
From 732d8f7cb769bccf44dafd1ed48442c3f638edab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Tue, 11 Jun 2019 18:50:04 +0200 Subject: [PATCH 042/107] date of birth fix --- .../Api/Request/DataProviderAbstract.php | 24 ++++++++++++------- src/Providers/PayoneServiceProvider.php | 3 ++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index 53b1b6c4..3ff18bd6 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -228,17 +228,25 @@ protected function getCustomerData(Address $addressObj, $customerId) 'firstname' => (string)$addressObj->firstName, 'lastname' => (string)$addressObj->lastName, 'title' => '', // (string)$addressObj->title: '', - 'birthday' => $this->getBirthDay($addressObj), 'ip' => (string)$this->shopHelper->getIpAddress(), 'customerId' => (string)$customerId, - 'registrationDate' => '1970-01-01', + //'registrationDate' => '1970-01-01', // what the ... is this? 'group' => 'default', 'company' => (string)$addressObj->companyName, 'telephonenumber' => (string)$addressObj->phone, 'language' => $this->shopHelper->getCurrentLanguage(), ]; - //TODO: Check format + + $dateOfBirth = $this->getBirthDay($addressObj); + $customerData['birthday'] = ''; + if(isset($dateOfBirth)) { + $customerData['birthday'] = $dateOfBirth; + } + $customerData['gender'] = 'm'; + if($addressObj->gender == 'female') { + $customerData['gender'] = 'f'; + } return $customerData; } @@ -267,15 +275,13 @@ protected function getApiContextParams() /** * @param Address $addressObj - * - * @return string + * @return false|string|null */ - protected function getBirthDay(Address $addressObj): string + protected function getBirthDay(Address $addressObj) { - if (!$addressObj->birthday) { - return '1970-01-01'; + if(!isset($addressObj->birthday) || !strlen($addressObj->birthday)) { + return null; } - $dateOfBirth = strtotime($addressObj->birthday); return date('Y-m-d', $dateOfBirth); } diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index 93fb25df..16d926c6 100644 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -254,7 +254,8 @@ function (GetPaymentMethodContent $event) use ( $basket = $basketRepository->load(); $billingAddress = $addressHelper->getBasketBillingAddress($basket); - if(!isset($billingAddress->birthday) || !strlen($billingAddress->birthday)){ + if( $paymentCode == PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE && + (!isset($billingAddress->birthday) || !strlen($billingAddress->birthday)) ) { /** @var \Plenty\Plugin\Translation\Translator $translator */ $translator = pluginApp(\Plenty\Plugin\Translation\Translator::class); From 2dc2ceb0de7cdd916d70f17b1a56f720d1702717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 13 Jun 2019 10:44:56 +0200 Subject: [PATCH 043/107] updated userguide for entering the date of birth (secure invoice only) --- meta/documents/changelog_de.md | 6 ++++++ meta/documents/changelog_en.md | 6 ++++++ meta/documents/user_guide_de.md | 4 ++-- meta/documents/user_guide_en.md | 4 ++-- plugin.json | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 517cb82f..ac0d28ab 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,11 @@ # Release Notes für Payone +## 1.1.3 (2019-06-13) + +### Geändert +- Optimierungen für die Eingabe des Geburtsdatums im Bestellprozess. +- User Guide aktualisiert. + ## 1.1.2 (2019-05-10) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 17f6e00b..f7a4c5e8 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,11 @@ # Release Notes for Payone +## 1.1.3 (2019-06-13) + +### Changed +- Optimisation for Entering the date of birth in the checkout process. +- Updated user guide + ## 1.1.2 (2019-05-10) ### Changed diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 065d9f38..9d66db76 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -255,13 +255,13 @@ Im Folgenden legen Sie fest, welche BS PAYONE-Zahlungsarten Ihren Kunden im Webs ## Ceres-Checkout anpassen -Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum korrekt eingeben können. +Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum (nur für den gesicherten Rechnungskauf) korrekt eingeben können. -##### Ceres-Checkout anpassen: +##### Ceres-Checkout anpassen für den gesicherten Rechnungskauf: 1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**.
→ Die Plugin-Übersicht wird geöffnet. 2. Klicken Sie auf **Ceres**.
→ Das Plugin wird geöffnet. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 1369b7f3..59b2e5ad 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -253,13 +253,13 @@ In the following, you select the BS PAYONE payment methods that should be availa ## Adjusting the Ceres checkout -In the next step, an adjustment to your Ceres checkout settings is necessary. These adjustments need to be made so that customers using PAYONE for payment processes can enter their date of birth correctly. +In the next step, an adjustment to your Ceres checkout settings is necessary. These adjustments need to be made so that customers using PAYONE for payment processes can enter their date of birth (for secure invoice only) correctly. -##### Adjusting the Ceres checkout: +##### Adjusting the Ceres checkout for secure invoice: 1. Go to **Plugins » Plugin overview**.
→ The plugin overview opens. 2. Click on **Ceres**.
→ The plugin opens. diff --git a/plugin.json b/plugin.json index 9439479a..32868486 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.2", + "version": "1.1.3", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From db178d0108ef15769a8f5f05acab5dbbbdd4ad14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 13 Jun 2019 17:23:52 +0200 Subject: [PATCH 044/107] log typo --- src/PluginConstants.php | 2 +- src/Services/PaymentService.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PluginConstants.php b/src/PluginConstants.php index 61e8f829..16ae108c 100644 --- a/src/PluginConstants.php +++ b/src/PluginConstants.php @@ -5,5 +5,5 @@ class PluginConstants { const NAME = 'Payone'; - const VERSION = '1.1.2'; + const VERSION = '1.1.3'; } diff --git a/src/Services/PaymentService.php b/src/Services/PaymentService.php index b7495105..754db670 100644 --- a/src/Services/PaymentService.php +++ b/src/Services/PaymentService.php @@ -88,7 +88,7 @@ public function openTransaction(Basket $basket) } if (!$authResponse->getSuccess()) { throw new \Exception( - $authResponse->getErrorMessage() ?? 'Could not initialize payment. Please choose another payment and retry' + $authResponse->getErrorMessage() ?? 'Could not initialize payment. Please choose another payment method and retry' ); } $this->responseCache->storeAuth($selectedPaymentMopId, $authResponse); From 8246ce0bbce529565af670b2c43a6ab441e2794d Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Tue, 13 Aug 2019 08:06:16 +0200 Subject: [PATCH 045/107] add amazon pay method --- plugin.json | 3 +- src/Helpers/PaymentHelper.php | 2 + src/Methods/PaymentMethodServiceFactory.php | 2 + src/Methods/PayoneAmazonPayPaymentMethod.php | 8 +++ .../CreateAmazonPayPaymentMethod.php | 68 +++++++++++++++++++ src/Providers/PayoneServiceProvider.php | 7 ++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/Methods/PayoneAmazonPayPaymentMethod.php create mode 100644 src/Migrations/CreateAmazonPayPaymentMethod.php diff --git a/plugin.json b/plugin.json index b2e35e01..f788b6b4 100644 --- a/plugin.json +++ b/plugin.json @@ -26,7 +26,8 @@ "arvatis/payone-php-api":"2.2.*" }, "runOnBuild": [ - "Payone\\Migrations\\CreatePaymentMethods" + "Payone\\Migrations\\CreatePaymentMethods", + "Payone\\Migrations\\CreateAmazonPayPaymentMethod" ], "dataProviders": [ { diff --git a/src/Helpers/PaymentHelper.php b/src/Helpers/PaymentHelper.php index 6b7d6435..e03eee83 100644 --- a/src/Helpers/PaymentHelper.php +++ b/src/Helpers/PaymentHelper.php @@ -4,6 +4,7 @@ namespace Payone\Helpers; +use Payone\Methods\PayoneAmazonPayPaymentMethod; use Payone\Methods\PayoneCCPaymentMethod; use Payone\Methods\PayoneCODPaymentMethod; use Payone\Methods\PayoneDirectDebitPaymentMethod; @@ -130,6 +131,7 @@ public function getPaymentCodes() PayoneCCPaymentMethod::PAYMENT_CODE, PayoneDirectDebitPaymentMethod::PAYMENT_CODE, PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE, + PayoneAmazonPayPaymentMethod::PAYMENT_CODE ]; } diff --git a/src/Methods/PaymentMethodServiceFactory.php b/src/Methods/PaymentMethodServiceFactory.php index 0b3d49f9..c0fa6ecf 100644 --- a/src/Methods/PaymentMethodServiceFactory.php +++ b/src/Methods/PaymentMethodServiceFactory.php @@ -37,6 +37,8 @@ public static function create($paymentCode) return pluginApp(PayoneDirectDebitPaymentMethod::class); case PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE; return pluginApp(PayoneInvoiceSecurePaymentMethod::class); + case PayoneAmazonPayPaymentMethod::PAYMENT_CODE; + return pluginApp(PayoneAmazonPayPaymentMethod::PAYMENT_CODE); } throw new \InvalidArgumentException('Unknown payment method ' . $paymentCode); } diff --git a/src/Methods/PayoneAmazonPayPaymentMethod.php b/src/Methods/PayoneAmazonPayPaymentMethod.php new file mode 100644 index 00000000..5979e569 --- /dev/null +++ b/src/Methods/PayoneAmazonPayPaymentMethod.php @@ -0,0 +1,8 @@ +paymentMethodRepo = $paymentMethodRepo; + $this->paymentHelper = $paymentHelper; + $this->logger = $logger; + } + + /** + * Run on plugin build + * + * Create Payone payment methods + */ + public function run() + { + $paymentCode = PayoneAmazonPayPaymentMethod::PAYMENT_CODE; + if ($this->paymentHelper->getMopId($paymentCode) != 'no_paymentmethod_found') { + $this->logger->debug(' Skipping payment method creation of ' . $paymentCode); + return true; + } + $this->logger->debug(' Creating payment method ' . $paymentCode); + $this->paymentMethodRepo->createPaymentMethod([ + 'pluginKey' => PluginConstants::NAME, + 'paymentKey' => $paymentCode, + 'name' => $paymentCode, + ]); + } +} diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index 00a07a7f..812f23fc 100644 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -7,6 +7,7 @@ use Payone\Helpers\PaymentHelper; use Payone\Methods\PaymentAbstract; use Payone\Methods\PaymentMethodServiceFactory; +use Payone\Methods\PayoneAmazonPayPaymentMethod; use Payone\Methods\PayoneCCPaymentMethod; use Payone\Methods\PayoneCODPaymentMethod; use Payone\Methods\PayoneDirectDebitPaymentMethod; @@ -201,6 +202,12 @@ protected function registerPaymentMethods(PaymentMethodContainer $payContainer) PayoneInvoiceSecurePaymentMethod::class, $events ); + + $payContainer->register( + 'Payone::' . PayoneAmazonPayPaymentMethod::PAYMENT_CODE, + PayoneAmazonPayPaymentMethod::class, + $events + ); } /** From cf308476b35a7d99f651043204b7360190885cd6 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Tue, 13 Aug 2019 08:06:16 +0200 Subject: [PATCH 046/107] add amazon pay method --- plugin.json | 3 +- src/Helpers/PaymentHelper.php | 2 + src/Methods/PaymentMethodServiceFactory.php | 2 + src/Methods/PayoneAmazonPayPaymentMethod.php | 8 +++ .../CreateAmazonPayPaymentMethod.php | 68 +++++++++++++++++++ src/Providers/PayoneServiceProvider.php | 7 ++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/Methods/PayoneAmazonPayPaymentMethod.php create mode 100644 src/Migrations/CreateAmazonPayPaymentMethod.php diff --git a/plugin.json b/plugin.json index b2e35e01..f788b6b4 100644 --- a/plugin.json +++ b/plugin.json @@ -26,7 +26,8 @@ "arvatis/payone-php-api":"2.2.*" }, "runOnBuild": [ - "Payone\\Migrations\\CreatePaymentMethods" + "Payone\\Migrations\\CreatePaymentMethods", + "Payone\\Migrations\\CreateAmazonPayPaymentMethod" ], "dataProviders": [ { diff --git a/src/Helpers/PaymentHelper.php b/src/Helpers/PaymentHelper.php index 6b7d6435..e03eee83 100644 --- a/src/Helpers/PaymentHelper.php +++ b/src/Helpers/PaymentHelper.php @@ -4,6 +4,7 @@ namespace Payone\Helpers; +use Payone\Methods\PayoneAmazonPayPaymentMethod; use Payone\Methods\PayoneCCPaymentMethod; use Payone\Methods\PayoneCODPaymentMethod; use Payone\Methods\PayoneDirectDebitPaymentMethod; @@ -130,6 +131,7 @@ public function getPaymentCodes() PayoneCCPaymentMethod::PAYMENT_CODE, PayoneDirectDebitPaymentMethod::PAYMENT_CODE, PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE, + PayoneAmazonPayPaymentMethod::PAYMENT_CODE ]; } diff --git a/src/Methods/PaymentMethodServiceFactory.php b/src/Methods/PaymentMethodServiceFactory.php index 0b3d49f9..c0fa6ecf 100644 --- a/src/Methods/PaymentMethodServiceFactory.php +++ b/src/Methods/PaymentMethodServiceFactory.php @@ -37,6 +37,8 @@ public static function create($paymentCode) return pluginApp(PayoneDirectDebitPaymentMethod::class); case PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE; return pluginApp(PayoneInvoiceSecurePaymentMethod::class); + case PayoneAmazonPayPaymentMethod::PAYMENT_CODE; + return pluginApp(PayoneAmazonPayPaymentMethod::PAYMENT_CODE); } throw new \InvalidArgumentException('Unknown payment method ' . $paymentCode); } diff --git a/src/Methods/PayoneAmazonPayPaymentMethod.php b/src/Methods/PayoneAmazonPayPaymentMethod.php new file mode 100644 index 00000000..5979e569 --- /dev/null +++ b/src/Methods/PayoneAmazonPayPaymentMethod.php @@ -0,0 +1,8 @@ +paymentMethodRepo = $paymentMethodRepo; + $this->paymentHelper = $paymentHelper; + $this->logger = $logger; + } + + /** + * Run on plugin build + * + * Create Payone payment methods + */ + public function run() + { + $paymentCode = PayoneAmazonPayPaymentMethod::PAYMENT_CODE; + if ($this->paymentHelper->getMopId($paymentCode) != 'no_paymentmethod_found') { + $this->logger->debug(' Skipping payment method creation of ' . $paymentCode); + return true; + } + $this->logger->debug(' Creating payment method ' . $paymentCode); + $this->paymentMethodRepo->createPaymentMethod([ + 'pluginKey' => PluginConstants::NAME, + 'paymentKey' => $paymentCode, + 'name' => $paymentCode, + ]); + } +} diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index 00a07a7f..812f23fc 100644 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -7,6 +7,7 @@ use Payone\Helpers\PaymentHelper; use Payone\Methods\PaymentAbstract; use Payone\Methods\PaymentMethodServiceFactory; +use Payone\Methods\PayoneAmazonPayPaymentMethod; use Payone\Methods\PayoneCCPaymentMethod; use Payone\Methods\PayoneCODPaymentMethod; use Payone\Methods\PayoneDirectDebitPaymentMethod; @@ -201,6 +202,12 @@ protected function registerPaymentMethods(PaymentMethodContainer $payContainer) PayoneInvoiceSecurePaymentMethod::class, $events ); + + $payContainer->register( + 'Payone::' . PayoneAmazonPayPaymentMethod::PAYMENT_CODE, + PayoneAmazonPayPaymentMethod::class, + $events + ); } /** From d72e49d0662fe9207ee9fe1a45299b26c0161856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Tue, 13 Aug 2019 18:06:20 +0200 Subject: [PATCH 047/107] relocate payone api start --- composer.json | 5 +- plugin.json | 7 +- resources/lang/de/Api.properties | 1 + resources/lang/en/Api.properties | 1 + .../lib/Payone/ArvPayoneApi/Api/Client.php | 137 ++++++++++++++ .../ArvPayoneApi/Api/ClientContract.php | 32 ++++ .../lib/Payone/ArvPayoneApi/Api/PostApi.php | 102 ++++++++++ .../lib/Payone/ArvPayoneApi/Lib/Version.php | 17 ++ .../ArvPayoneApi/Request/ArraySerializer.php | 55 ++++++ .../Request/Authorization/CashOnDelivery.php | 47 +++++ .../Request/Authorization/Creditcard.php | 65 +++++++ .../Request/Authorization/DirectDebit.php | 47 +++++ .../Request/Authorization/Invoice.php | 26 +++ .../Request/Authorization/InvoiceSecure.php | 57 ++++++ .../Authorization/OnlineBankTransfer.php | 76 ++++++++ .../Request/Authorization/PayPal.php | 61 ++++++ .../Request/Authorization/Paydirekt.php | 80 ++++++++ .../Request/Authorization/PrePayment.php | 25 +++ .../Request/Authorization/RequestFactory.php | 130 +++++++++++++ .../Request/Authorization/Sofort.php | 76 ++++++++ .../Request/AuthorizationRequestAbstract.php | 37 ++++ .../Request/AuthorizationRequestContract.php | 42 +++++ .../ArvPayoneApi/Request/Capture/Capture.php | 91 +++++++++ .../Request/Capture/CaptureModes.php | 12 ++ .../Request/Capture/RequestFactory.php | 38 ++++ .../Request/Capture/SettleAccountModes.php | 11 ++ .../ArvPayoneApi/Request/ClearingTypes.php | 15 ++ .../ArvPayoneApi/Request/Debit/Debit.php | 60 ++++++ .../Request/Debit/RequestFactory.php | 30 +++ .../Request/GenericAuthRequestFactory.php | 49 +++++ .../Request/GenericAuthorizationRequest.php | 67 +++++++ .../ArvPayoneApi/Request/GenericRequest.php | 120 ++++++++++++ .../Request/GenericRequestFactory.php | 47 +++++ .../Request/Managemandate/ManageMandate.php | 156 ++++++++++++++++ .../ManageMandateRequestFactory.php | 73 ++++++++ .../Request/Parts/BankAccount.php | 94 ++++++++++ .../ArvPayoneApi/Request/Parts/Cart.php | 46 +++++ .../Request/Parts/CartFactory.php | 57 ++++++ .../ArvPayoneApi/Request/Parts/CartItem.php | 174 ++++++++++++++++++ .../ArvPayoneApi/Request/Parts/Config.php | 102 ++++++++++ .../ArvPayoneApi/Request/Parts/Customer.php | 168 +++++++++++++++++ .../Request/Parts/CustomerAddress.php | 80 ++++++++ .../Request/Parts/RedirectUrls.php | 64 +++++++ .../Request/Parts/SepaMandate.php | 85 +++++++++ .../Request/Parts/ShippingAddress.php | 92 +++++++++ .../ArvPayoneApi/Request/Parts/SystemInfo.php | 78 ++++++++ .../ArvPayoneApi/Request/PaymentTypes.php | 30 +++ .../PreAuthorization/RequestFactory.php | 14 ++ .../ArvPayoneApi/Request/Refund/Refund.php | 46 +++++ .../Request/Refund/RequestFactory.php | 24 +++ .../Request/RequestDataContract.php | 50 +++++ .../Request/RequestFactoryContract.php | 15 ++ .../Request/SerializerFactory.php | 11 ++ .../Request/SerializerInterface.php | 13 ++ .../lib/Payone/ArvPayoneApi/Request/Types.php | 23 +++ .../Payone/ArvPayoneApi/Response/Clearing.php | 139 ++++++++++++++ .../Response/ClientErrorResponse.php | 54 ++++++ .../ArvPayoneApi/Response/GenericResponse.php | 103 +++++++++++ .../Response/ResponseContract.php | 40 ++++ .../Response/ResponseDataAbstract.php | 31 ++++ .../Response/ResponseDataContract.php | 11 ++ .../ArvPayoneApi/Response/ResponseFactory.php | 60 ++++++ .../Response/ResponseWithClearing.php | 29 +++ .../Payone/ArvPayoneApi/Response/Status.php | 13 ++ resources/lib/doAuth.php | 26 ++- resources/lib/doCapture.php | 24 ++- resources/lib/doDebit.php | 24 ++- resources/lib/doManagemandate.php | 24 ++- resources/lib/doPreAuth.php | 23 ++- resources/lib/doRefund.php | 23 ++- src/Services/Api.php | 3 + src/Services/Auth.php | 4 + 72 files changed, 3746 insertions(+), 46 deletions(-) create mode 100644 resources/lib/Payone/ArvPayoneApi/Api/Client.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Api/ClientContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Api/PostApi.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Lib/Version.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/ArraySerializer.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/CashOnDelivery.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/Creditcard.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/DirectDebit.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/Invoice.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/InvoiceSecure.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/OnlineBankTransfer.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/PayPal.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/Paydirekt.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/PrePayment.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/RequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Authorization/Sofort.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestAbstract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Capture/Capture.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Capture/CaptureModes.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Capture/RequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Capture/SettleAccountModes.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/ClearingTypes.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Debit/Debit.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Debit/RequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/GenericAuthRequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/GenericAuthorizationRequest.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/GenericRequest.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/GenericRequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Managemandate/ManageMandate.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Managemandate/ManageMandateRequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/BankAccount.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/Cart.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/CartFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/CartItem.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/Config.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/Customer.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/CustomerAddress.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/RedirectUrls.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/SepaMandate.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/ShippingAddress.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Parts/SystemInfo.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/PaymentTypes.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Refund/Refund.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Refund/RequestFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/RequestDataContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/RequestFactoryContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/SerializerFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/SerializerInterface.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Request/Types.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/Clearing.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ClientErrorResponse.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/GenericResponse.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ResponseContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ResponseDataAbstract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ResponseDataContract.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ResponseFactory.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/ResponseWithClearing.php create mode 100644 resources/lib/Payone/ArvPayoneApi/Response/Status.php diff --git a/composer.json b/composer.json index e018a1b5..364ff757 100644 --- a/composer.json +++ b/composer.json @@ -16,8 +16,5 @@ "type": "git", "url": "https://github.com/plentymarkets/plugin-interface.git" } - ], - "require": { - "arvatis/payone-php-api":"2.2.*" - } + ] } diff --git a/plugin.json b/plugin.json index 32868486..fb15a6db 100644 --- a/plugin.json +++ b/plugin.json @@ -21,10 +21,13 @@ "javaScriptFiles": [], "containers": [], "require": ["IO"], - "serviceProvider": "Payone\\Providers\\PayoneServiceProvider", "dependencies":{ - "arvatis/payone-php-api":"2.2.*" + "guzzlehttp/guzzle": "6.*", + "symfony/serializer": "3.2.7", + "symfony/property-access": "3.2.7", + "doctrine/common": "2.7.2" }, + "serviceProvider": "Payone\\Providers\\PayoneServiceProvider", "runOnBuild": [ "Payone\\Migrations\\CreatePaymentMethods" ], diff --git a/resources/lang/de/Api.properties b/resources/lang/de/Api.properties index 404bfce8..ee4c310a 100644 --- a/resources/lang/de/Api.properties +++ b/resources/lang/de/Api.properties @@ -5,3 +5,4 @@ doCapture = "doCapture" doRefund = "doRefund" doReAuth = "doReAuth" doCalculation = "doCalculation" +doAuth = "doAuth" diff --git a/resources/lang/en/Api.properties b/resources/lang/en/Api.properties index 404bfce8..ee4c310a 100644 --- a/resources/lang/en/Api.properties +++ b/resources/lang/en/Api.properties @@ -5,3 +5,4 @@ doCapture = "doCapture" doRefund = "doRefund" doReAuth = "doReAuth" doCalculation = "doCalculation" +doAuth = "doAuth" diff --git a/resources/lib/Payone/ArvPayoneApi/Api/Client.php b/resources/lib/Payone/ArvPayoneApi/Api/Client.php new file mode 100644 index 00000000..20eaf857 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Api/Client.php @@ -0,0 +1,137 @@ +client = new \GuzzleHttp\Client(); + } + + /** + * @return \GuzzleHttp\Client + */ + public function getClient() + { + return $this->client; + } + + /** + * @param \GuzzleHttp\Client $client + * + * @return Client + */ + public function setClient(\GuzzleHttp\Client $client) + { + $this->client = $client; + + return $this; + } + + /** + * @return string + */ + public function getHttpMethod() + { + return $this->httpMethod; + } + + /** + * @param string $httpMethod + * + * @return Client + */ + public function setHttpMethod($httpMethod) + { + $this->httpMethod = $httpMethod; + + return $this; + } + + /** + * @return string + */ + public function getEndpointUrl() + { + return $this->url; + } + + /** + * @param string $url + * + * @return Client + */ + public function setEndpointUrl($url) + { + $this->url = $url; + + return $this; + } + + /** + * @param array $data + * + * @return string + */ + public function doRequest($data) + { + $res = $this->client->request( + $this->getHttpMethod(), + $this->getEndpointUrl(), + [ + 'form_params' => $data, + 'headers' => $this->headers, + ] + ); + + return (string) $res->getBody(); + } + + /** + * @param string $method + * + * @return $this + */ + public function setMethod($method) + { + $this->httpMethod = $method; + + return $this; + } + + /** + * @param string $key + * @param string $value + */ + public function addHeader($key, $value) + { + if (!$this->headers) { + $this->headers = []; + } + $this->headers[$key] = $value; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Api/ClientContract.php b/resources/lib/Payone/ArvPayoneApi/Api/ClientContract.php new file mode 100644 index 00000000..4f035d88 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Api/ClientContract.php @@ -0,0 +1,32 @@ +client = $client; + $this->serializer = $serializer; + $client->setEndpointUrl($this->getEndPointUrl()); + $client->setMethod('POST'); + $client->addHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8'); + } + + /** + * @return ClientContract + */ + public function getClient(): ClientContract + { + return $this->client; + } + + /** + * @param ClientContract $client + * + * @return PostApi + */ + public function setClient(ClientContract $client) + { + $this->client = $client; + + return $this; + } + + /** + * @param object $entity + * + * @return ResponseContract + */ + public function doRequest($entity) + { + $this->requestData = $this->serializer->serialize($entity); + try { + $responseBody = $this->client->doRequest($this->requestData); + + return ResponseFactory::create($responseBody); + } catch (\Exception $e) { + } + + return new ClientErrorResponse($e->getMessage()); + } + + /** + * @return string + */ + protected function getEndPointUrl() + { + return $this::PAYONE_SERVER_API_URL; + } + + /** + * @return array + */ + public function getLastRequestData(){ + return $this->requestData; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Lib/Version.php b/resources/lib/Payone/ArvPayoneApi/Lib/Version.php new file mode 100644 index 00000000..82efa130 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Lib/Version.php @@ -0,0 +1,17 @@ +jsonSerialize(); + asort($result); + return $result; + } + + $oClass = new \ReflectionClass(get_class($object)); + $result = []; + foreach ($oClass->getMethods() as $method) { + if (substr($method->name, 0, 3) != 'get') { + continue; + } + $propName = $this->camelCaseToUnderscore(substr($method->name, 3)); + + $value = $method->invoke($object); + if (is_object($value)) { + $result += $this->serialize($value); + continue; + } + if ($value !== null && $value !== '') { + $result[$propName] = $value; + } + } + + asort($result); + + return $result; + } + + /** + * @param string $string + * + * @return string + */ + private function camelCaseToUnderscore($string) + { + return strtolower(preg_replace('/(?authorizationRequest = $authorizationRequest; + $this->shippingprovider = $shippingprovider; + } + + /** + * Getter for Shippingprovider + * + * @return mixed + */ + public function getShippingprovider() + { + return $this->shippingprovider; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Creditcard.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Creditcard.php new file mode 100644 index 00000000..2a811b3e --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Creditcard.php @@ -0,0 +1,65 @@ +authorizationRequest = $authorizationRequest; + $this->pseudocardpan = $pseudocardPan; + $this->urls = $urls; + } + + /** + * Getter for Pseudocardpan + * + * @return string + */ + public function getPseudocardpan() + { + return $this->pseudocardpan; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/DirectDebit.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/DirectDebit.php new file mode 100644 index 00000000..e1357018 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/DirectDebit.php @@ -0,0 +1,47 @@ +authorizationRequest = $authorizationRequest; + $this->sepaMandate = $sepaMandate; + } + + /** + * Getter for SepaMandate + * + * @return SepaMandate + */ + public function getSepaMandate() + { + return $this->sepaMandate; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Invoice.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Invoice.php new file mode 100644 index 00000000..d324d197 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Invoice.php @@ -0,0 +1,26 @@ +authorizationRequest = $authorizationRequest; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/InvoiceSecure.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/InvoiceSecure.php new file mode 100644 index 00000000..f888ed9d --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/InvoiceSecure.php @@ -0,0 +1,57 @@ +authorizationRequest = $authorizationRequest; + $this->cart = $cart; + } + + /** + * Getter for Subclearingtype + * + * @return string + */ + public function getSubclearingtype() + { + return $this->subclearingtype; + } + + /** + * Getter for Cart + * @return Cart + */ + public function getCart() + { + return $this->cart; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/OnlineBankTransfer.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/OnlineBankTransfer.php new file mode 100644 index 00000000..2d5ae79c --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/OnlineBankTransfer.php @@ -0,0 +1,76 @@ +authorizationRequest = $authorizationRequest; + $this->urls = $urls; + $this->bankAccount = $bankAccount; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } + + /** + * Getter for Onlinebanktransfertype + * + * @return string + */ + public function getOnlinebanktransfertype() + { + return $this->onlinebanktransfertype; + } + + /** + * Getter for BankAccount + * + * @return BankAccount + */ + public function getBankAccount() + { + return $this->bankAccount; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PayPal.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PayPal.php new file mode 100644 index 00000000..c7e959a5 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PayPal.php @@ -0,0 +1,61 @@ +authorizationRequest = $authorizationRequest; + $this->urls = $urls; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } + + /** + * Getter for Wallettype + * + * @return string + */ + public function getWallettype() + { + return $this->wallettype; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Paydirekt.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Paydirekt.php new file mode 100644 index 00000000..c88d7eec --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/Paydirekt.php @@ -0,0 +1,80 @@ +authorizationRequest = $authorizationRequest; + $this->urls = $urls; + $this->shippingAddress = $shippingAddress; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } + + /** + * Getter for Wallettype + * + * @return string + */ + public function getWallettype() + { + return $this->wallettype; + } + + /** + * Getter for ShippingAddress + * + * @return ShippingAddress + */ + public function getShippingAddress() + { + return $this->shippingAddress; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PrePayment.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PrePayment.php new file mode 100644 index 00000000..d2d28ace --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/PrePayment.php @@ -0,0 +1,25 @@ +authorizationRequest = $authorizationRequest; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Authorization/RequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/RequestFactory.php new file mode 100644 index 00000000..56d8d9b0 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Authorization/RequestFactory.php @@ -0,0 +1,130 @@ +authorizationRequest = $authorizationRequest; + $this->urls = $urls; + $this->bankAccount = $bankAccount; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } + + /** + * Getter for Onlinebanktransfertype + * + * @return string + */ + public function getOnlinebanktransfertype() + { + return $this->onlinebanktransfertype; + } + + /** + * Getter for BankAccount + * + * @return BankAccount + */ + public function getBankAccount() + { + return $this->bankAccount; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestAbstract.php b/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestAbstract.php new file mode 100644 index 00000000..4fa5f707 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestAbstract.php @@ -0,0 +1,37 @@ +authorizationRequest; + } + + /** + * Getter for Clearingtype + * + * @return string + */ + public function getClearingtype() + { + return $this->clearingtype; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestContract.php b/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestContract.php new file mode 100644 index 00000000..5543ccb2 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/AuthorizationRequestContract.php @@ -0,0 +1,42 @@ +request = $request; + $this->txid = $txid; + $this->capturemode = $capturemode; + $this->cart = $cart; + $this->settleaccount = $settleaccount; + } + + /** + * Getter for Cart + * @return Cart + */ + public function getCart() + { + return $this->cart; + } + + /** + * Getter for Txid + * + * @return string + */ + public function getTxid() + { + return $this->txid; + } + + /** + * Getter for Capturemode + * + * @return string + */ + public function getCapturemode() + { + return $this->capturemode; + } + + /** + * Getter for Request + * + * @return GenericRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for Settleaccount + * @return mixed + */ + public function getSettleaccount() + { + return $this->settleaccount; + } + + +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Capture/CaptureModes.php b/resources/lib/Payone/ArvPayoneApi/Request/Capture/CaptureModes.php new file mode 100644 index 00000000..12f5055a --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Capture/CaptureModes.php @@ -0,0 +1,12 @@ +txid = $txid; + $this->request = $request; + $this->cart = $cart; + } + + /** + * Getter for Request + * + * @return GenericRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for Txid + * + * @return string + */ + public function getTxid() + { + return $this->txid; + } + + /** + * Getter for Cart + * @return Cart + */ + public function getCart() + { + return $this->cart; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Debit/RequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/Debit/RequestFactory.php new file mode 100644 index 00000000..e2f62ca4 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Debit/RequestFactory.php @@ -0,0 +1,30 @@ +customer = $customer; + $this->reference = $reference; + $this->genericRequest = $genericRequest; + } + + /** + * Getter for Reference + */ + public function getReference() + { + return $this->reference; + } + + /** + * Getter for Customer + * + * @return Customer + */ + public function getCustomer(): Customer + { + return $this->customer; + } + + /** + * Getter for GenericRequestrequest + * + * @return GenericRequest + */ + public function getGenericRequest() + { + return $this->genericRequest; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/GenericRequest.php b/resources/lib/Payone/ArvPayoneApi/Request/GenericRequest.php new file mode 100644 index 00000000..5cce0e37 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/GenericRequest.php @@ -0,0 +1,120 @@ +config = $config; + $this->request = $request; + $this->amount = $amount; + $this->currency = $currency; + $this->sequencenumber = $sequencenumber; + $this->info = $info; + } + + /** + * Getter for Sequencenumber + */ + public function getSequencenumber() + { + return $this->sequencenumber; + } + + /** + * Getter for Amount + * + * @return int + */ + public function getAmount() + { + return $this->amount; + } + + /** + * Getter for Currency + * + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * Getter for Config + * + * @return Config + */ + public function getConfig(): Config + { + return $this->config; + } + + /** + * @return string + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for Info + * + * @return SystemInfo + */ + public function getInfo() + { + return $this->info; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/GenericRequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/GenericRequestFactory.php new file mode 100644 index 00000000..ac7377f0 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/GenericRequestFactory.php @@ -0,0 +1,47 @@ +config = $config; + $this->currency = $currency; + $this->customer = $customer; + $this->info = $info; + $this->bankAccount = $bankAccount; + $this->mandateIdentification = $mandateIdentification; + } + + /** + * Getter for Clearingtype + * + * @return string + */ + public function getClearingtype() + { + return $this->clearingtype; + } + + /** + * Getter for MandateIdentification + * + * @return mixed + */ + public function getMandateIdentification() + { + return $this->mandateIdentification; + } + + /** + * Getter for Currency + * + * @return mixed + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * Getter for Request + * + * @return string + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for BankAccount + * + * @return BankAccount + */ + public function getBankAccount() + { + return $this->bankAccount; + } + + /** + * Getter for Customer + * + * @return Customer + */ + public function getCustomer() + { + return $this->customer; + } + + /** + * Getter for Config + * + * @return Config + */ + public function getConfig() + { + return $this->config; + } + + /** + * Getter for Info + * + * @return SystemInfo + */ + public function getInfo() + { + return $this->info; + } + + /** + * Getter for Sequencenumber + */ + public function getSequencenumber() + { + return null; + } + + /** + * Getter for Amount + * + * @return int + */ + public function getAmount() + { + return null; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Managemandate/ManageMandateRequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/Managemandate/ManageMandateRequestFactory.php new file mode 100644 index 00000000..4bf9205a --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Managemandate/ManageMandateRequestFactory.php @@ -0,0 +1,73 @@ +bankcountry = $bankcountry; + $this->iban = $iban; + $this->bic = $bic; + $holderNames = explode(' ', $holder); + $this->firstname = $holderNames[0] ?? ''; + $this->lastname = $holderNames[1] ?? ''; + } + + /** + * Getter for Bankcountry + * + * @return mixed + */ + public function getBankcountry() + { + return $this->bankcountry; + } + + /** + * Getter for Iban + * + * @return mixed + */ + public function getIban() + { + return $this->iban; + } + + /** + * Getter for Bic + * + * @return mixed + */ + public function getBic() + { + return $this->bic; + } + + /** + * Getter for Firstname + * + * @return mixed + */ + public function getFirstname() + { + return $this->firstname; + } + + /** + * Getter for Lastname + * + * @return mixed + */ + public function getLastname() + { + return $this->lastname; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/Cart.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Cart.php new file mode 100644 index 00000000..dcd77d31 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Cart.php @@ -0,0 +1,46 @@ +cartItems; + } + + /** + * @return array + */ + public function jsonSerialize() + { + $cartItems = $this->getCartItems(); + if (!$cartItems) { + return []; + } + $itemsArray = array_map( + function (CartItem $cartItem) { + return $cartItem->jsonSerialize(); + }, + $cartItems + ); + return call_user_func_array('array_merge', $itemsArray); + } + + /** + * @param CartItem $cartItem + */ + public function add(CartItem $cartItem) + { + $this->cartItems[] = $cartItem; + } +} \ No newline at end of file diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartFactory.php new file mode 100644 index 00000000..2f81f71c --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartFactory.php @@ -0,0 +1,57 @@ + $cartItemData) { + $cartItem = new CartItem( + $i, + $cartItemData['itemId'], + CartItem::TYPE_GOODS, + $cartItemData['quantity'] ?? '', + $cartItemData['price'], + $cartItemData['vat'], + $cartItemData['name'] ?? '' + ); + $cart->add($cartItem); + } + $cart->add(self::calculateShipping($requestData, $cart)); + return $cart; + } + + /** + * @param array $requestData + * @param $cart + * @return CartItem + */ + private static function calculateShipping(array $requestData, Cart $cart) + { + $taxRate = 0; + $basket = $requestData['basket']; + if ($basket['shippingAmountNet'] > 0) { + $taxRate = (int )round( + ($basket['shippingAmount'] / $basket['shippingAmountNet'] - 1) + * 10000 + ); + } + $shippingCost = new CartItem( + count($cart->getCartItems()), + 'shipping', + CartItem::TYPE_SHIPMENt, + 1, + $basket['shippingAmount'], + $taxRate, + 'shipping' + ); + return $shippingCost; + } +} \ No newline at end of file diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartItem.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartItem.php new file mode 100644 index 00000000..7c14ebb3 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CartItem.php @@ -0,0 +1,174 @@ + 99 = basis points (e.g. 1900 = 19%) + * + * @var int + */ + private $va; + + /** + * CartItem constructor. + * + * @param int $position + * @param string $sku + * @param string $type + * @param int $qty + * @param int $price in cent + * @param string $description ='' + * @param int $taxRate + */ + public function __construct( + $position, + $sku, + $type, + $qty, + $price, + $taxRate, + $description = '' + ) { + $this->position = $position; + $this->id = $sku; + $this->it = $type; + $this->no = $qty; + $this->pr = $price; + $this->de = $description; + $this->va = $taxRate; + } + + /** + * Getter for Position + * + * @return int + */ + public function getPosition() + { + return $this->position; + } + + /** + * Getter for Id + * + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * Getter for It + * + * @return string + */ + public function getIt() + { + return $this->it; + } + + /** + * Getter for No + * + * @return int + */ + public function getNo() + { + return $this->no; + } + + /** + * Getter for Pr + * + * @return int + */ + public function getPr() + { + return $this->pr; + } + + /** + * Getter for De + * + * @return string + */ + public function getDe() + { + return $this->de; + } + + /** + * Getter for Va + * + * @return int + */ + public function getVa() + { + return $this->va; + } + + public function jsonSerialize() + { + return [ + 'id' . $this->getPosition() => $this->getId(), + 'it' . $this->getPosition() => $this->getIt(), + 'no' . $this->getPosition() => $this->getNo(), + 'pr' . $this->getPosition() => $this->getPr(), + 'de' . $this->getPosition() => $this->getDe(), + 'va' . $this->getPosition() => $this->getva(), + ]; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/Config.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Config.php new file mode 100644 index 00000000..2b55bf0f --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Config.php @@ -0,0 +1,102 @@ +aid = $aid; + $this->mid = $mid; + $this->portalid = $portalid; + $this->key = hash('md5', $key); + $this->mode = $mode; + } + + /** + * Getter for Aid + * + * @return mixed + */ + public function getAid() + { + return $this->aid; + } + + /** + * Getter for Mid + * + * @return mixed + */ + public function getMid() + { + return $this->mid; + } + + /** + * Getter for Portalid + * + * @return mixed + */ + public function getPortalid() + { + return $this->portalid; + } + + /** + * Getter for Key + * + * @return string + */ + public function getKey() + { + return $this->key; + } + + /** + * Getter for Mode + * + * @return string + */ + public function getMode() + { + return $this->mode; + } + + /** + * Getter for Encoding + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Getter for ApiVersion + * + * @return string + */ + public function getApiVersion() + { + return $this->apiVersion; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/Customer.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Customer.php new file mode 100644 index 00000000..54ca3a31 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/Customer.php @@ -0,0 +1,168 @@ +salutation = $gender == 'm' ? 'Herr' : 'Frau'; + $this->title = $title; + $this->firstname = $firstname; + $this->lastname = $lastname; + $this->address = $address; + $this->email = $email; + $this->telephonenumber = $telephonenumber; + $this->birthday = $birthday; + $this->language = $language; + $this->gender = $gender; + $this->ip = $ip; + } + + /** + * Getter for Salutation + * + * @return string + */ + public function getSalutation() + { + return $this->salutation; + } + + /** + * Getter for Title + * + * @return mixed + */ + public function getTitle() + { + return $this->title; + } + + /** + * Getter for Firstname + * + * @return mixed + */ + public function getFirstname() + { + return $this->firstname; + } + + /** + * Getter for Lastname + * + * @return mixed + */ + public function getLastname() + { + return $this->lastname; + } + + /** + * Getter for Address + * + * @return CustomerAddress + */ + public function getAddress() + { + return $this->address; + } + + /** + * Getter for Email + * + * @return mixed + */ + public function getEmail() + { + return $this->email; + } + + /** + * Getter for Telephonenumber + * + * @return mixed + */ + public function getTelephonenumber() + { + return $this->telephonenumber; + } + + /** + * Getter for Birthday + * + * @return string + */ + public function getBirthday() + { + return str_replace('-', '', $this->birthday); + } + + /** + * Getter for Language + * + * @return mixed + */ + public function getLanguage() + { + return $this->language; + } + + /** + * Getter for Gender + * + * @return mixed + */ + public function getGender() + { + return $this->gender; + } + + /** + * Getter for Ip + * + * @return mixed + */ + public function getIp() + { + return $this->ip; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/CustomerAddress.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CustomerAddress.php new file mode 100644 index 00000000..7547ac5c --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/CustomerAddress.php @@ -0,0 +1,80 @@ +street = $street; + $this->addressaddition = $addressaddition; + $this->zip = $zip; + $this->city = $city; + $this->country = $country; + } + + /** + * Getter for Street + * + * @return mixed + */ + public function getStreet() + { + return $this->street; + } + + /** + * Getter for Addressaddition + * + * @return mixed + */ + public function getAddressaddition() + { + return $this->addressaddition; + } + + /** + * Getter for Zip + * + * @return mixed + */ + public function getZip() + { + return $this->zip; + } + + /** + * Getter for City + * + * @return mixed + */ + public function getCity() + { + return $this->city; + } + + /** + * Getter for Country + * + * @return mixed + */ + public function getCountry() + { + return $this->country; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/RedirectUrls.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/RedirectUrls.php new file mode 100644 index 00000000..2967f63a --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/RedirectUrls.php @@ -0,0 +1,64 @@ +success = $success; + $this->error = $error; + $this->back = $back; + } + + /** + * Getter for Success + * + * @return string + */ + public function getSuccessurl() + { + return $this->success; + } + + /** + * Getter for Error + * + * @return string + */ + public function getErrorurl() + { + return $this->error; + } + + /** + * Getter for Back + * + * @return string + */ + public function getBackurl() + { + return $this->back; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/SepaMandate.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/SepaMandate.php new file mode 100644 index 00000000..e23d40d3 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/SepaMandate.php @@ -0,0 +1,85 @@ +mandateIdentification = $mandateIdentification; + $this->mandateDateofsignature = $mandateDateofsignature; + $this->iban = $iban; + $this->bic = $bic; + $this->bankcountry = $bankcountry; + } + + /** + * Getter for MandateIdentification + * + * @return string + */ + public function getMandateIdentification() + { + return $this->mandateIdentification; + } + + /** + * Getter for MandateDateofsignature + * + * @return string + */ + public function getMandateDateofsignature() + { + return $this->mandateDateofsignature; + } + + /** + * Getter for Iban + * + * @return string + */ + public function getIban() + { + return $this->iban; + } + + /** + * Getter for Bic + * + * @return string + */ + public function getBic() + { + return $this->bic; + } + + /** + * Getter for Bankcountry + * + * @return mixed + */ + public function getBankcountry() + { + return $this->bankcountry; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/ShippingAddress.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/ShippingAddress.php new file mode 100644 index 00000000..b3575c4b --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/ShippingAddress.php @@ -0,0 +1,92 @@ +firstname = $firstname; + $this->lastname = $lastname; + $this->street = $street; + $this->addressaddition = $addressaddition; + $this->zip = $zip; + $this->city = $city; + $this->country = $country; + } + + /** + * @return mixed + */ + public function getShippingFirstname() + { + return $this->firstname; + } + + /** + * @return mixed + */ + public function getShippingLastname() + { + return $this->lastname; + } + + /** + * @return mixed + */ + public function getShippingStreet() + { + return $this->street; + } + + /** + * @return mixed + */ + public function getShippingAddressaddition() + { + return $this->addressaddition; + } + + /** + * @return mixed + */ + public function getShippingZip() + { + return $this->zip; + } + + /** + * @return mixed + */ + public function getShippingCity() + { + return $this->city; + } + + /** + * @return mixed + */ + public function getShippingCountry() + { + return $this->country; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Parts/SystemInfo.php b/resources/lib/Payone/ArvPayoneApi/Request/Parts/SystemInfo.php new file mode 100644 index 00000000..03bff5d4 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Parts/SystemInfo.php @@ -0,0 +1,78 @@ +integratorName = $integratorName; + $this->integratorVersion = $integratorVersion; + $this->solutionName = $solutionName; + $this->solutionVersion = $solutionVersion; + } + + /** + * Getter for IntegratorName + * + * @return string + */ + public function getIntegratorName() + { + return $this->integratorName; + } + + /** + * Getter for IntegratorVersion + * + * @return string + */ + public function getIntegratorVersion() + { + return $this->integratorVersion; + } + + /** + * Getter for SolutionName + * + * @return string + */ + public function getSolutionName() + { + return $this->solutionName; + } + + /** + * Getter for SolutionVersion + * + * @return string + */ + public function getSolutionVersion() + { + return $this->solutionVersion; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/PaymentTypes.php b/resources/lib/Payone/ArvPayoneApi/Request/PaymentTypes.php new file mode 100644 index 00000000..a670f509 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/PaymentTypes.php @@ -0,0 +1,30 @@ +getConstants(); + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php new file mode 100644 index 00000000..b8d946e0 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php @@ -0,0 +1,14 @@ +txid = $txid; + $this->request = $request; + } + + /** + * Getter for Request + * + * @return GenericRequest + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for Txid + * + * @return string + */ + public function getTxid() + { + return $this->txid; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Request/Refund/RequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/Refund/RequestFactory.php new file mode 100644 index 00000000..c50f3a3f --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Request/Refund/RequestFactory.php @@ -0,0 +1,24 @@ +getConstants(); + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/Clearing.php b/resources/lib/Payone/ArvPayoneApi/Response/Clearing.php new file mode 100644 index 00000000..b545679b --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/Clearing.php @@ -0,0 +1,139 @@ +bankaccount = $responseData['clearing_bankaccount'] ?? ''; + $this->bankcode = $responseData['clearing_bankcode'] ?? ''; + $this->bankcountry = $responseData['clearing_bankcountry'] ?? ''; + $this->bankname = $responseData['clearing_bankname'] ?? ''; + $this->bankaccountholder = $responseData['clearing_bankaccountholder'] ?? ''; + $this->bankcity = $responseData['clearing_bankcity'] ?? ''; + $this->bankiban = $responseData['clearing_bankiban'] ?? ''; + $this->bankbic = $responseData['clearing_bankbic'] ?? ''; + } + + /** + * Getter for Bankaccount + * + * @return string + */ + public function getBankaccount() + { + return $this->bankaccount; + } + + /** + * Getter for Bankcode + * + * @return string + */ + public function getBankcode() + { + return $this->bankcode; + } + + /** + * Getter for Bankcountry + * + * @return string + */ + public function getBankcountry() + { + return $this->bankcountry; + } + + /** + * Getter for Bankname + * + * @return string + */ + public function getBankname() + { + return $this->bankname; + } + + /** + * Getter for Bankaccountholder + * + * @return string + */ + public function getBankaccountholder() + { + return $this->bankaccountholder; + } + + /** + * Getter for Bankcity + * + * @return string + */ + public function getBankcity() + { + return $this->bankcity; + } + + /** + * Getter for Bankiban + * + * @return string + */ + public function getBankiban() + { + return $this->bankiban; + } + + /** + * Getter for Bankbic + * + * @return string + */ + public function getBankbic() + { + return $this->bankbic; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/ClientErrorResponse.php b/resources/lib/Payone/ArvPayoneApi/Response/ClientErrorResponse.php new file mode 100644 index 00000000..a85a5f6e --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/ClientErrorResponse.php @@ -0,0 +1,54 @@ +message = $message; + } + + /** + * @return bool + */ + public function getSuccess() + { + return false; + } + + /** + * @return string + */ + public function getErrorMessage() + { + return $this->message; + } + + /** + * @return string + */ + public function getStatus() + { + return ''; + } + + /** + * @return string + */ + public function getTransactionID() + { + return ''; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/GenericResponse.php b/resources/lib/Payone/ArvPayoneApi/Response/GenericResponse.php new file mode 100644 index 00000000..3373c7f3 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/GenericResponse.php @@ -0,0 +1,103 @@ +responseData = $responseData; + } + + /** + * Request success + * + * @return bool + */ + public function getSuccess() + { + if (!$this->responseData || $this->getStatus() == 'ERROR') { + return false; + } + + return true; + } + + /** + * Get full error description from response + * + * @return string + */ + public function getErrorMessage() + { + if ($this->getSuccess()) { + return ''; + } + + $response = 'empty response'; + if ($this->responseData) { + $response = print_r($this->responseData, true); + } + + return 'Payone returned an error: ' . $response; + } + + /** + * Get the transaction id + * + * @return string + */ + public function getTransactionID() + { + if (!isset($this->responseData['txid'])) { + return ''; + } + + return (string) $this->responseData['txid']; + } + + /** + * Getter for ResponseData + * + * @return array + */ + public function getResponseData() + { + return $this->responseData; + } + + /** + * @return string + */ + public function getStatus() + { + if (!isset($this->responseData['status'])) { + return ''; + } + + return (string) $this->responseData['status']; + } + + /** + * @return string + */ + public function getLibVersion() + { + return Version::getVersion(); + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/ResponseContract.php b/resources/lib/Payone/ArvPayoneApi/Response/ResponseContract.php new file mode 100644 index 00000000..af3e747f --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/ResponseContract.php @@ -0,0 +1,40 @@ +getMethods() as $method) { + if (substr($method->name, 0, 3) != 'get') { + continue; + } + $propertyName = strtolower(substr($method->name, 3, 1)) . substr($method->name, 4); + + $value = $method->invoke($this); + if (method_exists($value, 'jsonSerialize') + && is_callable([$value, 'jsonSerialize'])) { + $value = $value->jsonSerialize(); + } + $result[$propertyName] = $value; + } + + return $result; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/ResponseDataContract.php b/resources/lib/Payone/ArvPayoneApi/Response/ResponseDataContract.php new file mode 100644 index 00000000..67cd1f3f --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/ResponseDataContract.php @@ -0,0 +1,11 @@ +getResponseData()); + $authResponse->setClearing($clearing); + + return $authResponse; + } + + return new GenericResponse($responseData); + } + + /** + * @param string $response + * + * @return array + */ + private static function parseResponse($response) + { + $responseData = []; + $separator = "\n\t"; + $line = strtok($response, $separator); + + while ($line !== false) { + $responseData += self::parseLine($line); + $line = strtok($separator); + } + + return $responseData; + } + + /** + * @param $line + * + * @return array + */ + private static function parseLine($line) + { + if (!trim($line)) { + return []; + } + list($key, $value) = explode('=', $line, 2); + + return [trim($key) => trim($value)]; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/ResponseWithClearing.php b/resources/lib/Payone/ArvPayoneApi/Response/ResponseWithClearing.php new file mode 100644 index 00000000..2f570255 --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/ResponseWithClearing.php @@ -0,0 +1,29 @@ +clearing = $clearing; + } + + /** + * Getter for Clearing + * + * @return Clearing + */ + public function getClearing() + { + return $this->clearing; + } +} diff --git a/resources/lib/Payone/ArvPayoneApi/Response/Status.php b/resources/lib/Payone/ArvPayoneApi/Response/Status.php new file mode 100644 index 00000000..d390735c --- /dev/null +++ b/resources/lib/Payone/ArvPayoneApi/Response/Status.php @@ -0,0 +1,13 @@ +doRequest($request); diff --git a/resources/lib/doCapture.php b/resources/lib/doCapture.php index c3c113ba..a0e9e144 100644 --- a/resources/lib/doCapture.php +++ b/resources/lib/doCapture.php @@ -1,11 +1,22 @@ logger->setIdentifier(__METHOD__); $response = $this->doLibCall((self::REQUEST_TYPE_AUTH), $requestParams); + + $this->logger->error('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); + $responseObject = AuthResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); diff --git a/src/Services/Auth.php b/src/Services/Auth.php index 7e7c9bd1..b73b8a60 100644 --- a/src/Services/Auth.php +++ b/src/Services/Auth.php @@ -143,6 +143,10 @@ private function doAuthFromBasket(Basket $basket) ); $requestData = $this->authDataProvider->getDataFromBasket($paymentCode, $basket, ''); + $this->logger->setIdentifier(__METHOD__)->debug( + 'Api.doAuth', + ['requestData' => $requestData] + ); try { $authResponse = $this->api->doAuth($requestData); } catch (\Exception $e) { From f79a479f647b1195e0a90eddb56c1a0f3f352913 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Wed, 14 Aug 2019 09:38:02 +0200 Subject: [PATCH 048/107] add correct composer autoload add require rename lib files --- .../PreAuthorization/RequestFactory.php | 14 - .../ArvPayoneApi => PayoneApi}/Api/Client.php | 2 +- .../Api/ClientContract.php | 2 +- .../Api/PostApi.php | 10 +- .../Lib/Version.php | 2 +- .../Request/ArraySerializer.php | 2 +- .../Request/Authorization/CashOnDelivery.php | 8 +- .../Request/Authorization/Creditcard.php | 10 +- .../Request/Authorization/DirectDebit.php | 10 +- .../Request/Authorization/Invoice.php | 8 +- .../Request/Authorization/InvoiceSecure.php | 10 +- .../Authorization/OnlineBankTransfer.php | 12 +- .../Request/Authorization/PayPal.php | 10 +- .../Request/Authorization/Paydirekt.php | 12 +- .../Request/Authorization/PrePayment.php | 8 +- .../Request/Authorization/RequestFactory.php | 22 +- .../Request/Authorization/Sofort.php | 12 +- .../Request/AuthorizationRequestAbstract.php | 2 +- .../Request/AuthorizationRequestContract.php | 4 +- .../Request/Capture/Capture.php | 6 +- .../Request/Capture/CaptureModes.php | 2 +- .../Request/Capture/RequestFactory.php | 14 +- .../Request/Capture/SettleAccountModes.php | 2 +- .../Request/ClearingTypes.php | 2 +- .../Request/Debit/Debit.php | 6 +- .../Request/Debit/RequestFactory.php | 14 +- .../Request/GenericAuthRequestFactory.php | 6 +- .../Request/GenericAuthorizationRequest.php | 4 +- .../Request/GenericRequest.php | 6 +- .../Request/GenericRequestFactory.php | 8 +- .../Request/Managemandate/ManageMandate.php | 16 +- .../ManageMandateRequestFactory.php | 16 +- .../Request/Parts/BankAccount.php | 2 +- .../Request/Parts/Cart.php | 2 +- .../Request/Parts/CartFactory.php | 2 +- .../Request/Parts/CartItem.php | 2 +- .../Request/Parts/Config.php | 2 +- .../Request/Parts/Customer.php | 2 +- .../Request/Parts/CustomerAddress.php | 2 +- .../Request/Parts/RedirectUrls.php | 2 +- .../Request/Parts/SepaMandate.php | 2 +- .../Request/Parts/ShippingAddress.php | 2 +- .../Request/Parts/SystemInfo.php | 2 +- .../Request/PaymentTypes.php | 2 +- .../PreAuthorization/RequestFactory.php | 14 + .../Request/Refund/Refund.php | 4 +- .../Request/Refund/RequestFactory.php | 10 +- .../Request/RequestDataContract.php | 6 +- .../Request/RequestFactoryContract.php | 2 +- .../Request/SerializerFactory.php | 2 +- .../Request/SerializerInterface.php | 2 +- .../Request/Types.php | 2 +- .../Response/Clearing.php | 2 +- .../Response/ClientErrorResponse.php | 2 +- .../Response/GenericResponse.php | 4 +- .../Response/ResponseContract.php | 2 +- .../Response/ResponseDataAbstract.php | 2 +- .../Response/ResponseDataContract.php | 2 +- .../Response/ResponseFactory.php | 2 +- .../Response/ResponseWithClearing.php | 2 +- .../Response/Status.php | 2 +- resources/lib/composer.json | 7 + resources/lib/doAuth.php | 26 +- resources/lib/doCapture.php | 26 +- resources/lib/doDebit.php | 26 +- resources/lib/doManagemandate.php | 26 +- resources/lib/doPreAuth.php | 26 +- resources/lib/doRefund.php | 26 +- resources/lib/vendor/autoload.php | 7 + resources/lib/vendor/composer/ClassLoader.php | 445 ++++++++++++++++++ resources/lib/vendor/composer/LICENSE | 21 + .../lib/vendor/composer/autoload_classmap.php | 9 + .../vendor/composer/autoload_namespaces.php | 9 + .../lib/vendor/composer/autoload_psr4.php | 10 + .../lib/vendor/composer/autoload_real.php | 52 ++ .../lib/vendor/composer/autoload_static.php | 31 ++ 76 files changed, 813 insertions(+), 282 deletions(-) delete mode 100644 resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Api/Client.php (98%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Api/ClientContract.php (93%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Api/PostApi.php (88%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Lib/Version.php (82%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/ArraySerializer.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/CashOnDelivery.php (78%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/Creditcard.php (79%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/DirectDebit.php (75%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/Invoice.php (65%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/InvoiceSecure.php (78%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/OnlineBankTransfer.php (81%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/PayPal.php (78%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/Paydirekt.php (81%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/PrePayment.php (65%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/RequestFactory.php (88%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Authorization/Sofort.php (81%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/AuthorizationRequestAbstract.php (93%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/AuthorizationRequestContract.php (88%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Capture/Capture.php (91%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Capture/CaptureModes.php (85%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Capture/RequestFactory.php (65%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Capture/SettleAccountModes.php (64%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/ClearingTypes.php (86%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Debit/Debit.php (86%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Debit/RequestFactory.php (62%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/GenericAuthRequestFactory.php (91%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/GenericAuthorizationRequest.php (93%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/GenericRequest.php (93%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/GenericRequestFactory.php (84%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Managemandate/ManageMandate.php (87%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Managemandate/ManageMandateRequestFactory.php (83%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/BankAccount.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/Cart.php (94%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/CartFactory.php (96%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/CartItem.php (98%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/Config.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/Customer.php (98%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/CustomerAddress.php (96%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/RedirectUrls.php (95%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/SepaMandate.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/ShippingAddress.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Parts/SystemInfo.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/PaymentTypes.php (94%) create mode 100644 resources/lib/PayoneApi/Request/PreAuthorization/RequestFactory.php rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Refund/Refund.php (87%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Refund/RequestFactory.php (60%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/RequestDataContract.php (82%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/RequestFactoryContract.php (88%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/SerializerFactory.php (77%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/SerializerInterface.php (79%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Request/Types.php (91%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/Clearing.php (98%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ClientErrorResponse.php (95%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/GenericResponse.php (95%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ResponseContract.php (93%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ResponseDataAbstract.php (94%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ResponseDataContract.php (74%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ResponseFactory.php (97%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/ResponseWithClearing.php (91%) rename resources/lib/{Payone/ArvPayoneApi => PayoneApi}/Response/Status.php (78%) create mode 100644 resources/lib/composer.json create mode 100644 resources/lib/vendor/autoload.php create mode 100644 resources/lib/vendor/composer/ClassLoader.php create mode 100644 resources/lib/vendor/composer/LICENSE create mode 100644 resources/lib/vendor/composer/autoload_classmap.php create mode 100644 resources/lib/vendor/composer/autoload_namespaces.php create mode 100644 resources/lib/vendor/composer/autoload_psr4.php create mode 100644 resources/lib/vendor/composer/autoload_real.php create mode 100644 resources/lib/vendor/composer/autoload_static.php diff --git a/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php b/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php deleted file mode 100644 index b8d946e0..00000000 --- a/resources/lib/Payone/ArvPayoneApi/Request/PreAuthorization/RequestFactory.php +++ /dev/null @@ -1,14 +0,0 @@ - + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/resources/lib/vendor/composer/LICENSE b/resources/lib/vendor/composer/LICENSE new file mode 100644 index 00000000..f27399a0 --- /dev/null +++ b/resources/lib/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/resources/lib/vendor/composer/autoload_classmap.php b/resources/lib/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..7a91153b --- /dev/null +++ b/resources/lib/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + array($baseDir . '/PayoneApi'), +); diff --git a/resources/lib/vendor/composer/autoload_real.php b/resources/lib/vendor/composer/autoload_real.php new file mode 100644 index 00000000..bac53af1 --- /dev/null +++ b/resources/lib/vendor/composer/autoload_real.php @@ -0,0 +1,52 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInite0e92804b3676dcad52f71f8933f242a::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/resources/lib/vendor/composer/autoload_static.php b/resources/lib/vendor/composer/autoload_static.php new file mode 100644 index 00000000..e5a0ebfc --- /dev/null +++ b/resources/lib/vendor/composer/autoload_static.php @@ -0,0 +1,31 @@ + + array ( + 'PayoneApi\\' => 10, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'PayoneApi\\' => + array ( + 0 => __DIR__ . '/../..' . '/PayoneApi', + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInite0e92804b3676dcad52f71f8933f242a::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInite0e92804b3676dcad52f71f8933f242a::$prefixDirsPsr4; + + }, null, ClassLoader::class); + } +} From b2358d97c69b543020bc001b2936f27893a13ecc Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Wed, 14 Aug 2019 14:41:52 +0200 Subject: [PATCH 049/107] add amazon pay to the sdk --- .../Request/Authorization/AmazonPay.php | 61 +++++++++++++++++++ .../Request/Authorization/RequestFactory.php | 6 ++ .../lib/PayoneApi/Request/PaymentTypes.php | 1 + 3 files changed, 68 insertions(+) create mode 100644 resources/lib/PayoneApi/Request/Authorization/AmazonPay.php diff --git a/resources/lib/PayoneApi/Request/Authorization/AmazonPay.php b/resources/lib/PayoneApi/Request/Authorization/AmazonPay.php new file mode 100644 index 00000000..2c980311 --- /dev/null +++ b/resources/lib/PayoneApi/Request/Authorization/AmazonPay.php @@ -0,0 +1,61 @@ +authorizationRequest = $authorizationRequest; + $this->urls = $urls; + } + + /** + * Getter for Urls + * + * @return RedirectUrls + */ + public function getUrls() + { + return $this->urls; + } + + /** + * Getter for Wallettype + * + * @return string + */ + public function getWallettype() + { + return $this->wallettype; + } +} diff --git a/resources/lib/PayoneApi/Request/Authorization/RequestFactory.php b/resources/lib/PayoneApi/Request/Authorization/RequestFactory.php index 37e06d2d..f9fdd88e 100644 --- a/resources/lib/PayoneApi/Request/Authorization/RequestFactory.php +++ b/resources/lib/PayoneApi/Request/Authorization/RequestFactory.php @@ -2,6 +2,7 @@ namespace PayoneApi\Request\Authorization; +use Faker\Provider\Payment; use PayoneApi\Request\AuthorizationRequestAbstract; use PayoneApi\Request\GenericAuthRequestFactory; use PayoneApi\Request\Parts\BankAccount; @@ -114,6 +115,11 @@ public static function create($paymentMethod, $data, $referenceId = null) self::createUrls($data['redirect']), $shippingAddress ); + case PaymentTypes::PAYONE_AMAZON_PAY: + return new AmazonPay( + $genericAuthRequest, + self::createUrls($data['redirect']) + ); } throw new \Exception('Unimplemented payment method ' . $paymentMethod); } diff --git a/resources/lib/PayoneApi/Request/PaymentTypes.php b/resources/lib/PayoneApi/Request/PaymentTypes.php index 7ffcd4f3..0f7ceda7 100644 --- a/resources/lib/PayoneApi/Request/PaymentTypes.php +++ b/resources/lib/PayoneApi/Request/PaymentTypes.php @@ -17,6 +17,7 @@ class PaymentTypes const PAYONE_PAYDIREKT = 'Paydirekt'; const PAYONE_INVOICE_SECURE = 'InvoiceSecure'; const PAYONE_ON_LINE_BANK_TRANSFER = 'OnlineBankTransfer'; + const PAYONE_AMAZON_PAY = 'Amazon Pay'; /** * @return mixed From 634cd042572c9c1620a1522b74c8d43ee6458302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 15 Aug 2019 10:39:21 +0200 Subject: [PATCH 050/107] RequestFactory create --- resources/lib/doAuth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/doAuth.php b/resources/lib/doAuth.php index 785cc937..ebc41091 100644 --- a/resources/lib/doAuth.php +++ b/resources/lib/doAuth.php @@ -30,7 +30,7 @@ $paymentMethod = $sdkRestApi::getParam('paymentMethod'); - $request = RequestFactory::create($paymentMethod, $data, false); + $request = RequestFactory::create($paymentMethod, $data); $serializer = new ArraySerializer(); $client = new PostApi(new Client(), $serializer); From acf66576d6a1562e1f849fc7179be01faa82135a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 15 Aug 2019 13:06:04 +0200 Subject: [PATCH 051/107] removed unnecessary errorlog --- src/Services/Api.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Services/Api.php b/src/Services/Api.php index 705dc089..30badd8c 100644 --- a/src/Services/Api.php +++ b/src/Services/Api.php @@ -68,8 +68,6 @@ public function doAuth($requestParams): AuthResponse $this->logger->setIdentifier(__METHOD__); $response = $this->doLibCall((self::REQUEST_TYPE_AUTH), $requestParams); - $this->logger->error('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); - $responseObject = AuthResponseFactory::create($response); $this->logger->setReferenceValue($responseObject->getTransactionID()); From cabef6d4302611fbf888b7453eef33ecc4732bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20Po=CC=88nninghaus?= <> Date: Thu, 15 Aug 2019 15:33:44 +0200 Subject: [PATCH 052/107] version update, General language file added, changelog update --- meta/documents/changelog_de.md | 11 +++++++++++ meta/documents/changelog_en.md | 11 +++++++++++ plugin.json | 2 +- resources/lang/de/Config.properties | 9 +++++++++ resources/lang/de/General.properties | 1 + resources/lang/en/Config.properties | 9 +++++++++ resources/lang/en/General.properties | 1 + 7 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 resources/lang/de/General.properties create mode 100644 resources/lang/en/General.properties diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index ac0d28ab..aaaf789c 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,16 @@ # Release Notes für Payone +## 1.1.4 (2019-08-15) + +### Geändert +- Das Payone SDK wurde umgezogen. + +### Hinzugefügt +- Die Zahlungsart Amazon Pay wurde für das Backend hinzugefügt. + +### Behoben +- Einige Medlungen im Log + ## 1.1.3 (2019-06-13) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index f7a4c5e8..20540ca0 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,16 @@ # Release Notes for Payone +## 1.1.4 (2019-08-15) + +### Changed +- The Payone SDK was relocated + +### Added +- The payment method Amazon Pay was added for the backend. + +### Fixed +- Some log messages + ## 1.1.3 (2019-06-13) ### Changed diff --git a/plugin.json b/plugin.json index b92688ef..e16c291b 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.3", + "version": "1.1.4", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index d7273163..369cc0c2 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -121,6 +121,15 @@ PAYONEPAYONEDIRECTDEBITDescriptionLabel=Beschreibung PAYONEPAYONEDIRECTDEBITMinCartAmountLabel=Minimaler Bestellwert PAYONEPAYONEDIRECTDEBITMaxCartAmountLabel=Maximaler Bestellwert PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=Erlaubte Lieferländer +AmazonPayTab=Amazon Pay +PAYONEPAYONEAMAZONPAYActiveLabel=Aktiv +PAYONEPAYONEAMAZONPAYActivePossibleValue0=Nein +PAYONEPAYONEAMAZONPAYActivePossibleValue1=Ja +PAYONEPAYONEAMAZONPAYNameLabel=Name +PAYONEPAYONEAMAZONPAYDescriptionLabel=Beschreibung +PAYONEPAYONEAMAZONPAYMinCartAmountLabel=Minimaler Bestellwert +PAYONEPAYONEAMAZONPAYMaxCartAmountLabel=Maximaler Bestellwert +PAYONEPAYONEAMAZONPAYAllowedCountriesLabel=Erlaubte Lieferländer DebuggingTab=Debugging debuggingActiveLabel=Aktiv debuggingActivePossibleValue0=Nein diff --git a/resources/lang/de/General.properties b/resources/lang/de/General.properties new file mode 100644 index 00000000..af1b7ff7 --- /dev/null +++ b/resources/lang/de/General.properties @@ -0,0 +1 @@ +getPaymentsByOrderId = getPaymentsByOrderId \ No newline at end of file diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index ca7ca5ba..6d0fd208 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -121,6 +121,15 @@ PAYONEPAYONEDIRECTDEBITDescriptionLabel=Description PAYONEPAYONEDIRECTDEBITMinCartAmountLabel=Minimum order value PAYONEPAYONEDIRECTDEBITMaxCartAmountLabel=Maximum order value PAYONEPAYONEDIRECTDEBITAllowedCountriesLabel=Allowed countries of delivery +AmazonPayTab=Amazon Pay +PAYONEPAYONEAMAZONPAYActiveLabel=Active +PAYONEPAYONEAMAZONPAYActivePossibleValue0=No +PAYONEPAYONEAMAZONPAYActivePossibleValue1=Yes +PAYONEPAYONEAMAZONPAYNameLabel=Name +PAYONEPAYONEAMAZONPAYDescriptionLabel=Description +PAYONEPAYONEAMAZONPAYMinCartAmountLabel=Minimum order value +PAYONEPAYONEAMAZONPAYMaxCartAmountLabel=Maximum order value +PAYONEPAYONEAMAZONPAYAllowedCountriesLabel=Allowed countries of delivery DebuggingTab=Debugging debuggingActiveLabel=Active debuggingActivePossibleValue0=No diff --git a/resources/lang/en/General.properties b/resources/lang/en/General.properties new file mode 100644 index 00000000..af1b7ff7 --- /dev/null +++ b/resources/lang/en/General.properties @@ -0,0 +1 @@ +getPaymentsByOrderId = getPaymentsByOrderId \ No newline at end of file From adc168f79d06d2c35da7c8a24ff67635fdd938a8 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Fri, 23 Aug 2019 14:58:04 +0200 Subject: [PATCH 053/107] fix external orders --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 5 +++++ plugin.json | 2 +- src/Providers/PayoneServiceProvider.php | 6 +++++- 4 files changed, 16 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/Providers/PayoneServiceProvider.php diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index aaaf789c..e116a3cf 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.5 (2019-08-23) + +### Behoben +- Aufträge die von externe Importiert werden und eine Zahlungsart von Payone nutzen werden nun korrekt angelegt und nicht durch das Plugin abgefangen. + ## 1.1.4 (2019-08-15) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 20540ca0..2f41a07e 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for Payone +## 1.1.5 (2019-08-23) + +### Behoben +- External orders will be created correct without skipping by the plugin. + ## 1.1.4 (2019-08-15) ### Changed diff --git a/plugin.json b/plugin.json index e16c291b..2c5e172c 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.4", + "version": "1.1.5", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php old mode 100644 new mode 100755 index 016c3719..c54b36ec --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -325,7 +325,11 @@ function (OrderCreated $event) use ( ) { $order = $event->getOrder(); $logger->info('Event.orderCreated', [$order, $order->id]); - if ($order->typeId != OrderType::TYPE_SALES_ORDER) { + if ($order->typeId != OrderType::TYPE_SALES_ORDER && !in_array($order->referrerId, [ + 0, // Manuell + 1, // Mandant + + ]) ) { return; } $selectedPaymentId = $order->methodOfPaymentId; From ec1218ff16a77eddb7fb1e73475fb84094b41ddb Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Fri, 23 Aug 2019 15:45:58 +0200 Subject: [PATCH 054/107] fix wrong order creating for shopware orders --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 5 +++++ plugin.json | 2 +- src/Providers/PayoneServiceProvider.php | 3 +-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index e116a3cf..2b77d71e 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.6 (2019-08-23) + +### Behoben +- Fehlerhafte Auftragsanlage behoben + ## 1.1.5 (2019-08-23) ### Behoben diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 2f41a07e..1fe2d281 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for Payone +## 1.1.6 (2019-08-23) + +### Behoben +- Fix wrong order creation + ## 1.1.5 (2019-08-23) ### Behoben diff --git a/plugin.json b/plugin.json index 2c5e172c..308c0b0d 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.5", + "version": "1.1.6", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index c54b36ec..783229e1 100755 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -328,7 +328,6 @@ function (OrderCreated $event) use ( if ($order->typeId != OrderType::TYPE_SALES_ORDER && !in_array($order->referrerId, [ 0, // Manuell 1, // Mandant - ]) ) { return; } @@ -340,7 +339,7 @@ function (OrderCreated $event) use ( if (!($payment instanceof Payment)) { $message = 'Payment could not be assigned to order.'; $logger->error($message, $payment); - throw new \Exception($message); + return; } $paymentCreationService->assignPaymentToOrder($payment, $order); $paymentCache->deletePayment($selectedPaymentId); From 223a912f1a6c78457f479cee4c426ea8418b2153 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Wed, 25 Sep 2019 13:22:21 +0200 Subject: [PATCH 055/107] add order notes for returns --- config.json | 6 ++++ resources/lang/de/Config.properties | 1 + resources/lang/en/Config.properties | 1 + src/Helpers/OrderHelper.php | 47 +++++++++++++++++++++++++++++ src/Services/Refund.php | 22 ++++++++++++-- 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/config.json b/config.json index 2dd93a73..87d9775e 100644 --- a/config.json +++ b/config.json @@ -63,6 +63,12 @@ } ] } + }, + "userId": { + "type": "inputText", + "required": false, + "label": "Config.userId", + "options": {} } } }, diff --git a/resources/lang/de/Config.properties b/resources/lang/de/Config.properties index 369cc0c2..f2c87528 100644 --- a/resources/lang/de/Config.properties +++ b/resources/lang/de/Config.properties @@ -3,6 +3,7 @@ midLabel=Merchant ID portalidLabel=Portal ID aidLabel=Account ID keyLabel=Schlüssel +userId=Benutzer ID für Notizen modeLabel=Modus modePossibleValue0=Test modePossibleValue1=Live diff --git a/resources/lang/en/Config.properties b/resources/lang/en/Config.properties index 6d0fd208..a69b57b0 100644 --- a/resources/lang/en/Config.properties +++ b/resources/lang/en/Config.properties @@ -4,6 +4,7 @@ portalidLabel=Portal ID aidLabel=Account ID keyLabel=Key modeLabel=Mode +userId=User ID for order notes modePossibleValue0=Test modePossibleValue1=Live authTypeLabel=Authorisation method diff --git a/src/Helpers/OrderHelper.php b/src/Helpers/OrderHelper.php index 8e8845e4..734369c6 100644 --- a/src/Helpers/OrderHelper.php +++ b/src/Helpers/OrderHelper.php @@ -2,12 +2,18 @@ namespace Payone\Helpers; +use Payone\PluginConstants; +use Plenty\Modules\Authorization\Services\AuthHelper; +use Plenty\Modules\Comment\Contracts\CommentRepositoryContract; use Plenty\Modules\Order\Models\Order; use Plenty\Modules\Order\Property\Models\OrderProperty; use Plenty\Modules\Order\Property\Models\OrderPropertyType; +use Plenty\Plugin\ConfigRepository; +use Plenty\Plugin\Log\Loggable; class OrderHelper { + use Loggable; /** * @param Order $order * @@ -24,4 +30,45 @@ public function getLang(Order $order) return 'DE'; } + + /** + * Adds a note to an order + * + * @param $refValue + * @param $msg + * @param null $backendUserId + * @throws \Throwable + * + */ + public function addOrderComment($refValue, $msg) + { + /** @var ConfigRepository $configRepository */ + $configRepository = pluginApp(ConfigRepository::class); + $backendUserId = $configRepository->get(PluginConstants::NAME . '.userId', null); + + if (isset($backendUserId)) + { + $commentData = []; + $commentData['referenceType'] = 'order'; + $commentData['referenceValue'] = $refValue; + $commentData['text'] = $msg; + $commentData['isVisibleForContact'] = false; + $commentData['userId'] = (int) $backendUserId; + + try + { + /** @var AuthHelper $authHelper */ + $authHelper = pluginApp(AuthHelper::class); + + $authHelper->processUnguarded( + function () use ($commentData) { + /** @var CommentRepositoryContract $commentRepo */ + $commentRepo = pluginApp(CommentRepositoryContract::class); + //unguarded + $commentRepo->createComment($commentData); + } + ); + } catch (\Exception $e) {} + } + } } diff --git a/src/Services/Refund.php b/src/Services/Refund.php index c236775a..8b82aaa4 100644 --- a/src/Services/Refund.php +++ b/src/Services/Refund.php @@ -4,6 +4,7 @@ use Payone\Adapter\Logger; use Payone\Adapter\PaymentHistory; +use Payone\Helpers\OrderHelper; use Payone\Helpers\PaymentHelper; use Payone\Methods\PayoneCCPaymentMethod; use Payone\Models\Api\Response; @@ -57,6 +58,11 @@ class Refund */ private $captureDataProvider; + /** + * @var OrderHelper + */ + protected $orderHelper; + /** * Refund constructor. * @@ -69,6 +75,7 @@ class Refund * @param DebitDataProvider $refundDataProvider * @param Api $api * @param CaptureDataProvider $captureDataProvider + * @param OrderHelper $orderHelper */ public function __construct( PaymentRepositoryContract $paymentRepository, @@ -79,7 +86,8 @@ public function __construct( OrderRepositoryContract $orderRepo, DebitDataProvider $refundDataProvider, Api $api, - CaptureDataProvider $captureDataProvider + CaptureDataProvider $captureDataProvider, + OrderHelper $orderHelper ) { $this->paymentRepository = $paymentRepository; $this->paymentHelper = $paymentHelper; @@ -90,6 +98,7 @@ public function __construct( $this->refundDataProvider = $refundDataProvider; $this->api = $api; $this->captureDataProvider = $captureDataProvider; + $this->orderHelper = $orderHelper; } /** @@ -97,6 +106,8 @@ public function __construct( */ public function executeRefund(Order $order) { + $orderNote = ''; + $this->logger->setIdentifier(__METHOD__)->info('EventProcedure.triggerFunction', ['order' => $order->id]); if (!in_array($order->typeId, $this->getAllowedOrderTypes())) { $this->logger->error('Invalid order type ' . $order->typeId . ' for order ' . $order->id); @@ -112,14 +123,14 @@ public function executeRefund(Order $order) } if (!$originalOrder) { $this->logger->error('Refunding payment failed! The given order is invalid!'); - + $orderNote = 'Refunding payment failed! The given order is invalid!'; return; } try { $payments = $this->paymentRepository->getPaymentsByOrderId($originalOrder->id); } catch (\Exception $e) { $this->logger->error('Error loading payment', $e->getMessage()); - + $orderNote = 'Error loading payment'; return; } $this->logger->debug( @@ -142,6 +153,7 @@ public function executeRefund(Order $order) 'errorMessage' => $text, ] ); + $orderNote = $text . ' Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; $this->paymentHistory->addPaymentHistoryEntry($payment, $text); continue; } @@ -181,13 +193,17 @@ public function executeRefund(Order $order) ] ); $text = 'Refund von event procedure fehlgeschlagen. Meldung: ' . $refundPaymentResult->getErrorMessage(); + $orderNote = $text . ' Meldung: ' . $refundPaymentResult->getErrorMessage() . ' Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; $this->paymentHistory->addPaymentHistoryEntry($payment, $text); continue; } $payment->status = $this->getNewPaymentStatus($payment, $refundPayment); $payment->updateOrderPaymentStatus = true; + $orderNote ='Refund Successful Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; $this->paymentRepository->updatePayment($payment); + + $this->orderHelper->addOrderComment($order->id, $orderNote); } } From 8822046ba44b497d9d149d1da66c67a1bad4558f Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 26 Sep 2019 08:32:41 +0200 Subject: [PATCH 056/107] add changelog and update plugin version --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 9 +++++++-- plugin.json | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 2b77d71e..55218dff 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.7 (2019-09-26) + +### Hinzugefügt +- Rückzahlungen werden nun per Notiz am Auftrag hinterlegt. Dazu muss in der Konfiguration eine UserID hinterlegt werden. + ## 1.1.6 (2019-08-23) ### Behoben diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 1fe2d281..ac41c0d7 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,13 +1,18 @@ # Release Notes for Payone +## 1.1.7 (2019-09-26) + +### Added +- An order note will added for refunds. Please add an user ID in the plugin configurations. + ## 1.1.6 (2019-08-23) -### Behoben +### Fixed - Fix wrong order creation ## 1.1.5 (2019-08-23) -### Behoben +### Fixed - External orders will be created correct without skipping by the plugin. ## 1.1.4 (2019-08-15) diff --git a/plugin.json b/plugin.json index 308c0b0d..b6a1c485 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.6", + "version": "1.1.7", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From 052c850390a859c977ce8960061266cbc8847615 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Fri, 25 Oct 2019 07:25:50 +0200 Subject: [PATCH 057/107] use correct order for the refund --- .../Api/Request/DebitDataProvider.php | 22 +++---- src/Services/Refund.php | 58 ++++++++++--------- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/Providers/Api/Request/DebitDataProvider.php b/src/Providers/Api/Request/DebitDataProvider.php index 1026f614..6831a061 100644 --- a/src/Providers/Api/Request/DebitDataProvider.php +++ b/src/Providers/Api/Request/DebitDataProvider.php @@ -9,21 +9,10 @@ */ class DebitDataProvider extends DataProviderAbstract implements DataProviderOrder { - /** - * {@inheritdoc} - */ public function getDataFromOrder(string $paymentCode, Order $order, string $requestReference = null) { - $requestParams = $this->getDefaultRequestData($paymentCode); - $requestParams['context']['sequencenumber'] = $this->getSequenceNumber($order); - $requestParams['basket'] = $this->getBasketDataFromOrder($order); - $requestParams['basketItems'] = $this->getOrderItemData($order); - $requestParams['order'] = $this->getOrderData($order); - $requestParams['referenceId'] = $requestReference; - - $this->validator->validate($requestParams); - - return $requestParams; + // TODO: Implement getDataFromOrder() method. + return []; } /** @@ -36,9 +25,12 @@ public function getDataFromOrder(string $paymentCode, Order $order, string $requ */ public function getPartialRefundData($paymentCode, Order $order, Order $refund, $preAuthUniqueId) { - $requestParams = $this->getDataFromOrder($paymentCode, $order, $preAuthUniqueId); - + $requestParams = $this->getDefaultRequestData($paymentCode); + $requestParams['context']['sequencenumber'] = $this->getSequenceNumber($order); + $requestParams['basket'] = $this->getBasketDataFromOrder($refund); + $requestParams['basketItems'] = $this->getOrderItemData($order); $requestParams['order'] = $this->getOrderData($refund); + $requestParams['referenceId'] = $preAuthUniqueId; $this->validator->validate($requestParams); diff --git a/src/Services/Refund.php b/src/Services/Refund.php index 8b82aaa4..d2ecab0f 100644 --- a/src/Services/Refund.php +++ b/src/Services/Refund.php @@ -102,28 +102,29 @@ public function __construct( } /** - * @param Order $order + * @param Order $refund */ - public function executeRefund(Order $order) + public function executeRefund(Order $refund) { $orderNote = ''; - $this->logger->setIdentifier(__METHOD__)->info('EventProcedure.triggerFunction', ['order' => $order->id]); - if (!in_array($order->typeId, $this->getAllowedOrderTypes())) { - $this->logger->error('Invalid order type ' . $order->typeId . ' for order ' . $order->id); + $this->logger->setIdentifier(__METHOD__)->info('EventProcedure.triggerFunction', ['order' => $refund->id]); + if (!in_array($refund->typeId, $this->getAllowedOrderTypes())) { + $this->logger->error('Invalid order type ' . $refund->typeId . ' for order ' . $refund->id); return; } try { - $originalOrder = $this->getOriginalOrder($order); + $originalOrder = $this->getOriginalOrder($refund); } catch (\Exception $e) { - $this->logger->error('Error loading original order for order ' . $order->id, $e->getMessage()); + $this->logger->error('Error loading original order for order ' . $refund->id, $e->getMessage()); return; } if (!$originalOrder) { $this->logger->error('Refunding payment failed! The given order is invalid!'); $orderNote = 'Refunding payment failed! The given order is invalid!'; + $this->orderHelper->addOrderComment($refund->id, $orderNote); return; } try { @@ -131,6 +132,7 @@ public function executeRefund(Order $order) } catch (\Exception $e) { $this->logger->error('Error loading payment', $e->getMessage()); $orderNote = 'Error loading payment'; + $this->orderHelper->addOrderComment($refund->id, $orderNote); return; } $this->logger->debug( @@ -148,25 +150,25 @@ public function executeRefund(Order $order) $text = 'No Auth reference found in payment.'; $this->logger->error('Api.doRefund', [ - 'order' => $order->id, + 'order' => $refund->id, 'payment' => $payment, 'errorMessage' => $text, ] ); - $orderNote = $text . ' Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; + $orderNote = $text . ' Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; $this->paymentHistory->addPaymentHistoryEntry($payment, $text); continue; } - if ($order->typeId != OrderType::TYPE_SALES_ORDER) { + if ($refund->typeId != OrderType::TYPE_SALES_ORDER) { $refundPaymentResult = $this->refundCreditMemo( $payment, $originalOrder, - $order, + $refund, $preAuth ); } else { - $refundPaymentResult = $this->refundOrder($payment, $order, $preAuth); + $refundPaymentResult = $this->refundOrder($payment, $refund, $preAuth); } $paymentCode = $this->paymentHelper->getPaymentCodeByMop($payment->mopId); @@ -180,37 +182,37 @@ public function executeRefund(Order $order) } } - $refundPayment = $this->createRefundPayment($payment->mopId, $payment, $originalOrder, + $refundPayment = $this->createRefundPayment($payment->mopId, $payment, $refund, $refundPaymentResult); if (!$refundPaymentResult->getSuccess()) { $this->logger->error('Api.doRefund', [ - 'order' => $order->id, + 'order' => $refund->id, 'payment' => $payment, 'authReference' => $preAuth, 'errorMessage' => $refundPaymentResult->getErrorMessage(), ] ); $text = 'Refund von event procedure fehlgeschlagen. Meldung: ' . $refundPaymentResult->getErrorMessage(); - $orderNote = $text . ' Meldung: ' . $refundPaymentResult->getErrorMessage() . ' Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; + $orderNote = $text . ' Meldung: ' . $refundPaymentResult->getErrorMessage() . ' Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; $this->paymentHistory->addPaymentHistoryEntry($payment, $text); continue; } $payment->status = $this->getNewPaymentStatus($payment, $refundPayment); $payment->updateOrderPaymentStatus = true; - $orderNote ='Refund Successful Order-ID: ' . $order->id .' Payment-ID: '.$payment->id; + $orderNote ='Refund Successful Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; $this->paymentRepository->updatePayment($payment); - - $this->orderHelper->addOrderComment($order->id, $orderNote); } + + $this->orderHelper->addOrderComment($refund->id, $orderNote); } /** * @param $mopId * @param $payment - * @param $order + * @param $refund * @param Response $transaction * * @return Payment @@ -218,7 +220,7 @@ public function executeRefund(Order $order) private function createRefundPayment( $mopId, $payment, - Order $order, + Order $refund, $transaction ) { /* @var Payment $debitPayment */ @@ -226,17 +228,17 @@ private function createRefundPayment( $mopId, $transaction, $payment->currency, - $this->getOrderAmount($order, $payment), + $this->getOrderAmount($refund, $payment), $payment->id ); if (isset($debitPayment) && $debitPayment instanceof Payment) { - $this->paymentCreation->assignPaymentToOrder($debitPayment, $order); + $this->paymentCreation->assignPaymentToOrder($debitPayment, $refund); } $this->logger->debug( 'General.createRefundPayment', - ['orderId' => $order->id, 'payment' => $debitPayment] + ['orderId' => $refund->id, 'payment' => $debitPayment] ); return $debitPayment; @@ -244,12 +246,12 @@ private function createRefundPayment( /** * @param Payment $payment - * @param Order $order + * @param Order $refund * @param $preAuthUniqueId * * @return Response */ - private function refundOrder($payment, Order $order, $preAuthUniqueId) + private function refundOrder($payment, Order $refund, $preAuthUniqueId) { $paymentCode = $this->paymentHelper->getPaymentCodeByMop($payment->mopId); @@ -257,18 +259,18 @@ private function refundOrder($payment, Order $order, $preAuthUniqueId) 'Api.doRefund', [ 'paymentCode' => $paymentCode, - 'order' => $order->toArray(), + 'order' => $refund->toArray(), 'authUniqueId' => $preAuthUniqueId, ] ); if ($paymentCode == PayoneCCPaymentMethod::PAYMENT_CODE) { if (!$payment->amount) {// not captured yet? - return $this->reverseAuth($order, $payment, $preAuthUniqueId); + return $this->reverseAuth($refund, $payment, $preAuthUniqueId); } } - $requestData = $this->refundDataProvider->getDataFromOrder($paymentCode, $order, $preAuthUniqueId); + $requestData = $this->refundDataProvider->getDataFromOrder($paymentCode, $refund, $preAuthUniqueId); return $this->api->doDebit($requestData); } From 49ed03c799514f302c3de9c1a2b3f61fe2d8b6fe Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Fri, 25 Oct 2019 09:53:21 +0200 Subject: [PATCH 058/107] update and refactor payment creation optimize boot time --- src/Adapter/Logger.php | 4 +- src/Providers/PayoneServiceProvider.php | 195 ++++++++---------------- src/Services/PaymentCreation.php | 9 ++ src/Services/Refund.php | 6 +- 4 files changed, 80 insertions(+), 134 deletions(-) diff --git a/src/Adapter/Logger.php b/src/Adapter/Logger.php index 53d849fc..f3276e7b 100644 --- a/src/Adapter/Logger.php +++ b/src/Adapter/Logger.php @@ -38,8 +38,8 @@ class Logger //implements LoggerContract * * @param ShopHelper $shopHelper */ - public function __construct(ShopHelper $shopHelper - ) { + public function __construct(ShopHelper $shopHelper) + { $this->shopHelper = $shopHelper; $this->identifier = __CLASS__; $this->logger = $this->getLogger($this->identifier); diff --git a/src/Providers/PayoneServiceProvider.php b/src/Providers/PayoneServiceProvider.php index 783229e1..d14a3f46 100755 --- a/src/Providers/PayoneServiceProvider.php +++ b/src/Providers/PayoneServiceProvider.php @@ -39,9 +39,11 @@ use Plenty\Modules\Document\Models\Document; use Plenty\Modules\EventProcedures\Services\Entries\ProcedureEntry; use Plenty\Modules\EventProcedures\Services\EventProceduresService; +use Plenty\Modules\Order\Contracts\OrderRepositoryContract; use Plenty\Modules\Order\Events\OrderCreated; use Plenty\Modules\Order\Models\OrderType; use Plenty\Modules\Payment\Contracts\PaymentRepositoryContract; +use Plenty\Modules\Payment\Events\Checkout\ExecutePayment; use Plenty\Modules\Payment\Events\Checkout\GetPaymentMethodContent; use Plenty\Modules\Payment\Method\Contracts\PaymentMethodContainer; use Plenty\Modules\Payment\Models\Payment; @@ -61,62 +63,24 @@ public function register() /** * @param Dispatcher $eventDispatcher - * @param PaymentHelper $paymentHelper - * @param PaymentService $paymentService * @param BasketRepositoryContract $basket * @param PaymentMethodContainer $payContainer - * @param PaymentRenderer $paymentRenderer - * @param PaymentMethodContent $content - * @param Logger $logger * @param EventProceduresService $eventProceduresService - * @param ErrorMessageRenderer $errorMessageRenderer - * @param PaymentCreation $paymentCreationService - * @param PaymentCache $paymentCache - * @param ReferenceContainer $referenceContainer - * @param OrderPdf $orderPdf - * @param OrderHelper $orderHelper */ public function boot( Dispatcher $eventDispatcher, - PaymentHelper $paymentHelper, - PaymentService $paymentService, BasketRepositoryContract $basket, PaymentMethodContainer $payContainer, - PaymentRenderer $paymentRenderer, - PaymentMethodContent $content, - Logger $logger, - EventProceduresService $eventProceduresService, - ErrorMessageRenderer $errorMessageRenderer, - PaymentCreation $paymentCreationService, - PaymentCache $paymentCache, - ReferenceContainer $referenceContainer, - OrderPdf $orderPdf, - OrderHelper $orderHelper, - AddressHelper $addressHelper, - ShopHelper $shopHelper + EventProceduresService $eventProceduresService ) { $this->registerPaymentMethods($payContainer); $this->registerPaymentRendering( $eventDispatcher, - $paymentHelper, - $paymentService, - $paymentRenderer, - $content, - $logger, - $basket, - $errorMessageRenderer, - $addressHelper, - $shopHelper + $basket ); - $this->registerOrderCreationEvents( - $eventDispatcher, - $paymentHelper, - $logger, - $paymentCreationService, - $paymentCache - ); + $this->registerPaymentExecute($eventDispatcher); $captureProcedureTitle = [ 'de' => 'Versandbestätigung an ' . PluginConstants::NAME, @@ -140,9 +104,7 @@ public function boot( '\Payone\Procedures\RefundEventProcedure@run' ); - $this->registerReferenceTypesForLogging($referenceContainer); - $this->registerInvoicePdfGeneration($eventDispatcher, $paymentHelper, $logger, $orderPdf, $orderHelper); - + $this->registerInvoicePdfGeneration($eventDispatcher); } /** @@ -224,32 +186,20 @@ protected function registerPaymentMethods(PaymentMethodContainer $payContainer) * @param PaymentMethodContent $content * @param Logger $logger */ - private function registerPaymentRendering( + protected function registerPaymentRendering( Dispatcher $eventDispatcher, - PaymentHelper $paymentHelper, - PaymentService $paymentService, - PaymentRenderer $paymentRenderer, - PaymentMethodContent $content, - Logger $logger, - BasketRepositoryContract $basketRepository, - ErrorMessageRenderer $errorMessageRenderer, - AddressHelper $addressHelper, - ShopHelper $shopHelper + BasketRepositoryContract $basketRepository ) { - $logger = $logger->setIdentifier(__METHOD__); $eventDispatcher->listen( GetPaymentMethodContent::class, - function (GetPaymentMethodContent $event) use ( - $paymentService, - $paymentHelper, - $paymentRenderer, - $content, - $logger, - $basketRepository, - $errorMessageRenderer, - $addressHelper, - $shopHelper - ) { + function (GetPaymentMethodContent $event) use ($basketRepository) { + /** @var PaymentService $paymentService */ + $paymentService = pluginApp(PaymentService::class); + /** @var Logger $logger */ + $logger = pluginApp(Logger::class); + /** @var PaymentHelper $paymentHelper */ + $paymentHelper = pluginApp(PaymentHelper::class); + $logger->setIdentifier(__METHOD__)->info('Event.getPaymentMethodContent'); $selectedPaymentMopId = $event->getMop(); if (!$selectedPaymentMopId || !$paymentHelper->isPayonePayment($selectedPaymentMopId)) { @@ -260,13 +210,16 @@ function (GetPaymentMethodContent $event) use ( $payment = PaymentMethodServiceFactory::create($paymentCode); $basket = $basketRepository->load(); + /** @var AddressHelper $addressHelper */ + $addressHelper = pluginApp(AddressHelper::class); $billingAddress = $addressHelper->getBasketBillingAddress($basket); if( $paymentCode == PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE && (!isset($billingAddress->birthday) || !strlen($billingAddress->birthday)) ) { /** @var \Plenty\Plugin\Translation\Translator $translator */ $translator = pluginApp(\Plenty\Plugin\Translation\Translator::class); - + /** @var ShopHelper $shopHelper */ + $shopHelper = pluginApp(ShopHelper::class); $lang = $shopHelper->getCurrentLanguage(); $dateOfBirthMissingMessage = $translator->trans('Payone::Template.missingDateOfBirth', [], $lang); @@ -276,8 +229,14 @@ function (GetPaymentMethodContent $event) use ( return; } - $renderingType = $content->getPaymentContentType($paymentCode); try { + /** @var PaymentMethodContent $content */ + $content = pluginApp(PaymentMethodContent::class); + $renderingType = $content->getPaymentContentType($paymentCode); + + /** @var PaymentRenderer $paymentRenderer */ + $paymentRenderer = pluginApp(PaymentRenderer::class); + $event->setType($renderingType); switch ($renderingType) { case GetPaymentMethodContent::RETURN_TYPE_REDIRECT_URL: @@ -294,6 +253,9 @@ function (GetPaymentMethodContent $event) use ( } catch (\Exception $e) { $errorMessage = $e->getMessage(); $logger->logException($e); + + /** @var ErrorMessageRenderer $errorMessageRenderer */ + $errorMessageRenderer = pluginApp(ErrorMessageRenderer::class); $event->setValue($errorMessageRenderer->render($errorMessage)); $event->setType(GetPaymentMethodContent::RETURN_TYPE_ERROR); } @@ -301,84 +263,57 @@ function (GetPaymentMethodContent $event) use ( ); } - /** - * @param Dispatcher $eventDispatcher - * @param PaymentHelper $paymentHelper - * @param Logger $logger - * @param Capture $captureService - * @param PaymentCreation $paymentCreationService - */ - private function registerOrderCreationEvents( - Dispatcher $eventDispatcher, - PaymentHelper $paymentHelper, - Logger $logger, - PaymentCreation $paymentCreationService, - PaymentCache $paymentCache - ) { - $logger = $logger->setIdentifier(__METHOD__); - $eventDispatcher->listen(OrderCreated::class, - function (OrderCreated $event) use ( - $paymentHelper, - $logger, - $paymentCreationService, - $paymentCache - ) { - $order = $event->getOrder(); - $logger->info('Event.orderCreated', [$order, $order->id]); - if ($order->typeId != OrderType::TYPE_SALES_ORDER && !in_array($order->referrerId, [ - 0, // Manuell - 1, // Mandant - ]) ) { - return; - } - $selectedPaymentId = $order->methodOfPaymentId; - if (!$selectedPaymentId || !$paymentHelper->isPayonePayment($selectedPaymentId)) { - return; - } - $payment = $paymentCache->loadPayment($selectedPaymentId); + protected function registerPaymentExecute(Dispatcher $dispatcher) + { + $dispatcher->listen(ExecutePayment::class, function (ExecutePayment $event) { + /** @var PaymentHelper $paymentHelper */ + $paymentHelper = pluginApp(PaymentHelper::class); + if($paymentHelper->isPayonePayment($event->getMop())) { + /** @var OrderRepositoryContract $orderRepository */ + $orderRepository = pluginApp(OrderRepositoryContract::class); + /** @var PaymentCache $paymentCache */ + $paymentCache = pluginApp(PaymentCache::class); + + $order = $orderRepository->findOrderById($event->getOrderId()); + $payment = $paymentCache->loadPayment($event->getMop()); if (!($payment instanceof Payment)) { $message = 'Payment could not be assigned to order.'; + + /** @var Logger $logger */ + $logger = pluginApp(Logger::class); $logger->error($message, $payment); return; } + + /** @var PaymentCreation $paymentCreationService */ + $paymentCreationService = pluginApp(PaymentCreation::class); $paymentCreationService->assignPaymentToOrder($payment, $order); - $paymentCache->deletePayment($selectedPaymentId); + $paymentCache->deletePayment($event->getMop()); } - ); - } + }); - /** - * @param ReferenceContainer $referenceContainer - */ - private function registerReferenceTypesForLogging(ReferenceContainer $referenceContainer) - { - try { - $referenceContainer->add([Logger::PAYONE_REQUEST_REFERENCE => Logger::PAYONE_REQUEST_REFERENCE]); - } catch (ReferenceTypeException $ex) { - // already registered - } } /** * @param Dispatcher $eventDispatcher - * @param PaymentHelper $paymentHelper - * @param Logger $logger - * @param OrderPdf $orderPdf - * @param OrderHelper $orderHelper */ - private function registerInvoicePdfGeneration( - Dispatcher $eventDispatcher, - PaymentHelper $paymentHelper, - Logger $logger, - OrderPdf $orderPdf, - OrderHelper $orderHelper - ) { + protected function registerInvoicePdfGeneration(Dispatcher $eventDispatcher) + { // Listen for the document generation event $eventDispatcher->listen(OrderPdfGenerationEvent::class, - function (OrderPdfGenerationEvent $event) use ($paymentHelper, $logger, $orderPdf, $orderHelper) { - /** @var Order $order */ + function (OrderPdfGenerationEvent $event) { + + /** @var PaymentHelper $paymentHelper */ + $paymentHelper = pluginApp(PaymentHelper::class); + + /** @var OrderHelper $orderHelper */ + $orderHelper = pluginApp(OrderHelper::class); + + /** @var \Order $order */ $order = $event->getOrder(); + /** @var Logger $logger */ + $logger = pluginApp(Logger::class); $logger->setIdentifier(__METHOD__)->info( 'Event.orderPdfGeneration', ['order' => $order->id, 'documentType' => $event->getDocType()] @@ -401,6 +336,8 @@ function (OrderPdfGenerationEvent $event) use ($paymentHelper, $logger, $orderPd } $lang = $orderHelper->getLang($order); try { + /** @var OrderPdf $orderPdf */ + $orderPdf = pluginApp(OrderPdf::class); $orderPdfGenerationModel = $orderPdf->createPdfNote($payments[0], $lang); } catch (\Exception $e) { $logger->error('Adding PDF comment failed for order ' diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index 86b05da8..9ebb8652 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -327,6 +327,15 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota $transactionID ); + /* + * Sequence Number + * First number have to be 0 + */ + $paymentProperties[] = $this->createPaymentProperty( + PaymentProperty::TYPE_TRANSACTION_CODE, + 0 + ); + $paymentProperties[] = $this->createPaymentProperty(PaymentProperty::TYPE_ORIGIN, '' . Payment::ORIGIN_PLUGIN); $paymentText = [ diff --git a/src/Services/Refund.php b/src/Services/Refund.php index d2ecab0f..cceadbd6 100644 --- a/src/Services/Refund.php +++ b/src/Services/Refund.php @@ -182,9 +182,6 @@ public function executeRefund(Order $refund) } } - $refundPayment = $this->createRefundPayment($payment->mopId, $payment, $refund, - $refundPaymentResult); - if (!$refundPaymentResult->getSuccess()) { $this->logger->error('Api.doRefund', [ @@ -200,6 +197,9 @@ public function executeRefund(Order $refund) continue; } + $refundPayment = $this->createRefundPayment($payment->mopId, $payment, $refund, + $refundPaymentResult); + $payment->status = $this->getNewPaymentStatus($payment, $refundPayment); $payment->updateOrderPaymentStatus = true; $orderNote ='Refund Successful Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; From 5343133786503ac977654d29064c45a10c506a86 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Fri, 25 Oct 2019 10:37:22 +0200 Subject: [PATCH 059/107] add changelog and update plugin version --- meta/documents/changelog_de.md | 9 +++++++++ meta/documents/changelog_en.md | 9 +++++++++ plugin.json | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 55218dff..13d53b2f 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,14 @@ # Release Notes für Payone +## 1.1.8 (2019-10-25) + +### Behoben +- Teilrückerstattungen werden nun über den korrekten Betrag ausgeführt. + +### Geändert +- Rückerstattungen werden nun dem Auftrag zugeordnet von dem diese ausgeführt wurden. +- Ladezeiten des Plugins wurden verbessert. + ## 1.1.7 (2019-09-26) ### Hinzugefügt diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index ac41c0d7..56ac94f7 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,14 @@ # Release Notes for Payone +## 1.1.8 (2019-10-25) + +### Fixed +- Partial refunds will use the correct amount from the credit note or return. + +### Changed +- Refund payments will added to the credit note or return from where they were executed. +- The loading times of the plugin have been improved. + ## 1.1.7 (2019-09-26) ### Added diff --git a/plugin.json b/plugin.json index b6a1c485..047745b6 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.7", + "version": "1.1.8", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From e69bf544d8dcbb2d530fc91689f39a83e19b3098 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 7 Nov 2019 09:15:09 +0100 Subject: [PATCH 060/107] add sequence number until inital payment creation. Fix updating payment status while creating an refund payment --- src/Helpers/PaymentHelper.php | 55 ++++++++++++++++++++++++++++++++ src/Services/PaymentCreation.php | 5 +++ src/Services/Refund.php | 4 +-- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/Helpers/PaymentHelper.php b/src/Helpers/PaymentHelper.php index e03eee83..32403bef 100644 --- a/src/Helpers/PaymentHelper.php +++ b/src/Helpers/PaymentHelper.php @@ -179,4 +179,59 @@ public function getPaymentPropertyValue($payment, $propertyTypeConstant) return ''; } + + public function raiseSequenceNumber(Payment $payment) + { + foreach ($payment->properties as $property) { + if($property->typeId == PaymentProperty::TYPE_TRANSACTION_CODE) { + $property->value++; + return $payment; + } + } + } + + + /** + * @param Payment $payment + * @param int $pamentPropertyTypeId + * @param string $value + * + * @return Payment + */ + public function createOrUpdatePaymentProperty($payment, $pamentPropertyTypeId, $value) + { + foreach ($payment->properties as $property) { + if (!($property instanceof PaymentProperty)) { + continue; + } + if ($property->typeId === $pamentPropertyTypeId) { + $property->value = $value; + return $payment; + } + } + + $paymentProperties = $payment->properties; + $paymentProperties[] = $this->createPaymentProperty($pamentPropertyTypeId, $value); + + return $payment; + } + + /** + * Returns a PaymentProperty with the given params + * + * @param int $typeId + * @param string $value + * + * @return PaymentProperty + */ + protected function createPaymentProperty($typeId, $value) + { + /** @var PaymentProperty $paymentProperty */ + $paymentProperty = pluginApp(PaymentProperty::class); + + $paymentProperty->typeId = $typeId; + $paymentProperty->value = $value . ''; + + return $paymentProperty; + } } diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index 9ebb8652..03628ad2 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -142,6 +142,11 @@ public function createPayment($mopId, ResponseAbstract $response, Basket $basket $transactionID ); + $paymentProperties[] = $this->createPaymentProperty( + PaymentProperty::TYPE_TRANSACTION_CODE, + 0 + ); + $paymentProperties[] = $this->createPaymentProperty(PaymentProperty::TYPE_ORIGIN, '' . Payment::ORIGIN_PLUGIN); $paymentProperties[] = $this->createPaymentProperty( PaymentProperty::TYPE_INVOICE_ADDRESS_ID, diff --git a/src/Services/Refund.php b/src/Services/Refund.php index cceadbd6..56d97571 100644 --- a/src/Services/Refund.php +++ b/src/Services/Refund.php @@ -193,7 +193,6 @@ public function executeRefund(Order $refund) ); $text = 'Refund von event procedure fehlgeschlagen. Meldung: ' . $refundPaymentResult->getErrorMessage(); $orderNote = $text . ' Meldung: ' . $refundPaymentResult->getErrorMessage() . ' Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; - $this->paymentHistory->addPaymentHistoryEntry($payment, $text); continue; } @@ -201,9 +200,10 @@ public function executeRefund(Order $refund) $refundPaymentResult); $payment->status = $this->getNewPaymentStatus($payment, $refundPayment); - $payment->updateOrderPaymentStatus = true; + $payment = $this->paymentHelper->raiseSequenceNumber($payment); $orderNote ='Refund Successful Order-ID: ' . $refund->id .' Payment-ID: '.$payment->id; $this->paymentRepository->updatePayment($payment); + $this->paymentHistory->addPaymentHistoryEntry($payment, $orderNote); } $this->orderHelper->addOrderComment($refund->id, $orderNote); From 03c2a89d1ce501843cfcdf8ff20900c8a9fca72e Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 7 Nov 2019 09:46:34 +0100 Subject: [PATCH 061/107] add booking text to refund payment --- src/Services/PaymentCreation.php | 9 ++++++++- src/Services/Refund.php | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index 03628ad2..f83b8bcb 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -297,7 +297,7 @@ public function reAuthorizePayment(Payment $payment, Response $response, Order $ * * @return Payment */ - public function createRefundPayment($paymentId, $response, $currency, $grandTotal, $parentPaymentId) + public function createRefundPayment($paymentId, $response, $currency, $grandTotal, $parentPaymentId, $refundId=0) { $this->logger->setIdentifier(__METHOD__)->debug( 'Payment.createRefundPayment', @@ -353,6 +353,13 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota json_encode($paymentText) ); + $paymentProperties[] = $this->createPaymentProperty( + PaymentProperty::TYPE_BOOKING_TEXT, + sprintf('Refund (%s) OrderId: (%s)', [ + $refundId, $transactionID + ]) + ); + $payment->properties = $paymentProperties; try { diff --git a/src/Services/Refund.php b/src/Services/Refund.php index 56d97571..033336e4 100644 --- a/src/Services/Refund.php +++ b/src/Services/Refund.php @@ -229,7 +229,8 @@ private function createRefundPayment( $transaction, $payment->currency, $this->getOrderAmount($refund, $payment), - $payment->id + $payment->id, + $refund->id ); if (isset($debitPayment) && $debitPayment instanceof Payment) { From 4b40c43551fe3c8a03cbb0049896ca23537159cf Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 7 Nov 2019 10:54:22 +0100 Subject: [PATCH 062/107] add unique transaction id and add exception logging --- src/Services/PaymentCreation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index f83b8bcb..de0643a4 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -310,7 +310,7 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota ] ); - $transactionID = $response->getTransactionID(); + $transactionID = $response->getTransactionID() . '_' . $refundId; /** @var Payment $payment */ $payment = pluginApp(Payment::class); @@ -323,7 +323,6 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota $payment->receivedAt = date('Y-m-d H:i:s'); $payment->type = 'debit'; $payment->parentId = $parentPaymentId; - $payment->regenerateHash = true; $payment->unaccountable = 0; $paymentProperties = []; @@ -355,7 +354,7 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota $paymentProperties[] = $this->createPaymentProperty( PaymentProperty::TYPE_BOOKING_TEXT, - sprintf('Refund (%s) OrderId: (%s)', [ + sprintf('Refund (%s) Transaction: (%s)', [ $refundId, $transactionID ]) ); @@ -365,6 +364,7 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota try { $payment = $this->paymentRepository->createPayment($payment); } catch (\Exception $e) { + $this->logger->logException($e); $storedPayment = $this->paymentRepository->getPaymentById($payment->id); if ($storedPayment) { return $storedPayment; From 79cafd44d54b0cb581012a79bc2dc771c249f265 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 7 Nov 2019 11:00:53 +0100 Subject: [PATCH 063/107] change booking text for refund payments --- src/Services/PaymentCreation.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Services/PaymentCreation.php b/src/Services/PaymentCreation.php index de0643a4..cc63373b 100644 --- a/src/Services/PaymentCreation.php +++ b/src/Services/PaymentCreation.php @@ -354,9 +354,7 @@ public function createRefundPayment($paymentId, $response, $currency, $grandTota $paymentProperties[] = $this->createPaymentProperty( PaymentProperty::TYPE_BOOKING_TEXT, - sprintf('Refund (%s) Transaction: (%s)', [ - $refundId, $transactionID - ]) + 'Refund ('.$refundId.') Transaction: ('.$transactionID.')' ); $payment->properties = $paymentProperties; From c1407c85c12018f2a992d93854438f8e539d0fe9 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Thu, 7 Nov 2019 11:20:16 +0100 Subject: [PATCH 064/107] update version --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 5 +++++ plugin.json | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 13d53b2f..7c48de98 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.9 (2019-11-07) + +### Behoben +- Teilrückerstattungen können nun auch mehrfach ausgeführt werden, dies führte unter bestimmten Konstelationen zu einem Fehler. + ## 1.1.8 (2019-10-25) ### Behoben diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 56ac94f7..2b9af133 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for Payone +## 1.1.9 (2019-11-07) + +### Fixed +- Partial refunds can now be executed more than once. Under certain constellations an error came up. + ## 1.1.8 (2019-10-25) ### Fixed diff --git a/plugin.json b/plugin.json index 047745b6..10008bc9 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.8", + "version": "1.1.9", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From ed325a0949204ca09a18f90a29bd24e9b8981d50 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Mon, 9 Dec 2019 16:21:27 +0100 Subject: [PATCH 065/107] fix order notes during the refund process --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 5 +++++ plugin.json | 2 +- src/Helpers/PaymentHelper.php | 6 ++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 7c48de98..396db6fe 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für Payone +## 1.1.10 (2019-12-09) + +### Behoben +- Auftragsnotizen bei Rückerstattungen werden nun wieder korrekt geschrieben. + ## 1.1.9 (2019-11-07) ### Behoben diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 2b9af133..3d1abb89 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for Payone +## 1.1.10 (2019-12-09) + +### Fixed +- Writing Order notes during a refund works properly again. + ## 1.1.9 (2019-11-07) ### Fixed diff --git a/plugin.json b/plugin.json index 10008bc9..7da915ae 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.9", + "version": "1.1.10", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/src/Helpers/PaymentHelper.php b/src/Helpers/PaymentHelper.php index 32403bef..8a80f7ab 100644 --- a/src/Helpers/PaymentHelper.php +++ b/src/Helpers/PaymentHelper.php @@ -188,6 +188,12 @@ public function raiseSequenceNumber(Payment $payment) return $payment; } } + + $properties = $payment->properties; + $properties[] = $this->createPaymentProperty(PaymentProperty::TYPE_TRANSACTION_CODE, 1); + $payment->properties = $properties; + + return $payment; } From 9f69bf555ce25c0b2556d00a487f2a567b838dc5 Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Thu, 12 Dec 2019 14:10:10 +0100 Subject: [PATCH 066/107] Added methods for the backend visibility --- meta/documents/changelog_de.md | 4 ++++ meta/documents/changelog_en.md | 4 ++++ src/Methods/PaymentAbstract.php | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 396db6fe..80a61702 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,9 @@ # Release Notes für Payone +## X.X.X (2019-12-12) +### Geändert +- Funktionalitäten hinzugefügt für Backend-Sichtbarkeiten + ## 1.1.10 (2019-12-09) ### Behoben diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 3d1abb89..5177ec9c 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,9 @@ # Release Notes for Payone +## X.X.X (2019-12-12) +### Changed +- Added methods for the backend visibility + ## 1.1.10 (2019-12-09) ### Fixed diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index c5bef321..11f8d9ac 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -131,4 +131,24 @@ public function getAllowedCountries() return $countries; } + + /** + * Check if this payment method should be searchable in the backend + * + * @return bool + */ + public function isBackendSearchable():bool + { + return true; + } + + /** + * Check if this payment method should be active in the backend + * + * @return bool + */ + public function isBackendActive():bool + { + return false; + } } From 754f48638fb9920e1216f54bca085aba1506547f Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Wed, 18 Dec 2019 11:14:07 +0100 Subject: [PATCH 067/107] added getBackendName method --- meta/documents/changelog_de.md | 4 ++-- meta/documents/changelog_en.md | 4 ++-- src/Methods/PaymentAbstract.php | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 80a61702..18070fc2 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,8 +1,8 @@ # Release Notes für Payone -## X.X.X (2019-12-12) +## X.X.X (2019-12-18) ### Geändert -- Funktionalitäten hinzugefügt für Backend-Sichtbarkeiten +- Funktionalitäten hinzugefügt für Backend-Sichtbarkeiten und Backend-Name ## 1.1.10 (2019-12-09) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 5177ec9c..25e24a59 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,8 +1,8 @@ # Release Notes for Payone -## X.X.X (2019-12-12) +## X.X.X (2019-12-18) ### Changed -- Added methods for the backend visibility +- Added methods for the backend visibility and backend name ## 1.1.10 (2019-12-09) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 11f8d9ac..003f3d3f 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -151,4 +151,15 @@ public function isBackendActive():bool { return false; } + + /** + * Get name for the backend + * + * @param string $lang + * @return string + */ + public function getBackendName($lang): string + { + return $this->getName(); + } } From 6680f9da8a24a43797bf3aea51cf4a3b3f289185 Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Wed, 8 Jan 2020 09:14:09 +0100 Subject: [PATCH 068/107] added argument type for getBackendName --- src/Methods/PaymentAbstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 003f3d3f..f65ad039 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -158,7 +158,7 @@ public function isBackendActive():bool * @param string $lang * @return string */ - public function getBackendName($lang): string + public function getBackendName(string $lang):string { return $this->getName(); } From b7823bb66f08cb70e119867a0f84b0297c0adeae Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Wed, 22 Jan 2020 11:16:37 +0100 Subject: [PATCH 069/107] added canHandleSubscription method --- src/Methods/PaymentAbstract.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index f65ad039..47211e11 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -162,4 +162,14 @@ public function getBackendName(string $lang):string { return $this->getName(); } + + /** + * Check if this payment method can handle subscriptions + * + * @return bool + */ + public function canHandleSubscriptions():bool + { + return false; + } } From 397d8ac543d4f033ba1ab53ceaac4c00a38a8776 Mon Sep 17 00:00:00 2001 From: Jens Konopka Date: Tue, 3 Mar 2020 11:35:09 +0100 Subject: [PATCH 070/107] Rebranding --- .php_cs.dist | 22 ------- CHANGELOG.md | 55 ------------------ README.md | 6 +- build.xml | 19 ------ meta/documents/changelog_de.md | 7 ++- meta/documents/changelog_en.md | 7 ++- meta/documents/icon_plugin_md.png | Bin 20799 -> 0 bytes meta/documents/user_guide_de.md | 48 +++++++-------- meta/documents/user_guide_en.md | 40 ++++++------- meta/images/icon_plugin_md.png | Bin 17209 -> 28245 bytes meta/images/icon_plugin_sm.png | Bin 9157 -> 14249 bytes meta/images/icon_plugin_xs.png | Bin 1054 -> 2384 bytes meta/images/preview_0.png | Bin 27382 -> 19272 bytes phpunit.ini.dist | 5 -- phpunit.xml | 37 ------------ plugin.json | 4 +- .../logos/PAYONE_PAYONE_CASH_ON_DELIVERY.png | Bin 2316 -> 4582 bytes .../logos/PAYONE_PAYONE_CREDIT_CARD.png | Bin 2316 -> 4582 bytes .../logos/PAYONE_PAYONE_DIRECT_DEBIT.png | Bin 2316 -> 4582 bytes .../images/logos/PAYONE_PAYONE_INVOICE.png | Bin 2316 -> 4582 bytes .../logos/PAYONE_PAYONE_INVOICE_SECURE.png | Bin 2316 -> 4582 bytes .../images/logos/PAYONE_PAYONE_PAYDIREKT.png | Bin 2316 -> 4582 bytes .../images/logos/PAYONE_PAYONE_PAY_PAL.png | Bin 2316 -> 4582 bytes .../logos/PAYONE_PAYONE_PRE_PAYMENT.png | Bin 2316 -> 4582 bytes .../images/logos/PAYONE_PAYONE_SOFORT.png | Bin 2316 -> 4582 bytes 25 files changed, 61 insertions(+), 189 deletions(-) delete mode 100644 .php_cs.dist delete mode 100644 CHANGELOG.md delete mode 100644 build.xml delete mode 100644 meta/documents/icon_plugin_md.png delete mode 100644 phpunit.ini.dist delete mode 100644 phpunit.xml diff --git a/.php_cs.dist b/.php_cs.dist deleted file mode 100644 index a4750896..00000000 --- a/.php_cs.dist +++ /dev/null @@ -1,22 +0,0 @@ -in(__DIR__); -return PhpCsFixer\Config::create() - ->setUsingCache(false) - ->setRules([ - '@PSR2' => true, - '@Symfony' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'ordered_class_elements' => true, - 'ordered_imports' => true, - 'phpdoc_order' => true, - 'phpdoc_summary' => false, - 'phpdoc_to_comment' => false, - 'phpdoc_align' => false, - 'phpdoc_var_without_name' => false, - 'blank_line_after_opening_tag' => true, - 'concat_space' => ['spacing' => 'one'], - 'array_syntax' => ['syntax' => 'short'] - ]) - ->setFinder($finder) -; \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 3ec9a1fe..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,55 +0,0 @@ -# Changelog Plentymarkets BS Payone Plugin - -## v1.0.9 (2018-04-10) -* Changed user_guide alert Text - -## v1.0.8 (2018-25-09) -* Changed Support Tab information -* Updated Changelog - -## v1.0.7 (2018-20-09) - -* Updated config.json / new Pluginformat -* Added Translations -* Changed Userguide -* Changed guzzle/httpguzzle Version in dependency for PayPal compatibility - -## v1.0.6 (2018-05-15) - -* enable Sofort display in frontend -* enable Paydirekt display in frontend -* enable invoice secure display in frontend -* enable PayPal display in frontend -* improve rendering of payment error popup - -## v1.0.5 (2018-04-06) - -* update Logos an plugin name - -## v1.0.4 (2018-03-27) - -* update documentation - -## v1.0.3 (2018-03-26) - -* add english documentation -* use current payone php api - -## v1.0.2 (2018-03-21) - -* use Scriptloader to include payone scripts in template - -## v1.0.1 (2018-03-01) - -* update plugin documentation - -## v1.0.1 (2018-03-01) - -Plugin release supporting following payment methods: - -* invoice -* pre payment -* cash on delivery -* debit payment -* credit card -* credit card 3DS \ No newline at end of file diff --git a/README.md b/README.md index 0311d481..3b4bca97 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# BS Payone plugin for plentymarkets 7 +# PAYONE plugin for plentymarkets 7 ## Plugin description and requirements @@ -9,7 +9,7 @@ See the [plugin description](./meta/documents/user_guide_de.md) for the plentyma The plugin has been developed for the Ceres template. The plugins IO and Ceres are required and have to be active. -Also, please configure your payment portal in your BS PAYONE PMI for sha2-384 hashes. The TransactionStatus URL follows this template: +Also, please configure your payment portal in your PAYONE PMI for sha2-384 hashes. The TransactionStatus URL follows this template: https://www.example.com/payone/status/ @@ -85,4 +85,4 @@ See the [changelog](./CHANGELOG.md). ## Need help? -Please contact our technical support team at +49 259 68-500 or tech.support[at]bspayone.com \ No newline at end of file +Please contact our technical support team at +49 259 68-500 or tech.support[at]bspayone.com diff --git a/build.xml b/build.xml deleted file mode 100644 index a5eb6ec4..00000000 --- a/build.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 396db6fe..c6f7abfa 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,4 +1,9 @@ -# Release Notes für Payone +# Release Notes für PAYONE + +## 1.1.11 (2020-03-03) + +### Geändert +- Logos und Bilder getauscht ## 1.1.10 (2019-12-09) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 3d1abb89..1b9f0a65 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,4 +1,9 @@ -# Release Notes for Payone +# Release Notes for PAYONE + +## 1.1.11 (2020-03-03) + +### Changed +- New logos and images ## 1.1.10 (2019-12-09) diff --git a/meta/documents/icon_plugin_md.png b/meta/documents/icon_plugin_md.png deleted file mode 100644 index 1b7f03f65cbd64bb8f2b346418be553bd6821315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20799 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 FV1hWqo?QR{ diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 9d66db76..51da26a8 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -1,10 +1,10 @@ -# BS PAYONE Payment für plentymarkets 7 +# PAYONE Payment für plentymarkets 7 -Das plentymarkets BS PAYONE Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. +Das plentymarkets PAYONE Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: @@ -34,7 +34,7 @@ Telefon: 07344-9592588
E-Mail: plenty@psg-projektmanagement.de
Internet: http://www.psg-projektmanagement.de -Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. +Nach Erhalt der Zugangsdaten loggen Sie sich im PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. ##### Einstellungen im PAYONE Merchant Interface vornehmen: @@ -44,18 +44,18 @@ Nach Erhalt der Zugangsdaten loggen Sie sich im BS PAYONE Merchant Interface ein 4. Wählen Sie als **Verfahren Hashwert-Prüfung** die Option **md5 oder sha2-384 (für Migration)**. 5. **Speichern** Sie die Einstellungen. -Aktivieren Sie die gewünschten BS PAYONE-Zahlungsarten in Ihrem plentymarkets Backend einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . +Aktivieren Sie die gewünschten PAYONE-Zahlungsarten in Ihrem plentymarkets Backend einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite Zahlungsarten verwalten . Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. ## Einrichtung des Plugins -Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. +Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. ##### Grundeinstellungen vornehmen: 1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. -2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **BS BS PAYONE**. +2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **PAYONE**. → Die Detailansicht des Plugins öffnet sich. 3. Öffnen Sie den Menüpunkt **Konfiguration**. 4. Klicken Sie auf **Grundeinstellungen**. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 1 vor. @@ -77,7 +77,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets BS PAYONE Plugins erfo Merchant ID
- Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. + Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei PAYONE erhalten haben.
- Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. + Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei PAYONE erhalten haben.
- Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei BS PAYONE erhalten haben. + Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei PAYONE erhalten haben.
- Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei BS PAYONE erhalten haben. + Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei PAYONE erhalten haben.
- Verknüpfen Sie diesen Content mit dem Container Order confirmation: Additional payment information, um die BS PAYONE-Zahlungsarten auf der Bestellbestätigungsseite im Webshop anzuzeigen. + Verknüpfen Sie diesen Content mit dem Container Order confirmation: Additional payment information, um die PAYONE-Zahlungsarten auf der Bestellbestätigungsseite im Webshop anzuzeigen.
- Verknüpfen Sie diesen Content mit dem Container Script loader: After script loaded, um die BS PAYONE-Zahlungsarten während der Kaufabwicklung im Webshop anzuzeigen. + Verknüpfen Sie diesen Content mit dem Container Script loader: After script loaded, um die PAYONE-Zahlungsarten während der Kaufabwicklung im Webshop anzuzeigen.
-## Automatische Versandbestätigung an BS PAYONE senden +## Automatische Versandbestätigung an PAYONE senden -Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an BS PAYONE zu senden, sobald Sie den Auftrag versendet haben. +Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an PAYONE zu senden, sobald Sie den Auftrag versendet haben. **Hinweis:** Die Einrichtung dieser Ereignisaktion ist zwingend notwendig, wenn als **Art der Autorisierung** die Option **Vorautorisierung** gewählt wurde (siehe Tabelle 1). Haben Sie die Option **Autorisierung** gewählt, ist diese Ereignisaktion nicht nutzbar und nicht notwendig. @@ -332,7 +332,7 @@ Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an @@ -360,15 +360,15 @@ Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an - +
- Tab. 5: Ereignisaktion zum Senden einer automatischen Versandbestätigung an BS PAYONE + Tab. 5: Ereignisaktion zum Senden einer automatischen Versandbestätigung an PAYONE
AktionPlugin > BS PAYONE | Versandbestätigung sendenPlugin > PAYONE | Versandbestätigung senden
-## BS PAYONE-Zahlung automatisch zurückzahlen +## PAYONE-Zahlung automatisch zurückzahlen -Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS PAYONE zu automatisieren. +Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über PAYONE zu automatisieren. ##### Ereignisaktion einrichten: @@ -383,10 +383,10 @@ Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS - + @@ -411,7 +411,7 @@ Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über BS - + diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 59b2e5ad..060461ed 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -1,10 +1,10 @@ # PAYONE Payment for plentymarkets 7 -The plentymarkets BS PAYONE plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. +The plentymarkets PAYONE plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. The plugin currently offers the following payment methods: @@ -34,9 +34,9 @@ Phone: 07344-9592588
E-mail: plenty@psg-projektmanagement.de
Website: http://www.psg-projektmanagement.de -Upon receipt of your access data, log in to the BS PAYONE merchant interface and carry out the following settings. +Upon receipt of your access data, log in to the PAYONE merchant interface and carry out the following settings. -##### Carrying out settings in the BS PAYONE merchant interface +##### Carrying out settings in the PAYONE merchant interface 1. Go to **Configuration » Payment portals**. 2. Open the **Extended Tab** of the payment portal belonging to your online store. @@ -50,12 +50,12 @@ In addition, make sure that the payment method is included among the Permitted p ## Setting up the plugin -The following steps for setting up the plentymarkets BS PAYONE plugin are carried out in the plugin overview of your plentymarkets system. Proceed as described below to set up the plugin. +The following steps for setting up the plentymarkets PAYONE plugin are carried out in the plugin overview of your plentymarkets system. Proceed as described below to set up the plugin. ##### Carrying out the basic settings 1. Go to **Plugin » Plugin overview**. -2. In the plugin list, click on the name of the plugin **BS BS PAYONE**.
→ The detail view of the plugin opens. +2. In the plugin list, click on the name of the plugin **PAYONE**.
→ The detail view of the plugin opens. 3. Open the menu entry **Configuration**. 4. Click on **Basic settings**. Carry out the settings according to the information provided in table 1. 5. **Save** the settings. @@ -76,7 +76,7 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie Merchant ID @@ -84,7 +84,7 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie Portal ID @@ -92,7 +92,7 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie Account ID @@ -100,7 +100,7 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie Key @@ -124,7 +124,7 @@ The following steps for setting up the plentymarkets BS PAYONE plugin are carrie ### Setting up payment methods -In the following, you select the BS PAYONE payment methods that should be available for your customers in the online store. In addition, you carry out more detailed settings for the selected payment methods. Proceed as described below. +In the following, you select the PAYONE payment methods that should be available for your customers in the online store. In addition, you carry out more detailed settings for the selected payment methods. Proceed as described below. ##### Setting up payment methods: @@ -271,7 +271,7 @@ In the next step, an adjustment to your Ceres checkout settings is necessary. Th ## Linking template containers -You have multiple options to integrate the payment method BS PAYONE into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. +You have multiple options to integrate the payment method PAYONE into your online store. For this purpose, the plentymarkets system offers containers at relevant places which can be filled with content to meet your needs. ##### Linking template containers: @@ -296,7 +296,7 @@ You have multiple options to integrate the payment method BS PAYONE into your on Payone Order Confirmation Page Payment Data @@ -304,15 +304,15 @@ You have multiple options to integrate the payment method BS PAYONE into your on Payone Checkout JS
- Tab. 6: Ereignisaktion zur automatischen Rückzahlung der BS PAYONE-Zahlung + Tab. 6: Ereignisaktion zur automatischen Rückzahlung der PAYONE-Zahlung
Einstellung
AktionPlugin > BS PAYONE | Rückerstattung sendenPlugin > PAYONE | Rückerstattung senden
- Enter the customer number as received after the registration process with BS PAYONE. + Enter the customer number as received after the registration process with PAYONE.
- Enter the payment portal ID as received after the registration process with BS PAYONE. + Enter the payment portal ID as received after the registration process with PAYONE.
- Enter the account ID as received after the registration process with BS PAYONE. + Enter the account ID as received after the registration process with PAYONE.
- Enter the key as received after the registration process with BS PAYONE. + Enter the key as received after the registration process with PAYONE.
- Link this content to the container Order confirmation: Additional payment information to display the BS PAYONE payment methods on the order confirmation page in the online store. + Link this content to the container Order confirmation: Additional payment information to display the PAYONE payment methods on the order confirmation page in the online store.
- Link this content to the container Script loader: After script loaded to display the BS PAYONE payment methods during the checkout process in the online store. + Link this content to the container Script loader: After script loaded to display the PAYONE payment methods during the checkout process in the online store.
-## Sending an automatic shipping confirmation to BS PAYONE +## Sending an automatic shipping confirmation to PAYONE -Set up an event procedure to send an automatic shipping confirmation to BS PAYONE as soon as you have shipped the order. +Set up an event procedure to send an automatic shipping confirmation to PAYONE as soon as you have shipped the order. **Note:** Sending up the following event procedure is mandatory if you have selected the option **Preauthorisation** as **Authorisation method** (see table 1). This event procedure is not necessary and cannot be used if you have selected the option **Authorisation**. @@ -329,7 +329,7 @@ Set up an event procedure to send an automatic shipping confirmation to BS PAYON @@ -363,9 +363,9 @@ Set up an event procedure to send an automatic shipping confirmation to BS PAYON
- Tab. 5: Event procedure for sending an automatic shipping confirmation to BS PAYONE + Tab. 5: Event procedure for sending an automatic shipping confirmation to PAYONE
-## Automatically refunding BS PAYONE payments +## Automatically refunding PAYONE payments -Set up an event procedure to automatically refund a BS PAYONE payment. +Set up an event procedure to automatically refund a PAYONE payment. ##### Setting up an event procedure: @@ -380,7 +380,7 @@ Set up an event procedure to automatically refund a BS PAYONE payment. diff --git a/meta/images/icon_plugin_md.png b/meta/images/icon_plugin_md.png index b403b32d6c9a43c6b237bdb8683c83f08639f5a7..e3d9ea86054d738fe522b57edfbabbafb24c3f90 100644 GIT binary patch literal 28245 zcmY(p1z21`&o;ccyXyi)io3hJQ>3N17I$ZHDeexXIK|yrT#CDUaV@U<)91DSTRD?6 zCzDJvv&nt!BvMU977dvg82|vF$;(M;007YMBp?70{{8BwGmY}zK)GnhN&u=RNRQrc zC`{!vlmP&5+IOZ90O08#^C1A>#s&Z!8vy_U=>PzMV|JUm(EEcBb6t50Wn}=vJBiv$b~-@D!%{4~M`z{jZyqisC;kt~SC{y2@%4 zk`B)16x=LaENoOF$P^S5Le6Fu0vb{>|2_QuPMFHd)zwjemDR(;gT;fB#lhKFZZT_zLpL`K^q5p9HKYjnL zM~L;G^8ept{>#$;^uC)af-J=PzityjR_dkG0|3MT@>1ejo=|6g2-#$xIw21B%bCjg z1t#LqBeb~E(l^5O>Zd;uS!;h%(NII-Zd@;q!~gE90-s}lM_iCSjex@of>_citgeT! z{E&mDZ(sKQ{nEX;nc;G8-^%IY;jn5p;eWT$%4s?AGT|`6-~A>SoBXq3Gc$hStg1pk zV}#pdJQbg4v_U~X7AKM!Z&4U~F*o!gc))4@;8+>~3!Vy9iZFr=)7U6)Fd%rNz2IRf z5MuWLk|J$Y)jvwmJw1`=`^3&`}&HPgzgCzE{*jofu0^qSV;) zCZZ2XFk4sQcNodLp|<|p)`SY{FtavQ#3!+KK3IqsXK)nI+fMP)X}J>!p}!rEN-o5} z5Nn$(c0vd6vCs8@wEo9k|Iu<}3LXi{-2u|Tu%H#w^47h4w>$$~VhDUV8EW5gJJt5DWO`jv(P~ zs;DFrZbfw%zx@>$A7#KnO=7RwYY4cz+rp03U4^ec-%!=4MT>ucNZLJ?8H1BuUX-BZllKHW%m|KrkPoU1_&FHFlU&vNG8nvU#s$OC+MQ8#m9YUV?pB$ zOy?RG)idyG8unSSheM0|Js8upQFzfy4ERHixwtvK&f>CPofNo!!%~P7gfYuj_F9W` z^UC`c`M@-m5WS8`CjGv3)xM&NA%3JQP#p<1R#Bsov5|1wbiKLx3=Wv!ooMZK{*~NXIKlREKCi zHAJlx{ow&2ok_wY;iPX)P31hMibi@aZ%yJXC-Mo{2~mgxk-2P05(VqG1*N)djOi=x zw9&F{WI!};If)^fyXNH{68g1Dp|URKcYf!L7kRH{{-oEFhS3du1O-Rm7n-u3vkvGe zS_~;{@C~(x*&Y9?)uMxPge`kEKzOIG04b<+eFB2wj|-CQ==D%01SiTRVRtphDlZpc zzem^T$A*iNA(Bc9?&jy6<_GU;+y3-LQ041)U&lL9y zTdVkG{gI&fp+n#x1Ow2ev$hW!ZW4x>=?bC8D8T-=HWIs6Wyk6Yu-}XzZ1^?Z#@vq}IV|V)!r6NTzrR2Z>=RiFPBZkV_lV+02$Qyd#E7-h>*tCJ=l%DL6Gze#M4)* zn+jEn2u6$49@eY4v!>vg!+QBbXt}=LbBC2UGdTc$TJCXq%uW}lD>!BEpzhnqhfp7) zN~BOHoUhC6>}p`v^ObO7Gpj?q!)HAsXq5!-!Uf=pByB*0V6;(guaMH{*7?N;jxABz zCzxog``av|kfa9cnLJsg?Rs-Zf}$IN7X&=HSNWxTsNY7Al=QVE>;c z<%i|e6gMr?OJu<>Kl(aI|MS~rhznF!!>S7TUQ=*jVy!2(Gg*RVoTnUPEO2m&Y^+o6%k)3J?9)AE|eTUC+>D^K1p6)%z}{Uq1J3Ij!M<5c|*2wm!rXL^{Jwv`Cu-N zawWQ4ig2l!T`X)F@gQ*(RPxJ*hHw8D&GHho3^?r1^A-|ur`cE1=j%0;aIwNOo$ag! zASt8;yPZ%4MveWZ&w41s(N16bO|FM0Aw<9=YR-Ih?{tA~ZuatOm$MFeLP$OGUz&6` z0%Jp}Hh8SA&^2q~e=}XM>vREs@bcL=)0zYoZVj z(6{#ZD_sY)Kr!inED$Jg+*$JN2S{S9_0z@J`QvPfoTs_|_2j#}k@xZVy0=zRP5%_Z z#^%FjbO1^7K~M2M6((1m2%p77;!zHQk`|7ELs3M{?-fmWm}-v?_H8aF{L&nJY5Fzt zKPkFsAfTv`#NHv%b{1Gvb!5c`#kKf|bfzb@HvmRlV_d~&y(5Kkg5gKTrwg_PEg64o z6pRXc$wsMDyAOWAK=0MMWN7`-IN47qllxla_gmct3w|^Ps+2&-o4f~YLgw^}9XKrr zH6w*iyGuIkSQOah=E&BjTdiv+QT5sNKj})I9sE&%a}xgQ)tM-vU3?9LeLDzl_B!c7 zQj_;Uj^FV&eZT>N(sf)sVDE9W<`&=xD6!IK$?<=QLOIGK?&bXRVhYq45#5`Rd>fb1 z`S1>FNc@&QJee5JyL%k^F!>LVtrDz15+pDAYX+``V=p{m)?Rqkhhij5XifH{Aq2z z7>cqNf-hR98~-KDZ-_8F2Sb0>>Eyny11W_=++MheB|btqO=it+IN(!NktGm-&^mVz zll=fN+Pe$$K14qqCL~)7jcIe=1h(+ml(DwMI{?23L~XTRtFDX1w5ExA0>8#*M4Frr zL7&Lt{lf{R>Zk!%CHrwS`})CSra}@c=SYz~p6-|2#}_19yAGR&Gvu5m0AHITRA9U!r=6l9TZ8RfNS<-YFXC?Ul^us znv?(>hUX>Xe_J>dj0LaovVm(p&qI?+Yl7!%u7b0JwFwx?0Y9E&uLZOt<=c#rgg|*! z3}T=QP*N#)T>oq7*`e=0*v1_THMpl~a&agE%{V|u!HsG32?|y$mhI=G(*u$(9y&%YZd3s)t^!S@QW4zX6$S-o9uwKizI{BL5I$7G3q?y#uE{cfqLk* z-owGwmfY^oJpXu+ch31sDdh`DCmm{f78jKk)E+RT zX#UNDxKAw0c)vc9d1@g+WJr8Bqu2*|gnY&ye|9tF!!Ql$9y>r&YfhwX>1a~idrFuM zMySHl+nWkr3=7LoiZGp-@Dd-9?hOm)6o)M|21gw_(jQFAN04bymCl?KvlY!&<6s;h zcvi{uU7*Z zN$aIg6qcep#9jIZbvGW5Lp?q}xNdr~HiY^ZFYZh@Czt#1827T1;(PA#%?V#@>&jZU zYa?&}+}m)vHwkb>p7Ddxf4I>d+9=yHqe>`lMe4^jq_c_jRWp4{TYVIrM@!)gcRPT8 z;7dy9gq^00T`jpc3R9Z4$yDl75Rh;tpR*c?`E_f$J9>^ad0VF4z+pC=S{aqmXbxvI z;Ird9b@t!YEWI_@HLP#xpPiagVDqAl;3srI$t^MTaHMKV5wMm3FW6Ez~S{$+uwr#_b zc;hCLOEX81%XYm7{fy&h&r$)4OA`+YCHY8ZSIIN{_w{ANwmAl1cI;lsl$wZu&IHFARW&$p| z!f}_4!L6g=?fTL9c{yU?G+Q<$+ya8S$rqBclUZPL+wUi)QJ2)aM<~gibh?Cat0dYq@acqu2*3 zOTVh1dpf^nuoc9Vql*)hc(9xvRl^Hi^tU5GX$aX5T>%4H(bmlRJjc@X{!SD8x$X%K z@a(+lYL(l7sL&ku_1P;DTT?_;24A8_01mo93gFO(&SbhO*QyrC^b<^5if2C3}_ zfnBy!n~05IFE^IZx&-If`X^vHuT8w_?g9LlMzR9!30+v%5_=%?m}{G$s+!eTvKy&T zk%!#j77te-wC5zWzJApGP$ow}vpa#WTvtr%GhOIl^w0|d7bgWjkY9vHh)s3oLv;@) z!9+z5(VDV@j}AF}(j%kP*b54biVnk8f$M7ylxL{@fD!WF!|+1QO+cj4q5CP|L1MO+ z!F{yDbzjszQE3+MaOr4fDMIs^q-l13)n>ymoo04AP^$5afWEt3sN zLiuuJXN^pQSddy#nP$g7J<*O&!LY}`lv;vx?=bnpkQhFw%IO(lC)R2EL$Hz43<-^h zBhSphdDZYwiFwLKG_v)Rc<|4!$B00s$$rrw)%aTEC>{-+;xJYjfAu(uS;J3eSVWEw#TSURSpSeeOMYgaqQp6$K=N96>j+> z_%B+vyrWng#_$a47flII*iUm}J>X~%C9`G=I$PfC% zxi)4Ghs~Ebo}gibkW7&d!*k-ugmDQ)!i5>`uCwRIP0O!F?l~JQ5!au&I4t~EU;<4O zcdMZX`s`#U4Ka_Op^1q0Kkq3LS`xu*xy9oY*57+@Tm;}0UC2}Da1y1!k68S@GGB(H zDTc|25~L$D{Ci36{rL@Fw2MCD3AmU2VYPOPII;+uRd5SyG(!^lY~{(d0=GM@_;C`} ziE4X~A!xa5cP1-3^&~LTbRsDIbor4jVkL5PWW^ntoVW6Ks`$}iE9S*t#hH8DtyvGG zhf|4sqRO3_I*`&+o<2gax6?qR20H#tUHyI9Ox@a20i6(A5gP~HIPB#36r2so~8X7qy>g^27Wj+K(W-h zAo;=Grk+91%ZaQj?s)17(9*ZrCnHQ-UlpwJ+4G{wz_?q^5w>9`V3o~9Mn*HUSCoVa zdNMc^SPa%>qIAK)U2Z)4jhW6`UV*taKHr%NHQf2Ifw4OPf{(gn8~iK`zwU}3BvI}3 z;>F;uPo`^{6w8{C$UwK{2>Fm6ol|G`tW#@*eu8qLccHx&mW$D7Y@%PlbJhui-LJt1 zny!GFrmKnm;V;a$+`bpko>%P;)6@z65>;wM15vyXRKqSqsO=i>+4&M6b`-=+VY1Zm z%_<{%^=b7x2UIGit2;=2{}hyPx~xu^78_0Fr9yW3s>$R@r{fMa+y_z-IPs#HdD|eB zAqKB6U0RZNK%PZVIR|O*l0MRp>j6`$1TnCAAFZRq>s>AD#rc@OqgV(= z>uS)P^{f*HPv{hFTBl*K94|U)({tvTH(8e}F07xk3!OS{`@3||5Fh`bBnb#`uBiC@ zAhtY|{S{-_)-3ZJX7+)J%__7(k$QBBikC9yW=gR(YVX1lHZSFc*Hsk97OSC7H){Oc zqbt#VL{@nloD&g#0uT-Ien!w`_TH8bp`~A2_;Rwrl`$p%T(PpT8D!9+4z8$A{6D$*_ACqfUtBsRrR1%GfJ?9r7Z!yyTWoFi>9#ft= zgn>*DMbGoH+=-wbv}i5ezSy$)m9w*0NtjTGB|hiNk7Lyh1lm0&ys3G!d`HRKeMwkL zc$gtdiG21F?o%v(sqt%;#MINyOFTa1Mv7!6M)o|PEzSNNvq?=(X_YS}mL+eFweZDZ zniPEF@j)P3Uf0DGzcF@>aGKd+{wpRnhR_I6n_AT=6fo&lOUZSJ%;aH@s|Zhq+Xs>_ zf!yEwH#x#*tt&|HF-6Yv0Nd_9gwpGfoiW%&v4EcFvZE zuSdP&F}%@`8!PN!&io^KxqV^(wp6MKGy`*Npov|@4^Nn+2+=`Y?gVwK+I zQEmvmzyS&JL9HAJ(l1%HeOhGg`_!vA)XC_LA7t(Kp@Bb}{tcDBs1*K`hUHx5)x^3n!SA)cP+k*zhv={}qh}Zpv(de`dMl%XabuFjw|XnmexE5qI<0fc z2!Yl;j1Fo@`8)=~PU%`QMy0GV@(Gc;i5~)+UW$-~tx%UMEQS{efK{n5C(yMNS{A3A) zfj%~e(wX3puO`Z~H|oC|rzZ}I5}nRdV=Gyi7;(gOXO}IkM4|(N33R9*9JfMP3mA2N z7lD{XgU5VPnDS*kkl>6LH3dWb-4oKY)!hI^B3V`PIo(}{_k0B<1TNRM=78@g-|2fEw5RF5%{_^Rl<6Olrn_WHYP9Y;KaV#V9_E@% zR0rfl7rjM75a!!1)! ze?(PJQX&wESFRgNY!IQo=zFq>Hru3%alwFBFL98b5-NGki*e0N9W6XF-Zkxqa7FUI zK(AmwD1if`=|^m8mmafAvrtxFfQ1G3H0I{e*lwJZ)>@4vTVpMG{U_C|q5{ET^HPZ4 zD@Cu~IyPx+8LHNfZo_AukQC;^poTF z=!8Hg!cm44nUV#%0SUI2H?rOaH02!S+?9LH+j)qpV)h}%{Wl1|e&KQDVNi!myKgWX zKKT`}_!eo5&kQPF4--XXV;(RXr6a zEUC8iVt&k2#w=rdV%F=t@fdX1N4nVTP-*nybItxl@g~OHhwG<^ABEQ->_eW|zlG6I zT+DmdY3WVCe09-sU?$JyKe^{)q=9@}l3|dw&%zOFVW0IV^u|YOdUWrb`LJ~vWk!VF z3lj9f+|i?T5%cCc^n2_Xv5~hr*KmCELwg}$2@=J0DGniO7e6~kTO83(xz5{lgtdVm zV;A%g!{yrND(0!4u5(}m#4OGFP6ScEJ>~=mdz>!4<$A{6&rw2Q-#C%as;wy&?y;d> zJnzHNDacL^JiR%fIre9cP}Hi3W{@$0J;7meBdQip{^Da(DyF}UHAFA8;3h>ZX=_$| z(tP^A-Tq|l^IwMXHO+^f#nVqO$8Vn>7lw+u(({zImnY!IF$NdyD8eVJNf6mVZhis- z?k^B-x+1e?Vef4$xJ!{JSp=Gx!U-NxDD+^`La7*?P|H=-ov;Q!N_v@d^mxQ!)}UW*8wT+TGawMmT}_m0lh1Goh(d|54hNs5$|RU74&( z2qoXgF8PVib&{b03MHRdq0Lijl?kBK^vcoi4MPcfeYb}9aVVx;pxm~NsLnanJh0x< zKKA`sJ|sMcrXt@{GZ%!CZuFiN{L5bYs~gGfw)2}IjgG-z=d4AG7t)c$JD8an+@7N&#&fI@nnY;G44B@a&T?x+QJ^Z&a7Yrld#+qZH3N` zXXuW5)AFtPaRd7s}{ zPbFRS=v)kJ;jM_DOz}k&=4O*#dggv)nN1|6Pu#f3qlpGU?6X0b5V?_TvIM5n!yQss z{0GOeKLdncCQ~ffZn-8uno4QGamap8?7)zD1$QhiMc3ZDM6VYZZ;-HzwEXswLqcC} z<>H{@puSzzbxHkZhS}($zj-$xu|GME8jQr{(!V3N=!3zEQ@t!8zKLJ5JcdJP*qz$e zrfRJ%Pa=%%3c{}PJHF?CsXo8lqj$- z#o8HwLp?H$Y)QX-QHL(D&-M9SQm8YB8Czkg)RbuxS$lS1A0(_um}38CX70p$ZDS2( z`DQ3M*yMC4Q)i|5#fL2iBI&k2SXe382P{4*Y^}0ZEw$r3lyug6Z3Na?E|xg{_2s`o zi=VIn1L6aJB#$Bn>pq#F}RUZrH8U4&6ln`m2uB0d-8zV!At-)T^UT;`S8J8q2 z9TK0vM74sPqyF$q?o2+`>Y{H*Y{t5DPKl+Uk6sUF+TtZ(O+lkwJQkr|e1=lq7YaGB z2*Ii@`j~CeR4Gfonn4m?AMjBB?86EZ4{mcEOvZlBFIUh*c=aSxD)w9o_Yk#o0M`U;lE}JO;ef#D=b&mQ(lJWN?Xq9$1q!oJw0n0wO52CpDo!KE# z=?(`xd!3^0%snDP6zC`|c^2)PeskUa^dPp-iRixK8dMCz>WGwt^5dQP*;apcQfUwGA2#enBJ3YL5az#r^m4@57 zH}z60%!HVz2DFWY`b%UowvOlQWZ-6x*yfkZL&)@*vSJaOS|cy%f~${~N9f=PXYp#a zqr_BSo>FwdRf7>UZRz0Oi{{lnWZj=tg70x5ZoT-n@|dyv+%>kcV1~iUTA+%h1zz0=e4PzYmXvFIZq5Rh0F>~4AJ5%3&WKFH#BnD?#t2NJt{nMkGk(GL#+B4({t z$zyWzLBUo`A92DVhVyQ*JmU4iw6V54JD{76ZS;tIxMp8cstds@Vca8ouleHE^Y7yZ zY3tUHOKd}>=1%L?M(68=7Qli~A{;i_`yygXQZzKzJ)86|-D#he%Bpy_nON;B#H7M* zvUh(Mz){kargR!fm~e(96V?@VHWEkT%(v>Bm5K8?jKmphc=F<--SAZ~17}*i&D!Z0 zGb>8m=^dM*H5e7(_e1%wGmWbcB=(1r#m=JEaRyqkek~GE9tGj4BSlo=GMHZ7+ph~Y z&J<(PhDlT^yZNW^(l0jnXok|IDHRP!R?TVGIsMRx7m0{phx)9`b%dp|C>PBF}`c z)!24k>%5#=afTM6;Tc}Sj#z;7J?p{!UI{KM z%0V9G(uNdToNEoGv*o5nl?_Ra^q}5TRQY?7*iOzO7ZH5d=EOPY4}1}IqVH<^?2Y+2 z1;Dg=43NYSJkg*+n%lARWJ#6w#nV=yg25q>r%qv@yJRa>;6`~;JZS;@`8^_A zb#G^xz<@K2BrPAf{6HUY#h54(Z4?FrIz5uCdESs1eZ*8(s8m+Z#JB-=;uf}O4OU-D zS5+C30!$LH&Fw3D;?x|UefK;Q4??A9Fc%LH33?n;AkX7F9Di=1--A5{o%t=s4R1#Vc z%_m4EM`JlVlsJ=lEox}i*OD(*F6bewGJk=`&uC*f)mlN-U+g~Ao6w_ha@SqVp;qX< zAoJ1LXTsx%S$tPOJ zer1A`>Df$ofaeC3CIFvD^toVBdS$g$t^W_Au#1s8%FdkUD8C*5f%l0Gm}&yeFx_$J zH8wl4QbmvSfI<0-JU>s1C(-WAuf}gSU($VozL4qkY35tzK>CA(pt-q`ywVTS;U-cr z4&i0==laYH8=`yV?o84p(HDlH4QUw=PR)k8*NTwIm!?GNnm!MuwKYGByw?y3ghMqi z+ceUi9TqV$zy;^G{5)_oV#&k66U_KcQQR+KMEEQJ&A_YIFDKW`=TBW_;$ywWGtd1z z$6B-W2Z10W6BJhAG4|%9>Y(aAq;KEey>Ysp@=Oa8hU$j-vb*d+Vuwd~Zo*}r63p$b z5z2b0!)fXY_Q*9@b6rNtQt|49_7=amTK=M&=4 zm2^c=ct)hZm-{ciHfDD}*wc{f->?YSA|7<%G2m5O=b<2KoiEql=;6l(VdM_NonW@u z?a~bJ!%{IhA~x-Z@mGf`-)Wi0mkO|GRW$LyTMm0~g++$}(HqIwJ~nPW$m%kke|<3L z8voVjgX#?U^VOmnn%5>9qEI=Tdr|0)~0!b zvi+1{AjR014aO5GRB*JxFTp)Y=Mwv6CklqK8pmFjp0*p2^TlWPrQg#=@8D2D$8&v+ zUg>vndYIbPlCplu3@ZV`$ENXHi9FBPbIz>}%_@kF%QU)2XeOCQF8b$Y2`Za#nV-7h zVve63C&H=+4unfO%I34p{11sXTFv3^@daMI2w(n}soNHWjOq90K*PE!7qvl5N zq$$IaLUm@Jv|s`bstkPjCEOi!JbN>s32FM~=F;OLc|Qu_B~^6ZTat>x?AxPj4*!gF z^yKwH^EJ#Z{#>)d^<@tbi#{407y*@zWsuV=Yd zPQxv`E`JHX5xWGpI)Bd{dpwA))|fH;X0R=pGr83|rM)G^=K_#~DWlK&@Zl1{NUs+9 zEW~84!TYAx!-yiJzuv>Op|Eqf>|#AM`-+kPd02dEYRE(oFEyLUm^hyO^jFS(>%k$_ ziQ^Ej;r^zaKTLaf0Ru>(Tf6bwS&H60u@XclG$?Ea9+v#Z67LxFb)nJgGNi3NLcvZy zS*&J`@)Aw0b1{4rQ%*j&3!VL-&v`!eWbafOBSz8RgfJ+XS`#Sk-e%b|CN}StUh`4L zMQkG0@P}hrDm2eSdGac%{n}|}yun=<66xtPg8M6HKB&mwfw%ypa=gex1g7uGlU0Eh zHVKM8we?jN;SG84SjK#c)QY!Ueb_Tm+%-EZK9l%!z+g=l!*myVL=MiMmGJ%FqX(yd zSFUo>Igfv$Xvd-+9S+~7Q%k-d_RyJ6qQ{zhk|5yHwh}K)fz8?Ad~si28@`PxRfPm( zS#FyPB74{m`coR)Hc>vcpce>{_Tl}kJ=S`!F5bC9Uj{_M+U3|^M17AZ7p}fKEf^5x zxIo9bgPV7|;IIt~8la~*jbiY#SCB$zuJFleO1`+Y>ub!+@`tW|mfe>3Crn4iCJ;3L zOP(vZ$I}!2&9in;RB+-#u}w6z**ZtQG~dt z`lht*Ey&`2G5;@_R!MUrj^6x7uq@T11fMBS5O^w#{PcCQVe&==NcNQJ?vu2kNd_MP zSUMQW{spy&5@6WZ!RQDlI*c1k!AnXJ3^OTN`Nh0oBHz&;7B1_y9Uvo(2XGFkuz$tP z7T<(5OeH7_Ne*YBuSr4$7_#E)YVQ92B?RN-rqz+Ng<`4lH=aPXZ4$V$>v zmL{(yxYPQffgCO=kTw^()RSuOvnden8|3SbiZyVaA}!T-5IG&98kY_+gt2s1R)uW*xYjD&? z0igSj8;jh?wjwyX9EYn)itGn)Q;CkzA(Yt^Vl|4WcW8>E((VelHZp9LpWbFgL}P3- zg8dAkeUgTM%gZT1D^N^)K@vv+volob*I>Jd{DkRa~^c@ z?A_b_*eDvqqrVZ?8&c3QnNw65yxU|jYkyjh&UY$HC@~?8?%q62mN+)GF(KUl9T+0O z-s9`K1|qaAa=4TD`+`K7SJX5wbRe4hn>CfNCF6t(L4?Nk8~O{fa2_``Tf0O(Nx61m zC+hBq0BjKAtY8+;DPU?4Tx0H5>5#h_(oa=llZ4+Dc{X{&n}MQIH6H~+&W0dTes)sY!elU6D{z{;PUwuMSDQwc z%&q$i#|9TLis8opBVRfo$IbEH!gInfc79#G`e^MBGEkRP5UG$km%suQQ;aQ7K&uV+ z^Y8vtd{;WwpIgh&Ku$mVOV0Eh?8a=-Z=Y7Xx1LA8d>|O#dYfR&p(F&Le|#E@a0!8y z1x6_(6S~uxZyV73BJe|rK64`^*-L($>BGe#URwIgl8(Qbn?+}Qo-OQVVibF<_z>sD z>P2|zE3m(SkBC>D9it@H4}e88T8WnD(qa(%86TVLA>VPXm~Pg=iF#EcC58q_+Xf!* zrdA+IdkqG|_eu^4_wI}m5f9?L_?CkoU)T@2B}lZR%TlVzA^Mw!xw}c(WyNs41c~KO zO#<`M?Y|AN*>@yg>8%WV%b|^s10*Rt#2#lZND=_%F=Ki)gvB^au}~JUFbJU>U7pq|8g&XxTy&-c> z#C+G@bLhx7(Wn<0JLprmP`N{wi>)BEsJzKGorc%|zp*KaTz)MxX%^UoKiCRfzt2Kz z{IP@a=?5(-k(BcNx6_Enu})5|_%G4BhRwv2g8LUQE}HWrqLwGK2c`gvMl(O?(`}4T zIHRr7#!jipdN7C4ml@-Ux)G-yAPuCCksl$}&$-8W3>v>C@?DjNum-<)-1!pCY`GnK zv6f4qakdh9OOqVfvq90`jxFsoZ?~KGb#cU$h&^9sgUL3dk@FH6bAgadk>T>E67O<1 zcp)|vdY{S7?Je1CxH7B^t+3-iq0Yk#NsW5#qCHxZ=_CAI2wj}sH-dlVSsxQLG6F2* z!6S(CihVD6M(S^Xr=c%n>6hI^u^>6`Wa6%c{&CX|wJ5bplOZuGzf7(PKZ`9wifsLg zL!-3u%qdZleeGkBib*UV4uDH^7|opIkDxH3d1cXxMn)_V0(d5r@GL(3N@;fo*02|N(|$fGxdADf24)X4-bCsivZz3(zNV6xeFsJJ05feNy-Pg-Hbl4XE%7tr8`aL8|H_JRnVE_?K$+tg$?_qrzSeSlQ?c9 z3Vm8@PcT8B$KIE;KNx@AM{aJ1yuQ19)Ksx>PN)~=n;Ej9ED;5-p zI*lqw=-SQ;-~W}2r2&wj?@uU{A1nd9q?X|bRtwL(QtJR`%N%RQ2KszH$NS8c%W#fX zsZ{H`JqKXEl&+$UaJC~!f-&) z&f8Q(98bYF8Izbf=NpIHa|7vt9!v*0n=Q4<<-rWT@*J@%bKmT%pLE?}Q>i9=(!Y*r z7>noKD5DaRQ__z-jB)y_c#BOTu{Lvar*eI*a_@@Ze{@EqsMf3}I&e`lw%P(nz~J2G z#mAl-8h1xPW}QsOe8fF23KsKe)Jt^w{cN`$4g|!<<$ny89zQSyrGFw@ID(ntyC-$q zV^89g5==jQ{{!3Ud%lm4JG&NYq9c2MUYzmDQtErz)2rdJaBf}z9V~7ugK+L-Ko-9& zalSFx65d|t1fk#l00`FDhPGj}{J|wg#Yv329XoU2#{QK?>v_#A;&VXnZU~RL015Ya zQR=P|so~+DQeNUHdUDPJ&G(I3bgc=N3kPdbY= zxoGzlV??9I*2Pe7oCO6w4)EEdBh*)AFc>3uz(m4L6-A1FWH#z*eRIEY6=Vi-+s zcT04wLBaejaQ%rfuU37m(eWyJ^d?Dz3G z$)ZiC3AN}idO6fJ#Gh|Qe3oLRB(wAu8}CJ1N6p8aXZ~<-P&qwt?Jbr3`{G7F3B$o` z7~HX-f)9qjkcLDhY;(S^p-Mv1li|zX16GE@LAp(5BN-aPYqV@;@DH52*} zqsIG+b$j^13z1s?g5SLtw~8`-mf1npYO8%H6rKge^oA-3kX;VHxS+KVsAk<7A(h9WN~Le?Np zPXd*Dnpddf?`}wmBfhfWRelS3=MYgGCbH8qaA*)6!Df9H?O%= zhP1>G2Fy?>@5BMP^q79vhz?tiW8rPZ+<2YrdK(v4u9RXKtc+XKP zE)9=^B2-#A8r}@wy%_GiD34dCx|xMbB!0Pis^^1Z>&5eo8s#X-dCwTMcR&!QCHQb1P~<)9Fz!Y9K51w@F6b z0{8nq-@uYBJ@PxQ(%MGD`kKpU4{3)}J1#t4s1t3tCH0_541MP{ZK*^39Pnr2)v@6j z&UU0aTm~lR+6kTuWA~bfcQPKl+JFAVs4C^nWsLH2DB^DmR_zrX!8Rrz7WqCh1s%k) zqni=e@_1aZ_Hz;F-C;}L;<}M^eQRszun}KZJC$c%H$Pc1;-tc^{(n{7Wmptp+c)r~ zyK9kd6@;amrKG!4KvJZnkyyGLrBgyWq`N_o?vn2A-rWc9`#IkCc)rhkxQ>~*u9-Q{ z>-Ya@)zl}WEsAH}M!!g?S8EDpNR4}~*Ua*^Jo%xVC!Ix%qfs~PN#pS{lDE&VJxJ1or_O-*L zTJKPM$*NMYKCJvKLi)+5WJC9QaBS~~b}+?Mn+`c?89A_w_X1rX)2+Bet>x5HNOB&g z?iS}#8y}SL@Pz1e&5=MLjVSS+li*ywv&8=gU+?J>UvsV7sJM{DGnA&K*pn5PlABvm(t#2BKZG z;Y)F@uPe)z$pny1`j3D>S!DT2DB4DtFm{M1eG4G7#jOT@o$?lW891f zrHIwMjOKMywZgTsw`I9Q!$UT`9Umid0=8sv*Gad_WLky~zL_mtn=g8n-XKX*MlhGA>D=5&30zsuxlwgoLp1r2on z)s=dL2N5bCd7FLK+FD-f%^G?8cij>Ykrq9DI5V*i6z@dCr%#PBF8u!Xt-9modJn3Q zQqB>wCS+w@+$C9OZ=l0|kmLsGu* z2&1-K7rKQ*A{&tSvCQ)+7}?Eh>IOK6i4*GosJ24NQDKvcp}NPtvYCm{yn4&(o}iF-v43s$?^E2w3Vs$Pm6y!;*1p`Pf5UPQ z8iO(6GZSEkFDnoRAK>Y%Q$dk1a(>fSyJxItHWcguqVVtiJ!FxhH3#Q zje%s0PW4lhG5?sP@tfv;k+LwCJ~~acH9lzVVJ73{UJmb$#3HO=ZoU2tDK^YYv=c|KBf@g35q|bBM&E@O zEhU@>k=_T(vczkjq8eo0?Vjl&C6rC1VjM+QoN+Gj9S2&Au7)^Gom5LEhAKPJ*&}kR zfiI0q3BgF3m!*xE<8PM}`f3u=M$XTgS31yvHRs^S#hx9Eoolwvf?90LjO5f>Zt(26 zsBA*I*Y8L4vy@Z#kOPGB%wHFk!zyWxD$^VX12_(N(<7ZD&!t~{mZ>?HzA1|gXwO10 z)r)0dKr%tm?$v2@U?@oJ`NoFzGZ|O{DaVsM!W}uV*Yk%nmGo_;tFgef6OwitO21Vv zDJrili2$=)W@?Q-I~6%y0ja zQ6CISL~n;s&D}EEki_Xb2CY+M(Qp5_Bg`zF$G@ES!Lc`Ro_Ee}N@1gwU$Rb81K ze67NiOUX_09Y*5)VGI$(Uin0HKhUNXTH=Mp?F0Jo+e_%QU!aM+Wwz&P##_s)gD>66 zeC#Jrv*IhOYEY?zEilb)kR-{=g}g4n0@Jpp7z`-5;~m>G?O#VUU^h@; zq9n8HzP{yAnl-~#Qok^XUPOz1{L+b4C<*KD0u;!0GJlTkU_~eIm_Ha9kXJr4-8z?O zH9d%OdpL@6R>LRv=QlyC8S3hEokzT*NkPw>Z%Be!{}?*p8#3A&~C8EPxyavrN4UyGgSn&$L#;7XTr+5E zZ{5D~e$GYGg%3v?EaP+ilf0(?BT^j<+aQiZ{wgpkeh}FJTltv;*<-=u)r^Yk%PUW~ z7QePMtUz`-^X#BcI1e*qPn5eL_=5-wukH>}bXnL-r4?#{`~C~Uj6L&p*O(lOawnUp?ma@5^eljJO?+zW{%`sZ{aWB zgYg^cn_6{9c)T*PdQ2i*VVq}n@(RhbIS25vz1>r9BYZ5%)Ex~T+|J;ar{uuv!x6cE z*;L9`c$>}y$FS}i?SE-xnAf;AC;dqK5n#Jln3j1KJm@wqy=0;QuYH2^~v$n-eB4YEJLzO!gTL z=+Ky{u5LOtv~+dSf|3{Ly)!tu;|X-)Lbc)#NL$HS^e%$xaAOF2f52m>{G`PzA)9*F z8$trZ$gKYUh}W8GZngnKal;w3z2ziCXk8dt<<}Pb&3lbE%3}Vr4E1$c_k~2MPQG8! z-}J(jgOnROIx(Pw%-~{ulw+{{v#zNIAuXtX;Zpgx{#K^$ABlEIQst_3nN+S-a%LW% zzeZ<6t%VkQ`xW`rC_ZCw3kt|giKv#3ak_Kmz-m}R>P!euz~cpScyN3Big9;-)1CxhFB&QVi&g-O z*j0YiA1H#KF*h=1*No1EBz&J`a+ZSY8ZVkgQymY_-TZ>@@bY%YO#5W#tmCF6y!9;1 z#e|>Hk_z3^Df~VSmvB}v*k{X!0 z>Q_|LUGgXHz*SjHBUL=-22cg_b5sE`RBtJ(yM~ZrN=} zhkY@q*4sR@3M1&aVm#CciuVXIHuoB)uB|WeyAo0K6NNRnxs3ioWC~&~#vsto%kCm_ z+>9|tIga>(>be?E{3EO^rB1;lA@U2hyuhzK2*uY`^kukuwNz3(Ma4u@q!-wTkyBx2 z(8BZg0*n`jR|&md!^V*RQ@Z!M#VvtA+Lt4%F0$dFkz0C<&74s3JOs~0fbtZ%_@Dk% z8VgUGGX9XhsHHedd!_M6ALM&$o^icOT-=Wgvma`9c%7D>1UAwxOsI<=^5~n{?cs3 zVom0d%4a-}F$HjEi+2!NtxLz==S@OBQl3t^$MA*VRUT+;cU2v9jHs-SY^G`;vY!g) zjlBm0AFWd_5VJNLTI0)~XukJNc+`z8F}2{B1UwcB+pq8Nb%O(>Z*{g&_Gs^DWL>Sc zVF3EGj8soB@IEDX3Xm88F7NfogW$N(waFXI# zP-q_69t|?M#dx!ZKm-Rj=v3k!t@f~P6OJzMAYlzaaI!$R-=FBcilPqu)P*?%R8^Pj#%uInQD5-0tt!olYrj<9= z3ykt<3xZQCf!nIB&mK^7$P8>{&@mr&wgS8-EDc31m3k8bpU27$CS7++q<+8}z$^Ib zKo0EMS3+F^4dy!~S|%%P(&=~NN7#|t-pbCgFdx5CJ&5!ET7Vz(3$0a}iz|d;S*gl` z_;d!nj$?wkynB`4P)$$DD&^qj^Ruy$rcIIImJjLK(GL2M&n!0KbY+5gx zvAhoi{XHC^Vx{Ew)`bEHp>altNc=`ut26?ktidheA?|7N2yq7~ehJnclkv`^vy%4! zy|5X6fUUg?cjx$awvz7`1pJ z^MVzEY)hY$$L82fNe8`e__aGJ1&j?%kiAba-cBORv!uHdM}bdr-T%xF3uQKyIxr(w zx=^7CcStSHgXjc-psi3)B&?GRni??&CFq)IB=OEau{*rfV&en?vS~ z3d9e%k=`TL;j!VaB~@x#WO|OCx8{pdl@L1j+m+wk3R~l4!;i!9+j;)jni@y%cknhr zt9Bt!X1aj2HwK0QZ0XDE^MV~yKT|Y_ZhBZyMH!p59R3BYXPo3BO zdyjfdlVhuiH`^_h4Lz#%yU2sQ^Lt;L6&|e>ed}f&b3Gm9Z+f6(%K#!QtcV|P_KMSm z1RgX=`D|o#u7{Tjt@fG?FripINtTE@jWGOJ%_=}IH|C%izFia7+($a2;5et21Kr=v z3--S<`@rhD&w3*juU1t;3w!c?bw|E{xb8^=UI$?WB3aZhS&@ek9iddSC3Z;Tk1*yxip&JW^~Kr$b;Pc|a8jiBm>*2Tx67}U zM)3 zUnDeiSQUj`a0*B&C%e&V&Y(4to`2+@A26pf8D-Y7{TNmsldCI@EEj^-DaRXal#fEf zzcxu}qGa3=V`o=Lv^bU<3`nioz}o7^b>3bsU(8)s7r*`Wkfx2MR!Z!KH{t&EtJU0m z8p4+M-LW}fsstf^l%V+jIYm@^sMr>*hpXu>osGJG$chYDBIdNqP)6;JPTZ_guIwgb z+e}W|&&=+;Qufj@cwAa2=`ZYvs*2k&>&Cm?)mviXyL2iLYnmahuO5mrb9TUY{UV29 zhQY(F6qQQ9`OjJMYwfSi6jk6wthv};q+24Uc6c^fVo=iXOZF(`LX46$HqxF6J;u<< z-h>35<5zApD_YK~8xFs8`?0E*-sNoS5zTqFLM@ND zPg>AeRI#So`H#`&09##%ILMGK3FKqQ-o;n>4HopIS6qLX!$Ks^@fd|mAt?e?5KzmC zeP|)dvz8yROK(}PKNB8QoJUiy7ox_}!jfd23kLzUZWjN%5*7dk@pbuOk@ieljDw4&KRaP|zJhjdQx9qfb zz#Bgbm{a$J{1bc_vEfEpt^g8Tz!~HufSjU-PHo(lI{ZDr=A~)0QCkga2c-c*yT2%W z>J}m)kyOFP?g0ghvb0K+%~adhsF5*e{bY{Hpj96>s@={w$J2l9?fwG-Wck*`S?q*| z;n+MNwEX_bQ)Sxd``cWzgT$8PknrmJ&>qXigKT6U3{@xlsd!0?QWp?4#Re;bm>)qb z_YXIthdduA_0Cnpv71p_yD{Tuq>(f%vsVZwYI{wYXp#ta1w4*Drf{iWzRPiSV=ZZ^ z?;N?eXqnggylhPn-WS3 zsJTQ49YTO`PnZiRx`*8u@5Y#h5aNU0StG9y!ieFk_dAZVTfrDd@6PncMAILb+OP4m zarAJA=%Y`{F=SlG-q#pC!&?qiWE?XBB&)c>C;YBlbpa%n=G*W2zJ^8}S1ju0q+4ZY zcx~)!RRSd|ckEe|1qa+b2XUb-M)H1NMSe1~Nb!$& zLj9m=z~mgNlO`zfanz3@qWK=SB_@mt8eCxK#odfOy!v>qsz2Q#GbUsgR{E?AB-{J= z5M{h}Tfm+S`$-Kj!m(nX0+rW&pbc1J074c=p%1< z8^Dww-=#wD{&=oY9@WWvrFEe(#?O7y&}}yUqbDF=e>#>b9_R0$Jgzo^q-|h*kfkUy z2$h0 z@M*l(EpI6w-$qdVB#na8ql!W6L>NKwPRm4?&`qFaHrcSFRxP*7Mm80m92e}XS@`;nKb$g)dz|CEyy$N#72IApsgwmP&>Y<#K zdtvdF+g?4Kq~{_0wsP-~KtV%Ecw~18Ae^M*v{?rObYsqwE-9^ z(9qlMX0d*dJg_gcHI3zgsj~G^z`fpuUf^rWE+G#9YBghHSE9V`jLYdvQm*2BOg zg2Jo%m=&lDPeaS6Fo0wwKSD85s)g%6W_$+iJ$F^ob@>U^z3Jq7Wd!Qre&-%r^`&w^ zC3Ys&M?c-*w%0&#I@#JCJb#=AGh3{Oa{p?$Nm^PMHsBVHJNpszJ~65Hr)ff^^}^)D z$^H!1g*#_Lsh!6V&G`!~i%`UmSY(|hcq$f&@Fj_d=L4&fV1~*3&lK%;3$yLHf}xiB z)CCR{k*6(i%+NLP@s3E2N%!qud0zu66BtW(@Nbw|h!9bAC-ylt@_p?+4DIn6>(ked zL74#}TMZ6^2`UuA&=o{urQHBPk+uZ(Hc~0?3;|e&Yin%X_nSdB^rR3 zd`D+fJ15#fl&`3mN0{a@`~run_Q6fRQ{(+8i6?)iu&$jT$(m6R+17j0*cySj zUSyB50<^05s~q_Fukv1Zs^%BBicqzk^j_a4+qh6w7RG+Cv1S7i1Pcx60TT~_HnEwE#f#+IOe zPQ9}_%Q?7{_GI21U#BG87AWPM{`t7(Xto*aIux4ITlOl62SnwdFuU&kDCW<|W1_YP zPRG9u>G6<(L_|RUPPh~om`COA^fH4_3G_bYpdwa-l^7=;{V)D(ihT*K1~4q}Jqe77 z`ty>9b{*^3_`-N`-QHdVDKqx!v085GWnoq-j1|7gsY(aLuGLJf8nc8owEP-g_Knj$ zPNgZ+Zpn9U5H)^XhN>w@?w_#H>3>u}tnG^M6Z%F1|B;lN;0aV?`IY z_<&}iKX%NVNBP)c@qER@ZN1z9+$e<^^-H5W{)pAFi;nVqQ&yM z<*P%Wa?UE8aoev&aqA>&^wx~bSfGfiM)?V}Jm8*Mvt@{Oc7h5*bj`Hf-%@%U=M?A0 zzH%z>Gb;P*72*Y9b%nj219u(gA^b34Jql<-EX%zKsJKg?+x;T<r5qe1LvPNYP`Z6CIA zKZn@t0@4R0DsJ+I&-D;VT);?!DxRLviTET|fY&=M> z6O4+S!Y2#m!~pXLtsy~s8jm*d9-orW4zj{OvM-gPYZsm+_-?}#c?Cii!y>cu1XlU_t*Q@9HuBS^ZCP2C2j$=AV z@)wvxV{Wg3LEj6%)lm=<)JQvK+koBfafvoX!4(n8S~c+*yZ66lFAPX~VJ+e+dsY^| ze&BMx&0?mjvILi5^#8F3@2ceZT^fQHEx3ldLSh{IPcEkE17t#%2*_Pugdi@S87rme z+{F+~DnQHxL{%v>fExeqB>vp1ccv78#;3IOj%v^I;Klv(Vfe-j@+q0v%D*B&z4gQ1 z@3^3aQ8dsimp+-_3f<~7V_PCK@jyIThQq%4I&nG4?&Ou^=A4xd~zj7}c~k_z}6X8&QP z!2#_=NTM0hY8$`x5C59{&QbM_d;P<6s{6yc1*JECKa(=*`h~WQ#;X?T08*cFTeh=z zMy@){jt~xKM=U7+OFUyEmENLVSeGs(9G@jr!Dv$#0;OO|SW1sc@!g{Qv^!^bJP;vm z@BbW3+tZ~5G!?QrP5I(=M_9bC+G{0!4ZR~6OPC4k>0pIOD;$f4`VVI2bc>}0QUD5K z5Ul`w8Kb5F>B4vyLr28PQfup1xh1(VWAA|rQJh_jlywgtt6s#!4-lja2&tsCX8bx- z1Ns%cyT~wtkqX`*uetSBbg_0djA1S60_gVc-;kYv)vbX8nNbNQ!FNtb%{^8!Zh*cW zAm2C1h=U@b7f(2P%dns$Ewg*Z3NW`T`SNd+q{nM&c6qm-56z3`YU~B~UGU}JYC;tjPCdyy(=* zi88TE{vwq>(WBahfvN5@k_E~tIPpd)KqP@On);(oa zko(I1C#%9=Sg%29J-1{s!X&6}vrpb^C`UJqA{SxEr*=$r`?xp9)PaEK*NWUTnk!s9 z+vqC|WisiMU>UZm(|;wEer7XRIs$j zh>|bz1?swdGx-$UC-qejG@4T2k#if&PPIhI6{TUkzPlMM?A;M5I?RCdF< zSmLADVU zF-P&BlpaBFbP0jvQzr7^YP9itc&^zqYgY76u3TH18Yt_!dXvwms!7D?Kn!%F-_`!S z%n1ypcn)Aq9gb#+wNM3FflcZ;b@b^DZt=U}?2isB)tt=2c>E8~_B2%skC+92pBW2a zMBUiEH_Y!h&#WP}9!riRS*Rmf8z+eoR4jWOk3YF4>JHxjM+QbmB1O99{J0=mAH$X< zI`aET)Mg_mR=K|iAEG6DZ$eLyG_sG8I}OpvVM={BXot$Ubf`ArUCP4?F$ujzE+a=)aT;!vyxwVlQdAN{1m{Qb*yR-6 zgCx;Lqm^IEDdUx87WPMi4}k+fB=PI1q{Z!baJn9-O28mQ?i5i%m2p4DMJbey|H}Ni zMFH2Q`MnNxkzr2F!$pWe*voTSOoC0kFlZD3o7?L?xKRdfI)=PDK@aitjDN*N9jblj zO%(zW_eI*1@3ijhQrJCN|Z3(e)a6nepY$R!oN zkP-S;hh_^%dwwydR0)LpLni45VBUT*EuJwfJzBg@FLskt6Y|S(psiB-G3n}j_ zBq(py!L}RR$ z4$gsM#L`uFLm1pnjo_A1j1+SbNB8?Zq2Fp?Gl|r&J^vN3Xoq#Xt^aOURc0>yKfv_U zYt-U*;On%}-%}pw`+Od&q6l!70KX2o^gYSmSZSY;{w>;>agI3%wy(^e>~a?i3)i&F z`Nw6SgPhp`Zh%PddEm~uWXF%a?};`|EX+ZNGogE0+3>{FwaK96zmZMc2Na-5np3J5qr+gptB^JIY2YbgIWUw zR* ziAwRJz-}4@3TR|qNCs&|LhK_H9XZ_|wySU6eXD<_x&c2wF;?moUBPOb1hFj1;D7B% zrOCIF?deYm2! zk%fJ{J6cYoLKN@a*MxM!oW9}lGJnqCqZY?(p6gU-ZFs4_3g?7<>iw71@z2F)Lv5>< zP016V>{{j7$dIN!;Tew`%KmF2{jml<72oOpYcT1ca!oSq{3pf7L*j)=9A;CoG=LbJ zoog3z*N>ck==%T5_DKW92QJcUS_8NA}{{JiIYJ9K*otMI$-X%|EkNx zJ!*`nLR^>mqI|O2I|F7P=~0>gEFJ&J#c3x;ihnd-0A=jbk3+x>NZ%R*?$-)z;Upl2 z1yIi$HT>MMuwm031q;z2kInRc-N+0-49XwWlc|z_g@6|$|GV(NEWG~)_cjJ0oj@}& zxK=a*?gSsl&v5-l2zk7i3_g>3#<258rL6+bah@y2@hO9M%~eSiJmz#afL$T;n2=db(>6TSflXcQdmLL-xy1D|cRXEYJlY@^IZFtyKk7eAQQ zKG-W=O??|W&rp^|%S0y%6paCh{Ok?I`Bm|MbC5L6{BOOB9}Wh|6y>CdI@8G3>D10S zajw@%PziLw{Dv0dm`eu&9vrN0N)HdMAhc;nEhW-sz<*sdpyk6nT`nf#O@`i-Z4n z6p;uHZvySz#Dyh})2`4$dR%Rhhptve&xhcG9gdPhYfq!^eM(zsmIB^LK0CYl;1-Po z7G#FduPMXrHLm!SAD**Dr)K=$X>$$!SR#Dp=!2WB+v0|5B63k-eEq*+M_s)D(R(-w zJ^aNg+dd1ZgY%P9wac>mtg=_(DqV~Wx4vOMv7cssZm59cd9JI)CHB$c{mV;}f3G54 IDQOz`Klvv(bN~PV literal 17209 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 diff --git a/meta/images/icon_plugin_sm.png b/meta/images/icon_plugin_sm.png index 34fb3075ba0884298839a40f37f5a5224f77029e..cc77f3e383885372462795060bc19b7f0e6b8f0e 100644 GIT binary patch literal 14249 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%0AZ z0PFVDtN!Qb!_sJS^xU#nQGjb-+ox)~VL}cUpPC-l!XO!iNrRF*)#~54`oJ+YX8-be znJTt3Iwz3}ho_w!3P6%&WLXJ%NV1I8=A^QwkqP65^6|^}VDih^YsA3eF1ypkmer5& z-P*@^X7RP;_Q|BGrV&|I5CoyqOx||h*lgppQG;3c(p{?W?|OU{35ITC0RFE?|J(66 zXh{YQXXbX4^ENr8h&K*(NeUYeb|~5OL@oK5J^QXxSy5Q|t$Nlh7}txZX5^8e6S2Bw z1iv^++qqLx@W={FE*hjNZUR`dtB(2*1Fw<7q}Oo!TD9dhKGz(bUQxV<9OlvEF2Kuw zUeM*LJV6jJn~Y?pn*$a~O#jW2fY%Fxz;y-Zx9{UOVn{z;`O5-aZV#muwH!EnlsyN^ zDXpkQtJQc-;_P(BojQ=AgL247O;Y_|@qr5V9jZd7?KZalXCL!FrS&-O@YDWDofth* zA6Kstcz1U_XASIFskvZc4iBt5+@s50-}%0lB)!NbBhuU3vdudFaale!RyPOhoD^5v zsAzU02#}SeXK=cKybL2*=FThq)*oo%wQbc==l(;1Ly~!WSDmWw(cqqG{gES(XuC(| z_O&HpZ5|ty0vIwd@~H7m5B`f5n5#m!ZGP+TALynI(NnU}UyaeDtG`UKdF zwYw0Pzo-W*2@eI!FB`(5wISELgy#ZO)-*;fXH5A;kEEM4f_|WhC$!N`5Uo_aIm9lEzmk;3E zvgWSks@WAYWn>KVeH3B68OY&ubMJx~3=Z+_KvuhxilgH?U6mS_gTBP%RCD~Iv9X5QFQ%Ue5ZW3t(WtSFq`&&_Px>V>X<#zLdk3x- zEva*`zNCq*WmZZX9GLW)h_=(dcUpf2q#5}8rYgQJZH~C#eUkMon$njvqn0C0E}keV zr`G1~GOOZ|6{hB=a!y`yR2i}A7I*s|kfE|^SPB5ZLJO>j8UdYFi$)X?MIow! zpSCpx4yPNt!-YYwCBdNg*8MBqfMko!fljCGa;vc*s4ubZ{jR@ul7(N)B9vP=cAyF@etgK|kyAf!DPK@{!X5IR>ZW)iPVAP2n zI~*wrcDIZW;7vS{-oq^^UG8BJsxoPEdf&gO5xtgy5=I}Q8B3iQ_SWE@ux&@JR@3EX zp23+`iJIww_V*3=Q(dDGNiioz`uFSn&hL)}<9hdN*Th^P1OZZ788w!HI)hg1v__y? zB`*-Q&_ra`3PR8ol9ArS7=ulx71a9=D$zdYF~;%!_TrwxD?ZhKT3~jZBypS!&;nt( z06#_)Sqk546@GwI<7^SfNdmV>=e6%A8&G1paf96X90Bz5i~B z^FWW?!R+a7M~gCi8xLoJSi4g3T0r%N%-(D6j=)WYyBUK z^F$mc31+OAGfWl%iY$d|fQL?^hrgxBQuu4%hPf+?rvm51`67;!01vI0Gi(j`ZB#S4 zVDb5QbK=5}@Szo;95}VeQrP4t`~!iKIA6r^BZmS^UomIc`)v*WbpRh0SqeqqX21hK zn)e{S0vL-dh5dl0R-qT>t}ITNyR!J{xbVmEBNuuP@cR{WhKa!YzF+=7j}D1t{ooMb P00000NkvXXu0mjf?C1%K diff --git a/meta/images/icon_plugin_xs.png b/meta/images/icon_plugin_xs.png index 1df41e41c4ac4a620b7980ae61a705261c1780af..cf8ba97de0d289aca1c6363dd74925471dff0b06 100644 GIT binary patch literal 2384 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 UO%E<|l=#02))pi}72YH9U&izKJpcdz delta 1033 zcmV+k1or#T5}pWbF&P9WA6QT` zh=c_~7`9z|>AH5>_P#uPVO=GP?Y&9Qr~91TbI$MnpOfd@ha5RQi1roDSn~Fvy|)vS zn{UafSy@$w5vz6xlgsA#ww~$?^@aMQi4#u>?$wvrr|F#9Dyy7>65t^#iwGP!()+yU zosTX>K>#4Q;eX)oBY!65f}=2M4l9q}y4t0n&l?*VOJG)w=2+aXCsHc2-2bi)z->YN zTnj&wF5Y=)kJ;kT85T8pI)grM3;=>s723{fz5iAm04RW@g4&fosUOqu_+*Ev;sES6 z9s>urd@!}n$WhPrztHla7y@8I#X5RRPBp=#HPku>34bBEsddLN+KcI;2^AtW+Hi&P z&#b9DRp^QbTx-# z!{O$b0&Cd-sw;)=d=lP@zBsqGRQZhqXgU@I>bh@+V|kaHV{HcN8v_vSHXPr-uE$?r z2LKq2MjOLfcu_6@kK1vUkm>K;_Xk3R7~4u}(H@um+o@-lSczZ8 zX@9GQurdLtI$9P6PGmEgyeqBZO|ySgMFU9H4!pN%`G8Fjpeb1#9gZ|da7*@Yh1xwChJ4wnL=HH^=q&PHg@2x*L!WQ!^oSKP{09S12wr|F_!8j7#Zeib zEcN3|9LLPcZ>7k+`v}`e_Z;q1BHerakIkt1QW7gt^xjyrTQ~&j#LFGa<~DcjY`ehN zsO4%>eYB-N`g2@?-{_t@c_=dk^cfNH-(h(m5bf(%mHz!!U%z z5JPC1>-XR9`~34Pmji2tGw0mr?0fHPU;Em3sH(CIAwCs878Vwvoa`HQ zEG+B^@W0>=4tS@Y_@+Dffn%;9^9Jkc`d=12KNh@$_fA&N4GZfo>Gl5`SSe|g;7we2 zIVCCF)tfi*>AC#xe4)m|dW0qS=9T9A*{uc7G(!mdYVSC?u}Y*0ZYemU#3Xu4_Gv)S zVye5E>W$n`V=^?G&KtP#Nan{#bIAv`VWakUzF-C1dnAF6w2WOCIBMY)L7!hv2ld4# z2#tA~40T)3i_slFk4@f96FLxEI=Ju?3${(k1M9%jwX(Q#{qr?Hc#$Z$zLGoOqOh=F zRR8_@Nb@H6J;)Bcd{8C)@7H@pH^A@z82G=2|7+m?8vd_=|7-Za=KaU){}}ks+5a){ zpR@mC;J+6CkKzBH%l>!G`~QBsBnqtlbJ)OU|7qg?u#*2jjqE>%{cqUx|J>O>p01nT z8D*#8CyPqnB$S$ z4_ha%j3~<3a_kToNu80DQ`5YFq;gZ6DN}%13iBQZ;iLzVt%ZtgdCl$WJl=vx(Z`Ov z#Jt=fj%|05zu?R6DAmh#;wU(>frc9J$}bQQz=XX;;cgP1&YKhL95-I`VPXA}C%v1V zqW5RgpH4Ney?d4SQPAerFm1%QyE;8P!PK<@cjsFt5ubVEGVR~U^b7?+8zqmcw-|EbudK2q| zTH6=*E{#Y`8)}=ND_NqNcPlofnn=jY2U-J=3thjkEeJCppFPZWm?eFm9jqL+wo2&houlZq^ zSkaN;^05p>XXkSNK(A$%8w>W6}dl zHm22aYa*U&M|ra{`gxsEX0m#LJtD!@At2C=lKXXsqDHYuVB=1WfM~pF{a_U}^lwLn zaKoZPK^Ly$29X`+VvYnFbxP)i85^N^T%A?@xT;V!b5L2Pl=nrZ+o%ADu33Zz-9KH#eD=jN_he%eb zAiMK&f5+{yhVay9;+LM`MG$1QIX3@?I24gIq@RHh+QhpDr+1TIXhi;H<0#mFx+FKD zWm=6VZGk~`85>oUbdIis8wqUJ+f;^0n=RiSOrl@zsuSiAKdSvS(ddH{KqUb+JWy9q z$439;p@X|?!=tDTB(iX%S?d<^xRkgi>7z<&4^J{w6+N9c9>!aA>m5jz*zDQ+*45A# zxG`hgd#axlL9t}RuMhWfz!y(6q>tH%ze<CVqeomqn~9H335&KPc1S5EX{F*66e8>E1Wm&!`tCq zHhxm)XKYlMcBq4lI1F0tUB_NfCsOKo==D3O0vPP`&sgf5l#$2~=jvjXx1#D44GxV5 z8&tlw(s(!Vf8R9pkR(ofp&j+YxdqoEk8XNaaI-61^}<=;@D{M_OV{TJrF~m7C9#`# z9&zl<&F3>k`YA;7Gd4H|UqTfl2h)CAaNqFBfo5tfr5KPOuO!sns^-LtJh(F<#74tk zq#<%&ZhF;7(TYwW!Dge{g@nEUa_FfV*+I5AfUWjqHXkY$vo7T**w*HNk(;wCH#Yu0> z@f7#(fkyb+cQs*Ri9bG^P4g}Z_ZImj3h3hha9qY%3l<#UKg#v1X;gqE)d-j8k9+Y~ z#re`>eeHgTkb*WB1K5@Qz=cYJ4Qvhib?lNlqJyMPNnA9pW*qBzs;_yrjl;AhE|%VA zY1HGs1=68(-GWgX!wmA!WPIt6E6i)PQ-(b3ktDGa)>JcD&QzFBh>|hlZ|0cQ@G?2b zvyday5k*{S=l0#^iAo;rs+UilIPZt0Kyy3GCnYqOlL{pmnWNj8>lTKmu|w8%pp_oJ z_G1#d05w&lPIm%a=HpYTKC2%B(ZhkUf zVtjTq+TJR0wck6kOOeAF&ql#nmfHK{>f`Y{L*n{jbM%ztt8c*ZoUURYv1KQaW-wjiD>oHsk>`zQ}k!IbPOJ` zjqzF5JxtNu7!M%Jh-k^{YLlJxr6@X}?RES9<%4Qu$x*&%6FQZD0o-Swo?WW?)6^|| zsX+K|3rL<4NrvbkP&tj*w0aucf4YxT67{R!Pkm?%Hs2j6=~V2oBDeyfnGG_Bj-O#_ zglgMr!;kJ}I*x+d4_M`_0sc%2f`5qB4K*`{a{I%3vYoktdv zDE^!N5-N6$uiZ`s!b`AJa!n)_RsY(9c0Q$8vuR$+y7FjLYo@{aqya*uA9Fmh9=$P) z>j|QqmFMp$j&~bhZ99eY1Wa(XS98&fDe~pjCy<{OBK(xyJ*R)|qIX2gv>^{UA(OzZ z9I|*KYkZ#$wxX+I`6`Cv<1+(nQ!x7q9F4w4Lo)uY$A*6wJbg;V_}dcE-4jA8f}3sI z7YTGtoAY>jXBIS}$J! zt6%Vay`7S`^xQ)ZKKMI~&86?5(cI-J$_31t2)}~G5sJ~!=-pA~aMW{++}aVp695{kLwux9;QYpt3v#a77OgbO|f2{$|36UDqdzN!#EMr z_Z=J-fIzC^{!JRrwbo_r`d%4EOKAp02P|ZEuM>zmXs{o*KlWo zK2l1AL6^_!8h7YX6fhOqa(_FkJG5PHClq#eiQSo<&X!=TJGxVDN4zmg;bDM3-Y%ZT zV}yBKKz0H?s{OdS<6!K%I(k8K`j#thu0Ln~}m&>HbVszfbPN=?33)Ezd zQ3Ad9z}DB2yW_;pyHnN)e5kP@0ZTqr1$E#Wmh?u-q=*GKj!}(OJMR;6?ve|3(iSk; zx~ybz`qb(zKa-7g3@Err}bbG>k)izy<}xHU7x#aEZRE=HcRR~60t4B{V;9i#k9 zOdJU}$|B)mmOX@JI{N3Bwat^88^p##JG-3=Htwv2+l%_rZb@^hSdw{kRa^g+8?-x+n@F?hpwZ7m_9H9FDrY=X|(_YX*M zIPB>Zdr&j{_ePo)9ri({b__AImJ za>jsGezW3%PcKZOI}G%1X4xjoW@ml1HvsIN1HqO4A{-Gg5D)-`+OXL~^8~ z#iZ50PG(4u$m-Dd+}2m+9Kj?vz*^L`rz_d&Ix~3r`3a9UiliupC%I+7?o$QgtZ|APr)<6T+1gG_pO%wqCb0V`U+dHX_JM%CYNDSdBfnTs0wyya8?nW@k} zE}H7SQug67p-%IQ+{M&A(`kyZ%|17W0Rx;_PJ1#z`OPccN+2Cs$+?cCdlsZa!WqPy@|wx9Y1Hdg~0SA z#pr&5g#6E+;2mX@ce3`D{0Z91j&KvW9Zi31vt>+RFSr?qWt2o0xlO&&FSo;scrh5y z9lUX_9ipd++ccjy=B=sF!?i8dLzvXO!nc>P;ncX0p>^Xm^%$( zz}vv)0=9a|9h9AyF~eV=xu8V&M(Kh*vd_pW zz7gUci6-xcB^`EqdXHins&St*T5DvI=*?Vb81YtSMu&oPA=M32vz;pxdF0k5$ZpI| z77^66sWFfzl5sidFj8ms@Ym60nm?Du?p%r+lfqu>K5g)haBXk^;0}Av0?rPrlpgvL zDg~M;h|I3+NuPZYaL>1{@8=}xGdKU2E6ujpI&F6JwIs!MdV!`}$iFzGps&<;z zLeJ4+N~?Kt&6+q}6YOsO1FLlro_mv03Mp=`S6wX|#NF zM~OMxt8twRwFesz3RsKr@LSZ>+Ba9_(cr^Gut>*Gbr$#u5@csEikHp%e zJU=hxMukkDYWjX^?DyJ}tet=WcLs@Q;<1Xw|#M#glm z7A->)tCantq9IP(Nt9y)T>Jcz!xuBK$@$oG+=~`^839cfSnM`ky`v3ZxtT}SRK3}Z zxBsFPGg+dPkf`(haE=5!0Lb;>I(Lf>s`f>W ztLjROo~?@z&>CrciAg>#=Wrg`d{6=t;4?&;y2dD+ku|tu-j^#E9uyr(7EKUHnFEM7 z)mn>20XJHE{Aq$BjCJN<{bD&u?AXxlHKJ4TZg-AJIdYVz<}^jC3p4MlwON~63j6w) z)jWmD;P-gv85wf*L9GKWjLP=;1AelwluBWk&a%tKdCw@{w=EYC1}}urohxf4Zlf>OS_dsN}qbW05~gI-J@?g$6MZ!;frLeQ#=?>12|4 zo~s&*pDt|Ctb$NHv^BO|WLexFbencpPuF3YAPk8f5Pb~dy~K5B3?I162}Ti$J~qPq zbh_A{PD$e!ss#)Twejw-X!pd^p|;3PUl*Hr8I?5sZVA)OzokDzf^*)w%o2iCNvNc2 z=g*OAv#bfA1LrVnDsCaQt<3i}O6oD4hcyoclr#W}u<{!Fv#9c?N+D%D{hLzw()(Nv zSoc!pcYTPMwYJ|9-2#s(^1a7Qjs^;Do0)4oCX{nGwz(BH?l@LXR6hE34CQ{XtR?KD z*pkbiqY-9=i5AL*F84z(kQ+SuajVc(|E1CVR>$5_5(xbZf2ZB4B>{BH@j`d^-8cOa z6BryA)rqXm0NY45OY}s?&yJr1yiGV0U%Lj?{TGI_w|yt|p*pL2bGPc7nX>rPk$T0A zo?TbRGEp&8W};cZuV5~Fk8)aD02MdfdrN>NgLfpKOOa!+cekUq<%_WmRkh}E^UEO^ zZ+HIj(O*;G*Gp_P_(Juzz7|SBSLX4qS4(A*)J%>_RAirQXNex8m5G#Fyj_q(tph0# z>=v~0JIy8Mu%+n_tKFK3dW;RD(z7?tm1#B5Ojms$8#g)N15T+<^XGOowA?Aly0qtW z;c}!DQghdBvl2Pkp3jO54ZcyT^r!O&@KHOuOBSaBexY-D#nuVGEQbb7y4IR*LhI&c zZ_k-cWK=sh`jok-Dx}7ao$?MjZ6w}hLnAEg_#TIvVXpixJ&c6mx=rHZQW=c2H&eaa zF$ckPYnAU58xK#dYDSKz9%(XoCg&BdbbFyoZ}yTvGcwEMRmi?r4g^Bm%s-!??`u(+ zY{d2bsoMhJ248wikYT-&y3t2E)Q&{=TNPZqWNs3|lG|a-2=L#4@9d~Gyz z4d60SJyRX86Ri^0ZM6$)2tzn7KRcPEE=D;4M!M0@xPc^jyvf%nIzfO*EOiDD&lKd6 z`Hy?dWCiJs<7=oZ0Uh(q^U?Xv4a}u7Rs;uBJAZ9(wF)It{LZxVNr8lzCevuN;iki@`4kh)*m5M(q*d2P9u1Xk8r2smi*u_olMgnU z@d$2SiGL^mcMTUT5pNB+dDpSJu64tpXlP%ZS_F=d@TV9%z}Y09T5XE3&prrsV;JYs@hs#w zy|^$ID3z6&TDRVIY0c((>lN%K9jd?*agYa@=_oq-uqgkX>@??f{^gR{3#8=41ZYP)$zUizqA0carh>_4O)N-z6172=+_sLS%(Qy#RdHplyQ}ShH&e1 zl>@ey^cerTMjp2*(>J?0g;wY@vKIswQ?J%4G53?dURGGvS1q($r@A7O$GME$WW> z+FFAPSWE@;sW*baOs7+7i<_yQzKOHUBlCu+Bjc%lwvmnp6ENkIpCh(oOk-iB`Z)U@)~cdRKIymoXLkN(yH4AYwH}6dR>Xd+2bYqB*a=wiR<#$u#j9V|uR1RBCu|nwKcqliG z@V5{=F92;=s76gNML$=DJ&B)bJb^1{y?ekW-H>40Xa8SrF8&WDP{BbWrjFUw1PANtcZiND36aFzB>EyEthcL77TO8`B&;3}_Oc2!hz%3N@N0R|U>vZi zYc3BaY9oA<^C!?=LNiP7OVbgm^3DdD!)Df@P_Vjep$qG2-XlD-uL- zImvtVr~`!rquLXuF-GKY(W+;!LCajZ4#%a$qE~-X^u<-vR`4K=Gdyj2FyOPXZBKt* zfdPefaj%81K)K+9v6&$s_n9)3POWWer}Wdj9P0IW)bQqciP+-JktDyWE`8q2Ju&N_ zN(z6-!jkbmNu>rKlfI!af`)~0TFJnMN(65VV<@?51C zQL0mtPRy{|Gsk^@8%O}yjf;I+)LQcqyDKt9k4ewJ+27x?X|4NmuYkwaA0CrbEfRn) za$DIzJAU|#F_cD9DeyjFkcHlX@s3!T_Rg*2v}RB(?Moynp%swyg%vptC7(`YrC%a!6kWqZH$JhGh2dBPNXf~hP?FAZG< z3tUd}b9707%E$076WVAWe)={$Z|^%K34*_nrB^SRPXE(M4*Mn!@yqR~$F#BQO?dQ{ z00Xz`>E^O0);x_V@K{lts=8;g`g?;A8EfLA>j67kRRnd>wpmzAEUFjoI2JF#>4JLLrlRp^ASwjQ*>;K3wHAYL%`rQQt7i z6~w2I&W6PaKBaX23T~LeK&$aWe8q}|U8sRcO2+iF)pBi5WHn3a)w_DfU_Yph<&l4) zqJ|)R%(jpL<~DTOAcKK7A6a{=*GSm07sDh(PcRYO^+1<+Vg}=+LcKfYPiG3Z9bRNO zo?R=2W=H1YA^-N5y@C)*J-qXpUm81cKs83BBGLp@=tXC^v#7OeQPqI>{b-%~K=yS{ zVb3S!bdeqwZ;~d~OE2H(pFH+31jr<>tj89_E>3pvr~$HeJmp_%&E?8wYW8!r$&D(i z5L1{p+rzck&G$on+pMlb)tXD$OE~M!PwOFFHo|$I>rCV@1@zLdc@YV@ZcTMs$&v}F zUJmtsT0kGLxes=92v8HfQS`k+d!TXfybHMCT9MA zp8d-*R$Q*rHU>{@zXb}Nl5g(_kI7qpLXzJzJjtW^boo*J+RTzv9872RBv!0 z^cO#Ezb0uB&+}Urd5fEOtQJsIAkXkV_-cT*0KyLET7#xsuMs~fJjbu>168PBDLxDE z8U65;)FouEO+f~bV}LLWnQJ^Ot$F4$ci3zL4QX`BEHNq1eItE8N4t1XN?CpneQd4j=d|spfm3$L@ zo%V0KrQ{Xr=wm0a$1u(|&NDhk3Ek}HNffcHUPC}`~}E!CXz)ZErj zx|vGKguJd~QRM3kJd?AT-FMUnYbrBPF>&%Ng zm!ND;_E{D7B)-)XH?Ha0^uADCy?|+-v3OZA-s6EZb?Qw*%Oyh?VUN3i@|+46{G2_* z?+&IWJq&s7nfeZR+NJ4M#ln^qN1OMjL(WkJVNIj*v+Xk(rXD>9llB!RX}8nwgp*F| zjPN|rV(eD0u_ZDgV04XG|483oJPZ=mBL)Z5T@;|X&$)ADwOS;rdh1DnVod$rhf8Du zkFd4+{?u^U4$Wu^r#)||C#^wh+?49Fi_NQ=?tS9@*|MxjPwU#aDIG+dowA;twU(ls zzgVL*|LvJpp%HF^YvKSW+*6_~L+_ig^ZJtY6C;I?Z+Whcbi8&cb~JbFbNW1ItItdJ z@Wh8m32$PSQQPOTxjzC~CZFE{3=>d`TyHXD=5U-Z=Ec+>MTPV!Sc6@6nl+Sfd@U-gl=J$&+#wJUugkR ziB!0WQsAT&Nvl}C<|3oV9=q$@N*UzBudaN1QWd8U1rpY=t~2*GMicprC1zwRaan(| z#WA2#YLE3&_xkhrSLm8zhKV~CQZaD~P)Rk%jat9QU+iCP{FaYydCp$(HIne={e{0! z??Dc9kHBpr$+2)F%&A#?qm{O;v~a-_p@PeR61UNM>;>*}!w_vmAKyS+nyHh?lm*g- z%*%t;a7_*>RH%?ofvUiyG45<*b+^@bx!tNZ>!KY3##vb})$G9Ihqm15&R$XUivDZY<0QEIL#jGV{CoAr%5* z*J_@~Own))Saw?A$d@va?}p+@CYOt$LS!r(AaH7kl-{1c=vzop`+AOU2eC$@qR;B| z=pfO=p+~pCZ}(&S%5WX=)3IExE#+CaK~4y&D49vfjiBy?0hD^3k+}7M7a0TRybgcR zu$7`|BdY01L^yP=%-$2ph65s=%ElhclvlicuPD*Qc0CpC(QhIJBk^NQdy}ZJpF_Z4 zx@JL4UfvHFmm<4%3j>7WZogtQ&9f_sE-%_(&Sd?Zc!c6GF>#sfDc(9}YHq?7_Pu4{ z3sL!?PQ_f=yK%+MOi=yX4J<8J*ddTcPe)xw_$TB~c|+bqT%7_%97ieg$kyH zM0UBIL}4KJ{yIDTRL#TUg{m$;5R#Qsd%LYyot1S${*M0LK6~lygp&=R6=rh2GAI*) z>NA)S{n*4o6&zD39zoNu$zTE4PWSa&nJwHkPaUiDuDMKmnrhADA5O9cP)W=>d#Rj> zq>bH)faw#UEzrr2KDIpM)o%xbOPgAHRu&m02ZeKFWtj58_I;4=mev=8qNW(^_p7XCqR7Ar!V*0|x)O_? zoCXD>^wxT{=!}=jbhrl)Kuxo1{pRK?9xpwOr%QiPCNU;IZ)+lXwC~iaU1N|cN6?w$ zEs*bVFtPZ-vU7C(6+dw>ud&AtFJL)C({DCT{n6c~4Qz@km8-{=5-xS11{H;qCbyKY zoQog|_1>lmhJiBj+6-YIwb_yb{isN~q;Ms3(-ig9P%15+=;iO;`SQtkL%`4PjNp_i zWW7Orl?IIFaCWhEeAuZ@gtVdZ6HEMb0b21|iB_R+^5yBG#=B|aY6^n|*Y-YYyW(q0 zJT4iNblFfUUW`I8KfhWai$G%HXVe6bj-)2oT;`rdw+-B7tH}};&yPCx7BDc`{1P#@ zTgYA4UwV_org5A!42et+)H9;}Qy6>$SYU}5M4pSchx5 zvd|ZTe$ADeh61)dNOa{x^_P8c0y$EAqoTo~!S*6hTd8WokvX(JmY(|pGtL=7O7 ztT{_WdXvBQQ)-ciR`xwoDWb z<-3IHy!<$lbX^aCDM5kWl9?hZqKFXO*2DQM6r0DpN8nEZ0Uw^gS2%2|VPLviR)KS8 zVw%OHefVz6eO#e=Cy4mE+Jx%t#5K*xc3kKHbA9ohEw*}sV{mcGy z;0+Mz$B};j58AxC{r#oVBp^vzONNI6c*b4!2niXAMP}hg1KE$lhLFH~Z~?3eKk93l39&Q1 zYIx>c8FD|ou4%RIJsA|x)njg1Q3p(N^#?B9!E^x3t~Wi~f&UWochPw5*u#Vb(g7m6 z0FGRsDOqqiq->c7bjr!^=#5Ol!-$k)>WE~_S%R3@3Eu`y*hcPxpF&l-6z6pcnL)aH zP>JkJ5X{(Fi%!D)8C}qCwttkp+sREpdmtMK=mw_4m!NDjw4=jk9=%<~eBwUQZ{D(c z{q-i%f&>K<^bfUmPXR%+m>MIwS%ShxrYqYoZ~fSRxvjG`n0yQ!``BR+bsS>Ri0LFR zwIgo!Y)e(XKKevHFTwy7f>dFXNZ;V~J9Np{G-xY@66+{Z?oN!s*-znvLg@>Lq{?hlPx|F*S&;p} zu5YI&y+L;K{l(RsydQ;`^x90(=|y8;<=KnDJ6Q?*#8JJ+m%8mAFp?#u%JG+= zm($@m2B;mk%?sh}U?7WdXejDC<0q1Kp9tq@ged9g8=nDR_D$Sz{7=^_Ca9OAJm$}# z`9SeuMA*vtbj9sPn_FCNH||XQ5YwOBnp$7{Ti~;+bn`waPkae{Bn1=!_Ci?~f4&!` z`3%WSk#7_*LSzWuC>b5N7IXTx=*^wIX7z&KTu!>?5dVk>6mrR}J?%Z%!py+pv)5k; zDrxw?u!{g`*56#*I}?q^sP&nuCXf$kwd#%Kswn+M zZiR}`YR0hCiMIT0Y+%W;rp7(|UF!$0o-0@VYR{CZu9F2EYD7Wf_}Mjwr9xafj`->m z^A$}&=FQ2>+r~Fgy(@BUkE;F)pqf-6E|jAlqJ^;TJga}_3Nv=TtBZdJupRLFxpE;( zC*?sochsztLUb|E;?!3(EInJ@3jNe*m0(h*OA``ZS;JKV(EljN`D_8^1qEDT_+l}j z{WO!W+A@m)jHq1j158b(u`~TBsF*+ld2+w)$`;P$wbE&jdJfae4Q3h^bT;9*cLy)3 z9c1X#5+bv3Yx^{zoQyQVFzkG#{0VOe5W*_g0^E53WK0)s2Ccc>0B+dpSFqbJ_Nmp} z-WPV4nPQFjA^UM^4tv&okLVYutL8muknVUf-<&1iXK)TJW=I-G z@bk|{x`CXA+WR%sz57E;bqQ1U?u2bD-3zmlUeWWnm&gq&_$bLRCS$nZee1=t?oa-K zQe99kRMCcP?6O2mxLDi`n*Whv7a==U?of9=J=X25wKbT5C0sRL+JN_L$p-HYdeliA zSE};os)$j7JfE=RXd%!?HcEGOMvggcglcrz8h8FO*4JFEL`G%Xx%W?F+qLfQ4a-?P z4C33s?{eQH6+!&;mKtn0_SKt1J ztBgd5*#>)+g3S2)2-bI-iz{}dJGDurFFhpdo|Q~?YJ@2CRs`8ikCW78h(YH6CUMiS zl7-1ph|T4|WFy)DI6xlH@h?zS>xx|`cC;F)zIC%l>>l<|Yz6h}8hXYf{$kSmk;%{& z+u{A^X(n{W{7Ds&TybA2R=cgMy03U!lGR-4A%7~7`4I=xhapMqJ zUmivDbVai6#;5^8X*g{(W@J%syuo z#?QYui>acNvjOmrSZd%;q0AcS7R)nP;nDa?D!=xXfWXtPmtyu1U*66w6S zb-lCq*+R_^t)Eg=8H%6uL&qJQlcHUsH>T^5jp>(Sc#*8KTCxZ@;I6no(9l zH@wr6MQlw(i!~{Bb&~!fwyWjHSoKr=O`~)Qd#b3}Tr|kzRU;!givznvx7N?B7TuJ z^aQRBl&|$UKVmty%gYUO#y5$giAUUj&0i@E%*A<&ekl~tXi@Y!Uusg(Vy7J|!$Ch! ztTq(p1r{KRN`uYa)ayD0y+0iWA-0R|TIsvPpEUloV!d!Ne5DO3HJBnBZ{)OBum)@1 z_-;3}0snsd;_z3`iu)39#&EHw*Ge_rWlMBwxw+Pps4C%qk~qGqpG@qp^b5poC?t22qQyL)uO2yu4| zh$w`H3#)cbW7Gn0au#-XSNhkzK$Pe_{KppU`?Cyta zIsE17mi`dt$D|lqf8+ixcW`mf1Ghfy>&@TYtGQkU?RiV`FU2?0z!IkDHOtnlqo)$B z6RnK$N3PQtOokr9mp0Qs?F;RIZeBt?1Oyz=Q4?`?kgm5mS#y?O#^Gt3VKgT)sry>QAKyzKL_!04KYw#20~S3sLwXktJnb>k zCywLN+wW70@Xr+K$hX0AOA}YL5pz@B=%pbJH&p2X%X)`*IFJ|n)W0$~dkvJr4}S>u~6L_gN_GrHUsFzjV#R#ivt34@SO)P>=IJ&{}Gx_0M%m z9i-eHb0)W1+B+Vu6-&QRjLq$)(?~5x3>F|dFg&1c?(6GSY-~@hUM&8tMOCqlQPcL_ zOwP+Dr8T-H5cdwnLo_$C!sZQv58g<&0s`F#RJ^fcmUruH<;4<}Nbedo+P=yKDl2Ea z_HK_u6ehmC929Xi7@0fY_A*O)%)L8p1}OG$j?e%23{2)BS5IP>OZg_5&pR~_SEvz;(3MOD=GHQJcn;O4a;+y4b~zT^A+%a3f)YzMRq z`@GwP(lsSB<%_C{k|Rm`TLNSa4#GtOCZ9OZyl=dmf{&07uZxP`%VP!IOOeMy5SxUH z-z_tAKqvDZ=O<5tLomLP0B9vE_!;ZlZSvG^v$-?UMbL-m=$yMu$p52Nyi1>l324D7 zuf7GOXE{ouudch=ES?rQ`kK|8Fl18t6utBSeM+DoNK-1qh*x2u2uvbtxsy5ftzx;t z7Vpi2$mHit*E3IN?0RsfwHwhYeeGNbZi6t80YOUJ3s;%!(g7Vt`RfR8V zoko=`#>oOrFKN+@jQ(#ZSK zH<+vs$EE(F>JwyEy$zWZ_K-POAB#otJxzUWquc?VIKtT5;5a_;SMCY@V;E(%;TskAnmAG7Zldz<# z$x3g)C+;t0#HRSj%&&#vO)vzFS=m^niAVV^C($`msxnFs*geuo@}9h9eBc_Muzdvd zD?kBLmZbJ1BoegGSX4yAu(0sq*UtrD&;fRzp#*mkchV14kOJ*CR7HR!Dn9DCs5h8$ zXMMv!`N*0w7*^gqZr))3$M_mZOGwe(#5a92H%vO-F7l^*NxW&CW9n&&`y+2 znS9;W8RlP$K{$IB!7}%u5(3m=9fzlg6w(aXk&vT4)Jhag+u>a$n&mBc+<8$CnDaBT zCg};?`$gg%Go-$*-Cj*k%;gcHW51r?d(^jOB))L}^F|zt2a@wH3j1myGm0wP#aNgH zn{q}N`+oX`dp595j-j!w%8{CvQK}b@fv7*8nbuf&D z8t1y(2@0FZ{Ofkvy+s1tcK2^=$`No%CSDC%BDjBcY0`JO4*}JY?bHuc>OVmvnNU^7 zsKr$?Ovm4+4gsIx!Aid1G-<6=$`@@=NcAQ)$$+>T1^9XB=BBwT-{SrVXy#Ujt&s}@ z%rjBHk3)soc6UL(>47{nKTVqqM)Xn`9Co8csltXI;QWg71aj!MKhhT`1IkP*Bz23Z z;eoqFtF>;kx42zFuLWqW7+dSpe;X;?&v88iw6Ek1DN@B7 zS>a94Gu#VBo^*TIc`5wZcT@Z;1VR0@13e3t5&;i3iKWn}iG@ZlNPc5rPm{u1S?I<5 zo^ZiO2}0A=Ss)??^5Mw?rO<6rJHF9nC;TH$+HTd2|$%f|~(>|D->ROuT7&>f3`bIxH04_TOg6Ei|hi>E>(KMMFaIuXk> zX7Wbq?Rt`;qvEF$lBA&p<(E1Uu@Mv2qa4m3M6lQn80AT~ZQ1wiG`;LU!x_Oxo@ z;@`U3zNg?a05SSFXi=T?xLw2WX&?bKIlCix_=TMuZqQ?YNSmYxvpY6@LwM7SpHTX` zAsW5#>bjSSCGLG04`cFIx|bE&))!YtJ8S%9&#_kiiX^^u<*AdK)1-#Y>Q~s9t39AH z`h3UfLE95RtUX=S{`fhI)9|y@d;|PUN9%!}6NR1= znNaJfT$M)73}@w}XDr-%m*2}_NOsDZvxw{G+)_WHFj|EQ8|zUIuLinVh}Z0MeLm*f zOD_dct}SYn35~Z{S>f?tUsibXId3gl5vak1%NHB?hm@uWZ(zAwDzfxcfnks-55bfR zU+QjgZA9*n%33^^O8MzSd#n%Wt>67`GBWl*sA-nNh@;c{0z;yxv9YEP?bg)Ayx&{r z)g3-up?`7df=4$k6nDIv**{=}S$~9OdQhD3^^6(U?IZ?u3*GuR2TFME$~lIOAQy-VlC707Ui#Z&Yh3GVfO7IVdsb5yu`G^88f^}fmm47ld390xYo?B zrc+;%$S1C%zdhY=t2ppF4c9o`bKniZRP${2PqSTLRcB`*H?Z|^xQ%6)vZv1!tD{xrog-Kmb!>Tcbm@R9e_Nv6V^jJy!<7|I z#^rn;Jm}@Sa(zB%Eq?28>(TXdUDUvHUcUX~0}1d9m=D*FhxxA${_8LQ z`-6YWS6okez25&`#r5+3c_G&y{ErK{UibgFkbm1({AZv4-yGF{_W9qm&+hr+ShaF0 Wd#?)59$r6nM@~xlP1$SHkN*c38t)1K literal 27382 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
Zw@+NbhYmTgP! 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 L2AUZ4r!W5x*Y;Dj diff --git a/phpunit.ini.dist b/phpunit.ini.dist deleted file mode 100644 index 7fc9a4e9..00000000 --- a/phpunit.ini.dist +++ /dev/null @@ -1,5 +0,0 @@ -[api_context] -aid = ;your_account_id -mid = ;your_merchant_id -portalid = -key = \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index 2ca8063f..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - ./resources/lib/Tests/* - - - - - src - - - - - - - - - - \ No newline at end of file diff --git a/plugin.json b/plugin.json index 7da915ae..2882ce06 100644 --- a/plugin.json +++ b/plugin.json @@ -1,11 +1,11 @@ { - "version": "1.1.10", + "version": "1.1.11", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, "authorIcon":"icon_author_xs.png", "name": "Payone", - "marketplaceName" : {"de":"BS Payone","en":"BS Payone"}, + "marketplaceName" : {"de":"PAYONE","en":"PAYONE"}, "shortDescription": { "de": "Das offizielle Payone plugin für plentymarkets Webshops. Das Payone Plugin setzt einen Checkout-Prozess auf Basis von Ceres voraus.", "en": "The official Payone plugin for plentymarkets online stores" diff --git a/resources/images/logos/PAYONE_PAYONE_CASH_ON_DELIVERY.png b/resources/images/logos/PAYONE_PAYONE_CASH_ON_DELIVERY.png index 3a4d04e13b92be552fe2dc5e622566e868a294cf..f7055f2cbf4dcec3b1cf30388c231d58c0fc68fb 100644 GIT binary patch literal 4582 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 abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000&)qukkoP@L|i zaf;lhfy~!LTMek_=UP2Iz#Vl=3;-aQ4*()!0O0tPidX>ve+d9svjYHy8~|X$5*m$_ zPA_7dEp%NB3;>~13<1uOF#_OIM0WZDWE{Y`zcBz@BjfyoO~?fP)qns1j|Ry9)mWXz zGx+mt`xC)Lvi}^3pg(FkBKSXimUq2dBJMO$VRbBh0l*M`w#ZmRAAUZyvP7F&_*od} zD>!1j#O$3g4$fkCys&3kfYKd>Q|RUFXAi&Q<>~FKa7P*Ow?g3*pV8t7_}>yg4`qaf zfe~CCgL8(cfk1jDI*YPh5kJM z^y!Co`LB|<@4sW64k&(hBQ7Z>A^ykvG*#)0Rk)5rJD*lQ^H-5n`dj(`xPR*?iJuk! zKh69z>EG<>s4CP-;(tDy3blSaza;?ByX$JGn!26qvkJnRjk5pl4-K(lgp#pnmBDX@ zGFVaM7~X0k4YJmx+?XeHpT8gm}tca@&3409eZ`^;mr#rg~ZOtI*YSf92!=!^#S-d2|8`hfNa^tT40Qb@i-kBbVdt>nztH<@vlKwEps;Ro>%VK1p>zq_|$S6d&2#ynQlatKU~;dUw({M1O7; zXVpFu68zU__`qzNOfO4HBDw1I;Vh4*O%jn!Oa}&)_1=&B$9@W>5r&c%B_Vegx!qr8 z*|k_keepmtza}x`V&dY#iu8{9z`-wz-{#8~J33Wu`$xj1iD@rP{UXz@(}Ma#QfLyv z&zaCs8LLx5d_Qkn${a=Pp@u=rt!`7wRC1nK-H$#D?=w(P^COemb4UX1aah{I^c}jn zo?^{PK~Ts<yAWCI!Ftp1Uvnj4r_YoQvY?&)j>PAbX*~^}Ba-#PYY0 zR4D7J+elqw*NRd)-O7av_i}~w)*8uwbRh6AVJrMa!QaW{gC&wR-!VcWqF_U&UA7&* z8(GB(>r-AxG5Q*9B89jBe&-<~el=mi!l6WgPM7E4yufjhNZ!t7SoSB#{6)_uD8X7R zJ#li*1x7BQv*V`vTa$MU8#PwjLlL-OaPsOAq3U`P-F_ow*J!M?C`IW~ z5~KN=Q%lO!LwrE7PM@@9ae&$ST1JuF{M)6Fb8CZU@THND>_@Lg(}Q@;We443M14xu zTWj|R7|R>2h96tPL_r0`b}z)v9rRu?WmBprb1XnHXFWe8_8V+(UHFAcdc2~@8$*(< z)z``nv41;}$wfPC8tAT-cLQ!B3?_sJ$9>FP4qiXPCdw&xLqy*n>k zexi+bOFFpBU|Q=kDn+FpX(St9Ei%SuJA=NhH=M#E+!`m!})vM zLy;VW@5y$Snb5%m=GJu@bn?>eqn5QAiV;W=SoM9baRN{4Ju@?&fwHI@6)}ViIN6?m zq??I+*!#&qwV2KE(G_j<9))LDp!~1Ch*Oh%1qbQ7FL&JKb_8d5h-8vUv2^EiA7|*c zP;JzFX}K`HPCl+Cv58`YP=JgqK6Iy_Z1og+KX_l;(CFYWlD6pK#8C8(?_k3EAh-h` zBTwJw`|)bf=RVSC$u)S;Gt(v4Yw%d9_=kxia}-YGlt@PUM2cRz;q&oQw6Q*$MjL&( z=6r1a`x|B~9`oPc%9&G|gaXa{6=FlQJhy1yCwUiG9VyYMhbf2f|B_NufLt`+t*sf7$B0F_!yh8p?wOi0R1p9 z0pvxO$mwK}43})5y>?&z!nKhfjmq%17-)9J6Mw^<{SG0)uE{j0xG^LDpYa|_bV>F?3qtO^A|ItzInZ*q3Mg{A~ZBne{Gku)*~Zht>n5wbvvc7 z`L(6@bB{VlI9askJMBT+L4Q^q*~+~Xb@rO5+UBb_A5GAKFiz}WG8wHsy}YQ_ByMM%8gA(VyJ5!X!hr-fjjqeK(bcajbR+%+~CQ&-7EkX%4MTjDnxPJ9IaKm4XlovidSqU@i z?>lXw%Ez4b0hi)1$IWM8x?W{+W3QjObAWckvfZw##uFWq^zBb}vYTnV3E2`4BEM+v zdm43?+I*wEpxTNYnvl{iV7W0j@j(z5rRzn(+x+f$+M_{*K2Q6#hRE8R)OQffU z0LNiZXmo5OFL9t+`650AuD9YTF!4YRaK>3Yi_0a6WZ&rw)-4%`60X`t515^Vh{s~g zF3fP|+#P5ZAL8KB2>tk^e0DaUM`uG+V?XG&qP6-4?$(^D8mDHtZ059R!y4Xsm3&P2 zV6Vx2Hk-MVR-m)$1V&aXSXDU_m=~6Zk0Wvs^R*rBH!-|+fqf9J=T{Yl-PzG@@KUql zo-yM!)AU{<)aNfDZFTDhrOi32BZMpGI%e=Y&RY<7RkW5CH=12k{zmF_vV+xqJ0w&? z(GH$xii)>x2!X0cHup+qF*yf}d55VAZd%i1s@RnCe=k|fi%ho&-u9M-?Hcu-kXN_y ztgzjO)GzmsTQD^=#@%d0FQ}Bs#d>@ZBW6B{xGcwT@-gVUEov#0S7ceAeAF)l+Yfz} zDc+NzSGyver)8DhT{ybUU0f%v!ro_TRH-PxH@hoa?n47p*Meim=F80CZnXIG{`c`6 zAASab|(h7xsGDkO@swvBg7eenq`cSzMv`DkgnwA7jQJNo>9z4DDo7|4O7G zpHZKfnrEV)HhO9VQs1re`z&4hIVMBHx2ItRTj>8CnxB@&m%4~tvE24Fus~pYSJ4kx zDJQ6u;mE%tiB;EAwe72>tu%dW+iMG$1#h*w8iX-)=?bOGE>?|2nj?xCflrE6@s6>VUtm zKWn~BWUh2Au9?ac8TZ2F*-A&6Gz@=wUP2M#Ghl~b#xW;g@98<9+BJDOzOXIke2sC) zYm+%x!J$;3l&OtX2SMN8|GNFIlGDd-*;G~(=jHEY{UH5KcxRkGm`;AK`UbLvqm81N zTH<}A-3~4Lfdi={6@X2rWp z3w3V1<1R*LPcDNh3C*D^L(+-yvf?pa>iWt8tx4e)e75$#Xy!>?>t1DAP2 zWWRqpXQ^|X%G|t3s?@XD+}}67x>agkM1kkD##MY~EjQ9;VJ;K$D3B{?ci0t)Vo|Cc zvaLVIPkR+l$JTBV5H*ToOiAY_`*4Sr0t=N|?2XeI(6rKc9kbanE9hYZon}w{D%SQJ z+O{EQ$9u)cfuZH)bH2Fc-`B>hpTc=0>)sxx*A>UV=kA+jpDc?Y4+X4>5nn{3 zF#^U~qBhY;tbJIg#-y#adDu>BJ8jZB$xN+n)0$@bNF!=HNq;&qHYO^Xs_`)zjRrNS zi1+|SSe^?D3;X*0PXAb0fjHBuyFX{opXcoC{eA8|_uPBVJ+xuR5iFZK4Plu?JC1D3 z*?GL?Yc&lW%PQ+!*)ESC%!s)VL%KiPd1=YRd4F3uf9h^h>CcROy9U)?AAzz;m)dUB zWuI>Iuejg|Eq}b$%jq6yAroL0GDaA+c8IV9QsTg^Q_{StGe)Yrrlz&UWjnCgye$4)-?I&J8bG2=8 zZy*E+f+E6zUZcXI>7&+c{>h@306-1}aJk)!T&E4pZv78F36&jc=fwp6pL5;kXc-24 zR+3E1Rwj3UE`aH@^~m|>6^8==S;p8*M|s{*`?~OAGK5--T&E2Hu<}UYnNQqusrWzO z`c{hou7B&nq+@PgU!_aYiVqL}W%$wRhSiG0F(cJ(;-U7$H&%aZRyP0;5nOH$0ATak z=7MT3o{|~r+uhD80?u}$@WU(Jb42-PHA|Y@UbUid2yYxqf_CrICF4H@fOkKx000cJ znE?R1TX>EqgxougZ$TM2*NyLqi`Uz~4N@2mfPdMjLvo_-(3}VJuLHmn#S_PYt*W*Zun7YB>)JOx*vOwnu!Y90!X~uX%8|%uo9>EAkk}7oRO4RNkol< zZGW$y>a=)*T;${E%(}om5Mp%B$j{mX0Dix3fbDWXliV6Wk%~Az0SSOfuW5Sa$w$fo zK&R73Y;_GyB1t6`HU(ga)`uw%NW>F!QmTlktG`|f`my$stiIffc|nd|P*C1QB{@_w zDSI0Lba*@wwMwJIj5K3nqYou2aQp%$TYn7RXG;s;1puqrjJ_)x0Ko5?UFU;3ns*Lm z0cFO-;VB1+$lK7;7Ev#La~}X;f4jVxqkLv53&@OFH{3HVIVqz4*YbzKEGN|VVwRdX zP63&bkz@+2dZKXat<3+fZkb!}7shDcIfR121*0<^2Z^X-)vN!EsGB>(!E|3Mmwy7$ zzjP?-qO-;idj|l1_uMxlI;X`1X4ahZqF5D!F@;jWC1;2gNoM1YzPzu$Y_D#5yfq{& zh-bi*B=g=aN2=NfXAS`HK?@ZLhAMsm2^c@jvGW&;rb_)YhZ|?0rnZNR0FF~YnUUcz zp~D;aXxg}uQbZjJ007=U@0#V7D1SLtIgKKK=?-&+JyF{_U|_Wt0I;)F%pkywcm)(H zfdrj;`)kiEaDVY=>`JWn;r^fuO?(0}Bh_w%M$mC0^7q?!0DwQA>KfH0AzhB;1jias zuU4HJo$0s)0CkNm=zmO9bgQNikb`&yBq3nXX-@op#iLgMAS*Swf9=KC8GpiLPY7y? zOF#zfMm-O6n5u{?^V{`+u!kgmO}CC;Pi+pRB2n ztX>JTqgi`V9FQ0tr4NnT2Y&zozklG_uhyow1$deY9G`#$z+uw6pPD!A5CCX(x`?f& z-X(+-oZRRqMc#X214tx~%T7K_MBes}&H=VJuR~MYi$$_R?*%ad6cUF@3UapsfZaMU z%^PFYnq7VrE8(6o159-!dRII){lKkkJ^s+_t3FcfIWqcy5@TGJ<9|OyNVOuaZr9ou?B^kq0?Yn=y3ck}vb zNC;;Sd)h>)O2no#s0g51qr#}6wr!hMeO1!w^@CzhtMhUXPXe=uPe7TGA#nPbE;&cTlKOigKjRQ3SV*D^i7i9Ua+%v;r_L+2=N+Oc3)He+< zzg!_r2{Pp>-HpQl%qnIv)M+V$e0Rg^RAT?q+4)rfFg!gaQhxz}b6$ENAhA>F<&zmm zGvJ(8EMvp=5G|{y?;1*SVjwwg(RC5C+fr96Ytg7 z#@6=mYHvu{UcVp%L$qibYr^uesn+X}vDa+eoxkT)?Q6#_G|upcq;U7|;673gyCozE zd6|y-MTKJ)|8nW%I#ZQzUdnehErCJ)&I0QACN zci=bQop}ppFDfr~Xv;o2G4JHXrl+sAdWsu6dbGWg3@}3@1gr)Pa#F3=#%4MH{*{6e z>lYU0cl4!1%xvoQb|?R#s=IWrn|{_D5Eh{ToSMSXGR;8ehU@u_N7FQKPtHhc1_1o_ abNm-)hixrV$dsx80000&)qukkoP@L|i zaf;lhfy~!LTMek_=UP2Iz#Vl=3;-aQ4*()!0O0tPidX>ve+d9svjYHy8~|X$5*m$_ zPA_7dEp%NB3;>~13<1uOF#_OIM0WZDWE{Y`zcBz@BjfyoO~?fP)qns1j|Ry9)mWXz zGx+mt`xC)Lvi}^3pg(FkBKSXimUq2dBJMO$VRbBh0l*M`w#ZmRAAUZyvP7F&_*od} zD>!1j#O$3g4$fkCys&3kfYKd>Q|RUFXAi&Q<>~FKa7P*Ow?g3*pV8t7_}>yg4`qaf zfe~CCgL8(cfk1jDI*YPh5kJM z^y!Co`LB|<@4sW64k&(hBQ7Z>A^ykvG*#)0Rk)5rJD*lQ^H-5n`dj(`xPR*?iJuk! zKh69z>EG<>s4CP-;(tDy3blSaza;?ByX$JGn!26qvkJnRjk5pl4-K(lgp#pnmBDX@ zGFVaM7~X0k4YJmx+?XeHpT8gm}tca@&3409eZ`^;mr#rg~ZOtI*YSf92!=!^#S-d2|8`hfNa^tT40Qb@i-kBbVdt>nztH<@vlKwEps;Ro>%VK1p>zq_|$S6d&2#ynQlatKU~;dUw({M1O7; zXVpFu68zU__`qzNOfO4HBDw1I;Vh4*O%jn!Oa}&)_1=&B$9@W>5r&c%B_Vegx!qr8 z*|k_keepmtza}x`V&dY#iu8{9z`-wz-{#8~J33Wu`$xj1iD@rP{UXz@(}Ma#QfLyv z&zaCs8LLx5d_Qkn${a=Pp@u=rt!`7wRC1nK-H$#D?=w(P^COemb4UX1aah{I^c}jn zo?^{PK~Ts<yAWCI!Ftp1Uvnj4r_YoQvY?&)j>PAbX*~^}Ba-#PYY0 zR4D7J+elqw*NRd)-O7av_i}~w)*8uwbRh6AVJrMa!QaW{gC&wR-!VcWqF_U&UA7&* z8(GB(>r-AxG5Q*9B89jBe&-<~el=mi!l6WgPM7E4yufjhNZ!t7SoSB#{6)_uD8X7R zJ#li*1x7BQv*V`vTa$MU8#PwjLlL-OaPsOAq3U`P-F_ow*J!M?C`IW~ z5~KN=Q%lO!LwrE7PM@@9ae&$ST1JuF{M)6Fb8CZU@THND>_@Lg(}Q@;We443M14xu zTWj|R7|R>2h96tPL_r0`b}z)v9rRu?WmBprb1XnHXFWe8_8V+(UHFAcdc2~@8$*(< z)z``nv41;}$wfPC8tAT-cLQ!B3?_sJ$9>FP4qiXPCdw&xLqy*n>k zexi+bOFFpBU|Q=kDn+FpX(St9Ei%SuJA=NhH=M#E+!`m!})vM zLy;VW@5y$Snb5%m=GJu@bn?>eqn5QAiV;W=SoM9baRN{4Ju@?&fwHI@6)}ViIN6?m zq??I+*!#&qwV2KE(G_j<9))LDp!~1Ch*Oh%1qbQ7FL&JKb_8d5h-8vUv2^EiA7|*c zP;JzFX}K`HPCl+Cv58`YP=JgqK6Iy_Z1og+KX_l;(CFYWlD6pK#8C8(?_k3EAh-h` zBTwJw`|)bf=RVSC$u)S;Gt(v4Yw%d9_=kxia}-YGlt@PUM2cRz;q&oQw6Q*$MjL&( z=6r1a`x|B~9`oPc%9&G|gaXa{6=FlQJhy1yCwUiG9VyYMhbf2f|B_NufLt`+t*sf7$B0F_!yh8p?wOi0R1p9 z0pvxO$mwK}43})5y>?&z!nKhfjmq%17-)9J6Mw^<{SG0)uE{j0xG^LDpYa|_bV>F?3qtO^A|ItzInZ*q3Mg{A~ZBne{Gku)*~Zht>n5wbvvc7 z`L(6@bB{VlI9askJMBT+L4Q^q*~+~Xb@rO5+UBb_A5GAKFiz}WG8wHsy}YQ_ByMM%8gA(VyJ5!X!hr-fjjqeK(bcajbR+%+~CQ&-7EkX%4MTjDnxPJ9IaKm4XlovidSqU@i z?>lXw%Ez4b0hi)1$IWM8x?W{+W3QjObAWckvfZw##uFWq^zBb}vYTnV3E2`4BEM+v zdm43?+I*wEpxTNYnvl{iV7W0j@j(z5rRzn(+x+f$+M_{*K2Q6#hRE8R)OQffU z0LNiZXmo5OFL9t+`650AuD9YTF!4YRaK>3Yi_0a6WZ&rw)-4%`60X`t515^Vh{s~g zF3fP|+#P5ZAL8KB2>tk^e0DaUM`uG+V?XG&qP6-4?$(^D8mDHtZ059R!y4Xsm3&P2 zV6Vx2Hk-MVR-m)$1V&aXSXDU_m=~6Zk0Wvs^R*rBH!-|+fqf9J=T{Yl-PzG@@KUql zo-yM!)AU{<)aNfDZFTDhrOi32BZMpGI%e=Y&RY<7RkW5CH=12k{zmF_vV+xqJ0w&? z(GH$xii)>x2!X0cHup+qF*yf}d55VAZd%i1s@RnCe=k|fi%ho&-u9M-?Hcu-kXN_y ztgzjO)GzmsTQD^=#@%d0FQ}Bs#d>@ZBW6B{xGcwT@-gVUEov#0S7ceAeAF)l+Yfz} zDc+NzSGyver)8DhT{ybUU0f%v!ro_TRH-PxH@hoa?n47p*Meim=F80CZnXIG{`c`6 zAASab|(h7xsGDkO@swvBg7eenq`cSzMv`DkgnwA7jQJNo>9z4DDo7|4O7G zpHZKfnrEV)HhO9VQs1re`z&4hIVMBHx2ItRTj>8CnxB@&m%4~tvE24Fus~pYSJ4kx zDJQ6u;mE%tiB;EAwe72>tu%dW+iMG$1#h*w8iX-)=?bOGE>?|2nj?xCflrE6@s6>VUtm zKWn~BWUh2Au9?ac8TZ2F*-A&6Gz@=wUP2M#Ghl~b#xW;g@98<9+BJDOzOXIke2sC) zYm+%x!J$;3l&OtX2SMN8|GNFIlGDd-*;G~(=jHEY{UH5KcxRkGm`;AK`UbLvqm81N zTH<}A-3~4Lfdi={6@X2rWp z3w3V1<1R*LPcDNh3C*D^L(+-yvf?pa>iWt8tx4e)e75$#Xy!>?>t1DAP2 zWWRqpXQ^|X%G|t3s?@XD+}}67x>agkM1kkD##MY~EjQ9;VJ;K$D3B{?ci0t)Vo|Cc zvaLVIPkR+l$JTBV5H*ToOiAY_`*4Sr0t=N|?2XeI(6rKc9kbanE9hYZon}w{D%SQJ z+O{EQ$9u)cfuZH)bH2Fc-`B>hpTc=0>)sxx*A>UV=kA+jpDc?Y4+X4>5nn{3 zF#^U~qBhY;tbJIg#-y#adDu>BJ8jZB$xN+n)0$@bNF!=HNq;&qHYO^Xs_`)zjRrNS zi1+|SSe^?D3;X*0PXAb0fjHBuyFX{opXcoC{eA8|_uPBVJ+xuR5iFZK4Plu?JC1D3 z*?GL?Yc&lW%PQ+!*)ESC%!s)VL%KiPd1=YRd4F3uf9h^h>CcROy9U)?AAzz;m)dUB zWuI>Iuejg|Eq}b$%jq6yAroL0GDaA+c8IV9QsTg^Q_{StGe)Yrrlz&UWjnCgye$4)-?I&J8bG2=8 zZy*E+f+E6zUZcXI>7&+c{>h@306-1}aJk)!T&E4pZv78F36&jc=fwp6pL5;kXc-24 zR+3E1Rwj3UE`aH@^~m|>6^8==S;p8*M|s{*`?~OAGK5--T&E2Hu<}UYnNQqusrWzO z`c{hou7B&nq+@PgU!_aYiVqL}W%$wRhSiG0F(cJ(;-U7$H&%aZRyP0;5nOH$0ATak z=7MT3o{|~r+uhD80?u}$@WU(Jb42-PHA|Y@UbUid2yYxqf_CrICF4H@fOkKx000cJ znE?R1TX>EqgxougZ$TM2*NyLqi`Uz~4N@2mfPdMjLvo_-(3}VJuLHmn#S_PYt*W*Zun7YB>)JOx*vOwnu!Y90!X~uX%8|%uo9>EAkk}7oRO4RNkol< zZGW$y>a=)*T;${E%(}om5Mp%B$j{mX0Dix3fbDWXliV6Wk%~Az0SSOfuW5Sa$w$fo zK&R73Y;_GyB1t6`HU(ga)`uw%NW>F!QmTlktG`|f`my$stiIffc|nd|P*C1QB{@_w zDSI0Lba*@wwMwJIj5K3nqYou2aQp%$TYn7RXG;s;1puqrjJ_)x0Ko5?UFU;3ns*Lm z0cFO-;VB1+$lK7;7Ev#La~}X;f4jVxqkLv53&@OFH{3HVIVqz4*YbzKEGN|VVwRdX zP63&bkz@+2dZKXat<3+fZkb!}7shDcIfR121*0<^2Z^X-)vN!EsGB>(!E|3Mmwy7$ zzjP?-qO-;idj|l1_uMxlI;X`1X4ahZqF5D!F@;jWC1;2gNoM1YzPzu$Y_D#5yfq{& zh-bi*B=g=aN2=NfXAS`HK?@ZLhAMsm2^c@jvGW&;rb_)YhZ|?0rnZNR0FF~YnUUcz zp~D;aXxg}uQbZjJ007=U@0#V7D1SLtIgKKK=?-&+JyF{_U|_Wt0I;)F%pkywcm)(H zfdrj;`)kiEaDVY=>`JWn;r^fuO?(0}Bh_w%M$mC0^7q?!0DwQA>KfH0AzhB;1jias zuU4HJo$0s)0CkNm=zmO9bgQNikb`&yBq3nXX-@op#iLgMAS*Swf9=KC8GpiLPY7y? zOF#zfMm-O6n5u{?^V{`+u!kgmO}CC;Pi+pRB2n ztX>JTqgi`V9FQ0tr4NnT2Y&zozklG_uhyow1$deY9G`#$z+uw6pPD!A5CCX(x`?f& z-X(+-oZRRqMc#X214tx~%T7K_MBes}&H=VJuR~MYi$$_R?*%ad6cUF@3UapsfZaMU z%^PFYnq7VrE8(6o159-!dRII){lKkkJ^s+_t3FcfIWqcy5@TGJ<9|OyNVOuaZr9ou?B^kq0?Yn=y3ck}vb zNC;;Sd)h>)O2no#s0g51qr#}6wr!hMeO1!w^@CzhtMhUXPXe=uPe7TGA#nPbE;&cTlKOigKjRQ3SV*D^i7i9Ua+%v;r_L+2=N+Oc3)He+< zzg!_r2{Pp>-HpQl%qnIv)M+V$e0Rg^RAT?q+4)rfFg!gaQhxz}b6$ENAhA>F<&zmm zGvJ(8EMvp=5G|{y?;1*SVjwwg(RC5C+fr96Ytg7 z#@6=mYHvu{UcVp%L$qibYr^uesn+X}vDa+eoxkT)?Q6#_G|upcq;U7|;673gyCozE zd6|y-MTKJ)|8nW%I#ZQzUdnehErCJ)&I0QACN zci=bQop}ppFDfr~Xv;o2G4JHXrl+sAdWsu6dbGWg3@}3@1gr)Pa#F3=#%4MH{*{6e z>lYU0cl4!1%xvoQb|?R#s=IWrn|{_D5Eh{ToSMSXGR;8ehU@u_N7FQKPtHhc1_1o_ abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000&)qukkoP@L|i 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 abNm-)hixrV$dsx80000 Date: Tue, 3 Mar 2020 11:36:05 +0100 Subject: [PATCH 071/107] update changelog --- meta/documents/changelog_de.md | 3 --- meta/documents/changelog_en.md | 3 --- 2 files changed, 6 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index dd615a3a..a8df3660 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -4,9 +4,6 @@ ### Geändert - Logos und Bilder getauscht - -## X.X.X (2019-12-18) -### Geändert - Funktionalitäten hinzugefügt für Backend-Sichtbarkeiten und Backend-Name ## 1.1.10 (2019-12-09) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 25cf4740..a829bc04 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -4,9 +4,6 @@ ### Changed - New logos and images - -## X.X.X (2019-12-18) -### Changed - Added methods for the backend visibility and backend name ## 1.1.10 (2019-12-09) From ebedaabdc9a99635a4fa6b9939dc95ad459dc702 Mon Sep 17 00:00:00 2001 From: Christopher Tohme Date: Mon, 9 Mar 2020 08:55:55 +0100 Subject: [PATCH 072/107] cleanup data logging - almost all request and responses performed by the payone sdk were logged as critical, sometimes with or without data. This led to confusing customer feedback. - updated logging to debug - changed deprecated methods --- meta/documents/changelog_de.md | 5 +++++ meta/documents/changelog_en.md | 5 +++++ plugin.json | 2 +- src/Adapter/Logger.php | 32 ++++++++-------------------- src/Controllers/StatusController.php | 5 ++--- src/Services/Api.php | 17 +++++++-------- 6 files changed, 30 insertions(+), 36 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index a8df3660..71aec609 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,10 @@ # Release Notes für PAYONE +## 1.1.12 (2020-03-09) + +### Geändert +- Logging des Datenaustausches zur Payone Schnittstelle optimiert. + ## 1.1.11 (2020-03-03) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index a829bc04..97f07b7e 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,10 @@ # Release Notes for PAYONE +## 1.1.12 (2020-03-09) + +### Geändert +- Optimized logging of the data transfer with the Payone Api. + ## 1.1.11 (2020-03-03) ### Changed diff --git a/plugin.json b/plugin.json index 2882ce06..452cf363 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.11", + "version": "1.1.12", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, diff --git a/src/Adapter/Logger.php b/src/Adapter/Logger.php index f3276e7b..85a77c11 100644 --- a/src/Adapter/Logger.php +++ b/src/Adapter/Logger.php @@ -53,8 +53,7 @@ public function __construct(ShopHelper $shopHelper) public function setIdentifier(string $identifier) { $this->logger = $this->getLogger($identifier); - $this->logger->setReferenceType($this->referenceType); - $this->logger->setReferenceValue($this->referenceValue); + $this->addReference($this->referenceType, $this->referenceValue); return $this; } @@ -183,30 +182,17 @@ public function logException( $this->getPlentyLogger()->logException($exception); return $this; } - - /** - * @param string $referenceType - * - * @return Logger - */ - public function setReferenceType( - string $referenceType - ) { - $this->referenceType = $referenceType; - $this->logger->setReferenceType($referenceType); - return $this; - } - + /** - * @param $referenceValue + * Adds a reference to the current logger instance, for a more understanding log message. * - * @return Logger + * @param string $referenceType The reference type to be added to the log (e.g. orderId) + * @param string $referenceValue The reference value for the current log message. + * @return $this */ - public function setReferenceValue( - $referenceValue - ) { - $this->referenceValue = $referenceValue; - $this->logger->setReferenceValue($referenceValue); + public function addReference($referenceType, $referenceValue) + { + $this->logger->addReference($referenceType, $referenceValue); return $this; } diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index 8b1e9d54..448121c3 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -71,9 +71,8 @@ public function index() } $this->logger->setIdentifier(__METHOD__); - $this->logger->setReferenceType(Logger::PAYONE_REQUEST_REFERENCE); - $this->logger->setReferenceValue($txid); - $this->logger->critical('Controller.Status', $this->request->all()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE,$txid); + $this->logger->debug('Controller.Status', $this->request->all()); if ($this->request->get('key') != md5($this->config->get('key'))) { return; diff --git a/src/Services/Api.php b/src/Services/Api.php index 30badd8c..9a0da534 100644 --- a/src/Services/Api.php +++ b/src/Services/Api.php @@ -70,7 +70,7 @@ public function doAuth($requestParams): AuthResponse $responseObject = AuthResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; @@ -89,7 +89,7 @@ public function doPreAuth($requestParams): PreAuthResponse $response = $this->doLibCall((self::REQUEST_TYPE_PRE_AUTH), $requestParams); $responseObject = PreAuthResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_PRE_AUTH), $response); return $responseObject; @@ -109,7 +109,7 @@ public function doReversal($requestParams): Response $responseObject = ResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_REVERSAL), $response); return $responseObject; @@ -129,7 +129,7 @@ public function doCapture($requestParams): Response $responseObject = ResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_CAPTURE), $response); return $responseObject; @@ -149,7 +149,7 @@ public function doRefund($requestParams): Response $responseObject = ResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; @@ -167,7 +167,7 @@ public function doReAuth($requestParams): Response $responseObject = ResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; @@ -185,7 +185,7 @@ public function doDebit($requestParams): Response $responseObject = ResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_AUTH), $response); return $responseObject; @@ -203,7 +203,7 @@ public function doManagemandate($requestParams): ManagemandateResponse $responseObject = ManagemandateResponseFactory::create($response); - $this->logger->setReferenceValue($responseObject->getTransactionID()); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_MANAGEMANDATE), $response); return $responseObject; @@ -217,7 +217,6 @@ public function doManagemandate($requestParams): ManagemandateResponse */ public function doLibCall($call, $requestParams): array { - $this->logger->setReferenceType(Logger::PAYONE_REQUEST_REFERENCE); $this->logger->debug('Api.' . $this->getCallAction($call), $requestParams); try { From 8648e8cfc98eca08d3619f84255acab57f1f0b81 Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Fri, 29 May 2020 10:13:15 +0200 Subject: [PATCH 073/107] added getBackend icon logic --- src/Methods/PaymentAbstract.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 47211e11..4f4f35d2 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -4,10 +4,10 @@ use Payone\Adapter\Config as ConfigAdapter; use Payone\PluginConstants; -use Plenty\Modules\Payment\Method\Contracts\PaymentMethodService; +use Plenty\Modules\Payment\Method\Services\PaymentMethodBaseService; use Plenty\Plugin\Application; -abstract class PaymentAbstract extends PaymentMethodService +abstract class PaymentAbstract extends PaymentMethodBaseService { const PAYMENT_CODE = 'Payone'; @@ -45,7 +45,7 @@ public function __construct( /** * @return bool */ - public function isActive() + public function isActive(): bool { return (bool) $this->configRepo->get($this::PAYMENT_CODE . '.active') && $this->paymentValidator->validate($this); @@ -172,4 +172,16 @@ public function canHandleSubscriptions():bool { return false; } + + /** + * Get the url for the backend icon + * + * @return string + */ + public function getBackendIcon(): string + { + $app = pluginApp(Application::class); + $icon = $app->getUrlPath(PluginConstants::NAME).'/images/logos/'.strtolower($this::PAYMENT_CODE).'_backend_icon.svg'; + return $icon; + } } From 2dd279e08eb486b685f11e9b71f6bde902c1f734 Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Thu, 4 Jun 2020 12:48:44 +0200 Subject: [PATCH 074/107] PaymentMethodBaseService adaptions --- src/Methods/PaymentAbstract.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 4f4f35d2..68734fd9 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -54,9 +54,10 @@ public function isActive(): bool /** * Get shown name * + * @param string $lang * @return string */ - public function getName(): string + public function getName(string $lang = 'de'): string { $name = $this->configRepo->get($this::PAYMENT_CODE . '.name'); @@ -72,9 +73,10 @@ public function getFee(): float } /** + * @param string $lang * @return string */ - public function getIcon(): string + public function getIcon(string $lang = 'de'): string { $pluginPath = $this->app->getUrlPath(PluginConstants::NAME); @@ -82,9 +84,10 @@ public function getIcon(): string } /** + * @param string $lang * @return string */ - public function getDescription(): string + public function getDescription(string $lang = 'de'): string { $description = $this->configRepo->get($this::PAYMENT_CODE . '.description'); @@ -158,7 +161,7 @@ public function isBackendActive():bool * @param string $lang * @return string */ - public function getBackendName(string $lang):string + public function getBackendName(string $lang = 'de'):string { return $this->getName(); } From 4a0247f98fc6ca79468422dccaf9d1afabd3a408 Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Thu, 4 Jun 2020 14:10:08 +0200 Subject: [PATCH 075/107] added backendIcons --- meta/images/logos/payone_payone_amazon_pay_backend_icon.svg | 3 +++ .../logos/payone_payone_cash_on_delivery_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_credit_card_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_direct_debit_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_invoice_backend_icon.svg | 3 +++ .../images/logos/payone_payone_invoice_secure_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_pay_pal_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_paydirekt_backend_icon.svg | 3 +++ .../payone_payone_payolution_installment_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_pre_payment_backend_icon.svg | 3 +++ .../logos/payone_payone_ratepay_installment_backend_icon.svg | 3 +++ meta/images/logos/payone_payone_sofort_backend_icon.svg | 3 +++ 12 files changed, 36 insertions(+) create mode 100644 meta/images/logos/payone_payone_amazon_pay_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_credit_card_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_direct_debit_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_invoice_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_invoice_secure_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_pay_pal_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_paydirekt_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_payolution_installment_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_pre_payment_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg create mode 100644 meta/images/logos/payone_payone_sofort_backend_icon.svg diff --git a/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg b/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg b/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_credit_card_backend_icon.svg b/meta/images/logos/payone_payone_credit_card_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_credit_card_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_direct_debit_backend_icon.svg b/meta/images/logos/payone_payone_direct_debit_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_direct_debit_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_invoice_backend_icon.svg b/meta/images/logos/payone_payone_invoice_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_invoice_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg b/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_pay_pal_backend_icon.svg b/meta/images/logos/payone_payone_pay_pal_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_pay_pal_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_paydirekt_backend_icon.svg b/meta/images/logos/payone_payone_paydirekt_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_paydirekt_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg b/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_pre_payment_backend_icon.svg b/meta/images/logos/payone_payone_pre_payment_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_pre_payment_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg b/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/meta/images/logos/payone_payone_sofort_backend_icon.svg b/meta/images/logos/payone_payone_sofort_backend_icon.svg new file mode 100644 index 00000000..2fd501e5 --- /dev/null +++ b/meta/images/logos/payone_payone_sofort_backend_icon.svg @@ -0,0 +1,3 @@ + + + From b99ff7991abed56929a6ffa5ca1a80c0f3a5ecea Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Thu, 4 Jun 2020 14:41:47 +0200 Subject: [PATCH 076/107] added changelog --- meta/documents/changelog_de.md | 4 ++++ meta/documents/changelog_en.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 71aec609..eca40612 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,5 +1,9 @@ # Release Notes für PAYONE +## 1.1.13 (2020-06-04) +### Geändert +- Icon für das Backend hinzugefügt + ## 1.1.12 (2020-03-09) ### Geändert diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 97f07b7e..19a225b0 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,5 +1,9 @@ # Release Notes for PAYONE +## 1.1.13 (2020-06-04) +### Geändert +- Added Icon for the backend + ## 1.1.12 (2020-03-09) ### Geändert From 2f4e4c282db280b90644b53b1f56fbf098bb71cd Mon Sep 17 00:00:00 2001 From: Kevin Fink Date: Fri, 5 Jun 2020 11:37:34 +0200 Subject: [PATCH 077/107] payone logo update --- .../logos/payone_payone_amazon_pay_backend_icon.svg | 8 ++++++-- .../logos/payone_payone_cash_on_delivery_backend_icon.svg | 8 ++++++-- .../logos/payone_payone_credit_card_backend_icon.svg | 8 ++++++-- .../logos/payone_payone_direct_debit_backend_icon.svg | 8 ++++++-- meta/images/logos/payone_payone_invoice_backend_icon.svg | 8 ++++++-- .../logos/payone_payone_invoice_secure_backend_icon.svg | 8 ++++++-- meta/images/logos/payone_payone_pay_pal_backend_icon.svg | 8 ++++++-- .../images/logos/payone_payone_paydirekt_backend_icon.svg | 8 ++++++-- .../payone_payone_payolution_installment_backend_icon.svg | 8 ++++++-- .../logos/payone_payone_pre_payment_backend_icon.svg | 8 ++++++-- .../payone_payone_ratepay_installment_backend_icon.svg | 8 ++++++-- meta/images/logos/payone_payone_sofort_backend_icon.svg | 8 ++++++-- 12 files changed, 72 insertions(+), 24 deletions(-) diff --git a/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg b/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg +++ b/meta/images/logos/payone_payone_amazon_pay_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg b/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg +++ b/meta/images/logos/payone_payone_cash_on_delivery_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_credit_card_backend_icon.svg b/meta/images/logos/payone_payone_credit_card_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_credit_card_backend_icon.svg +++ b/meta/images/logos/payone_payone_credit_card_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_direct_debit_backend_icon.svg b/meta/images/logos/payone_payone_direct_debit_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_direct_debit_backend_icon.svg +++ b/meta/images/logos/payone_payone_direct_debit_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_invoice_backend_icon.svg b/meta/images/logos/payone_payone_invoice_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_invoice_backend_icon.svg +++ b/meta/images/logos/payone_payone_invoice_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg b/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg +++ b/meta/images/logos/payone_payone_invoice_secure_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_pay_pal_backend_icon.svg b/meta/images/logos/payone_payone_pay_pal_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_pay_pal_backend_icon.svg +++ b/meta/images/logos/payone_payone_pay_pal_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_paydirekt_backend_icon.svg b/meta/images/logos/payone_payone_paydirekt_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_paydirekt_backend_icon.svg +++ b/meta/images/logos/payone_payone_paydirekt_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg b/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg +++ b/meta/images/logos/payone_payone_payolution_installment_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_pre_payment_backend_icon.svg b/meta/images/logos/payone_payone_pre_payment_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_pre_payment_backend_icon.svg +++ b/meta/images/logos/payone_payone_pre_payment_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg b/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg +++ b/meta/images/logos/payone_payone_ratepay_installment_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/meta/images/logos/payone_payone_sofort_backend_icon.svg b/meta/images/logos/payone_payone_sofort_backend_icon.svg index 2fd501e5..0e047987 100644 --- a/meta/images/logos/payone_payone_sofort_backend_icon.svg +++ b/meta/images/logos/payone_payone_sofort_backend_icon.svg @@ -1,3 +1,7 @@ - - + + + + + + From 08bfab2554cc6d5103cba22c3d993994721c5a8b Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 30 Jun 2020 13:31:53 +0200 Subject: [PATCH 078/107] update lib --- .../Request/Authorization/InvoiceSecure.php | 8 ++++---- .../lib/PayoneApi/Request/Parts/CartFactory.php | 6 +++--- resources/lib/PayoneApi/Request/Parts/CartItem.php | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/lib/PayoneApi/Request/Authorization/InvoiceSecure.php b/resources/lib/PayoneApi/Request/Authorization/InvoiceSecure.php index 036099fa..4235085d 100644 --- a/resources/lib/PayoneApi/Request/Authorization/InvoiceSecure.php +++ b/resources/lib/PayoneApi/Request/Authorization/InvoiceSecure.php @@ -16,7 +16,7 @@ class InvoiceSecure extends AuthorizationRequestAbstract protected $clearingtype = ClearingTypes::REC; - protected $subclearingtype = self::PAYONE_INVOICE_CLEARING_TYPE; + protected $clearingsubtype = self::PAYONE_INVOICE_CLEARING_TYPE; /** * @var Cart */ @@ -37,13 +37,13 @@ public function __construct( } /** - * Getter for Subclearingtype + * Getter for clearingsubtype * * @return string */ - public function getSubclearingtype() + public function getClearingsubtype() { - return $this->subclearingtype; + return $this->clearingsubtype; } /** diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index 9a227568..52105faa 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -14,7 +14,7 @@ static public function create(array $requestData) $cart = new Cart(); foreach ($requestData['basketItems'] as $i => $cartItemData) { $cartItem = new CartItem( - $i, + ($i+1), $cartItemData['itemId'], CartItem::TYPE_GOODS, $cartItemData['quantity'] ?? '', @@ -44,7 +44,7 @@ private static function calculateShipping(array $requestData, Cart $cart) ); } $shippingCost = new CartItem( - count($cart->getCartItems()), + (count($cart->getCartItems())+1), 'shipping', CartItem::TYPE_SHIPMENt, 1, @@ -54,4 +54,4 @@ private static function calculateShipping(array $requestData, Cart $cart) ); return $shippingCost; } -} \ No newline at end of file +} diff --git a/resources/lib/PayoneApi/Request/Parts/CartItem.php b/resources/lib/PayoneApi/Request/Parts/CartItem.php index f885cb23..64075430 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartItem.php +++ b/resources/lib/PayoneApi/Request/Parts/CartItem.php @@ -163,12 +163,12 @@ public function getVa() public function jsonSerialize() { return [ - 'id' . $this->getPosition() => $this->getId(), - 'it' . $this->getPosition() => $this->getIt(), - 'no' . $this->getPosition() => $this->getNo(), - 'pr' . $this->getPosition() => $this->getPr(), - 'de' . $this->getPosition() => $this->getDe(), - 'va' . $this->getPosition() => $this->getva(), + 'id[' . $this->getPosition().']' => $this->getId(), + 'it[' . $this->getPosition().']' => $this->getIt(), + 'no[' . $this->getPosition().']' => $this->getNo(), + 'pr[' . $this->getPosition().']' => $this->getPr(), + 'de[' . $this->getPosition().']' => $this->getDe(), + 'va[' . $this->getPosition().']' => $this->getva(), ]; } } From 64467508295ed6b85437e62941346731eb8e0593 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Tue, 30 Jun 2020 14:11:47 +0200 Subject: [PATCH 079/107] test fixed vat rate --- resources/lib/PayoneApi/Request/Parts/CartFactory.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index 52105faa..280cf705 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -38,10 +38,7 @@ private static function calculateShipping(array $requestData, Cart $cart) $taxRate = 0; $basket = $requestData['basket']; if ($basket['shippingAmountNet'] > 0) { - $taxRate = (int )round( - ($basket['shippingAmount'] / $basket['shippingAmountNet'] - 1) - * 10000 - ); + $taxRate = 19; } $shippingCost = new CartItem( (count($cart->getCartItems())+1), From 5a3ffc0342d68364490d7caa60567f5853ed9ba2 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 30 Jun 2020 14:38:52 +0200 Subject: [PATCH 080/107] fix price --- resources/lib/PayoneApi/Request/Parts/CartFactory.php | 4 ++-- src/Providers/Api/Request/DataProviderAbstract.php | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index 280cf705..d51236a4 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -18,7 +18,7 @@ static public function create(array $requestData) $cartItemData['itemId'], CartItem::TYPE_GOODS, $cartItemData['quantity'] ?? '', - $cartItemData['price'], + (int)round($cartItemData['price'] * 100), $cartItemData['vat'], $cartItemData['name'] ?? '' ); @@ -45,7 +45,7 @@ private static function calculateShipping(array $requestData, Cart $cart) 'shipping', CartItem::TYPE_SHIPMENt, 1, - $basket['shippingAmount'], + (int)round($basket['shippingAmount'] * 100), $taxRate, 'shipping' ); diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index 3ff18bd6..a93f3edb 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -201,7 +201,7 @@ protected function getOrderItemData(Order $order) $orderItemData = $orderItem->toArray(); $amount = $orderItemData['amounts'][0]; $orderItemData['vat'] = $orderItemData['vatRate']; - $orderItemData['price'] = (int)round($amount['priceGross'] * 100); + $orderItemData['price'] = $amount['priceGross']; $orderItemData['name'] = $orderItemData['orderItemName']; $orderItemData['itemId'] = $orderItemData['id']; @@ -546,11 +546,10 @@ private function getShippingAmountNetFromOrder(Order $order) } $orderItemData = $orderItem->toArray(); $amount = $orderItemData['amounts'][0]; - $priceGross = $amount['priceGross']; - return $priceGross * 100 / ($orderItem['vatRate'] + 100.); + return $amount['priceNet']; } - return 0.; + return 0; } } From 59be652b89e4983cd4ccb788d577ebab5ef93a7b Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Tue, 30 Jun 2020 15:21:36 +0200 Subject: [PATCH 081/107] fix amounts --- .../lib/PayoneApi/Request/Parts/CartFactory.php | 6 +++--- src/Providers/Api/Request/DataProviderAbstract.php | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index d51236a4..d59b255d 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -18,7 +18,7 @@ static public function create(array $requestData) $cartItemData['itemId'], CartItem::TYPE_GOODS, $cartItemData['quantity'] ?? '', - (int)round($cartItemData['price'] * 100), + $cartItemData['price'], $cartItemData['vat'], $cartItemData['name'] ?? '' ); @@ -38,14 +38,14 @@ private static function calculateShipping(array $requestData, Cart $cart) $taxRate = 0; $basket = $requestData['basket']; if ($basket['shippingAmountNet'] > 0) { - $taxRate = 19; + $taxRate = (int)round((($basket['shippingAmount'] / $basket['shippingAmountNet']) - 1) * 100); } $shippingCost = new CartItem( (count($cart->getCartItems())+1), 'shipping', CartItem::TYPE_SHIPMENt, 1, - (int)round($basket['shippingAmount'] * 100), + $basket['shippingAmount'], $taxRate, 'shipping' ); diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index a93f3edb..491fdf2b 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -172,10 +172,12 @@ protected function getCartItemData(Basket $basket) /** @var ItemText $itemText */ $itemText = $item->texts; - $basketItem = $basketItem->toArray(); - $basketItem['name'] = $itemText->first()->name1; + $basketItemArr = $basketItem->toArray(); + $basketItemArr['name'] = $itemText->first()->name1; + $basketItemArr['price'] = (int)round($basketItem->price * 100); + $basketItemArr['vat'] = (int)$basketItem->vat; - $items[] = $basketItem; + $items[] = $basketItemArr; } return $items; @@ -200,8 +202,8 @@ protected function getOrderItemData(Order $order) } $orderItemData = $orderItem->toArray(); $amount = $orderItemData['amounts'][0]; - $orderItemData['vat'] = $orderItemData['vatRate']; - $orderItemData['price'] = $amount['priceGross']; + $orderItemData['vat'] = (int)$orderItemData['vatRate']; + $orderItemData['price'] = (int)round($amount['priceGross'] * 100); $orderItemData['name'] = $orderItemData['orderItemName']; $orderItemData['itemId'] = $orderItemData['id']; From 834ed020fc80f9963522678c143cefdb563264cd Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Tue, 30 Jun 2020 16:52:14 +0200 Subject: [PATCH 082/107] check if delivery address is the same as invoice address --- src/Methods/PaymentAbstract.php | 10 ++++++++++ src/Methods/PaymentValidator.php | 8 ++++++-- src/Methods/PayoneInvoiceSecurePaymentMethod.php | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 68734fd9..8ee7a446 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -187,4 +187,14 @@ public function getBackendIcon(): string $icon = $app->getUrlPath(PluginConstants::NAME).'/images/logos/'.strtolower($this::PAYMENT_CODE).'_backend_icon.svg'; return $icon; } + + /** + * Can the delivery address be different from the invoice address? + * + * @return bool + */ + public function canHandleDifferingDeliveryAddress(): bool + { + return true; + } } diff --git a/src/Methods/PaymentValidator.php b/src/Methods/PaymentValidator.php index 3065a59c..de4e6def 100644 --- a/src/Methods/PaymentValidator.php +++ b/src/Methods/PaymentValidator.php @@ -58,9 +58,9 @@ public function validate(PaymentAbstract $payment) } $billingAddress = $this->addressHelper->getBasketBillingAddress($this->basket); - $shippingAddress = $this->addressHelper->getBasketShippingAddress($this->basket); + $deliveryAddress = $this->addressHelper->getBasketShippingAddress($this->basket); if (!$billingAddress) { - return true; + return false; } $country = $billingAddress->country->isoCode2; @@ -69,6 +69,10 @@ public function validate(PaymentAbstract $payment) return false; } + + if (!$payment->canHandleDifferingDeliveryAddress() && $deliveryAddress && $billingAddress->id != $deliveryAddress->id) { + return false; + } return true; } diff --git a/src/Methods/PayoneInvoiceSecurePaymentMethod.php b/src/Methods/PayoneInvoiceSecurePaymentMethod.php index 10b293a2..12d20a04 100644 --- a/src/Methods/PayoneInvoiceSecurePaymentMethod.php +++ b/src/Methods/PayoneInvoiceSecurePaymentMethod.php @@ -10,4 +10,14 @@ class PayoneInvoiceSecurePaymentMethod extends PaymentAbstract { const PAYMENT_CODE = 'PAYONE_PAYONE_INVOICE_SECURE'; + + /** + * Can the delivery address be different from the invoice address? + * + * @return bool + */ + public function canHandleDifferingDeliveryAddress(): bool + { + return false; + } } From 5f2e03c17cbb11a87901bc051a9a833ca9680b0d Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Wed, 1 Jul 2020 11:42:32 +0200 Subject: [PATCH 083/107] set settleaccount to auto in capture --- src/Providers/Api/Request/CaptureDataProvider.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Providers/Api/Request/CaptureDataProvider.php b/src/Providers/Api/Request/CaptureDataProvider.php index 2a7816a9..06c9df9b 100644 --- a/src/Providers/Api/Request/CaptureDataProvider.php +++ b/src/Providers/Api/Request/CaptureDataProvider.php @@ -66,7 +66,6 @@ private function getSettleaccount(string $paymentCode) in_array( $paymentCode, [ - PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE, PayoneInvoicePaymentMethod::PAYMENT_CODE, PayonePrePaymentPaymentMethod::PAYMENT_CODE, PayoneSofortPaymentMethod::PAYMENT_CODE, From b6da3b54e3599d563f464bc234a5f2fa5201b5f9 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Wed, 1 Jul 2020 12:49:43 +0200 Subject: [PATCH 084/107] extended payone-api for getinvoice call --- .../Request/GetInvoice/GetInvoice.php | 97 +++++++++++++++++++ .../Request/GetInvoice/RequestFactory.php | 46 +++++++++ resources/lib/PayoneApi/Request/Types.php | 1 + .../Response/ClientErrorResponse.php | 10 +- .../PayoneApi/Response/ResponseFactory.php | 3 + resources/lib/doGetDocument.php | 48 +++++++++ 6 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php create mode 100644 resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php create mode 100644 resources/lib/doGetDocument.php diff --git a/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php b/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php new file mode 100644 index 00000000..4a22c36e --- /dev/null +++ b/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php @@ -0,0 +1,97 @@ +config = $config; + $this->invoiceTitle = $invoiceTitle; + $this->info = $info; + } + + /** + * Getter for Request + * + * @return string + */ + public function getRequest() + { + return $this->request; + } + + /** + * Getter for Config + * + * @return Config + */ + public function getConfig() + { + return $this->config; + } + + /** + * Getter for Info + * + * @return SystemInfo + */ + public function getInfo() + { + return $this->info; + } + + /** + * Getter for Sequencenumber + */ + public function getSequencenumber() + { + return null; + } + + /** + * Getter for Amount + * + * @return int + */ + public function getAmount() + { + return null; + } + + /** + * Getter for InvoiceTitle + * + * @return string + */ + public function getInvoiceTitle() + { + return $this->invoiceTitle; + } +} diff --git a/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php b/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php new file mode 100644 index 00000000..28d6ccb9 --- /dev/null +++ b/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php @@ -0,0 +1,46 @@ +message = $message; + $this->errorMessage = $errorMessage; } /** @@ -33,7 +33,7 @@ public function getSuccess() */ public function getErrorMessage() { - return $this->message; + return $this->errorMessage; } /** diff --git a/resources/lib/PayoneApi/Response/ResponseFactory.php b/resources/lib/PayoneApi/Response/ResponseFactory.php index bd150821..cd857f9e 100644 --- a/resources/lib/PayoneApi/Response/ResponseFactory.php +++ b/resources/lib/PayoneApi/Response/ResponseFactory.php @@ -11,6 +11,9 @@ class ResponseFactory */ public static function create($response) { + if (strpos($response, 'PDF-1.') !== false) { + return new GenericResponse(['document' => base64_encode($response)]); + } $responseData = self::parseResponse($response); if (strpos($response, 'clearing') !== false) { $authResponse = new ResponseWithClearing($responseData); diff --git a/resources/lib/doGetDocument.php b/resources/lib/doGetDocument.php new file mode 100644 index 00000000..29ca81c0 --- /dev/null +++ b/resources/lib/doGetDocument.php @@ -0,0 +1,48 @@ +doRequest($request); +} catch (Exception $e) { + $errorResponse = new ClientErrorResponse( + 'SdkRestApi error: ' . $e->getMessage() . PHP_EOL . + 'Lib version: ' . Version::getVersion() . PHP_EOL . + $e->getTraceAsString() + ); + + return $errorResponse; +} + +if (!$response->getSuccess()) { + $errorResponse = new ClientErrorResponse( + 'Request successful but response invalid. ' . PHP_EOL . + 'Lib version: ' . Version::getVersion() . PHP_EOL . + 'Message: ' . $response->getErrorMessage() . PHP_EOL . + 'Request was : ' . json_encode($serializer->serialize($request), JSON_PRETTY_PRINT) . PHP_EOL . + 'Response was: ' . json_encode($serializer->serialize($response), JSON_PRETTY_PRINT) + ); + return $errorResponse->jsonSerialize(); +} + +return $response->jsonSerialize(); From c29f27d09fb9d33e03e10162d976d114560a93d9 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Thu, 2 Jul 2020 16:34:18 +0200 Subject: [PATCH 085/107] add settings for own portal for secure invoice --- config.json | 12 +++++++++ src/Models/PaymentConfig/ApiCredentials.php | 27 +++++++++++++++---- .../Api/Request/DataProviderAbstract.php | 7 ++--- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/config.json b/config.json index 87d9775e..f23e8f35 100644 --- a/config.json +++ b/config.json @@ -191,6 +191,18 @@ "options": { "defaultValue": "DE,AT,CH" } + }, + "PAYONE_PAYONE_INVOICE_SECURE.portalid": { + "type": "inputText", + "required": false, + "label": "Config.portalidLabel", + "options": {} + }, + "PAYONE_PAYONE_INVOICE_SECURE.key": { + "type": "inputText", + "required": false, + "label": "Config.keyLabel", + "options": {} } } }, diff --git a/src/Models/PaymentConfig/ApiCredentials.php b/src/Models/PaymentConfig/ApiCredentials.php index 45dd0d6c..2e4b1bff 100644 --- a/src/Models/PaymentConfig/ApiCredentials.php +++ b/src/Models/PaymentConfig/ApiCredentials.php @@ -22,10 +22,18 @@ public function __construct( } /** + * @param null $paymentCode * @return string */ - public function getKey() + public function getKey($paymentCode = null) { + if ($paymentCode !== null) { + $key = $this->configRepo->get($paymentCode . '.key'); + if (!empty($key)) { + return $key; + } + } + return $this->configRepo->get('key'); } @@ -46,10 +54,18 @@ public function getMid() } /** + * @param int|null $paymentCode * @return string */ - public function getPortalid() + public function getPortalid($paymentCode = null) { + if ($paymentCode !== null) { + $portalId = $this->configRepo->get($paymentCode . '.portalid'); + if (!empty($portalId)) { + return $portalId; + } + } + return $this->configRepo->get('portalid'); } @@ -64,15 +80,16 @@ public function getMode() } /** + * @param int|null $paymentCode * @return array */ - public function getApiCredentials() + public function getApiCredentials($paymentCode = null) { $apiContextParams = []; $apiContextParams['aid'] = $this->getAid(); $apiContextParams['mid'] = $this->getMid(); - $apiContextParams['portalid'] = $this->getPortalid(); - $apiContextParams['key'] = $this->getKey(); + $apiContextParams['portalid'] = $this->getPortalid($paymentCode); + $apiContextParams['key'] = $this->getKey($paymentCode); $apiContextParams['mode'] = $this->getMode(); return $apiContextParams; diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index 491fdf2b..c91845e3 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -263,16 +263,17 @@ protected function getDefaultRequestData($paymentCode) return [ 'paymentMethod' => $this->mapPaymentCode($paymentCode), 'systemInfo' => $this->getSystemInfo(), - 'context' => $this->getApiContextParams(), + 'context' => $this->getApiContextParams($paymentCode), ]; } /** + * @param int $paymentCode * @return array */ - protected function getApiContextParams() + protected function getApiContextParams($paymentCode) { - return $this->config->getApiCredentials(); + return $this->config->getApiCredentials($paymentCode); } /** From ee64b4e28bae04d53c03c76df60fe9c32a62685c Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Thu, 2 Jul 2020 17:16:14 +0200 Subject: [PATCH 086/107] add get invoice for test --- resources/lang/de/Api.properties | 1 + resources/lang/en/Api.properties | 1 + src/Controllers/StatusController.php | 21 +- src/Models/Api/GetInvoiceResponse.php | 46 +++++ src/Models/Api/GetInvoiceResponseFactory.php | 26 +++ .../Api/Request/GetInvoiceDataProvider.php | 21 ++ src/Services/Api.php | 21 ++ src/Services/PaymentDocuments.php | 187 ++++++++++++++++++ 8 files changed, 321 insertions(+), 3 deletions(-) create mode 100644 src/Models/Api/GetInvoiceResponse.php create mode 100644 src/Models/Api/GetInvoiceResponseFactory.php create mode 100644 src/Providers/Api/Request/GetInvoiceDataProvider.php create mode 100644 src/Services/PaymentDocuments.php diff --git a/resources/lang/de/Api.properties b/resources/lang/de/Api.properties index ee4c310a..14248731 100644 --- a/resources/lang/de/Api.properties +++ b/resources/lang/de/Api.properties @@ -6,3 +6,4 @@ doRefund = "doRefund" doReAuth = "doReAuth" doCalculation = "doCalculation" doAuth = "doAuth" +doGetInvoice = "doGetInvoice" diff --git a/resources/lang/en/Api.properties b/resources/lang/en/Api.properties index ee4c310a..14248731 100644 --- a/resources/lang/en/Api.properties +++ b/resources/lang/en/Api.properties @@ -6,3 +6,4 @@ doRefund = "doRefund" doReAuth = "doReAuth" doCalculation = "doCalculation" doAuth = "doAuth" +doGetInvoice = "doGetInvoice" diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index 448121c3..9989fb89 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -6,6 +6,7 @@ use Payone\Adapter\Logger; use Payone\Migrations\CreatePaymentMethods; use Payone\Services\PaymentCreation; +use Payone\Services\PaymentDocuments; use Plenty\Plugin\Controller; use Plenty\Plugin\Http\Request; @@ -32,6 +33,12 @@ class StatusController extends Controller * @var CreatePaymentMethods */ private $paymentMigration; + + /** + * @var PaymentDocuments + */ + private $paymentDocument; + /** * @var Logger */ @@ -43,6 +50,7 @@ class StatusController extends Controller * @param Request $request * @param ConfigAdapter $config * @param PaymentCreation $paymentCreation + * @param PaymentDocuments $paymentDocument * @param CreatePaymentMethods $paymentMigration * @param Logger $logger */ @@ -50,12 +58,15 @@ public function __construct( Request $request, ConfigAdapter $config, PaymentCreation $paymentCreation, + PaymentDocuments $paymentDocument, CreatePaymentMethods $paymentMigration, Logger $logger - ) { + ) + { $this->request = $request; $this->config = $config; $this->paymentCreation = $paymentCreation; + $this->paymentDocument = $paymentDocument; $this->paymentMigration = $paymentMigration; $this->logger = $logger; } @@ -71,14 +82,18 @@ public function index() } $this->logger->setIdentifier(__METHOD__); - $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE,$txid); + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $txid); $this->logger->debug('Controller.Status', $this->request->all()); if ($this->request->get('key') != md5($this->config->get('key'))) { return; } - $this->paymentCreation->updatePaymentStatus($txid, $txaction, $sequenceNumber); + if ($txaction === 'invoice') { + $this->paymentDocument->uploadDocument($txid, $sequenceNumber); + } else { + $this->paymentCreation->updatePaymentStatus($txid, $txaction, $sequenceNumber); + } return 'TSOK'; } diff --git a/src/Models/Api/GetInvoiceResponse.php b/src/Models/Api/GetInvoiceResponse.php new file mode 100644 index 00000000..2edf5766 --- /dev/null +++ b/src/Models/Api/GetInvoiceResponse.php @@ -0,0 +1,46 @@ +success = $success; + $this->errorMessage = $errorMessage; + $this->base64 = $base64; + return $this; + } + + public function jsonSerialize(): array + { + return parent::jsonSerialize() + + [ + 'document' => $this->base64 + ]; + } + + /** + * Getter for Base64 + * + * @return string + */ + public function getBase64(): string + { + return $this->base64; + } +} diff --git a/src/Models/Api/GetInvoiceResponseFactory.php b/src/Models/Api/GetInvoiceResponseFactory.php new file mode 100644 index 00000000..6acd0932 --- /dev/null +++ b/src/Models/Api/GetInvoiceResponseFactory.php @@ -0,0 +1,26 @@ +init( + $responseData['success'] ?? false, + $responseData['errormessage'] ?? '', + $responseData['responseData'] ?? '' + ); + } +} diff --git a/src/Providers/Api/Request/GetInvoiceDataProvider.php b/src/Providers/Api/Request/GetInvoiceDataProvider.php new file mode 100644 index 00000000..9d1f85d2 --- /dev/null +++ b/src/Providers/Api/Request/GetInvoiceDataProvider.php @@ -0,0 +1,21 @@ +getDefaultRequestData($paymentCode); + $requestParams['context']['documentNumber'] = $documentType.'-'.$requestReference.'-'.$sequenceNumber; + $this->validator->validate($requestParams); + return $requestParams; + } +} diff --git a/src/Services/Api.php b/src/Services/Api.php index 9a0da534..dfb4ffda 100644 --- a/src/Services/Api.php +++ b/src/Services/Api.php @@ -5,6 +5,8 @@ use Payone\Adapter\Logger; use Payone\Models\Api\AuthResponse; use Payone\Models\Api\AuthResponseFactory; +use Payone\Models\Api\GetInvoiceResponse; +use Payone\Models\Api\GetInvoiceResponseFactory; use Payone\Models\Api\ManagemandateResponse; use Payone\Models\Api\ManagemandateResponseFactory; use Payone\Models\Api\PreAuthResponse; @@ -31,6 +33,7 @@ class Api const REQUEST_TYPE_CALCULATION = 'Calculation'; const REQUEST_TYPE_DEBIT = 'Debit'; const REQUEST_TYPE_MANAGEMANDATE = 'Managemandate'; + const REQUEST_TYPE_INVOICE = 'GetDocument'; /** * @var LibraryCallContract @@ -209,6 +212,24 @@ public function doManagemandate($requestParams): ManagemandateResponse return $responseObject; } + /** + * @param $requestParams + * + * @return Response + */ + public function doGetInvoice($requestParams): GetInvoiceResponse + { + $this->logger->setIdentifier(__METHOD__); + $response = $this->doLibCall((self::REQUEST_TYPE_INVOICE), $requestParams); + + $responseObject = GetInvoiceResponseFactory::create($response); + + $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_MANAGEMANDATE), $response); + + return $responseObject; + } + /** * @param string $call request type * @param $requestParams diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php new file mode 100644 index 00000000..a3c36896 --- /dev/null +++ b/src/Services/PaymentDocuments.php @@ -0,0 +1,187 @@ +paymentRepository = $paymentRepository; + $this->paymentHelper = $paymentHelper; + $this->orderRepositoryContract = $orderRepositoryContract; + $this->api = $api; + $this->getInvoiceDataProvider = $getInvoiceDataProvider; + $this->logger = $logger; + } + + public function uploadDocument($txid, $sequenceNumber) + { + $payments = $this->paymentRepository->getPaymentsByPropertyTypeAndValue( + PaymentProperty::TYPE_TRANSACTION_ID, + $txid, + 1 + ); + /* @var $payment Payment */ + foreach ($payments as $payment) { + $this->logger->info('Api.doGetInvoice', + [ + 'taxid' => $txid, + 'sequenceNumber' => $sequenceNumber, + 'payment' => $payment, + ] + ); + + //only for secure invoice + if ($this->paymentHelper->getMopId(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE) != + $payment->mopId) { + continue; + } + + $orderId = $payment->order->orderId; + if ((int)$orderId <= 0) { + continue; + } + + try { + $order = $this->orderRepositoryContract->findOrderById($orderId); + } catch (\Exception $ex) { + $this->logger->error('Api.doGetInvoice', + [ + 'taxid' => $txid, + 'sequenceNumber' => $sequenceNumber, + 'payment' => $payment, + 'errorMessage' => $ex->getMessage(), + ] + ); + continue; + } + + $documentType = 'RG'; + if ($order->typeId == OrderType::TYPE_CREDIT_NOTE) { + $documentType = 'GT'; + } + + $paymentCode = $this->paymentHelper->getPaymentCodeByMop($payment->mopId); + $requestData = $this->getInvoiceDataProvider->getRequestData($paymentCode, $txid, $sequenceNumber, $documentType); + $getInvoiceResult = $this->api->doGetInvoice($requestData); + + if (!$getInvoiceResult->getSuccess()) { + $this->logger->error('Api.doGetInvoice', + [ + 'taxid' => $txid, + 'sequenceNumber' => $sequenceNumber, + 'payment' => $payment, + 'errorMessage' => $getInvoiceResult->getErrorMessage(), + ] + ); + continue; + } + + $this->importInvoice($order, $requestData['context']['documentNumber'], $getInvoiceResult->getBase64()); + } + } + + /** + * Imports one invoice. + * + * @param Order $order + * @param array $invoice + * @throws InvalidDocumentTypeException + * @throws \Plenty\Exceptions\ValidationException + */ + private function importInvoice(Order $order, string $invoiceNumber, string $content) + { + /** @var DocumentRepositoryContract $documentRepository */ + $documentRepository = pluginApp(DocumentRepositoryContract::class); + + // check if the document is already imported + $documentRepository->setFilters([ + 'numberWithPrefix' => $invoiceNumber, + 'orderId' => $order->id + ]); + + /** @var PaginatedResult $result */ + $result = $documentRepository->find(); + + if ($result->getTotalCount() > 0) { + return; + } + $documentType = Document::INVOICE_EXTERNAL; + if ($order->typeId == OrderType::TYPE_CREDIT_NOTE) { + $documentType = Document::CREDIT_NOTE_EXTERNAL; + } + $data = [ + 'documents' => [ + [ + 'content' => $content, + 'numberWithPrefix' => $invoiceNumber, + 'displayDate' => Carbon::now()->toW3cString() + ] + ] + ]; + $documentRepository->uploadOrderDocuments($order->id, $documentType, $data); + } +} From db1a652e59da165075cc61e180c09c724aebd155 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Thu, 2 Jul 2020 18:44:19 +0200 Subject: [PATCH 087/107] add get invoice for test --- src/Controllers/StatusController.php | 10 +++- .../Api/Request/GetInvoiceDataProvider.php | 4 +- src/Services/PaymentDocuments.php | 47 ++++++++++++------- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index 9989fb89..c5af4f6d 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -4,6 +4,7 @@ use Payone\Adapter\Config as ConfigAdapter; use Payone\Adapter\Logger; +use Payone\Methods\PayoneInvoiceSecurePaymentMethod; use Payone\Migrations\CreatePaymentMethods; use Payone\Services\PaymentCreation; use Payone\Services\PaymentDocuments; @@ -85,12 +86,17 @@ public function index() $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $txid); $this->logger->debug('Controller.Status', $this->request->all()); - if ($this->request->get('key') != md5($this->config->get('key'))) { + if ( $this->request->get('key') != md5($this->config->get(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE.'.key')) && + $this->request->get('key') != md5($this->config->get('key')) ) + { return; } if ($txaction === 'invoice') { - $this->paymentDocument->uploadDocument($txid, $sequenceNumber); + + $invoiceId = $this->request->get('invoiceid'); + $invoiceDate = $this->request->get('invoice_date'); + $this->paymentDocument->uploadDocument($txid, $sequenceNumber, $invoiceId, $invoiceDate); } else { $this->paymentCreation->updatePaymentStatus($txid, $txaction, $sequenceNumber); } diff --git a/src/Providers/Api/Request/GetInvoiceDataProvider.php b/src/Providers/Api/Request/GetInvoiceDataProvider.php index 9d1f85d2..17ac659d 100644 --- a/src/Providers/Api/Request/GetInvoiceDataProvider.php +++ b/src/Providers/Api/Request/GetInvoiceDataProvider.php @@ -11,10 +11,10 @@ class GetInvoiceDataProvider extends DataProviderAbstract public function getRequestData(string $paymentCode, string $requestReference = null, string $sequenceNumber = null, - string $documentType = null) + string $documentNumber = null) { $requestParams = $this->getDefaultRequestData($paymentCode); - $requestParams['context']['documentNumber'] = $documentType.'-'.$requestReference.'-'.$sequenceNumber; + $requestParams['context']['documentNumber'] = $documentNumber ; $this->validator->validate($requestParams); return $requestParams; } diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index a3c36896..78625c21 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -6,10 +6,11 @@ use Payone\Adapter\Logger; use Payone\Helpers\PaymentHelper; use Payone\Methods\PayoneInvoiceSecurePaymentMethod; +use Plenty\Modules\Authorization\Services\AuthHelper; use Plenty\Modules\Document\Models\Document; -use Plenty\Modules\Order\Contracts\OrderRepositoryContract; use Payone\Providers\Api\Request\GetInvoiceDataProvider; use Plenty\Modules\Document\Contracts\DocumentRepositoryContract; +use Plenty\Modules\Order\Contracts\OrderRepositoryContract; use Plenty\Modules\Order\Models\Order; use Plenty\Modules\Order\Models\OrderType; use Plenty\Modules\Otto\Order\Exceptions\InvalidDocumentTypeException; @@ -33,9 +34,6 @@ class PaymentDocuments */ private $paymentHelper; - /** @var OrderRepositoryContract */ - private $orderRepositoryContract; - /** * @var Api */ @@ -55,7 +53,6 @@ class PaymentDocuments * * @param PaymentRepositoryContract $paymentRepository * @param PaymentHelper $paymentHelper - * @param OrderRepositoryContract $orderRepositoryContract * @param GetInvoiceDataProvider $getInvoiceDataProvider * @param Api $api * @param Logger $logger @@ -63,7 +60,6 @@ class PaymentDocuments public function __construct( PaymentRepositoryContract $paymentRepository, PaymentHelper $paymentHelper, - OrderRepositoryContract $orderRepositoryContract, GetInvoiceDataProvider $getInvoiceDataProvider, Api $api, Logger $logger @@ -71,13 +67,12 @@ public function __construct( { $this->paymentRepository = $paymentRepository; $this->paymentHelper = $paymentHelper; - $this->orderRepositoryContract = $orderRepositoryContract; $this->api = $api; $this->getInvoiceDataProvider = $getInvoiceDataProvider; $this->logger = $logger; } - public function uploadDocument($txid, $sequenceNumber) + public function uploadDocument($txid, $sequenceNumber, $invoiceId, $invoiceDate) { $payments = $this->paymentRepository->getPaymentsByPropertyTypeAndValue( PaymentProperty::TYPE_TRANSACTION_ID, @@ -106,7 +101,13 @@ public function uploadDocument($txid, $sequenceNumber) } try { - $order = $this->orderRepositoryContract->findOrderById($orderId); + $authHelper = pluginApp(AuthHelper::class); + $order = $authHelper->processUnguarded( + function () use ($orderId) { + $orderRepository = pluginApp(OrderRepositoryContract::class); + return $orderRepository->findOrderById($orderId); + } + ); } catch (\Exception $ex) { $this->logger->error('Api.doGetInvoice', [ @@ -119,13 +120,13 @@ public function uploadDocument($txid, $sequenceNumber) continue; } - $documentType = 'RG'; - if ($order->typeId == OrderType::TYPE_CREDIT_NOTE) { - $documentType = 'GT'; + if(strlen($invoiceId) === 0) + { + $invoiceId = (($order->typeId == OrderType::TYPE_CREDIT_NOTE)?'GT':'RG').'-'.$txid.'-'.$sequenceNumber; } $paymentCode = $this->paymentHelper->getPaymentCodeByMop($payment->mopId); - $requestData = $this->getInvoiceDataProvider->getRequestData($paymentCode, $txid, $sequenceNumber, $documentType); + $requestData = $this->getInvoiceDataProvider->getRequestData($paymentCode, $txid, $sequenceNumber, $invoiceId); $getInvoiceResult = $this->api->doGetInvoice($requestData); if (!$getInvoiceResult->getSuccess()) { @@ -140,7 +141,7 @@ public function uploadDocument($txid, $sequenceNumber) continue; } - $this->importInvoice($order, $requestData['context']['documentNumber'], $getInvoiceResult->getBase64()); + $this->importInvoice($order, $requestData['context']['documentNumber'], $getInvoiceResult->getBase64(), $invoiceDate); } } @@ -152,7 +153,7 @@ public function uploadDocument($txid, $sequenceNumber) * @throws InvalidDocumentTypeException * @throws \Plenty\Exceptions\ValidationException */ - private function importInvoice(Order $order, string $invoiceNumber, string $content) + private function importInvoice(Order $order, string $invoiceNumber, string $content, string $invoiceDate) { /** @var DocumentRepositoryContract $documentRepository */ $documentRepository = pluginApp(DocumentRepositoryContract::class); @@ -173,15 +174,27 @@ private function importInvoice(Order $order, string $invoiceNumber, string $cont if ($order->typeId == OrderType::TYPE_CREDIT_NOTE) { $documentType = Document::CREDIT_NOTE_EXTERNAL; } + + $date = Carbon::now()->toW3cString(); + if( strlen($invoiceDate) == 8 ) + { + $date = Carbon::createFromFormat('Ymd', $invoiceDate)->format(\DateTime::W3C); + } + $data = [ 'documents' => [ [ 'content' => $content, 'numberWithPrefix' => $invoiceNumber, - 'displayDate' => Carbon::now()->toW3cString() + 'displayDate' => $date ] ] ]; - $documentRepository->uploadOrderDocuments($order->id, $documentType, $data); + $authHelper = pluginApp(AuthHelper::class); + $documents = $authHelper->processUnguarded( + function () use ($documentRepository, $order, $documentType, $data) { + $documentRepository->uploadOrderDocuments($order->id, $documentType, $data); + } + ); } } From 97e53379f1ef5c45cad0a08694c2f6214aab0a80 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Thu, 2 Jul 2020 22:15:19 +0200 Subject: [PATCH 088/107] add get invoice for test --- src/Models/Api/GetInvoiceResponseFactory.php | 2 +- src/Providers/Api/Request/GetInvoiceDataProvider.php | 2 +- src/Services/Api.php | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Models/Api/GetInvoiceResponseFactory.php b/src/Models/Api/GetInvoiceResponseFactory.php index 6acd0932..d519247c 100644 --- a/src/Models/Api/GetInvoiceResponseFactory.php +++ b/src/Models/Api/GetInvoiceResponseFactory.php @@ -20,7 +20,7 @@ public static function create(array $responseData) return $response->init( $responseData['success'] ?? false, $responseData['errormessage'] ?? '', - $responseData['responseData'] ?? '' + $responseData['responseData']['document'] ?? '' ); } } diff --git a/src/Providers/Api/Request/GetInvoiceDataProvider.php b/src/Providers/Api/Request/GetInvoiceDataProvider.php index 17ac659d..d5d042e7 100644 --- a/src/Providers/Api/Request/GetInvoiceDataProvider.php +++ b/src/Providers/Api/Request/GetInvoiceDataProvider.php @@ -14,7 +14,7 @@ public function getRequestData(string $paymentCode, string $documentNumber = null) { $requestParams = $this->getDefaultRequestData($paymentCode); - $requestParams['context']['documentNumber'] = $documentNumber ; + $requestParams['context']['documentNumber'] = $documentNumber; $this->validator->validate($requestParams); return $requestParams; } diff --git a/src/Services/Api.php b/src/Services/Api.php index dfb4ffda..1233bbf2 100644 --- a/src/Services/Api.php +++ b/src/Services/Api.php @@ -221,12 +221,9 @@ public function doGetInvoice($requestParams): GetInvoiceResponse { $this->logger->setIdentifier(__METHOD__); $response = $this->doLibCall((self::REQUEST_TYPE_INVOICE), $requestParams); - $responseObject = GetInvoiceResponseFactory::create($response); - $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $responseObject->getTransactionID()); - $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_MANAGEMANDATE), $response); - + $this->logger->debug('Api.' . $this->getCallAction(self::REQUEST_TYPE_INVOICE), $response); return $responseObject; } From d9c6805d9c64151894ae79e64d0395383e52ec15 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Fri, 3 Jul 2020 08:48:16 +0200 Subject: [PATCH 089/107] cleanup --- src/Controllers/StatusController.php | 15 +- .../Api/Request/GetInvoiceDataProvider.php | 2 - src/Services/PaymentDocuments.php | 140 ++++++++++-------- 3 files changed, 84 insertions(+), 73 deletions(-) diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index c5af4f6d..bffff083 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -86,17 +86,18 @@ public function index() $this->logger->addReference(Logger::PAYONE_REQUEST_REFERENCE, $txid); $this->logger->debug('Controller.Status', $this->request->all()); - if ( $this->request->get('key') != md5($this->config->get(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE.'.key')) && - $this->request->get('key') != md5($this->config->get('key')) ) - { + if ($this->request->get('key') != md5($this->config->get(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE . '.key')) && + $this->request->get('key') != md5($this->config->get('key'))) { return; } if ($txaction === 'invoice') { - - $invoiceId = $this->request->get('invoiceid'); - $invoiceDate = $this->request->get('invoice_date'); - $this->paymentDocument->uploadDocument($txid, $sequenceNumber, $invoiceId, $invoiceDate); + $this + ->paymentDocument + ->uploadDocument($txid, + $this->request->get('invoiceid'), + $this->request->get('invoice_date'), + $this->request->get('invoice_grossamount')); } else { $this->paymentCreation->updatePaymentStatus($txid, $txaction, $sequenceNumber); } diff --git a/src/Providers/Api/Request/GetInvoiceDataProvider.php b/src/Providers/Api/Request/GetInvoiceDataProvider.php index d5d042e7..39f6ee70 100644 --- a/src/Providers/Api/Request/GetInvoiceDataProvider.php +++ b/src/Providers/Api/Request/GetInvoiceDataProvider.php @@ -9,8 +9,6 @@ class GetInvoiceDataProvider extends DataProviderAbstract * {@inheritdoc} */ public function getRequestData(string $paymentCode, - string $requestReference = null, - string $sequenceNumber = null, string $documentNumber = null) { $requestParams = $this->getDefaultRequestData($paymentCode); diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 78625c21..04332f47 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -11,7 +11,6 @@ use Payone\Providers\Api\Request\GetInvoiceDataProvider; use Plenty\Modules\Document\Contracts\DocumentRepositoryContract; use Plenty\Modules\Order\Contracts\OrderRepositoryContract; -use Plenty\Modules\Order\Models\Order; use Plenty\Modules\Order\Models\OrderType; use Plenty\Modules\Otto\Order\Exceptions\InvalidDocumentTypeException; use Plenty\Modules\Payment\Contracts\PaymentRepositoryContract; @@ -72,88 +71,99 @@ public function __construct( $this->logger = $logger; } - public function uploadDocument($txid, $sequenceNumber, $invoiceId, $invoiceDate) + public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) { $payments = $this->paymentRepository->getPaymentsByPropertyTypeAndValue( PaymentProperty::TYPE_TRANSACTION_ID, $txid, 1 ); - /* @var $payment Payment */ - foreach ($payments as $payment) { - $this->logger->info('Api.doGetInvoice', - [ - 'taxid' => $txid, - 'sequenceNumber' => $sequenceNumber, - 'payment' => $payment, - ] + + if (count($payments) !== 1) { + //payment not found + $this->logger->debug( + 'Api.doGetInvoice', + 'No payments found for txid (' . $txid . ')' ); + throw new \Exception('Payment not found.'); + } - //only for secure invoice - if ($this->paymentHelper->getMopId(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE) != - $payment->mopId) { - continue; - } + /* @var $payment Payment */ + $payments = array_shift($payments); - $orderId = $payment->order->orderId; - if ((int)$orderId <= 0) { - continue; - } + $this->logger->debug('Api.doGetInvoice', + [ + 'taxid' => $txid, + 'invoiceId' => $invoiceId, 'invoiceDate' => $invoiceDate, 'invoiceTotal' => $invoiceTotal, + 'payment' => $payment + ] + ); + + //only for secure invoice + if ($this->paymentHelper->getMopId(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE) != + $payment->mopId) { + return; + } + + $orderId = $payment->order->orderId; + + if ((int)$orderId <= 0) { + return; + } - try { - $authHelper = pluginApp(AuthHelper::class); - $order = $authHelper->processUnguarded( - function () use ($orderId) { - $orderRepository = pluginApp(OrderRepositoryContract::class); - return $orderRepository->findOrderById($orderId); + if (substr($invoiceId, 0, 2) == 'GT') { + //this is a credit note + $authHelper = pluginApp(AuthHelper::class); + $refundId = $authHelper->processUnguarded( + function () use ($orderId, $invoiceTotal) { + $orderRepository = pluginApp(OrderRepositoryContract::class); + $order = $orderRepository->findOrderById($orderId); + foreach ($order->childOrders as $childOrder) { + if ($childOrder->typeId == OrderType::TYPE_CREDIT_NOTE && + $childOrder->amount->invoiceTotal == abs($invoiceTotal)) { + return $childOrder->id; + } } + } + ); + if ((int)$refundId == 0) { + $this->logger->debug( + 'Api.doGetInvoice', + 'No credit-note found for invoiceId (' . $invoiceId . ')' ); - } catch (\Exception $ex) { - $this->logger->error('Api.doGetInvoice', - [ - 'taxid' => $txid, - 'sequenceNumber' => $sequenceNumber, - 'payment' => $payment, - 'errorMessage' => $ex->getMessage(), - ] - ); - continue; + return; } + $orderId = $refundId; + } - if(strlen($invoiceId) === 0) - { - $invoiceId = (($order->typeId == OrderType::TYPE_CREDIT_NOTE)?'GT':'RG').'-'.$txid.'-'.$sequenceNumber; - } + $requestData = $this->getInvoiceDataProvider + ->getRequestData(PayoneInvoiceSecurePaymentMethod::PAYMENT_CODE, $invoiceId); - $paymentCode = $this->paymentHelper->getPaymentCodeByMop($payment->mopId); - $requestData = $this->getInvoiceDataProvider->getRequestData($paymentCode, $txid, $sequenceNumber, $invoiceId); - $getInvoiceResult = $this->api->doGetInvoice($requestData); - - if (!$getInvoiceResult->getSuccess()) { - $this->logger->error('Api.doGetInvoice', - [ - 'taxid' => $txid, - 'sequenceNumber' => $sequenceNumber, - 'payment' => $payment, - 'errorMessage' => $getInvoiceResult->getErrorMessage(), - ] - ); - continue; - } + $getInvoiceResult = $this->api->doGetInvoice($requestData); - $this->importInvoice($order, $requestData['context']['documentNumber'], $getInvoiceResult->getBase64(), $invoiceDate); + if (!$getInvoiceResult->getSuccess()) { + $this->logger->error('Api.doGetInvoice', + [ + 'invoiceId' => $invoiceId, + 'payment' => $payment, + 'errorMessage' => $getInvoiceResult->getErrorMessage(), + ] + ); + return; } + + $this->importInvoice($orderId, $invoiceId, $getInvoiceResult->getBase64(), $invoiceDate); } /** * Imports one invoice. * - * @param Order $order + * @param int $orderId * @param array $invoice * @throws InvalidDocumentTypeException * @throws \Plenty\Exceptions\ValidationException */ - private function importInvoice(Order $order, string $invoiceNumber, string $content, string $invoiceDate) + private function importInvoice(int $orderId, string $invoiceNumber, string $content, string $invoiceDate) { /** @var DocumentRepositoryContract $documentRepository */ $documentRepository = pluginApp(DocumentRepositoryContract::class); @@ -161,23 +171,24 @@ private function importInvoice(Order $order, string $invoiceNumber, string $cont // check if the document is already imported $documentRepository->setFilters([ 'numberWithPrefix' => $invoiceNumber, - 'orderId' => $order->id + 'orderId' => $orderId ]); /** @var PaginatedResult $result */ $result = $documentRepository->find(); if ($result->getTotalCount() > 0) { + //document exists return; } + $documentType = Document::INVOICE_EXTERNAL; - if ($order->typeId == OrderType::TYPE_CREDIT_NOTE) { + if (substr($invoiceNumber, 0, 2) == 'GT') { $documentType = Document::CREDIT_NOTE_EXTERNAL; } $date = Carbon::now()->toW3cString(); - if( strlen($invoiceDate) == 8 ) - { + if (strlen($invoiceDate) == 8) { $date = Carbon::createFromFormat('Ymd', $invoiceDate)->format(\DateTime::W3C); } @@ -190,10 +201,11 @@ private function importInvoice(Order $order, string $invoiceNumber, string $cont ] ] ]; + $authHelper = pluginApp(AuthHelper::class); - $documents = $authHelper->processUnguarded( - function () use ($documentRepository, $order, $documentType, $data) { - $documentRepository->uploadOrderDocuments($order->id, $documentType, $data); + $authHelper->processUnguarded( + function () use ($documentRepository, $orderId, $documentType, $data) { + $documentRepository->uploadOrderDocuments($orderId, $documentType, $data); } ); } From 17a8525092758d384d024ab7a4104456dad055df Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Fri, 3 Jul 2020 08:58:21 +0200 Subject: [PATCH 090/107] cleanup --- src/Services/PaymentDocuments.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 04332f47..8a1fa613 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -73,6 +73,8 @@ public function __construct( public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) { + $this->logger->setIdentifier(__METHOD__); + $payments = $this->paymentRepository->getPaymentsByPropertyTypeAndValue( PaymentProperty::TYPE_TRANSACTION_ID, $txid, @@ -89,7 +91,7 @@ public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) } /* @var $payment Payment */ - $payments = array_shift($payments); + $payment = array_shift($payments); $this->logger->debug('Api.doGetInvoice', [ From a477aecefab9a8d360cf37d2511ebee0f7657d86 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Fri, 3 Jul 2020 09:22:18 +0200 Subject: [PATCH 091/107] cleanup --- src/Services/PaymentDocuments.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 8a1fa613..c02f199f 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -122,7 +122,7 @@ function () use ($orderId, $invoiceTotal) { $order = $orderRepository->findOrderById($orderId); foreach ($order->childOrders as $childOrder) { if ($childOrder->typeId == OrderType::TYPE_CREDIT_NOTE && - $childOrder->amount->invoiceTotal == abs($invoiceTotal)) { + $childOrder->amount->invoiceTotal == (-$invoiceTotal)) { return $childOrder->id; } } From 212f66b1d7acb08411b8e07fbc006d82b10b52e1 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Fri, 3 Jul 2020 09:40:57 +0200 Subject: [PATCH 092/107] cleanup --- src/Services/PaymentDocuments.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index c02f199f..52199dea 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -91,7 +91,7 @@ public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) } /* @var $payment Payment */ - $payment = array_shift($payments); + $payment = $payments->shift(); $this->logger->debug('Api.doGetInvoice', [ From 3fe689cb267b60f91d1656fcaf4c1f85e67a191e Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 13:08:47 +0200 Subject: [PATCH 093/107] validate if settings are set --- config.json | 24 +++++++++---------- src/Methods/PaymentAbstract.php | 13 +++++++++- src/Methods/PaymentValidator.php | 10 ++++++-- .../PayoneInvoiceSecurePaymentMethod.php | 17 +++++++++++++ 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/config.json b/config.json index f23e8f35..af155b1d 100644 --- a/config.json +++ b/config.json @@ -168,6 +168,18 @@ "label": "Config.PAYONEPAYONEINVOICESECUREDescriptionLabel", "options": {} }, + "PAYONE_PAYONE_INVOICE_SECURE.portalid": { + "type": "inputText", + "required": false, + "label": "Config.portalidLabel", + "options": {} + }, + "PAYONE_PAYONE_INVOICE_SECURE.key": { + "type": "inputText", + "required": false, + "label": "Config.keyLabel", + "options": {} + }, "PAYONE_PAYONE_INVOICE_SECURE.minCartAmount": { "type": "inputText", "required": false, @@ -191,18 +203,6 @@ "options": { "defaultValue": "DE,AT,CH" } - }, - "PAYONE_PAYONE_INVOICE_SECURE.portalid": { - "type": "inputText", - "required": false, - "label": "Config.portalidLabel", - "options": {} - }, - "PAYONE_PAYONE_INVOICE_SECURE.key": { - "type": "inputText", - "required": false, - "label": "Config.keyLabel", - "options": {} } } }, diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 8ee7a446..839869e1 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -48,7 +48,7 @@ public function __construct( public function isActive(): bool { return (bool) $this->configRepo->get($this::PAYMENT_CODE . '.active') - && $this->paymentValidator->validate($this); + && $this->paymentValidator->validate($this, $this->configRepo); } /** @@ -197,4 +197,15 @@ public function canHandleDifferingDeliveryAddress(): bool { return true; } + + /** + * Check if all settings for the payment method are set. + * + * @param ConfigAdapter $configRepo + * @return bool + */ + public function validateSettings(ConfigAdapter $configRepo): bool + { + return true; + } } diff --git a/src/Methods/PaymentValidator.php b/src/Methods/PaymentValidator.php index de4e6def..e484bca3 100644 --- a/src/Methods/PaymentValidator.php +++ b/src/Methods/PaymentValidator.php @@ -6,6 +6,7 @@ use Payone\Helpers\AddressHelper; use Plenty\Modules\Basket\Contracts\BasketRepositoryContract; use Plenty\Modules\Basket\Models\Basket; +use Payone\Adapter\Config as ConfigAdapter; class PaymentValidator { @@ -42,7 +43,7 @@ public function __construct(BasketRepositoryContract $basket, AddressHelper $add * * @return bool */ - public function validate(PaymentAbstract $payment) + public function validate(PaymentAbstract $payment, ConfigAdapter $configRepo) { $basketAmount = $this->basket->basketAmount; if ($payment->getMinCartAmount() && $basketAmount < $payment->getMinCartAmount()) { @@ -60,7 +61,8 @@ public function validate(PaymentAbstract $payment) $billingAddress = $this->addressHelper->getBasketBillingAddress($this->basket); $deliveryAddress = $this->addressHelper->getBasketShippingAddress($this->basket); if (!$billingAddress) { - return false; + // TODO: shouldn't this be 'return false'? + return true; } $country = $billingAddress->country->isoCode2; @@ -73,6 +75,10 @@ public function validate(PaymentAbstract $payment) if (!$payment->canHandleDifferingDeliveryAddress() && $deliveryAddress && $billingAddress->id != $deliveryAddress->id) { return false; } + + if (!$payment->validateSettings($configRepo)) { + return false; + } return true; } diff --git a/src/Methods/PayoneInvoiceSecurePaymentMethod.php b/src/Methods/PayoneInvoiceSecurePaymentMethod.php index 12d20a04..0568c5f9 100644 --- a/src/Methods/PayoneInvoiceSecurePaymentMethod.php +++ b/src/Methods/PayoneInvoiceSecurePaymentMethod.php @@ -4,6 +4,8 @@ namespace Payone\Methods; +use Payone\Adapter\Config as ConfigAdapter; + /** * Class PayoneInvoiceSecurePaymentMethod */ @@ -20,4 +22,19 @@ public function canHandleDifferingDeliveryAddress(): bool { return false; } + + /** + * Check if all settings for the payment method are set. + * + * @param ConfigAdapter $configRepo + * @return bool + */ + public function validateSettings(ConfigAdapter $configRepo): bool + { + $portalId = $configRepo->get(self::PAYMENT_CODE . '.portalid'); + $key = $configRepo->get(self::PAYMENT_CODE . '.key'); + + // A separate portal ID and key must be set for this payment method + return (!empty($portalId) && !empty($key)); + } } From 9bb474346598ee04c5f820ef00745a415cafc32a Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 13:21:08 +0200 Subject: [PATCH 094/107] check if currency is euro --- src/Methods/PaymentAbstract.php | 11 +++++++++++ src/Methods/PaymentValidator.php | 4 ++++ src/Methods/PayoneInvoiceSecurePaymentMethod.php | 11 +++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/Methods/PaymentAbstract.php b/src/Methods/PaymentAbstract.php index 839869e1..c57f321e 100644 --- a/src/Methods/PaymentAbstract.php +++ b/src/Methods/PaymentAbstract.php @@ -208,4 +208,15 @@ public function validateSettings(ConfigAdapter $configRepo): bool { return true; } + + /** + * Is the payment method active for the given currency? + * + * @param $currency + * @return bool + */ + public function isActiveForCurrency($currency): bool + { + return true; + } } diff --git a/src/Methods/PaymentValidator.php b/src/Methods/PaymentValidator.php index e484bca3..be0f4a22 100644 --- a/src/Methods/PaymentValidator.php +++ b/src/Methods/PaymentValidator.php @@ -79,6 +79,10 @@ public function validate(PaymentAbstract $payment, ConfigAdapter $configRepo) if (!$payment->validateSettings($configRepo)) { return false; } + + if (!$payment->isActiveForCurrency($this->basket->currency)) { + return false; + } return true; } diff --git a/src/Methods/PayoneInvoiceSecurePaymentMethod.php b/src/Methods/PayoneInvoiceSecurePaymentMethod.php index 0568c5f9..d06a84c0 100644 --- a/src/Methods/PayoneInvoiceSecurePaymentMethod.php +++ b/src/Methods/PayoneInvoiceSecurePaymentMethod.php @@ -37,4 +37,15 @@ public function validateSettings(ConfigAdapter $configRepo): bool // A separate portal ID and key must be set for this payment method return (!empty($portalId) && !empty($key)); } + + /** + * Is the payment method active for the given currency? + * + * @param $currency + * @return bool + */ + public function isActiveForCurrency($currency): bool + { + return $currency == 'EUR'; + } } From 8c26703ed8ae28892f248c01b357f8c7a6626c74 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 15:19:32 +0200 Subject: [PATCH 095/107] change text --- resources/lib/PayoneApi/Request/Parts/CartFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index d59b255d..c5a6a1f5 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -47,7 +47,7 @@ private static function calculateShipping(array $requestData, Cart $cart) 1, $basket['shippingAmount'], $taxRate, - 'shipping' + 'Porto & Versand' ); return $shippingCost; } From 584bf5b60bfa5a48f5b1de1959638c5388623123 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 15:42:59 +0200 Subject: [PATCH 096/107] change text --- resources/lib/PayoneApi/Request/Parts/CartFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index c5a6a1f5..e8274afc 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -42,7 +42,7 @@ private static function calculateShipping(array $requestData, Cart $cart) } $shippingCost = new CartItem( (count($cart->getCartItems())+1), - 'shipping', + 'Shipping', CartItem::TYPE_SHIPMENt, 1, $basket['shippingAmount'], From 7ee8becad9d22a2c1493e0afac4f0f160c328329 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 15:48:56 +0200 Subject: [PATCH 097/107] change text --- resources/lib/PayoneApi/Request/Parts/CartFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/PayoneApi/Request/Parts/CartFactory.php b/resources/lib/PayoneApi/Request/Parts/CartFactory.php index e8274afc..b423f7ee 100644 --- a/resources/lib/PayoneApi/Request/Parts/CartFactory.php +++ b/resources/lib/PayoneApi/Request/Parts/CartFactory.php @@ -42,7 +42,7 @@ private static function calculateShipping(array $requestData, Cart $cart) } $shippingCost = new CartItem( (count($cart->getCartItems())+1), - 'Shipping', + '-', CartItem::TYPE_SHIPMENt, 1, $basket['shippingAmount'], From da42753550839fec7b08b607cf546ebf2653f3f4 Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Fri, 3 Jul 2020 16:27:45 +0200 Subject: [PATCH 098/107] set businessrelation field --- .../Request/GenericAuthRequestFactory.php | 3 ++- .../Managemandate/ManageMandateRequestFactory.php | 3 ++- resources/lib/PayoneApi/Request/Parts/Customer.php | 14 +++++++++++++- src/Providers/Api/Request/DataProviderAbstract.php | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/resources/lib/PayoneApi/Request/GenericAuthRequestFactory.php b/resources/lib/PayoneApi/Request/GenericAuthRequestFactory.php index 47227211..782c2207 100644 --- a/resources/lib/PayoneApi/Request/GenericAuthRequestFactory.php +++ b/resources/lib/PayoneApi/Request/GenericAuthRequestFactory.php @@ -34,7 +34,8 @@ public static function create($requestType, $data) $customerData['birthday'], $customerData['language'], $customerData['gender'], - $customerData['ip'] + $customerData['ip'], + $customerData['businessrelation'] ?? 'b2c' ); $reference = isset($data['order']['orderId']) && $data['order']['orderId'] ? 'order-' . $data['order']['orderId'] : 'basket-' . $data['basket']['id']; diff --git a/resources/lib/PayoneApi/Request/Managemandate/ManageMandateRequestFactory.php b/resources/lib/PayoneApi/Request/Managemandate/ManageMandateRequestFactory.php index 237627d2..c037ad94 100644 --- a/resources/lib/PayoneApi/Request/Managemandate/ManageMandateRequestFactory.php +++ b/resources/lib/PayoneApi/Request/Managemandate/ManageMandateRequestFactory.php @@ -49,7 +49,8 @@ public static function create($paymentMethod, $data, $referenceId = null) $customerData['birthday'], $customerData['language'], $customerData['gender'], - $customerData['ip'] + $customerData['ip'], + $customerData['businessrelation'] ?? 'b2c' ); $basket = $data['basket']; diff --git a/resources/lib/PayoneApi/Request/Parts/Customer.php b/resources/lib/PayoneApi/Request/Parts/Customer.php index b4abbfca..0287205e 100644 --- a/resources/lib/PayoneApi/Request/Parts/Customer.php +++ b/resources/lib/PayoneApi/Request/Parts/Customer.php @@ -16,6 +16,7 @@ class Customer private $language; private $gender; private $ip; + private $businessrelation; /** * Customer constructor. @@ -30,6 +31,7 @@ class Customer * @param string $language * @param string $gender * @param string $ip + * @param string $businessrelation */ public function __construct( $title, @@ -41,7 +43,8 @@ public function __construct( $birthday, $language, $gender, - $ip + $ip, + $businessrelation = 'b2c' ) { $this->salutation = $gender == 'm' ? 'Herr' : 'Frau'; $this->title = $title; @@ -54,6 +57,7 @@ public function __construct( $this->language = $language; $this->gender = $gender; $this->ip = $ip; + $this->businessrelation = $businessrelation; } /** @@ -165,4 +169,12 @@ public function getIp() { return $this->ip; } + + /** + * @return string + */ + public function getBusinessrelation() + { + return $this->businessrelation; + } } diff --git a/src/Providers/Api/Request/DataProviderAbstract.php b/src/Providers/Api/Request/DataProviderAbstract.php index c91845e3..abe3f5eb 100644 --- a/src/Providers/Api/Request/DataProviderAbstract.php +++ b/src/Providers/Api/Request/DataProviderAbstract.php @@ -250,6 +250,13 @@ protected function getCustomerData(Address $addressObj, $customerId) $customerData['gender'] = 'f'; } + $taxIdNumber = $addressObj->taxIdNumber; + if (!empty($taxIdNumber)) { + $customerData['businessrelation'] = 'b2b'; + } else { + $customerData['businessrelation'] = 'b2c'; + } + return $customerData; } From 4ff1c91c0347f33d188d852894f76fb939ab4546 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Mon, 6 Jul 2020 09:58:54 +0200 Subject: [PATCH 099/107] cleanup --- .../PayoneApi/Request/GetInvoice/RequestFactory.php | 4 ++-- resources/lib/doGetDocument.php | 2 +- src/Services/PaymentDocuments.php | 10 +++------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php b/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php index 28d6ccb9..deac6130 100644 --- a/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php +++ b/resources/lib/PayoneApi/Request/GetInvoice/RequestFactory.php @@ -13,14 +13,14 @@ class RequestFactory implements RequestFactoryContract /** * @param string $paymentMethod * @param array $data - * @param null $referenceId + * @param int|null $referenceId * * @return GetInvoice */ public static function create($paymentMethod, $data, $referenceId = null) { if ($paymentMethod != PaymentTypes::PAYONE_INVOICE_SECURE) { - throw new \Exception('get invoice only by secure invoice'); + throw new \Exception('Get invoice only for secure invoice'); } $context = $data['context']; $config = new Config( diff --git a/resources/lib/doGetDocument.php b/resources/lib/doGetDocument.php index 29ca81c0..1b4d88e5 100644 --- a/resources/lib/doGetDocument.php +++ b/resources/lib/doGetDocument.php @@ -31,7 +31,7 @@ $e->getTraceAsString() ); - return $errorResponse; + return $errorResponse->jsonSerialize(); } if (!$response->getSuccess()) { diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 52199dea..0c8cb493 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -48,8 +48,6 @@ class PaymentDocuments private $logger; /** - * PaymentCreation constructor. - * * @param PaymentRepositoryContract $paymentRepository * @param PaymentHelper $paymentHelper * @param GetInvoiceDataProvider $getInvoiceDataProvider @@ -158,12 +156,10 @@ function () use ($orderId, $invoiceTotal) { } /** - * Imports one invoice. - * * @param int $orderId - * @param array $invoice - * @throws InvalidDocumentTypeException - * @throws \Plenty\Exceptions\ValidationException + * @param string $invoiceNumber + * @param string $content + * @param string $invoiceDate */ private function importInvoice(int $orderId, string $invoiceNumber, string $content, string $invoiceDate) { From b01e43e5486c6ee9f59e67a970cbed64a872258b Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Mon, 6 Jul 2020 10:16:48 +0200 Subject: [PATCH 100/107] cleanup --- .../Request/GetInvoice/GetInvoice.php | 18 ------------------ src/Models/PaymentConfig/ApiCredentials.php | 2 +- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php b/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php index 4a22c36e..7f63f868 100644 --- a/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php +++ b/resources/lib/PayoneApi/Request/GetInvoice/GetInvoice.php @@ -67,24 +67,6 @@ public function getInfo() return $this->info; } - /** - * Getter for Sequencenumber - */ - public function getSequencenumber() - { - return null; - } - - /** - * Getter for Amount - * - * @return int - */ - public function getAmount() - { - return null; - } - /** * Getter for InvoiceTitle * diff --git a/src/Models/PaymentConfig/ApiCredentials.php b/src/Models/PaymentConfig/ApiCredentials.php index 2e4b1bff..3f4568b8 100644 --- a/src/Models/PaymentConfig/ApiCredentials.php +++ b/src/Models/PaymentConfig/ApiCredentials.php @@ -22,7 +22,7 @@ public function __construct( } /** - * @param null $paymentCode + * @param int|null $paymentCode * @return string */ public function getKey($paymentCode = null) From 24c7616049a9c3fa6220cd5b6b3fcef73c54253a Mon Sep 17 00:00:00 2001 From: Raphael Adam Date: Tue, 7 Jul 2020 09:34:41 +0200 Subject: [PATCH 101/107] add changelog and increase version --- meta/documents/changelog_de.md | 5 ++++- meta/documents/changelog_en.md | 5 ++++- plugin.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index eca40612..fc902a0a 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,6 +1,9 @@ # Release Notes für PAYONE -## 1.1.13 (2020-06-04) +## 1.1.13 (2020-07-07) +### Hinzugefügt +- Zahlungsart "Secure Invoice" hinzugefügt + ### Geändert - Icon für das Backend hinzugefügt diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 19a225b0..27d78643 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,6 +1,9 @@ # Release Notes for PAYONE -## 1.1.13 (2020-06-04) +## 1.1.13 (2020-07-07) +### Added +- Payment method "Secure Invoice" added + ### Geändert - Added Icon for the backend diff --git a/plugin.json b/plugin.json index 452cf363..8e948b3d 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.12", + "version": "1.1.13", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From 156cfcc2b79c3578f6786d15ea437f48dc9d2940 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 7 Jul 2020 14:33:49 +0200 Subject: [PATCH 102/107] add docu --- src/Services/PaymentDocuments.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 0c8cb493..38f82ff2 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -69,6 +69,13 @@ public function __construct( $this->logger = $logger; } + /** + * @param string $txid + * @param string $invoiceId + * @param string $invoiceDate + * @param float $invoiceTotal + * @throws \Exception + */ public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) { $this->logger->setIdentifier(__METHOD__); From 912548af6fd7b91218b019373003ef3bad5499e6 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 7 Jul 2020 15:00:11 +0200 Subject: [PATCH 103/107] add docu --- src/Controllers/StatusController.php | 2 +- src/Services/PaymentDocuments.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Controllers/StatusController.php b/src/Controllers/StatusController.php index bffff083..0d979865 100644 --- a/src/Controllers/StatusController.php +++ b/src/Controllers/StatusController.php @@ -94,7 +94,7 @@ public function index() if ($txaction === 'invoice') { $this ->paymentDocument - ->uploadDocument($txid, + ->addInvoiceToOrder($txid, $this->request->get('invoiceid'), $this->request->get('invoice_date'), $this->request->get('invoice_grossamount')); diff --git a/src/Services/PaymentDocuments.php b/src/Services/PaymentDocuments.php index 38f82ff2..be3ac0e7 100644 --- a/src/Services/PaymentDocuments.php +++ b/src/Services/PaymentDocuments.php @@ -70,13 +70,15 @@ public function __construct( } /** + * This function loads the invoice / credit documents from payone. The OrderId is determined over the taxid. + * * @param string $txid * @param string $invoiceId * @param string $invoiceDate * @param float $invoiceTotal * @throws \Exception */ - public function uploadDocument($txid, $invoiceId, $invoiceDate, $invoiceTotal) + public function addInvoiceToOrder($txid, $invoiceId, $invoiceDate, $invoiceTotal) { $this->logger->setIdentifier(__METHOD__); From bad7ddde3a19cbddb3b7b2c5b2643f988d72088f Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 7 Jul 2020 17:04:10 +0200 Subject: [PATCH 104/107] update user guild --- meta/documents/changelog_de.md | 6 ++++-- meta/documents/changelog_en.md | 4 +++- meta/documents/user_guide_de.md | 33 +++++++++++++++++---------------- meta/documents/user_guide_en.md | 33 +++++++++++++++++---------------- plugin.json | 2 +- 5 files changed, 42 insertions(+), 36 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index eca40612..3ad7ae82 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,8 +1,10 @@ # Release Notes für PAYONE -## 1.1.13 (2020-06-04) +## 1.1.13 (2020-07-07 +) ### Geändert - Icon für das Backend hinzugefügt +- User Guide aktualisiert ## 1.1.12 (2020-03-09) @@ -58,7 +60,7 @@ - Die Zahlungsart Amazon Pay wurde für das Backend hinzugefügt. ### Behoben -- Einige Medlungen im Log +- Einige Meldungen im Log ## 1.1.3 (2019-06-13) diff --git a/meta/documents/changelog_en.md b/meta/documents/changelog_en.md index 19a225b0..4fc57538 100644 --- a/meta/documents/changelog_en.md +++ b/meta/documents/changelog_en.md @@ -1,8 +1,10 @@ # Release Notes for PAYONE -## 1.1.13 (2020-06-04) +## 1.1.13 (2020-07-07) + ### Geändert - Added Icon for the backend +- Updated user guide ## 1.1.12 (2020-03-09) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 51da26a8..3fcbcfff 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -8,31 +8,32 @@ Das plentymarkets PAYONE Plugin bietet Ihnen Zugang zu internationalen und lokal Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: -* Rechnung -* Gesicherte Rechnung -* Paydirekt -* Payolution Ratenzahlung -* PayPal -* RatePay Ratenzahlung -* Sofortüberweisung -* Vorkasse -* Kreditkarte -* Nachnahme -* Lastschrift +* Gesicherter Rechnungskauf +* Visa & MasterCard (inkl. Maestro) +* American Express - Anbindung Ihres bestehenden Akzeptanzvertrages +* SEPA Lastschrift +* giropay - Online-Überweisung Deutschland +* Sofortüberweisung - Online-Überweisung international +* Überweisung - Vorkasse & Rechnung & Nachnahme +* PayPal - Anbindung Ihres PayPal-Accounts +* Amazon Pay - Anbindung Ihres Amazon Pay-Accounts (In Kürze verfügbar!) ## Erste Schritte - +Für die Nutzung benötigen Sie einen PAYONE Account und die PAYONE Zugangsdaten. Wenn Sie noch kein PAYONE Kunde sind und demnach keinen PAYONE Account besitzen, wenden Sie sich bitte an: -Kontaktieren Sie uns:
PSG Projektmanagement GmbH
Meergässle 4
89180 Berghülen
Telefon: 07344-9592588
E-Mail: plenty@psg-projektmanagement.de
-Internet: http://www.psg-projektmanagement.de +Internet: http://www.psg-projektmanagement.de
+Oder nutzen Sie folgendes Anmeldeformular
+https://www.psg-projektmanagement.de/payone-plentymarkets/ + + Nach Erhalt der Zugangsdaten loggen Sie sich im PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 060461ed..00c8775d 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -8,31 +8,32 @@ The plentymarkets PAYONE plugin offers you access to international as well as lo The plugin currently offers the following payment methods: -* Invoice -* Secure invoice -* Paydirekt -* Payolution Payment in installments -* PayPal -* RatePay Payment in installments -* Sofortüberweisung -* Cash in advance -* Credit card -* Cash on Delivery -* Debit +* Secure Invoice +* Visa & MasterCard (incl. Maestro) +* American Express - Integration of your existing acceptance contract +* SEPA direct debit +* giropay - online bank transfer Germany +* Sofortüberweisung - Online bank transfer international +* Transfer - Cash in advance & Invoice & Cash on Delivery +* PayPal - Integration of your PayPal account +* Amazon Pay - Integration of your Amazon Pay accounts (Available soon!) ## First steps - +The use requires a PAYONE account as well as PAYONE access data. If you are not a PAYONE customer yet and thus do not have a PAYONE account, please contact: -Contact us:
Meergässle 4
89180 Berghülen
Phone: 07344-9592588
E-mail: plenty@psg-projektmanagement.de
-Website: http://www.psg-projektmanagement.de +Website: http://www.psg-projektmanagement.de
+Or use the following registration form:
+https://www.psg-projektmanagement.de/payone-plentymarkets/ + + Upon receipt of your access data, log in to the PAYONE merchant interface and carry out the following settings. diff --git a/plugin.json b/plugin.json index 452cf363..8e948b3d 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "version": "1.1.12", + "version": "1.1.13", "license":"MIT", "pluginIcon":"icon_plugin_xs.png", "price":0.0, From 95581958e7cb401cf93efd53688a501228b45975 Mon Sep 17 00:00:00 2001 From: Daniel Marx Date: Tue, 7 Jul 2020 17:10:46 +0200 Subject: [PATCH 105/107] update user guild --- meta/documents/changelog_de.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta/documents/changelog_de.md b/meta/documents/changelog_de.md index 3ad7ae82..f023c731 100644 --- a/meta/documents/changelog_de.md +++ b/meta/documents/changelog_de.md @@ -1,7 +1,7 @@ # Release Notes für PAYONE -## 1.1.13 (2020-07-07 -) +## 1.1.13 (2020-07-07) + ### Geändert - Icon für das Backend hinzugefügt - User Guide aktualisiert From e2fbf22da4f5a807efee646e8ad3237f59c8fdb2 Mon Sep 17 00:00:00 2001 From: jawendel Date: Thu, 9 Jul 2020 13:11:47 +0200 Subject: [PATCH 106/107] Documentation: updated user guides - User Guides (De and En) updated - added: Hinweis zum Gesicherten Rechnungskauf --- meta/documents/user_guide_de.md | 167 +++++++++++++++++--------------- meta/documents/user_guide_en.md | 36 ++++--- 2 files changed, 113 insertions(+), 90 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index 3fcbcfff..f99c09a7 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -2,25 +2,25 @@ Das PAYONE Plugin ist für die Nutzung mit dem Webshop Ceres entwickelt und funktioniert nur mit dessen Logikstruktur oder anderen Template-Plugins. Zur Nutzung des PAYONE Plugins müssen die Plugins IO und Ceres aktiviert sein. -# PAYONE Payment für plentymarkets 7 +# PAYONE Payment für plentymarkets -Das plentymarkets PAYONE Plugin bietet Ihnen Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig haben Sie Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. +Das plentymarkets PAYONE Plugin bietet Zugang zu internationalen und lokalen Zahlungsarten. Gleichzeitig hast du Zugriff auf ein integriertes Risikomanagement, automatisierte Gutschriften und schnelle Retourenabwicklung. Aktuell beinhaltet das Plugin die folgenden Zahlungsarten: -* Gesicherter Rechnungskauf -* Visa & MasterCard (inkl. Maestro) -* American Express - Anbindung Ihres bestehenden Akzeptanzvertrages -* SEPA Lastschrift +* Gesicherter Rechnungskauf +* Visa & MasterCard (inkl. Maestro) +* American Express - Anbindung Ihres bestehenden Akzeptanzvertrages +* SEPA Lastschrift * giropay - Online-Überweisung Deutschland * Sofortüberweisung - Online-Überweisung international * Überweisung - Vorkasse & Rechnung & Nachnahme * PayPal - Anbindung Ihres PayPal-Accounts -* Amazon Pay - Anbindung Ihres Amazon Pay-Accounts (In Kürze verfügbar!) +* Amazon Pay - Anbindung Ihres Amazon Pay-Accounts (In Kürze verfügbar!) ## Erste Schritte -Für die Nutzung benötigen Sie einen PAYONE Account und die PAYONE Zugangsdaten. Wenn Sie noch kein PAYONE Kunde sind und demnach keinen PAYONE Account besitzen, wenden Sie sich bitte an: +Für die Nutzung benötigst du einen PAYONE Account und die PAYONE Zugangsdaten. Wenn du noch kein PAYONE Kunde bist und demnach keinen PAYONE Account besitzt, wende dich bitte an: PSG Projektmanagement GmbH
Meergässle 4
@@ -28,39 +28,39 @@ Meergässle 4
Telefon: 07344-9592588
E-Mail: plenty@psg-projektmanagement.de
Internet: http://www.psg-projektmanagement.de
-Oder nutzen Sie folgendes Anmeldeformular
+Oder nutze folgendes Anmeldeformular
https://www.psg-projektmanagement.de/payone-plentymarkets/ -Nach Erhalt der Zugangsdaten loggen Sie sich im PAYONE Merchant Interface ein und nehmen die folgenden Einstellungen vor. +Nach Erhalt der Zugangsdaten loggst du dich im PAYONE Merchant Interface ein und nimmst die folgenden Einstellungen vor. ##### Einstellungen im PAYONE Merchant Interface vornehmen: -1. Öffnen Sie das Menü **Konfiguration » Zahlungsportale**. -2. Öffnen Sie das Tab **Erweitert** des Zahlungsportals Ihres Shops. -3. Tragen Sie im Feld **TransactionStatusURL** eine URL nach dem Schema **DOMAIN/payment/payone/status** ein. Den Platzhalter **DOMAIN** durch die URL zu Ihrem Webshop ersetzen. -4. Wählen Sie als **Verfahren Hashwert-Prüfung** die Option **md5 oder sha2-384 (für Migration)**. -5. **Speichern** Sie die Einstellungen. +1. Öffne das Menü **Konfiguration » Zahlungsportale**. +2. Öffne das Tab **Erweitert** des Zahlungsportals deines Shops. +3. Trage im Feld **TransactionStatusURL** eine URL nach dem Schema **DOMAIN/payment/payone/status** ein. Den Platzhalter **DOMAIN** durch die URL zu deinem Webshop ersetzen. +4. Wähle als **Verfahren Hashwert-Prüfung** die Option **md5 oder sha2-384 (für Migration)**. +5. **Speichere** die Einstellungen. -Aktivieren Sie die gewünschten PAYONE-Zahlungsarten in Ihrem plentymarkets Backend einmalig im Menü **System » Systemeinstellungen » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu finden Sie auf der Handbuchseite
Zahlungsarten verwalten . +Aktiviere die gewünschten PAYONE-Zahlungsarten in deinem plentymarkets Backend einmalig im Menü **Einrichtung » Aufträge » Zahlung » Zahlungsarten**. Weitere Informationen dazu findest du auf der Handbuchseite Zahlungsarten verwalten . -Stellen Sie zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. +Stelle zudem sicher, dass die Zahlungsart unter dem Punkt **Erlaubte Zahlungsarten** in den Kundenklassen vorhanden ist und nicht im Bereich **Gesperrte Zahlungsarten** in den Versandprofilen aufgeführt ist. ## Einrichtung des Plugins -Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolgen direkt in der Plugin-Übersicht Ihres plentymarkets Systems. Gehen Sie dazu wie im Folgenden beschrieben vor. +Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugin erfolgen direkt in der Plugin-Übersicht deines plentymarkets-Systems. Gehe dazu wie im Folgenden beschrieben vor. ##### Grundeinstellungen vornehmen: -1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**. -2. Klicken Sie in der Liste der Plugins auf den Namen des Plugins **PAYONE**. +1. Öffne das Menü **Plugins » Plugin-Übersicht**. +2. Klicke in der Liste der Plugins auf den Namen des Plugins **PAYONE**. → Die Detailansicht des Plugins öffnet sich. -3. Öffnen Sie den Menüpunkt **Konfiguration**. -4. Klicken Sie auf **Grundeinstellungen**. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 1 vor. -5. **Speichern** Sie die Einstellungen. +3. Öffne den Menüpunkt **Konfiguration**. +4. Klicke auf **Grundeinstellungen**. Nimm die Einstellungen anhand der Informationen in Tabelle 1 vor. +5. **Speichere** die Einstellungen.
- Tab. 6: Event procedure for automatically refunding BS PAYONE payments + Tab. 6: Event procedure for automatically refunding PAYONE payments
@@ -78,7 +78,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Merchant ID @@ -86,7 +86,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Portal ID @@ -94,7 +94,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Account ID @@ -102,7 +102,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Schlüssel @@ -110,7 +110,7 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Modus @@ -118,8 +118,8 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge Art der Autorisierung @@ -127,14 +127,14 @@ Die folgenden Einrichtungsschritte für das plentymarkets PAYONE Plugins erfolge ### Zahlungsarten einrichten -Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop zur Verfügung stehen sollen. Außerdem nehmen Sie für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehen Sie dazu wie im Folgenden beschrieben vor. +Im Folgenden legst du fest, welche PAYONE-Zahlungsarten deinen Kunden im Webshop zur Verfügung stehen sollen. Außerdem nimmst du für die festgelegten Zahlungsarten genauere Einstellungen vor. Gehe dazu wie im Folgenden beschrieben vor. ##### Zahlungsarten einrichten: -1. Öffnen Sie den Menüpunkt **Konfiguration** in der Detailansicht des Plugins. -2. Klicken Sie auf den Menüpunkt der Zahlungsart. Nehmen Sie die Einstellungen anhand der Informationen in Tabelle 2 vor. -5. **Speichern** Sie die Einstellungen. +1. Öffne den Menüpunkt **Konfiguration** in der Detailansicht des Plugins. +2. Klicke auf den Menüpunkt der Zahlungsart. Nimm die Einstellungen anhand der Informationen in Tabelle 2 vor. +5. **Speichere** die Einstellungen.
Tab. 1: Grundeinstellungen vornehmen
- Geben Sie hier die Kundennummer ein, die Sie bei der Registrierung bei PAYONE erhalten haben. + Gib hier die Kundennummer ein, die du bei der Registrierung bei PAYONE erhalten hast.
- Geben Sie hier die ID des Zahlungsportals ein, die Sie bei der Registrierung bei PAYONE erhalten haben. + Gib hier die ID des Zahlungsportals ein, die du bei der Registrierung bei PAYONE erhalten hast.
- Geben Sie hier die Account-ID ein, die Sie bei der Registrierung bei PAYONE erhalten haben. + Gib hier die Account-ID ein, die du bei der Registrierung bei PAYONE erhalten hast.
- Geben Sie hier den Schlüssel ein, den Sie bei der Registrierung bei PAYONE erhalten haben. + Gib hier den Schlüssel ein, den du bei der Registrierung bei PAYONE erhalten hast.
- Wahlen Sie zwischen den Optionen Test und Live. Wir empfehlen, während der Einrichtung des Plugins den Testmodus zu wählen. Währenddessen ist die Zahlungsart noch nicht in Ihrem Webshop verfügbar. Nach erfolgter Einrichtung wechseln Sie in den Livemodus und machen somit die Zahlungsart in Ihrem Webshop sichtbar. + Wähle zwischen den Optionen Test und Live. Wir empfehlen, während der Einrichtung des Plugins den Testmodus zu wählen. Währenddessen ist die Zahlungsart noch nicht in deinem Webshop verfügbar. Nach erfolgter Einrichtung wechsele in den Livemodus und mach somit die Zahlungsart in deinem Webshop sichtbar.
- Vorautorisierung: Wählen Sie diese Option, wenn der Zahlungseinzug beim Käufer nur vorgemerkt werden soll. Der Zahlungseinzug erfolgt dann durch eine Ereignisaktion, die beim Warenausgang ausgelöst werden muss (siehe Tabelle 5).
- Autorisierung:: Wählen Sie diese Option, wenn der Zahlungseinzug beim Käufer sofort stattfinden soll. Der Zahlungseingang wird somit direkt nach dem Kaufabschluss im Webshop in Ihrem plentymarkets System gebucht. + Vorautorisierung: Wähle diese Option, wenn der Zahlungseinzug beim Käufer nur vorgemerkt werden soll. Der Zahlungseinzug erfolgt dann durch eine Ereignisaktion, die beim Warenausgang ausgelöst werden muss (siehe Tabelle 5).
+ Autorisierung:: Wähle diese Option, wenn der Zahlungseinzug beim Käufer sofort stattfinden soll. Der Zahlungseingang wird somit direkt nach dem Kaufabschluss im Webshop in deinem plentymarkets-System gebucht.
@@ -152,7 +152,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Aktiv @@ -160,7 +160,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Name @@ -168,7 +168,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Beschreibung @@ -176,7 +176,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Minimaler Bestellwert @@ -184,7 +184,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Maximaler Bestellwert @@ -192,7 +192,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Erlaubte Lieferländer @@ -216,7 +216,7 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Minimale Kartengültigkeit in Tagen @@ -248,41 +248,46 @@ Im Folgenden legen Sie fest, welche PAYONE-Zahlungsarten Ihren Kunden im Webshop Erlaubte Kartentypen
Tab. 2: Zahlungsarten einrichten
- Wählen Sie die Option Ja, um die Zahlungsart zu aktivieren und somit im Webshop anzubieten.
Wählen Sie die Option Nein, wenn die Zahlungsart deaktiviert werden und damit nicht zur Verfügung stehen soll. + Wähle die Option Ja, um die Zahlungsart zu aktivieren und somit im Webshop anzubieten.
Wähle die Option Nein, wenn die Zahlungsart deaktiviert werden und damit nicht zur Verfügung stehen soll.
- Geben Sie einen Namen für die Zahlungsart ein. Dieser Name ist für Ihre Kunden im Webshop sichtbar. + Gib einen Namen für die Zahlungsart ein. Dieser Name ist für deine Kunden im Webshop sichtbar.
- Geben Sie einen Beschreibungstext für die Zahlungsart ein. Dieser Text ist für Ihre Kunden im Webshop sichtbar. + Gib einen Beschreibungstext für die Zahlungsart ein. Dieser Text ist für deine Kunden im Webshop sichtbar.
- Geben Sie einen minimalen Bestellwert ein, ab dem die Zahlungsart im Webshop verfügbar sein soll. + Gib einen minimalen Bestellwert ein, ab dem die Zahlungsart im Webshop verfügbar sein soll.
- Geben Sie einen maximalen Bestellwert ein, bis zu dem die Zahlungsart im Webshop verfügbar sein soll. Wird dieser Wert überschritten, ist die Zahlungsart nicht mehr verfügbar. + Gib einen maximalen Bestellwert ein, bis zu dem die Zahlungsart im Webshop verfügbar sein soll. Wird dieser Wert überschritten, ist die Zahlungsart nicht mehr verfügbar.
- Geben Sie kommasepariert die Lieferländer aus, für die die Zahlungsart verfügbar sein soll. + Gib kommasepariert die Lieferländer aus, für die die Zahlungsart verfügbar sein soll.
- Geben Sie die erforderliche minimale Kartengültigkeit an, über die eine Kreditkarte verfügen muss, um für die Zahlungsart akzeptiert zu werden. + Gib die erforderliche minimale Kartengültigkeit an, über die eine Kreditkarte verfügen muss, um für die Zahlungsart akzeptiert zu werden.
- Aktivieren Sie die Kartentypen, die für die Zahlungsart akzeptiert werden sollen. + Aktiviere die Kartentypen, die für die Zahlungsart akzeptiert werden sollen.
+**Hinweis**: Für die Zahlungsart **Gesicherter Rechnungskauf** sind eine eigene **Portal-ID** sowie ein eigener **Schlüssel** notwendig. Diese Portal-ID und dieser Schlüssel müssen im Plugin unter **Gesicherte Rechnung** bei der Konfiguration separat hinterlegt werden. Die Portal-ID und den Schlüssel erhältst du über das PAYONE Merchant Interface über das Menü **Konfiguration » Zahlungsportale**. + ## Ceres-Checkout anpassen -Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit Ihre Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum (nur für den gesicherten Rechnungskauf) korrekt eingeben können. +Als Nächstes ist eine Anpassung im Ceres Checkout notwendig, damit deine Kunden bei Bezahlvorgängen mit PAYONE ihr Geburtsdatum (nur für den gesicherten Rechnungskauf) korrekt eingeben können. ##### Ceres-Checkout anpassen für den gesicherten Rechnungskauf: -1. Öffnen Sie das Menü **Plugins » Plugin-Übersicht**.
→ Die Plugin-Übersicht wird geöffnet. -2. Klicken Sie auf **Ceres**.
→ Das Plugin wird geöffnet. -3. Klicken Sie im Verzeichnisbaum auf **Konfiguration**. -4. Wechseln Sie in das Tab **Kaufabwicklung und Mein Konto.** -5. Klappen Sie den Bereich **Rechnungsadressfelder im Adressformular anzeigen (DE)** auf. -6. Aktivieren Sie über die Checkbox die Option **Geburtsdatum**. -7. **Speichern** Sie die Einstellungen.
Im Checkout wird Ihren Kunden nun ein Feld zur Eingabe des Geburtsdatums angezeigt. +1. Öffne das Menü **Plugins » Plugin-Übersicht**.
+→ Die Plugin-Übersicht wird geöffnet. +2. Klicke auf **Ceres**.
+→ Das Plugin wird geöffnet. +3. Klicke im Verzeichnisbaum auf **Konfiguration**. +4. Wechsele in das Tab **Kaufabwicklung und Mein Konto.** +5. Klappe den Bereich **Rechnungsadressfelder im Adressformular anzeigen (DE)** auf. +6. Aktiviere über die Checkbox die Option **Geburtsdatum**. +7. **Speichere** die Einstellungen.
Im Checkout wird deinen Kunden nun ein Feld zur Eingabe des Geburtsdatums angezeigt. ## Template-Container verknüpfen -Für die Zahlungsart PAYONE stehen Ihnen verschiedene Möglichkeiten zur Verfügung, um sie in Ihrem Webshop einzubinden. +Für die Zahlungsart PAYONE stehen dir verschiedene Möglichkeiten zur Verfügung, um sie in deinem Webshop einzubinden. Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container hinterlegt, mit denen zur Individualisierung Contents verknüpft werden. ##### Container verknüpfen: -1. Öffnen Sie das Menü **CMS » Container-Verknüpfungen**. -2. Wählen Sie den gewünschten Content, der verknüpft werden soll. -3. Wählen Sie einen oder mehrere Container, in denen der zuvor gewählte Content dargestellt werden soll. Beachten Sie dazu die Erläuterungen in Tabelle 4. -4. **Speichern** Sie die Einstellungen.
→ Die Contents sind mit den Containern verknüpft. +1. Öffne das Menü **CMS » Container-Verknüpfungen**. +2. Wähle den gewünschten Content, der verknüpft werden soll. +3. Wähle einen oder mehrere Container, in denen der zuvor gewählte Content dargestellt werden soll. Beachte dazu die Erläuterungen in Tabelle 4. +4. **Speichere** die Einstellungen.
+→ Die Contents sind mit den Containern verknüpft. @@ -300,7 +305,7 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Order Confirmation Page Payment Data @@ -308,7 +313,7 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container Payone Checkout JS @@ -316,20 +321,23 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container ## Automatische Versandbestätigung an PAYONE senden -Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an PAYONE zu senden, sobald Sie den Auftrag versendet haben. +Richte eine Ereignisaktion ein, um eine automatische Versandbestätigung an PAYONE zu senden, sobald du den Auftrag versendet hast. -**Hinweis:** Die Einrichtung dieser Ereignisaktion ist zwingend notwendig, wenn als **Art der Autorisierung** die Option **Vorautorisierung** gewählt wurde (siehe Tabelle 1). Haben Sie die Option **Autorisierung** gewählt, ist diese Ereignisaktion nicht nutzbar und nicht notwendig. +**Hinweis:** Die Einrichtung dieser Ereignisaktion ist zwingend notwendig, wenn als **Art der Autorisierung** die Option **Vorautorisierung** gewählt wurde (siehe Tabelle 1). Hast du die Option **Autorisierung** gewählt, ist diese Ereignisaktion nicht nutzbar und nicht notwendig. ##### Ereignisaktion einrichten: -1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. -2. Klicken Sie auf **Ereignisaktion hinzufügen**.
→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. -3. Geben Sie einen Namen ein. -4. Wählen Sie das Ereignis gemäß Tabelle 5. -5. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird angelegt. -6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 5 vor. -7. Setzen Sie ein Häkchen bei **Aktiv**. -8. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird gespeichert. +1. Öffne das Menü **System » Aufträge » Ereignisaktionen**. +2. Klicke auf **Ereignisaktion hinzufügen**.
+→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +3. Gib einen Namen ein. +4. Wähle das Ereignis gemäß Tabelle 5. +5. **Speichere** die Einstellungen.
+→ Die Ereignisaktion wird angelegt. +6. Nimm die weiteren Einstellungen gemäß Tabelle 5 vor. +7. Setze ein Häkchen bei **Aktiv**. +8. **Speichere** die Einstellungen.
+→ Die Ereignisaktion wird gespeichert.
Tab. 4: Container verknüpfen
- Verknüpfen Sie diesen Content mit dem Container Order confirmation: Additional payment information, um die PAYONE-Zahlungsarten auf der Bestellbestätigungsseite im Webshop anzuzeigen. + Verknüpfe diesen Content mit dem Container Order confirmation: Additional payment information, um die PAYONE-Zahlungsarten auf der Bestellbestätigungsseite im Webshop anzuzeigen.
- Verknüpfen Sie diesen Content mit dem Container Script loader: After script loaded, um die PAYONE-Zahlungsarten während der Kaufabwicklung im Webshop anzuzeigen. + Verknüpfe diesen Content mit dem Container Script loader: After script loaded, um die PAYONE-Zahlungsarten während der Kaufabwicklung im Webshop anzuzeigen.
@@ -369,18 +377,21 @@ Richten Sie eine Ereignisaktion ein, um eine automatische Versandbestätigung an ## PAYONE-Zahlung automatisch zurückzahlen -Richten Sie eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über PAYONE zu automatisieren. +Richte eine Ereignisaktion ein, um die Rückzahlung einer Zahlung über PAYONE zu automatisieren. ##### Ereignisaktion einrichten: -1. Öffnen Sie das Menü **System » Aufträge » Ereignisaktionen**. -2. Klicken Sie auf **Ereignisaktion hinzufügen**.
→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. -3. Geben Sie einen Namen ein. -4. Wählen Sie das Ereignis gemäß Tabelle 6. -5. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird angelegt. -6. Nehmen Sie die weiteren Einstellungen gemäß Tabelle 6 vor. -7. Setzen Sie ein Häkchen bei **Aktiv**. -8. **Speichern** Sie die Einstellungen.
→ Die Ereignisaktion wird gespeichert. +1. Öffne das Menü **System » Aufträge » Ereignisaktionen**. +2. Klicke auf **Ereignisaktion hinzufügen**.
+→ Das Fenster **Neue Ereignisaktion erstellen** wird geöffnet. +3. Gib einen Namen ein. +4. Wähle das Ereignis gemäß Tabelle 6. +5. **Speichere** die Einstellungen.
+→ Die Ereignisaktion wird angelegt. +6. Nimm die weiteren Einstellungen gemäß Tabelle 6 vor. +7. Setze ein Häkchen bei **Aktiv**. +8. **Speichere** die Einstellungen.
+→ Die Ereignisaktion wird gespeichert.
diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 00c8775d..20b392c4 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -2,7 +2,7 @@ The PAYONE plugin has been developed for use with the online store Ceres and only works with its structure or other template plugins. The plugins Ceres and IO have to be activated so that the Payone plugin can be used. -# PAYONE Payment for plentymarkets 7 +# PAYONE Payment for plentymarkets The plentymarkets PAYONE plugin offers you access to international as well as local payment methods. In addition, the plugin offers the advantages of an integrated risk management system, automated refunds and swift processing of returns. @@ -45,7 +45,7 @@ Upon receipt of your access data, log in to the PAYONE merchant interface and ca 4. For the option **Method hash calculation**, select the option **md5 or sha2-384 (during migration)**. 5. **Save** the settings. -In your plentymarkets back end, activate the payment method once in the **System » System Settings » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. +In your plentymarkets back end, activate the payment method once in the **Setup » Orders » Payment » Methods** menu. More information on carrying out this setting is available on the Managing payment methods page of the manual. In addition, make sure that the payment method is included among the Permitted payment methods in the customer classes and that it is not listed among the Blocked payment methods in the shipping profiles. @@ -56,7 +56,8 @@ The following steps for setting up the plentymarkets PAYONE plugin are carried o ##### Carrying out the basic settings 1. Go to **Plugin » Plugin overview**. -2. In the plugin list, click on the name of the plugin **PAYONE**.
→ The detail view of the plugin opens. +2. In the plugin list, click on the name of the plugin **PAYONE**.
+→ The detail view of the plugin opens. 3. Open the menu entry **Configuration**. 4. Click on **Basic settings**. Carry out the settings according to the information provided in table 1. 5. **Save** the settings. @@ -252,6 +253,8 @@ In the following, you select the PAYONE payment methods that should be available
+**Note**: You need a separate **Portal ID** and **Key** for the payment method **Secure Invoice**. This Portal-ID and this key have to be deposited in the plugin while configuring it. You get the Portal ID and the Key via the PAYONE Merchant Interface in the **Configuration » Payment portals** menu. + ## Adjusting the Ceres checkout In the next step, an adjustment to your Ceres checkout settings is necessary. These adjustments need to be made so that customers using PAYONE for payment processes can enter their date of birth (for secure invoice only) correctly. @@ -262,8 +265,10 @@ In the next step, an adjustment to your Ceres checkout settings is necessary. Th ##### Adjusting the Ceres checkout for secure invoice: -1. Go to **Plugins » Plugin overview**.
→ The plugin overview opens. -2. Click on **Ceres**.
→ The plugin opens. +1. Go to **Plugins » Plugin overview**.
+→ The plugin overview opens. +2. Click on **Ceres**.
+→ The plugin opens. 3. Click on **Configuration** in the directory tree. 4. Click on the **Checkout and My account** tab. 5. Open the **Show invoice address fields in the address form (DE)** area. @@ -279,7 +284,8 @@ You have multiple options to integrate the payment method PAYONE into your onlin 1. Go to **CMS » Container links**. 2. Select the content that should be linked. 3. Select one or more containers in which the previously selected content should be displayed. Pay attention to the information provided in table 4. -4. **Save** the settings.
→ The content is linked to the containers +4. **Save** the settings.
+→ The content is linked to the containers @@ -320,13 +326,16 @@ Set up an event procedure to send an automatic shipping confirmation to PAYONE a ##### Setting up an event procedure: 1. Go to **System » Orders » Events**. -2. Click on **Add event procedure**.
→ The **Create new event procedure** window opens. +2. Click on **Add event procedure**.
+→ The **Create new event procedure** window opens. 3. Enter a name. 4. Select the event according to table 5. -5. **Save** the settings.
→ The event procedure is created. +5. **Save** the settings.
+→ The event procedure is created. 6. Carry out the further settings according to table 5. 7. Place a check mark next to the option **Active**. -8. **Save** the settings.
→ The event procedure is saved. +8. **Save** the settings.
+→ The event procedure is saved.
Tab. 4: Linking template containers
@@ -371,13 +380,16 @@ Set up an event procedure to automatically refund a PAYONE payment. ##### Setting up an event procedure: 1. Go to **System » Orders » Events**. -2. Click on **Add event procedure**.
→ The **Create new event procedure** window opens. +2. Click on **Add event procedure**.
+→ The **Create new event procedure** window opens. 3. Enter a name. 4. Select the event according to table 6. -5. **Save** the settings.
→ The event procedure is created. +5. **Save** the settings.
+→ The event procedure is created. 6. Carry out the further settings according to table 6. 7. Place a check mark next to the option **Active**. -8. **Save** the settings.
→ The event procedure is saved. +8. **Save** the settings.
+→ The event procedure is saved.
From 54cfb8e96e5a937fb73281daf9d7eda74c80f55a Mon Sep 17 00:00:00 2001 From: jawendel Date: Fri, 31 Jul 2020 08:04:30 +0200 Subject: [PATCH 107/107] Update User Guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - neuer Menüpfad für Containerverknüpfungen hinzugefügt (DE und EN) --- meta/documents/user_guide_de.md | 15 +++++++++------ meta/documents/user_guide_en.md | 13 ++++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/meta/documents/user_guide_de.md b/meta/documents/user_guide_de.md index f99c09a7..bb90bdc7 100644 --- a/meta/documents/user_guide_de.md +++ b/meta/documents/user_guide_de.md @@ -32,7 +32,7 @@ Oder nutze folgendes Anmeldeformular
https://www.psg-projektmanagement.de/payone-plentymarkets/ Nach Erhalt der Zugangsdaten loggst du dich im PAYONE Merchant Interface ein und nimmst die folgenden Einstellungen vor. @@ -283,11 +283,14 @@ Hierfür sind in den Templates in plentymarkets an relevanten Stellen Container ##### Container verknüpfen: -1. Öffne das Menü **CMS » Container-Verknüpfungen**. -2. Wähle den gewünschten Content, der verknüpft werden soll. -3. Wähle einen oder mehrere Container, in denen der zuvor gewählte Content dargestellt werden soll. Beachte dazu die Erläuterungen in Tabelle 4. -4. **Speichere** die Einstellungen.
-→ Die Contents sind mit den Containern verknüpft. +1. Öffne das Menü **Plugins » Plugin-Set-Übersicht**. +2. Öffne das Plugin-Set, das du bearbeiten möchtest. +3. Öffne die **Einstellungen** des Payone-Plugins. +4. Klicke auf **Container-Verknüpfungen**. +5. Wähle aus der Dropdown-Liste den Datenanbieter aus, den du verknüpfen möchtest. +6. Wähle den Container aus, mit dem du den Datenanbieter verknüpfen möchtest. Beachte dazu die Erläuterungen in Tabelle 4. +7. Wiederhole Schritte 5 und 6 für alle Datenanbieter, die due verknüpfen möchtest. +8. **Speichere** die Einstellungen. diff --git a/meta/documents/user_guide_en.md b/meta/documents/user_guide_en.md index 20b392c4..3f2971b4 100644 --- a/meta/documents/user_guide_en.md +++ b/meta/documents/user_guide_en.md @@ -281,11 +281,14 @@ You have multiple options to integrate the payment method PAYONE into your onlin ##### Linking template containers: -1. Go to **CMS » Container links**. -2. Select the content that should be linked. -3. Select one or more containers in which the previously selected content should be displayed. Pay attention to the information provided in table 4. -4. **Save** the settings.
-→ The content is linked to the containers +1. Go to Plugins » Plugin set overview. +2. Open the plugin set you want to edit. +3. Open the Settings of the Payone plugin. +4. Click on Container links. +5. From the drop-down list, select the data provider you want to link. +6. Select the container you want to link the data provider to. Pay attention to the information provided in table 4. +7. Repeat steps 5 and 6 for all data providers you want to link. +8. Save the settings.
Tab. 4: Container verknüpfen
Tab. 4: Linking template containers