@darkpos/pricing 1.0.5 → 1.0.8

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 (242) hide show
  1. package/.eslintrc +8 -10
  2. package/__TEST__/item.test.js +137 -99
  3. package/__TEST__/modifier/calculate.test.js +73 -0
  4. package/__TEST__/modifier/getAvailablePromotionsOrSubscriptions.test.js +81 -0
  5. package/__TEST__/modifier/getMatchTagsModifiers.test.js +109 -0
  6. package/__TEST__/modifier/getModifierIndex.test.js +40 -0
  7. package/__TEST__/modifier/getRecommendedModifiers.test.js +17 -0
  8. package/__TEST__/modifier/hasAllTags.test.js +25 -0
  9. package/__TEST__/modifier/hasAttribute.test.js +47 -0
  10. package/__TEST__/modifier/hasMatchTags.test.js +56 -0
  11. package/__TEST__/modifier/hasNoTags.test.js +21 -0
  12. package/__TEST__/modifier/mocks/toggleModifier_no1.json +13440 -0
  13. package/__TEST__/modifier/mocks/toggleModifier_no2.json +13438 -0
  14. package/__TEST__/modifier/mocks/toggleModifier_no3.json +13598 -0
  15. package/__TEST__/modifier/sort.test.js +41 -0
  16. package/__TEST__/order.test.js +50 -37
  17. package/index.js +1 -25
  18. package/lib/constants/Modifier/Attributes.js +9 -0
  19. package/lib/constants/Modifier/Compute.js +15 -0
  20. package/lib/constants/Modifier/Types.js +7 -0
  21. package/lib/constants/Modifier/index.js +9 -0
  22. package/lib/constants/Status.js +39 -0
  23. package/lib/constants/index.js +7 -0
  24. package/lib/constants/status.js +39 -0
  25. package/lib/index.js +38 -0
  26. package/lib/item/addIndirectModifier.js +34 -17
  27. package/lib/item/calculate.js +41 -19
  28. package/lib/item/create.js +35 -0
  29. package/lib/item/filterByDirectModifiers.js +5 -6
  30. package/lib/item/findOriginalItem.js +8 -0
  31. package/lib/item/getBalanceToPay.js +12 -0
  32. package/lib/item/getDepartmentModifiers.js +5 -0
  33. package/lib/item/getDiscountModifiers.js +7 -0
  34. package/lib/item/getItemModifiers.js +16 -0
  35. package/lib/item/getItemModifiersDescription.js +22 -0
  36. package/lib/item/getItemPrice.js +57 -0
  37. package/lib/item/getItemsTotalPaid.js +9 -0
  38. package/lib/item/getItemsTotalPieces.js +7 -0
  39. package/lib/item/getNotIncludedModifiers.js +11 -0
  40. package/lib/item/getParentItem.js +5 -0
  41. package/lib/item/getPendingIndex.js +5 -0
  42. package/lib/item/getTotal.js +8 -0
  43. package/lib/item/getTotalPieces.js +7 -0
  44. package/lib/item/getTotals.js +25 -0
  45. package/lib/item/hasCreateSubscription.js +7 -0
  46. package/lib/item/hasModifier.js +15 -0
  47. package/lib/item/hasModifierWithValue.js +11 -0
  48. package/lib/item/hasModifiers.js +9 -0
  49. package/lib/item/hasSubscription.js +5 -0
  50. package/lib/item/index.js +80 -10
  51. package/lib/item/isParentIncluded.js +4 -0
  52. package/lib/item/isRelatedItem.js +4 -0
  53. package/lib/item/isSelected.js +13 -0
  54. package/lib/item/openRecommendationDialog.js +4 -0
  55. package/lib/item/removeModifier.js +84 -0
  56. package/lib/item/removeModifierById.js +8 -0
  57. package/lib/item/removeModifiers.js +14 -0
  58. package/lib/modifier/addFile.js +19 -0
  59. package/lib/modifier/addImage.js +18 -0
  60. package/lib/modifier/calculate.js +43 -0
  61. package/lib/modifier/contains.js +5 -0
  62. package/lib/modifier/convertMenuModifiers.js +5 -0
  63. package/lib/modifier/create.js +44 -0
  64. package/lib/modifier/createAmountOverrideModifier.js +20 -0
  65. package/lib/modifier/createCreditModifier.js +32 -0
  66. package/lib/modifier/createDiscountModifier.js +25 -0
  67. package/lib/modifier/createGroupValuesModifier.js +29 -0
  68. package/lib/modifier/createIndirectModifier.js +42 -0
  69. package/lib/modifier/createSubscriptionModifier.js +19 -0
  70. package/lib/modifier/displayAsCard.js +9 -0
  71. package/lib/modifier/displayAsChips.js +9 -0
  72. package/lib/modifier/displayAsList.js +9 -0
  73. package/lib/modifier/duplicate.js +12 -0
  74. package/lib/modifier/enableAutoPopup.js +9 -0
  75. package/lib/modifier/filterByRequiredModifiers.js +4 -0
  76. package/lib/modifier/findById.js +7 -0
  77. package/lib/modifier/findByPaymentMethod.js +10 -0
  78. package/lib/modifier/findByPaymentType.js +10 -0
  79. package/lib/modifier/getAvailablePromotions.js +5 -0
  80. package/lib/modifier/getAvailablePromotionsOrSubscriptions.js +15 -0
  81. package/lib/modifier/getAvailableSubscriptions.js +5 -0
  82. package/lib/modifier/getByAttribute.js +6 -0
  83. package/lib/modifier/getCreditModifier.js +6 -0
  84. package/lib/modifier/getDefaultModifiers.js +4 -0
  85. package/lib/modifier/getDepartmentMaxItems.js +10 -0
  86. package/lib/modifier/getDepartmentModifiers.js +11 -0
  87. package/lib/modifier/getDescription.js +6 -0
  88. package/lib/modifier/getDescriptions.js +9 -0
  89. package/lib/modifier/getDirectModifiers.js +5 -0
  90. package/lib/modifier/getDiscountModifiers.js +7 -0
  91. package/lib/modifier/getEntityModifiers.js +11 -0
  92. package/lib/modifier/getEntityPromotions.js +11 -0
  93. package/lib/modifier/getExtendedTags.js +14 -0
  94. package/lib/modifier/getFiles.js +5 -0
  95. package/lib/modifier/getGroupModifiers.js +9 -0
  96. package/lib/modifier/getGroupOfItemsModifiers.js +4 -0
  97. package/lib/modifier/getGroupRelatedModifiers.js +26 -0
  98. package/lib/modifier/getImages.js +5 -0
  99. package/lib/modifier/getInheritedModifiers.js +30 -0
  100. package/lib/modifier/getItemModifiers.js +39 -0
  101. package/lib/modifier/getLaundryModifiers.js +9 -0
  102. package/lib/modifier/getMatchTagsModifiers.js +9 -0
  103. package/lib/modifier/getModifierIndex.js +14 -0
  104. package/lib/modifier/getPreferences.js +24 -0
  105. package/lib/modifier/getPromotionModifiers.js +5 -0
  106. package/lib/modifier/getPromptMessage.js +6 -0
  107. package/lib/modifier/getProperty.js +11 -0
  108. package/lib/modifier/getRecommendedModifiers.js +7 -0
  109. package/lib/modifier/getRelatedModifiers.js +10 -0
  110. package/lib/modifier/getRequiredModifiers.js +4 -0
  111. package/lib/modifier/getSelectedValues.js +7 -0
  112. package/lib/modifier/getService.js +5 -0
  113. package/lib/modifier/getSplittedModifiers.js +30 -0
  114. package/lib/modifier/getStarchModifier.js +9 -0
  115. package/lib/modifier/getSubscriptionItem.js +12 -0
  116. package/lib/modifier/getSubscriptionModifiers.js +5 -0
  117. package/lib/modifier/getSuggestion.js +9 -0
  118. package/lib/modifier/getUnhiddenModifiers.js +9 -0
  119. package/lib/modifier/getUsingCount.js +11 -0
  120. package/lib/modifier/hasAddModifiers.js +5 -0
  121. package/lib/modifier/hasAllTag.js +12 -0
  122. package/lib/modifier/hasAttribute.js +8 -0
  123. package/lib/modifier/hasAttributes.js +19 -0
  124. package/lib/modifier/hasCreateSubscription.js +10 -0
  125. package/lib/modifier/hasDisplayPrompt.js +9 -0
  126. package/lib/modifier/hasMatchTags.js +27 -0
  127. package/lib/modifier/hasModifier.js +12 -0
  128. package/lib/modifier/hasNoTags.js +9 -0
  129. package/lib/modifier/hasRelatedItems.js +8 -0
  130. package/lib/modifier/includePiecesInQuantity.js +10 -0
  131. package/lib/modifier/includesInGroup.js +9 -0
  132. package/lib/modifier/index.js +242 -0
  133. package/lib/modifier/isAmountOverride.js +7 -0
  134. package/lib/modifier/isAvailablePromotion.js +23 -0
  135. package/lib/modifier/isAvailableSubscription.js +28 -0
  136. package/lib/modifier/isCompact.js +12 -0
  137. package/lib/modifier/isCredit.js +6 -0
  138. package/lib/modifier/isCustomerTagsExtend.js +9 -0
  139. package/lib/modifier/isDefault.js +4 -0
  140. package/lib/modifier/isDepartment.js +6 -0
  141. package/lib/modifier/isDirect.js +6 -0
  142. package/lib/modifier/isDiscount.js +6 -0
  143. package/lib/modifier/isEditable.js +10 -0
  144. package/lib/modifier/isGratuity.js +6 -0
  145. package/lib/modifier/isGroupOfItems.js +12 -0
  146. package/lib/modifier/isGroupOfModifiers.js +12 -0
  147. package/lib/modifier/isGroupOfValues.js +13 -0
  148. package/lib/modifier/isHidden.js +4 -0
  149. package/lib/modifier/isIncluded.js +4 -0
  150. package/lib/modifier/isManual.js +9 -0
  151. package/lib/modifier/isMultiplier.js +11 -0
  152. package/lib/modifier/isOverride.js +6 -0
  153. package/lib/modifier/isPaymentMethods.js +8 -0
  154. package/lib/modifier/isPaymentTypes.js +8 -0
  155. package/lib/modifier/isPreferences.js +8 -0
  156. package/lib/modifier/isPriceOverride.js +7 -0
  157. package/lib/modifier/isPromotion.js +6 -0
  158. package/lib/modifier/isQuantityOverride.js +7 -0
  159. package/lib/modifier/isRemoveModifier.js +4 -0
  160. package/lib/modifier/isRequired.js +4 -0
  161. package/lib/modifier/isRequiredAndOverride.js +4 -0
  162. package/lib/modifier/isService.js +9 -0
  163. package/lib/modifier/isSingleValue.js +9 -0
  164. package/lib/modifier/isSubscription.js +6 -0
  165. package/lib/modifier/isTrackUsageSubscription.js +5 -0
  166. package/lib/modifier/isValueSelected.js +7 -0
  167. package/lib/modifier/purifyModifiers.js +15 -0
  168. package/lib/modifier/sort.js +35 -0
  169. package/lib/order/addCreditModifier.js +27 -0
  170. package/lib/order/addDiscountModifier.js +9 -0
  171. package/lib/order/addItem.js +292 -0
  172. package/lib/order/addItemModifier.js +214 -0
  173. package/lib/order/addModifier.js +9 -0
  174. package/lib/order/addModifierToAllItems.js +16 -0
  175. package/lib/order/addNote.js +25 -0
  176. package/lib/order/addTable.js +11 -0
  177. package/lib/order/calculate.js +51 -16
  178. package/lib/order/calculateDue.js +15 -0
  179. package/lib/order/calculateOrdersDue.js +26 -0
  180. package/lib/order/canSplit.js +4 -0
  181. package/lib/order/changeEndDate.js +15 -0
  182. package/lib/order/changeLocation.js +20 -0
  183. package/lib/order/changeStartDate.js +14 -0
  184. package/lib/order/combineSubOrders.js +14 -0
  185. package/lib/order/containsSerial.js +5 -0
  186. package/lib/order/create.js +67 -0
  187. package/lib/order/createParent.js +9 -0
  188. package/lib/order/duplicateItem.js +16 -0
  189. package/lib/order/findItemIndex.js +6 -0
  190. package/lib/order/getAppliedCredit.js +5 -0
  191. package/lib/order/getBalance.js +9 -0
  192. package/lib/order/getCustomer.js +4 -0
  193. package/lib/order/getCustomerStoreCredit.js +14 -0
  194. package/lib/order/getCustomerSubscriptions.js +8 -0
  195. package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
  196. package/lib/order/getDepartmentModifiers.js +9 -0
  197. package/lib/order/getEndDate.js +4 -0
  198. package/lib/order/getItemByItemId.js +6 -0
  199. package/lib/order/getItemIndex.js +9 -0
  200. package/lib/order/getItemsToPay.js +17 -0
  201. package/lib/order/getMenuItemsByCustomer.js +19 -0
  202. package/lib/order/getNumberOfItems.js +10 -0
  203. package/lib/order/getOrdersPieces.js +10 -0
  204. package/lib/order/getPendingItemIndex.js +5 -0
  205. package/lib/order/getRelatedItems.js +11 -0
  206. package/lib/order/getSameItems.js +19 -0
  207. package/lib/order/getScheduleByCustomer.js +20 -0
  208. package/lib/order/getScreenCustomerNotes.js +12 -0
  209. package/lib/order/getSelectedItem.js +6 -0
  210. package/lib/order/getStartDate.js +4 -0
  211. package/lib/order/getTip.js +10 -0
  212. package/lib/order/getTotalPieces.js +17 -0
  213. package/lib/order/getTotals.js +28 -0
  214. package/lib/order/hasAggregate.js +20 -0
  215. package/lib/order/hasItem.js +7 -0
  216. package/lib/order/hasRemainingSubscription.js +67 -0
  217. package/lib/order/hold.js +12 -0
  218. package/lib/order/index.js +163 -5
  219. package/lib/order/isDetailed.js +4 -0
  220. package/lib/order/isHold.js +4 -0
  221. package/lib/order/isNew.js +4 -0
  222. package/lib/order/isOpen.js +4 -0
  223. package/lib/order/isParent.js +7 -0
  224. package/lib/order/merge.js +96 -0
  225. package/lib/order/open.js +11 -0
  226. package/lib/order/pickEndDate.js +70 -0
  227. package/lib/order/removeApplyModifier.js +24 -0
  228. package/lib/order/removeDiscountModifier.js +16 -0
  229. package/lib/order/removeItem.js +55 -0
  230. package/lib/order/removeItemByIndex.js +5 -0
  231. package/lib/order/removeItemModifier.js +69 -0
  232. package/lib/order/removeModifier.js +21 -0
  233. package/lib/order/removeModifierByAttribute.js +23 -0
  234. package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
  235. package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
  236. package/lib/order/setCustomer.js +50 -0
  237. package/lib/order/splitByDepartments.js +151 -0
  238. package/lib/order/toggleModifier.js +9 -0
  239. package/lib/order/updateItem.js +8 -0
  240. package/lib/order/updateItemQuantity.js +35 -0
  241. package/lib/order/void.js +11 -0
  242. package/package.json +15 -18
