From e45863663144f14527742a2bd302febd249c2c2d Mon Sep 17 00:00:00 2001 From: Peter Ojo Date: Thu, 11 Aug 2022 10:20:49 +0200 Subject: [PATCH 1/8] check if oneclick is enabled before filtering based on paymentMethods response (#281) --- src/Subscriber/PaymentSubscriber.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Subscriber/PaymentSubscriber.php b/src/Subscriber/PaymentSubscriber.php index cf9109fd..812c1616 100644 --- a/src/Subscriber/PaymentSubscriber.php +++ b/src/Subscriber/PaymentSubscriber.php @@ -273,6 +273,12 @@ public function onCheckoutConfirmLoaded(PageLoadedEvent $event) } } + $displaySaveCreditCardOption = $this->paymentMethodsFilterService->isPaymentMethodInCollection( + $page->getPaymentMethods(), + OneClickPaymentMethodHandler::getPaymentMethodCode(), + $this->adyenPluginProvider->getAdyenPluginId(), + ); + $paymentMethodsResponse = $this->paymentMethodsService->getPaymentMethods($salesChannelContext, $orderId); $filteredPaymentMethods = $this->paymentMethodsFilterService->filterShopwarePaymentMethods( $page->getPaymentMethods(), @@ -287,12 +293,6 @@ public function onCheckoutConfirmLoaded(PageLoadedEvent $event) $salesChannelContext->getToken() ); - $displaySaveCreditCardOption = $this->paymentMethodsFilterService->isPaymentMethodInCollection( - $page->getPaymentMethods(), - OneClickPaymentMethodHandler::getPaymentMethodCode(), - $this->adyenPluginProvider->getAdyenPluginId(), - ); - $salesChannelId = $salesChannelContext->getSalesChannel()->getId(); $page->addExtension( From 8dc514c0763a76d2fed2aa77f109980c9d6ad26e Mon Sep 17 00:00:00 2001 From: sevarozh Date: Wed, 24 Aug 2022 10:04:02 +0200 Subject: [PATCH 2/8] [PW-7083] inline checkout instead popup (#282) * AKQ-243 inline checkout instead popup * AKQ-243 fixed custom pay button * AKQ-243 removed unused jquery selector * AKQ-243 mount custom confirm button only if native confirm button enabled * AKQ-243 mount custom confirm button only if native confirm button enabled (dist) --- .../storefront/js/adyen-payment-shopware6.js | 2 +- .../src/checkout/confirm-order.plugin.js | 119 ++++++++++-------- src/Resources/app/storefront/src/main.js | 2 +- .../payment/payment-component-modal.html.twig | 55 -------- .../payment/payment-component.html.twig | 23 ++++ .../payment/payment-method.html.twig | 7 ++ .../page/account/order/index.html.twig | 1 - .../page/checkout/confirm/index.html.twig | 1 - 8 files changed, 97 insertions(+), 113 deletions(-) delete mode 100644 src/Resources/views/storefront/component/payment/payment-component-modal.html.twig create mode 100644 src/Resources/views/storefront/component/payment/payment-component.html.twig diff --git a/src/Resources/app/storefront/dist/storefront/js/adyen-payment-shopware6.js b/src/Resources/app/storefront/dist/storefront/js/adyen-payment-shopware6.js index 79b81dae..7e852a21 100644 --- a/src/Resources/app/storefront/dist/storefront/js/adyen-payment-shopware6.js +++ b/src/Resources/app/storefront/dist/storefront/js/adyen-payment-shopware6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["adyen-payment-shopware6"],{HNRU:function(e,t,n){"use strict";t.a={updatablePaymentMethods:["scheme","ideal","sepadirectdebit","oneclick","dotpay","bcmc","blik","eps","facilypay_3x","facilypay_4x","facilypay_6x","facilypay_10x","facilypay_12x","afterpay_default","ratepay","ratepay_directdebit","giftcard"],componentsWithPayButton:{applepay:{extra:{},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)}},paywithgoogle:{extra:{buttonSizeMode:"fill"},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)},onError:function(e,t,n){"CANCELED"!==e.statusCode&&("statusMessage"in e?console.log(e.statusMessage):console.log(e.statusCode))}},paypal:{extra:{},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()},onError:function(e,t,n){t.setStatus("ready"),window.location.href=n.errorUrl.toString()},onCancel:function(e,t,n){t.setStatus("ready"),window.location.href=n.errorUrl.toString()},responseHandler:function(e,t){try{(t=JSON.parse(t)).isFinal&&(location.href=e.returnUrl),this.handleAction(t.action)}catch(e){console.error(e)}}},amazonpay:{extra:{productType:"PayAndShip",checkoutMode:"ProcessOrder",returnUrl:location.href},prePayRedirect:!0,sessionKey:"amazonCheckoutSessionId",onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)},onError:function(e,t){console.log(e),t.setStatus("ready")}}},paymentMethodTypeHandlers:{scheme:"handler_adyen_cardspaymentmethodhandler",ideal:"handler_adyen_idealpaymentmethodhandler",klarna:"handler_adyen_klarnapaylaterpaymentmethodhandler",klarna_account:"handler_adyen_klarnaaccountpaymentmethodhandler",klarna_paynow:"handler_adyen_klarnapaynowpaymentmethodhandler",ratepay:"handler_adyen_ratepaypaymentmethodhandler",ratepay_directdebit:"handler_adyen_ratepaydirectdebitpaymentmethodhandler",sepadirectdebit:"handler_adyen_sepapaymentmethodhandler",sofort:"handler_adyen_sofortpaymentmethodhandler",paypal:"handler_adyen_paypalpaymentmethodhandler",oneclick:"handler_adyen_oneclickpaymentmethodhandler",giropay:"handler_adyen_giropaypaymentmethodhandler",applepay:"handler_adyen_applepaypaymentmethodhandler",paywithgoogle:"handler_adyen_googlepaypaymentmethodhandler",dotpay:"handler_adyen_dotpaypaymentmethodhandler",bcmc:"handler_adyen_bancontactcardpaymentmethodhandler",amazonpay:"handler_adyen_amazonpaypaymentmethodhandler",twint:"handler_adyen_twintpaymentmethodhandler",eps:"handler_adyen_epspaymentmethodhandler",swish:"handler_adyen_swishpaymentmethodhandler",alipay:"handler_adyen_alipaypaymentmethodhandler",alipay_hk:"handler_adyen_alipayhkpaymentmethodhandler",blik:"handler_adyen_blikpaymentmethodhandler",clearpay:"handler_adyen_clearpaypaymentmethodhandler",facilypay_3x:"handler_adyen_facilypay3xpaymentmethodhandler",facilypay_4x:"handler_adyen_facilypay4xpaymentmethodhandler",facilypay_6x:"handler_adyen_facilypay6xpaymentmethodhandler",facilypay_10x:"handler_adyen_facilypay10xpaymentmethodhandler",facilypay_12x:"handler_adyen_facilypay12xpaymentmethodhandler",afterpay_default:"handler_adyen_afterpaydefaultpaymentmethodhandler",trustly:"handler_adyen_trustlypaymentmethodhandler",paysafecard:"handler_adyen_paysafecardpaymentmethodhandler",givex:"handler_adyen_givexgiftcardpaymentmethodhandler",webshopgiftcard:"handler_adyen_webshopgiftcardpaymentmethodhandler",kadowereld:"handler_adyen_kadowereldgiftcardpaymentmethodhandler",tcstestgiftcard:"handler_adyen_tcstestgiftcardpaymentmethodhandler",albelligiftcard:"handler_adyen_albelligiftcardpaymentmethodhandler",bijcadeaucard:"handler_adyen_bijenkorfgiftcardpaymentmethodhandler",vvvgiftcard:"handler_adyen_vvvgiftcardpaymentmethodhandler",genericgiftcard:"handler_adyen_genericgiftcardpaymentmethodhandler",gallgall:"handler_adyen_gallgallgiftcardpaymentmethodhandler",hmlingerie:"handler_adyen_hunkemollerlingeriegiftcardpaymentmethodhandler",beautycadeaukaart:"handler_adyen_beautygiftcardpaymentmethodhandler",svs:"handler_adyen_svsgiftcardpaymentmethodhandler",fashioncheque:"handler_adyen_fashionchequegiftcardpaymentmethodhandler",decadeaukaart:"handler_adyen_decadeaukaartgiftcardpaymentmethodhandler"}}},TVZM:function(e,t,n){"use strict";n.r(t);var a=n("h8V8");window.PluginManager.register("ConfirmOrderPlugin",a.a,"[data-adyen-payment]")},h8V8:function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return _}));var a=n("FGIj"),r=n("gHbT"),o=n("p4AR"),i=n("2Y4b"),d=n("u0Tz"),s=n("HNRU");function l(e){return(l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function c(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function h(){return(h=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},n=adyenCheckoutOptions.orderId,a=null,r=null;n?(e.set("orderId",n),a=adyenCheckoutOptions.updatePaymentUrl,r=this.afterSetPayment.bind(this,t)):(a=adyenCheckoutOptions.checkoutOrderUrl,r=this.afterCreateOrder.bind(this,t)),this._client.post(a,e,r)}},{key:"afterCreateOrder",value:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;try{e=JSON.parse(n)}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",n)}this.orderId=e.id,this.finishUrl=new URL(location.origin+adyenCheckoutOptions.paymentFinishUrl),this.finishUrl.searchParams.set("orderId",e.id),this.errorUrl=new URL(location.origin+adyenCheckoutOptions.paymentErrorUrl),this.errorUrl.searchParams.set("orderId",e.id);var a={orderId:this.orderId,finishUrl:this.finishUrl.toString(),errorUrl:this.errorUrl.toString()};for(var r in t)a[r]=t[r];this._client.post(adyenCheckoutOptions.paymentHandleUrl,JSON.stringify(a),this.afterPayOrder.bind(this,this.orderId))}},{key:"afterSetPayment",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;try{var n=JSON.parse(t);n.success&&this.afterCreateOrder(e,JSON.stringify({id:adyenCheckoutOptions.orderId}))}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",t)}}},{key:"afterPayOrder",value:function(e,t){try{t=JSON.parse(t),this.returnUrl=t.redirectUrl}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",t)}this.returnUrl===this.errorUrl.toString()&&(location.href=this.returnUrl);try{this._client.post("".concat(adyenCheckoutOptions.paymentStatusUrl),JSON.stringify({orderId:e}),this.responseHandler.bind(this))}catch(e){console.log(e)}}},{key:"handlePaymentAction",value:function(t){e("[data-adyen-payment-component-modal]").modal().hide();try{var n=JSON.parse(t);n.isFinal&&(location.href=this.returnUrl),n.action&&(this.adyenCheckout.createFromAction(n.action).mount("[data-adyen-payment-action-container]"),["threeDS2","qrCode"].includes(n.action.type)&&e("[data-adyen-payment-action-modal]").modal({show:!0}))}catch(e){console.log(e)}}},{key:"initializeCustomPayButton",value:function(){var e=this,t=this.getSelectedPaymentMethodKey();if(t in s.a.componentsWithPayButton){var n=s.a.componentsWithPayButton[t];this.completePendingPayment(t,n);var a=this.adyenCheckout.paymentMethodsResponse.paymentMethods.filter((function(e){return e.type===t}));if(!(a.length<1)){var r=a[0];if(adyenCheckoutOptions.amount)if(n.prePayRedirect)this.renderPrePaymentButton(n,r);else{var o=h(n.extra,r,{amount:{value:adyenCheckoutOptions.amount,currency:adyenCheckoutOptions.currency},onClick:function(t,a){if(!n.onClick(t,a,e))return!1;d.a.create(document.body)},onSubmit:function(e,t){if(e.isValid){var a={stateData:JSON.stringify(e.data)},r=i.a.serialize(this.confirmOrderForm);"responseHandler"in n&&(this.responseHandler=n.responseHandler.bind(t,this)),this.confirmOrder(r,a)}else t.showValidation(),"test"===this.adyenCheckout.options.environment&&console.log("Payment failed: ",e)}.bind(this),onCancel:function(t,a){d.a.remove(document.body),n.onCancel(t,a,e)},onError:function(t,a){"PayPal"===a.props.name&&"CANCEL"===t.name&&e._client.post("".concat(adyenCheckoutOptions.cancelOrderTransactionUrl),JSON.stringify({orderId:e.orderId})),d.a.remove(document.body),n.onError(t,a,e),console.log(t)}}),l=this.adyenCheckout.create(r.type,o);try{"isAvailable"in l?l.isAvailable().then(function(){this.mountCustomPayButton(l)}.bind(this)).catch((function(e){console.log(r.type+" is not available",e)})):this.mountCustomPayButton(l)}catch(e){console.log(e)}}else console.error("Failed to fetch Cart/Order total amount.")}}}},{key:"renderPrePaymentButton",value:function(e,t){var n=this;"amazonpay"===t.type&&(e.extra=this.setAddressDetails(e.extra));var a=h(e.extra,t,{configuration:t.configuration,amount:{value:adyenCheckoutOptions.amount,currency:adyenCheckoutOptions.currency},onClick:function(t,a){if(!e.onClick(t,a,n))return!1;d.a.create(document.body)},onError:function(t,a){d.a.remove(document.body),e.onError(t,a,n),console.log(t)}}),r=this.adyenCheckout.create(t.type,a);this.mountCustomPayButton(r)}},{key:"completePendingPayment",value:function(e,t){var n=new URL(location.href);if(n.searchParams.has(t.sessionKey)){var a;d.a.create(document.body);var r=this.adyenCheckout.create(e,(c(a={},t.sessionKey,n.searchParams.get(t.sessionKey)),c(a,"showOrderButton",!1),c(a,"onSubmit",function(e,t){if(e.isValid){var n={stateData:JSON.stringify(e.data)},a=i.a.serialize(this.confirmOrderForm);this.confirmOrder(a,n)}}.bind(this)),a));this.mountCustomPayButton(r),r.submit()}}},{key:"getSelectedPaymentMethodKey",value:function(){return Object.keys(s.a.paymentMethodTypeHandlers).find((function(e){return s.a.paymentMethodTypeHandlers[e]===adyenCheckoutOptions.selectedPaymentMethodHandler}))}},{key:"mountCustomPayButton",value:function(t){var n=e('
');e("#confirmOrderForm").append(n),t.mount(n.get(0)),e("#confirmOrderForm button[type=submit]").remove()}},{key:"mountPaymentComponent",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=h({},e,{data:{personalDetails:shopperDetails,billingAddress:activeBillingAddress,deliveryAddress:activeShippingAddress},onSubmit:function(e,t){if(this.paymentComponent.find(".loader").show(),this.paymentComponent.find("[data-adyen-payment-container]").hide(),e.isValid){var n={stateData:JSON.stringify(e.data)},a=i.a.serialize(this.confirmOrderForm);this.confirmOrder(a,n)}else t.showValidation(),"test"===this.adyenCheckout.options.environment&&console.log("Payment failed: ",e)}.bind(this)});!n&&"scheme"===e.type&&adyenCheckoutOptions.displaySaveCreditCardOption&&(a.enableStoreDetails=!0);try{var r=this.adyenCheckout.create(e.type,a);r.mount(this.paymentComponent.find(t).get(0)),this.paymentComponent.find(".loader").hide()}catch(t){return console.error(e.type,t),!1}}},{key:"setAddressDetails",value:function(e){return""!==activeShippingAddress.phoneNumber?e.addressDetails={name:shopperDetails.firstName+" "+shopperDetails.lastName,addressLine1:activeShippingAddress.street,city:activeShippingAddress.city,postalCode:activeShippingAddress.postalCode,countryCode:activeShippingAddress.country,phoneNumber:activeShippingAddress.phoneNumber}:e.productType="PayOnly",e}}])&&u(a.prototype,l),_&&u(a,_),n}(a.a)}).call(this,n("UoTJ"))}},[["TVZM","runtime","vendor-node","vendor-shared"]]]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([["adyen-payment-shopware6"],{YcTq:function(e,t,n){"use strict";t.a={updatablePaymentMethods:["scheme","ideal","sepadirectdebit","oneclick","dotpay","bcmc","bcmc_mobile","blik","eps","facilypay_3x","facilypay_4x","facilypay_6x","facilypay_10x","facilypay_12x","afterpay_default","ratepay","ratepay_directdebit","giftcard"],componentsWithPayButton:{applepay:{extra:{},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)}},paywithgoogle:{extra:{buttonSizeMode:"fill"},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)},onError:function(e,t,n){"CANCELED"!==e.statusCode&&("statusMessage"in e?console.log(e.statusMessage):console.log(e.statusCode))}},paypal:{extra:{},onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()},onError:function(e,t,n){t.setStatus("ready"),window.location.href=n.errorUrl.toString()},onCancel:function(e,t,n){t.setStatus("ready"),window.location.href=n.errorUrl.toString()},responseHandler:function(e,t){try{(t=JSON.parse(t)).isFinal&&(location.href=e.returnUrl),this.handleAction(t.action)}catch(e){console.error(e)}}},amazonpay:{extra:{productType:"PayAndShip",checkoutMode:"ProcessOrder",returnUrl:location.href},prePayRedirect:!0,sessionKey:"amazonCheckoutSessionId",onClick:function(e,t,n){return n.confirmOrderForm.checkValidity()?(e(),!0):(t(),!1)},onError:function(e,t){console.log(e),t.setStatus("ready")}}},paymentMethodTypeHandlers:{scheme:"handler_adyen_cardspaymentmethodhandler",ideal:"handler_adyen_idealpaymentmethodhandler",klarna:"handler_adyen_klarnapaylaterpaymentmethodhandler",klarna_account:"handler_adyen_klarnaaccountpaymentmethodhandler",klarna_paynow:"handler_adyen_klarnapaynowpaymentmethodhandler",ratepay:"handler_adyen_ratepaypaymentmethodhandler",ratepay_directdebit:"handler_adyen_ratepaydirectdebitpaymentmethodhandler",sepadirectdebit:"handler_adyen_sepapaymentmethodhandler",sofort:"handler_adyen_sofortpaymentmethodhandler",paypal:"handler_adyen_paypalpaymentmethodhandler",oneclick:"handler_adyen_oneclickpaymentmethodhandler",giropay:"handler_adyen_giropaypaymentmethodhandler",applepay:"handler_adyen_applepaypaymentmethodhandler",paywithgoogle:"handler_adyen_googlepaypaymentmethodhandler",dotpay:"handler_adyen_dotpaypaymentmethodhandler",bcmc:"handler_adyen_bancontactcardpaymentmethodhandler",bcmc_mobile:"handler_adyen_bancontactmobilepaymentmethodhandler",amazonpay:"handler_adyen_amazonpaypaymentmethodhandler",twint:"handler_adyen_twintpaymentmethodhandler",eps:"handler_adyen_epspaymentmethodhandler",swish:"handler_adyen_swishpaymentmethodhandler",alipay:"handler_adyen_alipaypaymentmethodhandler",alipay_hk:"handler_adyen_alipayhkpaymentmethodhandler",blik:"handler_adyen_blikpaymentmethodhandler",clearpay:"handler_adyen_clearpaypaymentmethodhandler",facilypay_3x:"handler_adyen_facilypay3xpaymentmethodhandler",facilypay_4x:"handler_adyen_facilypay4xpaymentmethodhandler",facilypay_6x:"handler_adyen_facilypay6xpaymentmethodhandler",facilypay_10x:"handler_adyen_facilypay10xpaymentmethodhandler",facilypay_12x:"handler_adyen_facilypay12xpaymentmethodhandler",afterpay_default:"handler_adyen_afterpaydefaultpaymentmethodhandler",trustly:"handler_adyen_trustlypaymentmethodhandler",paysafecard:"handler_adyen_paysafecardpaymentmethodhandler",givex:"handler_adyen_givexgiftcardpaymentmethodhandler",webshopgiftcard:"handler_adyen_webshopgiftcardpaymentmethodhandler",kadowereld:"handler_adyen_kadowereldgiftcardpaymentmethodhandler",tcstestgiftcard:"handler_adyen_tcstestgiftcardpaymentmethodhandler",albelligiftcard:"handler_adyen_albelligiftcardpaymentmethodhandler",bijcadeaucard:"handler_adyen_bijenkorfgiftcardpaymentmethodhandler",vvvgiftcard:"handler_adyen_vvvgiftcardpaymentmethodhandler",genericgiftcard:"handler_adyen_genericgiftcardpaymentmethodhandler",gallgall:"handler_adyen_gallgallgiftcardpaymentmethodhandler",hmlingerie:"handler_adyen_hunkemollerlingeriegiftcardpaymentmethodhandler",beautycadeaukaart:"handler_adyen_beautygiftcardpaymentmethodhandler",svs:"handler_adyen_svsgiftcardpaymentmethodhandler",fashioncheque:"handler_adyen_fashionchequegiftcardpaymentmethodhandler",decadeaukaart:"handler_adyen_decadeaukaartgiftcardpaymentmethodhandler"}}},j5lx:function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return _}));var a=n("FGIj"),r=n("gHbT"),o=n("p4AR"),i=n("2Y4b"),d=n("u0Tz"),s=n("YcTq");function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function h(){return(h=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},n=adyenCheckoutOptions.orderId,a=null,r=null;n?(e.set("orderId",n),a=adyenCheckoutOptions.updatePaymentUrl,r=this.afterSetPayment.bind(this,t)):(a=adyenCheckoutOptions.checkoutOrderUrl,r=this.afterCreateOrder.bind(this,t)),this._client.post(a,e,r)}},{key:"afterCreateOrder",value:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;try{e=JSON.parse(n)}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",n)}this.orderId=e.id,this.finishUrl=new URL(location.origin+adyenCheckoutOptions.paymentFinishUrl),this.finishUrl.searchParams.set("orderId",e.id),this.errorUrl=new URL(location.origin+adyenCheckoutOptions.paymentErrorUrl),this.errorUrl.searchParams.set("orderId",e.id);var a={orderId:this.orderId,finishUrl:this.finishUrl.toString(),errorUrl:this.errorUrl.toString()};for(var r in t)a[r]=t[r];this._client.post(adyenCheckoutOptions.paymentHandleUrl,JSON.stringify(a),this.afterPayOrder.bind(this,this.orderId))}},{key:"afterSetPayment",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;try{var n=JSON.parse(t);n.success&&this.afterCreateOrder(e,JSON.stringify({id:adyenCheckoutOptions.orderId}))}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",t)}}},{key:"afterPayOrder",value:function(e,t){try{t=JSON.parse(t),this.returnUrl=t.redirectUrl}catch(e){return d.a.remove(document.body),void console.log("Error: invalid response from Shopware API",t)}this.returnUrl===this.errorUrl.toString()&&(location.href=this.returnUrl);try{this._client.post("".concat(adyenCheckoutOptions.paymentStatusUrl),JSON.stringify({orderId:e}),this.responseHandler.bind(this))}catch(e){console.log(e)}}},{key:"handlePaymentAction",value:function(t){try{var n=JSON.parse(t);n.isFinal&&(location.href=this.returnUrl),n.action&&(this.adyenCheckout.createFromAction(n.action).mount("[data-adyen-payment-action-container]"),["threeDS2","qrCode"].includes(n.action.type)&&e("[data-adyen-payment-action-modal]").modal({show:!0}))}catch(e){console.log(e)}}},{key:"initializeCustomPayButton",value:function(){var e=this,t=s.a.componentsWithPayButton[this.selectedAdyenPaymentMethod];this.completePendingPayment(this.selectedAdyenPaymentMethod,t);var n=this.adyenCheckout.paymentMethodsResponse.paymentMethods.filter((function(t){return t.type===e.selectedAdyenPaymentMethod}));if(!(n.length<1)){var a=n[0];if(adyenCheckoutOptions.amount)if(t.prePayRedirect)this.renderPrePaymentButton(t,a);else{var r=h(t.extra,a,{amount:{value:adyenCheckoutOptions.amount,currency:adyenCheckoutOptions.currency},data:{personalDetails:shopperDetails,billingAddress:activeBillingAddress,deliveryAddress:activeShippingAddress},onClick:function(n,a){if(!t.onClick(n,a,e))return!1;d.a.create(document.body)},onSubmit:function(e,n){if(e.isValid){var a={stateData:JSON.stringify(e.data)},r=i.a.serialize(this.confirmOrderForm);"responseHandler"in t&&(this.responseHandler=t.responseHandler.bind(n,this)),this.confirmOrder(r,a)}else n.showValidation(),"test"===this.adyenCheckout.options.environment&&console.log("Payment failed: ",e)}.bind(this),onCancel:function(n,a){d.a.remove(document.body),t.onCancel(n,a,e)},onError:function(n,a){"PayPal"===a.props.name&&"CANCEL"===n.name&&e._client.post("".concat(adyenCheckoutOptions.cancelOrderTransactionUrl),JSON.stringify({orderId:e.orderId})),d.a.remove(document.body),t.onError(n,a,e),console.log(n)}}),o=this.adyenCheckout.create(a.type,r);try{"isAvailable"in o?o.isAvailable().then(function(){this.mountCustomPayButton(o)}.bind(this)).catch((function(e){console.log(a.type+" is not available",e)})):this.mountCustomPayButton(o)}catch(e){console.log(e)}}else console.error("Failed to fetch Cart/Order total amount.")}}},{key:"renderPrePaymentButton",value:function(e,t){var n=this;"amazonpay"===t.type&&(e.extra=this.setAddressDetails(e.extra));var a=h(e.extra,t,{configuration:t.configuration,amount:{value:adyenCheckoutOptions.amount,currency:adyenCheckoutOptions.currency},onClick:function(t,a){if(!e.onClick(t,a,n))return!1;d.a.create(document.body)},onError:function(t,a){d.a.remove(document.body),e.onError(t,a,n),console.log(t)}}),r=this.adyenCheckout.create(t.type,a);this.mountCustomPayButton(r)}},{key:"completePendingPayment",value:function(e,t){var n=new URL(location.href);if(n.searchParams.has(t.sessionKey)){var a;d.a.create(document.body);var r=this.adyenCheckout.create(e,(l(a={},t.sessionKey,n.searchParams.get(t.sessionKey)),l(a,"showOrderButton",!1),l(a,"onSubmit",function(e,t){if(e.isValid){var n={stateData:JSON.stringify(e.data)},a=i.a.serialize(this.confirmOrderForm);this.confirmOrder(a,n)}}.bind(this)),a));this.mountCustomPayButton(r),r.submit()}}},{key:"getSelectedPaymentMethodKey",value:function(){return Object.keys(s.a.paymentMethodTypeHandlers).find((function(e){return s.a.paymentMethodTypeHandlers[e]===adyenCheckoutOptions.selectedPaymentMethodHandler}))}},{key:"mountCustomPayButton",value:function(e){var t=document.querySelector("#confirmOrderForm");if(t){var n=t.querySelector("button[type=submit]");if(n&&!n.disabled){var a=document.createElement("div");a.id="adyen-confirm-button",a.setAttribute("data-adyen-confirm-button",""),t.appendChild(a),e.mount(a),n.remove()}}}},{key:"mountPaymentComponent",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=h({},e,{data:{personalDetails:shopperDetails,billingAddress:activeBillingAddress,deliveryAddress:activeShippingAddress},onSubmit:function(e,t){if(e.isValid){var n={stateData:JSON.stringify(e.data)},a=i.a.serialize(this.confirmOrderForm);d.a.create(document.body),this.confirmOrder(a,n)}else t.showValidation(),"test"===this.adyenCheckout.options.environment&&console.log("Payment failed: ",e)}.bind(this)});!t&&"scheme"===e.type&&adyenCheckoutOptions.displaySaveCreditCardOption&&(n.enableStoreDetails=!0);try{var a=this.adyenCheckout.create(e.type,n);a.mount("#"+this.el.id),this.confirmFormSubmit.addEventListener("click",function(e){r.a.querySelector(document,"#confirmOrderForm").checkValidity()&&(e.preventDefault(),this.el.parentNode.scrollIntoView({behavior:"smooth",block:"start"}),a.submit())}.bind(this))}catch(t){return console.error(e.type,t),!1}}},{key:"setAddressDetails",value:function(e){return""!==activeShippingAddress.phoneNumber?e.addressDetails={name:shopperDetails.firstName+" "+shopperDetails.lastName,addressLine1:activeShippingAddress.street,city:activeShippingAddress.city,postalCode:activeShippingAddress.postalCode,countryCode:activeShippingAddress.country,phoneNumber:activeShippingAddress.phoneNumber}:e.productType="PayOnly",e}}])&&m(a.prototype,c),_&&m(a,_),n}(a.a)}).call(this,n("UoTJ"))},jC4o:function(e,t,n){"use strict";n.r(t);var a=n("j5lx");window.PluginManager.register("ConfirmOrderPlugin",a.a,"#adyen-payment-checkout-mask")}},[["jC4o","runtime","vendor-node","vendor-shared"]]]); \ No newline at end of file diff --git a/src/Resources/app/storefront/src/checkout/confirm-order.plugin.js b/src/Resources/app/storefront/src/checkout/confirm-order.plugin.js index 8a4ec6a1..2191c0a9 100644 --- a/src/Resources/app/storefront/src/checkout/confirm-order.plugin.js +++ b/src/Resources/app/storefront/src/checkout/confirm-order.plugin.js @@ -33,14 +33,38 @@ export default class ConfirmOrderPlugin extends Plugin { init() { this._client = new StoreApiClient(); + this.selectedAdyenPaymentMethod = this.getSelectedPaymentMethodKey(); this.confirmOrderForm = DomAccess.querySelector(document, '#confirmOrderForm'); this.confirmFormSubmit = DomAccess.querySelector(document, '#confirmOrderForm button[type="submit"]'); - this.confirmFormSubmit.addEventListener('click', this.onConfirmOrderSubmit.bind(this)); - this.paymentComponent = $(`[data-adyen-payment-component]`); this.responseHandler = this.handlePaymentAction; this.adyenCheckout = Promise; this.initializeCheckoutComponent().then(function () { - this.initializeCustomPayButton(); + + // Non adyen payment method selected + // this can not happen, because this js plugin is registered only if adyen methods selected + // PluginManager.register('ConfirmOrderPlugin', ConfirmOrderPlugin, '#adyen-payment-checkout-mask'); + if (adyenCheckoutOptions.selectedPaymentMethodPluginId !== + adyenCheckoutOptions.adyenPluginId) { + return; + } + + if (!adyenCheckoutOptions || !adyenCheckoutOptions.paymentStatusUrl || + !adyenCheckoutOptions.checkoutOrderUrl || !adyenCheckoutOptions.paymentHandleUrl) { + console.error('Adyen payment configuration missing.'); + return; + } + + if (this.selectedAdyenPaymentMethod in adyenConfiguration.componentsWithPayButton) { + // replaces confirm button with adyen pay button for paywithgoogle, applepay etc. + this.initializeCustomPayButton(); + } + + if (adyenConfiguration.updatablePaymentMethods.includes(this.selectedAdyenPaymentMethod) && !this.stateData) { + // create inline component for cards etc. and set event listener for submit button to confirm payment component + this.renderPaymentComponent(this.selectedAdyenPaymentMethod); + } else { + this.confirmFormSubmit.addEventListener('click', this.onConfirmOrderSubmit.bind(this)); + } }.bind(this)); } @@ -50,11 +74,16 @@ export default class ConfirmOrderPlugin extends Plugin { locale, clientKey, environment, - showPayButton: true, + showPayButton: this.selectedAdyenPaymentMethod in adyenConfiguration.componentsWithPayButton, hasHolderName: true, paymentMethodsResponse: JSON.parse(paymentMethodsResponse), onAdditionalDetails: this.handleOnAdditionalDetails.bind(this), - countryCode: activeShippingAddress.country + countryCode: activeShippingAddress.country, + paymentMethodsConfiguration: { + card: { + hasHolderName: true, + } + }, }; this.adyenCheckout = await AdyenCheckout(ADYEN_CHECKOUT_CONFIG); } @@ -75,43 +104,13 @@ export default class ConfirmOrderPlugin extends Plugin { } onConfirmOrderSubmit(event) { - // Non adyen payment method selected - if (adyenCheckoutOptions.selectedPaymentMethodPluginId !== - adyenCheckoutOptions.adyenPluginId) { - return true; - } - - if (!adyenCheckoutOptions || !adyenCheckoutOptions.paymentStatusUrl || - !adyenCheckoutOptions.checkoutOrderUrl || !adyenCheckoutOptions.paymentHandleUrl) { - console.error('Adyen payment configuration missing.'); - return; - } - const form = DomAccess.querySelector(document, '#confirmOrderForm'); if (!form.checkValidity()) { return; } - event.preventDefault(); - ElementLoadingIndicatorUtil.create(document.body); - - // get selected payment method - let selectedAdyenPaymentMethod = this.getSelectedPaymentMethodKey(); - - const updatableSelected = adyenConfiguration.updatablePaymentMethods.includes(selectedAdyenPaymentMethod); - - if (updatableSelected && !this.stateData) { - // render component to collect payment data - this.renderPaymentComponent(selectedAdyenPaymentMethod); - $('[data-adyen-payment-component-modal]').modal({show: true}).on('hidden.bs.modal', function (e) { - window.location.reload(); - }); - return; - } - const formData = FormSerializeUtil.serialize(form); - this.confirmOrder(formData); } @@ -134,7 +133,7 @@ export default class ConfirmOrderPlugin extends Plugin { let paymentMethod = paymentMethodConfigs[0]; // Mount payment method instance - this.mountPaymentComponent(paymentMethod, '[data-adyen-payment-container]', false); + this.mountPaymentComponent(paymentMethod, false); } renderStoredPaymentMethodComponents() { @@ -248,7 +247,6 @@ export default class ConfirmOrderPlugin extends Plugin { } handlePaymentAction(response) { - $('[data-adyen-payment-component-modal]').modal().hide(); try { const paymentResponse = JSON.parse(response); if (paymentResponse.isFinal) { @@ -269,19 +267,14 @@ export default class ConfirmOrderPlugin extends Plugin { } initializeCustomPayButton() { - // get selected payment method - let selectedAdyenPaymentMethod = this.getSelectedPaymentMethodKey(); - if (!(selectedAdyenPaymentMethod in adyenConfiguration.componentsWithPayButton)) { - return; - } - const componentConfig = adyenConfiguration.componentsWithPayButton[selectedAdyenPaymentMethod]; + const componentConfig = adyenConfiguration.componentsWithPayButton[this.selectedAdyenPaymentMethod]; - this.completePendingPayment(selectedAdyenPaymentMethod, componentConfig); + this.completePendingPayment(this.selectedAdyenPaymentMethod, componentConfig); // get selected payment method object let selectedPaymentMethod = this.adyenCheckout.paymentMethodsResponse.paymentMethods - .filter(item => item.type === selectedAdyenPaymentMethod); + .filter(item => item.type === this.selectedAdyenPaymentMethod); if (selectedPaymentMethod.length < 1) { return; @@ -431,13 +424,21 @@ export default class ConfirmOrderPlugin extends Plugin { } mountCustomPayButton(paymentMethodInstance) { - let confirmButtonContainer = $('
'); - $('#confirmOrderForm').append(confirmButtonContainer); - paymentMethodInstance.mount(confirmButtonContainer.get(0)); - $('#confirmOrderForm button[type=submit]').remove(); + let form = document.querySelector('#confirmOrderForm'); + if (form) { + let submitButton = form.querySelector('button[type=submit]'); + if (submitButton && !submitButton.disabled) { + let confirmButtonContainer = document.createElement('div'); + confirmButtonContainer.id = 'adyen-confirm-button'; + confirmButtonContainer.setAttribute('data-adyen-confirm-button', '') + form.appendChild(confirmButtonContainer); + paymentMethodInstance.mount(confirmButtonContainer); + submitButton.remove(); + } + } } - mountPaymentComponent(paymentMethod, selector, isOneClick = false) { + mountPaymentComponent(paymentMethod, isOneClick = false) { const configuration = Object.assign({}, paymentMethod, { data: { personalDetails: shopperDetails, @@ -445,13 +446,12 @@ export default class ConfirmOrderPlugin extends Plugin { deliveryAddress: activeShippingAddress }, onSubmit: function(state, component) { - this.paymentComponent.find('.loader').show(); - this.paymentComponent.find('[data-adyen-payment-container]').hide(); if (state.isValid) { let extraParams = { stateData: JSON.stringify(state.data) }; let formData = FormSerializeUtil.serialize(this.confirmOrderForm); + ElementLoadingIndicatorUtil.create(document.body); this.confirmOrder(formData, extraParams); } else { component.showValidation(); @@ -466,8 +466,19 @@ export default class ConfirmOrderPlugin extends Plugin { } try { const paymentMethodInstance = this.adyenCheckout.create(paymentMethod.type, configuration); - paymentMethodInstance.mount(this.paymentComponent.find(selector).get(0)); - this.paymentComponent.find('.loader').hide(); + paymentMethodInstance.mount('#' + this.el.id); + this.confirmFormSubmit.addEventListener('click', function(event) { + const form = DomAccess.querySelector(document, '#confirmOrderForm'); + if (!form.checkValidity()) { + return; + } + event.preventDefault(); + this.el.parentNode.scrollIntoView({ + behavior: "smooth", + block: "start", + }); + paymentMethodInstance.submit(); + }.bind(this)); } catch (err) { console.error(paymentMethod.type, err); return false; diff --git a/src/Resources/app/storefront/src/main.js b/src/Resources/app/storefront/src/main.js index c1c6d676..0ec1d120 100644 --- a/src/Resources/app/storefront/src/main.js +++ b/src/Resources/app/storefront/src/main.js @@ -3,4 +3,4 @@ import ConfirmOrderPlugin from './checkout/confirm-order.plugin'; // Register them via the existing PluginManager const PluginManager = window.PluginManager; -PluginManager.register('ConfirmOrderPlugin', ConfirmOrderPlugin, '[data-adyen-payment]'); +PluginManager.register('ConfirmOrderPlugin', ConfirmOrderPlugin, '#adyen-payment-checkout-mask'); diff --git a/src/Resources/views/storefront/component/payment/payment-component-modal.html.twig b/src/Resources/views/storefront/component/payment/payment-component-modal.html.twig deleted file mode 100644 index 2226a745..00000000 --- a/src/Resources/views/storefront/component/payment/payment-component-modal.html.twig +++ /dev/null @@ -1,55 +0,0 @@ -{% block adyen_payment_compoment_modal %} - -{% endblock %} diff --git a/src/Resources/views/storefront/component/payment/payment-component.html.twig b/src/Resources/views/storefront/component/payment/payment-component.html.twig new file mode 100644 index 00000000..91f90be6 --- /dev/null +++ b/src/Resources/views/storefront/component/payment/payment-component.html.twig @@ -0,0 +1,23 @@ +
+ {% if(adyenFrontendData.storedPaymentMethods|length > 0) and 'oneclick' in adyenFrontendData.selectedPaymentMethodHandler %} + {% for storedPaymentMethod in adyenFrontendData.storedPaymentMethods %} +
+
+ +
+
+
+ {% if loop.last == false %} +
{% endif %} + {% endfor %} + {% endif %} +
diff --git a/src/Resources/views/storefront/component/payment/payment-method.html.twig b/src/Resources/views/storefront/component/payment/payment-method.html.twig index dedaa66f..ee857f33 100644 --- a/src/Resources/views/storefront/component/payment/payment-method.html.twig +++ b/src/Resources/views/storefront/component/payment/payment-method.html.twig @@ -11,3 +11,10 @@ {% endif %} class="{{ formCheckInputClass }} payment-method-input {% if 'handler_adyen_' in payment.formattedHandlerIdentifier %}adyen-payment-method-input-radio{% endif %}"> {% endblock %} + +{% block component_payment_method_description_text %} + {{ parent() }} + {% if payment.id is same as(selectedPaymentMethodId) and 'handler_adyen_' in payment.formattedHandlerIdentifier %} + {% sw_include '@AdyenPaymentShopware6/storefront/component/payment/payment-component.html.twig' %} + {% endif %} +{% endblock %} diff --git a/src/Resources/views/storefront/page/account/order/index.html.twig b/src/Resources/views/storefront/page/account/order/index.html.twig index 1af128e7..e3e55404 100644 --- a/src/Resources/views/storefront/page/account/order/index.html.twig +++ b/src/Resources/views/storefront/page/account/order/index.html.twig @@ -6,6 +6,5 @@ {{ parent() }} {% block base_footer_adyen %} {% sw_include '@AdyenPaymentShopware6/storefront/component/payment/payment-action-modal.html.twig' %} - {% sw_include '@AdyenPaymentShopware6/storefront/component/payment/payment-component-modal.html.twig' %} {% endblock %} {% endblock %} diff --git a/src/Resources/views/storefront/page/checkout/confirm/index.html.twig b/src/Resources/views/storefront/page/checkout/confirm/index.html.twig index 4a1f0744..820b8e0b 100644 --- a/src/Resources/views/storefront/page/checkout/confirm/index.html.twig +++ b/src/Resources/views/storefront/page/checkout/confirm/index.html.twig @@ -6,6 +6,5 @@ {{ parent() }} {% block base_footer_adyen %} {% sw_include '@AdyenPaymentShopware6/storefront/component/payment/payment-action-modal.html.twig' %} - {% sw_include '@AdyenPaymentShopware6/storefront/component/payment/payment-component-modal.html.twig' %} {% endblock %} {% endblock %} From 9f99bfaf59a2d02b1d7a35b7a6023948f16d2ae7 Mon Sep 17 00:00:00 2001 From: Miguel Werner Date: Wed, 31 Aug 2022 10:18:09 +0200 Subject: [PATCH 3/8] allow to use custom line item types in cart & order (#283) Co-authored-by: Miguel Werner --- src/Handlers/AbstractPaymentMethodHandler.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Handlers/AbstractPaymentMethodHandler.php b/src/Handlers/AbstractPaymentMethodHandler.php index 1d4a0ec1..a2718d07 100644 --- a/src/Handlers/AbstractPaymentMethodHandler.php +++ b/src/Handlers/AbstractPaymentMethodHandler.php @@ -42,6 +42,7 @@ use Adyen\Shopware\Storefront\Controller\RedirectResultController; use Adyen\Util\Currency; use Psr\Log\LoggerInterface; +use Shopware\Core\Checkout\Cart\LineItem\LineItem; use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStateHandler; use Shopware\Core\Checkout\Payment\Cart\AsyncPaymentTransactionStruct; use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\AsynchronousPaymentHandlerInterface; @@ -564,8 +565,8 @@ protected function preparePaymentsRequest( //Getting line price $price = $orderLine->getPrice(); - // Skip promotion line items. - if (empty($orderLine->getProductId()) && $orderLine->getType() === self::PROMOTION) { + + if (empty($orderLine->getProductId()) || $orderLine->getType() !== LineItem::PRODUCT_LINE_ITEM_TYPE) { continue; } From d5c849bd626701501c116b96fc644d2ce01a8770 Mon Sep 17 00:00:00 2001 From: peterojo Date: Wed, 31 Aug 2022 10:34:42 +0200 Subject: [PATCH 4/8] Version bump 3.6.0 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4eb919d2..655e66ea 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ } ], "description": "Official Shopware 6 Plugin to connect to Payment Service Provider Adyen", - "version": "3.5.0", + "version": "3.6.0", "type": "shopware-platform-plugin", "license": "MIT", "require": { From 69f29a7f452e8147d75e6796a6835ee502e1b72d Mon Sep 17 00:00:00 2001 From: peterojo Date: Wed, 31 Aug 2022 11:07:04 +0200 Subject: [PATCH 5/8] Update lock file --- composer.lock | 1413 ++++++++++++++++++++++--------------------------- 1 file changed, 646 insertions(+), 767 deletions(-) diff --git a/composer.lock b/composer.lock index 5d5e8965..f71a1505 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6daa73e6b14ae541e2e00611939cafb2", + "content-hash": "dcc0c9c2555ceb19dd544e7d70e91f80", "packages": [ { "name": "adyen/php-api-library", @@ -155,16 +155,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.222.4", + "version": "3.234.6", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a6ea9c9a93b35de272286f1de470eea637109415" + "reference": "c0ae9fbc8295678502a8fde6a2ecc49f2bd39580" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a6ea9c9a93b35de272286f1de470eea637109415", - "reference": "a6ea9c9a93b35de272286f1de470eea637109415", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c0ae9fbc8295678502a8fde6a2ecc49f2bd39580", + "reference": "c0ae9fbc8295678502a8fde6a2ecc49f2bd39580", "shasum": "" }, "require": { @@ -172,9 +172,9 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^5.3.3 || ^6.2.1 || ^7.0", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", "guzzlehttp/promises": "^1.4.0", - "guzzlehttp/psr7": "^1.7.0 || ^2.1.1", + "guzzlehttp/psr7": "^1.8.5 || ^2.3", "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, @@ -182,6 +182,7 @@ "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", + "composer/composer": "^1.10.22", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", @@ -240,9 +241,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.222.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.234.6" }, - "time": "2022-05-03T21:08:50+00:00" + "time": "2022-08-30T20:25:10+00:00" }, { "name": "brick/math", @@ -380,16 +381,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.1", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -436,7 +437,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.1" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -452,20 +453,20 @@ "type": "tidelift" } ], - "time": "2021-10-28T20:44:15+00:00" + "time": "2022-07-20T07:14:26+00:00" }, { "name": "composer/composer", - "version": "2.2.12", + "version": "2.2.18", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "ba61e768b410736efe61df01b61f1ec44f51474f" + "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/ba61e768b410736efe61df01b61f1ec44f51474f", - "reference": "ba61e768b410736efe61df01b61f1ec44f51474f", + "url": "https://api.github.com/repos/composer/composer/zipball/84175907664ca8b73f73f4883e67e886dfefb9f5", + "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5", "shasum": "" }, "require": { @@ -535,7 +536,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.2.12" + "source": "https://github.com/composer/composer/tree/2.2.18" }, "funding": [ { @@ -551,7 +552,7 @@ "type": "tidelift" } ], - "time": "2022-04-13T14:42:25+00:00" + "time": "2022-08-20T09:33:38+00:00" }, { "name": "composer/metadata-minifier", @@ -776,16 +777,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.6", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a30d487169d799745ca7280bc90fdfa693536901" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", - "reference": "a30d487169d799745ca7280bc90fdfa693536901", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { @@ -836,7 +837,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -852,7 +853,7 @@ "type": "tidelift" } ], - "time": "2021-11-18T10:14:14+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -1060,16 +1061,16 @@ }, { "name": "doctrine/cache", - "version": "2.1.1", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", - "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", "shasum": "" }, "require": { @@ -1079,18 +1080,12 @@ "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", - "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" }, "type": "library", "autoload": { @@ -1139,7 +1134,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.1.1" + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, "funding": [ { @@ -1155,30 +1150,31 @@ "type": "tidelift" } ], - "time": "2021-07-17T14:49:29+00:00" + "time": "2022-05-20T20:07:39+00:00" }, { "name": "doctrine/collections", - "version": "1.6.8", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" + "reference": "3fe77330f5591108bbf1315da7377a7e704ed8a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", - "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", + "url": "https://api.github.com/repos/doctrine/collections/zipball/3fe77330f5591108bbf1315da7377a7e704ed8a0", + "reference": "3fe77330f5591108bbf1315da7377a7e704ed8a0", "shasum": "" }, "require": { + "doctrine/deprecations": "^0.5.3 || ^1", "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12", + "doctrine/coding-standard": "^9.0 || ^10.0", + "phpstan/phpstan": "^1.4.8", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", - "vimeo/psalm": "^4.2.1" + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -1222,9 +1218,9 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.8" + "source": "https://github.com/doctrine/collections/tree/1.7.2" }, - "time": "2021-08-10T18:51:53+00:00" + "time": "2022-08-27T16:08:58+00:00" }, { "name": "doctrine/dbal", @@ -1380,34 +1376,31 @@ }, { "name": "doctrine/event-manager", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", + "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "doctrine/common": "<2.9@dev" + "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "~1.4.10 || ^1.5.4", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common" @@ -1454,7 +1447,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + "source": "https://github.com/doctrine/event-manager/tree/1.1.2" }, "funding": [ { @@ -1470,7 +1463,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T18:28:51+00:00" + "time": "2022-07-27T22:18:11+00:00" }, { "name": "doctrine/inflector", @@ -1646,16 +1639,16 @@ }, { "name": "doctrine/persistence", - "version": "2.5.2", + "version": "2.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "4276c6cbc0ca692c190f650a2678623bf04af2d2" + "reference": "830c2ba42093e0e428eca37568ab36bd8008bc17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/4276c6cbc0ca692c190f650a2678623bf04af2d2", - "reference": "4276c6cbc0ca692c190f650a2678623bf04af2d2", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/830c2ba42093e0e428eca37568ab36bd8008bc17", + "reference": "830c2ba42093e0e428eca37568ab36bd8008bc17", "shasum": "" }, "require": { @@ -1728,7 +1721,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.5.2" + "source": "https://github.com/doctrine/persistence/tree/2.5.4" }, "funding": [ { @@ -1744,20 +1737,20 @@ "type": "tidelift" } ], - "time": "2022-05-02T17:29:02+00:00" + "time": "2022-08-06T22:06:57+00:00" }, { "name": "egulias/email-validator", - "version": "3.1.2", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ee0db30118f661fb166bcffbf5d82032df484697" + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ee0db30118f661fb166bcffbf5d82032df484697", - "reference": "ee0db30118f661fb166bcffbf5d82032df484697", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", "shasum": "" }, "require": { @@ -1804,7 +1797,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/3.1.2" + "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" }, "funding": [ { @@ -1812,7 +1805,7 @@ "type": "github" } ], - "time": "2021-10-11T09:18:27+00:00" + "time": "2022-06-18T20:57:19+00:00" }, { "name": "enqueue/amqp-tools", @@ -1875,16 +1868,16 @@ }, { "name": "enqueue/dbal", - "version": "0.10.15", + "version": "0.10.17", "source": { "type": "git", "url": "https://github.com/php-enqueue/dbal.git", - "reference": "1f08ebb74160b6ee2acf359b5572d1a4a5b9197b" + "reference": "d6c6d38290415d6383ab156a9cf580a99bd05522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/dbal/zipball/1f08ebb74160b6ee2acf359b5572d1a4a5b9197b", - "reference": "1f08ebb74160b6ee2acf359b5572d1a4a5b9197b", + "url": "https://api.github.com/repos/php-enqueue/dbal/zipball/d6c6d38290415d6383ab156a9cf580a99bd05522", + "reference": "d6c6d38290415d6383ab156a9cf580a99bd05522", "shasum": "" }, "require": { @@ -1933,7 +1926,7 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2021-10-29T20:26:35+00:00" + "time": "2022-01-10T17:47:44+00:00" }, { "name": "enqueue/dsn", @@ -2345,23 +2338,28 @@ }, { "name": "firebase/php-jwt", - "version": "v6.1.2", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "c297139da7c6873dbd67cbd1093f09ec0bbd0c50" + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/c297139da7c6873dbd67cbd1093f09ec0bbd0c50", - "reference": "c297139da7c6873dbd67cbd1093f09ec0bbd0c50", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", "shasum": "" }, "require": { "php": "^7.1||^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.5||9.5" + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" }, "suggest": { "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" @@ -2396,22 +2394,22 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.1.2" + "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" }, - "time": "2022-04-21T14:37:18+00:00" + "time": "2022-07-15T16:48:45+00:00" }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.10", + "version": "v1.0.12", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "88dda72c48633326c81a01b861c8b6a923948f56" + "reference": "8419f0158715b30d4b99a5bd37c6a39671994ad7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/88dda72c48633326c81a01b861c8b6a923948f56", - "reference": "88dda72c48633326c81a01b861c8b6a923948f56", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/8419f0158715b30d4b99a5bd37c6a39671994ad7", + "reference": "8419f0158715b30d4b99a5bd37c6a39671994ad7", "shasum": "" }, "require": { @@ -2468,7 +2466,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.10" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.12" }, "funding": [ { @@ -2480,20 +2478,20 @@ "type": "tidelift" } ], - "time": "2022-05-01T10:41:21+00:00" + "time": "2022-05-05T09:31:05+00:00" }, { "name": "google/auth", - "version": "v1.21.0", + "version": "v1.21.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "73392bad2eb6852eea9084b6bbdec752515cb849" + "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/73392bad2eb6852eea9084b6bbdec752515cb849", - "reference": "73392bad2eb6852eea9084b6bbdec752515cb849", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/aa3b9ca29258ac6347ce3c8937a2418c5d78f840", + "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840", "shasum": "" }, "require": { @@ -2536,42 +2534,43 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.1" }, - "time": "2022-04-13T20:35:52+00:00" + "time": "2022-05-16T19:34:15+00:00" }, { "name": "google/cloud-core", - "version": "v1.44.4", + "version": "v1.47.2", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "971b7e163e0cc2b282c462d3a709891af7004d53" + "reference": "f30823d6ff2bf3d7d3a4b089804f8dc5a1680501" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/971b7e163e0cc2b282c462d3a709891af7004d53", - "reference": "971b7e163e0cc2b282c462d3a709891af7004d53", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/f30823d6ff2bf3d7d3a4b089804f8dc5a1680501", + "reference": "f30823d6ff2bf3d7d3a4b089804f8dc5a1680501", "shasum": "" }, "require": { "google/auth": "^1.18", - "guzzlehttp/guzzle": "^5.3|^6.0|^7.0", + "guzzlehttp/guzzle": "^5.3|^6.5.7|^7.4.4", "guzzlehttp/promises": "^1.3", "guzzlehttp/psr7": "^1.7|^2.0", "monolog/monolog": "^1.1|^2.0", - "php": ">=5.5", + "php": ">=5.6", "psr/http-message": "1.0.*", "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/common-protos": "^1.0||^2.0", "google/gax": "^1.9", "opis/closure": "^3", - "phpdocumentor/reflection": "^3.0", - "phpunit/phpunit": "^4.8|^5.0", - "squizlabs/php_codesniffer": "2.*" + "phpdocumentor/reflection": "^3.0||^4.0", + "phpspec/prophecy": "^1.10.3", + "phpunit/phpunit": "^4.8|^5.0|^8.0", + "squizlabs/php_codesniffer": "2.*", + "yoast/phpunit-polyfills": "^1.0" }, "suggest": { "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", @@ -2600,9 +2599,9 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.44.4" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.47.2" }, - "time": "2022-05-04T00:38:37+00:00" + "time": "2022-08-23T20:22:22+00:00" }, { "name": "google/cloud-storage", @@ -2830,16 +2829,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { @@ -2894,7 +2893,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, "funding": [ { @@ -2910,7 +2909,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", @@ -3148,16 +3147,16 @@ }, { "name": "laminas/laminas-code", - "version": "4.5.1", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e" + "reference": "16ec7577ff315d53ac2e1b1f03a344d8fe680a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/6fd96d4d913571a2cd056a27b123fa28cb90ac4e", - "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/16ec7577ff315d53ac2e1b1f03a344d8fe680a6e", + "reference": "16ec7577ff315d53ac2e1b1f03a344d8fe680a6e", "shasum": "" }, "require": { @@ -3169,7 +3168,7 @@ "laminas/laminas-coding-standard": "^2.3.0", "laminas/laminas-stdlib": "^3.6.1", "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.16.1", + "psalm/plugin-phpunit": "^0.17.0", "vimeo/psalm": "^4.13.1" }, "suggest": { @@ -3210,7 +3209,7 @@ "type": "community_bridge" } ], - "time": "2021-12-19T18:06:55+00:00" + "time": "2022-07-28T22:46:52+00:00" }, { "name": "lcobucci/clock", @@ -3497,16 +3496,16 @@ }, { "name": "league/flysystem-aws-s3-v3", - "version": "1.0.29", + "version": "1.0.30", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "4e25cc0582a36a786c31115e419c6e40498f6972" + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4e25cc0582a36a786c31115e419c6e40498f6972", - "reference": "4e25cc0582a36a786c31115e419c6e40498f6972", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af286f291ebab6877bac0c359c6c2cb017eb061d", + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d", "shasum": "" }, "require": { @@ -3542,9 +3541,23 @@ "description": "Flysystem adapter for the AWS S3 SDK v3.x", "support": { "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.29" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.30" }, - "time": "2020-10-08T18:58:37+00:00" + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-07-02T13:51:38+00:00" }, { "name": "league/flysystem-memory", @@ -3659,16 +3672,16 @@ }, { "name": "league/oauth2-server", - "version": "8.3.4", + "version": "8.3.5", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-server.git", - "reference": "0c2f32cd766861f3add4b95c49c5fcef3427e133" + "reference": "7aeb7c42b463b1a6fe4d084d3145e2fa22436876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/0c2f32cd766861f3add4b95c49c5fcef3427e133", - "reference": "0c2f32cd766861f3add4b95c49c5fcef3427e133", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/7aeb7c42b463b1a6fe4d084d3145e2fa22436876", + "reference": "7aeb7c42b463b1a6fe4d084d3145e2fa22436876", "shasum": "" }, "require": { @@ -3735,7 +3748,7 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-server/issues", - "source": "https://github.com/thephpleague/oauth2-server/tree/8.3.4" + "source": "https://github.com/thephpleague/oauth2-server/tree/8.3.5" }, "funding": [ { @@ -3743,37 +3756,40 @@ "type": "github" } ], - "time": "2022-04-07T21:33:04+00:00" + "time": "2022-05-03T21:21:28+00:00" }, { "name": "league/uri", - "version": "6.5.0", + "version": "6.7.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a" + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/c68ca445abb04817d740ddd6d0b3551826ef0c5a", - "reference": "c68ca445abb04817d740ddd6d0b3551826ef0c5a", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", + "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea", "shasum": "" }, "require": { "ext-json": "*", "league/uri-interfaces": "^2.3", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "psr/http-message": "^1.0" }, "conflict": { "league/uri-schemes": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", - "phpstan/phpstan": "^0.12.90", - "phpstan/phpstan-phpunit": "^0.12.22", - "phpstan/phpstan-strict-rules": "^0.12.11", - "phpunit/phpunit": "^8.0 || ^9.0", + "friendsofphp/php-cs-fixer": "^v3.3.2", + "nyholm/psr7": "^1.5", + "php-http/psr7-integration-tests": "^1.1", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.5.10", "psr/http-factory": "^1.0" }, "suggest": { @@ -3805,7 +3821,7 @@ } ], "description": "URI manipulation library", - "homepage": "http://uri.thephpleague.com", + "homepage": "https://uri.thephpleague.com", "keywords": [ "data-uri", "file-uri", @@ -3831,7 +3847,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri/issues", - "source": "https://github.com/thephpleague/uri/tree/6.5.0" + "source": "https://github.com/thephpleague/uri/tree/6.7.1" }, "funding": [ { @@ -3839,7 +3855,7 @@ "type": "github" } ], - "time": "2021-08-27T09:54:07+00:00" + "time": "2022-06-29T09:48:18+00:00" }, { "name": "league/uri-interfaces", @@ -4028,16 +4044,16 @@ }, { "name": "monolog/monolog", - "version": "2.5.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4192345e260f1d51b365536199744b987e160edc" + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4192345e260f1d51b365536199744b987e160edc", - "reference": "4192345e260f1d51b365536199744b987e160edc", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", "shasum": "" }, "require": { @@ -4050,18 +4066,22 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", + "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -4076,7 +4096,6 @@ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -4111,7 +4130,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.5.0" + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" }, "funding": [ { @@ -4123,7 +4142,7 @@ "type": "tidelift" } ], - "time": "2022-04-08T15:43:54+00:00" + "time": "2022-07-24T11:55:47+00:00" }, { "name": "mtdowling/jmespath.php", @@ -5542,16 +5561,16 @@ }, { "name": "sensio/framework-extra-bundle", - "version": "v6.2.6", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "6bd976c99ef3f78e31c9490a10ba6dd8901076eb" + "reference": "b27b8d6a43c508db1ea0df6c87774dd49014913c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/6bd976c99ef3f78e31c9490a10ba6dd8901076eb", - "reference": "6bd976c99ef3f78e31c9490a10ba6dd8901076eb", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/b27b8d6a43c508db1ea0df6c87774dd49014913c", + "reference": "b27b8d6a43c508db1ea0df6c87774dd49014913c", "shasum": "" }, "require": { @@ -5614,9 +5633,81 @@ ], "support": { "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.6" + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.7" }, - "time": "2022-01-14T11:51:13+00:00" + "time": "2022-06-16T09:06:24+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.3.6", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "6231e315f73e4f62d72b73f3d6d78ff0eed93c31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/6231e315f73e4f62d72b73f3d6d78ff0eed93c31", + "reference": "6231e315f73e4f62d72b73f3d6d78ff0eed93c31", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "setasign/fpdf": "~1.8", + "setasign/tfpdf": "1.31", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "~6.2" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.3.6" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2021-02-11T11:37:01+00:00" }, { "name": "shopware/conflicts", @@ -5650,16 +5741,16 @@ }, { "name": "shopware/core", - "version": "6.4.11.0", + "version": "6.4.14.0", "source": { "type": "git", "url": "https://github.com/shopware/core.git", - "reference": "36554f81ba04f5744ca5cc7c1cddfc0f42d2ee4f" + "reference": "2a0b985775b54e8f622183a4266d2d9269b59530" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/shopware/core/zipball/36554f81ba04f5744ca5cc7c1cddfc0f42d2ee4f", - "reference": "36554f81ba04f5744ca5cc7c1cddfc0f42d2ee4f", + "url": "https://api.github.com/repos/shopware/core/zipball/2a0b985775b54e8f622183a4266d2d9269b59530", + "reference": "2a0b985775b54e8f622183a4266d2d9269b59530", "shasum": "" }, "require": { @@ -5692,7 +5783,7 @@ "ext-zlib": "*", "ezyang/htmlpurifier": "4.13.0", "google/cloud-storage": "~1.25.1", - "guzzlehttp/guzzle": "~7.2", + "guzzlehttp/guzzle": "~7.4.5", "guzzlehttp/psr7": "^1.8.0", "jdorn/sql-formatter": "1.2.17", "lcobucci/jwt": "~4.1.5", @@ -5709,6 +5800,7 @@ "psr/http-message": "1.0.1", "psr/log": "1.1.2", "sensio/framework-extra-bundle": "~6.2.1", + "setasign/fpdi": "2.3.6", "shopware/conflicts": "*", "shopwarelabs/dompdf": "1.0.3", "squirrelphp/twig-php-syntax": "1.7.0", @@ -5758,11 +5850,12 @@ "symfony/validator": "~5.4.1", "symfony/var-exporter": "~5.4.0", "symfony/yaml": "~5.4.0", + "tecnickcom/tcpdf": "6.4.4", "true/punycode": "2.1.1", "twig/intl-extra": "~3.3.5", "twig/string-extra": "~3.3.5", "twig/twig": "~3.3.8", - "zircote/swagger-php": "3.3.2" + "zircote/swagger-php": "~3.3.6" }, "require-dev": { "bheller/images-generator": "~1.0.1", @@ -5818,23 +5911,23 @@ "docs": "https://developer.shopware.com", "forum": "https://forum.shopware.com", "issues": "https://issues.shopware.com", - "source": "https://github.com/shopware/core/tree/v6.4.11.0", + "source": "https://github.com/shopware/core/tree/v6.4.14.0", "wiki": "https://developer.shopware.com" }, - "time": "2022-05-04T06:32:39+00:00" + "time": "2022-08-01T03:12:48+00:00" }, { "name": "shopware/storefront", - "version": "6.4.11.0", + "version": "6.4.14.0", "source": { "type": "git", "url": "https://github.com/shopware/storefront.git", - "reference": "35d2be05053c141d2ecda65c359227bf1b76f774" + "reference": "eb390cde73812a0042210763dec58dcc7422ebf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/shopware/storefront/zipball/35d2be05053c141d2ecda65c359227bf1b76f774", - "reference": "35d2be05053c141d2ecda65c359227bf1b76f774", + "url": "https://api.github.com/repos/shopware/storefront/zipball/eb390cde73812a0042210763dec58dcc7422ebf0", + "reference": "eb390cde73812a0042210763dec58dcc7422ebf0", "shasum": "" }, "require": { @@ -5844,7 +5937,7 @@ "padaliyajay/php-autoprefixer": "1.3", "php": "^7.4.3 || ^8.0", "scssphp/scssphp": "1.10.0", - "shopware/core": "v6.4.11.0", + "shopware/core": "v6.4.14.0", "symfony/cache": "~5.4.0", "symfony/cache-contracts": "2.2.0", "symfony/config": "~5.4.0", @@ -5896,10 +5989,10 @@ "docs": "https://developer.shopware.com", "forum": "https://forum.shopware.com", "issues": "https://issues.shopware.com", - "source": "https://github.com/shopware/storefront/tree/v6.4.11.0", + "source": "https://github.com/shopware/storefront/tree/v6.4.14.0", "wiki": "https://developer.shopware.com" }, - "time": "2022-05-04T06:32:40+00:00" + "time": "2022-08-01T03:12:50+00:00" }, { "name": "shopwarelabs/dompdf", @@ -6150,16 +6243,16 @@ }, { "name": "symfony/amqp-messenger", - "version": "v5.4.5", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "4175a0a98507e7ec575dca9b36e6c0a5a072d3fd" + "reference": "4065cb4af96eb9ade8d33e38f9ce99de7d42f090" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/4175a0a98507e7ec575dca9b36e6c0a5a072d3fd", - "reference": "4175a0a98507e7ec575dca9b36e6c0a5a072d3fd", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/4065cb4af96eb9ade8d33e38f9ce99de7d42f090", + "reference": "4065cb4af96eb9ade8d33e38f9ce99de7d42f090", "shasum": "" }, "require": { @@ -6199,7 +6292,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.5" + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.11" }, "funding": [ { @@ -6215,7 +6308,7 @@ "type": "tidelift" } ], - "time": "2022-02-09T15:49:12+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/asset", @@ -6293,16 +6386,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "4c6747cf7e56c6b8e3094dd24852bd3e364375b1" + "reference": "5a0fff46df349f0db3fe242263451fddf5277362" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/4c6747cf7e56c6b8e3094dd24852bd3e364375b1", - "reference": "4c6747cf7e56c6b8e3094dd24852bd3e364375b1", + "url": "https://api.github.com/repos/symfony/cache/zipball/5a0fff46df349f0db3fe242263451fddf5277362", + "reference": "5a0fff46df349f0db3fe242263451fddf5277362", "shasum": "" }, "require": { @@ -6370,7 +6463,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.8" + "source": "https://github.com/symfony/cache/tree/v5.4.11" }, "funding": [ { @@ -6386,7 +6479,7 @@ "type": "tidelift" } ], - "time": "2022-04-26T13:19:20+00:00" + "time": "2022-07-28T15:25:17+00:00" }, { "name": "symfony/cache-contracts", @@ -6469,16 +6562,16 @@ }, { "name": "symfony/config", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9f8964f56f7234f8ace16f66cb3fbae950c04e68" + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9f8964f56f7234f8ace16f66cb3fbae950c04e68", - "reference": "9f8964f56f7234f8ace16f66cb3fbae950c04e68", + "url": "https://api.github.com/repos/symfony/config/zipball/ec79e03125c1d2477e43dde8528535d90cc78379", + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379", "shasum": "" }, "require": { @@ -6528,7 +6621,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.8" + "source": "https://github.com/symfony/config/tree/v5.4.11" }, "funding": [ { @@ -6544,20 +6637,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:02:29+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/console", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b" + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", - "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", + "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", "shasum": "" }, "require": { @@ -6627,7 +6720,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.8" + "source": "https://github.com/symfony/console/tree/v5.4.12" }, "funding": [ { @@ -6643,20 +6736,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:02:29+00:00" + "time": "2022-08-17T13:18:05+00:00" }, { "name": "symfony/debug-bundle", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "6f508169752ed2c0d0d8a6641c4cca39a8f1dfcb" + "reference": "ec73a8bb7b966ccbe9e76be3c7dc413d8ae84f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/6f508169752ed2c0d0d8a6641c4cca39a8f1dfcb", - "reference": "6f508169752ed2c0d0d8a6641c4cca39a8f1dfcb", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/ec73a8bb7b966ccbe9e76be3c7dc413d8ae84f47", + "reference": "ec73a8bb7b966ccbe9e76be3c7dc413d8ae84f47", "shasum": "" }, "require": { @@ -6706,7 +6799,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v5.4.3" + "source": "https://github.com/symfony/debug-bundle/tree/v5.4.11" }, "funding": [ { @@ -6722,20 +6815,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "855e29cd715ad62bb840c9841fe09a7cde50811f" + "reference": "a8b9251016e9476db73e25fa836904bc0bf74c62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/855e29cd715ad62bb840c9841fe09a7cde50811f", - "reference": "855e29cd715ad62bb840c9841fe09a7cde50811f", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a8b9251016e9476db73e25fa836904bc0bf74c62", + "reference": "a8b9251016e9476db73e25fa836904bc0bf74c62", "shasum": "" }, "require": { @@ -6795,7 +6888,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.8" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.11" }, "funding": [ { @@ -6811,7 +6904,7 @@ "type": "tidelift" } ], - "time": "2022-04-26T13:08:29+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6882,16 +6975,16 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "5a3d269d9934dee87555a05f71ea1b9c5acf61fb" + "reference": "7649a80e917b47c5072480a2d763c2422da239d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/5a3d269d9934dee87555a05f71ea1b9c5acf61fb", - "reference": "5a3d269d9934dee87555a05f71ea1b9c5acf61fb", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/7649a80e917b47c5072480a2d763c2422da239d2", + "reference": "7649a80e917b47c5072480a2d763c2422da239d2", "shasum": "" }, "require": { @@ -6935,7 +7028,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.8" + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.12" }, "funding": [ { @@ -6951,7 +7044,7 @@ "type": "tidelift" } ], - "time": "2022-04-26T18:02:07+00:00" + "time": "2022-08-09T12:54:00+00:00" }, { "name": "symfony/dotenv", @@ -7026,16 +7119,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c1fcde614dfe99d62a83b796a53b8bad358b266a" + "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1fcde614dfe99d62a83b796a53b8bad358b266a", - "reference": "c1fcde614dfe99d62a83b796a53b8bad358b266a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/f75d17cb4769eb38cd5fccbda95cd80a054d35c8", + "reference": "f75d17cb4769eb38cd5fccbda95cd80a054d35c8", "shasum": "" }, "require": { @@ -7077,7 +7170,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.8" + "source": "https://github.com/symfony/error-handler/tree/v5.4.11" }, "funding": [ { @@ -7093,20 +7186,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.3", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { @@ -7162,7 +7255,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -7178,7 +7271,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -7261,16 +7354,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.7", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d67c1f9a1937406a9be3171b4b22250c0a11447", + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447", "shasum": "" }, "require": { @@ -7305,7 +7398,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.7" + "source": "https://github.com/symfony/filesystem/tree/v5.4.12" }, "funding": [ { @@ -7321,20 +7414,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T12:33:59+00:00" + "time": "2022-08-02T13:48:16+00:00" }, { "name": "symfony/finder", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { @@ -7368,7 +7461,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.8" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -7384,20 +7477,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "e2423e443bd6e6d5371d5c72d5d1a98c8d9fbb45" + "reference": "49f8fe5d39b7513a3f26898788885dbe66b0d910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/e2423e443bd6e6d5371d5c72d5d1a98c8d9fbb45", - "reference": "e2423e443bd6e6d5371d5c72d5d1a98c8d9fbb45", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/49f8fe5d39b7513a3f26898788885dbe66b0d910", + "reference": "49f8fe5d39b7513a3f26898788885dbe66b0d910", "shasum": "" }, "require": { @@ -7455,7 +7548,7 @@ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^5.3|^6.0", "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", + "symfony/console": "^5.4.9|^6.0.9", "symfony/css-selector": "^4.4|^5.0|^6.0", "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", "symfony/dotenv": "^5.1|^6.0", @@ -7519,7 +7612,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.8" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.12" }, "funding": [ { @@ -7535,20 +7628,20 @@ "type": "tidelift" } ], - "time": "2022-04-26T13:36:06+00:00" + "time": "2022-08-26T10:32:10+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2" + "reference": "f4bfe9611b113b15d98a43da68ec9b5a00d56791" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2", - "reference": "ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4bfe9611b113b15d98a43da68ec9b5a00d56791", + "reference": "f4bfe9611b113b15d98a43da68ec9b5a00d56791", "shasum": "" }, "require": { @@ -7560,8 +7653,11 @@ "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -7592,7 +7688,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.12" }, "funding": [ { @@ -7608,20 +7704,20 @@ "type": "tidelift" } ], - "time": "2022-04-22T08:14:12+00:00" + "time": "2022-08-19T07:33:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "cf7e61106abfc19b305ca0aedc41724ced89a02a" + "reference": "37f660fa3bcd78fe4893ce23ebe934618ec099be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cf7e61106abfc19b305ca0aedc41724ced89a02a", - "reference": "cf7e61106abfc19b305ca0aedc41724ced89a02a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/37f660fa3bcd78fe4893ce23ebe934618ec099be", + "reference": "37f660fa3bcd78fe4893ce23ebe934618ec099be", "shasum": "" }, "require": { @@ -7704,7 +7800,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.12" }, "funding": [ { @@ -7720,20 +7816,20 @@ "type": "tidelift" } ], - "time": "2022-04-27T17:22:21+00:00" + "time": "2022-08-26T14:40:40+00:00" }, { "name": "symfony/inflector", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "6157dac05bbd287d341b82d67a549fdf468f86d1" + "reference": "4cb14dfb9cf782a1c743aaf4dac101003583d377" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/6157dac05bbd287d341b82d67a549fdf468f86d1", - "reference": "6157dac05bbd287d341b82d67a549fdf468f86d1", + "url": "https://api.github.com/repos/symfony/inflector/zipball/4cb14dfb9cf782a1c743aaf4dac101003583d377", + "reference": "4cb14dfb9cf782a1c743aaf4dac101003583d377", "shasum": "" }, "require": { @@ -7776,7 +7872,7 @@ "words" ], "support": { - "source": "https://github.com/symfony/inflector/tree/v5.4.3" + "source": "https://github.com/symfony/inflector/tree/v5.4.11" }, "funding": [ { @@ -7793,20 +7889,20 @@ } ], "abandoned": "EnglishInflector from the String component", - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T11:34:24+00:00" }, { "name": "symfony/intl", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "b9e17d7ab867ce99f89950ebced0fa91076ba12b" + "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/b9e17d7ab867ce99f89950ebced0fa91076ba12b", - "reference": "b9e17d7ab867ce99f89950ebced0fa91076ba12b", + "url": "https://api.github.com/repos/symfony/intl/zipball/d305c0c1d31b30b3876e041804c35e49e5f8a96e", + "reference": "d305c0c1d31b30b3876e041804c35e49e5f8a96e", "shasum": "" }, "require": { @@ -7865,7 +7961,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.8" + "source": "https://github.com/symfony/intl/tree/v5.4.11" }, "funding": [ { @@ -7881,20 +7977,20 @@ "type": "tidelift" } ], - "time": "2022-04-07T09:39:59+00:00" + "time": "2022-07-20T11:34:24+00:00" }, { "name": "symfony/lock", - "version": "v5.4.7", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "a16279554621453840eb8af14d12cfa24c10b8d3" + "reference": "41a308008d92d30cae5615d903c4d46d95932eea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/a16279554621453840eb8af14d12cfa24c10b8d3", - "reference": "a16279554621453840eb8af14d12cfa24c10b8d3", + "url": "https://api.github.com/repos/symfony/lock/zipball/41a308008d92d30cae5615d903c4d46d95932eea", + "reference": "41a308008d92d30cae5615d903c4d46d95932eea", "shasum": "" }, "require": { @@ -7944,7 +8040,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.7" + "source": "https://github.com/symfony/lock/tree/v5.4.10" }, "funding": [ { @@ -7960,20 +8056,20 @@ "type": "tidelift" } ], - "time": "2022-03-22T15:31:03+00:00" + "time": "2022-06-09T13:29:56+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "c6e7aa958cb2884d68562264f421ffea59cdad41" + "reference": "076043af11e58b20a68d2fd93f59cdbc6e8fdd00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/c6e7aa958cb2884d68562264f421ffea59cdad41", - "reference": "c6e7aa958cb2884d68562264f421ffea59cdad41", + "url": "https://api.github.com/repos/symfony/mailer/zipball/076043af11e58b20a68d2fd93f59cdbc6e8fdd00", + "reference": "076043af11e58b20a68d2fd93f59cdbc6e8fdd00", "shasum": "" }, "require": { @@ -8020,7 +8116,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.8" + "source": "https://github.com/symfony/mailer/tree/v5.4.12" }, "funding": [ { @@ -8036,20 +8132,20 @@ "type": "tidelift" } ], - "time": "2022-04-27T17:10:22+00:00" + "time": "2022-08-03T05:17:26+00:00" }, { "name": "symfony/messenger", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "e6ada0d7917c52bd50e37f082063cfc93d5ae182" + "reference": "05cebeb1f3dcefd33eb5275709e9ff7cc0df50fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/e6ada0d7917c52bd50e37f082063cfc93d5ae182", - "reference": "e6ada0d7917c52bd50e37f082063cfc93d5ae182", + "url": "https://api.github.com/repos/symfony/messenger/zipball/05cebeb1f3dcefd33eb5275709e9ff7cc0df50fd", + "reference": "05cebeb1f3dcefd33eb5275709e9ff7cc0df50fd", "shasum": "" }, "require": { @@ -8110,7 +8206,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v5.4.8" + "source": "https://github.com/symfony/messenger/tree/v5.4.11" }, "funding": [ { @@ -8126,20 +8222,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:02:29+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/mime", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662" + "reference": "03876e9c5a36f5b45e7d9a381edda5421eff8a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/af49bc163ec3272f677bde3bc44c0d766c1fd662", - "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662", + "url": "https://api.github.com/repos/symfony/mime/zipball/03876e9c5a36f5b45e7d9a381edda5421eff8a90", + "reference": "03876e9c5a36f5b45e7d9a381edda5421eff8a90", "shasum": "" }, "require": { @@ -8193,7 +8289,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.8" + "source": "https://github.com/symfony/mime/tree/v5.4.12" }, "funding": [ { @@ -8209,20 +8305,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2022-08-19T14:24:03+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.4.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "4b56e17c443e7092895477f047f2a70f324f984c" + "reference": "b3b0890e76e7eb626f27b165a5c501f2754dfbbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/4b56e17c443e7092895477f047f2a70f324f984c", - "reference": "4b56e17c443e7092895477f047f2a70f324f984c", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/b3b0890e76e7eb626f27b165a5c501f2754dfbbd", + "reference": "b3b0890e76e7eb626f27b165a5c501f2754dfbbd", "shasum": "" }, "require": { @@ -8277,7 +8373,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.3" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.10" }, "funding": [ { @@ -8293,7 +8389,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-19T12:03:50+00:00" }, { "name": "symfony/monolog-bundle", @@ -8378,16 +8474,16 @@ }, { "name": "symfony/options-resolver", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8" + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8", - "reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", + "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", "shasum": "" }, "require": { @@ -8427,7 +8523,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.3" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.11" }, "funding": [ { @@ -8443,20 +8539,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/password-hasher", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f" + "reference": "b0169ed8f09a4ae39eb119218ea1685079a9b179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f", - "reference": "bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/b0169ed8f09a4ae39eb119218ea1685079a9b179", + "reference": "b0169ed8f09a4ae39eb119218ea1685079a9b179", "shasum": "" }, "require": { @@ -8500,7 +8596,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.4.8" + "source": "https://github.com/symfony/password-hasher/tree/v5.4.11" }, "funding": [ { @@ -8516,20 +8612,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T13:57:25+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { @@ -8544,7 +8640,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -8582,7 +8678,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -8598,20 +8694,20 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -8623,7 +8719,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -8663,7 +8759,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -8679,7 +8775,7 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -9013,16 +9109,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -9031,7 +9127,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -9072,7 +9168,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -9088,7 +9184,7 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", @@ -9254,16 +9350,16 @@ }, { "name": "symfony/process", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -9296,7 +9392,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.8" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -9312,20 +9408,20 @@ "type": "tidelift" } ], - "time": "2022-04-08T05:07:18+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "fe501d498d6ec7e9efe928c90fabedf629116495" + "reference": "c641d63e943ed31981bad4b4dcf29fe7da2ffa8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/fe501d498d6ec7e9efe928c90fabedf629116495", - "reference": "fe501d498d6ec7e9efe928c90fabedf629116495", + "url": "https://api.github.com/repos/symfony/property-access/zipball/c641d63e943ed31981bad4b4dcf29fe7da2ffa8c", + "reference": "c641d63e943ed31981bad4b4dcf29fe7da2ffa8c", "shasum": "" }, "require": { @@ -9377,7 +9473,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.8" + "source": "https://github.com/symfony/property-access/tree/v5.4.11" }, "funding": [ { @@ -9393,20 +9489,20 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "0fc07795712972b9792f203d0fe0e77c26c3281d" + "reference": "8a9a2b638a808cc92a2fbce185b9318e76b0e20c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/0fc07795712972b9792f203d0fe0e77c26c3281d", - "reference": "0fc07795712972b9792f203d0fe0e77c26c3281d", + "url": "https://api.github.com/repos/symfony/property-info/zipball/8a9a2b638a808cc92a2fbce185b9318e76b0e20c", + "reference": "8a9a2b638a808cc92a2fbce185b9318e76b0e20c", "shasum": "" }, "require": { @@ -9468,7 +9564,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.7" + "source": "https://github.com/symfony/property-info/tree/v5.4.11" }, "funding": [ { @@ -9484,7 +9580,7 @@ "type": "tidelift" } ], - "time": "2022-03-30T13:40:48+00:00" + "time": "2022-07-19T08:07:51+00:00" }, { "name": "symfony/proxy-manager-bridge", @@ -9643,16 +9739,16 @@ }, { "name": "symfony/rate-limiter", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "c77d140eb88f99051e934435af64963cc5d99e16" + "reference": "1a3a43eeb498290100e4a1559f4a48be14900bc2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/c77d140eb88f99051e934435af64963cc5d99e16", - "reference": "c77d140eb88f99051e934435af64963cc5d99e16", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/1a3a43eeb498290100e4a1559f4a48be14900bc2", + "reference": "1a3a43eeb498290100e4a1559f4a48be14900bc2", "shasum": "" }, "require": { @@ -9693,7 +9789,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.4.8" + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.11" }, "funding": [ { @@ -9709,7 +9805,7 @@ "type": "tidelift" } ], - "time": "2022-04-03T11:05:26+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/redis-messenger", @@ -9780,16 +9876,16 @@ }, { "name": "symfony/routing", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7" + "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", - "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "url": "https://api.github.com/repos/symfony/routing/zipball/3e01ccd9b2a3a4167ba2b3c53612762300300226", + "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226", "shasum": "" }, "require": { @@ -9850,7 +9946,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.8" + "source": "https://github.com/symfony/routing/tree/v5.4.11" }, "funding": [ { @@ -9866,20 +9962,20 @@ "type": "tidelift" } ], - "time": "2022-04-18T21:45:37+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/security-core", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "4540ecb8ae82cc46d9580672888597f481ff0440" + "reference": "25d14fa47f9efa084d3c23d0ae3b2624d2ad9e92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/4540ecb8ae82cc46d9580672888597f481ff0440", - "reference": "4540ecb8ae82cc46d9580672888597f481ff0440", + "url": "https://api.github.com/repos/symfony/security-core/zipball/25d14fa47f9efa084d3c23d0ae3b2624d2ad9e92", + "reference": "25d14fa47f9efa084d3c23d0ae3b2624d2ad9e92", "shasum": "" }, "require": { @@ -9943,7 +10039,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.4.8" + "source": "https://github.com/symfony/security-core/tree/v5.4.11" }, "funding": [ { @@ -9959,20 +10055,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/security-csrf", - "version": "v5.4.3", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "57c1c252ca756289c2b61327e08fb10be3936956" + "reference": "b97ab244b6dda80abb84a4a236d682871695db4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/57c1c252ca756289c2b61327e08fb10be3936956", - "reference": "57c1c252ca756289c2b61327e08fb10be3936956", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/b97ab244b6dda80abb84a4a236d682871695db4a", + "reference": "b97ab244b6dda80abb84a4a236d682871695db4a", "shasum": "" }, "require": { @@ -10015,7 +10111,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v5.4.3" + "source": "https://github.com/symfony/security-csrf/tree/v5.4.11" }, "funding": [ { @@ -10031,20 +10127,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/serializer", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a806b1031c45bf2ee583beee6df734ecf34d5cfc" + "reference": "776fa3010f62b97a7119757a66596a654cd244d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a806b1031c45bf2ee583beee6df734ecf34d5cfc", - "reference": "a806b1031c45bf2ee583beee6df734ecf34d5cfc", + "url": "https://api.github.com/repos/symfony/serializer/zipball/776fa3010f62b97a7119757a66596a654cd244d4", + "reference": "776fa3010f62b97a7119757a66596a654cd244d4", "shasum": "" }, "require": { @@ -10118,7 +10214,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.4.8" + "source": "https://github.com/symfony/serializer/tree/v5.4.12" }, "funding": [ { @@ -10134,7 +10230,7 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:02:29+00:00" + "time": "2022-08-26T10:32:10+00:00" }, { "name": "symfony/service-contracts", @@ -10279,16 +10375,16 @@ }, { "name": "symfony/string", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8" + "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", - "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", + "url": "https://api.github.com/repos/symfony/string/zipball/2fc515e512d721bf31ea76bd02fe23ada4640058", + "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058", "shasum": "" }, "require": { @@ -10345,7 +10441,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.8" + "source": "https://github.com/symfony/string/tree/v5.4.12" }, "funding": [ { @@ -10361,20 +10457,20 @@ "type": "tidelift" } ], - "time": "2022-04-19T10:40:37+00:00" + "time": "2022-08-12T17:03:11+00:00" }, { "name": "symfony/translation", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b" + "reference": "42ecc77eb4f229ce2df702a648ec93b8478d76ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b", - "reference": "f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b", + "url": "https://api.github.com/repos/symfony/translation/zipball/42ecc77eb4f229ce2df702a648ec93b8478d76ae", + "reference": "42ecc77eb4f229ce2df702a648ec93b8478d76ae", "shasum": "" }, "require": { @@ -10442,7 +10538,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.8" + "source": "https://github.com/symfony/translation/tree/v5.4.12" }, "funding": [ { @@ -10458,7 +10554,7 @@ "type": "tidelift" } ], - "time": "2022-04-22T08:14:12+00:00" + "time": "2022-08-02T15:52:22+00:00" }, { "name": "symfony/translation-contracts", @@ -10540,16 +10636,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "f68dbdb80c9ce425f503512dfa8c8c01cf789e43" + "reference": "94c3b38514c953e3e84719c96d4e578a01ca1819" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f68dbdb80c9ce425f503512dfa8c8c01cf789e43", - "reference": "f68dbdb80c9ce425f503512dfa8c8c01cf789e43", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/94c3b38514c953e3e84719c96d4e578a01ca1819", + "reference": "94c3b38514c953e3e84719c96d4e578a01ca1819", "shasum": "" }, "require": { @@ -10641,7 +10737,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.4.8" + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.12" }, "funding": [ { @@ -10657,7 +10753,7 @@ "type": "tidelift" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2022-08-03T13:09:21+00:00" }, { "name": "symfony/twig-bundle", @@ -10750,16 +10846,16 @@ }, { "name": "symfony/validator", - "version": "v5.4.8", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad" + "reference": "38bc4d83d01b800f1fa5acaceb5ff77490b8f768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad", - "reference": "bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad", + "url": "https://api.github.com/repos/symfony/validator/zipball/38bc4d83d01b800f1fa5acaceb5ff77490b8f768", + "reference": "38bc4d83d01b800f1fa5acaceb5ff77490b8f768", "shasum": "" }, "require": { @@ -10843,7 +10939,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v5.4.8" + "source": "https://github.com/symfony/validator/tree/v5.4.12" }, "funding": [ { @@ -10859,20 +10955,20 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-08-09T11:54:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "cdcadd343d31ad16fc5e006b0de81ea307435053" + "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cdcadd343d31ad16fc5e006b0de81ea307435053", - "reference": "cdcadd343d31ad16fc5e006b0de81ea307435053", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8f306d7b8ef34fb3db3305be97ba8e088fb4861", + "reference": "b8f306d7b8ef34fb3db3305be97ba8e088fb4861", "shasum": "" }, "require": { @@ -10932,7 +11028,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.11" }, "funding": [ { @@ -10948,20 +11044,20 @@ "type": "tidelift" } ], - "time": "2022-04-26T13:19:20+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.8", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7e132a3fcd4b57add721b4207236877b6017ec93" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7e132a3fcd4b57add721b4207236877b6017ec93", - "reference": "7e132a3fcd4b57add721b4207236877b6017ec93", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { @@ -11005,7 +11101,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.8" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -11021,20 +11117,20 @@ "type": "tidelift" } ], - "time": "2022-04-26T13:19:20+00:00" + "time": "2022-05-27T12:56:18+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.3", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", "shasum": "" }, "require": { @@ -11080,7 +11176,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.12" }, "funding": [ { @@ -11096,7 +11192,79 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:32:32+00:00" + "time": "2022-08-02T15:52:22+00:00" + }, + { + "name": "tecnickcom/tcpdf", + "version": "6.4.4", + "source": { + "type": "git", + "url": "https://github.com/tecnickcom/TCPDF.git", + "reference": "42cd0f9786af7e5db4fcedaa66f717b0d0032320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/42cd0f9786af7e5db4fcedaa66f717b0d0032320", + "reference": "42cd0f9786af7e5db4fcedaa66f717b0d0032320", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "config", + "include", + "tcpdf.php", + "tcpdf_parser.php", + "tcpdf_import.php", + "tcpdf_barcodes_1d.php", + "tcpdf_barcodes_2d.php", + "include/tcpdf_colors.php", + "include/tcpdf_filters.php", + "include/tcpdf_font_data.php", + "include/tcpdf_fonts.php", + "include/tcpdf_images.php", + "include/tcpdf_static.php", + "include/barcodes/datamatrix.php", + "include/barcodes/pdf417.php", + "include/barcodes/qrcode.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-only" + ], + "authors": [ + { + "name": "Nicola Asuni", + "email": "info@tecnick.com", + "role": "lead" + } + ], + "description": "TCPDF is a PHP class for generating PDF documents and barcodes.", + "homepage": "http://www.tcpdf.org/", + "keywords": [ + "PDFD32000-2008", + "TCPDF", + "barcodes", + "datamatrix", + "pdf", + "pdf417", + "qrcode" + ], + "support": { + "issues": "https://github.com/tecnickcom/TCPDF/issues", + "source": "https://github.com/tecnickcom/TCPDF/tree/6.4.4" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_donations¤cy_code=GBP&business=paypal@tecnick.com&item_name=donation%20for%20tcpdf%20project", + "type": "custom" + } + ], + "time": "2021-12-31T08:39:24+00:00" }, { "name": "true/punycode", @@ -11146,6 +11314,7 @@ "issues": "https://github.com/true/php-punycode/issues", "source": "https://github.com/true/php-punycode/tree/master" }, + "abandoned": true, "time": "2016-11-16T10:37:54+00:00" }, { @@ -11367,30 +11536,30 @@ }, { "name": "zircote/swagger-php", - "version": "3.3.2", + "version": "3.3.6", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "68c76ce2bb43fb4603315fb973d4595711dcbfd3" + "reference": "5016342f966fca29dda84455de066c5c90d37941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/68c76ce2bb43fb4603315fb973d4595711dcbfd3", - "reference": "68c76ce2bb43fb4603315fb973d4595711dcbfd3", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/5016342f966fca29dda84455de066c5c90d37941", + "reference": "5016342f966fca29dda84455de066c5c90d37941", "shasum": "" }, "require": { "doctrine/annotations": "^1.7", "ext-json": "*", "php": ">=7.2", - "psr/log": "^1.1", + "psr/log": "^1.1 || ^2.0 || ^3.0", "symfony/finder": ">=2.2", "symfony/yaml": ">=3.3" }, "require-dev": { "composer/package-versions-deprecated": "1.11.99.2", "friendsofphp/php-cs-fixer": "^2.17 || ^3.0", - "phpunit/phpunit": ">=8" + "phpunit/phpunit": ">=8.5.14" }, "bin": [ "bin/openapi" @@ -11434,9 +11603,9 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/3.3.2" + "source": "https://github.com/zircote/swagger-php/tree/3.3.6" }, - "time": "2021-11-15T20:45:42+00:00" + "time": "2022-05-21T01:52:14+00:00" } ], "packages-dev": [ @@ -11571,16 +11740,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.13.2", + "version": "v4.14.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", "shasum": "" }, "require": { @@ -11621,9 +11790,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" }, - "time": "2021-11-30T19:35:32+00:00" + "time": "2022-05-31T20:59:12+00:00" }, { "name": "phar-io/manifest", @@ -11736,252 +11905,25 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, { "name": "phpunit/php-code-coverage", - "version": "9.2.15", + "version": "9.2.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -12030,7 +11972,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" }, "funding": [ { @@ -12038,7 +11980,7 @@ "type": "github" } ], - "time": "2022-03-07T09:28:20+00:00" + "time": "2022-08-30T12:24:04+00:00" }, { "name": "phpunit/php-file-iterator", @@ -12283,16 +12225,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.20", + "version": "9.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", "shasum": "" }, "require": { @@ -12307,7 +12249,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -12322,13 +12263,9 @@ "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.1", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -12370,7 +12307,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.24" }, "funding": [ { @@ -12382,7 +12319,7 @@ "type": "github" } ], - "time": "2022-04-01T12:37:26+00:00" + "time": "2022-08-30T07:42:16+00:00" }, { "name": "sebastian/cli-parser", @@ -13241,16 +13178,16 @@ }, { "name": "sebastian/type", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + "reference": "fb44e1cc6e557418387ad815780360057e40753e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb44e1cc6e557418387ad815780360057e40753e", + "reference": "fb44e1cc6e557418387ad815780360057e40753e", "shasum": "" }, "require": { @@ -13262,7 +13199,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -13285,7 +13222,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + "source": "https://github.com/sebastianbergmann/type/tree/3.1.0" }, "funding": [ { @@ -13293,7 +13230,7 @@ "type": "github" } ], - "time": "2022-03-15T09:54:48+00:00" + "time": "2022-08-29T06:55:37+00:00" }, { "name": "sebastian/version", @@ -13350,16 +13287,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.2", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", "shasum": "" }, "require": { @@ -13402,7 +13339,7 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-12-12T21:44:58+00:00" + "time": "2022-06-18T07:21:10+00:00" }, { "name": "theseer/tokenizer", @@ -13453,64 +13390,6 @@ } ], "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], From c6c1d0acdb92a60f5491efcb962a863c6eb3c02f Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Wed, 31 Aug 2022 16:24:48 +0200 Subject: [PATCH 6/8] Adyen Giving implementation (#285) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [PW-6813] - Add Adyen Giving configuration fields to plugin config page (#273) * [PW-6813] - Create base fields for Adyen Giving configuration * [PW-6813] - Update tooltips for the input fields * [PW-6813] - Remove TODO items * [PW-6814] - Adyen Giving frontend implementation (#277) * [PW-6814] - Store donation token if response contains it * [PW-6814] - Implement frontend functionality and donation component * [PW-6814] - Code formatting * [PW-6814] - Code formatting * [PW-6814] - Code formatting * [PW-6814] - Code formatting * [PW-6814] - iDeal support for giving and code formatting * Remove methods required for prepared payment flow * Move Adyen Giving to a separate twig file * Update src/Resources/config/config.xml Co-authored-by: Ángel Campos --- src/Controller/StoreApiController.php | 129 +++++++++++++- src/Handlers/PaymentResponseHandler.php | 32 +++- src/Handlers/PaymentResponseHandlerResult.php | 22 +++ .../src/finish/adyen-giving.plugin.js | 89 ++++++++++ src/Resources/app/storefront/src/main.js | 2 + .../app/storefront/src/scss/base.scss | 7 +- src/Resources/config/config.xml | 59 +++++++ src/Resources/config/services.xml | 13 ++ .../adyen-giving-component.html.twig | 29 ++++ .../checkout/finish/finish-details.html.twig | 10 ++ src/Service/ConfigurationService.php | 125 +++++++++++++- src/Service/DonationService.php | 154 +++++++++++++++++ src/Subscriber/AdyenGivingSubscriber.php | 162 ++++++++++++++++++ 13 files changed, 828 insertions(+), 5 deletions(-) create mode 100644 src/Resources/app/storefront/src/finish/adyen-giving.plugin.js create mode 100644 src/Resources/views/storefront/component/adyen-giving/adyen-giving-component.html.twig create mode 100644 src/Resources/views/storefront/page/checkout/finish/finish-details.html.twig create mode 100644 src/Service/DonationService.php create mode 100644 src/Subscriber/AdyenGivingSubscriber.php diff --git a/src/Controller/StoreApiController.php b/src/Controller/StoreApiController.php index b7c340b7..77c5ba98 100644 --- a/src/Controller/StoreApiController.php +++ b/src/Controller/StoreApiController.php @@ -24,14 +24,19 @@ namespace Adyen\Shopware\Controller; +use Adyen\AdyenException; use Adyen\Service\Validator\CheckoutStateDataValidator; use Adyen\Shopware\Exception\PaymentFailedException; +use Adyen\Shopware\Handlers\AbstractPaymentMethodHandler; use Adyen\Shopware\Handlers\PaymentResponseHandler; +use Adyen\Shopware\Service\ConfigurationService; +use Adyen\Shopware\Service\DonationService; use Adyen\Shopware\Service\PaymentDetailsService; use Adyen\Shopware\Service\PaymentMethodsService; use Adyen\Shopware\Service\PaymentResponseService; use Adyen\Shopware\Service\PaymentStatusService; use Adyen\Shopware\Service\Repository\OrderRepository; +use Adyen\Shopware\Service\Repository\OrderTransactionRepository; use OpenApi\Annotations as OA; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice; @@ -41,6 +46,7 @@ use Shopware\Core\Checkout\Order\SalesChannel\OrderService; use Shopware\Core\Checkout\Order\SalesChannel\SetPaymentOrderRouteResponse; use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; use Shopware\Core\Framework\Routing\Annotation\RouteScope; use Shopware\Core\Framework\Uuid\Uuid; use Shopware\Core\System\SalesChannel\SalesChannelContext; @@ -90,6 +96,14 @@ class StoreApiController * @var OrderService */ private $orderService; + /** + * @var EntityRepositoryInterface + */ + private $orderTransactionRepository; + /** + * @var OrderTransactionRepository + */ + private $adyenOrderTransactionRepository; /** * @var StateMachineRegistry */ @@ -98,12 +112,21 @@ class StoreApiController * @var LoggerInterface */ private $logger; + /** + * @var DonationService + */ + private $donationService; + /** + * @var ConfigurationService + */ + private $configurationService; /** * StoreApiController constructor. * * @param PaymentMethodsService $paymentMethodsService * @param PaymentDetailsService $paymentDetailsService + * @param DonationService $donationService * @param CheckoutStateDataValidator $checkoutStateDataValidator * @param PaymentStatusService $paymentStatusService * @param PaymentResponseHandler $paymentResponseHandler @@ -112,10 +135,13 @@ class StoreApiController * @param OrderService $orderService * @param StateMachineRegistry $stateMachineRegistry * @param LoggerInterface $logger + * @param EntityRepositoryInterface $orderTransactionRepository + * @param ConfigurationService $configurationService */ public function __construct( PaymentMethodsService $paymentMethodsService, PaymentDetailsService $paymentDetailsService, + DonationService $donationService, CheckoutStateDataValidator $checkoutStateDataValidator, PaymentStatusService $paymentStatusService, PaymentResponseHandler $paymentResponseHandler, @@ -123,7 +149,10 @@ public function __construct( OrderRepository $orderRepository, OrderService $orderService, StateMachineRegistry $stateMachineRegistry, - LoggerInterface $logger + LoggerInterface $logger, + EntityRepositoryInterface $orderTransactionRepository, + ConfigurationService $configurationService, + OrderTransactionRepository $adyenOrderTransactionRepository ) { $this->paymentMethodsService = $paymentMethodsService; $this->paymentDetailsService = $paymentDetailsService; @@ -135,6 +164,10 @@ public function __construct( $this->orderService = $orderService; $this->stateMachineRegistry = $stateMachineRegistry; $this->logger = $logger; + $this->donationService = $donationService; + $this->orderTransactionRepository = $orderTransactionRepository; + $this->configurationService = $configurationService; + $this->adyenOrderTransactionRepository = $adyenOrderTransactionRepository; } /** @@ -206,6 +239,33 @@ public function postPaymentDetails( return new JsonResponse($message, 500); } + // If donation token is present in the result, store it in the custom fields of order transaction. + $donationToken = $result->getDonationToken(); + if (isset($donationToken) && + $this->configurationService->isAdyenGivingEnabled($context->getSalesChannelId())) { + $storedTransactionCustomFields = $paymentResponse->getOrderTransaction()->getCustomFields() ?: []; + $transactionCustomFields[PaymentResponseHandler::DONATION_TOKEN] = $donationToken; + + $customFields = array_merge( + $storedTransactionCustomFields, + $transactionCustomFields + ); + + $paymentResponse->getOrderTransaction()->setCustomFields($customFields); + $orderTransactionId = $paymentResponse->getOrderTransactionId(); + $context->getContext()->scope( + Context::SYSTEM_SCOPE, + function (Context $context) use ($orderTransactionId, $customFields) { + $this->orderTransactionRepository->update([ + [ + 'id' => $orderTransactionId, + 'customFields' => $customFields, + ] + ], $context); + } + ); + } + return new JsonResponse($this->paymentResponseHandler->handleAdyenApis($result)); } @@ -354,4 +414,71 @@ public function cancelOrderTransaction( return new JsonResponse($this->paymentStatusService->getWithOrderId($orderId)); } + + /** + * @Route( + * "/store-api/adyen/donate", + * name="store-api.action.adyen.donate", + * methods={"POST"} + * ) + * + * @param Request $request + * @param SalesChannelContext $salesChannelContext + * @return JsonResponse + */ + public function donate( + Request $request, + SalesChannelContext $salesChannelContext + ): JsonResponse { + $payload = $request->get('payload'); + + $orderId = $payload['orderId']; + $currency = $payload['amount']['currency']; + $value = $payload['amount']['value']; + $returnUrl = $payload['returnUrl']; + + $transaction = $this->adyenOrderTransactionRepository + ->getFirstAdyenOrderTransactionByStates($orderId, [OrderTransactionStates::STATE_AUTHORIZED]); + + /** @var AbstractPaymentMethodHandler $paymentMethodIdentifier */ + $paymentMethodIdentifier = $transaction->getPaymentMethod()->getHandlerIdentifier(); + $paymentMethodCode = $paymentMethodIdentifier::getPaymentMethodCode(); + + $donationToken = $transaction->getCustomFields()['donationToken']; + $pspReference = $transaction->getCustomFields()['originalPspReference']; + + // Set donation token as null after first call. + $storedTransactionCustomFields = $transaction->getCustomFields(); + $storedTransactionCustomFields[PaymentResponseHandler::DONATION_TOKEN] = null; + + $orderTransactionId = $transaction->getId(); + $salesChannelContext->getContext()->scope( + Context::SYSTEM_SCOPE, + function (Context $salesChannelContext) use ($orderTransactionId, $storedTransactionCustomFields) { + $this->orderTransactionRepository->update([ + [ + 'id' => $orderTransactionId, + 'customFields' => $storedTransactionCustomFields, + ] + ], $salesChannelContext); + } + ); + + try { + $this->donationService->donate( + $salesChannelContext, + $donationToken, + $currency, + $value, + $returnUrl, + $pspReference, + $paymentMethodCode + ); + } catch (AdyenException $e) { + $this->logger->error($e->getMessage()); + return new JsonResponse('An unknown error occurred', $e->getCode()); + } + + return new JsonResponse('Donation completed successfully.'); + } } diff --git a/src/Handlers/PaymentResponseHandler.php b/src/Handlers/PaymentResponseHandler.php index a7d94034..b4211043 100644 --- a/src/Handlers/PaymentResponseHandler.php +++ b/src/Handlers/PaymentResponseHandler.php @@ -29,6 +29,7 @@ use Adyen\Shopware\Exception\PaymentCancelledException; use Adyen\Shopware\Exception\PaymentFailedException; use Adyen\Shopware\Service\CaptureService; +use Adyen\Shopware\Service\ConfigurationService; use Psr\Log\LoggerInterface; use Adyen\Shopware\Service\PaymentResponseService; use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; @@ -56,7 +57,7 @@ class PaymentResponseHandler const ORIGINAL_PSP_REFERENCE = 'originalPspReference'; const ADDITIONAL_DATA = 'additionalData'; const ACTION = 'action'; - + const DONATION_TOKEN = 'donationToken'; // Merchant reference parameter in return GET parameters list const ADYEN_MERCHANT_REFERENCE = 'adyenMerchantReference'; @@ -88,18 +89,33 @@ class PaymentResponseHandler */ private $orderTransactionRepository; + /** + * @var ConfigurationService + */ + private $configurationService; + /** * @var CaptureService */ private $captureService; + /** + * @param LoggerInterface $logger + * @param PaymentResponseService $paymentResponseService + * @param OrderTransactionStateHandler $transactionStateHandler + * @param PaymentResponseHandlerResult $paymentResponseHandlerResult + * @param EntityRepositoryInterface $orderTransactionRepository + * @param CaptureService $captureService + * @param ConfigurationService $configurationService + */ public function __construct( LoggerInterface $logger, PaymentResponseService $paymentResponseService, OrderTransactionStateHandler $transactionStateHandler, PaymentResponseHandlerResult $paymentResponseHandlerResult, EntityRepositoryInterface $orderTransactionRepository, - CaptureService $captureService + CaptureService $captureService, + ConfigurationService $configurationService ) { $this->logger = $logger; $this->paymentResponseService = $paymentResponseService; @@ -107,6 +123,7 @@ public function __construct( $this->paymentResponseHandlerResult = $paymentResponseHandlerResult; $this->orderTransactionRepository = $orderTransactionRepository; $this->captureService = $captureService; + $this->configurationService = $configurationService; } /** @@ -145,6 +162,11 @@ public function handlePaymentResponse( $this->paymentResponseHandlerResult->setAdditionalData($response[self::ADDITIONAL_DATA]); } + // Set Donation Token if response contains it + if (isset($response[self::DONATION_TOKEN])) { + $this->paymentResponseHandlerResult->setDonationToken($response[self::DONATION_TOKEN]); + } + // Store response for cart until the payment is finalised $this->paymentResponseService->insertPaymentResponse( $response, @@ -226,6 +248,12 @@ public function handleShopwareApis( $transactionCustomFields[self::ORIGINAL_PSP_REFERENCE] = $pspReference; } + $donationToken = $paymentResponseHandlerResult->getDonationToken(); + if (isset($donationToken) && + $this->configurationService->isAdyenGivingEnabled($salesChannelContext->getSalesChannelId())) { + $transactionCustomFields[self::DONATION_TOKEN] = $donationToken; + } + // Only store action for the transaction if this is the first action $action = $this->paymentResponseHandlerResult->getAction(); if (empty($storedTransactionCustomFields[self::ACTION]) && !empty($action)) { diff --git a/src/Handlers/PaymentResponseHandlerResult.php b/src/Handlers/PaymentResponseHandlerResult.php index a67d24db..d1eb9778 100644 --- a/src/Handlers/PaymentResponseHandlerResult.php +++ b/src/Handlers/PaymentResponseHandlerResult.php @@ -13,6 +13,7 @@ class PaymentResponseHandlerResult private $pspReference; private $action; private $additionalData; + private $donationToken; /** * @param PaymentResponseEntity $paymentResponse @@ -49,6 +50,11 @@ public function createFromPaymentResponse(PaymentResponseEntity $paymentResponse $this->setAction($response['action']); } + // Set donation token if exists + if (!empty($response['donationToken'])) { + $this->setDonationToken($response['donationToken']); + } + // Set additional data if exists if (!empty($response['additionalData'])) { $this->setAdditionalData($response['additionalData']); @@ -152,4 +158,20 @@ public function setAdditionalData($additionalData): void { $this->additionalData = $additionalData; } + + /** + * @param string $donationToken + */ + public function setDonationToken(string $donationToken): void + { + $this->donationToken = $donationToken; + } + + /** + * @return null|string + */ + public function getDonationToken(): ?string + { + return $this->donationToken; + } } diff --git a/src/Resources/app/storefront/src/finish/adyen-giving.plugin.js b/src/Resources/app/storefront/src/finish/adyen-giving.plugin.js new file mode 100644 index 00000000..a1bb37b8 --- /dev/null +++ b/src/Resources/app/storefront/src/finish/adyen-giving.plugin.js @@ -0,0 +1,89 @@ +/* + * ###### + * ###### + * ############ ####( ###### #####. ###### ############ ############ + * ############# #####( ###### #####. ###### ############# ############# + * ###### #####( ###### #####. ###### ##### ###### ##### ###### + * ###### ###### #####( ###### #####. ###### ##### ##### ##### ###### + * ###### ###### #####( ###### #####. ###### ##### ##### ###### + * ############# ############# ############# ############# ##### ###### + * ############ ############ ############# ############ ##### ###### + * ###### + * ############# + * ############ + * + * Adyen Payment Module + * + * Copyright (c) 2022 Adyen N.V. + * This file is open source and available under the MIT license. + * See the LICENSE file for more info. + * + */ + +import Plugin from 'src/plugin-system/plugin.class'; +import DomAccess from 'src/helper/dom-access.helper'; +import StoreApiClient from 'src/service/store-api-client.service'; +import ElementLoadingIndicatorUtil from 'src/utility/loading-indicator/element-loading-indicator.util'; + +export default class AdyenGivingPlugin extends Plugin { + init() { + this._client = new StoreApiClient(); + this.adyenCheckout = Promise; + this.initializeCheckoutComponent().bind(this); + } + + async initializeCheckoutComponent () { + const { locale, clientKey, environment, currency, values, backgroundUrl, + logoUrl, name, description, url} = adyenGivingConfiguration; + + const ADYEN_CHECKOUT_CONFIG = { + locale, + clientKey, + environment + }; + + const ADYEN_GIVING_CONFIG = { + amounts: { + currency: currency, + values: values.split(",").map(element => { + return Number(element); + }) + }, + backgroundUrl: backgroundUrl, + logoUrl: logoUrl, + description: description, + name: name, + url: url, + showCancelButton: true, + onDonate: this.handleOnDonate.bind(this), + onCancel: this.handleOnCancel.bind(this) + } + + this.adyenCheckout = await AdyenCheckout(ADYEN_CHECKOUT_CONFIG); + this.adyenCheckout.create('donation', ADYEN_GIVING_CONFIG).mount('#donation-container'); + } + + handleOnDonate(state, component) { + const orderId = adyenGivingConfiguration.orderId; + let payload = {...state.data, orderId}; + payload.returnUrl = window.location.href; + + this._client.post( + `${adyenGivingConfiguration.donationEndpointUrl}`, + JSON.stringify({payload: payload}), + function (paymentResponse) { + if (this._client._request.status !== 200) { + component.setStatus("error"); + } + else { + component.setStatus("success"); + } + }.bind(this) + ); + } + + handleOnCancel() { + let continueActionUrl = adyenGivingConfiguration.continueActionUrl; + window.location = continueActionUrl; + } +} diff --git a/src/Resources/app/storefront/src/main.js b/src/Resources/app/storefront/src/main.js index 0ec1d120..61d42eb7 100644 --- a/src/Resources/app/storefront/src/main.js +++ b/src/Resources/app/storefront/src/main.js @@ -1,6 +1,8 @@ // Import all necessary Storefront plugins and scss files import ConfirmOrderPlugin from './checkout/confirm-order.plugin'; +import AdyenGivingPlugin from './finish/adyen-giving.plugin'; // Register them via the existing PluginManager const PluginManager = window.PluginManager; PluginManager.register('ConfirmOrderPlugin', ConfirmOrderPlugin, '#adyen-payment-checkout-mask'); +PluginManager.register('AdyenGivingPlugin', AdyenGivingPlugin, '#adyen-giving-container'); diff --git a/src/Resources/app/storefront/src/scss/base.scss b/src/Resources/app/storefront/src/scss/base.scss index fc55a305..07b7fc46 100644 --- a/src/Resources/app/storefront/src/scss/base.scss +++ b/src/Resources/app/storefront/src/scss/base.scss @@ -32,4 +32,9 @@ .adyen-checkout__card__brands img { vertical-align: top; -} \ No newline at end of file +} + +#donation-container { + margin-top: -50px; + margin-bottom: 50px; +} diff --git a/src/Resources/config/config.xml b/src/Resources/config/config.xml index a6cf86fb..3d90203c 100644 --- a/src/Resources/config/config.xml +++ b/src/Resources/config/config.xml @@ -141,4 +141,63 @@ + + Adyen Giving + + adyenGivingEnabled + + + This enables Adyen Giving and offers the donation form in the order success page. + + + + adyenGivingCharityMerchantAccount + + + Adyen merchant account for the charity. + + + + adyenGivingCharityName + + + Name of the charity displayed on the Adyen Giving form. + + + + adyenGivingCharityDescription + + + Description of the charity. + + + + adyenGivingCharityWebsite + + + Link to the charity website. + + + + adyenGivingDonationAmounts + + + Suggested amounts that the shopper can choose to donate using the order currency, separated by commas. + + + + adyenGivingCharityLogo + + + Logo displayed on the Adyen Giving form. + + + + adyenGivingBackgroundImage + + + Background image of the Adyen Giving form. + + + diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index 04063647..fd67ac12 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -19,6 +19,7 @@ + @@ -55,6 +56,10 @@ + + + + @@ -81,6 +86,14 @@ + + + + + + + + diff --git a/src/Resources/views/storefront/component/adyen-giving/adyen-giving-component.html.twig b/src/Resources/views/storefront/component/adyen-giving/adyen-giving-component.html.twig new file mode 100644 index 00000000..312d9f88 --- /dev/null +++ b/src/Resources/views/storefront/component/adyen-giving/adyen-giving-component.html.twig @@ -0,0 +1,29 @@ +{% set adyenFrontendData = page.extensions[constant('Adyen\\Shopware\\Subscriber\\AdyenGivingSubscriber::ADYEN_DATA_EXTENSION_ID')] %} + +{% if adyenFrontendData and adyenFrontendData.locale and adyenFrontendData.clientKey and adyenFrontendData.environment %} +
+
+ +
+ + + + +
+{% endif %} diff --git a/src/Resources/views/storefront/page/checkout/finish/finish-details.html.twig b/src/Resources/views/storefront/page/checkout/finish/finish-details.html.twig new file mode 100644 index 00000000..cb6f6fbe --- /dev/null +++ b/src/Resources/views/storefront/page/checkout/finish/finish-details.html.twig @@ -0,0 +1,10 @@ +{% sw_extends '@Storefront/storefront/page/checkout/finish/finish-details.html.twig' %} +{% set adyenFrontendData = page.extensions[constant('Adyen\\Shopware\\Subscriber\\AdyenGivingSubscriber::ADYEN_DATA_EXTENSION_ID')] %} + +{% block page_checkout_finish_data %} + + {{ parent() }} + + {% sw_include '@AdyenPaymentShopware6/storefront/component/adyen-giving/adyen-giving-component.html.twig' %} + +{% endblock %} diff --git a/src/Service/ConfigurationService.php b/src/Service/ConfigurationService.php index 125c2736..9c75251a 100644 --- a/src/Service/ConfigurationService.php +++ b/src/Service/ConfigurationService.php @@ -25,6 +25,9 @@ namespace Adyen\Shopware\Service; use Adyen\Environment; +use Shopware\Core\Framework\Context; +use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; +use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\System\SystemConfig\SystemConfigService; class ConfigurationService @@ -36,15 +39,22 @@ class ConfigurationService */ private $systemConfigService; + /** + * @var EntityRepositoryInterface + */ + private $mediaRepository; + /** * ConfigurationService constructor. * * @param SystemConfigService $systemConfigService */ public function __construct( - SystemConfigService $systemConfigService + SystemConfigService $systemConfigService, + EntityRepositoryInterface $mediaRepository ) { $this->systemConfigService = $systemConfigService; + $this->mediaRepository = $mediaRepository; } /** @@ -222,4 +232,117 @@ public function getOrderState(string $salesChannelId = null) { return $this->systemConfigService->get(self::BUNDLE_NAME . '.config.orderState', $salesChannelId); } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function isAdyenGivingEnabled(string $salesChannelId) + { + return $this->systemConfigService->get(self::BUNDLE_NAME . '.config.adyenGivingEnabled', $salesChannelId); + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingCharityMerchantAccount(string $salesChannelId) + { + return $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingCharityMerchantAccount', + $salesChannelId + ); + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingDonationAmounts(string $salesChannelId) + { + return $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingDonationAmounts', + $salesChannelId + ); + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingBackgroundUrl(string $salesChannelId, Context $context) + { + $backgroundImageMediaId = $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingBackgroundImage', + $salesChannelId + ); + + if (!is_null($backgroundImageMediaId)) { + $criteria = new Criteria([$backgroundImageMediaId]); + $mediaCollection = $this->mediaRepository->search($criteria, $context); + $backgroundMedia = $mediaCollection->get($backgroundImageMediaId); + + return $backgroundMedia->url; + } + + return null; + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingCharityLogo(string $salesChannelId, Context $context) + { + $charityLogoMediaId = $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingCharityLogo', + $salesChannelId + ); + + if (!is_null($charityLogoMediaId)) { + $criteria = new Criteria([$charityLogoMediaId]); + $mediaCollection = $this->mediaRepository->search($criteria, $context); + $charityLogoMedia = $mediaCollection->get($charityLogoMediaId); + + return $charityLogoMedia->url; + } + + return null; + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingCharityDescription(string $salesChannelId) + { + return $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingCharityDescription', + $salesChannelId + ); + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingCharityName(string $salesChannelId) + { + return $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingCharityName', + $salesChannelId + ); + } + + /** + * @param string $salesChannelId + * @return array|mixed|null + */ + public function getAdyenGivingCharityWebsite(string $salesChannelId) + { + return $this->systemConfigService->get( + self::BUNDLE_NAME . '.config.adyenGivingCharityWebsite', + $salesChannelId + ); + } } diff --git a/src/Service/DonationService.php b/src/Service/DonationService.php new file mode 100644 index 00000000..73ed1ba0 --- /dev/null +++ b/src/Service/DonationService.php @@ -0,0 +1,154 @@ +clientService = $clientService; + $this->configurationService = $configurationService; + $this->logger = $logger; + } + + /** + * @param SalesChannelContext $context + * @param $donationToken + * @param $currency + * @param $value + * @param $returnUrl + * @param $pspReference + * @param $paymentMethodCode + * @return array|mixed + * @throws \Adyen\AdyenException + */ + public function donate( + SalesChannelContext $context, + $donationToken, + $currency, + $value, + $returnUrl, + $pspReference, + $paymentMethodCode + ) { + $responseData = []; + + $requestData = $this->buildDonationRequest( + $context, + $donationToken, + $currency, + $value, + $returnUrl, + $pspReference, + $paymentMethodCode + ); + + if (!empty($requestData)) { + $checkoutService = new CheckoutService( + $this->clientService->getClient($context->getSalesChannel()->getId()) + ); + $responseData = $checkoutService->donations($requestData); + } + + return $responseData; + } + + /** + * @param SalesChannelContext $context + * @param $donationToken + * @param $currency + * @param $value + * @param $returnUrl + * @param $pspReference + * @param $paymentMethodCode + * @return array + */ + public function buildDonationRequest( + SalesChannelContext $context, + $donationToken, + $currency, + $value, + $returnUrl, + $pspReference, + $paymentMethodCode + ) : array { + /** + * For donations with iDeal! + * As iDeal does not support recurring payments and Adyen do not have the IBAN yet + * when the merchant makes a /payments call, the flow works different from credit card payments. + * The subsequent call to /donations should include the donationToken, + * and have `sepadirectdebit` specified as payment method to charge the shopper's bank account + */ + if ($paymentMethodCode === self::PAYMENT_METHOD_IDEAL) { + $paymentMethodCode = self::PAYMENT_METHOD_SEPA; + } + + return [ + 'amount' => [ + 'currency' => $currency, + 'value' => $value + ], + 'reference' => Uuid::randomHex(), + 'donationToken' => $donationToken, + 'donationOriginalPspReference' => $pspReference, + 'donationAccount' => $this->configurationService->getAdyenGivingCharityMerchantAccount( + $context->getSalesChannel()->getId() + ), + 'merchantAccount' => $this->configurationService->getMerchantAccount( + $context->getSalesChannel()->getId() + ), + 'paymentMethod' => [ + 'type' => $paymentMethodCode + ], + 'shopperInteraction' => self::SHOPPER_INTERACTION_CONTAUTH, + 'returnUrl' => $returnUrl + ]; + } +} diff --git a/src/Subscriber/AdyenGivingSubscriber.php b/src/Subscriber/AdyenGivingSubscriber.php new file mode 100644 index 00000000..f3c5b251 --- /dev/null +++ b/src/Subscriber/AdyenGivingSubscriber.php @@ -0,0 +1,162 @@ + + */ + +namespace Adyen\Shopware\Subscriber; + +use Adyen\Shopware\Service\ConfigurationService; +use Adyen\Shopware\Service\Repository\SalesChannelRepository; +use Adyen\Util\Currency; +use Psr\Log\LoggerInterface; +use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates; +use Shopware\Core\Framework\Struct\ArrayEntity; +use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Routing\RouterInterface; + +class AdyenGivingSubscriber implements EventSubscriberInterface +{ + const ADYEN_DATA_EXTENSION_ID = 'adyenFrontendData'; + + /** + * @var ConfigurationService + */ + private $configurationService; + + /** + * @var SalesChannelRepository + */ + private $salesChannelRepository; + + /** + * @var Currency + */ + private $currency; + + /** + * @var RouterInterface + */ + private $router; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @param SalesChannelRepository $salesChannelRepository + * @param ConfigurationService $configurationService + * @param Currency $currency + * @param RouterInterface $router + * @param LoggerInterface $logger + */ + public function __construct( + SalesChannelRepository $salesChannelRepository, + ConfigurationService $configurationService, + Currency $currency, + RouterInterface $router, + LoggerInterface $logger + ) { + $this->configurationService = $configurationService; + $this->salesChannelRepository = $salesChannelRepository; + $this->currency = $currency; + $this->router = $router; + $this->logger = $logger; + } + + /** + * @return string[] + */ + public static function getSubscribedEvents() : array + { + return [ + CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoaded' + ]; + } + + /** + * @param CheckoutFinishPageLoadedEvent $event + */ + public function onCheckoutFinishPageLoaded(CheckoutFinishPageLoadedEvent $event) + { + $page = $event->getPage(); + $salesChannelContext = $event->getSalesChannelContext(); + $salesChannelId = $salesChannelContext->getSalesChannel()->getId(); + $context = $salesChannelContext->getContext(); + + $backgroundImageUrl = $this->configurationService->getAdyenGivingBackgroundUrl($salesChannelId, $context); + $charityLogoUrl = $this->configurationService->getAdyenGivingCharityLogo($salesChannelId, $context); + $currency = $salesChannelContext->getCurrency()->getIsoCode(); + $amounts = $this->configurationService->getAdyenGivingDonationAmounts($salesChannelId); + + $order = $page->getOrder(); + $orderTransaction = $order->getTransactions() + ->filterByState(OrderTransactionStates::STATE_AUTHORIZED)->first(); + + if (is_null($orderTransaction)) { + return; + } + + $customFields = $orderTransaction->getCustomFields(); + + if (isset($customFields['donationToken']) && + $this->configurationService->isAdyenGivingEnabled($salesChannelId)) { + $donationAmounts = []; + try { + foreach (explode(',', $amounts) as $donationAmount) { + $donationAmounts[] = $this->currency->sanitize($donationAmount, $currency); + } + $donationAmounts = implode(',', $donationAmounts); + } catch (\Exception $e) { + $this->logger->error("Field 'donationAmounts' is not valid."); + return; + } + + $page->addExtension( + self::ADYEN_DATA_EXTENSION_ID, + new ArrayEntity( + [ + 'clientKey' => $this->configurationService->getClientKey($salesChannelId), + 'locale' => $this->salesChannelRepository->getSalesChannelAssocLocale($salesChannelContext) + ->getLanguage()->getLocale()->getCode(), + 'environment' => $this->configurationService->getEnvironment($salesChannelId), + 'currency' => $currency, + 'values' => $donationAmounts, + 'backgroundUrl' => $backgroundImageUrl, + 'logoUrl' => $charityLogoUrl, + 'description' => $this->configurationService->getAdyenGivingCharityDescription($salesChannelId), + 'name' => $this->configurationService->getAdyenGivingCharityName($salesChannelId), + 'charityUrl' => $this->configurationService->getAdyenGivingCharityWebsite($salesChannelId), + 'orderId' => $order->getId(), + 'donationEndpointUrl' => $this->router->generate( + 'store-api.action.adyen.donate' + ), + 'continueActionUrl' => $this->router->generate( + 'frontend.home.page' + ) + ] + ) + ); + } + } +} From 68df6c75e0ba10114e34b2210366e645aa72d0c0 Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Thu, 1 Sep 2022 11:33:32 +0200 Subject: [PATCH 7/8] Add support for stored payment methods for donations (#287) * Add support for stored payment methods for donations * Code formatting * Support Google Pay donations --- src/Service/DonationService.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Service/DonationService.php b/src/Service/DonationService.php index 73ed1ba0..2e01b41e 100644 --- a/src/Service/DonationService.php +++ b/src/Service/DonationService.php @@ -30,8 +30,20 @@ class DonationService { const SHOPPER_INTERACTION_CONTAUTH = 'ContAuth'; - const PAYMENT_METHOD_IDEAL = 'ideal'; - const PAYMENT_METHOD_SEPA = 'sepadirectdebit'; + + /** + * For donations with iDeal! + * As iDeal does not support recurring payments and Adyen do not have the IBAN yet + * when the merchant makes a /payments call, the flow works different from credit card payments. + * The subsequent call to /donations should include the donationToken and have `sepadirectdebit` + * specified as payment method to charge the shopper's bank account, + * + */ + const PAYMENT_METHOD_CODE_MAPPING = [ + 'ideal' => 'sepadirectdebit', + 'storedPaymentMethods' => 'scheme', + 'paywithgoogle' => 'scheme' + ]; /** * @var ClientService @@ -119,15 +131,8 @@ public function buildDonationRequest( $pspReference, $paymentMethodCode ) : array { - /** - * For donations with iDeal! - * As iDeal does not support recurring payments and Adyen do not have the IBAN yet - * when the merchant makes a /payments call, the flow works different from credit card payments. - * The subsequent call to /donations should include the donationToken, - * and have `sepadirectdebit` specified as payment method to charge the shopper's bank account - */ - if ($paymentMethodCode === self::PAYMENT_METHOD_IDEAL) { - $paymentMethodCode = self::PAYMENT_METHOD_SEPA; + if (isset(self::PAYMENT_METHOD_CODE_MAPPING[$paymentMethodCode])) { + $paymentMethodCode = self::PAYMENT_METHOD_CODE_MAPPING[$paymentMethodCode]; } return [ From f718348824c7432fe06590455f19ab8de7c681fd Mon Sep 17 00:00:00 2001 From: Can Demiralp Date: Thu, 1 Sep 2022 13:47:17 +0200 Subject: [PATCH 8/8] Remove unused logger --- src/Service/DonationService.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Service/DonationService.php b/src/Service/DonationService.php index 2e01b41e..fac45249 100644 --- a/src/Service/DonationService.php +++ b/src/Service/DonationService.php @@ -23,7 +23,6 @@ namespace Adyen\Shopware\Service; -use Psr\Log\LoggerInterface; use Shopware\Core\Framework\Uuid\Uuid; use Shopware\Core\System\SalesChannel\SalesChannelContext; @@ -58,16 +57,13 @@ class DonationService /** * @param ClientService $clientService * @param ConfigurationService $configurationService - * @param LoggerInterface $logger */ public function __construct( ClientService $clientService, - ConfigurationService $configurationService, - LoggerInterface $logger + ConfigurationService $configurationService ) { $this->clientService = $clientService; $this->configurationService = $configurationService; - $this->logger = $logger; } /**