@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,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,55 @@
1
+ module.exports = ({ actions, _, itemActions }) => {
2
+ const updateRelatedItems = (items, parentId) =>
3
+ 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
+ return function removeItem({ order, item, checkQuantity, hard = true }) {
11
+ if (!item) return order;
12
+
13
+ const orderItemIdx = actions.getItemIndex({ order, item });
14
+ if (orderItemIdx < 0) return order;
15
+
16
+ let { items } = order;
17
+ const orderItem = items[orderItemIdx];
18
+ const relatedItems = actions.getRelatedItems({ order, item });
19
+ const hasRelatedItem = !_.isEmpty(relatedItems);
20
+
21
+ if (!hard || hasRelatedItem) {
22
+ items[orderItemIdx] = { ...orderItem, price: 0, modifiers: [] };
23
+ if (hasRelatedItem) {
24
+ items = updateRelatedItems(items, item._id);
25
+ // console.log('Update related items ...', items);
26
+ }
27
+ }
28
+ // Decrease the quantity
29
+ else if (
30
+ checkQuantity &&
31
+ items[orderItemIdx] &&
32
+ items[orderItemIdx].quantity > 1
33
+ )
34
+ items[orderItemIdx] = { ...orderItem, quantity: orderItem.quantity - 1 };
35
+ // Remove
36
+ else items.splice(orderItemIdx, 1);
37
+
38
+ // if it is the last relatedItem
39
+ if (
40
+ itemActions.isRelatedItem(item) &&
41
+ !itemActions.isParentIncluded(item)
42
+ ) {
43
+ const parent = itemActions.getParentItem(items, orderItem);
44
+ const parentIndex = actions.getItemIndex({ order, item: parent });
45
+ const siblings = actions.getRelatedItems({ order, item: parent });
46
+ // console.log('Removing parent item ...');
47
+ if (siblings <= 1) items.splice(parentIndex, 1);
48
+ }
49
+
50
+ return {
51
+ ...order,
52
+ items,
53
+ };
54
+ };
55
+ };
@@ -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
+ };
@@ -0,0 +1,21 @@
1
+ module.exports = ({ modifierActions, itemActions }) =>
2
+ function removeModifier({ order, modifier }) {
3
+ if (!order || !modifier) return order;
4
+
5
+ const index = modifierActions.getModifierIndex({
6
+ entity: order,
7
+ modifier,
8
+ });
9
+ const nextOrder = { ...order };
10
+
11
+ if (index > -1) {
12
+ const { items, modifiers } = nextOrder;
13
+ if (items)
14
+ nextOrder.items = items.map(each =>
15
+ itemActions.removeModifier({ item: each, modifier: modifiers[index] })
16
+ );
17
+
18
+ nextOrder.modifiers.splice(index, 1);
19
+ }
20
+ return nextOrder;
21
+ };
@@ -0,0 +1,23 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function removeModifierByAttribute({ order, attribute, applyItems = false }) {
3
+ if (!order || !attribute) return order;
4
+ if (!Array.isArray(order.modifiers)) return order;
5
+
6
+ const newOrder = { ...order };
7
+ newOrder.modifiers = order.modifiers.filter(
8
+ each => !modifierActions.hasAttribute(each, attribute)
9
+ );
10
+
11
+ if (applyItems && Array.isArray(order.items)) {
12
+ newOrder.items = order.items.map(item => {
13
+ if (!Array.isArray(item.modifiers)) return item;
14
+ return {
15
+ ...item,
16
+ modifiers: item.modifiers.filter(
17
+ each => !modifierActions.hasAttribute(each, attribute)
18
+ ),
19
+ };
20
+ });
21
+ }
22
+ return newOrder;
23
+ };
@@ -0,0 +1,29 @@
1
+ module.exports = () => {
2
+ const hasPaymentMethods = modifier =>
3
+ modifier.conditions &&
4
+ Array.isArray(modifier.conditions.paymentMethods) &&
5
+ modifier.conditions.paymentMethods.length;
6
+
7
+ return function removeModifiersWithPaymentMethods({
8
+ order,
9
+ applyItems = false,
10
+ }) {
11
+ if (!order || !Array.isArray(order.modifiers)) return order;
12
+
13
+ const newOrder = { ...order };
14
+ newOrder.modifiers = order.modifiers.filter(
15
+ each => !hasPaymentMethods(each)
16
+ );
17
+
18
+ if (applyItems && Array.isArray(order.items)) {
19
+ newOrder.items = order.items.map(item => {
20
+ if (!Array.isArray(item.modifiers)) return item;
21
+ return {
22
+ ...item,
23
+ modifiers: item.modifiers.filter(each => !hasPaymentMethods(each)),
24
+ };
25
+ });
26
+ }
27
+ return newOrder;
28
+ };
29
+ };
@@ -0,0 +1,27 @@
1
+ module.exports = () => {
2
+ const hasPaymentTypes = modifier =>
3
+ modifier.conditions &&
4
+ Array.isArray(modifier.conditions.paymentTypes) &&
5
+ modifier.conditions.paymentTypes.length;
6
+
7
+ return function removeModifiersWithPaymentTypes({
8
+ order,
9
+ applyItems = false,
10
+ }) {
11
+ if (!order || !Array.isArray(order.modifiers)) return order;
12
+
13
+ const newOrder = { ...order };
14
+ newOrder.modifiers = order.modifiers.filter(each => !hasPaymentTypes(each));
15
+
16
+ if (applyItems && Array.isArray(order.items)) {
17
+ newOrder.items = order.items.map(item => {
18
+ if (!Array.isArray(item.modifiers)) return item;
19
+ return {
20
+ ...item,
21
+ modifiers: item.modifiers.filter(each => !hasPaymentTypes(each)),
22
+ };
23
+ });
24
+ }
25
+ return newOrder;
26
+ };
27
+ };
@@ -0,0 +1,50 @@
1
+ module.exports = ({ itemActions, modifierActions, _ }) => {
2
+ const getTags = customer =>
3
+ (customer.tags || []).map(tag => tag.toLowerCase());
4
+
5
+ return function setCustomer({ order, customer, cache }) {
6
+ if (!order) return null;
7
+ // if (!customer) return { ...order, customer: null };
8
+
9
+ const { items = [] } = order;
10
+ const tags = customer ? getTags(customer) : ['default'];
11
+
12
+ const nextOrder = _.cloneDeep(order);
13
+ if (customer) {
14
+ nextOrder.customer = {
15
+ ..._.cloneDeep(customer),
16
+ isEmbedded: true,
17
+ tags,
18
+ };
19
+ } else nextOrder.customer = null;
20
+
21
+ if (!items.length) return nextOrder;
22
+
23
+ nextOrder.items = items.map(item => {
24
+ const originalItem = itemActions.findOriginalItem({ item, cache });
25
+ if (!originalItem) return item;
26
+
27
+ const newModifiers = modifierActions.getMatchTagsModifiers({
28
+ entity: customer,
29
+ modifiers: item.modifiers,
30
+ });
31
+
32
+ const price = itemActions.getItemPrice({
33
+ item,
34
+ customer,
35
+ cache,
36
+ });
37
+
38
+ const newItem = {
39
+ ...originalItem,
40
+ ...item,
41
+ modifiers: newModifiers,
42
+ price,
43
+ };
44
+
45
+ return newItem;
46
+ });
47
+
48
+ return nextOrder;
49
+ };
50
+ };
@@ -0,0 +1,151 @@
1
+ module.exports = ({
2
+ utils,
3
+ _,
4
+ itemActions,
5
+ modifierActions,
6
+ actions,
7
+ settings,
8
+ }) => {
9
+ const orderSettings = _.get(settings, 'order');
10
+ const { date, math, helpers } = utils;
11
+ const noteDefaults = {
12
+ message: '',
13
+ attributes: [],
14
+ date: date.toISOString(),
15
+ user: null,
16
+ url: '',
17
+ __typename: 'Note',
18
+ };
19
+
20
+ const getSplitModifiers = (modifiers, totalOriginOrder, totalSplitedOrder) =>
21
+ modifiers.map(each => {
22
+ const modifier = { ...each };
23
+ if (modifier.type === 'fixed' && modifier.amount) {
24
+ const amount = totalOriginOrder
25
+ ? math.div(
26
+ math.mul(modifier.amount, totalSplitedOrder || 0),
27
+ totalOriginOrder
28
+ )
29
+ : 0;
30
+ return {
31
+ ...modifier,
32
+ _id: helpers.getObjectID(),
33
+ amount,
34
+ };
35
+ }
36
+ return modifier;
37
+ });
38
+
39
+ const joinItemQuantity = orders =>
40
+ orders.map(order => {
41
+ const items = order.items.reduce((arr, item) => {
42
+ const _items = arr;
43
+ const index = _items.findIndex(each => {
44
+ const preSubs = modifierActions.getSubscriptionModifiers(
45
+ each.modifiers
46
+ );
47
+ const curSubs = modifierActions.getSubscriptionModifiers(
48
+ item.modifiers
49
+ );
50
+ return (
51
+ each.itemId === item.itemId &&
52
+ ((!each.serial && !item.serial) || each.serial === item.serial) &&
53
+ ((preSubs.length < 1 && curSubs.length < 1) ||
54
+ (preSubs.length > 0 && curSubs.length > 0))
55
+ );
56
+ });
57
+ if (index !== -1)
58
+ _items[index] = {
59
+ ..._items[index],
60
+ quantity: _items[index].quantity + item.quantity,
61
+ };
62
+ else _items.push(item);
63
+ return _items;
64
+ }, []);
65
+ return { ...order, items };
66
+ });
67
+
68
+ const getOrder =
69
+ ({ order, name }) =>
70
+ (items, index) => {
71
+ let displayId = '';
72
+ if (orderSettings.allowSuborder)
73
+ displayId = `${order.displayId}-${index}`;
74
+ else if (index === 1) displayId = order.displayId;
75
+ return {
76
+ ...order,
77
+ _id: helpers.getObjectID(),
78
+ displayId,
79
+ discount: 0,
80
+ tax: 0,
81
+ parentId: orderSettings.allowSuborder ? order._id : null,
82
+ items,
83
+ modifiers: [],
84
+ notes: [
85
+ ...(order.notes || []),
86
+ {
87
+ ...noteDefaults,
88
+ message: `Split from ${order.displayId}, for department ${name}`,
89
+ },
90
+ ],
91
+ };
92
+ };
93
+
94
+ const getDepartmentName = item => {
95
+ const deps = itemActions.getDepartmentModifiers(item);
96
+ return (deps.length && deps[0].name) || 'other';
97
+ };
98
+
99
+ return function splitByDepartments(order) {
100
+ const { items } = order;
101
+ const itemsByDepartments = _.groupBy(items, getDepartmentName);
102
+ const orders = Object.entries(itemsByDepartments);
103
+ let splitOrders = [];
104
+
105
+ orders.forEach(each => {
106
+ const [name, newItems] = each;
107
+ const create = getOrder({ order, name });
108
+ // Assuming there is one department in the item
109
+ const department = itemActions.getDepartmentModifiers(newItems[0])[0];
110
+ const departmentName = getDepartmentName(newItems[0]);
111
+ const maxItems = modifierActions.getDepartmentMaxItems(department);
112
+
113
+ if (
114
+ department &&
115
+ maxItems &&
116
+ itemActions.getItemsTotalPieces(newItems) > maxItems
117
+ ) {
118
+ newItems.forEach(newItem => {
119
+ for (let j = 0; j < newItem.quantity; j += 1) {
120
+ const item = {
121
+ ...newItem,
122
+ quantity: 1,
123
+ _id: helpers.getObjectID(),
124
+ };
125
+ const totalPieces = itemActions.getItemTotalPieces(item);
126
+ const index = splitOrders.findIndex(
127
+ newOrder =>
128
+ newOrder.items &&
129
+ itemActions.getItemsTotalPieces(newOrder.items) + totalPieces <=
130
+ maxItems &&
131
+ departmentName === getDepartmentName(newOrder.items[0])
132
+ );
133
+ if (index > -1) splitOrders[index].items.push(item);
134
+ else splitOrders.push(create([item], splitOrders.length + 1));
135
+ }
136
+ });
137
+ } else splitOrders.push(create(newItems, splitOrders.length + 1));
138
+ });
139
+
140
+ splitOrders = joinItemQuantity(splitOrders);
141
+
142
+ return splitOrders.map(each => {
143
+ const { subTotal } = actions.calculate(each);
144
+ const newOrder = {
145
+ ...each,
146
+ modifiers: getSplitModifiers(order.modifiers, order.subTotal, subTotal),
147
+ };
148
+ return actions.calculate(newOrder);
149
+ });
150
+ };
151
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ actions, modifierActions }) =>
2
+ function toggleModifier({ order, modifier }) {
3
+ if (!order || !modifier) return order;
4
+
5
+ if (modifierActions.hasModifier({ entity: order, modifier })) {
6
+ return actions.removeModifier({ order, modifier });
7
+ }
8
+ return actions.addModifier({ order, modifier });
9
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = ({ _ }) =>
2
+ function updateItem({ order, itemIndex, item }) {
3
+ const updatedOrder = _.cloneDeep(order);
4
+ if (!order || !order.items || order.items.length < itemIndex)
5
+ return updatedOrder;
6
+ updatedOrder.items[itemIndex] = item;
7
+ return updatedOrder;
8
+ };
@@ -0,0 +1,35 @@
1
+ module.exports = ({ actions, settings, _ }) => {
2
+ const orderSettings = _.get(settings, 'order');
3
+ return function updateItemQuantity({
4
+ order,
5
+ quantity,
6
+ itemIndex,
7
+ reset,
8
+ cache,
9
+ }) {
10
+ const item = actions.getSelectedItem({ order, itemIndex });
11
+ const isBefore = orderSettings.useKeypadOnItemAdd === 'before';
12
+
13
+ if ((!isBefore && item) || (item && item.isPending)) {
14
+ const updatedQuantity = reset
15
+ ? quantity
16
+ : parseInt(`${item.quantity}${quantity}`, 10);
17
+ return actions.addItem({
18
+ order,
19
+ item,
20
+ itemIndex,
21
+ cache,
22
+ overridenQuantity: updatedQuantity,
23
+ });
24
+ }
25
+ if (isBefore) {
26
+ return actions.addItem({
27
+ order,
28
+ item: { isPending: true },
29
+ cache,
30
+ overridenQuantity: quantity,
31
+ });
32
+ }
33
+ return order;
34
+ };
35
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = ({ constants }) =>
2
+ function voidOrder(order) {
3
+ if (!order) return order;
4
+ return {
5
+ ...order,
6
+ status: {
7
+ ...(order.status || {}),
8
+ order: constants.Status.Order.VOID,
9
+ },
10
+ };
11
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.4",
3
+ "version": "1.0.7",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -11,27 +11,29 @@
11
11
  },
12
12
  "main": "index.js",
13
13
  "scripts": {
14
- "test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__"
14
+ "test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__",
15
+ "lint": "eslint --quiet --fix lib/"
15
16
  },
16
17
  "publishConfig": {
17
18
  "access": "public"
18
19
  },
19
20
  "dependencies": {
20
- "bson-objectid": "^1.3.0",
21
- "decimal.js": "^10.2.0",
22
- "lodash": "^4.17.15"
21
+ "@darkpos/utils": "1.0.8",
22
+ "lodash": "^4.17.21",
23
+ "moment-timezone": "^0.5.34"
23
24
  },
24
25
  "devDependencies": {
25
- "eslint": "^6.3.0",
26
- "eslint-config-airbnb": "^18.0.1",
27
- "eslint-config-airbnb-base": "^14.0.0",
28
- "eslint-config-prettier": "^6.2.0",
29
- "eslint-plugin-jest": "^22.17.0",
30
- "eslint-plugin-prettier": "^3.1.0",
31
- "jest": "^25.1.0",
32
- "prettier": "^1.18.2",
33
- "supertest": "^4.0.2",
26
+ "eslint": "^8.2.0",
27
+ "eslint-config-airbnb": "^19.0.4",
28
+ "eslint-config-airbnb-base": "^15.0.0",
29
+ "eslint-config-prettier": "^8.5.0",
30
+ "eslint-plugin-import": "^2.26.0",
31
+ "eslint-plugin-jest": "^26.5.3",
32
+ "eslint-plugin-prettier": "^4.0.0",
33
+ "jest": "^28.1.1",
34
+ "prettier": "^2.7.0",
35
+ "supertest": "^6.2.3",
34
36
  "supervisor": "^0.12.0"
35
37
  },
36
- "gitHead": "1da217c88e3d86a5ef73a7ad5f1fc4f56427c10d"
38
+ "gitHead": "1c4565d3c097c833093794654d8adc18e37767b9"
37
39
  }