@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.
Files changed (123) hide show
  1. package/.eslintrc +22 -0
  2. package/README.md +110 -4
  3. package/__TEST__/item.test.js +285 -0
  4. package/__TEST__/order.test.js +234 -0
  5. package/index.js +1 -0
  6. package/lib/constants/index.js +5 -0
  7. package/lib/constants/status.js +39 -0
  8. package/lib/index.js +36 -9
  9. package/lib/item/addIndirectModifier.js +55 -0
  10. package/lib/item/calculate.js +108 -0
  11. package/lib/item/create.js +35 -0
  12. package/lib/item/filterByDirectModifiers.js +13 -0
  13. package/lib/item/findOriginalItem.js +8 -0
  14. package/lib/item/getBalanceToPay.js +12 -0
  15. package/lib/item/getDepartmentModifiers.js +5 -0
  16. package/lib/item/getDiscountModifiers.js +7 -0
  17. package/lib/item/getItemModifiers.js +16 -0
  18. package/lib/item/getItemModifiersDescription.js +22 -0
  19. package/lib/item/getItemPrice.js +57 -0
  20. package/lib/item/getItemsTotalPaid.js +9 -0
  21. package/lib/item/getItemsTotalPieces.js +7 -0
  22. package/lib/item/getNotIncludedModifiers.js +11 -0
  23. package/lib/item/getParentItem.js +5 -0
  24. package/lib/item/getPendingIndex.js +5 -0
  25. package/lib/item/getTotal.js +8 -0
  26. package/lib/item/getTotalPieces.js +7 -0
  27. package/lib/item/getTotals.js +25 -0
  28. package/lib/item/hasCreateSubscription.js +7 -0
  29. package/lib/item/hasModifier.js +15 -0
  30. package/lib/item/hasModifierWithValue.js +11 -0
  31. package/lib/item/hasModifiers.js +9 -0
  32. package/lib/item/hasSubscription.js +5 -0
  33. package/lib/item/index.js +80 -4
  34. package/lib/item/isParentIncluded.js +4 -0
  35. package/lib/item/isRelatedItem.js +4 -0
  36. package/lib/item/isSelected.js +13 -0
  37. package/lib/item/openRecommendationDialog.js +4 -0
  38. package/lib/item/removeModifier.js +84 -0
  39. package/lib/item/removeModifierById.js +8 -0
  40. package/lib/item/removeModifiers.js +14 -0
  41. package/lib/order/addCreditModifier.js +27 -0
  42. package/lib/order/addDiscountModifier.js +9 -0
  43. package/lib/order/addItem.js +292 -0
  44. package/lib/order/addItemModifier.js +214 -0
  45. package/lib/order/addModifier.js +9 -0
  46. package/lib/order/addModifierToAllItems.js +16 -0
  47. package/lib/order/addNote.js +25 -0
  48. package/lib/order/addTable.js +11 -0
  49. package/lib/order/calculate.js +105 -0
  50. package/lib/order/calculateDue.js +15 -0
  51. package/lib/order/calculateOrdersDue.js +26 -0
  52. package/lib/order/canSplit.js +4 -0
  53. package/lib/order/changeEndDate.js +15 -0
  54. package/lib/order/changeLocation.js +20 -0
  55. package/lib/order/changeStartDate.js +14 -0
  56. package/lib/order/combineSubOrders.js +14 -0
  57. package/lib/order/containsSerial.js +5 -0
  58. package/lib/order/create.js +67 -0
  59. package/lib/order/createParent.js +9 -0
  60. package/lib/order/duplicateItem.js +16 -0
  61. package/lib/order/findItemIndex.js +6 -0
  62. package/lib/order/getAppliedCredit.js +5 -0
  63. package/lib/order/getBalance.js +9 -0
  64. package/lib/order/getCustomer.js +4 -0
  65. package/lib/order/getCustomerStoreCredit.js +14 -0
  66. package/lib/order/getCustomerSubscriptions.js +8 -0
  67. package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
  68. package/lib/order/getDepartmentModifiers.js +9 -0
  69. package/lib/order/getEndDate.js +6 -0
  70. package/lib/order/getItemByItemId.js +6 -0
  71. package/lib/order/getItemIndex.js +9 -0
  72. package/lib/order/getItemsToPay.js +17 -0
  73. package/lib/order/getMenuItemsByCustomer.js +19 -0
  74. package/lib/order/getNumberOfItems.js +12 -0
  75. package/lib/order/getOrdersPieces.js +10 -0
  76. package/lib/order/getPendingItemIndex.js +5 -0
  77. package/lib/order/getRelatedItems.js +11 -0
  78. package/lib/order/getSameItems.js +14 -0
  79. package/lib/order/getScheduleByCustomer.js +20 -0
  80. package/lib/order/getScreenCustomerNotes.js +12 -0
  81. package/lib/order/getSelectedItem.js +6 -0
  82. package/lib/order/getStartDate.js +4 -0
  83. package/lib/order/getTip.js +10 -0
  84. package/lib/order/getTotalPieces.js +17 -0
  85. package/lib/order/getTotals.js +28 -0
  86. package/lib/order/hasAggregate.js +20 -0
  87. package/lib/order/hasItem.js +7 -0
  88. package/lib/order/hasRemainingSubscription.js +67 -0
  89. package/lib/order/hold.js +12 -0
  90. package/lib/order/index.js +167 -4
  91. package/lib/order/isDetailed.js +4 -0
  92. package/lib/order/isHold.js +4 -0
  93. package/lib/order/isNew.js +4 -0
  94. package/lib/order/isOpen.js +4 -0
  95. package/lib/order/isParent.js +7 -0
  96. package/lib/order/merge.js +96 -0
  97. package/lib/order/open.js +11 -0
  98. package/lib/order/pickEndDate.js +70 -0
  99. package/lib/order/removeApplyModifier.js +24 -0
  100. package/lib/order/removeDiscountModifier.js +16 -0
  101. package/lib/order/removeItem.js +56 -0
  102. package/lib/order/removeItemByIndex.js +5 -0
  103. package/lib/order/removeItemModifier.js +69 -0
  104. package/lib/order/removeModifier.js +21 -0
  105. package/lib/order/removeModifierByAttribute.js +23 -0
  106. package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
  107. package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
  108. package/lib/order/setCustomer.js +50 -0
  109. package/lib/order/splitByDepartments.js +151 -0
  110. package/lib/order/toggleModifier.js +9 -0
  111. package/lib/order/updateItem.js +8 -0
  112. package/lib/order/updateItemQuantity.js +35 -0
  113. package/lib/order/void.js +11 -0
  114. package/package.json +20 -23
  115. package/lib/item/actions.js +0 -135
  116. package/lib/modifier/actions.js +0 -163
  117. package/lib/modifier/constants.js +0 -46
  118. package/lib/modifier/index.js +0 -8
  119. package/lib/order/actions.js +0 -47
  120. package/lib/utils/defaultPrices.js +0 -10
  121. package/lib/utils/helpers.js +0 -26
  122. package/lib/utils/index.js +0 -9
  123. package/lib/utils/math.js +0 -71
