@darkpos/pricing 1.0.5 → 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 +8 -10
- package/__TEST__/item.test.js +137 -99
- package/__TEST__/order.test.js +50 -36
- package/index.js +1 -25
- package/lib/constants/index.js +5 -0
- package/lib/constants/status.js +39 -0
- package/lib/index.js +36 -0
- package/lib/item/addIndirectModifier.js +34 -17
- package/lib/item/calculate.js +41 -19
- package/lib/item/create.js +35 -0
- package/lib/item/filterByDirectModifiers.js +5 -6
- package/lib/item/findOriginalItem.js +8 -0
- package/lib/item/getBalanceToPay.js +12 -0
- package/lib/item/getDepartmentModifiers.js +5 -0
- package/lib/item/getDiscountModifiers.js +7 -0
- package/lib/item/getItemModifiers.js +16 -0
- package/lib/item/getItemModifiersDescription.js +22 -0
- package/lib/item/getItemPrice.js +57 -0
- package/lib/item/getItemsTotalPaid.js +9 -0
- package/lib/item/getItemsTotalPieces.js +7 -0
- package/lib/item/getNotIncludedModifiers.js +11 -0
- package/lib/item/getParentItem.js +5 -0
- package/lib/item/getPendingIndex.js +5 -0
- package/lib/item/getTotal.js +8 -0
- package/lib/item/getTotalPieces.js +7 -0
- package/lib/item/getTotals.js +25 -0
- package/lib/item/hasCreateSubscription.js +7 -0
- package/lib/item/hasModifier.js +15 -0
- package/lib/item/hasModifierWithValue.js +11 -0
- package/lib/item/hasModifiers.js +9 -0
- package/lib/item/hasSubscription.js +5 -0
- package/lib/item/index.js +80 -10
- package/lib/item/isParentIncluded.js +4 -0
- package/lib/item/isRelatedItem.js +4 -0
- package/lib/item/isSelected.js +13 -0
- package/lib/item/openRecommendationDialog.js +4 -0
- package/lib/item/removeModifier.js +84 -0
- package/lib/item/removeModifierById.js +8 -0
- package/lib/item/removeModifiers.js +14 -0
- package/lib/order/addCreditModifier.js +27 -0
- package/lib/order/addDiscountModifier.js +9 -0
- package/lib/order/addItem.js +292 -0
- package/lib/order/addItemModifier.js +214 -0
- package/lib/order/addModifier.js +9 -0
- package/lib/order/addModifierToAllItems.js +16 -0
- package/lib/order/addNote.js +25 -0
- package/lib/order/addTable.js +11 -0
- package/lib/order/calculate.js +51 -16
- package/lib/order/calculateDue.js +15 -0
- package/lib/order/calculateOrdersDue.js +26 -0
- package/lib/order/canSplit.js +4 -0
- package/lib/order/changeEndDate.js +15 -0
- package/lib/order/changeLocation.js +20 -0
- package/lib/order/changeStartDate.js +14 -0
- package/lib/order/combineSubOrders.js +14 -0
- package/lib/order/containsSerial.js +5 -0
- package/lib/order/create.js +67 -0
- package/lib/order/createParent.js +9 -0
- package/lib/order/duplicateItem.js +16 -0
- package/lib/order/findItemIndex.js +6 -0
- package/lib/order/getAppliedCredit.js +5 -0
- package/lib/order/getBalance.js +9 -0
- package/lib/order/getCustomer.js +4 -0
- package/lib/order/getCustomerStoreCredit.js +14 -0
- package/lib/order/getCustomerSubscriptions.js +8 -0
- package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
- package/lib/order/getDepartmentModifiers.js +9 -0
- package/lib/order/getEndDate.js +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 +166 -5
- package/lib/order/isDetailed.js +4 -0
- package/lib/order/isHold.js +4 -0
- package/lib/order/isNew.js +4 -0
- package/lib/order/isOpen.js +4 -0
- package/lib/order/isParent.js +7 -0
- package/lib/order/merge.js +96 -0
- package/lib/order/open.js +11 -0
- package/lib/order/pickEndDate.js +70 -0
- package/lib/order/removeApplyModifier.js +24 -0
- package/lib/order/removeDiscountModifier.js +16 -0
- package/lib/order/removeItem.js +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 +16 -18
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = ({ _, settings, actions, itemActions }) => {
|
|
2
|
+
const orderSettings = _.get(settings, 'order');
|
|
3
|
+
|
|
4
|
+
return function hasAggregate({ order, item }) {
|
|
5
|
+
if (!order || !item) return false;
|
|
6
|
+
if (!orderSettings.aggregateItems || itemActions.isRelatedItem(item))
|
|
7
|
+
return false;
|
|
8
|
+
|
|
9
|
+
// if it has a relatedItem, don't aggregate
|
|
10
|
+
const relatedItems = actions.getRelatedItems({
|
|
11
|
+
order,
|
|
12
|
+
item,
|
|
13
|
+
compareId: false,
|
|
14
|
+
});
|
|
15
|
+
if (relatedItems.length) return false;
|
|
16
|
+
|
|
17
|
+
const sameItems = actions.getSameItems({ item, order });
|
|
18
|
+
return !!sameItems.length;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions }) => {
|
|
2
|
+
const getRemaining = (subscriptions, orderId) => {
|
|
3
|
+
const remaining = subscriptions.reduce((total, subscription) => {
|
|
4
|
+
const {
|
|
5
|
+
numberOfUsesLimit = 0,
|
|
6
|
+
numberOfUses = 0,
|
|
7
|
+
history = {},
|
|
8
|
+
} = subscription;
|
|
9
|
+
const orderHistory = history[orderId] || 0;
|
|
10
|
+
return total + numberOfUsesLimit + orderHistory - numberOfUses;
|
|
11
|
+
}, 0);
|
|
12
|
+
|
|
13
|
+
return remaining;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const getNumberOfUses = (items = [], item = {}) => {
|
|
17
|
+
const siblings = items.filter(
|
|
18
|
+
each =>
|
|
19
|
+
each.serial === item.serial &&
|
|
20
|
+
each.itemId === item.itemId &&
|
|
21
|
+
each._id !== item._id
|
|
22
|
+
);
|
|
23
|
+
const modifiers = siblings.reduce(
|
|
24
|
+
(cur, each) => [
|
|
25
|
+
...cur,
|
|
26
|
+
...modifierActions.getSubscriptionModifiers(each.modifiers),
|
|
27
|
+
],
|
|
28
|
+
[]
|
|
29
|
+
);
|
|
30
|
+
const numberOfUses = modifiers.reduce(
|
|
31
|
+
(sum, each) =>
|
|
32
|
+
sum +
|
|
33
|
+
((each.properties &&
|
|
34
|
+
each.properties.subscription &&
|
|
35
|
+
each.properties.subscription.numberOfUses) ||
|
|
36
|
+
0),
|
|
37
|
+
0
|
|
38
|
+
);
|
|
39
|
+
return numberOfUses;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const getSubscriptions = subscriptions =>
|
|
43
|
+
subscriptions
|
|
44
|
+
.map(each => modifierActions.getSubscriptionItem(each))
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
|
|
47
|
+
return function hasRemainingSubscription({ order, item }) {
|
|
48
|
+
if (!order || !item || !item.itemId) return [false];
|
|
49
|
+
|
|
50
|
+
let subscriptions = actions.getCustomerSubscriptionsByItem({
|
|
51
|
+
customer: order.customer,
|
|
52
|
+
item,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (!subscriptions || !subscriptions.length) return [false];
|
|
56
|
+
|
|
57
|
+
subscriptions = getSubscriptions(subscriptions);
|
|
58
|
+
|
|
59
|
+
const isUnlimited = subscriptions.some(each => !each.numberOfUsesLimit);
|
|
60
|
+
if (isUnlimited) return [true];
|
|
61
|
+
|
|
62
|
+
const remaining = getRemaining(subscriptions, order.parentId || order._id);
|
|
63
|
+
const numberOfUses = getNumberOfUses(order.items, item);
|
|
64
|
+
|
|
65
|
+
return [remaining > numberOfUses, remaining, numberOfUses];
|
|
66
|
+
};
|
|
67
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = ({ constants }) =>
|
|
2
|
+
function holdOrder(order) {
|
|
3
|
+
if (!order) return order;
|
|
4
|
+
return {
|
|
5
|
+
...order,
|
|
6
|
+
status: {
|
|
7
|
+
...(order.status || {}),
|
|
8
|
+
order: constants.status.Order.HOLD,
|
|
9
|
+
},
|
|
10
|
+
// properties: { kitchenOrder: Date.now() },
|
|
11
|
+
};
|
|
12
|
+
};
|
package/lib/order/index.js
CHANGED
|
@@ -1,8 +1,169 @@
|
|
|
1
|
-
const
|
|
1
|
+
const constants = require('../constants');
|
|
2
|
+
//
|
|
3
|
+
const getTotalPieces = require('./getTotalPieces');
|
|
4
|
+
const getStartDate = require('./getStartDate');
|
|
5
|
+
const getBalance = require('./getBalance');
|
|
6
|
+
const getEndDate = require('./getEndDate');
|
|
7
|
+
const isNew = require('./isNew');
|
|
8
|
+
const getSelectedItem = require('./getSelectedItem');
|
|
9
|
+
const updateItem = require('./updateItem');
|
|
10
|
+
const removeItemByIndex = require('./removeItemByIndex');
|
|
11
|
+
const addItem = require('./addItem');
|
|
12
|
+
const duplicateItem = require('./duplicateItem');
|
|
13
|
+
const getCustomer = require('./getCustomer');
|
|
14
|
+
const setCustomer = require('./setCustomer');
|
|
15
|
+
const create = require('./create');
|
|
16
|
+
const updateItemQuantity = require('./updateItemQuantity');
|
|
17
|
+
const getMenuItemsByCustomer = require('./getMenuItemsByCustomer');
|
|
18
|
+
const getPendingItemIndex = require('./getPendingItemIndex');
|
|
19
|
+
const getScreenCustomerNotes = require('./getScreenCustomerNotes');
|
|
20
|
+
const removeItem = require('./removeItem');
|
|
21
|
+
const getSameItems = require('./getSameItems');
|
|
22
|
+
const hasAggregate = require('./hasAggregate');
|
|
23
|
+
const findItemIndex = require('./findItemIndex');
|
|
24
|
+
const changeLocation = require('./changeLocation');
|
|
25
|
+
const addNote = require('./addNote');
|
|
26
|
+
const addTable = require('./addTable');
|
|
27
|
+
const changeEndDate = require('./changeEndDate');
|
|
28
|
+
const changeStartDate = require('./changeStartDate');
|
|
29
|
+
const containsSerial = require('./containsSerial');
|
|
30
|
+
const combineSubOrders = require('./combineSubOrders');
|
|
31
|
+
const calculate = require('./calculate');
|
|
32
|
+
const isParent = require('./isParent');
|
|
33
|
+
const canSplit = require('./canSplit');
|
|
34
|
+
const removeModifier = require('./removeModifier');
|
|
35
|
+
const removeDiscountModifier = require('./removeDiscountModifier');
|
|
36
|
+
const addModifier = require('./addModifier');
|
|
37
|
+
const addDiscountModifier = require('./addDiscountModifier');
|
|
38
|
+
const calculateDue = require('./calculateDue');
|
|
39
|
+
const toggleModifier = require('./toggleModifier');
|
|
40
|
+
const voidOrder = require('./void');
|
|
41
|
+
const holdOrder = require('./hold');
|
|
42
|
+
const openOrder = require('./open');
|
|
43
|
+
const isDetailed = require('./isDetailed');
|
|
44
|
+
const splitByDepartments = require('./splitByDepartments');
|
|
45
|
+
const createParent = require('./createParent');
|
|
46
|
+
const getOrdersPieces = require('./getOrdersPieces');
|
|
47
|
+
const getTotals = require('./getTotals');
|
|
48
|
+
const getDepartmentModifiers = require('./getDepartmentModifiers');
|
|
49
|
+
const getCustomerStoreCredit = require('./getCustomerStoreCredit');
|
|
50
|
+
const getTip = require('./getTip');
|
|
51
|
+
const merge = require('./merge');
|
|
52
|
+
const calculateOrdersDue = require('./calculateOrdersDue');
|
|
53
|
+
const removeModifierByAttribute = require('./removeModifierByAttribute');
|
|
54
|
+
const removeApplyModifier = require('./removeApplyModifier');
|
|
55
|
+
const getCustomerSubscriptions = require('./getCustomerSubscriptions');
|
|
56
|
+
const getCustomerSubscriptionsByItem = require('./getCustomerSubscriptionsByItem');
|
|
57
|
+
const hasRemainingSubscription = require('./hasRemainingSubscription');
|
|
58
|
+
const removeModifiersWithPaymentMethods = require('./removeModifiersWithPaymentMethods');
|
|
59
|
+
const removeModifiersWithPaymentTypes = require('./removeModifiersWithPaymentTypes');
|
|
60
|
+
const getItemsToPay = require('./getItemsToPay');
|
|
61
|
+
const hasItem = require('./hasItem');
|
|
62
|
+
const getNumberOfItems = require('./getNumberOfItems');
|
|
63
|
+
const isOpen = require('./isOpen');
|
|
64
|
+
const isHold = require('./isHold');
|
|
65
|
+
const addItemModifier = require('./addItemModifier');
|
|
66
|
+
const removeItemModifier = require('./removeItemModifier');
|
|
67
|
+
const addModifierToAllItems = require('./addModifierToAllItems');
|
|
68
|
+
const getItemIndex = require('./getItemIndex');
|
|
69
|
+
const getRelatedItems = require('./getRelatedItems');
|
|
70
|
+
const getItemByItemId = require('./getItemByItemId');
|
|
71
|
+
const getScheduleByCustomer = require('./getScheduleByCustomer');
|
|
72
|
+
const pickEndDate = require('./pickEndDate');
|
|
73
|
+
const getAppliedCredit = require('./getAppliedCredit');
|
|
74
|
+
const addCreditModifier = require('./addCreditModifier');
|
|
2
75
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
76
|
+
const orderActions = (deps = {}) => {
|
|
77
|
+
const actions = {};
|
|
78
|
+
|
|
79
|
+
const innerDeps = {
|
|
80
|
+
...deps,
|
|
81
|
+
constants,
|
|
82
|
+
actions,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const freezedActions = Object.freeze({
|
|
86
|
+
constants,
|
|
87
|
+
getItemByItemId: getItemByItemId(innerDeps),
|
|
88
|
+
getTotalPieces: getTotalPieces(innerDeps),
|
|
89
|
+
getStartDate: getStartDate(innerDeps),
|
|
90
|
+
getEndDate: getEndDate(innerDeps),
|
|
91
|
+
isNew: isNew(innerDeps),
|
|
92
|
+
getSelectedItem: getSelectedItem(innerDeps),
|
|
93
|
+
updateItem: updateItem(innerDeps),
|
|
94
|
+
removeItemByIndex: removeItemByIndex(innerDeps),
|
|
95
|
+
addItem: addItem(innerDeps),
|
|
96
|
+
duplicateItem: duplicateItem(innerDeps),
|
|
97
|
+
getCustomer: getCustomer(innerDeps),
|
|
98
|
+
setCustomer: setCustomer(innerDeps),
|
|
99
|
+
create: create(innerDeps),
|
|
100
|
+
updateItemQuantity: updateItemQuantity(innerDeps),
|
|
101
|
+
getMenuItemsByCustomer: getMenuItemsByCustomer(innerDeps),
|
|
102
|
+
getPendingItemIndex: getPendingItemIndex(innerDeps),
|
|
103
|
+
getScreenCustomerNotes: getScreenCustomerNotes(innerDeps),
|
|
104
|
+
removeItem: removeItem(innerDeps),
|
|
105
|
+
getSameItems: getSameItems(innerDeps),
|
|
106
|
+
hasAggregate: hasAggregate(innerDeps),
|
|
107
|
+
findItemIndex: findItemIndex(innerDeps),
|
|
108
|
+
changeLocation: changeLocation(innerDeps),
|
|
109
|
+
addNote: addNote(innerDeps),
|
|
110
|
+
addTable: addTable(innerDeps),
|
|
111
|
+
changeEndDate: changeEndDate(innerDeps),
|
|
112
|
+
changeStartDate: changeStartDate(innerDeps),
|
|
113
|
+
containsSerial: containsSerial(innerDeps),
|
|
114
|
+
combineSubOrders: combineSubOrders(innerDeps),
|
|
115
|
+
calculate: calculate(innerDeps),
|
|
116
|
+
isParent: isParent(innerDeps),
|
|
117
|
+
canSplit: canSplit(innerDeps),
|
|
118
|
+
removeModifier: removeModifier(innerDeps),
|
|
119
|
+
removeDiscountModifier: removeDiscountModifier(innerDeps),
|
|
120
|
+
addModifier: addModifier(innerDeps),
|
|
121
|
+
addDiscountModifier: addDiscountModifier(innerDeps),
|
|
122
|
+
calculateDue: calculateDue(innerDeps),
|
|
123
|
+
toggleModifier: toggleModifier(innerDeps),
|
|
124
|
+
voidOrder: voidOrder(innerDeps),
|
|
125
|
+
holdOrder: holdOrder(innerDeps),
|
|
126
|
+
openOrder: openOrder(innerDeps),
|
|
127
|
+
isDetailed: isDetailed(innerDeps),
|
|
128
|
+
splitByDepartments: splitByDepartments(innerDeps),
|
|
129
|
+
createParent: createParent(innerDeps),
|
|
130
|
+
getOrdersPieces: getOrdersPieces(innerDeps),
|
|
131
|
+
getTotals: getTotals(innerDeps),
|
|
132
|
+
getBalance: getBalance(innerDeps),
|
|
133
|
+
getDepartmentModifiers: getDepartmentModifiers(innerDeps),
|
|
134
|
+
getCustomerStoreCredit: getCustomerStoreCredit(innerDeps),
|
|
135
|
+
getTip: getTip(innerDeps),
|
|
136
|
+
merge: merge(innerDeps),
|
|
137
|
+
calculateOrdersDue: calculateOrdersDue(innerDeps),
|
|
138
|
+
removeModifierByAttribute: removeModifierByAttribute(innerDeps),
|
|
139
|
+
removeApplyModifier: removeApplyModifier(innerDeps),
|
|
140
|
+
getCustomerSubscriptions: getCustomerSubscriptions(innerDeps),
|
|
141
|
+
getCustomerSubscriptionsByItem: getCustomerSubscriptionsByItem(innerDeps),
|
|
142
|
+
hasRemainingSubscription: hasRemainingSubscription(innerDeps),
|
|
143
|
+
removeModifiersWithPaymentMethods:
|
|
144
|
+
removeModifiersWithPaymentMethods(innerDeps),
|
|
145
|
+
removeModifiersWithPaymentTypes: removeModifiersWithPaymentTypes(innerDeps),
|
|
146
|
+
hasItem: hasItem(innerDeps),
|
|
147
|
+
getNumberOfItems: getNumberOfItems(innerDeps),
|
|
148
|
+
isOpen: isOpen(innerDeps),
|
|
149
|
+
isHold: isHold(innerDeps),
|
|
150
|
+
getItemsToPay: getItemsToPay(innerDeps),
|
|
151
|
+
addItemModifier: addItemModifier(innerDeps),
|
|
152
|
+
removeItemModifier: removeItemModifier(innerDeps),
|
|
153
|
+
addModifierToAllItems: addModifierToAllItems(innerDeps),
|
|
154
|
+
getItemIndex: getItemIndex(innerDeps),
|
|
155
|
+
getRelatedItems: getRelatedItems(innerDeps),
|
|
156
|
+
getScheduleByCustomer: getScheduleByCustomer(innerDeps),
|
|
157
|
+
pickEndDate: pickEndDate(innerDeps),
|
|
158
|
+
getAppliedCredit: getAppliedCredit(innerDeps),
|
|
159
|
+
addCreditModifier: addCreditModifier(innerDeps),
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
Object.keys(freezedActions).forEach(actionName => {
|
|
163
|
+
actions[actionName] = freezedActions[actionName];
|
|
7
164
|
});
|
|
165
|
+
|
|
166
|
+
return freezedActions;
|
|
8
167
|
};
|
|
168
|
+
|
|
169
|
+
module.exports = orderActions;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module.exports = ({ _, actions, utils }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
|
|
4
|
+
const isAggregatableItems = (first, second) => {
|
|
5
|
+
if (
|
|
6
|
+
first.itemId !== second.itemId ||
|
|
7
|
+
first.price !== second.price ||
|
|
8
|
+
first.description !== second.description ||
|
|
9
|
+
(first.modifiers && !second.modifiers) ||
|
|
10
|
+
(!first.modifiers && second.modifiers) ||
|
|
11
|
+
first.modifiers.length !== second.modifiers.length
|
|
12
|
+
) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
let hasInvalidModifier = false;
|
|
16
|
+
first.modifiers.forEach(modifier => {
|
|
17
|
+
if (!second.modifiers.find(mod => mod._id === modifier._id)) {
|
|
18
|
+
hasInvalidModifier = true;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return !hasInvalidModifier;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// return: [Order, Order, Array<Order>]
|
|
26
|
+
return function merge({ orders, subOrdersToMerge, aggregateItems, user }) {
|
|
27
|
+
const items = orders.reduce((res, order) => res.concat(order.items), []);
|
|
28
|
+
let newOrder = null;
|
|
29
|
+
// Unique Orders
|
|
30
|
+
const mOrders = _.uniqBy(orders, '_id');
|
|
31
|
+
if (aggregateItems) {
|
|
32
|
+
const newItems = [];
|
|
33
|
+
items.forEach(item => {
|
|
34
|
+
const repeatedItem = newItems.find(each =>
|
|
35
|
+
isAggregatableItems(each, item)
|
|
36
|
+
);
|
|
37
|
+
if (repeatedItem) {
|
|
38
|
+
repeatedItem.quantity = math.add(
|
|
39
|
+
repeatedItem.quantity,
|
|
40
|
+
item.quantity
|
|
41
|
+
);
|
|
42
|
+
} else {
|
|
43
|
+
newItems.push({ ...item });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
newOrder = {
|
|
47
|
+
...mOrders[0],
|
|
48
|
+
items: newItems,
|
|
49
|
+
};
|
|
50
|
+
} else {
|
|
51
|
+
newOrder = {
|
|
52
|
+
...mOrders[0],
|
|
53
|
+
items,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
newOrder = actions.calculate(newOrder);
|
|
58
|
+
newOrder = actions.addNote({
|
|
59
|
+
order: newOrder,
|
|
60
|
+
message: `This order was merged with ${
|
|
61
|
+
mOrders.length === 2 ? ` order ` : ` orders `
|
|
62
|
+
} # ${mOrders.slice(1).map(order => ` ${order.displayId}`)}`,
|
|
63
|
+
user,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const ordersToDelete = [];
|
|
67
|
+
const voidedOrders = [];
|
|
68
|
+
for (let i = 1; i < mOrders.length; i += 1) {
|
|
69
|
+
if (mOrders[i] && mOrders[i].parentId) {
|
|
70
|
+
ordersToDelete.push(mOrders[i]);
|
|
71
|
+
} else {
|
|
72
|
+
let voidedOrder = actions.voidOrder(mOrders[i]);
|
|
73
|
+
if (!voidedOrder) return null;
|
|
74
|
+
voidedOrder.isParent = false;
|
|
75
|
+
voidedOrder = actions.addNote({
|
|
76
|
+
order: voidedOrder,
|
|
77
|
+
message: `This order was merged into order #${mOrders[i].displayId}`,
|
|
78
|
+
user,
|
|
79
|
+
});
|
|
80
|
+
voidedOrders.push(voidedOrder);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let subOrders = [];
|
|
85
|
+
if (newOrder && subOrdersToMerge && subOrdersToMerge.length > 0) {
|
|
86
|
+
subOrders = subOrdersToMerge.map((s, index) => ({
|
|
87
|
+
...s,
|
|
88
|
+
displayId: `${newOrder.displayId || ''}-${index + 1}`,
|
|
89
|
+
parentId: newOrder._id,
|
|
90
|
+
customer: newOrder.customer,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return [newOrder, voidedOrders, ordersToDelete, subOrders];
|
|
95
|
+
};
|
|
96
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module.exports = ({ settings, _, moment }) => {
|
|
2
|
+
const timezone = _.get(settings, 'localization.timezone', 'America/New_York');
|
|
3
|
+
const isInSchedule = (each, date) => {
|
|
4
|
+
const isoWeekday = moment(date).tz(timezone).isoWeekday();
|
|
5
|
+
let check = false;
|
|
6
|
+
if (each.day !== undefined && each.day !== null)
|
|
7
|
+
check = String(each.day) === String(isoWeekday === 7 ? 0 : isoWeekday);
|
|
8
|
+
|
|
9
|
+
if (each.date)
|
|
10
|
+
check =
|
|
11
|
+
moment(date).startOf('day').tz(timezone).format('YYYYMMDD') ===
|
|
12
|
+
moment(each.date).startOf('day').tz(timezone).format('YYYYMMDD');
|
|
13
|
+
return check;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const checkStoreSchedule = date => {
|
|
17
|
+
const schedule = _.get(settings, 'schedule', {});
|
|
18
|
+
const { close = [] } = schedule;
|
|
19
|
+
|
|
20
|
+
if (close.length) return !close.find(each => isInSchedule(each, date));
|
|
21
|
+
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
return function pickEndDate(schedule = {}, skip = 0, date = undefined) {
|
|
25
|
+
const {
|
|
26
|
+
addDays = 1,
|
|
27
|
+
hour,
|
|
28
|
+
minute,
|
|
29
|
+
skipDays = [],
|
|
30
|
+
cutHour,
|
|
31
|
+
cutDay = 1,
|
|
32
|
+
} = schedule;
|
|
33
|
+
let days = skip || Number(addDays);
|
|
34
|
+
|
|
35
|
+
const todayTimezone = moment().tz(timezone);
|
|
36
|
+
const dateTimezone = date || todayTimezone;
|
|
37
|
+
|
|
38
|
+
if (
|
|
39
|
+
!skip &&
|
|
40
|
+
!date &&
|
|
41
|
+
cutHour &&
|
|
42
|
+
todayTimezone.isAfter(moment(schedule.cutHour, 'hh:mm:ss').tz(timezone))
|
|
43
|
+
) {
|
|
44
|
+
console.log('cut day applied');
|
|
45
|
+
days += cutDay;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const endDate = dateTimezone.add(Number(days), 'days');
|
|
49
|
+
console.log('check date => ', endDate.format());
|
|
50
|
+
|
|
51
|
+
const isoWeekday = endDate.isoWeekday();
|
|
52
|
+
console.log('isoWeekday => ', isoWeekday);
|
|
53
|
+
|
|
54
|
+
if (skipDays && skipDays.includes(isoWeekday === 7 ? 0 : isoWeekday)) {
|
|
55
|
+
console.log('check next day: in Skip days');
|
|
56
|
+
return pickEndDate(schedule, 1, endDate);
|
|
57
|
+
}
|
|
58
|
+
if (!checkStoreSchedule(endDate)) {
|
|
59
|
+
console.log('check next day: in Close days');
|
|
60
|
+
return pickEndDate(schedule, 1, endDate);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (hour !== undefined) endDate.set('hour', hour);
|
|
64
|
+
if (minute !== undefined) endDate.set('minute', minute);
|
|
65
|
+
endDate.set('second', 0);
|
|
66
|
+
|
|
67
|
+
console.log('final date in local', endDate.format());
|
|
68
|
+
return moment.utc(endDate).format();
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function removeApplyModifier({
|
|
3
|
+
order,
|
|
4
|
+
attribute,
|
|
5
|
+
modifier,
|
|
6
|
+
applyItems = true,
|
|
7
|
+
}) {
|
|
8
|
+
if (!order) return order;
|
|
9
|
+
let newOrder = { ...order };
|
|
10
|
+
|
|
11
|
+
if (attribute) {
|
|
12
|
+
newOrder = actions.removeModifierByAttribute({
|
|
13
|
+
order,
|
|
14
|
+
attribute,
|
|
15
|
+
applyItems,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (modifier) {
|
|
20
|
+
newOrder = actions.addModifier({ order: newOrder, modifier });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return newOrder;
|
|
24
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, itemActions }) =>
|
|
2
|
+
function removeDiscountModifiers(order) {
|
|
3
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
let { modifiers, items } = nextOrder;
|
|
6
|
+
const discountModifiers = modifiers.filter(modifierActions.isDiscount);
|
|
7
|
+
modifiers = modifiers.filter(each => !modifierActions.isDiscount(each));
|
|
8
|
+
if (items)
|
|
9
|
+
items = items.map(each =>
|
|
10
|
+
itemActions.removeModifiers({
|
|
11
|
+
item: each,
|
|
12
|
+
modifiers: discountModifiers,
|
|
13
|
+
})
|
|
14
|
+
);
|
|
15
|
+
return { ...order, modifiers, items };
|
|
16
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module.exports = ({ actions, _, itemActions }) => {
|
|
2
|
+
const updateRelatedItems = (items, parentId) => {
|
|
3
|
+
return items.map(each => {
|
|
4
|
+
const item = { ...each };
|
|
5
|
+
if (item.properties && item.properties.parentId === parentId)
|
|
6
|
+
item.properties.includeParent = false;
|
|
7
|
+
return item;
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
return function removeItem({ order, item, checkQuantity, hard = true }) {
|
|
12
|
+
if (!item) return order;
|
|
13
|
+
|
|
14
|
+
const orderItemIdx = actions.getItemIndex({ order, item });
|
|
15
|
+
if (orderItemIdx < 0) return order;
|
|
16
|
+
|
|
17
|
+
let { items } = order;
|
|
18
|
+
const orderItem = items[orderItemIdx];
|
|
19
|
+
const relatedItems = actions.getRelatedItems({ order, item });
|
|
20
|
+
const hasRelatedItem = !_.isEmpty(relatedItems);
|
|
21
|
+
|
|
22
|
+
if (!hard || hasRelatedItem) {
|
|
23
|
+
items[orderItemIdx] = { ...orderItem, price: 0, modifiers: [] };
|
|
24
|
+
if (hasRelatedItem) {
|
|
25
|
+
items = updateRelatedItems(items, item._id);
|
|
26
|
+
// console.log('Update related items ...', items);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Decrease the quantity
|
|
30
|
+
else if (
|
|
31
|
+
checkQuantity &&
|
|
32
|
+
items[orderItemIdx] &&
|
|
33
|
+
items[orderItemIdx].quantity > 1
|
|
34
|
+
)
|
|
35
|
+
items[orderItemIdx] = { ...orderItem, quantity: orderItem.quantity - 1 };
|
|
36
|
+
// Remove
|
|
37
|
+
else items.splice(orderItemIdx, 1);
|
|
38
|
+
|
|
39
|
+
// if it is the last relatedItem
|
|
40
|
+
if (
|
|
41
|
+
itemActions.isRelatedItem(item) &&
|
|
42
|
+
!itemActions.isParentIncluded(item)
|
|
43
|
+
) {
|
|
44
|
+
const parent = itemActions.getParentItem(items, orderItem);
|
|
45
|
+
const parentIndex = actions.getItemIndex({ order, item: parent });
|
|
46
|
+
const siblings = actions.getRelatedItems({ order, item: parent });
|
|
47
|
+
// console.log('Removing parent item ...');
|
|
48
|
+
if (siblings <= 1) items.splice(parentIndex, 1);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
...order,
|
|
53
|
+
items,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions, itemActions, 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 removeModifier = ({ item, modifier, originalItem }) => {
|
|
13
|
+
const nextItem = { ...item, modifiers: [] };
|
|
14
|
+
|
|
15
|
+
nextItem.modifiers = item.modifiers.filter(
|
|
16
|
+
each => (each.modifierId || each._id) !== modifier._id
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
if (modifierActions.isAmountOverride(modifier))
|
|
20
|
+
return {
|
|
21
|
+
...originalItem,
|
|
22
|
+
...nextItem,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
if (modifierActions.isPriceOverride(modifier))
|
|
26
|
+
nextItem.price = getPrice({ modifier, item: nextItem });
|
|
27
|
+
|
|
28
|
+
if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
|
|
29
|
+
|
|
30
|
+
return nextItem;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return function removeItemModifier({
|
|
34
|
+
order: orderProp,
|
|
35
|
+
modifier,
|
|
36
|
+
itemIndex,
|
|
37
|
+
cache,
|
|
38
|
+
}) {
|
|
39
|
+
const order = _.cloneDeep(orderProp);
|
|
40
|
+
if (!order || itemIndex < 0 || !modifier) return order;
|
|
41
|
+
|
|
42
|
+
let item = actions.getSelectedItem({ order, itemIndex });
|
|
43
|
+
const customer = actions.getCustomer(order);
|
|
44
|
+
const originalItem = cache.items.find(_item => _item._id === item.itemId);
|
|
45
|
+
const contains = modifierActions.contains(item.modifiers, modifier);
|
|
46
|
+
|
|
47
|
+
if (!contains) return order;
|
|
48
|
+
if (
|
|
49
|
+
modifierActions.isGroupOfValues(modifier) ||
|
|
50
|
+
modifierActions.isRequiredAndOverride(modifier)
|
|
51
|
+
)
|
|
52
|
+
return order;
|
|
53
|
+
|
|
54
|
+
// Remove
|
|
55
|
+
item = removeModifier({
|
|
56
|
+
item,
|
|
57
|
+
modifier,
|
|
58
|
+
originalItem,
|
|
59
|
+
});
|
|
60
|
+
item.price = itemActions.getItemPrice({
|
|
61
|
+
item,
|
|
62
|
+
cache,
|
|
63
|
+
customer,
|
|
64
|
+
});
|
|
65
|
+
order.items[itemIndex] = item;
|
|
66
|
+
|
|
67
|
+
return order;
|
|
68
|
+
};
|
|
69
|
+
};
|