From e29dbf725c6543b874b5acdd371394b564fc6c6e Mon Sep 17 00:00:00 2001 From: Ignacio Catalina Date: Thu, 31 Aug 2017 16:09:55 +1000 Subject: [PATCH] feat(payment): CHECKOUT-2358 Add extra data for CyberSource Add customerGroup, deviceFingerprint and coupon list for CyberSource. --- src/payment/v1/payment-mappers/customer-mapper.js | 1 + src/payment/v1/payment-mappers/order-mapper.js | 14 ++++++++++++++ src/payment/v1/payment-mappers/payment-mapper.js | 9 ++++++++- src/typedefs.js | 5 +++++ test/mocks/payment-request-data.js | 11 +++++++++++ .../v1/payment-mappers/customer-mapper.spec.js | 1 + .../v1/payment-mappers/order-mapper.spec.js | 4 ++++ .../v1/payment-mappers/payment-mapper.spec.js | 6 ++++++ 8 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/payment/v1/payment-mappers/customer-mapper.js b/src/payment/v1/payment-mappers/customer-mapper.js index d939862a..c7d2cd2a 100644 --- a/src/payment/v1/payment-mappers/customer-mapper.js +++ b/src/payment/v1/payment-mappers/customer-mapper.js @@ -16,6 +16,7 @@ export default class CustomerMapper { const { customer = {}, quoteMeta = {} } = data; return omitNil({ + customer_group: customer.customerGroupName ? { name: customer.customerGroupName } : null, geo_ip_country_code: quoteMeta.request ? quoteMeta.request.geoCountryCode : null, id: customer.customerId ? toString(customer.customerId) : null, session_token: quoteMeta.request ? quoteMeta.request.sessionHash : null, diff --git a/src/payment/v1/payment-mappers/order-mapper.js b/src/payment/v1/payment-mappers/order-mapper.js index 44c2b097..c7963bc3 100644 --- a/src/payment/v1/payment-mappers/order-mapper.js +++ b/src/payment/v1/payment-mappers/order-mapper.js @@ -17,6 +17,7 @@ export default class OrderMapper { return omitNil({ billing_address: this.mapToBillingAddress(data), + coupons: this.mapToCoupons(data), currency: order.currency, id: order.orderId ? toString(order.orderId) : null, items: this.mapToItems(data), @@ -42,6 +43,19 @@ export default class OrderMapper { return address; } + /** + * @private + * @param {PaymentRequestData} data + * @returns {Coupon[]} + */ + mapToCoupons({ order = {} }) { + if (order.coupon && order.coupon.coupons) { + return order.coupon.coupons.map(({ code }) => ({ code })); + } + + return []; + } + /** * @private * @param {PaymentRequestData} data diff --git a/src/payment/v1/payment-mappers/payment-mapper.js b/src/payment/v1/payment-mappers/payment-mapper.js index aa970f74..6a760892 100644 --- a/src/payment/v1/payment-mappers/payment-mapper.js +++ b/src/payment/v1/payment-mappers/payment-mapper.js @@ -30,10 +30,17 @@ export default class PaymentMapper { * @returns {Object} */ mapToPayment(data) { - const { order = {}, payment = {}, paymentMethod = {}, quoteMeta = {} } = data; + const { + order = {}, + orderMeta = {}, + payment = {}, + paymentMethod = {}, + quoteMeta = {}, + } = data; const payload = { device_info: quoteMeta.request ? quoteMeta.request.deviceSessionId : null, + device: orderMeta.deviceFingerprint ? { fingerprint_id: orderMeta.deviceFingerprint } : null, gateway: this.paymentMethodIdMapper.mapToId(paymentMethod), notify_url: order.callbackUrl, return_url: paymentMethod.returnUrl || (order.payment ? order.payment.returnUrl : null), diff --git a/src/typedefs.js b/src/typedefs.js index a230e3d1..bd75115f 100644 --- a/src/typedefs.js +++ b/src/typedefs.js @@ -102,3 +102,8 @@ * @property {string} storeLanguage * @property {string} storeName */ + +/** + * @typedef {Object} Coupon + * @property {string} code + */ diff --git a/test/mocks/payment-request-data.js b/test/mocks/payment-request-data.js index 03ce09c0..31bbd303 100644 --- a/test/mocks/payment-request-data.js +++ b/test/mocks/payment-request-data.js @@ -51,6 +51,7 @@ const paymentRequestDataMock = { ], }, customer: { + customerGroupName: 'b2b', customerId: '123', email: 'email@bigcommerce.com', firstName: 'Foo', @@ -60,6 +61,13 @@ const paymentRequestDataMock = { }, order: { callbackUrl: '/order/123/payment', + coupon: { + coupons: [{ + code: 'fiver', + name: 'Five off', + discount: '$5.00 off the order total', + }], + }, currency: 'AUD', discount: { integerAmount: 0, @@ -82,6 +90,9 @@ const paymentRequestDataMock = { }, token: 'abc123', }, + orderMeta: { + deviceFingerprint: 'xyz1234', + }, payment: { ccCvv: '123', ccExpiry: { diff --git a/test/payment/v1/payment-mappers/customer-mapper.spec.js b/test/payment/v1/payment-mappers/customer-mapper.spec.js index 62dc8cbf..f6a2a19e 100644 --- a/test/payment/v1/payment-mappers/customer-mapper.spec.js +++ b/test/payment/v1/payment-mappers/customer-mapper.spec.js @@ -20,6 +20,7 @@ describe('CustomerMapper', () => { const output = customerMapper.mapToCustomer(data); expect(output).toEqual({ + customer_group: { name: data.customer.customerGroupName }, geo_ip_country_code: data.quoteMeta.request.geoCountryCode, id: `${data.customer.customerId}`, session_token: data.quoteMeta.request.sessionHash, diff --git a/test/payment/v1/payment-mappers/order-mapper.spec.js b/test/payment/v1/payment-mappers/order-mapper.spec.js index b17ed00c..a064cf79 100644 --- a/test/payment/v1/payment-mappers/order-mapper.spec.js +++ b/test/payment/v1/payment-mappers/order-mapper.spec.js @@ -60,6 +60,9 @@ describe('OrderMapper', () => { street_2: data.shippingAddress.addressLine2, zip: data.shippingAddress.postCode, }, + coupons: [{ + code: data.order.coupon.coupons[0].code, + }], totals: { grand_total: data.order.grandTotal.integerAmount, handling: data.order.handling.integerAmount, @@ -73,6 +76,7 @@ describe('OrderMapper', () => { it('returns an empty object if the input does not contain order information', () => { expect(orderMapper.mapToOrder({})).toEqual({ + coupons: [], billing_address: {}, items: [], shipping_address: {}, diff --git a/test/payment/v1/payment-mappers/payment-mapper.spec.js b/test/payment/v1/payment-mappers/payment-mapper.spec.js index 58320865..de046038 100644 --- a/test/payment/v1/payment-mappers/payment-mapper.spec.js +++ b/test/payment/v1/payment-mappers/payment-mapper.spec.js @@ -35,6 +35,9 @@ describe('PaymentMapper', () => { verification_value: data.payment.ccCvv, year: parseInt(data.payment.ccExpiry.year, 10), }, + device: { + fingerprint_id: data.orderMeta.deviceFingerprint, + }, device_info: data.quoteMeta.request.deviceSessionId, gateway: data.paymentMethod.id, notify_url: data.order.callbackUrl, @@ -55,6 +58,9 @@ describe('PaymentMapper', () => { credit_card_token: { token: data.paymentMethod.nonce, }, + device: { + fingerprint_id: data.orderMeta.deviceFingerprint, + }, device_info: data.quoteMeta.request.deviceSessionId, gateway: data.paymentMethod.id, notify_url: data.order.callbackUrl,