@@ -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,7 @@
1
+ module.exports = () =>
2
+ function hasItem({ order, item }) {
3
+ if (!order || !item) return -1;
4
+ const { items = [] } = order;
5
+
6
+ return !!items.find(each => each.itemId === item._id);
7
+ };
@@ -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
+ };
@@ -1,6 +1,169 @@
1
- const { filterExports } = require('../utils');
2
- const actions = require('./actions');
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');
3
75
 
4
- module.exports = {
5
- actions: filterExports(actions),
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];
164
+ });
165
+
166
+ return freezedActions;
6
167
  };
168
+
169
+ module.exports = orderActions;
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isDetailed(order) {
3
+ return !!(order && Array.isArray(order.items) && order.items.length);
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isHold(order) {
3
+ return !!(order && order.status && order.status.order === 'hold');
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isNew(order) {
3
+ return !!(order && order.isOrderNew);
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isOpen(order) {
3
+ return !!(order && order.status && order.status.order === 'open');
4
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = () =>
2
+ function isParent(order) {
3
+ return !!(
4
+ order &&
5
+ ((order.items && order.items.length === 0) || order.isParent)
6
+ );
7
+ };
@@ -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,11 @@
1
+ module.exports = ({ constants }) =>
2
+ function openOrder(order) {
3
+ if (!order) return order;
4
+ return {
5
+ ...order,
6
+ status: {
7
+ ...(order.status || {}),
8
+ order: constants.status.Order.OPEN,
9
+ },
10
+ };
11
+ };
@@ -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,5 @@
1
+ module.exports = ({ actions }) =>
2
+ function removeItemByIndex({ order, itemIndex }) {
3
+ if (!order || !order.items || itemIndex < 0) return order;
4
+ return actions.removeItem({ order, item: order.items[itemIndex] });
5
+ };
@@ -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
+ };