From 95a1ca1ba189d95774a4a64acac1374511d10a17 Mon Sep 17 00:00:00 2001 From: Brent Hoover Date: Mon, 9 Oct 2017 19:03:30 +0800 Subject: [PATCH 1/6] Iterate over billing records and grab refunds --- server/methods/core/orders.js | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index 13f1a4db09d..6ebec7c3113 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -946,31 +946,23 @@ export const methods = { * loop through order's payments and find existing refunds. * @summary Get a list of refunds for a particular payment method. * @param {Object} order - order object - * @return {null} no return value + * @return {Array} Array contains refund records */ "orders/refunds/list": function (order) { check(order, Object); - const paymentMethod = orderCreditMethod(order).paymentMethod; if (!this.userId === order.userId && !Reaction.hasPermission("orders")) { throw new Meteor.Error("access-denied", "Access Denied"); } - this.unblock(); - - const future = new Future(); - const processor = paymentMethod.processor.toLowerCase(); - - Meteor.call(`${processor}/refund/list`, paymentMethod, (error, result) => { - if (error) { - future.return(error); - } else { - check(result, [Schemas.Refund]); - future.return(result); - } - }); - - return future.wait(); + const refunds = []; + for (const billingRecord of order.billing) { + const paymentMethod = billingRecord.paymentMethod; + const processor = paymentMethod.processor.toLowerCase(); + const shopRefunds = Meteor.call(`${processor}/refund/list`, paymentMethod); + refunds.push(...shopRefunds); + } + return refunds; }, /** From 54760053937606302389e71c9f18892fb3291f04 Mon Sep 17 00:00:00 2001 From: Njeri Kieha Date: Tue, 10 Oct 2017 02:41:33 +0300 Subject: [PATCH 2/6] Build up variables to use in email notification --- server/methods/core/orders.js | 74 ++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index 6ebec7c3113..19b991a2dcd 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -8,7 +8,6 @@ import { check, Match } from "meteor/check"; import { SSR } from "meteor/meteorhacks:ssr"; import { getSlug } from "/lib/api"; import { Media, Orders, Products, Shops, Packages } from "/lib/collections"; -import * as Schemas from "/lib/collections/schemas"; import { Logger, Hooks, Reaction } from "/server/api"; @@ -576,17 +575,48 @@ export const methods = { emailLogo = Meteor.absoluteUrl() + "resources/email-templates/shop-logo.png"; } - const billing = orderCreditMethod(order); - const shippingRecord = order.shipping.find(shipping => shipping.shopId === Reaction.getShopId()); + let subtotal = 0; + let shippingCost = 0; + let taxes = 0; + let discounts = 0; + let total = 0; + let amount = 0; + let address = {}; + let paymentMethod = {}; + let shippingAddress = {}; + let tracking; + let carrier = ""; + for (const billingRecord of order.billing) { + subtotal += billingRecord.invoice.subtotal; + shippingCost += billingRecord.invoice.shipping; + taxes += billingRecord.invoice.taxes; + discounts += billingRecord.invoice.discounts; + total += billingRecord.invoice.total; + amount += billingRecord.paymentMethod.amount; + address = billingRecord.address; + paymentMethod = billingRecord.paymentMethod; + } + + for (const shippingRecord of order.shipping) { + shippingAddress = shippingRecord.address; + carrier = shippingRecord.shipmentMethod.carrier; + tracking = shippingRecord.tracking; + } + // TODO: Update */refunds/list for marketplace const refundResult = Meteor.call("orders/refunds/list", order); const refundTotal = Array.isArray(refundResult) && refundResult.reduce((acc, refund) => acc + refund.amount, 0); // Get user currency formatting from shops collection, remove saved rate - const userCurrencyFormatting = _.omit(shop.currencies[billing.currency.userCurrency], ["enabled", "rate"]); + // using billing[0] here to get the currency and exchange rate used because + // in multishop mode, the currency object is different across shops + // and it's inconsistent, i.e. sometimes there's no exchangeRate field in the secondary + // shop's currency array. + // TODO: Remove billing[0] and properly aquire userCurrency and exchange rate + const userCurrencyFormatting = _.omit(shop.currencies[order.billing[0].currency.userCurrency], ["enabled", "rate"]); // Get user currency exchange rate at time of transaction - const userCurrencyExchangeRate = billing.currency.exchangeRate; + const userCurrencyExchangeRate = order.billing[0].currency.exchangeRate; // Combine same products into single "product" for display purposes const combinedItems = []; @@ -673,45 +703,45 @@ export const methods = { order: order, billing: { address: { - address: billing.address.address1, - city: billing.address.city, - region: billing.address.region, - postal: billing.address.postal + address: address.address1, + city: address.city, + region: address.region, + postal: address.postal }, - paymentMethod: billing.paymentMethod.storedCard || billing.paymentMethod.processor, + paymentMethod: paymentMethod.storedCard || paymentMethod.processor, subtotal: accounting.formatMoney( - billing.invoice.subtotal * userCurrencyExchangeRate, userCurrencyFormatting + subtotal * userCurrencyExchangeRate, userCurrencyFormatting ), shipping: accounting.formatMoney( - billing.invoice.shipping * userCurrencyExchangeRate, userCurrencyFormatting + shippingCost * userCurrencyExchangeRate, userCurrencyFormatting ), taxes: accounting.formatMoney( - billing.invoice.taxes * userCurrencyExchangeRate, userCurrencyFormatting + taxes * userCurrencyExchangeRate, userCurrencyFormatting ), discounts: accounting.formatMoney( - billing.invoice.discounts * userCurrencyExchangeRate, userCurrencyFormatting + discounts * userCurrencyExchangeRate, userCurrencyFormatting ), refunds: accounting.formatMoney( refundTotal * userCurrencyExchangeRate, userCurrencyFormatting ), total: accounting.formatMoney( - billing.invoice.total * userCurrencyExchangeRate, userCurrencyFormatting + total * userCurrencyExchangeRate, userCurrencyFormatting ), adjustedTotal: accounting.formatMoney( - (billing.paymentMethod.amount - refundTotal) * userCurrencyExchangeRate, userCurrencyFormatting + (amount - refundTotal) * userCurrencyExchangeRate, userCurrencyFormatting ) }, combinedItems: combinedItems, orderDate: moment(order.createdAt).format("MM/DD/YYYY"), orderUrl: getSlug(shop.name) + "/cart/completed?_id=" + order.cartId, shipping: { - tracking: shippingRecord.tracking, - carrier: shippingRecord.shipmentMethod.carrier, + tracking: tracking, + carrier: carrier, address: { - address: shippingRecord.address.address1, - city: shippingRecord.address.city, - region: shippingRecord.address.region, - postal: shippingRecord.address.postal + address: shippingAddress.address1, + city: shippingAddress.city, + region: shippingAddress.region, + postal: shippingAddress.postal } } }; From 588866bca40e9599d07bddc1ce0af4be0398709f Mon Sep 17 00:00:00 2001 From: Njeri Kieha Date: Tue, 10 Oct 2017 04:13:07 +0300 Subject: [PATCH 3/6] Correctly sum up total with correct shipping --- server/methods/core/orders.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index 19b991a2dcd..f380ef33bf4 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -579,7 +579,6 @@ export const methods = { let shippingCost = 0; let taxes = 0; let discounts = 0; - let total = 0; let amount = 0; let address = {}; let paymentMethod = {}; @@ -588,10 +587,8 @@ export const methods = { let carrier = ""; for (const billingRecord of order.billing) { subtotal += billingRecord.invoice.subtotal; - shippingCost += billingRecord.invoice.shipping; taxes += billingRecord.invoice.taxes; discounts += billingRecord.invoice.discounts; - total += billingRecord.invoice.total; amount += billingRecord.paymentMethod.amount; address = billingRecord.address; paymentMethod = billingRecord.paymentMethod; @@ -601,6 +598,7 @@ export const methods = { shippingAddress = shippingRecord.address; carrier = shippingRecord.shipmentMethod.carrier; tracking = shippingRecord.tracking; + shippingCost += shippingRecord.shipmentMethod.rate; } // TODO: Update */refunds/list for marketplace @@ -725,7 +723,7 @@ export const methods = { refundTotal * userCurrencyExchangeRate, userCurrencyFormatting ), total: accounting.formatMoney( - total * userCurrencyExchangeRate, userCurrencyFormatting + (subtotal + shippingCost) * userCurrencyExchangeRate, userCurrencyFormatting ), adjustedTotal: accounting.formatMoney( (amount - refundTotal) * userCurrencyExchangeRate, userCurrencyFormatting From 6bc06c6dec9b59b93964bd5fc6412b07acb6fd5a Mon Sep 17 00:00:00 2001 From: Brent Hoover Date: Tue, 10 Oct 2017 09:46:14 +0800 Subject: [PATCH 4/6] Remove slug from order email --- server/methods/core/orders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index f380ef33bf4..59260300be2 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -731,7 +731,7 @@ export const methods = { }, combinedItems: combinedItems, orderDate: moment(order.createdAt).format("MM/DD/YYYY"), - orderUrl: getSlug(shop.name) + "/cart/completed?_id=" + order.cartId, + orderUrl: `/cart/completed?_id=${order.cartId}`, shipping: { tracking: tracking, carrier: carrier, From 887a763be79707d3eb6331d073c58824bf6c27b5 Mon Sep 17 00:00:00 2001 From: Brent Hoover Date: Tue, 10 Oct 2017 09:58:06 +0800 Subject: [PATCH 5/6] Lint fixes --- .../plugins/core/accounts/client/templates/profile/profile.js | 2 +- .../included/ui-search/lib/containers/searchSubscription.js | 1 - server/methods/core/orders.js | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/imports/plugins/core/accounts/client/templates/profile/profile.js b/imports/plugins/core/accounts/client/templates/profile/profile.js index 1915593de8e..b16d74a0436 100644 --- a/imports/plugins/core/accounts/client/templates/profile/profile.js +++ b/imports/plugins/core/accounts/client/templates/profile/profile.js @@ -61,7 +61,7 @@ Template.accountProfile.helpers({ doesUserExist() { const targetUserId = Reaction.Router.getQueryParam("userId"); if (!targetUserId) { - // If userId isn't in this route's query parameters, then a user + // If userId isn't in this route's query parameters, then a user // is viewing his/her own profile. return true; } diff --git a/imports/plugins/included/ui-search/lib/containers/searchSubscription.js b/imports/plugins/included/ui-search/lib/containers/searchSubscription.js index d5307ef23e2..c03b95f3595 100644 --- a/imports/plugins/included/ui-search/lib/containers/searchSubscription.js +++ b/imports/plugins/included/ui-search/lib/containers/searchSubscription.js @@ -1,5 +1,4 @@ import React, { Component } from "react"; -import _ from "lodash"; import { Meteor } from "meteor/meteor"; import * as Collections from "/lib/collections"; import { Components, composeWithTracker } from "@reactioncommerce/reaction-components"; diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index 59260300be2..0c787eee558 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -6,7 +6,6 @@ import Future from "fibers/future"; import { Meteor } from "meteor/meteor"; import { check, Match } from "meteor/check"; import { SSR } from "meteor/meteorhacks:ssr"; -import { getSlug } from "/lib/api"; import { Media, Orders, Products, Shops, Packages } from "/lib/collections"; import { Logger, Hooks, Reaction } from "/server/api"; From 9e3351499a78e1e4a58f0249d4f260dbba482308 Mon Sep 17 00:00:00 2001 From: Brent Hoover Date: Tue, 10 Oct 2017 10:47:31 +0800 Subject: [PATCH 6/6] Remove slash from order URL --- server/methods/core/orders.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/methods/core/orders.js b/server/methods/core/orders.js index 0c787eee558..88d7e645a40 100644 --- a/server/methods/core/orders.js +++ b/server/methods/core/orders.js @@ -563,7 +563,7 @@ export const methods = { // Get Shop information const shop = Shops.findOne(order.shopId); - + // TODO need to make this fully support multi-shop. Now it's just collapsing into one // Get shop logo, if available let emailLogo; if (Array.isArray(shop.brandAssets)) { @@ -600,7 +600,6 @@ export const methods = { shippingCost += shippingRecord.shipmentMethod.rate; } - // TODO: Update */refunds/list for marketplace const refundResult = Meteor.call("orders/refunds/list", order); const refundTotal = Array.isArray(refundResult) && refundResult.reduce((acc, refund) => acc + refund.amount, 0); @@ -730,7 +729,7 @@ export const methods = { }, combinedItems: combinedItems, orderDate: moment(order.createdAt).format("MM/DD/YYYY"), - orderUrl: `/cart/completed?_id=${order.cartId}`, + orderUrl: `cart/completed?_id=${order.cartId}`, shipping: { tracking: tracking, carrier: carrier,