@darkpos/pricing 1.0.3 → 1.0.6
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 +22 -0
- package/README.md +110 -4
- package/__TEST__/item.test.js +285 -0
- package/__TEST__/order.test.js +234 -0
- package/index.js +1 -0
- package/lib/constants/index.js +5 -0
- package/lib/constants/status.js +39 -0
- package/lib/index.js +36 -9
- 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/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 +6 -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 +12 -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 +14 -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 +167 -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 +56 -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 +20 -23
- package/lib/item/actions.js +0 -135
- package/lib/modifier/actions.js +0 -163
- package/lib/modifier/constants.js +0 -46
- package/lib/modifier/index.js +0 -8
- 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,84 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, _, actions }) => {
|
|
2
|
+
const hasRelatedItems = (modifiers = []) =>
|
|
3
|
+
!!modifiers.find(each => modifierActions.isGroupOfItems(each));
|
|
4
|
+
|
|
5
|
+
const isValid = (itemModifiers, modifier) => {
|
|
6
|
+
if (!modifierActions.findById(itemModifiers, modifier.modifierId))
|
|
7
|
+
return false;
|
|
8
|
+
|
|
9
|
+
if (
|
|
10
|
+
modifierActions.isRequired(modifier) &&
|
|
11
|
+
!modifierActions.isGroupOfValues(modifier) &&
|
|
12
|
+
!modifierActions.isRequiredAndOverride(modifier)
|
|
13
|
+
)
|
|
14
|
+
return false;
|
|
15
|
+
|
|
16
|
+
if (
|
|
17
|
+
!modifierActions.isGroupOfItems(modifier) &&
|
|
18
|
+
hasRelatedItems(itemModifiers)
|
|
19
|
+
)
|
|
20
|
+
return false;
|
|
21
|
+
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return function removeModifier({
|
|
26
|
+
item,
|
|
27
|
+
modifier,
|
|
28
|
+
customer,
|
|
29
|
+
cache = {
|
|
30
|
+
items: [],
|
|
31
|
+
},
|
|
32
|
+
}) {
|
|
33
|
+
const nextItem = _.cloneDeep(item);
|
|
34
|
+
const itemModifiers = item.modifiers || [];
|
|
35
|
+
let modifiersToApply = [];
|
|
36
|
+
|
|
37
|
+
if (!isValid(itemModifiers, modifier)) return item;
|
|
38
|
+
|
|
39
|
+
// Check for multiple and add them to menuModifiers
|
|
40
|
+
if (modifierActions.hasAddModifiers(modifier)) {
|
|
41
|
+
const relatedModifiers = modifierActions.getRelatedModifiers(modifier);
|
|
42
|
+
// Removing only those children who are selected
|
|
43
|
+
const currentModifiersIds = itemModifiers.map(each => each.modifierId);
|
|
44
|
+
modifiersToApply = relatedModifiers.filter(each =>
|
|
45
|
+
currentModifiersIds.includes(each._id)
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
modifiersToApply.push(modifier);
|
|
50
|
+
// Remove
|
|
51
|
+
const nextModifiers = item.modifiers.filter(
|
|
52
|
+
each =>
|
|
53
|
+
!modifiersToApply.find(
|
|
54
|
+
mod =>
|
|
55
|
+
each.modifierId === mod._id ||
|
|
56
|
+
each._id === mod._id ||
|
|
57
|
+
each.modifierId === mod.modifierId
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const hasOverride = modifiersToApply.find(each =>
|
|
62
|
+
modifierActions.isOverride(each)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
if (hasOverride) {
|
|
66
|
+
const originalItem =
|
|
67
|
+
cache.items.find(_item => _item._id === item.itemId) || item;
|
|
68
|
+
|
|
69
|
+
if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
|
|
70
|
+
|
|
71
|
+
if (modifierActions.isPriceOverride(modifier))
|
|
72
|
+
nextItem.price = actions.getItemPrice({
|
|
73
|
+
item: originalItem,
|
|
74
|
+
cache,
|
|
75
|
+
customer,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
...nextItem,
|
|
81
|
+
modifiers: nextModifiers,
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function removeModifiers({ item, modifiers, cache, customer }) {
|
|
3
|
+
const newItem = modifiers.reduce(
|
|
4
|
+
(nextItem, modifier) =>
|
|
5
|
+
actions.removeModifier({
|
|
6
|
+
item: nextItem,
|
|
7
|
+
modifier,
|
|
8
|
+
cache,
|
|
9
|
+
customer,
|
|
10
|
+
}),
|
|
11
|
+
item
|
|
12
|
+
);
|
|
13
|
+
return newItem;
|
|
14
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, _ }) => {
|
|
2
|
+
const getCreditModifierIndex = modifiers => {
|
|
3
|
+
if (!modifiers) return -1;
|
|
4
|
+
return modifiers.findIndex(each => modifierActions.isCredit(each));
|
|
5
|
+
};
|
|
6
|
+
//
|
|
7
|
+
return function addCreditModifier({ order, customerStoredCredit }) {
|
|
8
|
+
if (!order || !customerStoredCredit) return order;
|
|
9
|
+
const nextOrder = _.cloneDeep(order);
|
|
10
|
+
const { modifiers = [] } = nextOrder;
|
|
11
|
+
let creditModifier;
|
|
12
|
+
const index = getCreditModifierIndex(modifiers);
|
|
13
|
+
if (index > -1) {
|
|
14
|
+
creditModifier = modifiers[index];
|
|
15
|
+
modifiers.splice(index, 1);
|
|
16
|
+
}
|
|
17
|
+
creditModifier = modifierActions.createCreditModifier({
|
|
18
|
+
...creditModifier,
|
|
19
|
+
customerStoredCredit,
|
|
20
|
+
});
|
|
21
|
+
modifiers.push(creditModifier);
|
|
22
|
+
return {
|
|
23
|
+
...nextOrder,
|
|
24
|
+
modifiers,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function addDiscountModifier({ order, modifier }) {
|
|
3
|
+
if (!order || !modifier) return order;
|
|
4
|
+
const clearedOrder = actions.removeDiscountModifier(order);
|
|
5
|
+
return actions.addModifier({
|
|
6
|
+
order: clearedOrder,
|
|
7
|
+
modifier,
|
|
8
|
+
});
|
|
9
|
+
};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
module.exports = ({
|
|
2
|
+
actions,
|
|
3
|
+
itemActions,
|
|
4
|
+
modifierActions,
|
|
5
|
+
utils,
|
|
6
|
+
settings,
|
|
7
|
+
_,
|
|
8
|
+
}) => {
|
|
9
|
+
const { math } = utils;
|
|
10
|
+
const orderSettings = _.get(settings, 'order');
|
|
11
|
+
|
|
12
|
+
const getQuantity = ({ order, item, pendingItemIndex = -1 }) => {
|
|
13
|
+
let pendingItemQty = 0;
|
|
14
|
+
if (pendingItemIndex > -1) {
|
|
15
|
+
pendingItemQty = order.items[pendingItemIndex].quantity;
|
|
16
|
+
}
|
|
17
|
+
return pendingItemQty || item.quantity || 1;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const getItem = ({ order, item, pendingItemIndex }) => {
|
|
21
|
+
const { items = [] } = order;
|
|
22
|
+
const hasAggregation = actions.hasAggregate({ order, item });
|
|
23
|
+
|
|
24
|
+
if (hasAggregation) {
|
|
25
|
+
const aggregateItems = actions.getSameItems({ order, item });
|
|
26
|
+
const idx = items.findIndex(each =>
|
|
27
|
+
aggregateItems.find(aItem => aItem.itemId === each.itemId)
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const aggregateItem = items[idx];
|
|
31
|
+
aggregateItem.quantity += getQuantity({ order, item, pendingItemIndex });
|
|
32
|
+
return [aggregateItem, idx, hasAggregation];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const newItem = itemActions.create({
|
|
36
|
+
...item,
|
|
37
|
+
modifiers: [],
|
|
38
|
+
quantity: item.quantity || 1,
|
|
39
|
+
itemId: item.itemId,
|
|
40
|
+
pieces: itemActions.isRelatedItem(item) ? 0 : item.pieces,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return [newItem];
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const getInventory = item => {
|
|
47
|
+
const { inventory } = item;
|
|
48
|
+
|
|
49
|
+
if (!inventory) return null;
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
...inventory,
|
|
53
|
+
name: item.name,
|
|
54
|
+
isNew: true,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const getSubscription = ({ order, item, combined, cache }) => {
|
|
59
|
+
const [hasSubscription, remaining, used] = actions.hasRemainingSubscription(
|
|
60
|
+
{
|
|
61
|
+
order,
|
|
62
|
+
item,
|
|
63
|
+
combined,
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
let orderItem = item;
|
|
67
|
+
|
|
68
|
+
if (!hasSubscription) return orderItem;
|
|
69
|
+
|
|
70
|
+
const subscriptionModifiers = modifierActions.getSubscriptionModifiers(
|
|
71
|
+
orderItem.modifiers
|
|
72
|
+
);
|
|
73
|
+
if (!_.isEmpty(subscriptionModifiers)) {
|
|
74
|
+
orderItem = itemActions.removeModifiers({
|
|
75
|
+
item: orderItem,
|
|
76
|
+
modifiers: subscriptionModifiers,
|
|
77
|
+
cache,
|
|
78
|
+
customer: order.customer,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const { quantity, price } = orderItem;
|
|
83
|
+
let numberOfUses = quantity;
|
|
84
|
+
if (remaining) {
|
|
85
|
+
const left = remaining - (used || 0);
|
|
86
|
+
if (quantity > left) numberOfUses = left;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const modifier = modifierActions.createSubscriptionModifier({
|
|
90
|
+
amount: math.mul(numberOfUses, price),
|
|
91
|
+
properties: { subscription: { numberOfUses } },
|
|
92
|
+
});
|
|
93
|
+
orderItem.modifiers.push(modifier);
|
|
94
|
+
|
|
95
|
+
return orderItem;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const addOrderItem = ({ itemIndex, order, item }) => {
|
|
99
|
+
if (itemIndex > -1) {
|
|
100
|
+
const updatedOrder = actions.updateItem({
|
|
101
|
+
order,
|
|
102
|
+
itemIndex,
|
|
103
|
+
item,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return [updatedOrder, itemIndex, item];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let { items = [] } = order;
|
|
110
|
+
if (orderSettings.orderAddToTop) items = [item, ...items];
|
|
111
|
+
else items.push(item);
|
|
112
|
+
|
|
113
|
+
const updatedOrder = { ...order, items };
|
|
114
|
+
return [
|
|
115
|
+
updatedOrder,
|
|
116
|
+
orderSettings.orderAddToTop ? 0 : items.length - 1,
|
|
117
|
+
item,
|
|
118
|
+
];
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const reArrangeNewItem = ({ nextOrder, nextItemIndex }) => {
|
|
122
|
+
const reArrangedOrder = { ...nextOrder };
|
|
123
|
+
const shouldMoveToTop = orderSettings.orderAddToTop && nextItemIndex > 0;
|
|
124
|
+
const shouldMoveToBottom =
|
|
125
|
+
!orderSettings.orderAddToTop &&
|
|
126
|
+
nextItemIndex < reArrangedOrder.items.length - 1;
|
|
127
|
+
|
|
128
|
+
if (shouldMoveToTop || shouldMoveToBottom) {
|
|
129
|
+
if (shouldMoveToTop) {
|
|
130
|
+
const [itemToMove] = reArrangedOrder.items.splice(nextItemIndex, 1);
|
|
131
|
+
reArrangedOrder.items.unshift(itemToMove);
|
|
132
|
+
return { reArrangedOrder, newIndex: 0 };
|
|
133
|
+
}
|
|
134
|
+
const [itemToMove] = reArrangedOrder.items.splice(nextItemIndex, 1);
|
|
135
|
+
reArrangedOrder.items.push(itemToMove);
|
|
136
|
+
return {
|
|
137
|
+
reArrangedOrder,
|
|
138
|
+
newIndex: reArrangedOrder.items.length - 1,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Nothing should be rearranged
|
|
143
|
+
return {};
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const getUnselectedModifiers = (item, modifiers) => {
|
|
147
|
+
const ids = item.modifiers.map(each => each.modifierId).filter(Boolean);
|
|
148
|
+
return modifiers.filter(
|
|
149
|
+
each => !ids.includes(each.modifierId) && !ids.includes(each._id)
|
|
150
|
+
);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
return function addItem({
|
|
154
|
+
order: orderProp,
|
|
155
|
+
item,
|
|
156
|
+
itemIndex,
|
|
157
|
+
cache,
|
|
158
|
+
overridenQuantity,
|
|
159
|
+
}) {
|
|
160
|
+
if (!orderProp || !item) return orderProp;
|
|
161
|
+
|
|
162
|
+
let order = _.cloneDeep(orderProp);
|
|
163
|
+
const { itemModifiers, ...itemToAdd } = item;
|
|
164
|
+
const customer = actions.getCustomer(order);
|
|
165
|
+
const modifiersToAdd = [];
|
|
166
|
+
|
|
167
|
+
const pendingItemIndex = actions.getPendingItemIndex(order);
|
|
168
|
+
|
|
169
|
+
let [orderItem, idx, combined] = getItem({
|
|
170
|
+
item: itemToAdd,
|
|
171
|
+
order,
|
|
172
|
+
pendingItemIndex,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Default modifiers
|
|
176
|
+
if (idx === undefined && !_.isEmpty(item.modifiers))
|
|
177
|
+
modifiersToAdd.push(
|
|
178
|
+
...item.modifiers.map(each => modifierActions.create(each))
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const pendingItem = actions.getSelectedItem({ order, itemIndex });
|
|
182
|
+
|
|
183
|
+
if (pendingItem && pendingItem.isPending && !combined) {
|
|
184
|
+
idx = itemIndex;
|
|
185
|
+
combined = !!pendingItem.itemId;
|
|
186
|
+
orderItem.quantity = pendingItem.quantity;
|
|
187
|
+
orderItem.isPending = !orderItem.itemId;
|
|
188
|
+
// add inventory
|
|
189
|
+
if (pendingItem.inventory) {
|
|
190
|
+
const inventory = getInventory(pendingItem);
|
|
191
|
+
if (inventory) {
|
|
192
|
+
orderItem.inventory = inventory;
|
|
193
|
+
if (inventory.serial) orderItem.serial = inventory.serial;
|
|
194
|
+
const modifiers = modifierActions.getEntityModifiers(inventory);
|
|
195
|
+
if (!_.isEmpty(modifiers)) modifiersToAdd.push(...modifiers);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (overridenQuantity > -1) {
|
|
201
|
+
orderItem.quantity = overridenQuantity;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (!combined) {
|
|
205
|
+
// add price
|
|
206
|
+
orderItem.price = itemActions.getItemPrice({
|
|
207
|
+
cache,
|
|
208
|
+
customer,
|
|
209
|
+
item: orderItem,
|
|
210
|
+
});
|
|
211
|
+
if (itemActions.isRelatedItem(orderItem)) {
|
|
212
|
+
// console.log('CHECKING Parent ...', orderItem.properties);
|
|
213
|
+
const parent = itemActions.getParentItem(order.items, orderItem);
|
|
214
|
+
// get inherited modifiers
|
|
215
|
+
const inheritedModifiers = modifierActions.getInheritedModifiers({
|
|
216
|
+
parent,
|
|
217
|
+
child: item,
|
|
218
|
+
});
|
|
219
|
+
if (!_.isEmpty(inheritedModifiers))
|
|
220
|
+
modifiersToAdd.push(...inheritedModifiers);
|
|
221
|
+
// Remove parent if it is only a repair Item
|
|
222
|
+
if (!itemActions.isParentIncluded(orderItem)) {
|
|
223
|
+
order = actions.removeItem({ order, item: parent, hard: false });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// add modifiers
|
|
229
|
+
let requiredModifiers = modifierActions.getItemModifiers({
|
|
230
|
+
modifiers: itemModifiers,
|
|
231
|
+
customer,
|
|
232
|
+
cache,
|
|
233
|
+
});
|
|
234
|
+
// Do not add again if they are already there
|
|
235
|
+
if (
|
|
236
|
+
!_.isEmpty(requiredModifiers) &&
|
|
237
|
+
combined &&
|
|
238
|
+
!_.isEmpty(orderItem.modifiers)
|
|
239
|
+
)
|
|
240
|
+
requiredModifiers = getUnselectedModifiers(orderItem, requiredModifiers);
|
|
241
|
+
if (!_.isEmpty(requiredModifiers))
|
|
242
|
+
modifiersToAdd.push(...requiredModifiers);
|
|
243
|
+
|
|
244
|
+
orderItem = getSubscription({
|
|
245
|
+
order,
|
|
246
|
+
item: orderItem,
|
|
247
|
+
combined,
|
|
248
|
+
cache,
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
const params = addOrderItem({
|
|
252
|
+
order,
|
|
253
|
+
item: orderItem,
|
|
254
|
+
itemIndex: idx,
|
|
255
|
+
});
|
|
256
|
+
let [nextOrder, nextItemIndex] = params;
|
|
257
|
+
const [, , nextItem] = params;
|
|
258
|
+
|
|
259
|
+
if (modifiersToAdd.length) {
|
|
260
|
+
// console.log('Adding Modifier to the item index ...', nextItemIndex);
|
|
261
|
+
nextOrder = modifiersToAdd.reduce(
|
|
262
|
+
(acc, modifier) =>
|
|
263
|
+
actions.addItemModifier({
|
|
264
|
+
itemIndex: nextItemIndex,
|
|
265
|
+
order: acc,
|
|
266
|
+
modifier,
|
|
267
|
+
cache,
|
|
268
|
+
}),
|
|
269
|
+
nextOrder
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const { reArrangedOrder, newIndex } = reArrangeNewItem({
|
|
274
|
+
nextOrder,
|
|
275
|
+
nextItemIndex,
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
if (reArrangedOrder && newIndex) {
|
|
279
|
+
nextOrder = { ...reArrangedOrder };
|
|
280
|
+
nextItemIndex = newIndex;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Need to delete any pending Items if the current was combined
|
|
284
|
+
|
|
285
|
+
if (combined && pendingItemIndex > -1 && idx !== itemIndex) {
|
|
286
|
+
const idxToRemove = actions.getPendingItemIndex(nextOrder);
|
|
287
|
+
nextOrder.items.splice(idxToRemove, 1);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return [nextOrder, nextItemIndex, nextItem];
|
|
291
|
+
};
|
|
292
|
+
};
|
|
@@ -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
|
+
};
|