@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,16 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getItemModifiers(item, orderModifiers) {
3
+ const existsInOrderModifier = modifier =>
4
+ orderModifiers &&
5
+ orderModifiers.find(each => each.modifierId === modifier.modifierId);
6
+
7
+ let modifiers = [];
8
+ if (!item || !Array.isArray(item.modifiers)) return modifiers;
9
+
10
+ modifiers.push(...item.modifiers);
11
+
12
+ if (Array.isArray(orderModifiers) && orderModifiers.length)
13
+ modifiers = modifiers.filter(each => !existsInOrderModifier(each));
14
+
15
+ return modifiers.filter(modifierActions.isDirect);
16
+ };
@@ -0,0 +1,22 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getItemModifiersDescription(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
+ const description = item.modifiers
5
+ .filter(
6
+ each =>
7
+ !modifierActions.isHidden(each) &&
8
+ !modifierActions.isAmountOverride(each) &&
9
+ modifierActions.isDirect(each)
10
+ )
11
+ .map(modifier => {
12
+ const { name } = modifier;
13
+ let label = name;
14
+ if (modifierActions.isGroupOfValues(modifier))
15
+ label = modifierActions.getSelectedValues(modifier) || label;
16
+
17
+ return label;
18
+ })
19
+ .join(', ');
20
+
21
+ return description;
22
+ };
@@ -0,0 +1,57 @@
1
+ module.exports = ({ actions, modifierActions, utils }) => {
2
+ const { math } = utils;
3
+
4
+ const getCustomerTags = (customer = {}) =>
5
+ ((customer && customer.tags) || []).filter(Boolean);
6
+
7
+ return function getItemPrice({ item, cache, customer }) {
8
+ const modifiers = item.modifiers || [];
9
+ let { priceLevels } = item;
10
+
11
+ // get cache Item
12
+ if (cache && cache.items) {
13
+ const orgItem = actions.findOriginalItem({
14
+ item,
15
+ cache,
16
+ });
17
+ ({ priceLevels } = orgItem);
18
+ }
19
+
20
+ if (!priceLevels) return 0;
21
+
22
+ const extendedTags = modifierActions.getExtendedTags(modifiers);
23
+ const customerTags = getCustomerTags(customer).concat(extendedTags);
24
+
25
+ const matchedPriceLevels = priceLevels.filter(
26
+ priceLevel =>
27
+ priceLevel.tags &&
28
+ priceLevel.tags.every(tag => customerTags.includes(tag))
29
+ );
30
+ if (!matchedPriceLevels.length) return 0;
31
+ const maxPriceLevel = matchedPriceLevels.reduce(
32
+ (prevPriceLevel, priceLevel) => {
33
+ const curLength = priceLevel.tags.length;
34
+ const preLength = prevPriceLevel.tags.length;
35
+
36
+ if (curLength > preLength) return priceLevel;
37
+ if (preLength === curLength && priceLevel.value < prevPriceLevel.value)
38
+ return priceLevel;
39
+
40
+ return prevPriceLevel;
41
+ }
42
+ );
43
+
44
+ const { value } = maxPriceLevel;
45
+
46
+ const overridPriceModifier = modifiers.find(each =>
47
+ modifierActions.isPriceOverride(each)
48
+ );
49
+ if (overridPriceModifier && overridPriceModifier.compute) {
50
+ if (modifierActions.isMultiplier(overridPriceModifier))
51
+ return math.mul(value, overridPriceModifier.compute.amount);
52
+ return overridPriceModifier.compute.amount;
53
+ }
54
+
55
+ return value;
56
+ };
57
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ utils }) =>
2
+ function getItemsTotalPaid({ orderItems = [] }) {
3
+ return (
4
+ orderItems.reduce(
5
+ (t, item) => utils.math.add(t, item && item.totalPaid),
6
+ 0
7
+ ) || 0
8
+ );
9
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function getItemsTotalPieces(items) {
3
+ return items.reduce(
4
+ (total, item) => total + actions.getTotalPieces(item),
5
+ 0
6
+ );
7
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function getNotIncludedModifiers({ item, modifiers }) {
3
+ if (!item || !item.modifiers || !modifiers) return [];
4
+ return modifiers.filter(
5
+ each =>
6
+ !item.modifiers.find(
7
+ modifier =>
8
+ each._id === modifier.modifierId || each._id === modifier._id
9
+ )
10
+ );
11
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getParentItem(items, item) {
3
+ if (!Array.isArray(items) || !item) return null;
4
+ return items.find(each => each._id === item.properties.parentId);
5
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getPendingIndex(items) {
3
+ if (!items || !items.length) return -1;
4
+ return items.findIndex(each => each.isPending);
5
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotal(item) {
4
+ if (!item || !item.subTotals) return 0;
5
+
6
+ return math.add(item.subTotals._simple, item.subTotals._direct);
7
+ };
8
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotalPieces(item) {
4
+ if (!item) return 0;
5
+ return math.mul(item.quantity || 1, item.pieces || 1);
6
+ };
7
+ };
@@ -0,0 +1,25 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotals(items) {
4
+ if (!Array.isArray(items)) return { total: 0, subTotals: {} };
5
+ return items.reduce(
6
+ (acc, item) => {
7
+ const subTotals = {};
8
+ const { subTotals: itemSubTotals = {} } = item;
9
+ const keys = Object.keys(itemSubTotals);
10
+ // eslint-disable-next-line no-restricted-syntax
11
+ for (const key of keys)
12
+ subTotals[key] = math.add(
13
+ acc.subTotals[key] || 0,
14
+ itemSubTotals[key]
15
+ );
16
+
17
+ return {
18
+ total: math.add(acc.total, item.total),
19
+ subTotals,
20
+ };
21
+ },
22
+ { total: 0, subTotals: {} }
23
+ );
24
+ };
25
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasCreateSubscription(items) {
3
+ return (
4
+ Array.isArray(items) &&
5
+ items.some(item => modifierActions.hasCreateSubscription(item.modifiers))
6
+ );
7
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = () =>
2
+ function hasModifier({ item, modifier }) {
3
+ if (!item || !modifier || !item.modifiers) return false;
4
+
5
+ const itemModifier = item.modifiers.find(
6
+ each =>
7
+ (each.modifierId &&
8
+ (each.modifierId === modifier.modifierId ||
9
+ each.modifierId === modifier._id)) ||
10
+ (typeof each.modifier === 'object' &&
11
+ each.modifier._id === modifier.modifierId)
12
+ );
13
+
14
+ return !!itemModifier;
15
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasModifierWithValue({ item, modifier, value }) {
3
+ if (!item || !modifier || !item.modifiers) return false;
4
+ const relatedModifier = item.modifiers.find(
5
+ itemModifier => modifier._id === itemModifier.modifierId
6
+ );
7
+ return modifierActions.isValueSelected({
8
+ modifier: relatedModifier,
9
+ value,
10
+ });
11
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function hasModifiers({ item, modifiers }) {
3
+ if (!item || !modifiers || !item.modifiers) return false;
4
+
5
+ return item.modifiers.some(
6
+ itemModifier =>
7
+ !!modifiers.find(each => each._id === itemModifier.modifierId)
8
+ );
9
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasSubscription(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return false;
4
+ return !!item.modifiers.find(each => modifierActions.isSubscription(each));
5
+ };
package/lib/item/index.js CHANGED
@@ -1,12 +1,82 @@
1
- const makeFilterByDirectModifiers = require('./filterByDirectModifiers');
2
- const makeAddIndirectModifier = require('./addIndirectModifier');
3
- const makeCalculate = require('./calculate');
4
-
5
- module.exports = (deps = {}) => {
6
- //
7
- return Object.freeze({
8
- calculate: makeCalculate(deps),
9
- addIndirectModifier: makeAddIndirectModifier(deps),
10
- filterByDirectModifiers: makeFilterByDirectModifiers(deps),
1
+ const getItemsTotalPieces = require('./getItemsTotalPieces');
2
+ const getTotalPieces = require('./getTotalPieces');
3
+ const removeModifier = require('./removeModifier');
4
+ const removeModifiers = require('./removeModifiers');
5
+ const findOriginalItem = require('./findOriginalItem');
6
+ const create = require('./create');
7
+ const hasModifier = require('./hasModifier');
8
+ const isSelected = require('./isSelected');
9
+ const hasModifiers = require('./hasModifiers');
10
+ const openRecommendationDialog = require('./openRecommendationDialog');
11
+ const addIndirectModifier = require('./addIndirectModifier');
12
+ const calculate = require('./calculate');
13
+ const filterByDirectModifiers = require('./filterByDirectModifiers');
14
+ const getItemPrice = require('./getItemPrice');
15
+ const getDepartmentModifiers = require('./getDepartmentModifiers');
16
+ const hasSubscription = require('./hasSubscription');
17
+ const removeModifierById = require('./removeModifierById');
18
+ const getDiscountModifiers = require('./getDiscountModifiers');
19
+ const getTotal = require('./getTotal');
20
+ const getPendingIndex = require('./getPendingIndex');
21
+ const getTotals = require('./getTotals');
22
+ const getNotIncludedModifiers = require('./getNotIncludedModifiers');
23
+ const hasModifierWithValue = require('./hasModifierWithValue');
24
+ const getBalanceToPay = require('./getBalanceToPay');
25
+ const getItemsTotalPaid = require('./getItemsTotalPaid');
26
+ const getItemModifiersDescription = require('./getItemModifiersDescription');
27
+ const isRelatedItem = require('./isRelatedItem');
28
+ const getParentItem = require('./getParentItem');
29
+ const isParentIncluded = require('./isParentIncluded');
30
+ const hasCreateSubscription = require('./hasCreateSubscription');
31
+ const getItemModifiers = require('./getItemModifiers');
32
+
33
+ const itemActions = (deps = {}) => {
34
+ const actions = {};
35
+
36
+ const innerDeps = {
37
+ ...deps,
38
+ actions,
39
+ };
40
+
41
+ const freezedActions = Object.freeze({
42
+ getItemsTotalPieces: getItemsTotalPieces(innerDeps),
43
+ getTotalPieces: getTotalPieces(innerDeps),
44
+ removeModifier: removeModifier(innerDeps),
45
+ removeModifiers: removeModifiers(innerDeps),
46
+ findOriginalItem: findOriginalItem(innerDeps),
47
+ create: create(innerDeps),
48
+ hasModifier: hasModifier(innerDeps),
49
+ isSelected: isSelected(innerDeps),
50
+ hasModifiers: hasModifiers(innerDeps),
51
+ openRecommendationDialog: openRecommendationDialog(innerDeps),
52
+ addIndirectModifier: addIndirectModifier(innerDeps),
53
+ calculate: calculate(innerDeps),
54
+ filterByDirectModifiers: filterByDirectModifiers(innerDeps),
55
+ getItemPrice: getItemPrice(innerDeps),
56
+ getDepartmentModifiers: getDepartmentModifiers(innerDeps),
57
+ hasSubscription: hasSubscription(innerDeps),
58
+ removeModifierById: removeModifierById(innerDeps),
59
+ getDiscountModifiers: getDiscountModifiers(innerDeps),
60
+ getTotal: getTotal(innerDeps),
61
+ getPendingIndex: getPendingIndex(innerDeps),
62
+ getTotals: getTotals(innerDeps),
63
+ getNotIncludedModifiers: getNotIncludedModifiers(innerDeps),
64
+ hasModifierWithValue: hasModifierWithValue(innerDeps),
65
+ getBalanceToPay: getBalanceToPay(innerDeps),
66
+ getItemsTotalPaid: getItemsTotalPaid(innerDeps),
67
+ getItemModifiersDescription: getItemModifiersDescription(innerDeps),
68
+ isRelatedItem: isRelatedItem(innerDeps),
69
+ getParentItem: getParentItem(innerDeps),
70
+ isParentIncluded: isParentIncluded(innerDeps),
71
+ hasCreateSubscription: hasCreateSubscription(innerDeps),
72
+ getItemModifiers: getItemModifiers(innerDeps),
11
73
  });
74
+
75
+ Object.keys(freezedActions).forEach(actionName => {
76
+ actions[actionName] = freezedActions[actionName];
77
+ });
78
+
79
+ return freezedActions;
12
80
  };
81
+
82
+ module.exports = itemActions;
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isParentIncluded(item) {
3
+ return item && item.properties && item.properties.includeParent;
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isRelatedItem(item) {
3
+ return !!(item && item.properties && item.properties.relatedItem);
4
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = ({ modifierActions, actions }) =>
2
+ function isSelected({ item, modifier }) {
3
+ if (!item || !item.modifiers || !modifier) return false;
4
+ let hasModifier = actions.hasModifier({ item, modifier });
5
+
6
+ if (!hasModifier && modifierActions.isGroupOfModifiers(modifier))
7
+ hasModifier = actions.hasModifiers({
8
+ item,
9
+ modifiers: modifier.properties.group.modifiers,
10
+ });
11
+
12
+ return hasModifier;
13
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function openRecommendationDialog(item) {
3
+ return !!(item && item.openRecommendationDialog);
4
+ };
@@ -0,0 +1,84 @@
1
+ module.exports = ({ modifierActions, _, actions }) => {
2
+ const hasRelatedItems = (modifiers = []) =>
3
+ !!modifiers.find(each => modifierActions.isGroupOfItems(each));
4
+
5
+ const isValid = (itemModifiers, modifier) => {
6
+ if (!modifierActions.findById(itemModifiers, modifier.modifierId))
7
+ return false;
8
+
9
+ if (
10
+ modifierActions.isRequired(modifier) &&
11
+ !modifierActions.isGroupOfValues(modifier) &&
12
+ !modifierActions.isRequiredAndOverride(modifier)
13
+ )
14
+ return false;
15
+
16
+ if (
17
+ !modifierActions.isGroupOfItems(modifier) &&
18
+ hasRelatedItems(itemModifiers)
19
+ )
20
+ return false;
21
+
22
+ return true;
23
+ };
24
+
25
+ return function removeModifier({
26
+ item,
27
+ modifier,
28
+ customer,
29
+ cache = {
30
+ items: [],
31
+ },
32
+ }) {
33
+ const nextItem = _.cloneDeep(item);
34
+ const itemModifiers = item.modifiers || [];
35
+ let modifiersToApply = [];
36
+
37
+ if (!isValid(itemModifiers, modifier)) return item;
38
+
39
+ // Check for multiple and add them to menuModifiers
40
+ if (modifierActions.hasAddModifiers(modifier)) {
41
+ const relatedModifiers = modifierActions.getRelatedModifiers(modifier);
42
+ // Removing only those children who are selected
43
+ const currentModifiersIds = itemModifiers.map(each => each.modifierId);
44
+ modifiersToApply = relatedModifiers.filter(each =>
45
+ currentModifiersIds.includes(each._id)
46
+ );
47
+ }
48
+
49
+ modifiersToApply.push(modifier);
50
+ // Remove
51
+ const nextModifiers = item.modifiers.filter(
52
+ each =>
53
+ !modifiersToApply.find(
54
+ mod =>
55
+ each.modifierId === mod._id ||
56
+ each._id === mod._id ||
57
+ each.modifierId === mod.modifierId
58
+ )
59
+ );
60
+
61
+ const hasOverride = modifiersToApply.find(each =>
62
+ modifierActions.isOverride(each)
63
+ );
64
+
65
+ if (hasOverride) {
66
+ const originalItem =
67
+ cache.items.find(_item => _item._id === item.itemId) || item;
68
+
69
+ if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
70
+
71
+ if (modifierActions.isPriceOverride(modifier))
72
+ nextItem.price = actions.getItemPrice({
73
+ item: originalItem,
74
+ cache,
75
+ customer,
76
+ });
77
+ }
78
+
79
+ return {
80
+ ...nextItem,
81
+ modifiers: nextModifiers,
82
+ };
83
+ };
84
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function removeModifierById({ item, modifierId }) {
3
+ if (!item || !modifierId) return item;
4
+ return {
5
+ ...item,
6
+ modifiers: item.modifiers.filter(modifier => modifier._id !== modifierId),
7
+ };
8
+ };
@@ -0,0 +1,14 @@
1
+ module.exports = ({ actions }) =>
2
+ function removeModifiers({ item, modifiers, cache, customer }) {
3
+ const newItem = modifiers.reduce(
4
+ (nextItem, modifier) =>
5
+ actions.removeModifier({
6
+ item: nextItem,
7
+ modifier,
8
+ cache,
9
+ customer,
10
+ }),
11
+ item
12
+ );
13
+ return newItem;
14
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = ({ actions }) =>
2
+ function addFile({ modifier, file, add = true }) {
3
+ if (!modifier || !file || !actions.isGroupOfValues(modifier)) return null;
4
+ let files = [...(modifier.properties.group.files || [])];
5
+
6
+ if (add) files.push(file);
7
+ else files = files.filter(each => each._id !== file._id);
8
+
9
+ return {
10
+ ...modifier,
11
+ properties: {
12
+ ...modifier.properties,
13
+ group: {
14
+ ...modifier.properties.group,
15
+ files,
16
+ },
17
+ },
18
+ };
19
+ };
@@ -0,0 +1,18 @@
1
+ module.exports = ({ actions }) =>
2
+ function addImage({ modifier, image, add = true }) {
3
+ if (!modifier || !image || !actions.isGroupOfValues(modifier)) return null;
4
+ let images = [...(modifier.properties.group.images || [])];
5
+ if (add) images.push(image);
6
+ else images = images.filter(each => each !== image);
7
+
8
+ return {
9
+ ...modifier,
10
+ properties: {
11
+ ...modifier.properties,
12
+ group: {
13
+ ...modifier.properties.group,
14
+ images,
15
+ },
16
+ },
17
+ };
18
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Get calculated modifier
3
+ */
4
+ module.exports = ({ _, constants, utils, localization, actions }) => {
5
+ const { math } = utils;
6
+ const { Modifier } = constants;
7
+
8
+ return function calculate(
9
+ modifier = {},
10
+ options = { price: 0, skip: false }
11
+ ) {
12
+ const { name, compute } = modifier;
13
+ const { type, action, amount = 0 } = compute || {};
14
+ const _computed = {
15
+ amount: 0,
16
+ description: '',
17
+ };
18
+ const maxAmount = actions.getProperty(modifier, 'maxAmount');
19
+ if (!options.skip) {
20
+ const multiplier = action === Modifier.Compute.Actions.SUBTRACT ? -1 : 1;
21
+
22
+ if (type === Modifier.Compute.Types.FIXED)
23
+ _computed.amount = math.mul(multiplier, amount);
24
+
25
+ if (type === Modifier.Compute.Types.PERCENTAGE)
26
+ _computed.amount = math.div(
27
+ math.mul(multiplier, options.price, amount),
28
+ 100
29
+ );
30
+
31
+ if (!type || action === Modifier.Compute.Actions.OVERRIDE)
32
+ _computed.amount = amount;
33
+
34
+ if (maxAmount && math.gt(math.abs(_computed.amount), maxAmount))
35
+ _computed.amount = maxAmount;
36
+ }
37
+
38
+ const localAmount = localization.formatAmount(_computed.amount);
39
+ _computed.description = `${name} (${localAmount})`;
40
+
41
+ return { ..._.cloneDeep(modifier), _computed };
42
+ };
43
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function contains(modifiers = [], modifier = null) {
3
+ if (!modifiers || !modifier) return false;
4
+ return !!modifiers.find(each => each.modifierId === modifier._id);
5
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function convertMenuModifiers(menuModifiers) {
3
+ if (!Array.isArray(menuModifiers)) return [];
4
+ return menuModifiers.map(each => each.modifier || each);
5
+ };
@@ -0,0 +1,44 @@
1
+ module.exports = ({ utils }) => {
2
+ const { helpers } = utils;
3
+
4
+ const defaults = {
5
+ name: '',
6
+ sku: '',
7
+ description: '',
8
+ group: '',
9
+ type: '',
10
+ attributes: [],
11
+ color: '',
12
+ backgroundColor: '',
13
+ icon: '',
14
+ url: '',
15
+ code: '',
16
+ tags: [],
17
+ order: 0,
18
+ included: false,
19
+ direct: true,
20
+ hidden: false,
21
+ required: false,
22
+ print: true,
23
+ delModifiers: [],
24
+ addModifiers: [],
25
+ conditions: null,
26
+ compute: null,
27
+ properties: {},
28
+ get _id() {
29
+ return helpers.getObjectID();
30
+ },
31
+ modifierId: null,
32
+ __typename: 'Modifier',
33
+ };
34
+
35
+ return function create(params) {
36
+ const { _id, modifierId, ...modifier } = params;
37
+ const parentId = modifierId || _id;
38
+ return {
39
+ ...defaults,
40
+ ...modifier,
41
+ modifierId: parentId,
42
+ };
43
+ };
44
+ };
@@ -0,0 +1,20 @@
1
+ module.exports = ({ constants, actions, utils }) => {
2
+ const { Modifier } = constants;
3
+ const { helpers } = utils;
4
+
5
+ return function createAmountOverrideModifier(params) {
6
+ return actions.create({
7
+ compute: {
8
+ amount: params.amount,
9
+ action: Modifier.Compute.Actions.OVERRIDE,
10
+ },
11
+ properties: {
12
+ override: { field: 'amount' },
13
+ },
14
+ attributes: [Modifier.Attributes.OVERRIDE],
15
+ name: `Modifier Amount ${Modifier.Compute.Actions.OVERRIDE}`,
16
+ included: true,
17
+ _id: helpers.getObjectID(),
18
+ });
19
+ };
20
+ };