@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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
|
|
4
|
+
const getPrice = ({ item, modifier }) => {
|
|
5
|
+
const amount =
|
|
6
|
+
(modifier && modifier.compute && modifier.compute.amount) || 0;
|
|
7
|
+
const { price = 0 } = item;
|
|
8
|
+
if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
|
|
9
|
+
return amount;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const filterByRemoveModifiers = (modifiers, modifier) => {
|
|
13
|
+
const { delModifiers = [] } = modifier;
|
|
14
|
+
|
|
15
|
+
return modifiers.filter(
|
|
16
|
+
each => !modifierActions.findById(delModifiers, each.modifierId)
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const hasBehaivoralFields = modifier => {
|
|
21
|
+
if (
|
|
22
|
+
!modifierActions.hasRelatedItems(modifier) &&
|
|
23
|
+
modifierActions.isGroupOfItems(modifier)
|
|
24
|
+
)
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const validateItemPiecesCondition = (itemPieces, minPieces) => {
|
|
30
|
+
if (!minPieces) return true;
|
|
31
|
+
return minPieces <= itemPieces;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const validateItemQtyCondition = (itemQuantity, minQuantity) => {
|
|
35
|
+
if (!minQuantity) return true;
|
|
36
|
+
return minQuantity <= itemQuantity;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const validateRequiredModifiers = (modifiers, requiredModifiers) => {
|
|
40
|
+
if (_.isEmpty(modifiers) || _.isEmpty(requiredModifiers)) return true;
|
|
41
|
+
return requiredModifiers.every(each =>
|
|
42
|
+
modifierActions.contains(modifiers, each)
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const areConditionsMet = (item, conditions) => {
|
|
47
|
+
if (!conditions) return true;
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
validateItemPiecesCondition(item.pieces, conditions.minItemPieces) &&
|
|
51
|
+
validateItemQtyCondition(item.quantity, conditions.minItemQuantity) &&
|
|
52
|
+
validateRequiredModifiers(item.modifiers, conditions.modifiers)
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const addModifier = ({
|
|
57
|
+
modifier,
|
|
58
|
+
item: itemProp,
|
|
59
|
+
customer,
|
|
60
|
+
cache = {
|
|
61
|
+
modifiers: [],
|
|
62
|
+
items: [],
|
|
63
|
+
itemModifiers: [],
|
|
64
|
+
},
|
|
65
|
+
}) => {
|
|
66
|
+
let item = { ...itemProp };
|
|
67
|
+
if (hasBehaivoralFields(modifier)) return item;
|
|
68
|
+
// check conditions
|
|
69
|
+
if (!areConditionsMet(item, modifier.conditions)) return item;
|
|
70
|
+
|
|
71
|
+
const modifierToAdd = modifierActions.duplicate(modifier);
|
|
72
|
+
const modifierIndex = item.modifiers.findIndex(
|
|
73
|
+
ieach => ieach.modifierId === modifier._id
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// group of values use case
|
|
77
|
+
if (
|
|
78
|
+
modifierActions.isGroupOfValues(modifier) ||
|
|
79
|
+
modifierActions.isRequiredAndOverride(modifier)
|
|
80
|
+
) {
|
|
81
|
+
if (modifierIndex > -1) item.modifiers[modifierIndex] = modifierToAdd;
|
|
82
|
+
else item.modifiers.push(modifierToAdd);
|
|
83
|
+
} else {
|
|
84
|
+
item.modifiers.push(modifierToAdd);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (modifierActions.isRemoveModifier(modifier)) {
|
|
88
|
+
item.modifiers = filterByRemoveModifiers(item.modifiers, modifier);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (modifierActions.isAmountOverride(modifier)) {
|
|
92
|
+
item = {
|
|
93
|
+
...item,
|
|
94
|
+
price: modifier.compute.amount,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (modifierActions.isQuantityOverride(modifier) && modifier.compute) {
|
|
99
|
+
item.quantity = modifier.compute.amount || 1;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (modifierActions.isPriceOverride(modifier)) {
|
|
103
|
+
item.price = getPrice({ modifier, item });
|
|
104
|
+
} else {
|
|
105
|
+
item.price = itemActions.getItemPrice({
|
|
106
|
+
item,
|
|
107
|
+
cache,
|
|
108
|
+
customer,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return item;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return function addItemModifier({
|
|
115
|
+
order: orderProp,
|
|
116
|
+
modifier,
|
|
117
|
+
itemIndex,
|
|
118
|
+
cache,
|
|
119
|
+
}) {
|
|
120
|
+
let order = _.cloneDeep(orderProp);
|
|
121
|
+
if (!order || itemIndex < 0 || !modifier) return order;
|
|
122
|
+
|
|
123
|
+
let item = actions.getSelectedItem({ order, itemIndex });
|
|
124
|
+
const customer = actions.getCustomer(order);
|
|
125
|
+
const contains =
|
|
126
|
+
!_.isEmpty(item.modifiers) &&
|
|
127
|
+
modifierActions.contains(item.modifiers, modifier);
|
|
128
|
+
|
|
129
|
+
const usingCount = contains
|
|
130
|
+
? modifierActions.getUsingCount(item.modifiers, modifier)
|
|
131
|
+
: 0;
|
|
132
|
+
|
|
133
|
+
// don't add modifier if it is subscription and it doesn't have any other subscription
|
|
134
|
+
if (
|
|
135
|
+
modifierActions.isTrackUsageSubscription(modifier) &&
|
|
136
|
+
!itemActions.hasCreateSubscription(order.items)
|
|
137
|
+
) {
|
|
138
|
+
// console.log('Removing UsageTracker Modifier ...');
|
|
139
|
+
return order;
|
|
140
|
+
}
|
|
141
|
+
// Remove if it has it already only if it is not group of value or override modifier
|
|
142
|
+
if (
|
|
143
|
+
contains &&
|
|
144
|
+
usingCount >= item.quantity &&
|
|
145
|
+
!(
|
|
146
|
+
modifierActions.isGroupOfValues(modifier) ||
|
|
147
|
+
modifierActions.isRequiredAndOverride(modifier)
|
|
148
|
+
)
|
|
149
|
+
) {
|
|
150
|
+
// console.log('Removing MODIFIER ...');
|
|
151
|
+
order = actions.removeItemModifier({
|
|
152
|
+
order,
|
|
153
|
+
modifier,
|
|
154
|
+
itemIndex,
|
|
155
|
+
cache,
|
|
156
|
+
});
|
|
157
|
+
return order;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
item = addModifier({
|
|
161
|
+
item,
|
|
162
|
+
modifier,
|
|
163
|
+
cache,
|
|
164
|
+
customer,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Recursive Rules:
|
|
168
|
+
if (modifierActions.hasAddModifiers(modifier)) {
|
|
169
|
+
let relatedModifiers = modifierActions.getRelatedModifiers({
|
|
170
|
+
modifier,
|
|
171
|
+
modifiers: cache.modifiers,
|
|
172
|
+
});
|
|
173
|
+
relatedModifiers = relatedModifiers.filter(
|
|
174
|
+
each => !modifierActions.contains(item.modifiers, each)
|
|
175
|
+
);
|
|
176
|
+
item = relatedModifiers.reduce(
|
|
177
|
+
(acc, each) =>
|
|
178
|
+
addModifier({
|
|
179
|
+
item: acc,
|
|
180
|
+
modifier: each,
|
|
181
|
+
cache,
|
|
182
|
+
customer,
|
|
183
|
+
}),
|
|
184
|
+
item
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
order.items[itemIndex] = item;
|
|
189
|
+
|
|
190
|
+
if (modifierActions.hasRelatedItems(modifier)) {
|
|
191
|
+
// console.log('Adding related Items ...', modifier.properties.group.items);
|
|
192
|
+
order = modifier.properties.group.items.reduce((acc, each) => {
|
|
193
|
+
const [nextOrder] = actions.addItem({
|
|
194
|
+
item: {
|
|
195
|
+
...each,
|
|
196
|
+
itemId: each._id,
|
|
197
|
+
_id: null,
|
|
198
|
+
properties: {
|
|
199
|
+
relatedItem: true,
|
|
200
|
+
parentId: item._id,
|
|
201
|
+
parentItemId: item.itemId,
|
|
202
|
+
includeParent: true,
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
order: acc,
|
|
206
|
+
cache,
|
|
207
|
+
});
|
|
208
|
+
return nextOrder;
|
|
209
|
+
}, order);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return order;
|
|
213
|
+
};
|
|
214
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function addModifierToAllItems({ order, modifier, cache }) {
|
|
3
|
+
if (!order || !Array.isArray(order.items) || !modifier) return order;
|
|
4
|
+
|
|
5
|
+
const nextOrder = Object.entries(order.items).reduce(
|
|
6
|
+
(acc, [itemIndex]) =>
|
|
7
|
+
actions.addItemModifier({
|
|
8
|
+
itemIndex,
|
|
9
|
+
modifier,
|
|
10
|
+
order: acc,
|
|
11
|
+
cache,
|
|
12
|
+
}),
|
|
13
|
+
order
|
|
14
|
+
);
|
|
15
|
+
return nextOrder;
|
|
16
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { date } = utils;
|
|
3
|
+
const defaults = {
|
|
4
|
+
message: '',
|
|
5
|
+
attributes: [],
|
|
6
|
+
date: date.toISOString(),
|
|
7
|
+
user: null,
|
|
8
|
+
url: '',
|
|
9
|
+
__typename: 'Note',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
return function addNote({ user, order, message }) {
|
|
13
|
+
if (!order || !message || !user) return order;
|
|
14
|
+
const newNote = {
|
|
15
|
+
...defaults,
|
|
16
|
+
user,
|
|
17
|
+
message,
|
|
18
|
+
};
|
|
19
|
+
const nextOrder = {
|
|
20
|
+
...order,
|
|
21
|
+
notes: [...(order.notes || []), newNote],
|
|
22
|
+
};
|
|
23
|
+
return nextOrder;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function addTable({ order, table }) {
|
|
3
|
+
if (!order || !table) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
const { location = {} } = nextOrder;
|
|
6
|
+
nextOrder.location = {
|
|
7
|
+
...location,
|
|
8
|
+
table: { _id: table._id, name: table.name },
|
|
9
|
+
};
|
|
10
|
+
return nextOrder;
|
|
11
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax */
|
|
2
|
+
/**
|
|
3
|
+
* return calculated Order
|
|
4
|
+
*/
|
|
5
|
+
module.exports = ({ _, utils, itemActions, modifierActions }) => {
|
|
6
|
+
const { math } = utils;
|
|
7
|
+
|
|
8
|
+
const pricing = items => {
|
|
9
|
+
let subTotals = {};
|
|
10
|
+
let subTotal = 0;
|
|
11
|
+
|
|
12
|
+
for (const item of items) {
|
|
13
|
+
subTotal = math.add(subTotal, item.subTotals._actual);
|
|
14
|
+
const keys = Object.keys(item.subTotals).filter(
|
|
15
|
+
key => !key.includes('_')
|
|
16
|
+
);
|
|
17
|
+
for (const key of keys) {
|
|
18
|
+
subTotals[key] = math.add(subTotals[key] || 0, item.subTotals[key]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const total = Object.keys(subTotals).reduce(
|
|
23
|
+
(acc, key) => math.add(acc, subTotals[key]),
|
|
24
|
+
subTotal
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
subTotals = Object.keys(subTotals).reduce(
|
|
28
|
+
(acc, key) => ({
|
|
29
|
+
...acc,
|
|
30
|
+
[key]: subTotals[key],
|
|
31
|
+
}),
|
|
32
|
+
{}
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
subTotals,
|
|
37
|
+
subTotal,
|
|
38
|
+
total,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const getItems = (items, orderModifiers) => {
|
|
43
|
+
const existsInOrderModifier = modifier =>
|
|
44
|
+
orderModifiers &&
|
|
45
|
+
orderModifiers.find(each => each.modifierId === modifier.modifierId);
|
|
46
|
+
|
|
47
|
+
return items.map(item => {
|
|
48
|
+
const modifiers = (item.modifiers || []).filter(
|
|
49
|
+
modifier => !existsInOrderModifier(modifier)
|
|
50
|
+
);
|
|
51
|
+
return {
|
|
52
|
+
...item,
|
|
53
|
+
modifiers,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return function calculateorder(inputOrder) {
|
|
59
|
+
if (!inputOrder) return inputOrder;
|
|
60
|
+
const order = _.cloneDeep(inputOrder);
|
|
61
|
+
const { items = [] } = order;
|
|
62
|
+
if (!items.length)
|
|
63
|
+
return { ...order, subTotals: {}, subTotal: 0, total: 0 };
|
|
64
|
+
|
|
65
|
+
const modifiers = _.uniqBy(order.modifiers, '_id');
|
|
66
|
+
// if there is no order level modifiers, we have to remove them from items
|
|
67
|
+
let itemsWNIM = getItems(items, modifiers);
|
|
68
|
+
itemsWNIM = itemActions.calculate(itemsWNIM);
|
|
69
|
+
const newOrder = { ...order, ...pricing(itemsWNIM), items: itemsWNIM };
|
|
70
|
+
|
|
71
|
+
if (!modifiers.length) return newOrder;
|
|
72
|
+
|
|
73
|
+
const newItems = itemsWNIM || items;
|
|
74
|
+
let itemsWIM = _.cloneDeep(newItems);
|
|
75
|
+
|
|
76
|
+
let computedTotal = newOrder.total;
|
|
77
|
+
const sortedModifiers = modifierActions.sort(modifiers);
|
|
78
|
+
for (const modifier of sortedModifiers) {
|
|
79
|
+
const isCredit = modifierActions.isCredit(modifier);
|
|
80
|
+
if (isCredit) {
|
|
81
|
+
const calculatedItemWIM = itemActions.calculate(itemsWIM);
|
|
82
|
+
({ total: computedTotal } = pricing(calculatedItemWIM));
|
|
83
|
+
}
|
|
84
|
+
const itemsModifiers = itemActions.addIndirectModifier(
|
|
85
|
+
computedTotal,
|
|
86
|
+
newItems,
|
|
87
|
+
modifier
|
|
88
|
+
);
|
|
89
|
+
// adding the modifiers to items
|
|
90
|
+
itemsWIM = itemsWIM.map(item => ({
|
|
91
|
+
...item,
|
|
92
|
+
modifiers: [...(item.modifiers || []), itemsModifiers[item._id]].filter(
|
|
93
|
+
Boolean
|
|
94
|
+
),
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const calculatedItemWIM = itemActions.calculate(itemsWIM);
|
|
99
|
+
return {
|
|
100
|
+
...order,
|
|
101
|
+
...pricing(calculatedItemWIM),
|
|
102
|
+
items: calculatedItemWIM,
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function calculateDue(order) {
|
|
4
|
+
if (!order || !Array.isArray(order.items)) return 0;
|
|
5
|
+
let total = 0;
|
|
6
|
+
let totalPaid = 0;
|
|
7
|
+
|
|
8
|
+
order.items.forEach(item => {
|
|
9
|
+
total = math.add(total, item.total);
|
|
10
|
+
totalPaid = math.add(totalPaid, item.totalPaid);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
return math.sub(total, totalPaid);
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function calculateOrdersDue(orders, orderItemsToPay) {
|
|
4
|
+
let total = 0;
|
|
5
|
+
let totalPaid = 0;
|
|
6
|
+
const isPartial = !!(
|
|
7
|
+
orderItemsToPay && Object.keys(orderItemsToPay).length > 0
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
orders.forEach(order => {
|
|
11
|
+
const orderItemIds =
|
|
12
|
+
(orderItemsToPay && orderItemsToPay[order._id]) || [];
|
|
13
|
+
order.items.forEach(it => {
|
|
14
|
+
if (!isPartial) {
|
|
15
|
+
total += it.total;
|
|
16
|
+
totalPaid += it.totalPaid;
|
|
17
|
+
} else if (orderItemIds.includes(it._id)) {
|
|
18
|
+
total += it.total;
|
|
19
|
+
totalPaid += it.totalPaid;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return math.sub(total, totalPaid);
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module.exports = ({ utils }) =>
|
|
2
|
+
function changeEndDate({ date, order }) {
|
|
3
|
+
if (!date || !order) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
if (!nextOrder.end) nextOrder.end = { __typename: 'OrderEnd' };
|
|
6
|
+
|
|
7
|
+
const isoString = utils.date.toISOString(date);
|
|
8
|
+
nextOrder.end = {
|
|
9
|
+
...nextOrder.end,
|
|
10
|
+
actualDate: utils.date.isToday(date) ? isoString : '',
|
|
11
|
+
requestDate: isoString,
|
|
12
|
+
__typename: 'OrderEnd',
|
|
13
|
+
};
|
|
14
|
+
return nextOrder;
|
|
15
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function changeLocation({ order, location, isStart }) {
|
|
3
|
+
if (!order || !location) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
if (isStart) {
|
|
6
|
+
if (!nextOrder.start) nextOrder.start = { __typename: 'OrderStart' };
|
|
7
|
+
nextOrder.start = {
|
|
8
|
+
...nextOrder.start,
|
|
9
|
+
location,
|
|
10
|
+
};
|
|
11
|
+
return nextOrder;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (!nextOrder.end) nextOrder.end = { __typename: 'OrderEnd' };
|
|
15
|
+
nextOrder.end = {
|
|
16
|
+
...nextOrder.end,
|
|
17
|
+
location,
|
|
18
|
+
};
|
|
19
|
+
return nextOrder;
|
|
20
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = ({ utils }) =>
|
|
2
|
+
function changeStartDate({ date, order }) {
|
|
3
|
+
if (!date || !order) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
if (!nextOrder.start) nextOrder.start = { __typename: 'OrderStart' };
|
|
6
|
+
|
|
7
|
+
const isoString = utils.date.toISOString(date);
|
|
8
|
+
nextOrder.start = {
|
|
9
|
+
...nextOrder.start,
|
|
10
|
+
actualDate: utils.date.isToday(date) ? isoString : '',
|
|
11
|
+
requestDate: isoString,
|
|
12
|
+
};
|
|
13
|
+
return nextOrder;
|
|
14
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = () =>
|
|
2
|
+
function combineSubOrders({ order, subOrders = [] }) {
|
|
3
|
+
if (!order || !subOrders || !subOrders.length) return order;
|
|
4
|
+
|
|
5
|
+
const items = subOrders.reduce(
|
|
6
|
+
(arr, each) => arr.concat(each.items || []),
|
|
7
|
+
[]
|
|
8
|
+
);
|
|
9
|
+
return {
|
|
10
|
+
...order,
|
|
11
|
+
orders: subOrders,
|
|
12
|
+
items,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module.exports = ({ utils, constants = {} }) => {
|
|
2
|
+
const { helpers } = utils;
|
|
3
|
+
|
|
4
|
+
const defaultOrderStatus = {
|
|
5
|
+
order: constants.Status.Order.OPEN,
|
|
6
|
+
kitchen: constants.Status.Kitchen.OPEN,
|
|
7
|
+
delivery: constants.Status.Delivery.NONE,
|
|
8
|
+
detailed: true,
|
|
9
|
+
};
|
|
10
|
+
const orderEnd = {
|
|
11
|
+
actualDate: '',
|
|
12
|
+
requestDate: '',
|
|
13
|
+
location: null,
|
|
14
|
+
__typename: 'OrderEnd',
|
|
15
|
+
};
|
|
16
|
+
const orderStart = {
|
|
17
|
+
actualDate: utils.date.toISOString(),
|
|
18
|
+
requestDate: '',
|
|
19
|
+
location: null,
|
|
20
|
+
__typename: 'OrderStart',
|
|
21
|
+
};
|
|
22
|
+
const defaultOrder = {
|
|
23
|
+
get _id() {
|
|
24
|
+
return helpers.getObjectID();
|
|
25
|
+
},
|
|
26
|
+
parentId: null,
|
|
27
|
+
isParent: false,
|
|
28
|
+
subTotal: 0,
|
|
29
|
+
tax: 0,
|
|
30
|
+
modifiers: [],
|
|
31
|
+
discount: 0,
|
|
32
|
+
total: 0,
|
|
33
|
+
description: '',
|
|
34
|
+
displayId: '',
|
|
35
|
+
type: '',
|
|
36
|
+
location: {},
|
|
37
|
+
status: defaultOrderStatus,
|
|
38
|
+
attributes: [],
|
|
39
|
+
properties: {},
|
|
40
|
+
fee: 0,
|
|
41
|
+
user: null,
|
|
42
|
+
items: [],
|
|
43
|
+
notes: [],
|
|
44
|
+
customer: null,
|
|
45
|
+
start: orderStart,
|
|
46
|
+
end: orderEnd,
|
|
47
|
+
_storeId: '',
|
|
48
|
+
__typename: 'Order',
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return function create(params = {}) {
|
|
52
|
+
return {
|
|
53
|
+
...defaultOrder,
|
|
54
|
+
...params,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
TODO: {
|
|
61
|
+
table: {
|
|
62
|
+
_id: locationState?.table._id,
|
|
63
|
+
name: locationState?.table.name,
|
|
64
|
+
},
|
|
65
|
+
type: location || LocationTypes.walkIn,
|
|
66
|
+
}
|
|
67
|
+
* */
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { helpers } = utils;
|
|
3
|
+
return function duplicateItem({ order, item }) {
|
|
4
|
+
if (!order || !order.items) return order;
|
|
5
|
+
|
|
6
|
+
const nextOrder = { ...order };
|
|
7
|
+
const newItem = {
|
|
8
|
+
...item,
|
|
9
|
+
serial: '',
|
|
10
|
+
_id: helpers.getObjectID(),
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
nextOrder.items.push(newItem);
|
|
14
|
+
return nextOrder;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = ({ utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
return function getCustomerStoreCredit(order) {
|
|
4
|
+
if (!order || !order.customer || !Array.isArray(order.customer.wallet))
|
|
5
|
+
return 0;
|
|
6
|
+
return order.customer.wallet
|
|
7
|
+
.filter(
|
|
8
|
+
each =>
|
|
9
|
+
each && each.provider === 'darkpos' && each.cards && each.cards.length
|
|
10
|
+
)
|
|
11
|
+
.reduce((acc, each) => [...acc, ...each.cards], [])
|
|
12
|
+
.reduce((acc, each) => math.add(acc, each.amount || 0), 0);
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module.exports = ({ modifierActions }) =>
|
|
2
|
+
function getCustomerSubscriptions(customer) {
|
|
3
|
+
if (!customer || !Array.isArray(customer.modifiers)) return [];
|
|
4
|
+
const subscriptions = modifierActions.getSubscriptionModifiers(
|
|
5
|
+
customer.modifiers
|
|
6
|
+
);
|
|
7
|
+
return subscriptions;
|
|
8
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions }) =>
|
|
2
|
+
function getCustomerSubscriptionsByItem({ customer, item }) {
|
|
3
|
+
if (!customer || !item) return [];
|
|
4
|
+
const subscriptions = actions.getCustomerSubscriptions(customer);
|
|
5
|
+
return subscriptions.filter(each => {
|
|
6
|
+
const subscribedItem = modifierActions.getSubscriptionItem(each);
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
subscribedItem &&
|
|
10
|
+
subscribedItem.itemId === item.itemId &&
|
|
11
|
+
(!subscribedItem.serial || subscribedItem.serial === item.serial)
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
};
|