diff --git a/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml b/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml
index 38d1d3e48..3087b0f13 100644
--- a/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml
+++ b/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml
@@ -19,17 +19,6 @@
window.logCenterUrl = "/on/demandware.servlet/webdav/Sites/Logs";
-
})
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/createTemporaryBasket.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/createTemporaryBasket.js
new file mode 100644
index 000000000..fb935cfd3
--- /dev/null
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/createTemporaryBasket.js
@@ -0,0 +1,93 @@
+const BasketMgr = require('dw/order/BasketMgr');
+const Transaction = require('dw/system/Transaction');
+const Resource = require('dw/web/Resource');
+const cartHelper = require('*/cartridge/scripts/cart/cartHelpers');
+const basketCalculationHelpers = require('*/cartridge/scripts/helpers/basketCalculationHelpers');
+const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
+
+function addProductToBasket(
+ tempBasket,
+ productId,
+ selectedQuantity,
+ bundledProducts,
+ options,
+) {
+ let result;
+ Transaction.wrap(() => {
+ result = {
+ error: false,
+ message: Resource.msg(
+ 'text.alert.createdTemporaryBasket',
+ 'product',
+ null,
+ ),
+ };
+ const quantity = parseInt(selectedQuantity, 10);
+ result = cartHelper.addProductToCart(
+ tempBasket,
+ productId,
+ quantity,
+ bundledProducts,
+ options,
+ );
+
+ if (!result.error) {
+ cartHelper.ensureAllShipmentsHaveMethods(tempBasket);
+ basketCalculationHelpers.calculateTotals(tempBasket);
+ } else {
+ throw new Error(result.message);
+ }
+ });
+}
+
+function createTemporaryBasket(req, res, next) {
+ try {
+ // Delete any existing open temporary baskets
+ Transaction.wrap(() => {
+ BasketMgr.getTemporaryBaskets()
+ .toArray()
+ .forEach((basket) => {
+ BasketMgr.deleteTemporaryBasket(basket);
+ });
+ });
+
+ // Create a new temporary basket
+ const tempBasket = BasketMgr.createTemporaryBasket();
+ if (!tempBasket) {
+ throw new Error('Temporary basket not created');
+ }
+ const { id, bundledProducts, options, selectedQuantity } = req.form[
+ 'selected-express-product'
+ ]
+ ? JSON.parse(req.form['selected-express-product'])
+ : {};
+ addProductToBasket(
+ tempBasket,
+ id,
+ selectedQuantity,
+ bundledProducts,
+ options,
+ );
+ const amount = {
+ value: tempBasket.getTotalGrossPrice().value,
+ currency: tempBasket.getTotalGrossPrice().currencyCode,
+ };
+ res.json({
+ basketId: tempBasket.UUID,
+ amount,
+ });
+ } catch (error) {
+ AdyenLogs.error_log('Failed to create temporary basket', error);
+ res.setStatusCode(500);
+ res.json({
+ errorMessage: Resource.msg(
+ 'error.cannot.create.temporary.basket',
+ 'product',
+ null,
+ ),
+ });
+ }
+ return next();
+}
+
+module.exports = createTemporaryBasket;
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js
index 2c217dcf1..3e54c2c20 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js
@@ -18,6 +18,7 @@ const makeExpressPaymentDetailsCall = require('*/cartridge/adyen/scripts/express
const saveShopperData = require('*/cartridge/adyen/scripts/expressPayments/paypal/saveShopperData');
const handleCheckoutReview = require('*/cartridge/adyen/scripts/expressPayments/paypal/handleCheckoutReview');
const validatePaymentDataFromRequest = require('*/cartridge/adyen/utils/validatePaymentData');
+const createTemporaryBasket = require('*/cartridge/adyen/scripts/expressPayments/createTemporaryBasket');
module.exports = {
getCheckoutPaymentMethods,
@@ -40,4 +41,5 @@ module.exports = {
saveShopperData,
handleCheckoutReview,
validatePaymentDataFromRequest,
+ createTemporaryBasket,
};
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/__tests__/getCheckoutPaymentMethods.test.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/__tests__/getCheckoutPaymentMethods.test.js
index 0f234d3d5..4fb53a21e 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/__tests__/getCheckoutPaymentMethods.test.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/__tests__/getCheckoutPaymentMethods.test.js
@@ -11,6 +11,7 @@ beforeEach(() => {
locale: {
id: 'en_US',
},
+ body: JSON.stringify({isExpressPdp: false})
};
res = {
json: jest.fn(),
@@ -39,7 +40,8 @@ describe('getCheckoutPaymentMethods', () => {
getTotalGrossPrice: jest.fn(() => {
return {
currencyCode: 'EUR',
- value: '1000'
+ value: '1000',
+ isAvailable: jest.fn(() => true)
}
})
};
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js
index cbb857ad7..b525f7cb4 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js
@@ -27,27 +27,12 @@ const blockedPayments = require('*/cartridge/adyen/config/blockedPaymentMethods.
const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
// eslint-disable-next-line complexity
-function getMethods(basket, customer, countryCode) {
+function getMethods(paymentAmount, customer, countryCode) {
try {
- let paymentAmount;
- let currencyCode;
-
- // paymentMethods call from checkout
- if (basket) {
- currencyCode = basket.currencyCode;
- paymentAmount = basket.getTotalGrossPrice().isAvailable()
- ? AdyenHelper.getCurrencyValueForApi(basket.getTotalGrossPrice())
- : new dw.value.Money(1000, currencyCode);
- } else {
- // paymentMethods call from My Account
- currencyCode = session.currency.currencyCode;
- paymentAmount = new dw.value.Money(0, currencyCode);
- }
-
const paymentMethodsRequest = {
merchantAccount: AdyenConfigs.getAdyenMerchantAccount(),
amount: {
- currency: currencyCode,
+ currency: paymentAmount.currencyCode,
value: paymentAmount.value,
},
};
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/getCheckoutPaymentMethods.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/getCheckoutPaymentMethods.js
index 1e8a174b5..350c34c41 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/getCheckoutPaymentMethods.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/getCheckoutPaymentMethods.js
@@ -1,7 +1,6 @@
const BasketMgr = require('dw/order/BasketMgr');
const Locale = require('dw/util/Locale');
const PaymentMgr = require('dw/order/PaymentMgr');
-const URLUtils = require('dw/web/URLUtils');
const AdyenHelper = require('*/cartridge/adyen/utils/adyenHelper');
const adyenTerminalApi = require('*/cartridge/adyen/scripts/payments/adyenTerminalApi');
const paymentMethodDescriptions = require('*/cartridge/adyen/config/paymentMethodDescriptions');
@@ -11,9 +10,11 @@ const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
function getCountryCode(currentBasket, locale) {
let countryCode;
- const { shippingAddress } = currentBasket.getDefaultShipment();
- if (shippingAddress) {
- countryCode = shippingAddress.getCountryCode().value;
+ if (currentBasket) {
+ const { shippingAddress } = currentBasket.getDefaultShipment();
+ if (shippingAddress) {
+ countryCode = shippingAddress.getCountryCode().value;
+ }
}
return countryCode || Locale.getLocale(locale.id).country;
}
@@ -25,35 +26,33 @@ function getConnectedTerminals() {
return '{}';
}
+const getRemainingAmount = (giftCardResponse, currency, currentBasket) => {
+ if (giftCardResponse && JSON.parse(giftCardResponse).remainingAmount) {
+ const { value = 1000 } = JSON.parse(giftCardResponse).remainingAmount;
+ return new dw.value.Money(value, currency);
+ }
+ return currentBasket?.getTotalGrossPrice().isAvailable()
+ ? AdyenHelper.getCurrencyValueForApi(currentBasket.getTotalGrossPrice())
+ : new dw.value.Money(1000, currency);
+};
+
function getCheckoutPaymentMethods(req, res, next) {
try {
const currentBasket = BasketMgr.getCurrentBasket();
- if (!currentBasket) {
- res.json({
- error: true,
- redirectUrl: URLUtils.url('Cart-Show').toString(),
- });
-
- return next();
- }
const countryCode = getCountryCode(currentBasket, req.locale);
const adyenURL = `${AdyenHelper.getLoadingContext()}images/logos/medium/`;
const connectedTerminals = JSON.parse(getConnectedTerminals());
- const currency = currentBasket.getTotalGrossPrice().currencyCode;
- const getRemainingAmount = (giftCardResponse) => {
- if (giftCardResponse && JSON.parse(giftCardResponse).remainingAmount) {
- return JSON.parse(giftCardResponse).remainingAmount;
- }
- return {
- currency,
- value: AdyenHelper.getCurrencyValueForApi(
- currentBasket.getTotalGrossPrice(),
- ).value,
- };
- };
- const paymentAmount = getRemainingAmount(session.privacy.giftCardResponse);
- const paymentMethods = getPaymentMethods.getMethods(
+ const currency = currentBasket
+ ? currentBasket.getTotalGrossPrice().currencyCode
+ : session.currency.currencyCode;
+ const paymentAmount = getRemainingAmount(
+ session.privacy.giftCardResponse,
+ currency,
currentBasket,
+ );
+
+ const paymentMethods = getPaymentMethods.getMethods(
+ paymentAmount,
AdyenHelper.getCustomer(req.currentCustomer),
countryCode,
);
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/paymentFromComponent.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/paymentFromComponent.js
index c736ee884..3dea048ce 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/paymentFromComponent.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/paymentFromComponent.js
@@ -164,11 +164,13 @@ function canSkipSummaryPage(reqDataObj) {
* Make a payment from inside a component, skipping the summary page. (paypal, QRcodes, MBWay)
*/
function paymentFromComponent(req, res, next) {
- const reqDataObj = JSON.parse(req.form.data);
+ const { basketId, ...reqDataObj } = JSON.parse(req.form.data);
if (reqDataObj.cancelTransaction) {
return handleCancellation(res, next, reqDataObj);
}
- const currentBasket = BasketMgr.getCurrentBasket();
+ const currentBasket = basketId
+ ? BasketMgr.getTemporaryBasket(basketId)
+ : BasketMgr.getCurrentBasket();
let paymentInstrument;
Transaction.wrap(() => {
collections.forEach(currentBasket.getPaymentInstruments(), (item) => {
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/updateSavedCards.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/updateSavedCards.js
index 6bfffe03e..472640d01 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/updateSavedCards.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/updateSavedCards.js
@@ -31,8 +31,9 @@ const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
const getPaymentMethods = require('*/cartridge/adyen/scripts/payments/adyenGetPaymentMethods');
function getOneClickPaymentMethods(customer) {
+ const amount = new dw.value.Money(0, session.currency.currencyCode);
const { storedPaymentMethods } = getPaymentMethods.getMethods(
- null,
+ amount,
customer,
'',
);
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js
index f7120acae..f392c6a4f 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js
@@ -136,13 +136,25 @@ const adyenConfigsObj = {
},
areExpressPaymentsEnabled() {
- return getCustomPreference('ExpressPayments_enabled');
+ return (
+ this.isApplePayExpressEnabled() ||
+ this.isAmazonPayExpressEnabled() ||
+ this.isPayPalExpressEnabled()
+ );
+ },
+
+ arePdpExpressPaymentsEnabled() {
+ return this.isApplePayExpressOnPdpEnabled();
},
isApplePayExpressEnabled() {
return getCustomPreference('ApplePayExpress_Enabled');
},
+ isApplePayExpressOnPdpEnabled() {
+ return getCustomPreference('ApplePayExpress_Pdp_Enabled');
+ },
+
isAmazonPayExpressEnabled() {
return getCustomPreference('AmazonPayExpress_Enabled');
},
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js
index 45e6b4ca8..4feb36364 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js
@@ -770,7 +770,8 @@ let adyenHelperObj = {
// get the fraction digits based on the currency code used to convert amounts of currency for the Adyen Checkout API
getFractionDigits(currencyCode) {
let format;
- switch (currencyCode) {
+ let currency = currencyCode || session.currency.currencyCode;
+ switch (currency) {
case 'CVE':
case 'DJF':
case 'GNF':
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js b/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
index 358b201a6..38c22adfb 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
@@ -205,6 +205,15 @@ server.post(
adyen.fetchGiftCards,
);
+/**
+ * Called by Adyen to create temporary basket for express payment on pdp.
+ */
+server.post(
+ 'CreateTemporaryBasket',
+ server.middleware.https,
+ adyen.createTemporaryBasket,
+);
+
function getExternalPlatformVersion() {
return EXTERNAL_PLATFORM_VERSION;
}
diff --git a/tests/playwright/package.json b/tests/playwright/package.json
index 03eaaeec9..79e2b0420 100644
--- a/tests/playwright/package.json
+++ b/tests/playwright/package.json
@@ -77,7 +77,7 @@
"picomatch": "^2.3.1",
"pirates": "^4.0.4",
"pixelmatch": "^5.2.1",
- "playwright-core": "^1.21.0",
+ "playwright-core": "^1.45.0",
"pngjs": "^6.0.0",
"pretty-format": "^27.5.1",
"progress": "^2.0.3",
@@ -106,7 +106,7 @@
"yazl": "^2.5.1"
},
"devDependencies": {
- "@playwright/test": "^1.42.1"
+ "@playwright/test": "^1.45.0"
},
"scripts": {
"test": "npx playwright test",