@darkpos/pricing 1.0.4 → 1.0.7
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/README.md +108 -4
- package/__TEST__/item.test.js +265 -34
- 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 +147 -74
- package/index.js +1 -9
- 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/index.js +38 -0
- package/lib/item/addIndirectModifier.js +55 -0
- package/lib/item/calculate.js +108 -0
- package/lib/item/create.js +35 -0
- package/lib/item/filterByDirectModifiers.js +13 -0
- 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 -4
- 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 +240 -6
- 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 +105 -0
- 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 +164 -4
- 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 +17 -15
- package/__TEST__/modifier.test.js +0 -126
- package/lib/item/actions.js +0 -140
- package/lib/modifier/actions.js +0 -172
- package/lib/modifier/constants.js +0 -46
- package/lib/order/actions.js +0 -47
- package/lib/utils/defaultPrices.js +0 -10
- package/lib/utils/helpers.js +0 -26
- package/lib/utils/index.js +0 -9
- package/lib/utils/math.js +0 -71
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
const modifierActions = require('../lib/modifier/actions');
|
|
2
|
-
|
|
3
|
-
describe('Modifier actions', () => {
|
|
4
|
-
test('calculate with fix amount and add action', () => {
|
|
5
|
-
const modifier = {
|
|
6
|
-
type: 'fixed',
|
|
7
|
-
action: 'add',
|
|
8
|
-
amount: 10,
|
|
9
|
-
name: 'someModifier',
|
|
10
|
-
};
|
|
11
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
12
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
13
|
-
expect(prices && prices.subTotal).toBe(0);
|
|
14
|
-
expect(prices && prices.discount).toBe(0);
|
|
15
|
-
expect(prices && prices.fee).toBe(10);
|
|
16
|
-
expect(prices && prices.tip).toBe(0);
|
|
17
|
-
expect(prices && prices.tax).toBe(0);
|
|
18
|
-
expect(prices && prices.distributed).toBe(0);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('calculate with fix amount and subtract action', () => {
|
|
22
|
-
const modifier = {
|
|
23
|
-
type: 'fixed',
|
|
24
|
-
action: 'subtract',
|
|
25
|
-
amount: 10,
|
|
26
|
-
name: 'someModifier',
|
|
27
|
-
};
|
|
28
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
29
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
30
|
-
expect(prices && prices.subTotal).toBe(0);
|
|
31
|
-
expect(prices && prices.discount).toBe(0);
|
|
32
|
-
expect(prices && prices.fee).toBe(-10);
|
|
33
|
-
expect(prices && prices.tip).toBe(0);
|
|
34
|
-
expect(prices && prices.tax).toBe(0);
|
|
35
|
-
expect(prices && prices.distributed).toBe(0);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('calculate with percentage amount and subtract action', () => {
|
|
39
|
-
const modifier = {
|
|
40
|
-
amount: 20,
|
|
41
|
-
type: 'percentage',
|
|
42
|
-
action: 'subtract',
|
|
43
|
-
};
|
|
44
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
45
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
46
|
-
expect(prices && prices.subTotal).toBe(0);
|
|
47
|
-
expect(prices && prices.discount).toBe(0);
|
|
48
|
-
expect(prices && prices.fee).toBe(-6);
|
|
49
|
-
expect(prices && prices.tip).toBe(0);
|
|
50
|
-
expect(prices && prices.tax).toBe(0);
|
|
51
|
-
expect(prices && prices.distributed).toBe(0);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('calculate with percentage amount and add action', () => {
|
|
55
|
-
const modifier = { amount: 20, type: 'percentage', action: 'add' };
|
|
56
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
57
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
58
|
-
expect(prices && prices.subTotal).toBe(0);
|
|
59
|
-
expect(prices && prices.discount).toBe(0);
|
|
60
|
-
expect(prices && prices.fee).toBe(6);
|
|
61
|
-
expect(prices && prices.tip).toBe(0);
|
|
62
|
-
expect(prices && prices.tax).toBe(0);
|
|
63
|
-
expect(prices && prices.distributed).toBe(0);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('calculate with fix amount and override action', () => {
|
|
67
|
-
const modifier = { amount: 10, type: 'fixed', action: 'override' };
|
|
68
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
69
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
70
|
-
expect(prices && prices.subTotal).toBe(10);
|
|
71
|
-
expect(prices && prices.discount).toBe(0);
|
|
72
|
-
expect(prices && prices.fee).toBe(0);
|
|
73
|
-
expect(prices && prices.tip).toBe(0);
|
|
74
|
-
expect(prices && prices.tax).toBe(0);
|
|
75
|
-
expect(prices && prices.distributed).toBe(0);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test('calculate with fix amount, subtract action and discount attribute', () => {
|
|
79
|
-
const modifier = { amount: 10, type: 'fixed', action: 'subtract', attributes: ['discount'] };
|
|
80
|
-
const orderItem = { price: 30, quantity: 1 };
|
|
81
|
-
const prices = modifierActions.pricing(modifier, orderItem);
|
|
82
|
-
expect(prices && prices.subTotal).toBe(0);
|
|
83
|
-
expect(prices && prices.discount).toBe(-10);
|
|
84
|
-
expect(prices && prices.fee).toBe(0);
|
|
85
|
-
expect(prices && prices.tip).toBe(0);
|
|
86
|
-
expect(prices && prices.tax).toBe(0);
|
|
87
|
-
expect(prices && prices.distributed).toBe(0);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('calculate many', () => {
|
|
91
|
-
const modifiers = [
|
|
92
|
-
{ amount: 20, type: 'percentage', action: 'add' },
|
|
93
|
-
{ amount: 20, type: 'percentage', action: 'subtract' },
|
|
94
|
-
{ amount: 2, type: 'fixed', action: 'subtract' },
|
|
95
|
-
];
|
|
96
|
-
const orderItem = { price: 30, quantity: 2 };
|
|
97
|
-
const prices = modifierActions.pricingModifiers(modifiers, orderItem);
|
|
98
|
-
expect(prices).toMatchObject({
|
|
99
|
-
subTotal: 0,
|
|
100
|
-
tax: 0,
|
|
101
|
-
fee: -4,
|
|
102
|
-
tip: 0,
|
|
103
|
-
discount: 0,
|
|
104
|
-
distributed: 0,
|
|
105
|
-
total: -4,
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test('calculate many discount modifier', () => {
|
|
110
|
-
const modifiers = [
|
|
111
|
-
{ amount: 20, type: 'percentage', action: 'add', attributes: ['discount'] },
|
|
112
|
-
{ amount: 20, type: 'percentage', action: 'subtract', attributes: ['discount'] },
|
|
113
|
-
{ amount: 2, type: 'fixed', action: 'subtract', attributes: ['discount'] },
|
|
114
|
-
];
|
|
115
|
-
const orderItem = { price: 30, quantity: 2 };
|
|
116
|
-
const prices = modifierActions.pricingModifiers(modifiers, orderItem);
|
|
117
|
-
expect(prices).toMatchObject({
|
|
118
|
-
tax: 0,
|
|
119
|
-
fee: 0,
|
|
120
|
-
tip: 0,
|
|
121
|
-
discount: -4,
|
|
122
|
-
distributed: 0,
|
|
123
|
-
total: -4,
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
});
|
package/lib/item/actions.js
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
const modifierConstants = require('../modifier/constants');
|
|
2
|
-
const modifierActions = require('../modifier/actions');
|
|
3
|
-
const { math, defaultPrices } = require('../utils');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Remove order modifiers from items
|
|
7
|
-
*/
|
|
8
|
-
const _removeOrderModifiers = items =>
|
|
9
|
-
items.map(item => ({
|
|
10
|
-
...item,
|
|
11
|
-
modifiers: (item.modifiers || []).filter(
|
|
12
|
-
modifier => !modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed)
|
|
13
|
-
),
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Get items with order modifier
|
|
18
|
-
*/
|
|
19
|
-
const _getOrderModifiers = (items = []) =>
|
|
20
|
-
items
|
|
21
|
-
.reduce((modifiers, item) => [...modifiers, ...(item.modifiers || [])], [])
|
|
22
|
-
.filter(modifier =>
|
|
23
|
-
!modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed)
|
|
24
|
-
)
|
|
25
|
-
.filter(modifier =>
|
|
26
|
-
modifierActions._hasAttribute(modifier, modifierConstants.attributes.order)
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Get Total prices of items
|
|
31
|
-
*/
|
|
32
|
-
const _itemsPricing = (items = []) =>
|
|
33
|
-
items.reduce(
|
|
34
|
-
(prices, item) => ({
|
|
35
|
-
tax: math.add(prices.tax, item.tax),
|
|
36
|
-
subTotal: math.add(prices.subTotal, item.subTotal),
|
|
37
|
-
discount: math.add(prices.discount, item.discount),
|
|
38
|
-
distributed: math.add(prices.distributed, item.distributed),
|
|
39
|
-
total: math.add(prices.total, item.total),
|
|
40
|
-
fee: math.add(prices.fee, item.fee),
|
|
41
|
-
}),
|
|
42
|
-
defaultPrices
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* add order modifier to items
|
|
47
|
-
*/
|
|
48
|
-
const _addOrderModifier = (order, items, modifier) => {
|
|
49
|
-
const itemsModifiers = {};
|
|
50
|
-
if (!(modifierActions._hasAttribute(modifier, modifierConstants.attributes.discount) ||
|
|
51
|
-
modifierActions._hasAttribute(modifier, modifierConstants.attributes.promotion))
|
|
52
|
-
)
|
|
53
|
-
return itemsModifiers;
|
|
54
|
-
// get distributed price in order level
|
|
55
|
-
const modifierPrices = modifierActions.pricing(modifier, {
|
|
56
|
-
price: order.total,
|
|
57
|
-
quantity: 1,
|
|
58
|
-
});
|
|
59
|
-
const orderModifierTotal = math.abs(modifierPrices.discount);
|
|
60
|
-
|
|
61
|
-
const totalDistributed = items.reduce((acc, item) => {
|
|
62
|
-
const distributedMod = modifierActions._createDistributedModifier(order, item, modifier);
|
|
63
|
-
itemsModifiers[item._id] = distributedMod;
|
|
64
|
-
return math.add(acc, math.mul(distributedMod.amount, item.quantity));
|
|
65
|
-
}, 0);
|
|
66
|
-
|
|
67
|
-
// check validation
|
|
68
|
-
if (math.abs(totalDistributed) !== math.abs(orderModifierTotal)) {
|
|
69
|
-
const difference = math.sub(orderModifierTotal, totalDistributed);
|
|
70
|
-
// console.log('difference => ', difference);
|
|
71
|
-
const selectedItem = items.find(item => math.sub(item.total, difference) > 0);
|
|
72
|
-
|
|
73
|
-
const distributedMod = itemsModifiers[selectedItem._id];
|
|
74
|
-
itemsModifiers[selectedItem._id] = {
|
|
75
|
-
...distributedMod,
|
|
76
|
-
amount: math.add(distributedMod.amount, math.div(difference, selectedItem.quantity)),
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return itemsModifiers;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Get prices of an item
|
|
85
|
-
*/
|
|
86
|
-
const pricing = item => {
|
|
87
|
-
const { modifiers = [] } = item;
|
|
88
|
-
const price = parseFloat(item.price);
|
|
89
|
-
const quantity = parseInt(item.quantity, 10);
|
|
90
|
-
const subTotal = math.mul(price, quantity);
|
|
91
|
-
|
|
92
|
-
if (modifiers.length) {
|
|
93
|
-
const modifiersPrices = modifierActions.pricingModifiers(modifiers, {
|
|
94
|
-
price,
|
|
95
|
-
quantity,
|
|
96
|
-
});
|
|
97
|
-
const total = math.add(subTotal, modifiersPrices.total);
|
|
98
|
-
return { ...modifiersPrices, price, total, subTotal };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return { ...defaultPrices, price, total: subTotal, subTotal };
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Get a calculated item
|
|
106
|
-
*/
|
|
107
|
-
const calculateItem = item => {
|
|
108
|
-
const descriptions = [];
|
|
109
|
-
const modifiers = (item.modifiers || []).map(each => {
|
|
110
|
-
const description = modifierActions._getDescription(each);
|
|
111
|
-
if(!modifierActions._hasAttribute(each, modifierConstants.attributes.distributed))
|
|
112
|
-
descriptions.push(description);
|
|
113
|
-
return { ...each, description };
|
|
114
|
-
});
|
|
115
|
-
//
|
|
116
|
-
const prices = pricing(item);
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
...item,
|
|
120
|
-
modifiers,
|
|
121
|
-
...prices,
|
|
122
|
-
description: descriptions.join(', '),
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Get calculated items
|
|
128
|
-
*/
|
|
129
|
-
const calculateItems = (items = []) => items.map(item => calculateItem(item));
|
|
130
|
-
|
|
131
|
-
//
|
|
132
|
-
module.exports = {
|
|
133
|
-
calculateItem,
|
|
134
|
-
calculateItems,
|
|
135
|
-
pricing,
|
|
136
|
-
_getOrderModifiers,
|
|
137
|
-
_removeOrderModifiers,
|
|
138
|
-
_addOrderModifier,
|
|
139
|
-
_itemsPricing,
|
|
140
|
-
};
|
package/lib/modifier/actions.js
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
const { math, applyQuantity, defaultPrices, objId } = require('../utils');
|
|
2
|
-
const constants = require('./constants');
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* If Modifier has an attribute
|
|
6
|
-
*/
|
|
7
|
-
const _hasAttribute = (modifier = {}, attribute) => {
|
|
8
|
-
if (!Array.isArray(modifier.attributes)) return false;
|
|
9
|
-
const { attributes = [] } = modifier;
|
|
10
|
-
return attributes.includes(attribute);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
const _getNonOrderOverrideModifiers = (modifiers = []) =>
|
|
15
|
-
modifiers.filter(
|
|
16
|
-
modifier =>
|
|
17
|
-
!_hasAttribute(modifier, constants.attributes.order) && modifier.action !== 'override'
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
const _getTotalOverrideModifier = (modifiers = []) =>
|
|
22
|
-
modifiers.find(modifier => _hasAttribute(modifier, constants.attributes.modifierTotalOverride));
|
|
23
|
-
|
|
24
|
-
//
|
|
25
|
-
const _getDistributedModifiers = (modifiers = []) =>
|
|
26
|
-
modifiers.filter(modifier => _hasAttribute(modifier, constants.attributes.distributed));
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* create a distrubuted Modifier based on Order and Item
|
|
30
|
-
*/
|
|
31
|
-
const _createDistributedModifier = (order, item, modifier) => {
|
|
32
|
-
let { attributes } = modifier;
|
|
33
|
-
|
|
34
|
-
// if (!attributes.includes(constants.attributes.distributed))
|
|
35
|
-
// attributes = [...(modifier.attributes || []), constants.attributes.distributed];
|
|
36
|
-
|
|
37
|
-
let modifierAmount = 0;
|
|
38
|
-
|
|
39
|
-
if (modifier.type === 'percentage')
|
|
40
|
-
modifierAmount = math.div(math.mul(order.total, modifier.amount), 100);
|
|
41
|
-
else ({ amount: modifierAmount } = modifier);
|
|
42
|
-
|
|
43
|
-
const amountToApply = math.div(math.mul(modifierAmount, item.total), order.total, item.quantity);
|
|
44
|
-
return {
|
|
45
|
-
_id: objId(),
|
|
46
|
-
...modifier,
|
|
47
|
-
type: 'fixed',
|
|
48
|
-
attributes: [constants.attributes.distributed], //attributes.filter(a => a !== constants.attributes.order),
|
|
49
|
-
amount: amountToApply,
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Get Description of a modifier based on its fields
|
|
55
|
-
*/
|
|
56
|
-
const descriptionType = {
|
|
57
|
-
'fixed': (amount, symbol) => [symbol, math.toFixed(amount)].filter(Boolean).join(''),
|
|
58
|
-
'percentage': (amount, symbol) => [symbol, amount, '%'].filter(Boolean).join('')
|
|
59
|
-
};
|
|
60
|
-
const _getDescription = (modifier = {}) => {
|
|
61
|
-
const { name, amount, properties = {}, action, type } = modifier;
|
|
62
|
-
if (
|
|
63
|
-
_hasAttribute(modifier, constants.attributes.list) &&
|
|
64
|
-
properties.selectedValue &&
|
|
65
|
-
Array.isArray(properties.selectedValue)
|
|
66
|
-
)
|
|
67
|
-
return properties.selectedValue.join(', ');
|
|
68
|
-
|
|
69
|
-
const symbol = constants.symbols[action];
|
|
70
|
-
const amountStr = math.gt(amount, 0)
|
|
71
|
-
? `(${descriptionType[type](amount, symbol)})`
|
|
72
|
-
: null;
|
|
73
|
-
const description = [name, amountStr].filter(Boolean).join('');
|
|
74
|
-
|
|
75
|
-
return description;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Get pricing of modifier
|
|
80
|
-
*/
|
|
81
|
-
const pricing = (modifier = {}, options = { price: 0, quantity: 1 }) => {
|
|
82
|
-
const isType = type => modifier.type === type;
|
|
83
|
-
const isAction = action => modifier.action === action;
|
|
84
|
-
|
|
85
|
-
let actionValue = 1;
|
|
86
|
-
let amount = 0;
|
|
87
|
-
const prices = { ...defaultPrices };
|
|
88
|
-
const minItems = (modifier.properties || {}).minItems || 0;
|
|
89
|
-
const isOverrideModifier = isAction('override');
|
|
90
|
-
|
|
91
|
-
if (isAction('add')) actionValue = 1;
|
|
92
|
-
else if (isAction('subtract')) actionValue = -1;
|
|
93
|
-
else if (isOverrideModifier) actionValue = 1;
|
|
94
|
-
|
|
95
|
-
if (isType('fixed')) amount = parseFloat(modifier.amount);
|
|
96
|
-
else if (isType('percentage')) amount = math.div(math.mul(options.price, modifier.amount), 100);
|
|
97
|
-
|
|
98
|
-
const value = math.mul(actionValue, amount);
|
|
99
|
-
if (isOverrideModifier) prices.subTotal = value;
|
|
100
|
-
// TODO: promotion needs to be fixed
|
|
101
|
-
else if (
|
|
102
|
-
(_hasAttribute(modifier, constants.attributes.discount) ||
|
|
103
|
-
_hasAttribute(modifier, constants.attributes.promotion)) &&
|
|
104
|
-
((minItems > 0 && options.quantity && options.quantity >= minItems) || minItems <= 0)
|
|
105
|
-
)
|
|
106
|
-
prices.discount = value;
|
|
107
|
-
else if (_hasAttribute(modifier, constants.attributes.tax)) prices.tax = value;
|
|
108
|
-
else if (_hasAttribute(modifier, constants.attributes.gratuity)) prices.tip = value;
|
|
109
|
-
|
|
110
|
-
// TODO: upcharges needs to be added to fee
|
|
111
|
-
else if (
|
|
112
|
-
_hasAttribute(modifier, constants.attributes.paymentMethods) ||
|
|
113
|
-
_hasAttribute(modifier, constants.attributes.paymentTypes) ||
|
|
114
|
-
!modifier.attributes || !modifier.attributes.length // for Upcharge
|
|
115
|
-
)
|
|
116
|
-
prices.fee = value;
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
else prices.subTotal = value;
|
|
120
|
-
|
|
121
|
-
if (_hasAttribute(modifier, constants.attributes.distributed))
|
|
122
|
-
prices.distributed = math.add(prices.discount, prices.tax, prices.subTotal);
|
|
123
|
-
|
|
124
|
-
return applyQuantity(prices, options.quantity);
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Get pricing of modifirs in item
|
|
129
|
-
*/
|
|
130
|
-
const pricingModifiers = (modifiers, options = { price: 0, quantity: 1 }) => {
|
|
131
|
-
const modifierDPrices = { ...defaultPrices };
|
|
132
|
-
if (!modifiers.length) return modifierDPrices;
|
|
133
|
-
|
|
134
|
-
// get modifiers in order level and without override action
|
|
135
|
-
const itemModifiers = _getNonOrderOverrideModifiers(modifiers);
|
|
136
|
-
// get distributed modifiers
|
|
137
|
-
const distributedModifiers = _getDistributedModifiers(itemModifiers);
|
|
138
|
-
// find one override modifier
|
|
139
|
-
const totalOverrideModifier = _getTotalOverrideModifier(modifiers);
|
|
140
|
-
|
|
141
|
-
if (totalOverrideModifier) {
|
|
142
|
-
modifierDPrices.subTotal = totalOverrideModifier.amount;
|
|
143
|
-
modifierDPrices.total = totalOverrideModifier.amount;
|
|
144
|
-
}
|
|
145
|
-
const modifiersToCalculate = totalOverrideModifier ? distributedModifiers : itemModifiers;
|
|
146
|
-
|
|
147
|
-
const prices = modifiersToCalculate.reduce((acc, modifier) => {
|
|
148
|
-
const modifierPrices = pricing(modifier, options);
|
|
149
|
-
const subTotal = math.add(acc.subTotal, modifierPrices.subTotal);
|
|
150
|
-
const tax = math.add(acc.tax, modifierPrices.tax);
|
|
151
|
-
const fee = math.add(acc.fee, modifierPrices.fee);
|
|
152
|
-
const tip = math.add(acc.tip, modifierPrices.tip);
|
|
153
|
-
const discount = math.add(acc.discount, modifierPrices.discount);
|
|
154
|
-
const distributed = math.add(acc.distributed, modifierPrices.distributed);
|
|
155
|
-
return { subTotal, tax, fee, tip, discount, distributed };
|
|
156
|
-
}, modifierDPrices);
|
|
157
|
-
|
|
158
|
-
prices.total = math.add(prices.subTotal, prices.tax, prices.fee, prices.tip, prices.discount);
|
|
159
|
-
return prices;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
//
|
|
163
|
-
module.exports = {
|
|
164
|
-
pricing,
|
|
165
|
-
pricingModifiers,
|
|
166
|
-
_getDescription,
|
|
167
|
-
_hasAttribute,
|
|
168
|
-
_getDistributedModifiers,
|
|
169
|
-
_getNonOrderOverrideModifiers,
|
|
170
|
-
_getTotalOverrideModifier,
|
|
171
|
-
_createDistributedModifier,
|
|
172
|
-
};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
const primaryAttributes = {
|
|
2
|
-
promotion: 'promotion',
|
|
3
|
-
discount: 'discount',
|
|
4
|
-
tax: 'tax',
|
|
5
|
-
paymentMethods: 'paymentMethods',
|
|
6
|
-
paymentTypes: 'paymentTypes',
|
|
7
|
-
group: 'group',
|
|
8
|
-
list: 'list',
|
|
9
|
-
priceOverride: 'priceOverride',
|
|
10
|
-
quantityOverride: 'quantityOverride',
|
|
11
|
-
department: 'department',
|
|
12
|
-
starch: 'starch',
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
const secondAttributes = {
|
|
16
|
-
hidden: 'hidden',
|
|
17
|
-
required: 'required',
|
|
18
|
-
default: 'default',
|
|
19
|
-
order: 'order',
|
|
20
|
-
relatedItems: 'relatedItems',
|
|
21
|
-
recommended: 'recommended',
|
|
22
|
-
category: 'category',
|
|
23
|
-
multiple: 'multiple',
|
|
24
|
-
bind: 'bind',
|
|
25
|
-
customerTagsExtend: 'customerTagsExtend',
|
|
26
|
-
removeModifiers: 'removeModifiers',
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const attributes = {
|
|
30
|
-
...primaryAttributes,
|
|
31
|
-
...secondAttributes,
|
|
32
|
-
gratuity: 'gratuity',
|
|
33
|
-
subscription: 'subscription',
|
|
34
|
-
distributed: 'distributed',
|
|
35
|
-
modifierTotalOverride: 'modifierTotalOverride',
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const symbols = {
|
|
39
|
-
add: '+',
|
|
40
|
-
subtract: '-',
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
module.exports = {
|
|
44
|
-
attributes,
|
|
45
|
-
symbols,
|
|
46
|
-
};
|
package/lib/order/actions.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
const { uniqBy, cloneDeep } = require('lodash');
|
|
2
|
-
const itemActions = require('../item/actions');
|
|
3
|
-
const modifierActions = require('../modifier/actions');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* return calculated Order
|
|
7
|
-
*/
|
|
8
|
-
const calculateOrder = order => {
|
|
9
|
-
const { items = [] } = order;
|
|
10
|
-
if (!items.length) return order;
|
|
11
|
-
|
|
12
|
-
// WNDM: with not distributed modifiers
|
|
13
|
-
let itemsWNDM = [];
|
|
14
|
-
let newOrder = null;
|
|
15
|
-
let prices = {};
|
|
16
|
-
|
|
17
|
-
const orderItemsModifiers = itemActions._getOrderModifiers(items);
|
|
18
|
-
const concatModifiers = [...(order.modifiers || []), ...orderItemsModifiers];
|
|
19
|
-
const modifiers = uniqBy(concatModifiers, '_id');
|
|
20
|
-
// if there is no order level modifiers, we have to remove them from items
|
|
21
|
-
itemsWNDM = itemActions._removeOrderModifiers(items);
|
|
22
|
-
itemsWNDM = itemActions.calculateItems(itemsWNDM);
|
|
23
|
-
prices = itemActions._itemsPricing(itemsWNDM);
|
|
24
|
-
newOrder = { ...order, ...prices, items: itemsWNDM };
|
|
25
|
-
|
|
26
|
-
if (!modifiers.length) return newOrder;
|
|
27
|
-
|
|
28
|
-
const newItems = itemsWNDM || items;
|
|
29
|
-
let itemsWDM = cloneDeep(newItems);
|
|
30
|
-
modifiers.forEach(mod => {
|
|
31
|
-
const itemsModifiers = itemActions._addOrderModifier(newOrder, newItems, mod);
|
|
32
|
-
// adding the modifiers to items
|
|
33
|
-
itemsWDM = itemsWDM.map(item => ({
|
|
34
|
-
...item,
|
|
35
|
-
modifiers: [...(item.modifiers || []), itemsModifiers[item._id]].filter(Boolean),
|
|
36
|
-
}));
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const calculatedItemWDM = itemActions.calculateItems(itemsWDM);
|
|
40
|
-
prices = itemActions._itemsPricing(calculatedItemWDM);
|
|
41
|
-
return { ...order, ...prices, items: calculatedItemWDM };
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
//
|
|
45
|
-
module.exports = {
|
|
46
|
-
calculateOrder,
|
|
47
|
-
};
|
package/lib/utils/helpers.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const ObjectID = require('bson-objectid');
|
|
2
|
-
const math = require('./math');
|
|
3
|
-
const defaultPrices = require('./defaultPrices');
|
|
4
|
-
|
|
5
|
-
const objId = () => ObjectID();
|
|
6
|
-
|
|
7
|
-
const applyQuantity = (prices = defaultPrices, quantity = 1) =>
|
|
8
|
-
Object.keys(prices).reduce(
|
|
9
|
-
(obj, key) => ({
|
|
10
|
-
...obj,
|
|
11
|
-
[key]: math.mul(prices[key], quantity),
|
|
12
|
-
}),
|
|
13
|
-
prices
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
const filterExports = funcs => {
|
|
17
|
-
const names = Object.keys(funcs).filter(name => !name.includes('_'));
|
|
18
|
-
return names.reduce((newFuncs, name) => ({ ...newFuncs, [name]: funcs[name] }), {});
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
module.exports = {
|
|
23
|
-
objId,
|
|
24
|
-
applyQuantity,
|
|
25
|
-
filterExports,
|
|
26
|
-
};
|
package/lib/utils/index.js
DELETED
package/lib/utils/math.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
const Decimal = require('decimal.js');
|
|
2
|
-
|
|
3
|
-
//
|
|
4
|
-
const add = (...args) => {
|
|
5
|
-
if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
|
|
6
|
-
|
|
7
|
-
const sum = args.reduce((acc, current) => acc.add(Decimal(current)), Decimal(0));
|
|
8
|
-
|
|
9
|
-
// console.log('add =>', args, ' : ', sum);
|
|
10
|
-
return Decimal(sum.toFixed(2, 1)).toNumber();
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
const sub = (...args) => {
|
|
15
|
-
if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
|
|
16
|
-
|
|
17
|
-
const numbers = [...args];
|
|
18
|
-
const first = numbers.shift();
|
|
19
|
-
const sum = numbers.reduce((acc, current) => acc.sub(Decimal(current)), Decimal(first));
|
|
20
|
-
|
|
21
|
-
// console.log('sub =>', args, ' : ', sum);
|
|
22
|
-
return Decimal(sum.toFixed(2, 1)).toNumber();
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
const mul = (...args) => {
|
|
27
|
-
if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
|
|
28
|
-
|
|
29
|
-
const sum = args.reduce((acc, current) => acc.mul(Decimal(current)), Decimal(1));
|
|
30
|
-
|
|
31
|
-
// console.log('mul =>', args, ' : ', sum);
|
|
32
|
-
return Decimal(sum.toFixed(2, 1)).toNumber();
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
const div = (...args) => {
|
|
37
|
-
if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
|
|
38
|
-
|
|
39
|
-
const numbers = [...args];
|
|
40
|
-
const first = numbers.shift();
|
|
41
|
-
const sum = numbers.reduce((acc, current) => acc.div(Decimal(current)), Decimal(first));
|
|
42
|
-
|
|
43
|
-
// console.log('div =>', args, ' : ', sum);
|
|
44
|
-
return Decimal(sum.toFixed(2, 1)).toNumber();
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
const lte = (x, y) => Decimal(x).lte(Decimal(y));
|
|
49
|
-
|
|
50
|
-
//
|
|
51
|
-
const gt = (x, y) => Decimal(x).gt(Decimal(y));
|
|
52
|
-
|
|
53
|
-
//
|
|
54
|
-
const abs = x =>
|
|
55
|
-
Decimal(x)
|
|
56
|
-
.abs()
|
|
57
|
-
.toNumber();
|
|
58
|
-
|
|
59
|
-
//
|
|
60
|
-
const toFixed = x => Decimal(x).toFixed(2, 1);
|
|
61
|
-
|
|
62
|
-
module.exports = {
|
|
63
|
-
mul,
|
|
64
|
-
div,
|
|
65
|
-
add,
|
|
66
|
-
sub,
|
|
67
|
-
abs,
|
|
68
|
-
lte,
|
|
69
|
-
gt,
|
|
70
|
-
toFixed,
|
|
71
|
-
};
|