@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
@@ -1,126 +0,0 @@
1
- const modifierActions = require('../lib/modifier/actions');
2
-
3
- describe('Modifier actions', () => {
4
- test('calculate with fix amount and add action', () => {
5
- const modifier = {
6
- type: 'fixed',
7
- action: 'add',
8
- amount: 10,
9
- name: 'someModifier',
10
- };
11
- const orderItem = { price: 30, quantity: 1 };
12
- const prices = modifierActions.pricing(modifier, orderItem);
13
- expect(prices && prices.subTotal).toBe(0);
14
- expect(prices && prices.discount).toBe(0);
15
- expect(prices && prices.fee).toBe(10);
16
- expect(prices && prices.tip).toBe(0);
17
- expect(prices && prices.tax).toBe(0);
18
- expect(prices && prices.distributed).toBe(0);
19
- });
20
-
21
- test('calculate with fix amount and subtract action', () => {
22
- const modifier = {
23
- type: 'fixed',
24
- action: 'subtract',
25
- amount: 10,
26
- name: 'someModifier',
27
- };
28
- const orderItem = { price: 30, quantity: 1 };
29
- const prices = modifierActions.pricing(modifier, orderItem);
30
- expect(prices && prices.subTotal).toBe(0);
31
- expect(prices && prices.discount).toBe(0);
32
- expect(prices && prices.fee).toBe(-10);
33
- expect(prices && prices.tip).toBe(0);
34
- expect(prices && prices.tax).toBe(0);
35
- expect(prices && prices.distributed).toBe(0);
36
- });
37
-
38
- test('calculate with percentage amount and subtract action', () => {
39
- const modifier = {
40
- amount: 20,
41
- type: 'percentage',
42
- action: 'subtract',
43
- };
44
- const orderItem = { price: 30, quantity: 1 };
45
- const prices = modifierActions.pricing(modifier, orderItem);
46
- expect(prices && prices.subTotal).toBe(0);
47
- expect(prices && prices.discount).toBe(0);
48
- expect(prices && prices.fee).toBe(-6);
49
- expect(prices && prices.tip).toBe(0);
50
- expect(prices && prices.tax).toBe(0);
51
- expect(prices && prices.distributed).toBe(0);
52
- });
53
-
54
- test('calculate with percentage amount and add action', () => {
55
- const modifier = { amount: 20, type: 'percentage', action: 'add' };
56
- const orderItem = { price: 30, quantity: 1 };
57
- const prices = modifierActions.pricing(modifier, orderItem);
58
- expect(prices && prices.subTotal).toBe(0);
59
- expect(prices && prices.discount).toBe(0);
60
- expect(prices && prices.fee).toBe(6);
61
- expect(prices && prices.tip).toBe(0);
62
- expect(prices && prices.tax).toBe(0);
63
- expect(prices && prices.distributed).toBe(0);
64
- });
65
-
66
- test('calculate with fix amount and override action', () => {
67
- const modifier = { amount: 10, type: 'fixed', action: 'override' };
68
- const orderItem = { price: 30, quantity: 1 };
69
- const prices = modifierActions.pricing(modifier, orderItem);
70
- expect(prices && prices.subTotal).toBe(10);
71
- expect(prices && prices.discount).toBe(0);
72
- expect(prices && prices.fee).toBe(0);
73
- expect(prices && prices.tip).toBe(0);
74
- expect(prices && prices.tax).toBe(0);
75
- expect(prices && prices.distributed).toBe(0);
76
- });
77
-
78
- test('calculate with fix amount, subtract action and discount attribute', () => {
79
- const modifier = { amount: 10, type: 'fixed', action: 'subtract', attributes: ['discount'] };
80
- const orderItem = { price: 30, quantity: 1 };
81
- const prices = modifierActions.pricing(modifier, orderItem);
82
- expect(prices && prices.subTotal).toBe(0);
83
- expect(prices && prices.discount).toBe(-10);
84
- expect(prices && prices.fee).toBe(0);
85
- expect(prices && prices.tip).toBe(0);
86
- expect(prices && prices.tax).toBe(0);
87
- expect(prices && prices.distributed).toBe(0);
88
- });
89
-
90
- test('calculate many', () => {
91
- const modifiers = [
92
- { amount: 20, type: 'percentage', action: 'add' },
93
- { amount: 20, type: 'percentage', action: 'subtract' },
94
- { amount: 2, type: 'fixed', action: 'subtract' },
95
- ];
96
- const orderItem = { price: 30, quantity: 2 };
97
- const prices = modifierActions.pricingModifiers(modifiers, orderItem);
98
- expect(prices).toMatchObject({
99
- subTotal: 0,
100
- tax: 0,
101
- fee: -4,
102
- tip: 0,
103
- discount: 0,
104
- distributed: 0,
105
- total: -4,
106
- });
107
- });
108
-
109
- test('calculate many discount modifier', () => {
110
- const modifiers = [
111
- { amount: 20, type: 'percentage', action: 'add', attributes: ['discount'] },
112
- { amount: 20, type: 'percentage', action: 'subtract', attributes: ['discount'] },
113
- { amount: 2, type: 'fixed', action: 'subtract', attributes: ['discount'] },
114
- ];
115
- const orderItem = { price: 30, quantity: 2 };
116
- const prices = modifierActions.pricingModifiers(modifiers, orderItem);
117
- expect(prices).toMatchObject({
118
- tax: 0,
119
- fee: 0,
120
- tip: 0,
121
- discount: -4,
122
- distributed: 0,
123
- total: -4,
124
- });
125
- });
126
- });
@@ -1,140 +0,0 @@
1
- const modifierConstants = require('../modifier/constants');
2
- const modifierActions = require('../modifier/actions');
3
- const { math, defaultPrices } = require('../utils');
4
-
5
- /**
6
- * Remove order modifiers from items
7
- */
8
- const _removeOrderModifiers = items =>
9
- items.map(item => ({
10
- ...item,
11
- modifiers: (item.modifiers || []).filter(
12
- modifier => !modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed)
13
- ),
14
- }));
15
-
16
- /**
17
- * Get items with order modifier
18
- */
19
- const _getOrderModifiers = (items = []) =>
20
- items
21
- .reduce((modifiers, item) => [...modifiers, ...(item.modifiers || [])], [])
22
- .filter(modifier =>
23
- !modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed)
24
- )
25
- .filter(modifier =>
26
- modifierActions._hasAttribute(modifier, modifierConstants.attributes.order)
27
- );
28
-
29
- /**
30
- * Get Total prices of items
31
- */
32
- const _itemsPricing = (items = []) =>
33
- items.reduce(
34
- (prices, item) => ({
35
- tax: math.add(prices.tax, item.tax),
36
- subTotal: math.add(prices.subTotal, item.subTotal),
37
- discount: math.add(prices.discount, item.discount),
38
- distributed: math.add(prices.distributed, item.distributed),
39
- total: math.add(prices.total, item.total),
40
- fee: math.add(prices.fee, item.fee),
41
- }),
42
- defaultPrices
43
- );
44
-
45
- /**
46
- * add order modifier to items
47
- */
48
- const _addOrderModifier = (order, items, modifier) => {
49
- const itemsModifiers = {};
50
- if (!(modifierActions._hasAttribute(modifier, modifierConstants.attributes.discount) ||
51
- modifierActions._hasAttribute(modifier, modifierConstants.attributes.promotion))
52
- )
53
- return itemsModifiers;
54
- // get distributed price in order level
55
- const modifierPrices = modifierActions.pricing(modifier, {
56
- price: order.total,
57
- quantity: 1,
58
- });
59
- const orderModifierTotal = math.abs(modifierPrices.discount);
60
-
61
- const totalDistributed = items.reduce((acc, item) => {
62
- const distributedMod = modifierActions._createDistributedModifier(order, item, modifier);
63
- itemsModifiers[item._id] = distributedMod;
64
- return math.add(acc, math.mul(distributedMod.amount, item.quantity));
65
- }, 0);
66
-
67
- // check validation
68
- if (math.abs(totalDistributed) !== math.abs(orderModifierTotal)) {
69
- const difference = math.sub(orderModifierTotal, totalDistributed);
70
- // console.log('difference => ', difference);
71
- const selectedItem = items.find(item => math.sub(item.total, difference) > 0);
72
-
73
- const distributedMod = itemsModifiers[selectedItem._id];
74
- itemsModifiers[selectedItem._id] = {
75
- ...distributedMod,
76
- amount: math.add(distributedMod.amount, math.div(difference, selectedItem.quantity)),
77
- };
78
- }
79
-
80
- return itemsModifiers;
81
- };
82
-
83
- /**
84
- * Get prices of an item
85
- */
86
- const pricing = item => {
87
- const { modifiers = [] } = item;
88
- const price = parseFloat(item.price);
89
- const quantity = parseInt(item.quantity, 10);
90
- const subTotal = math.mul(price, quantity);
91
-
92
- if (modifiers.length) {
93
- const modifiersPrices = modifierActions.pricingModifiers(modifiers, {
94
- price,
95
- quantity,
96
- });
97
- const total = math.add(subTotal, modifiersPrices.total);
98
- return { ...modifiersPrices, price, total, subTotal };
99
- }
100
-
101
- return { ...defaultPrices, price, total: subTotal, subTotal };
102
- };
103
-
104
- /**
105
- * Get a calculated item
106
- */
107
- const calculateItem = item => {
108
- const descriptions = [];
109
- const modifiers = (item.modifiers || []).map(each => {
110
- const description = modifierActions._getDescription(each);
111
- if(!modifierActions._hasAttribute(each, modifierConstants.attributes.distributed))
112
- descriptions.push(description);
113
- return { ...each, description };
114
- });
115
- //
116
- const prices = pricing(item);
117
-
118
- return {
119
- ...item,
120
- modifiers,
121
- ...prices,
122
- description: descriptions.join(', '),
123
- };
124
- };
125
-
126
- /**
127
- * Get calculated items
128
- */
129
- const calculateItems = (items = []) => items.map(item => calculateItem(item));
130
-
131
- //
132
- module.exports = {
133
- calculateItem,
134
- calculateItems,
135
- pricing,
136
- _getOrderModifiers,
137
- _removeOrderModifiers,
138
- _addOrderModifier,
139
- _itemsPricing,
140
- };
@@ -1,172 +0,0 @@
1
- const { math, applyQuantity, defaultPrices, objId } = require('../utils');
2
- const constants = require('./constants');
3
-
4
- /**
5
- * If Modifier has an attribute
6
- */
7
- const _hasAttribute = (modifier = {}, attribute) => {
8
- if (!Array.isArray(modifier.attributes)) return false;
9
- const { attributes = [] } = modifier;
10
- return attributes.includes(attribute);
11
- };
12
-
13
- //
14
- const _getNonOrderOverrideModifiers = (modifiers = []) =>
15
- modifiers.filter(
16
- modifier =>
17
- !_hasAttribute(modifier, constants.attributes.order) && modifier.action !== 'override'
18
- );
19
-
20
- //
21
- const _getTotalOverrideModifier = (modifiers = []) =>
22
- modifiers.find(modifier => _hasAttribute(modifier, constants.attributes.modifierTotalOverride));
23
-
24
- //
25
- const _getDistributedModifiers = (modifiers = []) =>
26
- modifiers.filter(modifier => _hasAttribute(modifier, constants.attributes.distributed));
27
-
28
- /**
29
- * create a distrubuted Modifier based on Order and Item
30
- */
31
- const _createDistributedModifier = (order, item, modifier) => {
32
- let { attributes } = modifier;
33
-
34
- // if (!attributes.includes(constants.attributes.distributed))
35
- // attributes = [...(modifier.attributes || []), constants.attributes.distributed];
36
-
37
- let modifierAmount = 0;
38
-
39
- if (modifier.type === 'percentage')
40
- modifierAmount = math.div(math.mul(order.total, modifier.amount), 100);
41
- else ({ amount: modifierAmount } = modifier);
42
-
43
- const amountToApply = math.div(math.mul(modifierAmount, item.total), order.total, item.quantity);
44
- return {
45
- _id: objId(),
46
- ...modifier,
47
- type: 'fixed',
48
- attributes: [constants.attributes.distributed], //attributes.filter(a => a !== constants.attributes.order),
49
- amount: amountToApply,
50
- };
51
- };
52
-
53
- /**
54
- * Get Description of a modifier based on its fields
55
- */
56
- const descriptionType = {
57
- 'fixed': (amount, symbol) => [symbol, math.toFixed(amount)].filter(Boolean).join(''),
58
- 'percentage': (amount, symbol) => [symbol, amount, '%'].filter(Boolean).join('')
59
- };
60
- const _getDescription = (modifier = {}) => {
61
- const { name, amount, properties = {}, action, type } = modifier;
62
- if (
63
- _hasAttribute(modifier, constants.attributes.list) &&
64
- properties.selectedValue &&
65
- Array.isArray(properties.selectedValue)
66
- )
67
- return properties.selectedValue.join(', ');
68
-
69
- const symbol = constants.symbols[action];
70
- const amountStr = math.gt(amount, 0)
71
- ? `(${descriptionType[type](amount, symbol)})`
72
- : null;
73
- const description = [name, amountStr].filter(Boolean).join('');
74
-
75
- return description;
76
- };
77
-
78
- /**
79
- * Get pricing of modifier
80
- */
81
- const pricing = (modifier = {}, options = { price: 0, quantity: 1 }) => {
82
- const isType = type => modifier.type === type;
83
- const isAction = action => modifier.action === action;
84
-
85
- let actionValue = 1;
86
- let amount = 0;
87
- const prices = { ...defaultPrices };
88
- const minItems = (modifier.properties || {}).minItems || 0;
89
- const isOverrideModifier = isAction('override');
90
-
91
- if (isAction('add')) actionValue = 1;
92
- else if (isAction('subtract')) actionValue = -1;
93
- else if (isOverrideModifier) actionValue = 1;
94
-
95
- if (isType('fixed')) amount = parseFloat(modifier.amount);
96
- else if (isType('percentage')) amount = math.div(math.mul(options.price, modifier.amount), 100);
97
-
98
- const value = math.mul(actionValue, amount);
99
- if (isOverrideModifier) prices.subTotal = value;
100
- // TODO: promotion needs to be fixed
101
- else if (
102
- (_hasAttribute(modifier, constants.attributes.discount) ||
103
- _hasAttribute(modifier, constants.attributes.promotion)) &&
104
- ((minItems > 0 && options.quantity && options.quantity >= minItems) || minItems <= 0)
105
- )
106
- prices.discount = value;
107
- else if (_hasAttribute(modifier, constants.attributes.tax)) prices.tax = value;
108
- else if (_hasAttribute(modifier, constants.attributes.gratuity)) prices.tip = value;
109
-
110
- // TODO: upcharges needs to be added to fee
111
- else if (
112
- _hasAttribute(modifier, constants.attributes.paymentMethods) ||
113
- _hasAttribute(modifier, constants.attributes.paymentTypes) ||
114
- !modifier.attributes || !modifier.attributes.length // for Upcharge
115
- )
116
- prices.fee = value;
117
-
118
- //
119
- else prices.subTotal = value;
120
-
121
- if (_hasAttribute(modifier, constants.attributes.distributed))
122
- prices.distributed = math.add(prices.discount, prices.tax, prices.subTotal);
123
-
124
- return applyQuantity(prices, options.quantity);
125
- };
126
-
127
- /**
128
- * Get pricing of modifirs in item
129
- */
130
- const pricingModifiers = (modifiers, options = { price: 0, quantity: 1 }) => {
131
- const modifierDPrices = { ...defaultPrices };
132
- if (!modifiers.length) return modifierDPrices;
133
-
134
- // get modifiers in order level and without override action
135
- const itemModifiers = _getNonOrderOverrideModifiers(modifiers);
136
- // get distributed modifiers
137
- const distributedModifiers = _getDistributedModifiers(itemModifiers);
138
- // find one override modifier
139
- const totalOverrideModifier = _getTotalOverrideModifier(modifiers);
140
-
141
- if (totalOverrideModifier) {
142
- modifierDPrices.subTotal = totalOverrideModifier.amount;
143
- modifierDPrices.total = totalOverrideModifier.amount;
144
- }
145
- const modifiersToCalculate = totalOverrideModifier ? distributedModifiers : itemModifiers;
146
-
147
- const prices = modifiersToCalculate.reduce((acc, modifier) => {
148
- const modifierPrices = pricing(modifier, options);
149
- const subTotal = math.add(acc.subTotal, modifierPrices.subTotal);
150
- const tax = math.add(acc.tax, modifierPrices.tax);
151
- const fee = math.add(acc.fee, modifierPrices.fee);
152
- const tip = math.add(acc.tip, modifierPrices.tip);
153
- const discount = math.add(acc.discount, modifierPrices.discount);
154
- const distributed = math.add(acc.distributed, modifierPrices.distributed);
155
- return { subTotal, tax, fee, tip, discount, distributed };
156
- }, modifierDPrices);
157
-
158
- prices.total = math.add(prices.subTotal, prices.tax, prices.fee, prices.tip, prices.discount);
159
- return prices;
160
- };
161
-
162
- //
163
- module.exports = {
164
- pricing,
165
- pricingModifiers,
166
- _getDescription,
167
- _hasAttribute,
168
- _getDistributedModifiers,
169
- _getNonOrderOverrideModifiers,
170
- _getTotalOverrideModifier,
171
- _createDistributedModifier,
172
- };
@@ -1,46 +0,0 @@
1
- const primaryAttributes = {
2
- promotion: 'promotion',
3
- discount: 'discount',
4
- tax: 'tax',
5
- paymentMethods: 'paymentMethods',
6
- paymentTypes: 'paymentTypes',
7
- group: 'group',
8
- list: 'list',
9
- priceOverride: 'priceOverride',
10
- quantityOverride: 'quantityOverride',
11
- department: 'department',
12
- starch: 'starch',
13
- };
14
-
15
- const secondAttributes = {
16
- hidden: 'hidden',
17
- required: 'required',
18
- default: 'default',
19
- order: 'order',
20
- relatedItems: 'relatedItems',
21
- recommended: 'recommended',
22
- category: 'category',
23
- multiple: 'multiple',
24
- bind: 'bind',
25
- customerTagsExtend: 'customerTagsExtend',
26
- removeModifiers: 'removeModifiers',
27
- };
28
-
29
- const attributes = {
30
- ...primaryAttributes,
31
- ...secondAttributes,
32
- gratuity: 'gratuity',
33
- subscription: 'subscription',
34
- distributed: 'distributed',
35
- modifierTotalOverride: 'modifierTotalOverride',
36
- };
37
-
38
- const symbols = {
39
- add: '+',
40
- subtract: '-',
41
- };
42
-
43
- module.exports = {
44
- attributes,
45
- symbols,
46
- };
@@ -1,47 +0,0 @@
1
- const { uniqBy, cloneDeep } = require('lodash');
2
- const itemActions = require('../item/actions');
3
- const modifierActions = require('../modifier/actions');
4
-
5
- /**
6
- * return calculated Order
7
- */
8
- const calculateOrder = order => {
9
- const { items = [] } = order;
10
- if (!items.length) return order;
11
-
12
- // WNDM: with not distributed modifiers
13
- let itemsWNDM = [];
14
- let newOrder = null;
15
- let prices = {};
16
-
17
- const orderItemsModifiers = itemActions._getOrderModifiers(items);
18
- const concatModifiers = [...(order.modifiers || []), ...orderItemsModifiers];
19
- const modifiers = uniqBy(concatModifiers, '_id');
20
- // if there is no order level modifiers, we have to remove them from items
21
- itemsWNDM = itemActions._removeOrderModifiers(items);
22
- itemsWNDM = itemActions.calculateItems(itemsWNDM);
23
- prices = itemActions._itemsPricing(itemsWNDM);
24
- newOrder = { ...order, ...prices, items: itemsWNDM };
25
-
26
- if (!modifiers.length) return newOrder;
27
-
28
- const newItems = itemsWNDM || items;
29
- let itemsWDM = cloneDeep(newItems);
30
- modifiers.forEach(mod => {
31
- const itemsModifiers = itemActions._addOrderModifier(newOrder, newItems, mod);
32
- // adding the modifiers to items
33
- itemsWDM = itemsWDM.map(item => ({
34
- ...item,
35
- modifiers: [...(item.modifiers || []), itemsModifiers[item._id]].filter(Boolean),
36
- }));
37
- });
38
-
39
- const calculatedItemWDM = itemActions.calculateItems(itemsWDM);
40
- prices = itemActions._itemsPricing(calculatedItemWDM);
41
- return { ...order, ...prices, items: calculatedItemWDM };
42
- };
43
-
44
- //
45
- module.exports = {
46
- calculateOrder,
47
- };
@@ -1,10 +0,0 @@
1
- module.exports = {
2
- subTotal: 0,
3
- total: 0,
4
- tax: 0,
5
- discount: 0,
6
- fee: 0,
7
- tip: 0,
8
- distributed: 0,
9
- totalPaid: 0,
10
- };
@@ -1,26 +0,0 @@
1
- const ObjectID = require('bson-objectid');
2
- const math = require('./math');
3
- const defaultPrices = require('./defaultPrices');
4
-
5
- const objId = () => ObjectID();
6
-
7
- const applyQuantity = (prices = defaultPrices, quantity = 1) =>
8
- Object.keys(prices).reduce(
9
- (obj, key) => ({
10
- ...obj,
11
- [key]: math.mul(prices[key], quantity),
12
- }),
13
- prices
14
- );
15
-
16
- const filterExports = funcs => {
17
- const names = Object.keys(funcs).filter(name => !name.includes('_'));
18
- return names.reduce((newFuncs, name) => ({ ...newFuncs, [name]: funcs[name] }), {});
19
- };
20
-
21
- //
22
- module.exports = {
23
- objId,
24
- applyQuantity,
25
- filterExports,
26
- };
@@ -1,9 +0,0 @@
1
- const helpers = require('./helpers');
2
- const math = require('./math');
3
- const defaultPrices = require('./defaultPrices');
4
-
5
- module.exports = {
6
- ...helpers,
7
- math,
8
- defaultPrices,
9
- };
package/lib/utils/math.js DELETED
@@ -1,71 +0,0 @@
1
- const Decimal = require('decimal.js');
2
-
3
- //
4
- const add = (...args) => {
5
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
6
-
7
- const sum = args.reduce((acc, current) => acc.add(Decimal(current)), Decimal(0));
8
-
9
- // console.log('add =>', args, ' : ', sum);
10
- return Decimal(sum.toFixed(2, 1)).toNumber();
11
- };
12
-
13
- //
14
- const sub = (...args) => {
15
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
16
-
17
- const numbers = [...args];
18
- const first = numbers.shift();
19
- const sum = numbers.reduce((acc, current) => acc.sub(Decimal(current)), Decimal(first));
20
-
21
- // console.log('sub =>', args, ' : ', sum);
22
- return Decimal(sum.toFixed(2, 1)).toNumber();
23
- };
24
-
25
- //
26
- const mul = (...args) => {
27
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
28
-
29
- const sum = args.reduce((acc, current) => acc.mul(Decimal(current)), Decimal(1));
30
-
31
- // console.log('mul =>', args, ' : ', sum);
32
- return Decimal(sum.toFixed(2, 1)).toNumber();
33
- };
34
-
35
- //
36
- const div = (...args) => {
37
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
38
-
39
- const numbers = [...args];
40
- const first = numbers.shift();
41
- const sum = numbers.reduce((acc, current) => acc.div(Decimal(current)), Decimal(first));
42
-
43
- // console.log('div =>', args, ' : ', sum);
44
- return Decimal(sum.toFixed(2, 1)).toNumber();
45
- };
46
-
47
- //
48
- const lte = (x, y) => Decimal(x).lte(Decimal(y));
49
-
50
- //
51
- const gt = (x, y) => Decimal(x).gt(Decimal(y));
52
-
53
- //
54
- const abs = x =>
55
- Decimal(x)
56
- .abs()
57
- .toNumber();
58
-
59
- //
60
- const toFixed = x => Decimal(x).toFixed(2, 1);
61
-
62
- module.exports = {
63
- mul,
64
- div,
65
- add,
66
- sub,
67
- abs,
68
- lte,
69
- gt,
70
- toFixed,
71
- };