@darkpos/pricing 1.0.4 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/.eslintrc +8 -10
  2. package/README.md +108 -4
  3. package/__TEST__/item.test.js +265 -34
  4. package/__TEST__/modifier/calculate.test.js +73 -0
  5. package/__TEST__/modifier/getAvailablePromotionsOrSubscriptions.test.js +81 -0
  6. package/__TEST__/modifier/getMatchTagsModifiers.test.js +109 -0
  7. package/__TEST__/modifier/getModifierIndex.test.js +40 -0
  8. package/__TEST__/modifier/getRecommendedModifiers.test.js +17 -0
  9. package/__TEST__/modifier/hasAllTags.test.js +25 -0
  10. package/__TEST__/modifier/hasAttribute.test.js +47 -0
  11. package/__TEST__/modifier/hasMatchTags.test.js +56 -0
  12. package/__TEST__/modifier/hasNoTags.test.js +21 -0
  13. package/__TEST__/modifier/mocks/toggleModifier_no1.json +13440 -0
  14. package/__TEST__/modifier/mocks/toggleModifier_no2.json +13438 -0
  15. package/__TEST__/modifier/mocks/toggleModifier_no3.json +13598 -0
  16. package/__TEST__/modifier/sort.test.js +41 -0
  17. package/__TEST__/order.test.js +147 -74
  18. package/index.js +1 -9
  19. package/lib/constants/Modifier/Attributes.js +9 -0
  20. package/lib/constants/Modifier/Compute.js +15 -0
  21. package/lib/constants/Modifier/Types.js +7 -0
  22. package/lib/constants/Modifier/index.js +9 -0
  23. package/lib/constants/Status.js +39 -0
  24. package/lib/constants/index.js +7 -0
  25. package/lib/index.js +38 -0
  26. package/lib/item/addIndirectModifier.js +55 -0
  27. package/lib/item/calculate.js +108 -0
  28. package/lib/item/create.js +35 -0
  29. package/lib/item/filterByDirectModifiers.js +13 -0
  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 -4
  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 +240 -6
  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 +105 -0
  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 +164 -4
  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 +17 -15
  243. package/__TEST__/modifier.test.js +0 -126
  244. package/lib/item/actions.js +0 -140
  245. package/lib/modifier/actions.js +0 -172
  246. package/lib/modifier/constants.js +0 -46
  247. package/lib/order/actions.js +0 -47
  248. package/lib/utils/defaultPrices.js +0 -10
  249. package/lib/utils/helpers.js +0 -26
  250. package/lib/utils/index.js +0 -9
  251. package/lib/utils/math.js +0 -71
