@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,10 @@
1
+ module.exports = ({ actions }) =>
2
+ function isEditable(modifier) {
3
+ const { properties = {} } = modifier || {};
4
+ return !!(
5
+ actions.isGroupOfValues(modifier) &&
6
+ properties &&
7
+ properties.group &&
8
+ properties.group.editGroupValues
9
+ );
10
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = ({ constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isGratuity(modifier) {
4
+ return !!(modifier && modifier.type === Modifier.Types.GRATUITY);
5
+ };
6
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ actions, constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isGroupOfItems(modifier) {
4
+ const { properties = {} } = modifier || {};
5
+ return !!(
6
+ actions.hasAttribute(modifier, Modifier.Attributes.GROUP) &&
7
+ properties &&
8
+ properties.group &&
9
+ (properties.group.items || []).length
10
+ );
11
+ };
12
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ actions, constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isGroupOfModifiers(modifier) {
4
+ const { properties = {} } = modifier || {};
5
+ return !!(
6
+ actions.hasAttribute(modifier, Modifier.Attributes.GROUP) &&
7
+ properties &&
8
+ properties.group &&
9
+ (properties.group.modifiers || []).length
10
+ );
11
+ };
12
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = ({ actions, constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isGroupOfValues(modifier) {
4
+ const { properties = {} } = modifier || {};
5
+ return !!(
6
+ actions.hasAttribute(modifier, Modifier.Attributes.GROUP) &&
7
+ properties &&
8
+ properties.group &&
9
+ ((properties.group.values || []).length ||
10
+ (properties.group.selectedValues || []).length)
11
+ );
12
+ };
13
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isHidden(modifier) {
3
+ return modifier.hidden;
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isIncluded(modifier) {
3
+ return modifier.included;
4
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function isManual(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.properties &&
6
+ modifier.properties.override &&
7
+ modifier.properties.override.type === 'manual'
8
+ );
9
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function isMultiplier(modifier) {
3
+ if (!modifier) return false;
4
+ const _modifier = modifier.modifier || modifier;
5
+ return !!(
6
+ _modifier &&
7
+ _modifier.properties &&
8
+ _modifier.properties.override &&
9
+ _modifier.properties.override.multiplier
10
+ );
11
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = ({ actions, constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isOverride(modifier) {
4
+ return actions.hasAttribute(modifier, Modifier.Attributes.OVERRIDE);
5
+ };
6
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function isPaymentMethods(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.conditions &&
6
+ (modifier.conditions.paymentMethods || []).length
7
+ );
8
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function isPaymentTypes(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.conditions &&
6
+ (modifier.conditions.paymentTypes || []).length
7
+ );
8
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = ({ settings, _ }) => {
2
+ const getPreferencesSettings = () => _.get(settings, 'types.preferences', []);
3
+
4
+ return function isPreferences(modifier) {
5
+ const preferences = getPreferencesSettings();
6
+ return modifier.group && preferences.includes(modifier.group.toLowerCase());
7
+ };
8
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function isPriceOverride(modifier) {
3
+ return !!(
4
+ actions.isOverride(modifier) &&
5
+ modifier.properties.override.field === 'price'
6
+ );
7
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = ({ constants, actions }) => {
2
+ const { Modifier } = constants;
3
+ return function isPromotion(modifier) {
4
+ return actions.hasAttribute(modifier, Modifier.Attributes.PROMOTION);
5
+ };
6
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function isQuantityOverride(modifier) {
3
+ return (
4
+ actions.isOverride(modifier) &&
5
+ modifier.properties.override.field === 'quantity'
6
+ );
7
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isRemoveModifier(modifier) {
3
+ return !!(modifier && (modifier.delModifiers || []).length);
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isRequired(modifier) {
3
+ return modifier && modifier.required;
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = ({ actions }) =>
2
+ function isRequiredAndOverride(modifier) {
3
+ return actions.isOverride(modifier) && actions.isRequired(modifier);
4
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function isService(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.properties &&
6
+ modifier.properties.override &&
7
+ modifier.properties.override.type === 'service'
8
+ );
9
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function isSingleValue(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.properties &&
6
+ modifier.properties.group &&
7
+ modifier.properties.group.singleValue
8
+ );
9
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = ({ constants, actions }) => {
2
+ const { Modifier } = constants;
3
+ return function isSubscription(modifier) {
4
+ return actions.hasAttribute(modifier, Modifier.Attributes.SUBSCRIPTION);
5
+ };
6
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = ({ _ }) =>
2
+ function isTrackUsageSubscription(modifier) {
3
+ const subscription = _.get(modifier, 'properties.subscription');
4
+ return !!(subscription && subscription.enabled && subscription.trackUsage);
5
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function isValueSelected({ modifier, value }) {
3
+ if (!modifier || !value) return false;
4
+ if (!actions.isGroupOfValues(modifier)) return false;
5
+ if (!Array.isArray(modifier.properties.group.selectedValues)) return false;
6
+ return modifier.properties.group.selectedValues.includes(value);
7
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = ({ actions }) =>
2
+ function purifyModifiers(modifiers) {
3
+ if (!modifiers) return [];
4
+ const removeIds = modifiers
5
+ .filter(modifier => actions.isRemoveModifier(modifier))
6
+ .reduce(
7
+ (acc, modifier) => [
8
+ ...acc,
9
+ modifier.properties.delModifiers.map(each => each._id),
10
+ ],
11
+ []
12
+ );
13
+
14
+ return modifiers.filter(each => !removeIds.includes(each.modifierId));
15
+ };
@@ -0,0 +1,35 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ module.exports = () => {
3
+ function compareValues(key, order = 'asc') {
4
+ return function innerSort(a, b) {
5
+ // property doesn't exist on either object
6
+ if (
7
+ !a.properties ||
8
+ !a.properties.hasOwnProperty(key) ||
9
+ !b.properties ||
10
+ !b.properties.hasOwnProperty(key)
11
+ )
12
+ return 0;
13
+
14
+ const varA =
15
+ typeof a.properties[key] === 'string'
16
+ ? a.properties[key].toUpperCase()
17
+ : a.properties[key];
18
+ const varB =
19
+ typeof b.properties[key] === 'string'
20
+ ? b.properties[key].toUpperCase()
21
+ : b.properties[key];
22
+
23
+ let comparison = 0;
24
+ if (varA > varB) comparison = 1;
25
+ else if (varA < varB) comparison = -1;
26
+ return order === 'desc' ? comparison * -1 : comparison;
27
+ };
28
+ }
29
+
30
+ return function sort(modifiers) {
31
+ if (!modifiers || !Array.isArray(modifiers)) return modifiers;
32
+ const compare = compareValues('sort');
33
+ return modifiers.sort(compare);
34
+ };
35
+ };
@@ -0,0 +1,27 @@
1
+ module.exports = ({ modifierActions, _ }) => {
2
+ const getCreditModifierIndex = modifiers => {
3
+ if (!modifiers) return -1;
4
+ return modifiers.findIndex(each => modifierActions.isCredit(each));
5
+ };
6
+ //
7
+ return function addCreditModifier({ order, customerStoredCredit }) {
8
+ if (!order || !customerStoredCredit) return order;
9
+ const nextOrder = _.cloneDeep(order);
10
+ const { modifiers = [] } = nextOrder;
11
+ let creditModifier;
12
+ const index = getCreditModifierIndex(modifiers);
13
+ if (index > -1) {
14
+ creditModifier = modifiers[index];
15
+ modifiers.splice(index, 1);
16
+ }
17
+ creditModifier = modifierActions.createCreditModifier({
18
+ ...creditModifier,
19
+ customerStoredCredit,
20
+ });
21
+ modifiers.push(creditModifier);
22
+ return {
23
+ ...nextOrder,
24
+ modifiers,
25
+ };
26
+ };
27
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ actions }) =>
2
+ function addDiscountModifier({ order, modifier }) {
3
+ if (!order || !modifier) return order;
4
+ const clearedOrder = actions.removeDiscountModifier(order);
5
+ return actions.addModifier({
6
+ order: clearedOrder,
7
+ modifier,
8
+ });
9
+ };
@@ -0,0 +1,292 @@
1
+ module.exports = ({
2
+ actions,
3
+ itemActions,
4
+ modifierActions,
5
+ utils,
6
+ settings,
7
+ _,
8
+ }) => {
9
+ const { math } = utils;
10
+ const orderSettings = _.get(settings, 'order');
11
+
12
+ const getQuantity = ({ order, item, pendingItemIndex = -1 }) => {
13
+ let pendingItemQty = 0;
14
+ if (pendingItemIndex > -1) {
15
+ pendingItemQty = order.items[pendingItemIndex].quantity;
16
+ }
17
+ return pendingItemQty || item.quantity || 1;
18
+ };
19
+
20
+ const getItem = ({ order, item, pendingItemIndex }) => {
21
+ const { items = [] } = order;
22
+ const hasAggregation = actions.hasAggregate({ order, item });
23
+
24
+ if (hasAggregation) {
25
+ const aggregateItems = actions.getSameItems({ order, item });
26
+ const idx = items.findIndex(each =>
27
+ aggregateItems.find(aItem => aItem.itemId === each.itemId)
28
+ );
29
+
30
+ const aggregateItem = items[idx];
31
+ aggregateItem.quantity += getQuantity({ order, item, pendingItemIndex });
32
+ return [aggregateItem, idx, hasAggregation];
33
+ }
34
+
35
+ const newItem = itemActions.create({
36
+ ...item,
37
+ modifiers: [],
38
+ quantity: item.quantity || 1,
39
+ itemId: item.itemId,
40
+ pieces: itemActions.isRelatedItem(item) ? 0 : item.pieces,
41
+ });
42
+
43
+ return [newItem];
44
+ };
45
+
46
+ const getInventory = item => {
47
+ const { inventory } = item;
48
+
49
+ if (!inventory) return null;
50
+
51
+ return {
52
+ ...inventory,
53
+ name: item.name,
54
+ isNew: true,
55
+ };
56
+ };
57
+
58
+ const getSubscription = ({ order, item, combined, cache }) => {
59
+ const [hasSubscription, remaining, used] = actions.hasRemainingSubscription(
60
+ {
61
+ order,
62
+ item,
63
+ combined,
64
+ }
65
+ );
66
+ let orderItem = item;
67
+
68
+ if (!hasSubscription) return orderItem;
69
+
70
+ const subscriptionModifiers = modifierActions.getSubscriptionModifiers(
71
+ orderItem.modifiers
72
+ );
73
+ if (!_.isEmpty(subscriptionModifiers)) {
74
+ orderItem = itemActions.removeModifiers({
75
+ item: orderItem,
76
+ modifiers: subscriptionModifiers,
77
+ cache,
78
+ customer: order.customer,
79
+ });
80
+ }
81
+
82
+ const { quantity, price } = orderItem;
83
+ let numberOfUses = quantity;
84
+ if (remaining) {
85
+ const left = remaining - (used || 0);
86
+ if (quantity > left) numberOfUses = left;
87
+ }
88
+
89
+ const modifier = modifierActions.createSubscriptionModifier({
90
+ amount: math.mul(numberOfUses, price),
91
+ properties: { subscription: { numberOfUses } },
92
+ });
93
+ orderItem.modifiers.push(modifier);
94
+
95
+ return orderItem;
96
+ };
97
+
98
+ const addOrderItem = ({ itemIndex, order, item }) => {
99
+ if (itemIndex > -1) {
100
+ const updatedOrder = actions.updateItem({
101
+ order,
102
+ itemIndex,
103
+ item,
104
+ });
105
+
106
+ return [updatedOrder, itemIndex, item];
107
+ }
108
+
109
+ let { items = [] } = order;
110
+ if (orderSettings.orderAddToTop) items = [item, ...items];
111
+ else items.push(item);
112
+
113
+ const updatedOrder = { ...order, items };
114
+ return [
115
+ updatedOrder,
116
+ orderSettings.orderAddToTop ? 0 : items.length - 1,
117
+ item,
118
+ ];
119
+ };
120
+
121
+ const reArrangeNewItem = ({ nextOrder, nextItemIndex }) => {
122
+ const reArrangedOrder = { ...nextOrder };
123
+ const shouldMoveToTop = orderSettings.orderAddToTop && nextItemIndex > 0;
124
+ const shouldMoveToBottom =
125
+ !orderSettings.orderAddToTop &&
126
+ nextItemIndex < reArrangedOrder.items.length - 1;
127
+
128
+ if (shouldMoveToTop || shouldMoveToBottom) {
129
+ if (shouldMoveToTop) {
130
+ const [itemToMove] = reArrangedOrder.items.splice(nextItemIndex, 1);
131
+ reArrangedOrder.items.unshift(itemToMove);
132
+ return { reArrangedOrder, newIndex: 0 };
133
+ }
134
+ const [itemToMove] = reArrangedOrder.items.splice(nextItemIndex, 1);
135
+ reArrangedOrder.items.push(itemToMove);
136
+ return {
137
+ reArrangedOrder,
138
+ newIndex: reArrangedOrder.items.length - 1,
139
+ };
140
+ }
141
+
142
+ // Nothing should be rearranged
143
+ return {};
144
+ };
145
+
146
+ const getUnselectedModifiers = (item, modifiers) => {
147
+ const ids = item.modifiers.map(each => each.modifierId).filter(Boolean);
148
+ return modifiers.filter(
149
+ each => !ids.includes(each.modifierId) && !ids.includes(each._id)
150
+ );
151
+ };
152
+
153
+ return function addItem({
154
+ order: orderProp,
155
+ item,
156
+ itemIndex,
157
+ cache,
158
+ overridenQuantity,
159
+ }) {
160
+ if (!orderProp || !item) return orderProp;
161
+
162
+ let order = _.cloneDeep(orderProp);
163
+ const { itemModifiers, ...itemToAdd } = item;
164
+ const customer = actions.getCustomer(order);
165
+ const modifiersToAdd = [];
166
+
167
+ const pendingItemIndex = actions.getPendingItemIndex(order);
168
+
169
+ let [orderItem, idx, combined] = getItem({
170
+ item: itemToAdd,
171
+ order,
172
+ pendingItemIndex,
173
+ });
174
+
175
+ // Default modifiers
176
+ if (idx === undefined && !_.isEmpty(item.modifiers))
177
+ modifiersToAdd.push(
178
+ ...item.modifiers.map(each => modifierActions.create(each))
179
+ );
180
+
181
+ const pendingItem = actions.getSelectedItem({ order, itemIndex });
182
+
183
+ if (pendingItem && pendingItem.isPending && !combined) {
184
+ idx = itemIndex;
185
+ combined = !!pendingItem.itemId;
186
+ orderItem.quantity = pendingItem.quantity;
187
+ orderItem.isPending = !orderItem.itemId;
188
+ // add inventory
189
+ if (pendingItem.inventory) {
190
+ const inventory = getInventory(pendingItem);
191
+ if (inventory) {
192
+ orderItem.inventory = inventory;
193
+ if (inventory.serial) orderItem.serial = inventory.serial;
194
+ const modifiers = modifierActions.getEntityModifiers(inventory);
195
+ if (!_.isEmpty(modifiers)) modifiersToAdd.push(...modifiers);
196
+ }
197
+ }
198
+ }
199
+
200
+ if (overridenQuantity > -1) {
201
+ orderItem.quantity = overridenQuantity;
202
+ }
203
+
204
+ if (!combined) {
205
+ // add price
206
+ orderItem.price = itemActions.getItemPrice({
207
+ cache,
208
+ customer,
209
+ item: orderItem,
210
+ });
211
+ if (itemActions.isRelatedItem(orderItem)) {
212
+ // console.log('CHECKING Parent ...', orderItem.properties);
213
+ const parent = itemActions.getParentItem(order.items, orderItem);
214
+ // get inherited modifiers
215
+ const inheritedModifiers = modifierActions.getInheritedModifiers({
216
+ parent,
217
+ child: item,
218
+ });
219
+ if (!_.isEmpty(inheritedModifiers))
220
+ modifiersToAdd.push(...inheritedModifiers);
221
+ // Remove parent if it is only a repair Item
222
+ if (!itemActions.isParentIncluded(orderItem)) {
223
+ order = actions.removeItem({ order, item: parent, hard: false });
224
+ }
225
+ }
226
+ }
227
+
228
+ // add modifiers
229
+ let requiredModifiers = modifierActions.getItemModifiers({
230
+ modifiers: itemModifiers,
231
+ customer,
232
+ cache,
233
+ });
234
+ // Do not add again if they are already there
235
+ if (
236
+ !_.isEmpty(requiredModifiers) &&
237
+ combined &&
238
+ !_.isEmpty(orderItem.modifiers)
239
+ )
240
+ requiredModifiers = getUnselectedModifiers(orderItem, requiredModifiers);
241
+ if (!_.isEmpty(requiredModifiers))
242
+ modifiersToAdd.push(...requiredModifiers);
243
+
244
+ orderItem = getSubscription({
245
+ order,
246
+ item: orderItem,
247
+ combined,
248
+ cache,
249
+ });
250
+
251
+ const params = addOrderItem({
252
+ order,
253
+ item: orderItem,
254
+ itemIndex: idx,
255
+ });
256
+ let [nextOrder, nextItemIndex] = params;
257
+ const [, , nextItem] = params;
258
+
259
+ if (modifiersToAdd.length) {
260
+ // console.log('Adding Modifier to the item index ...', nextItemIndex);
261
+ nextOrder = modifiersToAdd.reduce(
262
+ (acc, modifier) =>
263
+ actions.addItemModifier({
264
+ itemIndex: nextItemIndex,
265
+ order: acc,
266
+ modifier,
267
+ cache,
268
+ }),
269
+ nextOrder
270
+ );
271
+ }
272
+
273
+ const { reArrangedOrder, newIndex } = reArrangeNewItem({
274
+ nextOrder,
275
+ nextItemIndex,
276
+ });
277
+
278
+ if (reArrangedOrder && newIndex) {
279
+ nextOrder = { ...reArrangedOrder };
280
+ nextItemIndex = newIndex;
281
+ }
282
+
283
+ // Need to delete any pending Items if the current was combined
284
+
285
+ if (combined && pendingItemIndex > -1 && idx !== itemIndex) {
286
+ const idxToRemove = actions.getPendingItemIndex(nextOrder);
287
+ nextOrder.items.splice(idxToRemove, 1);
288
+ }
289
+
290
+ return [nextOrder, nextItemIndex, nextItem];
291
+ };
292
+ };