@darkpos/pricing 1.0.5 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +8 -10
- package/__TEST__/item.test.js +137 -99
- package/__TEST__/modifier/calculate.test.js +73 -0
- package/__TEST__/modifier/getAvailablePromotionsOrSubscriptions.test.js +81 -0
- package/__TEST__/modifier/getMatchTagsModifiers.test.js +109 -0
- package/__TEST__/modifier/getModifierIndex.test.js +40 -0
- package/__TEST__/modifier/getRecommendedModifiers.test.js +17 -0
- package/__TEST__/modifier/hasAllTags.test.js +25 -0
- package/__TEST__/modifier/hasAttribute.test.js +47 -0
- package/__TEST__/modifier/hasMatchTags.test.js +56 -0
- package/__TEST__/modifier/hasNoTags.test.js +21 -0
- package/__TEST__/modifier/mocks/toggleModifier_no1.json +13440 -0
- package/__TEST__/modifier/mocks/toggleModifier_no2.json +13438 -0
- package/__TEST__/modifier/mocks/toggleModifier_no3.json +13598 -0
- package/__TEST__/modifier/sort.test.js +41 -0
- package/__TEST__/order.test.js +50 -37
- package/index.js +1 -25
- package/lib/constants/Modifier/Attributes.js +9 -0
- package/lib/constants/Modifier/Compute.js +15 -0
- package/lib/constants/Modifier/Types.js +7 -0
- package/lib/constants/Modifier/index.js +9 -0
- package/lib/constants/Status.js +39 -0
- package/lib/constants/index.js +7 -0
- package/lib/constants/status.js +39 -0
- package/lib/index.js +38 -0
- package/lib/item/addIndirectModifier.js +34 -17
- package/lib/item/calculate.js +41 -19
- package/lib/item/create.js +35 -0
- package/lib/item/filterByDirectModifiers.js +5 -6
- package/lib/item/findOriginalItem.js +8 -0
- package/lib/item/getBalanceToPay.js +12 -0
- package/lib/item/getDepartmentModifiers.js +5 -0
- package/lib/item/getDiscountModifiers.js +7 -0
- package/lib/item/getItemModifiers.js +16 -0
- package/lib/item/getItemModifiersDescription.js +22 -0
- package/lib/item/getItemPrice.js +57 -0
- package/lib/item/getItemsTotalPaid.js +9 -0
- package/lib/item/getItemsTotalPieces.js +7 -0
- package/lib/item/getNotIncludedModifiers.js +11 -0
- package/lib/item/getParentItem.js +5 -0
- package/lib/item/getPendingIndex.js +5 -0
- package/lib/item/getTotal.js +8 -0
- package/lib/item/getTotalPieces.js +7 -0
- package/lib/item/getTotals.js +25 -0
- package/lib/item/hasCreateSubscription.js +7 -0
- package/lib/item/hasModifier.js +15 -0
- package/lib/item/hasModifierWithValue.js +11 -0
- package/lib/item/hasModifiers.js +9 -0
- package/lib/item/hasSubscription.js +5 -0
- package/lib/item/index.js +80 -10
- package/lib/item/isParentIncluded.js +4 -0
- package/lib/item/isRelatedItem.js +4 -0
- package/lib/item/isSelected.js +13 -0
- package/lib/item/openRecommendationDialog.js +4 -0
- package/lib/item/removeModifier.js +84 -0
- package/lib/item/removeModifierById.js +8 -0
- package/lib/item/removeModifiers.js +14 -0
- package/lib/modifier/addFile.js +19 -0
- package/lib/modifier/addImage.js +18 -0
- package/lib/modifier/calculate.js +43 -0
- package/lib/modifier/contains.js +5 -0
- package/lib/modifier/convertMenuModifiers.js +5 -0
- package/lib/modifier/create.js +44 -0
- package/lib/modifier/createAmountOverrideModifier.js +20 -0
- package/lib/modifier/createCreditModifier.js +32 -0
- package/lib/modifier/createDiscountModifier.js +25 -0
- package/lib/modifier/createGroupValuesModifier.js +29 -0
- package/lib/modifier/createIndirectModifier.js +42 -0
- package/lib/modifier/createSubscriptionModifier.js +19 -0
- package/lib/modifier/displayAsCard.js +9 -0
- package/lib/modifier/displayAsChips.js +9 -0
- package/lib/modifier/displayAsList.js +9 -0
- package/lib/modifier/duplicate.js +12 -0
- package/lib/modifier/enableAutoPopup.js +9 -0
- package/lib/modifier/filterByRequiredModifiers.js +4 -0
- package/lib/modifier/findById.js +7 -0
- package/lib/modifier/findByPaymentMethod.js +10 -0
- package/lib/modifier/findByPaymentType.js +10 -0
- package/lib/modifier/getAvailablePromotions.js +5 -0
- package/lib/modifier/getAvailablePromotionsOrSubscriptions.js +15 -0
- package/lib/modifier/getAvailableSubscriptions.js +5 -0
- package/lib/modifier/getByAttribute.js +6 -0
- package/lib/modifier/getCreditModifier.js +6 -0
- package/lib/modifier/getDefaultModifiers.js +4 -0
- package/lib/modifier/getDepartmentMaxItems.js +10 -0
- package/lib/modifier/getDepartmentModifiers.js +11 -0
- package/lib/modifier/getDescription.js +6 -0
- package/lib/modifier/getDescriptions.js +9 -0
- package/lib/modifier/getDirectModifiers.js +5 -0
- package/lib/modifier/getDiscountModifiers.js +7 -0
- package/lib/modifier/getEntityModifiers.js +11 -0
- package/lib/modifier/getEntityPromotions.js +11 -0
- package/lib/modifier/getExtendedTags.js +14 -0
- package/lib/modifier/getFiles.js +5 -0
- package/lib/modifier/getGroupModifiers.js +9 -0
- package/lib/modifier/getGroupOfItemsModifiers.js +4 -0
- package/lib/modifier/getGroupRelatedModifiers.js +26 -0
- package/lib/modifier/getImages.js +5 -0
- package/lib/modifier/getInheritedModifiers.js +30 -0
- package/lib/modifier/getItemModifiers.js +39 -0
- package/lib/modifier/getLaundryModifiers.js +9 -0
- package/lib/modifier/getMatchTagsModifiers.js +9 -0
- package/lib/modifier/getModifierIndex.js +14 -0
- package/lib/modifier/getPreferences.js +24 -0
- package/lib/modifier/getPromotionModifiers.js +5 -0
- package/lib/modifier/getPromptMessage.js +6 -0
- package/lib/modifier/getProperty.js +11 -0
- package/lib/modifier/getRecommendedModifiers.js +7 -0
- package/lib/modifier/getRelatedModifiers.js +10 -0
- package/lib/modifier/getRequiredModifiers.js +4 -0
- package/lib/modifier/getSelectedValues.js +7 -0
- package/lib/modifier/getService.js +5 -0
- package/lib/modifier/getSplittedModifiers.js +30 -0
- package/lib/modifier/getStarchModifier.js +9 -0
- package/lib/modifier/getSubscriptionItem.js +12 -0
- package/lib/modifier/getSubscriptionModifiers.js +5 -0
- package/lib/modifier/getSuggestion.js +9 -0
- package/lib/modifier/getUnhiddenModifiers.js +9 -0
- package/lib/modifier/getUsingCount.js +11 -0
- package/lib/modifier/hasAddModifiers.js +5 -0
- package/lib/modifier/hasAllTag.js +12 -0
- package/lib/modifier/hasAttribute.js +8 -0
- package/lib/modifier/hasAttributes.js +19 -0
- package/lib/modifier/hasCreateSubscription.js +10 -0
- package/lib/modifier/hasDisplayPrompt.js +9 -0
- package/lib/modifier/hasMatchTags.js +27 -0
- package/lib/modifier/hasModifier.js +12 -0
- package/lib/modifier/hasNoTags.js +9 -0
- package/lib/modifier/hasRelatedItems.js +8 -0
- package/lib/modifier/includePiecesInQuantity.js +10 -0
- package/lib/modifier/includesInGroup.js +9 -0
- package/lib/modifier/index.js +242 -0
- package/lib/modifier/isAmountOverride.js +7 -0
- package/lib/modifier/isAvailablePromotion.js +23 -0
- package/lib/modifier/isAvailableSubscription.js +28 -0
- package/lib/modifier/isCompact.js +12 -0
- package/lib/modifier/isCredit.js +6 -0
- package/lib/modifier/isCustomerTagsExtend.js +9 -0
- package/lib/modifier/isDefault.js +4 -0
- package/lib/modifier/isDepartment.js +6 -0
- package/lib/modifier/isDirect.js +6 -0
- package/lib/modifier/isDiscount.js +6 -0
- package/lib/modifier/isEditable.js +10 -0
- package/lib/modifier/isGratuity.js +6 -0
- package/lib/modifier/isGroupOfItems.js +12 -0
- package/lib/modifier/isGroupOfModifiers.js +12 -0
- package/lib/modifier/isGroupOfValues.js +13 -0
- package/lib/modifier/isHidden.js +4 -0
- package/lib/modifier/isIncluded.js +4 -0
- package/lib/modifier/isManual.js +9 -0
- package/lib/modifier/isMultiplier.js +11 -0
- package/lib/modifier/isOverride.js +6 -0
- package/lib/modifier/isPaymentMethods.js +8 -0
- package/lib/modifier/isPaymentTypes.js +8 -0
- package/lib/modifier/isPreferences.js +8 -0
- package/lib/modifier/isPriceOverride.js +7 -0
- package/lib/modifier/isPromotion.js +6 -0
- package/lib/modifier/isQuantityOverride.js +7 -0
- package/lib/modifier/isRemoveModifier.js +4 -0
- package/lib/modifier/isRequired.js +4 -0
- package/lib/modifier/isRequiredAndOverride.js +4 -0
- package/lib/modifier/isService.js +9 -0
- package/lib/modifier/isSingleValue.js +9 -0
- package/lib/modifier/isSubscription.js +6 -0
- package/lib/modifier/isTrackUsageSubscription.js +5 -0
- package/lib/modifier/isValueSelected.js +7 -0
- package/lib/modifier/purifyModifiers.js +15 -0
- package/lib/modifier/sort.js +35 -0
- package/lib/order/addCreditModifier.js +27 -0
- package/lib/order/addDiscountModifier.js +9 -0
- package/lib/order/addItem.js +292 -0
- package/lib/order/addItemModifier.js +214 -0
- package/lib/order/addModifier.js +9 -0
- package/lib/order/addModifierToAllItems.js +16 -0
- package/lib/order/addNote.js +25 -0
- package/lib/order/addTable.js +11 -0
- package/lib/order/calculate.js +51 -16
- package/lib/order/calculateDue.js +15 -0
- package/lib/order/calculateOrdersDue.js +26 -0
- package/lib/order/canSplit.js +4 -0
- package/lib/order/changeEndDate.js +15 -0
- package/lib/order/changeLocation.js +20 -0
- package/lib/order/changeStartDate.js +14 -0
- package/lib/order/combineSubOrders.js +14 -0
- package/lib/order/containsSerial.js +5 -0
- package/lib/order/create.js +67 -0
- package/lib/order/createParent.js +9 -0
- package/lib/order/duplicateItem.js +16 -0
- package/lib/order/findItemIndex.js +6 -0
- package/lib/order/getAppliedCredit.js +5 -0
- package/lib/order/getBalance.js +9 -0
- package/lib/order/getCustomer.js +4 -0
- package/lib/order/getCustomerStoreCredit.js +14 -0
- package/lib/order/getCustomerSubscriptions.js +8 -0
- package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
- package/lib/order/getDepartmentModifiers.js +9 -0
- package/lib/order/getEndDate.js +4 -0
- package/lib/order/getItemByItemId.js +6 -0
- package/lib/order/getItemIndex.js +9 -0
- package/lib/order/getItemsToPay.js +17 -0
- package/lib/order/getMenuItemsByCustomer.js +19 -0
- package/lib/order/getNumberOfItems.js +10 -0
- package/lib/order/getOrdersPieces.js +10 -0
- package/lib/order/getPendingItemIndex.js +5 -0
- package/lib/order/getRelatedItems.js +11 -0
- package/lib/order/getSameItems.js +19 -0
- package/lib/order/getScheduleByCustomer.js +20 -0
- package/lib/order/getScreenCustomerNotes.js +12 -0
- package/lib/order/getSelectedItem.js +6 -0
- package/lib/order/getStartDate.js +4 -0
- package/lib/order/getTip.js +10 -0
- package/lib/order/getTotalPieces.js +17 -0
- package/lib/order/getTotals.js +28 -0
- package/lib/order/hasAggregate.js +20 -0
- package/lib/order/hasItem.js +7 -0
- package/lib/order/hasRemainingSubscription.js +67 -0
- package/lib/order/hold.js +12 -0
- package/lib/order/index.js +163 -5
- package/lib/order/isDetailed.js +4 -0
- package/lib/order/isHold.js +4 -0
- package/lib/order/isNew.js +4 -0
- package/lib/order/isOpen.js +4 -0
- package/lib/order/isParent.js +7 -0
- package/lib/order/merge.js +96 -0
- package/lib/order/open.js +11 -0
- package/lib/order/pickEndDate.js +70 -0
- package/lib/order/removeApplyModifier.js +24 -0
- package/lib/order/removeDiscountModifier.js +16 -0
- package/lib/order/removeItem.js +55 -0
- package/lib/order/removeItemByIndex.js +5 -0
- package/lib/order/removeItemModifier.js +69 -0
- package/lib/order/removeModifier.js +21 -0
- package/lib/order/removeModifierByAttribute.js +23 -0
- package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
- package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
- package/lib/order/setCustomer.js +50 -0
- package/lib/order/splitByDepartments.js +151 -0
- package/lib/order/toggleModifier.js +9 -0
- package/lib/order/updateItem.js +8 -0
- package/lib/order/updateItemQuantity.js +35 -0
- package/lib/order/void.js +11 -0
- package/package.json +15 -18
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function getItemIndex({ order, item }) {
|
|
3
|
+
if (!order || !order.items || !item) return -1;
|
|
4
|
+
return order.items.findIndex(each => {
|
|
5
|
+
if (!item.itemId && each.isPending) return item._id === each._id;
|
|
6
|
+
|
|
7
|
+
return each._id === item._id && each.itemId === item.itemId;
|
|
8
|
+
});
|
|
9
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function getItemsToPay({ orders, orderItemsToPay }) {
|
|
3
|
+
return (
|
|
4
|
+
(Array.isArray(orders) &&
|
|
5
|
+
orderItemsToPay &&
|
|
6
|
+
Object.keys(orderItemsToPay).reduce((acc, orderId) => {
|
|
7
|
+
const orderItemsIds = orderItemsToPay[orderId];
|
|
8
|
+
const order = orders.find(each => each._id === orderId);
|
|
9
|
+
if (!order || !orderItemsIds) return acc;
|
|
10
|
+
const items = order.items.filter(each =>
|
|
11
|
+
orderItemsIds.includes(each._id)
|
|
12
|
+
);
|
|
13
|
+
return acc.concat(items);
|
|
14
|
+
}, [])) ||
|
|
15
|
+
[]
|
|
16
|
+
);
|
|
17
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module.exports = ({ modifierActions }) =>
|
|
2
|
+
function getMenuItemByCustomer({ order, menuItems }) {
|
|
3
|
+
const { customer } = order || {};
|
|
4
|
+
if (!customer) return [];
|
|
5
|
+
|
|
6
|
+
return menuItems.filter(menuItem => {
|
|
7
|
+
const { item = {} } = menuItem;
|
|
8
|
+
const { priceLevels = [] } = item;
|
|
9
|
+
if (
|
|
10
|
+
!priceLevels.length &&
|
|
11
|
+
(modifierActions.hasAllTag(customer) ||
|
|
12
|
+
modifierActions.hasNoTags(customer))
|
|
13
|
+
)
|
|
14
|
+
return true;
|
|
15
|
+
return priceLevels.some(priceLevel =>
|
|
16
|
+
modifierActions.hasMatchTags(customer, priceLevel)
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module.exports = ({ _ }) =>
|
|
2
|
+
function getNumberOfItems(orders) {
|
|
3
|
+
if (!orders || !Array.isArray(orders)) return 0;
|
|
4
|
+
const sum = orders.reduce((acc, order) => {
|
|
5
|
+
const items = _.get(order, 'items', []);
|
|
6
|
+
return acc + items.lenght;
|
|
7
|
+
}, 0);
|
|
8
|
+
|
|
9
|
+
return sum;
|
|
10
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module.exports = ({ actions, utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function getOrdersPieces(orders) {
|
|
4
|
+
if (!Array.isArray(orders)) return 0;
|
|
5
|
+
return orders.reduce(
|
|
6
|
+
(acc, order) => math.add(acc, actions.getTotalPieces({ order })),
|
|
7
|
+
0
|
|
8
|
+
);
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function getRelatedItems({ order, item, compareId = true }) {
|
|
3
|
+
if (!order || !order.items || !item) return [];
|
|
4
|
+
return order.items
|
|
5
|
+
.filter(each => each.properties && each.properties.relatedItem)
|
|
6
|
+
.filter(
|
|
7
|
+
each =>
|
|
8
|
+
each.properties.parentItemId === item.itemId &&
|
|
9
|
+
(compareId ? each.properties.parentId === item._id : true)
|
|
10
|
+
);
|
|
11
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function getSameItems({ order, item }) {
|
|
3
|
+
const { items = [] } = order;
|
|
4
|
+
return items.filter(each => {
|
|
5
|
+
let check =
|
|
6
|
+
each.itemId &&
|
|
7
|
+
item._id &&
|
|
8
|
+
each.itemId === item._id &&
|
|
9
|
+
!each.serial &&
|
|
10
|
+
!item.serial;
|
|
11
|
+
if (check && each.menuId && item.menuId) {
|
|
12
|
+
check =
|
|
13
|
+
each.menuId === item.menuId &&
|
|
14
|
+
each.path.toString() === item.path.toString();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return check;
|
|
18
|
+
});
|
|
19
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = ({ _, settings }) => {
|
|
2
|
+
const orderSettings = _.get(settings, 'order');
|
|
3
|
+
|
|
4
|
+
return function getScheduleByCustomer(customer = {}) {
|
|
5
|
+
const { tags } = customer;
|
|
6
|
+
const { default: defaultSchedule, ...schedules } =
|
|
7
|
+
orderSettings.endDate || {};
|
|
8
|
+
if (!tags || !tags.length) return defaultSchedule;
|
|
9
|
+
|
|
10
|
+
const scheduleTags = Object.keys(schedules);
|
|
11
|
+
if (!scheduleTags || !scheduleTags.length) return defaultSchedule;
|
|
12
|
+
|
|
13
|
+
const tag = tags
|
|
14
|
+
.filter(each => each !== 'default' && each !== 'all')
|
|
15
|
+
.find(each => scheduleTags.includes(each));
|
|
16
|
+
if (!tag) return defaultSchedule;
|
|
17
|
+
console.log('schedule for the tag', tag, schedules[tag]);
|
|
18
|
+
return schedules[tag];
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function getScreenCustomerNotes(customer) {
|
|
3
|
+
let theCustomer = customer;
|
|
4
|
+
if (!theCustomer) theCustomer = actions.getCustomer();
|
|
5
|
+
if (!theCustomer) return [];
|
|
6
|
+
const { notes = [] } = theCustomer;
|
|
7
|
+
const screenNotes = notes.filter(
|
|
8
|
+
each => each.message && each.attributes.includes('screen')
|
|
9
|
+
);
|
|
10
|
+
if (!screenNotes.length) return [];
|
|
11
|
+
return screenNotes.map(each => each.message);
|
|
12
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function getTip(order) {
|
|
4
|
+
if (!order || !Array.isArray(order.modifiers)) return 0;
|
|
5
|
+
|
|
6
|
+
return order.modifiers
|
|
7
|
+
.filter(each => modifierActions.isGratuity(each))
|
|
8
|
+
.reduce((total, modifier) => math.sum(total, modifier.number || 0), 0);
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module.exports = ({ itemActions, utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function getTotalPieces({ order, subOrders }) {
|
|
4
|
+
if (!order) return 0;
|
|
5
|
+
if (order.items && order.items.length)
|
|
6
|
+
return itemActions.getItemsTotalPieces(order.items);
|
|
7
|
+
if (order.isParent && subOrders && subOrders.length)
|
|
8
|
+
return subOrders.reduce(
|
|
9
|
+
(acc, each) =>
|
|
10
|
+
math.add(acc, itemActions.getItemsTotalPieces(each.items)),
|
|
11
|
+
0
|
|
12
|
+
);
|
|
13
|
+
if (order.properties && order.properties.pieceCount)
|
|
14
|
+
return order.properties.pieceCount;
|
|
15
|
+
return 0;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function getTotals(orders) {
|
|
4
|
+
if (!Array.isArray(orders)) return { total: 0, subTotals: {} };
|
|
5
|
+
return orders
|
|
6
|
+
.filter(each => !!each.parentId || !each.isParent)
|
|
7
|
+
.reduce(
|
|
8
|
+
(acc, order) => {
|
|
9
|
+
const subTotals = {};
|
|
10
|
+
const { subTotals: orderSubTotals } = order;
|
|
11
|
+
if (orderSubTotals) {
|
|
12
|
+
const keys = Object.keys(orderSubTotals);
|
|
13
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
14
|
+
for (const key of keys)
|
|
15
|
+
subTotals[key] = math.add(
|
|
16
|
+
acc.subTotals[key] || 0,
|
|
17
|
+
orderSubTotals[key]
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
total: math.add(acc.total, order.total),
|
|
22
|
+
subTotals,
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
{ total: 0, subTotals: {} }
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = ({ _, settings, actions, itemActions }) => {
|
|
2
|
+
const orderSettings = _.get(settings, 'order');
|
|
3
|
+
|
|
4
|
+
return function hasAggregate({ order, item }) {
|
|
5
|
+
if (!order || !item) return false;
|
|
6
|
+
if (!orderSettings.aggregateItems || itemActions.isRelatedItem(item))
|
|
7
|
+
return false;
|
|
8
|
+
|
|
9
|
+
// if it has a relatedItem, don't aggregate
|
|
10
|
+
const relatedItems = actions.getRelatedItems({
|
|
11
|
+
order,
|
|
12
|
+
item,
|
|
13
|
+
compareId: false,
|
|
14
|
+
});
|
|
15
|
+
if (relatedItems.length) return false;
|
|
16
|
+
|
|
17
|
+
const sameItems = actions.getSameItems({ item, order });
|
|
18
|
+
return !!sameItems.length;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions }) => {
|
|
2
|
+
const getRemaining = (subscriptions, orderId) => {
|
|
3
|
+
const remaining = subscriptions.reduce((total, subscription) => {
|
|
4
|
+
const {
|
|
5
|
+
numberOfUsesLimit = 0,
|
|
6
|
+
numberOfUses = 0,
|
|
7
|
+
history = {},
|
|
8
|
+
} = subscription;
|
|
9
|
+
const orderHistory = history[orderId] || 0;
|
|
10
|
+
return total + numberOfUsesLimit + orderHistory - numberOfUses;
|
|
11
|
+
}, 0);
|
|
12
|
+
|
|
13
|
+
return remaining;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const getNumberOfUses = (items = [], item = {}) => {
|
|
17
|
+
const siblings = items.filter(
|
|
18
|
+
each =>
|
|
19
|
+
each.serial === item.serial &&
|
|
20
|
+
each.itemId === item.itemId &&
|
|
21
|
+
each._id !== item._id
|
|
22
|
+
);
|
|
23
|
+
const modifiers = siblings.reduce(
|
|
24
|
+
(cur, each) => [
|
|
25
|
+
...cur,
|
|
26
|
+
...modifierActions.getSubscriptionModifiers(each.modifiers),
|
|
27
|
+
],
|
|
28
|
+
[]
|
|
29
|
+
);
|
|
30
|
+
const numberOfUses = modifiers.reduce(
|
|
31
|
+
(sum, each) =>
|
|
32
|
+
sum +
|
|
33
|
+
((each.properties &&
|
|
34
|
+
each.properties.subscription &&
|
|
35
|
+
each.properties.subscription.numberOfUses) ||
|
|
36
|
+
0),
|
|
37
|
+
0
|
|
38
|
+
);
|
|
39
|
+
return numberOfUses;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const getSubscriptions = subscriptions =>
|
|
43
|
+
subscriptions
|
|
44
|
+
.map(each => modifierActions.getSubscriptionItem(each))
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
|
|
47
|
+
return function hasRemainingSubscription({ order, item }) {
|
|
48
|
+
if (!order || !item || !item.itemId) return [false];
|
|
49
|
+
|
|
50
|
+
let subscriptions = actions.getCustomerSubscriptionsByItem({
|
|
51
|
+
customer: order.customer,
|
|
52
|
+
item,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (!subscriptions || !subscriptions.length) return [false];
|
|
56
|
+
|
|
57
|
+
subscriptions = getSubscriptions(subscriptions);
|
|
58
|
+
|
|
59
|
+
const isUnlimited = subscriptions.some(each => !each.numberOfUsesLimit);
|
|
60
|
+
if (isUnlimited) return [true];
|
|
61
|
+
|
|
62
|
+
const remaining = getRemaining(subscriptions, order.parentId || order._id);
|
|
63
|
+
const numberOfUses = getNumberOfUses(order.items, item);
|
|
64
|
+
|
|
65
|
+
return [remaining > numberOfUses, remaining, numberOfUses];
|
|
66
|
+
};
|
|
67
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = ({ constants }) =>
|
|
2
|
+
function holdOrder(order) {
|
|
3
|
+
if (!order) return order;
|
|
4
|
+
return {
|
|
5
|
+
...order,
|
|
6
|
+
status: {
|
|
7
|
+
...(order.status || {}),
|
|
8
|
+
order: constants.Status.Order.HOLD,
|
|
9
|
+
},
|
|
10
|
+
// properties: { kitchenOrder: Date.now() },
|
|
11
|
+
};
|
|
12
|
+
};
|
package/lib/order/index.js
CHANGED
|
@@ -1,8 +1,166 @@
|
|
|
1
|
-
|
|
1
|
+
//
|
|
2
|
+
const getTotalPieces = require('./getTotalPieces');
|
|
3
|
+
const getStartDate = require('./getStartDate');
|
|
4
|
+
const getBalance = require('./getBalance');
|
|
5
|
+
const getEndDate = require('./getEndDate');
|
|
6
|
+
const isNew = require('./isNew');
|
|
7
|
+
const getSelectedItem = require('./getSelectedItem');
|
|
8
|
+
const updateItem = require('./updateItem');
|
|
9
|
+
const removeItemByIndex = require('./removeItemByIndex');
|
|
10
|
+
const addItem = require('./addItem');
|
|
11
|
+
const duplicateItem = require('./duplicateItem');
|
|
12
|
+
const getCustomer = require('./getCustomer');
|
|
13
|
+
const setCustomer = require('./setCustomer');
|
|
14
|
+
const create = require('./create');
|
|
15
|
+
const updateItemQuantity = require('./updateItemQuantity');
|
|
16
|
+
const getMenuItemsByCustomer = require('./getMenuItemsByCustomer');
|
|
17
|
+
const getPendingItemIndex = require('./getPendingItemIndex');
|
|
18
|
+
const getScreenCustomerNotes = require('./getScreenCustomerNotes');
|
|
19
|
+
const removeItem = require('./removeItem');
|
|
20
|
+
const getSameItems = require('./getSameItems');
|
|
21
|
+
const hasAggregate = require('./hasAggregate');
|
|
22
|
+
const findItemIndex = require('./findItemIndex');
|
|
23
|
+
const changeLocation = require('./changeLocation');
|
|
24
|
+
const addNote = require('./addNote');
|
|
25
|
+
const addTable = require('./addTable');
|
|
26
|
+
const changeEndDate = require('./changeEndDate');
|
|
27
|
+
const changeStartDate = require('./changeStartDate');
|
|
28
|
+
const containsSerial = require('./containsSerial');
|
|
29
|
+
const combineSubOrders = require('./combineSubOrders');
|
|
30
|
+
const calculate = require('./calculate');
|
|
31
|
+
const isParent = require('./isParent');
|
|
32
|
+
const canSplit = require('./canSplit');
|
|
33
|
+
const removeModifier = require('./removeModifier');
|
|
34
|
+
const removeDiscountModifier = require('./removeDiscountModifier');
|
|
35
|
+
const addModifier = require('./addModifier');
|
|
36
|
+
const addDiscountModifier = require('./addDiscountModifier');
|
|
37
|
+
const calculateDue = require('./calculateDue');
|
|
38
|
+
const toggleModifier = require('./toggleModifier');
|
|
39
|
+
const voidOrder = require('./void');
|
|
40
|
+
const holdOrder = require('./hold');
|
|
41
|
+
const openOrder = require('./open');
|
|
42
|
+
const isDetailed = require('./isDetailed');
|
|
43
|
+
const splitByDepartments = require('./splitByDepartments');
|
|
44
|
+
const createParent = require('./createParent');
|
|
45
|
+
const getOrdersPieces = require('./getOrdersPieces');
|
|
46
|
+
const getTotals = require('./getTotals');
|
|
47
|
+
const getDepartmentModifiers = require('./getDepartmentModifiers');
|
|
48
|
+
const getCustomerStoreCredit = require('./getCustomerStoreCredit');
|
|
49
|
+
const getTip = require('./getTip');
|
|
50
|
+
const merge = require('./merge');
|
|
51
|
+
const calculateOrdersDue = require('./calculateOrdersDue');
|
|
52
|
+
const removeModifierByAttribute = require('./removeModifierByAttribute');
|
|
53
|
+
const removeApplyModifier = require('./removeApplyModifier');
|
|
54
|
+
const getCustomerSubscriptions = require('./getCustomerSubscriptions');
|
|
55
|
+
const getCustomerSubscriptionsByItem = require('./getCustomerSubscriptionsByItem');
|
|
56
|
+
const hasRemainingSubscription = require('./hasRemainingSubscription');
|
|
57
|
+
const removeModifiersWithPaymentMethods = require('./removeModifiersWithPaymentMethods');
|
|
58
|
+
const removeModifiersWithPaymentTypes = require('./removeModifiersWithPaymentTypes');
|
|
59
|
+
const getItemsToPay = require('./getItemsToPay');
|
|
60
|
+
const hasItem = require('./hasItem');
|
|
61
|
+
const getNumberOfItems = require('./getNumberOfItems');
|
|
62
|
+
const isOpen = require('./isOpen');
|
|
63
|
+
const isHold = require('./isHold');
|
|
64
|
+
const addItemModifier = require('./addItemModifier');
|
|
65
|
+
const removeItemModifier = require('./removeItemModifier');
|
|
66
|
+
const addModifierToAllItems = require('./addModifierToAllItems');
|
|
67
|
+
const getItemIndex = require('./getItemIndex');
|
|
68
|
+
const getRelatedItems = require('./getRelatedItems');
|
|
69
|
+
const getItemByItemId = require('./getItemByItemId');
|
|
70
|
+
const getScheduleByCustomer = require('./getScheduleByCustomer');
|
|
71
|
+
const pickEndDate = require('./pickEndDate');
|
|
72
|
+
const getAppliedCredit = require('./getAppliedCredit');
|
|
73
|
+
const addCreditModifier = require('./addCreditModifier');
|
|
2
74
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
75
|
+
const orderActions = (deps = {}) => {
|
|
76
|
+
const actions = {};
|
|
77
|
+
|
|
78
|
+
const innerDeps = {
|
|
79
|
+
...deps,
|
|
80
|
+
actions,
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const freezedActions = Object.freeze({
|
|
84
|
+
getItemByItemId: getItemByItemId(innerDeps),
|
|
85
|
+
getTotalPieces: getTotalPieces(innerDeps),
|
|
86
|
+
getStartDate: getStartDate(innerDeps),
|
|
87
|
+
getEndDate: getEndDate(innerDeps),
|
|
88
|
+
isNew: isNew(innerDeps),
|
|
89
|
+
getSelectedItem: getSelectedItem(innerDeps),
|
|
90
|
+
updateItem: updateItem(innerDeps),
|
|
91
|
+
removeItemByIndex: removeItemByIndex(innerDeps),
|
|
92
|
+
addItem: addItem(innerDeps),
|
|
93
|
+
duplicateItem: duplicateItem(innerDeps),
|
|
94
|
+
getCustomer: getCustomer(innerDeps),
|
|
95
|
+
setCustomer: setCustomer(innerDeps),
|
|
96
|
+
create: create(innerDeps),
|
|
97
|
+
updateItemQuantity: updateItemQuantity(innerDeps),
|
|
98
|
+
getMenuItemsByCustomer: getMenuItemsByCustomer(innerDeps),
|
|
99
|
+
getPendingItemIndex: getPendingItemIndex(innerDeps),
|
|
100
|
+
getScreenCustomerNotes: getScreenCustomerNotes(innerDeps),
|
|
101
|
+
removeItem: removeItem(innerDeps),
|
|
102
|
+
getSameItems: getSameItems(innerDeps),
|
|
103
|
+
hasAggregate: hasAggregate(innerDeps),
|
|
104
|
+
findItemIndex: findItemIndex(innerDeps),
|
|
105
|
+
changeLocation: changeLocation(innerDeps),
|
|
106
|
+
addNote: addNote(innerDeps),
|
|
107
|
+
addTable: addTable(innerDeps),
|
|
108
|
+
changeEndDate: changeEndDate(innerDeps),
|
|
109
|
+
changeStartDate: changeStartDate(innerDeps),
|
|
110
|
+
containsSerial: containsSerial(innerDeps),
|
|
111
|
+
combineSubOrders: combineSubOrders(innerDeps),
|
|
112
|
+
calculate: calculate(innerDeps),
|
|
113
|
+
isParent: isParent(innerDeps),
|
|
114
|
+
canSplit: canSplit(innerDeps),
|
|
115
|
+
removeModifier: removeModifier(innerDeps),
|
|
116
|
+
removeDiscountModifier: removeDiscountModifier(innerDeps),
|
|
117
|
+
addModifier: addModifier(innerDeps),
|
|
118
|
+
addDiscountModifier: addDiscountModifier(innerDeps),
|
|
119
|
+
calculateDue: calculateDue(innerDeps),
|
|
120
|
+
toggleModifier: toggleModifier(innerDeps),
|
|
121
|
+
voidOrder: voidOrder(innerDeps),
|
|
122
|
+
holdOrder: holdOrder(innerDeps),
|
|
123
|
+
openOrder: openOrder(innerDeps),
|
|
124
|
+
isDetailed: isDetailed(innerDeps),
|
|
125
|
+
splitByDepartments: splitByDepartments(innerDeps),
|
|
126
|
+
createParent: createParent(innerDeps),
|
|
127
|
+
getOrdersPieces: getOrdersPieces(innerDeps),
|
|
128
|
+
getTotals: getTotals(innerDeps),
|
|
129
|
+
getBalance: getBalance(innerDeps),
|
|
130
|
+
getDepartmentModifiers: getDepartmentModifiers(innerDeps),
|
|
131
|
+
getCustomerStoreCredit: getCustomerStoreCredit(innerDeps),
|
|
132
|
+
getTip: getTip(innerDeps),
|
|
133
|
+
merge: merge(innerDeps),
|
|
134
|
+
calculateOrdersDue: calculateOrdersDue(innerDeps),
|
|
135
|
+
removeModifierByAttribute: removeModifierByAttribute(innerDeps),
|
|
136
|
+
removeApplyModifier: removeApplyModifier(innerDeps),
|
|
137
|
+
getCustomerSubscriptions: getCustomerSubscriptions(innerDeps),
|
|
138
|
+
getCustomerSubscriptionsByItem: getCustomerSubscriptionsByItem(innerDeps),
|
|
139
|
+
hasRemainingSubscription: hasRemainingSubscription(innerDeps),
|
|
140
|
+
removeModifiersWithPaymentMethods:
|
|
141
|
+
removeModifiersWithPaymentMethods(innerDeps),
|
|
142
|
+
removeModifiersWithPaymentTypes: removeModifiersWithPaymentTypes(innerDeps),
|
|
143
|
+
hasItem: hasItem(innerDeps),
|
|
144
|
+
getNumberOfItems: getNumberOfItems(innerDeps),
|
|
145
|
+
isOpen: isOpen(innerDeps),
|
|
146
|
+
isHold: isHold(innerDeps),
|
|
147
|
+
getItemsToPay: getItemsToPay(innerDeps),
|
|
148
|
+
addItemModifier: addItemModifier(innerDeps),
|
|
149
|
+
removeItemModifier: removeItemModifier(innerDeps),
|
|
150
|
+
addModifierToAllItems: addModifierToAllItems(innerDeps),
|
|
151
|
+
getItemIndex: getItemIndex(innerDeps),
|
|
152
|
+
getRelatedItems: getRelatedItems(innerDeps),
|
|
153
|
+
getScheduleByCustomer: getScheduleByCustomer(innerDeps),
|
|
154
|
+
pickEndDate: pickEndDate(innerDeps),
|
|
155
|
+
getAppliedCredit: getAppliedCredit(innerDeps),
|
|
156
|
+
addCreditModifier: addCreditModifier(innerDeps),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
Object.keys(freezedActions).forEach(actionName => {
|
|
160
|
+
actions[actionName] = freezedActions[actionName];
|
|
7
161
|
});
|
|
162
|
+
|
|
163
|
+
return freezedActions;
|
|
8
164
|
};
|
|
165
|
+
|
|
166
|
+
module.exports = orderActions;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module.exports = ({ _, actions, utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
|
|
4
|
+
const isAggregatableItems = (first, second) => {
|
|
5
|
+
if (
|
|
6
|
+
first.itemId !== second.itemId ||
|
|
7
|
+
first.price !== second.price ||
|
|
8
|
+
first.description !== second.description ||
|
|
9
|
+
(first.modifiers && !second.modifiers) ||
|
|
10
|
+
(!first.modifiers && second.modifiers) ||
|
|
11
|
+
first.modifiers.length !== second.modifiers.length
|
|
12
|
+
) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
let hasInvalidModifier = false;
|
|
16
|
+
first.modifiers.forEach(modifier => {
|
|
17
|
+
if (!second.modifiers.find(mod => mod._id === modifier._id)) {
|
|
18
|
+
hasInvalidModifier = true;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return !hasInvalidModifier;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// return: [Order, Order, Array<Order>]
|
|
26
|
+
return function merge({ orders, subOrdersToMerge, aggregateItems, user }) {
|
|
27
|
+
const items = orders.reduce((res, order) => res.concat(order.items), []);
|
|
28
|
+
let newOrder = null;
|
|
29
|
+
// Unique Orders
|
|
30
|
+
const mOrders = _.uniqBy(orders, '_id');
|
|
31
|
+
if (aggregateItems) {
|
|
32
|
+
const newItems = [];
|
|
33
|
+
items.forEach(item => {
|
|
34
|
+
const repeatedItem = newItems.find(each =>
|
|
35
|
+
isAggregatableItems(each, item)
|
|
36
|
+
);
|
|
37
|
+
if (repeatedItem) {
|
|
38
|
+
repeatedItem.quantity = math.add(
|
|
39
|
+
repeatedItem.quantity,
|
|
40
|
+
item.quantity
|
|
41
|
+
);
|
|
42
|
+
} else {
|
|
43
|
+
newItems.push({ ...item });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
newOrder = {
|
|
47
|
+
...mOrders[0],
|
|
48
|
+
items: newItems,
|
|
49
|
+
};
|
|
50
|
+
} else {
|
|
51
|
+
newOrder = {
|
|
52
|
+
...mOrders[0],
|
|
53
|
+
items,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
newOrder = actions.calculate(newOrder);
|
|
58
|
+
newOrder = actions.addNote({
|
|
59
|
+
order: newOrder,
|
|
60
|
+
message: `This order was merged with ${
|
|
61
|
+
mOrders.length === 2 ? ` order ` : ` orders `
|
|
62
|
+
} # ${mOrders.slice(1).map(order => ` ${order.displayId}`)}`,
|
|
63
|
+
user,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const ordersToDelete = [];
|
|
67
|
+
const voidedOrders = [];
|
|
68
|
+
for (let i = 1; i < mOrders.length; i += 1) {
|
|
69
|
+
if (mOrders[i] && mOrders[i].parentId) {
|
|
70
|
+
ordersToDelete.push(mOrders[i]);
|
|
71
|
+
} else {
|
|
72
|
+
let voidedOrder = actions.voidOrder(mOrders[i]);
|
|
73
|
+
if (!voidedOrder) return null;
|
|
74
|
+
voidedOrder.isParent = false;
|
|
75
|
+
voidedOrder = actions.addNote({
|
|
76
|
+
order: voidedOrder,
|
|
77
|
+
message: `This order was merged into order #${mOrders[i].displayId}`,
|
|
78
|
+
user,
|
|
79
|
+
});
|
|
80
|
+
voidedOrders.push(voidedOrder);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let subOrders = [];
|
|
85
|
+
if (newOrder && subOrdersToMerge && subOrdersToMerge.length > 0) {
|
|
86
|
+
subOrders = subOrdersToMerge.map((s, index) => ({
|
|
87
|
+
...s,
|
|
88
|
+
displayId: `${newOrder.displayId || ''}-${index + 1}`,
|
|
89
|
+
parentId: newOrder._id,
|
|
90
|
+
customer: newOrder.customer,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return [newOrder, voidedOrders, ordersToDelete, subOrders];
|
|
95
|
+
};
|
|
96
|
+
};
|