@@ -0,0 +1,4 @@
1
+ module.exports = ({ _ }) =>
2
+ function getEndDate({ order }) {
3
+ return _.get(order, 'end.requestDate', '');
4
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = () =>
2
+ function getItemByItemId({ order = {}, itemId }) {
3
+ if (!order || !order.items) return null;
4
+ const item = order.items.find(each => each.itemId === itemId);
5
+ return item;
6
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function getItemIndex({ order, item }) {
3
+ if (!order || !order.items || !item) return -1;
4
+ return order.items.findIndex(each => {
5
+ if (!item.itemId && each.isPending) return item._id === each._id;
6
+
7
+ return each._id === item._id && each.itemId === item.itemId;
8
+ });
9
+ };
@@ -0,0 +1,17 @@
1
+ module.exports = () =>
2
+ function getItemsToPay({ orders, orderItemsToPay }) {
3
+ return (
4
+ (Array.isArray(orders) &&
5
+ orderItemsToPay &&
6
+ Object.keys(orderItemsToPay).reduce((acc, orderId) => {
7
+ const orderItemsIds = orderItemsToPay[orderId];
8
+ const order = orders.find(each => each._id === orderId);
9
+ if (!order || !orderItemsIds) return acc;
10
+ const items = order.items.filter(each =>
11
+ orderItemsIds.includes(each._id)
12
+ );
13
+ return acc.concat(items);
14
+ }, [])) ||
15
+ []
16
+ );
17
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getMenuItemByCustomer({ order, menuItems }) {
3
+ const { customer } = order || {};
4
+ if (!customer) return [];
5
+
6
+ return menuItems.filter(menuItem => {
7
+ const { item = {} } = menuItem;
8
+ const { priceLevels = [] } = item;
9
+ if (
10
+ !priceLevels.length &&
11
+ (modifierActions.hasAllTag(customer) ||
12
+ modifierActions.hasNoTags(customer))
13
+ )
14
+ return true;
15
+ return priceLevels.some(priceLevel =>
16
+ modifierActions.hasMatchTags(customer, priceLevel)
17
+ );
18
+ });
19
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ _ }) =>
2
+ function getNumberOfItems(orders) {
3
+ if (!orders || !Array.isArray(orders)) return 0;
4
+ const sum = orders.reduce((acc, order) => {
5
+ const items = _.get(order, 'items', []);
6
+ return acc + items.lenght;
7
+ }, 0);
8
+
9
+ return sum;
10
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ actions, utils }) => {
2
+ const { math } = utils;
3
+ return function getOrdersPieces(orders) {
4
+ if (!Array.isArray(orders)) return 0;
5
+ return orders.reduce(
6
+ (acc, order) => math.add(acc, actions.getTotalPieces({ order })),
7
+ 0
8
+ );
9
+ };
10
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getPendingItemIndex(order) {
3
+ if (!order || !order.items || !order.items.length) return -1;
4
+ return order.items.findIndex(each => each.isPending);
5
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function getRelatedItems({ order, item, compareId = true }) {
3
+ if (!order || !order.items || !item) return [];
4
+ return order.items
5
+ .filter(each => each.properties && each.properties.relatedItem)
6
+ .filter(
7
+ each =>
8
+ each.properties.parentItemId === item.itemId &&
9
+ (compareId ? each.properties.parentId === item._id : true)
10
+ );
11
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = () =>
2
+ function getSameItems({ order, item }) {
3
+ const { items = [] } = order;
4
+ return items.filter(each => {
5
+ let check =
6
+ each.itemId &&
7
+ item._id &&
8
+ each.itemId === item._id &&
9
+ !each.serial &&
10
+ !item.serial;
11
+ if (check && each.menuId && item.menuId) {
12
+ check =
13
+ each.menuId === item.menuId &&
14
+ each.path.toString() === item.path.toString();
15
+ }
16
+
17
+ return check;
18
+ });
19
+ };
@@ -0,0 +1,20 @@
1
+ module.exports = ({ _, settings }) => {
2
+ const orderSettings = _.get(settings, 'order');
3
+
4
+ return function getScheduleByCustomer(customer = {}) {
5
+ const { tags } = customer;
6
+ const { default: defaultSchedule, ...schedules } =
7
+ orderSettings.endDate || {};
8
+ if (!tags || !tags.length) return defaultSchedule;
9
+
10
+ const scheduleTags = Object.keys(schedules);
11
+ if (!scheduleTags || !scheduleTags.length) return defaultSchedule;
12
+
13
+ const tag = tags
14
+ .filter(each => each !== 'default' && each !== 'all')
15
+ .find(each => scheduleTags.includes(each));
16
+ if (!tag) return defaultSchedule;
17
+ console.log('schedule for the tag', tag, schedules[tag]);
18
+ return schedules[tag];
19
+ };
20
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ actions }) =>
2
+ function getScreenCustomerNotes(customer) {
3
+ let theCustomer = customer;
4
+ if (!theCustomer) theCustomer = actions.getCustomer();
5
+ if (!theCustomer) return [];
6
+ const { notes = [] } = theCustomer;
7
+ const screenNotes = notes.filter(
8
+ each => each.message && each.attributes.includes('screen')
9
+ );
10
+ if (!screenNotes.length) return [];
11
+ return screenNotes.map(each => each.message);
12
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = () =>
2
+ function getSelectedItem({ order, itemIndex }) {
3
+ if (!order || !order.items || itemIndex < 0) return null;
4
+ const item = order.items[itemIndex];
5
+ return item;
6
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = ({ _ }) =>
2
+ function getStartDate({ order }) {
3
+ return _.get(order, 'start.actualDate', '');
4
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ modifierActions, utils }) => {
2
+ const { math } = utils;
3
+ return function getTip(order) {
4
+ if (!order || !Array.isArray(order.modifiers)) return 0;
5
+
6
+ return order.modifiers
7
+ .filter(each => modifierActions.isGratuity(each))
8
+ .reduce((total, modifier) => math.sum(total, modifier.number || 0), 0);
9
+ };
10
+ };
@@ -0,0 +1,17 @@
1
+ module.exports = ({ itemActions, utils }) => {
2
+ const { math } = utils;
3
+ return function getTotalPieces({ order, subOrders }) {
4
+ if (!order) return 0;
5
+ if (order.items && order.items.length)
6
+ return itemActions.getItemsTotalPieces(order.items);
7
+ if (order.isParent && subOrders && subOrders.length)
8
+ return subOrders.reduce(
9
+ (acc, each) =>
10
+ math.add(acc, itemActions.getItemsTotalPieces(each.items)),
11
+ 0
12
+ );
13
+ if (order.properties && order.properties.pieceCount)
14
+ return order.properties.pieceCount;
15
+ return 0;
16
+ };
17
+ };
@@ -0,0 +1,28 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotals(orders) {
4
+ if (!Array.isArray(orders)) return { total: 0, subTotals: {} };
5
+ return orders
6
+ .filter(each => !!each.parentId || !each.isParent)
7
+ .reduce(
8
+ (acc, order) => {
9
+ const subTotals = {};
10
+ const { subTotals: orderSubTotals } = order;
11
+ if (orderSubTotals) {
12
+ const keys = Object.keys(orderSubTotals);
13
+ // eslint-disable-next-line no-restricted-syntax
14
+ for (const key of keys)
15
+ subTotals[key] = math.add(
16
+ acc.subTotals[key] || 0,
17
+ orderSubTotals[key]
18
+ );
19
+ }
20
+ return {
21
+ total: math.add(acc.total, order.total),
22
+ subTotals,
23
+ };
24
+ },
25
+ { total: 0, subTotals: {} }
26
+ );
27
+ };
28
+ };
@@ -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,166 @@
1
- const { filterExports } = require('../utils');
2
- const actions = require('./actions');
1
+ //
2
+ const getTotalPieces = require('./getTotalPieces');
3
+ const getStartDate = require('./getStartDate');
4
+ const getBalance = require('./getBalance');
5
+ const getEndDate = require('./getEndDate');
6
+ const isNew = require('./isNew');
7
+ const getSelectedItem = require('./getSelectedItem');
8
+ const updateItem = require('./updateItem');
9
+ const removeItemByIndex = require('./removeItemByIndex');
10
+ const addItem = require('./addItem');
11
+ const duplicateItem = require('./duplicateItem');
12
+ const getCustomer = require('./getCustomer');
13
+ const setCustomer = require('./setCustomer');
14
+ const create = require('./create');
15
+ const updateItemQuantity = require('./updateItemQuantity');
16
+ const getMenuItemsByCustomer = require('./getMenuItemsByCustomer');
17
+ const getPendingItemIndex = require('./getPendingItemIndex');
18
+ const getScreenCustomerNotes = require('./getScreenCustomerNotes');
19
+ const removeItem = require('./removeItem');
20
+ const getSameItems = require('./getSameItems');
21
+ const hasAggregate = require('./hasAggregate');
22
+ const findItemIndex = require('./findItemIndex');
23
+ const changeLocation = require('./changeLocation');
24
+ const addNote = require('./addNote');
25
+ const addTable = require('./addTable');
26
+ const changeEndDate = require('./changeEndDate');
27
+ const changeStartDate = require('./changeStartDate');
28
+ const containsSerial = require('./containsSerial');
29
+ const combineSubOrders = require('./combineSubOrders');
30
+ const calculate = require('./calculate');
31
+ const isParent = require('./isParent');
32
+ const canSplit = require('./canSplit');
33
+ const removeModifier = require('./removeModifier');
34
+ const removeDiscountModifier = require('./removeDiscountModifier');
35
+ const addModifier = require('./addModifier');
36
+ const addDiscountModifier = require('./addDiscountModifier');
37
+ const calculateDue = require('./calculateDue');
38
+ const toggleModifier = require('./toggleModifier');
39
+ const voidOrder = require('./void');
40
+ const holdOrder = require('./hold');
41
+ const openOrder = require('./open');
42
+ const isDetailed = require('./isDetailed');
43
+ const splitByDepartments = require('./splitByDepartments');
44
+ const createParent = require('./createParent');
45
+ const getOrdersPieces = require('./getOrdersPieces');
46
+ const getTotals = require('./getTotals');
47
+ const getDepartmentModifiers = require('./getDepartmentModifiers');
48
+ const getCustomerStoreCredit = require('./getCustomerStoreCredit');
49
+ const getTip = require('./getTip');
50
+ const merge = require('./merge');
51
+ const calculateOrdersDue = require('./calculateOrdersDue');
52
+ const removeModifierByAttribute = require('./removeModifierByAttribute');
53
+ const removeApplyModifier = require('./removeApplyModifier');
54
+ const getCustomerSubscriptions = require('./getCustomerSubscriptions');
55
+ const getCustomerSubscriptionsByItem = require('./getCustomerSubscriptionsByItem');
56
+ const hasRemainingSubscription = require('./hasRemainingSubscription');
57
+ const removeModifiersWithPaymentMethods = require('./removeModifiersWithPaymentMethods');
58
+ const removeModifiersWithPaymentTypes = require('./removeModifiersWithPaymentTypes');
59
+ const getItemsToPay = require('./getItemsToPay');
60
+ const hasItem = require('./hasItem');
61
+ const getNumberOfItems = require('./getNumberOfItems');
62
+ const isOpen = require('./isOpen');
63
+ const isHold = require('./isHold');
64
+ const addItemModifier = require('./addItemModifier');
65
+ const removeItemModifier = require('./removeItemModifier');
66
+ const addModifierToAllItems = require('./addModifierToAllItems');
67
+ const getItemIndex = require('./getItemIndex');
68
+ const getRelatedItems = require('./getRelatedItems');
69
+ const getItemByItemId = require('./getItemByItemId');
70
+ const getScheduleByCustomer = require('./getScheduleByCustomer');
71
+ const pickEndDate = require('./pickEndDate');
72
+ const getAppliedCredit = require('./getAppliedCredit');
73
+ const addCreditModifier = require('./addCreditModifier');
3
74
 
4
- module.exports = {
5
- actions: filterExports(actions),
75
+ const orderActions = (deps = {}) => {
76
+ const actions = {};
77
+
78
+ const innerDeps = {
79
+ ...deps,
80
+ actions,
81
+ };
82
+
83
+ const freezedActions = Object.freeze({
84
+ getItemByItemId: getItemByItemId(innerDeps),
85
+ getTotalPieces: getTotalPieces(innerDeps),
86
+ getStartDate: getStartDate(innerDeps),
87
+ getEndDate: getEndDate(innerDeps),
88
+ isNew: isNew(innerDeps),
89
+ getSelectedItem: getSelectedItem(innerDeps),
90
+ updateItem: updateItem(innerDeps),
91
+ removeItemByIndex: removeItemByIndex(innerDeps),
92
+ addItem: addItem(innerDeps),
93
+ duplicateItem: duplicateItem(innerDeps),
94
+ getCustomer: getCustomer(innerDeps),
95
+ setCustomer: setCustomer(innerDeps),
96
+ create: create(innerDeps),
97
+ updateItemQuantity: updateItemQuantity(innerDeps),
98
+ getMenuItemsByCustomer: getMenuItemsByCustomer(innerDeps),
99
+ getPendingItemIndex: getPendingItemIndex(innerDeps),
100
+ getScreenCustomerNotes: getScreenCustomerNotes(innerDeps),
101
+ removeItem: removeItem(innerDeps),
102
+ getSameItems: getSameItems(innerDeps),
103
+ hasAggregate: hasAggregate(innerDeps),
104
+ findItemIndex: findItemIndex(innerDeps),
105
+ changeLocation: changeLocation(innerDeps),
106
+ addNote: addNote(innerDeps),
107
+ addTable: addTable(innerDeps),
108
+ changeEndDate: changeEndDate(innerDeps),
109
+ changeStartDate: changeStartDate(innerDeps),
110
+ containsSerial: containsSerial(innerDeps),
111
+ combineSubOrders: combineSubOrders(innerDeps),
112
+ calculate: calculate(innerDeps),
113
+ isParent: isParent(innerDeps),
114
+ canSplit: canSplit(innerDeps),
115
+ removeModifier: removeModifier(innerDeps),
116
+ removeDiscountModifier: removeDiscountModifier(innerDeps),
117
+ addModifier: addModifier(innerDeps),
118
+ addDiscountModifier: addDiscountModifier(innerDeps),
119
+ calculateDue: calculateDue(innerDeps),
120
+ toggleModifier: toggleModifier(innerDeps),
121
+ voidOrder: voidOrder(innerDeps),
122
+ holdOrder: holdOrder(innerDeps),
123
+ openOrder: openOrder(innerDeps),
124
+ isDetailed: isDetailed(innerDeps),
125
+ splitByDepartments: splitByDepartments(innerDeps),
126
+ createParent: createParent(innerDeps),
127
+ getOrdersPieces: getOrdersPieces(innerDeps),
128
+ getTotals: getTotals(innerDeps),
129
+ getBalance: getBalance(innerDeps),
130
+ getDepartmentModifiers: getDepartmentModifiers(innerDeps),
131
+ getCustomerStoreCredit: getCustomerStoreCredit(innerDeps),
132
+ getTip: getTip(innerDeps),
133
+ merge: merge(innerDeps),
134
+ calculateOrdersDue: calculateOrdersDue(innerDeps),
135
+ removeModifierByAttribute: removeModifierByAttribute(innerDeps),
136
+ removeApplyModifier: removeApplyModifier(innerDeps),
137
+ getCustomerSubscriptions: getCustomerSubscriptions(innerDeps),
138
+ getCustomerSubscriptionsByItem: getCustomerSubscriptionsByItem(innerDeps),
139
+ hasRemainingSubscription: hasRemainingSubscription(innerDeps),
140
+ removeModifiersWithPaymentMethods:
141
+ removeModifiersWithPaymentMethods(innerDeps),
142
+ removeModifiersWithPaymentTypes: removeModifiersWithPaymentTypes(innerDeps),
143
+ hasItem: hasItem(innerDeps),
144
+ getNumberOfItems: getNumberOfItems(innerDeps),
145
+ isOpen: isOpen(innerDeps),
146
+ isHold: isHold(innerDeps),
147
+ getItemsToPay: getItemsToPay(innerDeps),
148
+ addItemModifier: addItemModifier(innerDeps),
149
+ removeItemModifier: removeItemModifier(innerDeps),
150
+ addModifierToAllItems: addModifierToAllItems(innerDeps),
151
+ getItemIndex: getItemIndex(innerDeps),
152
+ getRelatedItems: getRelatedItems(innerDeps),
153
+ getScheduleByCustomer: getScheduleByCustomer(innerDeps),
154
+ pickEndDate: pickEndDate(innerDeps),
155
+ getAppliedCredit: getAppliedCredit(innerDeps),
156
+ addCreditModifier: addCreditModifier(innerDeps),
157
+ });
158
+
159
+ Object.keys(freezedActions).forEach(actionName => {
160
+ actions[actionName] = freezedActions[actionName];
161
+ });
162
+
163
+ return freezedActions;
6
164
  };
165
+
166
+ 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
+ };