@@ -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,9 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function addModifier({ order, modifier }) {
3
+ if (!modifier) return order;
4
+ const { modifiers = [] } = order;
5
+ return {
6
+ ...order,
7
+ modifiers: [...modifiers, modifierActions.create(modifier)],
8
+ };
9
+ };
@@ -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
+ };
@@ -1,19 +1,20 @@
1
+ /* eslint-disable no-restricted-syntax */
1
2
  /**
2
3
  * return calculated Order
3
4
  */
4
- module.exports = ({ _, utils, itemService }) => {
5
+ module.exports = ({ _, utils, itemActions, modifierActions }) => {
5
6
  const { math } = utils;
6
7
 
7
- const pricing = (items) => {
8
- const subTotals = {};
8
+ const pricing = items => {
9
+ let subTotals = {};
9
10
  let subTotal = 0;
10
11
 
11
- for (item of items) {
12
+ for (const item of items) {
12
13
  subTotal = math.add(subTotal, item.subTotals._actual);
13
14
  const keys = Object.keys(item.subTotals).filter(
14
- (key) => !key.includes('_')
15
+ key => !key.includes('_')
15
16
  );
16
- for (key of keys) {
17
+ for (const key of keys) {
17
18
  subTotals[key] = math.add(subTotals[key] || 0, item.subTotals[key]);
18
19
  }
19
20
  }
@@ -23,6 +24,14 @@ module.exports = ({ _, utils, itemService }) => {
23
24
  subTotal
24
25
  );
25
26
 
27
+ subTotals = Object.keys(subTotals).reduce(
28
+ (acc, key) => ({
29
+ ...acc,
30
+ [key]: subTotals[key],
31
+ }),
32
+ {}
33
+ );
34
+
26
35
  return {
27
36
  subTotals,
28
37
  subTotal,
@@ -30,14 +39,33 @@ module.exports = ({ _, utils, itemService }) => {
30
39
  };
31
40
  };
32
41
 
33
- return function calculateorder(order) {
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);
34
61
  const { items = [] } = order;
35
- if (!items.length) return order;
62
+ if (!items.length)
63
+ return { ...order, subTotals: {}, subTotal: 0, total: 0 };
36
64
 
37
65
  const modifiers = _.uniqBy(order.modifiers, '_id');
38
66
  // if there is no order level modifiers, we have to remove them from items
39
- let itemsWNIM = itemService.filterByDirectModifiers(items);
40
- itemsWNIM = itemService.calculate(itemsWNIM);
67
+ let itemsWNIM = getItems(items, modifiers);
68
+ itemsWNIM = itemActions.calculate(itemsWNIM);
41
69
  const newOrder = { ...order, ...pricing(itemsWNIM), items: itemsWNIM };
42
70
 
43
71
  if (!modifiers.length) return newOrder;
@@ -45,22 +73,29 @@ module.exports = ({ _, utils, itemService }) => {
45
73
  const newItems = itemsWNIM || items;
46
74
  let itemsWIM = _.cloneDeep(newItems);
47
75
 
48
- modifiers.forEach((modifier) => {
49
- const itemsModifiers = itemService.addIndirectModifier(
50
- newOrder,
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,
51
86
  newItems,
52
87
  modifier
53
88
  );
54
89
  // adding the modifiers to items
55
- itemsWIM = itemsWIM.map((item) => ({
90
+ itemsWIM = itemsWIM.map(item => ({
56
91
  ...item,
57
92
  modifiers: [...(item.modifiers || []), itemsModifiers[item._id]].filter(
58
93
  Boolean
59
94
  ),
60
95
  }));
61
- });
96
+ }
62
97
 
63
- const calculatedItemWIM = itemService.calculate(itemsWIM);
98
+ const calculatedItemWIM = itemActions.calculate(itemsWIM);
64
99
  return {
65
100
  ...order,
66
101
  ...pricing(calculatedItemWIM),
@@ -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,4 @@
1
+ module.exports = () =>
2
+ function canSplit(order) {
3
+ return !!(order && !(order.parentId || order.isParent));
4
+ };
@@ -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,5 @@
1
+ module.exports = () =>
2
+ function containsSerial({ order, serial }) {
3
+ if (!order || !order.items || !serial) return false;
4
+ return !!order.items.find(each => each.serial === serial);
5
+ };
@@ -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,9 @@
1
+ module.exports = () =>
2
+ function createParent(order) {
3
+ if (!order) return order;
4
+ return {
5
+ ...order,
6
+ items: [],
7
+ isParent: true,
8
+ };
9
+ };
@@ -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,6 @@
1
+ module.exports = () =>
2
+ function findItemIndex({ order, item }) {
3
+ if (!order || !item) return -1;
4
+ const { items = [] } = order;
5
+ return items.findIndex(each => each._id === item._id);
6
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = ({ _ }) =>
2
+ function getAppliedCredit(order) {
3
+ if (!order) return 0;
4
+ return Math.abs(_.get(order, 'subTotals.credit', 0));
5
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getBalance({ order }) {
4
+ if (!order) return 0;
5
+ if (Array.isArray(order)) return 0;
6
+
7
+ return math.sub(order.total, order.totalPaid);
8
+ };
9
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function getCustomer(order) {
3
+ return order && order.customer;
4
+ };
@@ -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
+ };