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 3087b0f13..38d1d3e48 100644
--- a/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml
+++ b/src/cartridges/bm_adyen/cartridge/templates/default/adyenSettings/settings.isml
@@ -19,6 +19,17 @@
window.logCenterUrl = "/on/demandware.servlet/webdav/Sites/Logs";
+
![adyen-logo](${URLUtils.staticURL('icons/icon-success.svg')})
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/selectShippingMethods.test.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/selectShippingMethods.test.js
index ddae272ca..006d010a8 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/selectShippingMethods.test.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/selectShippingMethods.test.js
@@ -33,9 +33,9 @@ describe('callSelectShippingMethod', () => {
currentBasket = BasketMgr.getCurrentBasket.mockReturnValueOnce(null);
callSelectShippingMethod(req, res, next);
expect(res.json).toHaveBeenCalledWith({
- error: true,
- redirectUrl: URLUtils.url('Cart-Show').toString(),
- });
+ error: true,
+ redirectUrl: URLUtils.url('Cart-Show').toString(),
+ });
expect(next).toHaveBeenCalled();
});
@@ -51,8 +51,8 @@ describe('callSelectShippingMethod', () => {
expect(res.setStatusCode).toHaveBeenCalledWith(500);
expect(res.json).toHaveBeenCalledWith({
- errorMessage: 'mocked_error.cannot.select.shipping.method',
- });
+ errorMessage: 'mocked_error.cannot.select.shipping.method',
+ });
expect(next).toHaveBeenCalled();
});
@@ -90,4 +90,4 @@ describe('callSelectShippingMethod', () => {
});
expect(next).toHaveBeenCalled();
});
-});
+});
\ No newline at end of file
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/shippingMethods.test.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/shippingMethods.test.js
index 0c389b93e..72d844088 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/shippingMethods.test.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/__tests__/shippingMethods.test.js
@@ -15,12 +15,12 @@ beforeEach(() => {
req = {
form: {
data: JSON.stringify({address:{
- city: 'Amsterdam',
- countryCode: 'NL',
- stateCode: 'AMS',
- postalCode: '1001',
- shipmentUUID: 'mocked_uuid',
- }})
+ city: 'Amsterdam',
+ countryCode: 'NL',
+ stateCode: 'AMS',
+ postalCode: '1001',
+ shipmentUUID: 'mocked_uuid',
+ }})
},
};
@@ -79,28 +79,27 @@ describe('Shipping methods', () => {
});
});
- it('Should update shipping address for the basket', () => {
- const Logger = require('../../../../../../../../jest/__mocks__/dw/system/Logger');
- const setCityMock = jest.fn()
- const setPostalCodeMock = jest.fn()
- const setStateCodeMock = jest.fn()
- const setCountryCodeMock = jest.fn()
- const currentBasketMock = {
- getDefaultShipment: jest.fn(() =>({
- createShippingAddress: jest.fn(() => ({
- setCity: setCityMock,
- setPostalCode: setPostalCodeMock,
- setStateCode: setStateCodeMock,
- setCountryCode: setCountryCodeMock
- }))
- })),
- };
- BasketMgr.getCurrentBasket.mockReturnValueOnce(currentBasketMock);
- callGetShippingMethods(req, res, next);
- expect(setCityMock).toHaveBeenCalledWith('Amsterdam');
- expect(setPostalCodeMock).toHaveBeenCalledWith('1001');
- expect(setStateCodeMock).toHaveBeenCalledWith('AMS');
- expect(setCountryCodeMock).toHaveBeenCalledWith('NL');
- expect(Logger.error.mock.calls.length).toBe(0);
- });
-
+it('Should update shipping address for the basket', () => {
+ const Logger = require('../../../../../../../../jest/__mocks__/dw/system/Logger');
+ const setCityMock = jest.fn()
+ const setPostalCodeMock = jest.fn()
+ const setStateCodeMock = jest.fn()
+ const setCountryCodeMock = jest.fn()
+ const currentBasketMock = {
+ getDefaultShipment: jest.fn(() =>({
+ createShippingAddress: jest.fn(() => ({
+ setCity: setCityMock,
+ setPostalCode: setPostalCodeMock,
+ setStateCode: setStateCodeMock,
+ setCountryCode: setCountryCodeMock
+ }))
+ })),
+ };
+ BasketMgr.getCurrentBasket.mockReturnValueOnce(currentBasketMock);
+ callGetShippingMethods(req, res, next);
+ expect(setCityMock).toHaveBeenCalledWith('Amsterdam');
+ expect(setPostalCodeMock).toHaveBeenCalledWith('1001');
+ expect(setStateCodeMock).toHaveBeenCalledWith('AMS');
+ expect(setCountryCodeMock).toHaveBeenCalledWith('NL');
+ expect(Logger.error.mock.calls.length).toBe(0);
+});
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
deleted file mode 100644
index 387d1c92c..000000000
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/expressPayments/createTemporaryBasket.js
+++ /dev/null
@@ -1,93 +0,0 @@
-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 } = JSON.parse(
- req.form.data,
- );
-
- 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 40f007e85..2c217dcf1 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/index.js
@@ -17,7 +17,7 @@ const makeExpressPaymentsCall = require('*/cartridge/adyen/scripts/expressPaymen
const makeExpressPaymentDetailsCall = require('*/cartridge/adyen/scripts/expressPayments/paypal/makeExpressPaymentDetailsCall');
const saveShopperData = require('*/cartridge/adyen/scripts/expressPayments/paypal/saveShopperData');
const handleCheckoutReview = require('*/cartridge/adyen/scripts/expressPayments/paypal/handleCheckoutReview');
-const createTemporaryBasket = require('*/cartridge/adyen/scripts/expressPayments/createTemporaryBasket');
+const validatePaymentDataFromRequest = require('*/cartridge/adyen/utils/validatePaymentData');
module.exports = {
getCheckoutPaymentMethods,
@@ -39,5 +39,5 @@ module.exports = {
makeExpressPaymentDetailsCall,
saveShopperData,
handleCheckoutReview,
- createTemporaryBasket,
+ validatePaymentDataFromRequest,
};
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/cancelPartialPaymentOrder.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/cancelPartialPaymentOrder.js
index e13123f73..e76131697 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/cancelPartialPaymentOrder.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/cancelPartialPaymentOrder.js
@@ -12,12 +12,11 @@ const clearForms = require('*/cartridge/adyen/utils/clearForms');
function cancelPartialPaymentOrder(req, res, next) {
try {
const currentBasket = BasketMgr.getCurrentBasket();
- const request = JSON.parse(req.form.data);
- const { partialPaymentsOrder } = request;
+ const { order } = JSON.parse(session.privacy.partialPaymentData);
const cancelOrderRequest = {
merchantAccount: AdyenConfigs.getAdyenMerchantAccount(),
- order: partialPaymentsOrder,
+ order,
};
const response =
@@ -34,6 +33,7 @@ function cancelPartialPaymentOrder(req, res, next) {
});
session.privacy.giftCardResponse = null;
session.privacy.partialPaymentData = null;
+ session.privacy.giftCardBalance = null;
} else {
throw new Error(`received resultCode ${response.resultCode}`);
}
@@ -46,7 +46,7 @@ function cancelPartialPaymentOrder(req, res, next) {
};
res.json({
- ...response,
+ resultCode: response.resultCode,
amount,
});
} catch (error) {
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/checkBalance.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/checkBalance.js
index a38e90512..7fa756e4d 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/checkBalance.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/checkBalance.js
@@ -71,8 +71,13 @@ function callCheckBalance(req, res, next) {
currentBasket.custom.adyenGiftCardsOrderNo = orderNo;
});
+ session.privacy.giftCardBalance = JSON.stringify(
+ checkBalanceResponse.balance,
+ );
+
res.json({
- ...checkBalanceResponse,
+ resultCode: checkBalanceResponse.resultCode,
+ balance: checkBalanceResponse.balance,
...getFormattedProperties(checkBalanceResponse, orderAmount),
});
} catch (error) {
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPayment.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPayment.js
index 49109ce33..9f18659c1 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPayment.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPayment.js
@@ -19,14 +19,21 @@ function makePartialPayment(req, res, next) {
const request = JSON.parse(req.form.data);
const currentBasket = BasketMgr.getCurrentBasket();
- const { paymentMethod, partialPaymentsOrder, amount, giftcardBrand } =
+ const { encryptedCardNumber, encryptedSecurityCode, brand, giftcardBrand } =
request;
+ const paymentMethod = {
+ encryptedCardNumber,
+ encryptedSecurityCode,
+ brand,
+ type: 'giftcard',
+ };
+ const { order } = JSON.parse(session.privacy.partialPaymentData);
const partialPaymentRequest = {
merchantAccount: AdyenConfigs.getAdyenMerchantAccount(),
- amount,
+ amount: JSON.parse(session.privacy.giftCardBalance),
reference: currentBasket.custom.adyenGiftCardsOrderNo,
paymentMethod,
- order: partialPaymentsOrder,
+ order,
};
const response = adyenCheckout.doPaymentsCall(
@@ -95,7 +102,6 @@ function makePartialPayment(req, res, next) {
...response.paymentMethod,
amount: response.amount,
name: giftcardBrand,
- pspReference: response.pspReference,
},
orderAmount: {
currency: currentBasket.currencyCode,
@@ -103,10 +109,7 @@ function makePartialPayment(req, res, next) {
currentBasket.getTotalGrossPrice(),
).value,
},
- partialPaymentsOrder: {
- orderData: response.order.orderData,
- pspReference: response.order.pspReference,
- },
+ orderCreated: !!response?.order?.orderData,
remainingAmount: response.order.remainingAmount,
remainingAmountFormatted,
};
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPaymentsOrder.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPaymentsOrder.js
index d7356ee21..0bfceff1b 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPaymentsOrder.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/partialPayments/partialPaymentsOrder.js
@@ -51,7 +51,9 @@ function createPartialPaymentsOrder(req, res, next) {
});
const responseData = {
- ...response,
+ resultCode: response?.resultCode,
+ remainingAmount: response?.remainingAmount,
+ amount: orderAmount,
expiresAt: date.toISOString(),
};
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 4fb53a21e..0f234d3d5 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,7 +11,6 @@ beforeEach(() => {
locale: {
id: 'en_US',
},
- body: JSON.stringify({isExpressPdp: false})
};
res = {
json: jest.fn(),
@@ -40,8 +39,7 @@ describe('getCheckoutPaymentMethods', () => {
getTotalGrossPrice: jest.fn(() => {
return {
currencyCode: 'EUR',
- value: '1000',
- isAvailable: jest.fn(() => true)
+ value: '1000'
}
})
};
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 b525f7cb4..cbb857ad7 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,12 +27,27 @@ const blockedPayments = require('*/cartridge/adyen/config/blockedPaymentMethods.
const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
// eslint-disable-next-line complexity
-function getMethods(paymentAmount, customer, countryCode) {
+function getMethods(basket, 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: paymentAmount.currencyCode,
+ currency: 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 350c34c41..1e8a174b5 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,6 +1,7 @@
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');
@@ -10,11 +11,9 @@ const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
function getCountryCode(currentBasket, locale) {
let countryCode;
- if (currentBasket) {
- const { shippingAddress } = currentBasket.getDefaultShipment();
- if (shippingAddress) {
- countryCode = shippingAddress.getCountryCode().value;
- }
+ const { shippingAddress } = currentBasket.getDefaultShipment();
+ if (shippingAddress) {
+ countryCode = shippingAddress.getCountryCode().value;
}
return countryCode || Locale.getLocale(locale.id).country;
}
@@ -26,33 +25,35 @@ 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
- ? currentBasket.getTotalGrossPrice().currencyCode
- : session.currency.currencyCode;
- const paymentAmount = getRemainingAmount(
- session.privacy.giftCardResponse,
- currency,
- currentBasket,
- );
-
+ 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(
- paymentAmount,
+ currentBasket,
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 d1cbad80c..c736ee884 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,30 +164,31 @@ function canSkipSummaryPage(reqDataObj) {
* Make a payment from inside a component, skipping the summary page. (paypal, QRcodes, MBWay)
*/
function paymentFromComponent(req, res, next) {
- const { basketId, ...reqDataObj } = JSON.parse(req.form.data);
+ const reqDataObj = JSON.parse(req.form.data);
if (reqDataObj.cancelTransaction) {
return handleCancellation(res, next, reqDataObj);
}
- const currentBasket = basketId
- ? BasketMgr.getTemporaryBasket(basketId)
- : BasketMgr.getCurrentBasket();
+ const currentBasket = BasketMgr.getCurrentBasket();
let paymentInstrument;
Transaction.wrap(() => {
collections.forEach(currentBasket.getPaymentInstruments(), (item) => {
currentBasket.removePaymentInstrument(item);
});
+ const paymentInstrumentType = constants.METHOD_ADYEN_COMPONENT;
+
paymentInstrument = currentBasket.createPaymentInstrument(
- constants.METHOD_ADYEN_COMPONENT,
+ paymentInstrumentType,
currentBasket.totalGrossPrice,
);
const { paymentProcessor } = PaymentMgr.getPaymentMethod(
paymentInstrument.paymentMethod,
);
paymentInstrument.paymentTransaction.paymentProcessor = paymentProcessor;
+ paymentInstrument.custom.adyenMainPaymentInstrument = paymentInstrumentType;
paymentInstrument.custom.adyenPaymentData = req.form.data;
- if (reqDataObj.partialPaymentsOrder) {
+ if (session.privacy.partialPaymentData) {
paymentInstrument.custom.adyenPartialPaymentsOrder =
session.privacy.partialPaymentData;
}
@@ -210,7 +211,6 @@ function paymentFromComponent(req, res, next) {
if (currentBasket.custom?.adyenGiftCards) {
const giftCardsOrderNo = currentBasket.custom.adyenGiftCardsOrderNo;
order = OrderMgr.createOrder(currentBasket, giftCardsOrderNo);
- handleGiftCardPayment(currentBasket, order);
} else {
order = COHelpers.createOrder(currentBasket);
}
@@ -230,6 +230,8 @@ function paymentFromComponent(req, res, next) {
handleRefusedResultCode(result, reqDataObj, order);
}
+ handleGiftCardPayment(currentBasket, order);
+
// Check if summary page can be skipped in case payment is already authorized
result.skipSummaryPage = canSkipSummaryPage(reqDataObj);
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 472640d01..6bfffe03e 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,9 +31,8 @@ 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(
- amount,
+ null,
customer,
'',
);
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/__tests__/handlePaymentFromComponent.test.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/__tests__/handlePaymentFromComponent.test.js
index 7c5270f85..07a80ccab 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/__tests__/handlePaymentFromComponent.test.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/__tests__/handlePaymentFromComponent.test.js
@@ -9,7 +9,7 @@ let req;
let order;
beforeEach(() => {
jest.clearAllMocks();
- req = { locale: { id: 'mocked_locale' } };
+ req = { locale: { id: 'mocked_locale' }, form: { result: "123" }};
res = { redirect: jest.fn() };
order = OrderMgr.getOrder();
next = jest.fn();
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/handlePaymentFromComponent.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/handlePaymentFromComponent.js
index 51bd060ab..91f7f8f80 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/handlePaymentFromComponent.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/showConfirmation/handlePaymentFromComponent.js
@@ -117,7 +117,7 @@ function handlePayment(stateData, order, options) {
const paymentInstruments = order.getPaymentInstruments(
AdyenHelper.getOrderMainPaymentInstrumentType(order),
);
- const result = options.req.form?.result;
+ const result = JSON.parse(options.req.form?.result);
const adyenPaymentInstrument = paymentInstruments[0];
const hasStateData = stateData?.paymentData && stateData?.details;
@@ -137,7 +137,7 @@ function handlePayment(stateData, order, options) {
JSON.stringify(result).indexOf('applepay') > -1 ||
JSON.stringify(result).indexOf('cashapp') > -1)
) {
- finalResult = JSON.parse(result);
+ finalResult = result;
} else {
return handlePaymentError(order, adyenPaymentInstrument, options);
}
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 f392c6a4f..f7120acae 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js
@@ -136,25 +136,13 @@ const adyenConfigsObj = {
},
areExpressPaymentsEnabled() {
- return (
- this.isApplePayExpressEnabled() ||
- this.isAmazonPayExpressEnabled() ||
- this.isPayPalExpressEnabled()
- );
- },
-
- arePdpExpressPaymentsEnabled() {
- return this.isApplePayExpressOnPdpEnabled();
+ return getCustomPreference('ExpressPayments_enabled');
},
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 4feb36364..45e6b4ca8 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js
@@ -770,8 +770,7 @@ 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;
- let currency = currencyCode || session.currency.currencyCode;
- switch (currency) {
+ switch (currencyCode) {
case 'CVE':
case 'DJF':
case 'GNF':
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/clearForms.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/clearForms.js
index 5760b70ce..e067315af 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/clearForms.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/clearForms.js
@@ -13,6 +13,7 @@ function clearCustomSessionFields() {
session.privacy.giftCardResponse = null;
session.privacy.partialPaymentData = null;
session.privacy.amazonExpressShopperDetail = null;
+ session.privacy.giftCardBalance = null;
}
/**
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/lineItemHelper.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/lineItemHelper.js
index 1bf69d898..4287ea707 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/lineItemHelper.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/lineItemHelper.js
@@ -99,12 +99,28 @@ const __LineItemHelper = {
return new dw.value.Money(0, lineItem.getPrice().getCurrencyCode());
},
+ isProductLineItem(lineItem) {
+ return lineItem instanceof dw.order.ProductLineItem;
+ },
+
+ isBonusProductLineItem(lineItem) {
+ return lineItem.bonusProductLineItem;
+ },
+
+ isShippingLineItem(lineItem) {
+ return lineItem instanceof dw.order.ShippingLineItem;
+ },
+
+ isPriceAdjustment(lineItem) {
+ return lineItem instanceof dw.order.PriceAdjustment;
+ },
+
isValidLineItem(lineItem) {
return (
- (lineItem instanceof dw.order.ProductLineItem &&
- !lineItem.bonusProductLineItem) ||
- lineItem instanceof dw.order.ShippingLineItem ||
- (lineItem instanceof dw.order.PriceAdjustment &&
+ (this.isProductLineItem(lineItem) &&
+ !this.isBonusProductLineItem(lineItem)) ||
+ this.isShippingLineItem(lineItem) ||
+ (this.isPriceAdjustment(lineItem) &&
lineItem.promotion.promotionClass ===
dw.campaign.Promotion.PROMOTION_CLASS_ORDER)
);
@@ -112,6 +128,7 @@ const __LineItemHelper = {
getAllLineItems(allLineItems) {
const lineItems = [];
+ // eslint-disable-next-line no-restricted-syntax
for (const item in allLineItems) {
if (item) {
const lineItem = allLineItems[item];
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/validatePaymentData.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/validatePaymentData.js
new file mode 100644
index 000000000..eeb901f8c
--- /dev/null
+++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/validatePaymentData.js
@@ -0,0 +1,24 @@
+const BasketMgr = require('dw/order/BasketMgr');
+const URLUtils = require('dw/web/URLUtils');
+const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs');
+
+function validateBasketAmount(currentBasket) {
+ if (currentBasket.totalGrossPrice <= 0) {
+ throw new Error(
+ 'Cannot complete a payment with an amount lower or equal to zero',
+ );
+ }
+}
+
+function validatePaymentDataFromRequest(req, res, next) {
+ try {
+ const currentBasket = BasketMgr.getCurrentBasket();
+ validateBasketAmount(currentBasket);
+ } catch (e) {
+ AdyenLogs.fatal_log(`Error occurred: ${e.message}`);
+ res.redirect(URLUtils.url('Error-ErrorCode', 'err', 'general'));
+ }
+ return next();
+}
+
+module.exports = validatePaymentDataFromRequest;
diff --git a/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js b/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
index 6b8dec400..358b201a6 100644
--- a/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
+++ b/src/cartridges/int_adyen_SFRA/cartridge/controllers/Adyen.js
@@ -89,6 +89,7 @@ server.post(
'PaymentFromComponent',
server.middleware.https,
csrf.validateRequest,
+ adyen.validatePaymentDataFromRequest,
adyen.paymentFromComponent,
);
@@ -171,6 +172,7 @@ server.post(
'MakeExpressPaymentsCall',
server.middleware.https,
csrf.validateRequest,
+ adyen.validatePaymentDataFromRequest,
adyen.makeExpressPaymentsCall,
);
@@ -203,16 +205,6 @@ server.post(
adyen.fetchGiftCards,
);
-/**
- * Called by Adyen to create temporary basket for express payment on pdp.
- */
-server.post(
- 'CreateTemporaryBasket',
- server.middleware.https,
- csrf.validateRequest,
- adyen.createTemporaryBasket,
-);
-
function getExternalPlatformVersion() {
return EXTERNAL_PLATFORM_VERSION;
}
diff --git a/tests/playwright/pages/CheckoutPageSFRA5.mjs b/tests/playwright/pages/CheckoutPageSFRA5.mjs
index 6cb40f553..30e965d41 100644
--- a/tests/playwright/pages/CheckoutPageSFRA5.mjs
+++ b/tests/playwright/pages/CheckoutPageSFRA5.mjs
@@ -104,9 +104,6 @@ export default class CheckoutPageSFRA5 {
await this.successMessage.waitFor({ visible: true });
await this.navigateToCheckout(locale);
- if (this.consentButton.isVisible()) {
- this.consentButton.click();
- }
await this.checkoutGuest.click();
};