@inflightit/api-plugin-orders
Version:
Orders plugin for the Reaction API
82 lines (74 loc) • 2.68 kB
JavaScript
import Random from "@reactioncommerce/random";
import buildOrderItem from "./buildOrderItem.js";
import updateGroupTotals from "./updateGroupTotals.js";
/**
* @summary Builds an order fulfillment group from fulfillment group input.
* @param {Object} context an object containing the per-request state
* @param {String} [accountId] ID of account placing the order
* @param {Object[]} [additionalItems] Additional already-created order items to push into the group
* items array before calculating shipping, tax, surcharges, and totals.
* @param {Object} [billingAddress] The primary billing address for the order, if known
* @param {String|null} [cartId] ID of the cart from which the order is being placed, if applicable
* @param {String} currencyCode Currency code for all money values
* @param {Number} discountTotal Calculated discount total
* @param {Object} inputGroup Order fulfillment group input. See schema.
* @param {String} orderId ID of existing or new order to which this group will belong
* @param {Object} cart - the cart this order is being created from
* @returns {Promise<Object>} The fulfillment group
*/
export default async function buildOrderFulfillmentGroupFromInput(context, {
accountId,
additionalItems,
billingAddress,
cartId,
currencyCode,
discountTotal,
inputGroup,
orderId,
cart
}) {
const { data, items, selectedFulfillmentMethodId, shopId, totalPrice: expectedGroupTotal, type } = inputGroup;
const group = {
_id: Random.id(),
address: data ? data.shippingAddress : null,
shopId,
type,
workflow: { status: "new", workflow: ["new"] }
};
// Build the final order item objects. As part of this, we look up the variant in the system and make sure that
// the price is what the caller expects it to be.
if (items) {
group.items = await Promise.all(items.map((inputItem) => buildOrderItem(context, { currencyCode, inputItem, cart })));
} else {
group.items = [];
}
if (Array.isArray(additionalItems) && additionalItems.length) {
group.items.push(...additionalItems);
}
// Add some more properties for convenience
group.itemIds = group.items.map((item) => item._id);
group.totalItemQuantity = group.items.reduce((sum, item) => sum + item.quantity, 0);
const {
groupSurcharges,
groupSurchargeTotal,
taxableAmount,
taxTotal
} = await updateGroupTotals(context, {
accountId,
billingAddress,
cartId,
currencyCode,
discountTotal,
expectedGroupTotal,
group,
orderId,
selectedFulfillmentMethodId
});
return {
group,
groupSurcharges,
groupSurchargeTotal,
taxableAmount,
taxTotal
};
}