@darkpos/pricing 1.0.43 → 1.0.45

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 (79) hide show
  1. package/__TEST__/item/getItemsModifierDescription.test.js +75 -78
  2. package/__TEST__/mocks/addItemMock.js +18729 -19357
  3. package/__TEST__/mocks/partially-paid/order-modifiers.json +48 -51
  4. package/__TEST__/mocks/partially-paid/order-partially-paid.json +893 -860
  5. package/__TEST__/mocks/scripts/calculate-partially-paid/index.js +2 -2
  6. package/__TEST__/mocks/scripts/calculate-unpaid/index.js +2 -2
  7. package/__TEST__/mocks/unpaid/order-modifiers.json +48 -52
  8. package/__TEST__/modifier/calculate.test.js +1 -0
  9. package/__TEST__/modifier/getMatchTagsModifiers.test.js +72 -18
  10. package/__TEST__/modifier/getModifierIndex.test.js +10 -7
  11. package/__TEST__/modifier/getRecommendedModifiers.test.js +6 -4
  12. package/__TEST__/modifier/hasAttribute.test.js +11 -5
  13. package/__TEST__/modifier/hasMatchTags.test.js +33 -11
  14. package/__TEST__/modifier/sort.test.js +1 -1
  15. package/__TEST__/order/conditionsNotMet.test.js +133 -0
  16. package/__TEST__/order/manualSplit.test.js +104 -0
  17. package/__TEST__/order/order-payment-modifier.test.js +1117 -0
  18. package/__TEST__/order/order.test.js +53 -105
  19. package/__TEST__/order/pickEndDate.test.js +7 -153
  20. package/__TEST__/order/validateConditionsCalculate.test.js +396 -0
  21. package/lib/constants/index.js +1 -1
  22. package/lib/index.js +11 -2
  23. package/lib/item/calculate.js +93 -18
  24. package/lib/item/getAmounts.js +14 -0
  25. package/lib/item/getBalance.js +0 -1
  26. package/lib/item/getItemModifiersDescription.js +1 -0
  27. package/lib/item/getItemsBalance.js +9 -0
  28. package/lib/item/getItemsTotals.js +27 -0
  29. package/lib/item/getTotal.js +3 -1
  30. package/lib/item/hasPaymentMethodType.js +17 -0
  31. package/lib/item/hasPaymentModifierWithPaymentId.js +9 -0
  32. package/lib/item/index.js +15 -8
  33. package/lib/item/removePaymentModifiersByPaymentId.js +13 -0
  34. package/lib/modifier/areConditionsMet.js +61 -0
  35. package/lib/modifier/calculatePaymentDiscountModifier.js +31 -0
  36. package/lib/modifier/calculatePaymentFeeModifier.js +27 -0
  37. package/lib/modifier/calculatePaymentModifier.js +67 -0
  38. package/lib/modifier/createDiscountModifier.js +2 -1
  39. package/lib/modifier/createFeeModifier.js +2 -1
  40. package/lib/modifier/getChildren.js +8 -0
  41. package/lib/modifier/getComputedAmount.js +9 -0
  42. package/lib/modifier/hasPaymentMethodType.js +14 -0
  43. package/lib/modifier/index.js +33 -9
  44. package/lib/modifier/isCalculatedPaymentModifier.js +4 -0
  45. package/lib/modifier/isChild.js +6 -0
  46. package/lib/modifier/isDiscount.js +6 -2
  47. package/lib/modifier/isFee.js +5 -2
  48. package/lib/modifier/isPaymentMethodModifier.js +4 -1
  49. package/lib/modifier/isPaymentTypeModifier.js +4 -1
  50. package/lib/modifier/isPercentage.js +10 -0
  51. package/lib/modifier/isValid.js +12 -0
  52. package/lib/modifier/sort.js +28 -0
  53. package/lib/modifier/validate.js +14 -0
  54. package/lib/modifier/validateDateDaysDiff.js +30 -0
  55. package/lib/modifier/validateInArr.js +12 -0
  56. package/lib/modifier/validateNumberCondition.js +20 -0
  57. package/lib/modifier/validateRequiredModifiers.js +16 -0
  58. package/lib/order/addItemModifier.js +72 -28
  59. package/lib/order/applyPayment.js +61 -0
  60. package/lib/order/calculate.js +45 -22
  61. package/lib/order/getBalance.js +0 -1
  62. package/lib/order/getOrdersBalance.js +8 -0
  63. package/lib/order/index.js +9 -10
  64. package/lib/order/manualSplit.js +34 -0
  65. package/lib/order/manualSplitByQuantity.js +50 -0
  66. package/lib/store/getRecommendedEndDate.js +13 -0
  67. package/lib/store/index.js +25 -0
  68. package/package.json +6 -4
  69. package/lib/item/getBalanceToPay.js +0 -12
  70. package/lib/item/getTotals.js +0 -40
  71. package/lib/item/markModifiersAsLocked.js +0 -11
  72. package/lib/modifier/createPaymentModifier.js +0 -12
  73. package/lib/modifier/findByPaymentMethod.js +0 -10
  74. package/lib/modifier/findByPaymentType.js +0 -10
  75. package/lib/modifier/getLockedModifiers.js +0 -5
  76. package/lib/order/markModifiersAsLocked.js +0 -14
  77. package/lib/order/removeModifiersWithPaymentMethods.js +0 -29
  78. package/lib/order/removeModifiersWithPaymentTypes.js +0 -27
  79. package/lib/{order → store}/pickEndDate.js +2 -2
@@ -0,0 +1,9 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasPaymentModifierWithPaymentId({ item, paymentId }) {
3
+ if (!item || !Array.isArray(item.modifiers) || !paymentId) return false;
4
+
5
+ return item.modifiers.some(
6
+ modifier =>
7
+ modifierActions.getProperty(modifier, 'paymentId') === paymentId
8
+ );
9
+ };
package/lib/item/index.js CHANGED
@@ -20,10 +20,9 @@ const removeModifierById = require('./removeModifierById');
20
20
  const getDiscountModifiers = require('./getDiscountModifiers');
21
21
  const getTotal = require('./getTotal');
22
22
  const getPendingIndex = require('./getPendingIndex');
23
- const getTotals = require('./getTotals');
23
+ const getItemsTotals = require('./getItemsTotals');
24
24
  const getNotIncludedModifiers = require('./getNotIncludedModifiers');
25
25
  const hasModifierWithValue = require('./hasModifierWithValue');
26
- const getBalanceToPay = require('./getBalanceToPay');
27
26
  const getItemsTotalPaid = require('./getItemsTotalPaid');
28
27
  const getItemModifiersDescription = require('./getItemModifiersDescription');
29
28
  const isRelatedItem = require('./isRelatedItem');
@@ -31,12 +30,16 @@ const getParentItem = require('./getParentItem');
31
30
  const isParentIncluded = require('./isParentIncluded');
32
31
  const hasCreateSubscription = require('./hasCreateSubscription');
33
32
  const getItemModifiers = require('./getItemModifiers');
34
- const markModifiersAsLocked = require('./markModifiersAsLocked');
35
- const getBalance = require('./getBalance');
33
+ const getItemsBalance = require('./getItemsBalance');
36
34
  const isFullyPaid = require('./isFullyPaid');
37
35
  const getTotalPrice = require('./getTotalPrice');
38
36
  const removePaymentModifiers = require('./removePaymentModifiers');
39
37
  const getItems = require('./getItems');
38
+ const getAmounts = require('./getAmounts');
39
+ const hasPaymentMethodType = require('./hasPaymentMethodType');
40
+ const removePaymentModifiersByPaymentId = require('./removePaymentModifiersByPaymentId');
41
+ const hasPaymentModifierWithPaymentId = require('./hasPaymentModifierWithPaymentId');
42
+ const getBalance = require('./getBalance');
40
43
 
41
44
  const itemActions = (deps = {}) => {
42
45
  const actions = {};
@@ -69,10 +72,9 @@ const itemActions = (deps = {}) => {
69
72
  getDiscountModifiers: getDiscountModifiers(innerDeps),
70
73
  getTotal: getTotal(innerDeps),
71
74
  getPendingIndex: getPendingIndex(innerDeps),
72
- getTotals: getTotals(innerDeps),
75
+ getItemsTotals: getItemsTotals(innerDeps),
73
76
  getNotIncludedModifiers: getNotIncludedModifiers(innerDeps),
74
77
  hasModifierWithValue: hasModifierWithValue(innerDeps),
75
- getBalanceToPay: getBalanceToPay(innerDeps),
76
78
  getItemsTotalPaid: getItemsTotalPaid(innerDeps),
77
79
  getItemModifiersDescription: getItemModifiersDescription(innerDeps),
78
80
  isRelatedItem: isRelatedItem(innerDeps),
@@ -80,12 +82,17 @@ const itemActions = (deps = {}) => {
80
82
  isParentIncluded: isParentIncluded(innerDeps),
81
83
  hasCreateSubscription: hasCreateSubscription(innerDeps),
82
84
  getItemModifiers: getItemModifiers(innerDeps),
83
- markModifiersAsLocked: markModifiersAsLocked(innerDeps),
84
- getBalance: getBalance(innerDeps),
85
+ getItemsBalance: getItemsBalance(innerDeps),
85
86
  isFullyPaid: isFullyPaid(innerDeps),
86
87
  getTotalPrice: getTotalPrice(innerDeps),
87
88
  removePaymentModifiers: removePaymentModifiers(innerDeps),
88
89
  getItems: getItems(innerDeps),
90
+ getAmounts: getAmounts(innerDeps),
91
+ hasPaymentMethodType: hasPaymentMethodType(innerDeps),
92
+ removePaymentModifiersByPaymentId:
93
+ removePaymentModifiersByPaymentId(innerDeps),
94
+ hasPaymentModifierWithPaymentId: hasPaymentModifierWithPaymentId(innerDeps),
95
+ getBalance: getBalance(innerDeps),
89
96
  });
90
97
 
91
98
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,13 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function removePaymentModifiersByPaymentId({ item, paymentId }) {
3
+ if (!item || !Array.isArray(item.modifiers) || !paymentId) return item;
4
+
5
+ return {
6
+ ...item,
7
+ modifiers: item.modifiers.filter(
8
+ modifier =>
9
+ !modifierActions.getProperty(modifier, 'paymentId') ||
10
+ modifierActions.getProperty(modifier, 'paymentId') !== paymentId
11
+ ),
12
+ };
13
+ };
@@ -0,0 +1,61 @@
1
+ module.exports = ({ actions }) => {
2
+ const modifierConditionPass = (
3
+ modifier,
4
+ { item, startRequestDate, endRequestDate }
5
+ ) =>
6
+ modifier.conditions && Array.isArray(modifier.conditions.rules)
7
+ ? modifier.conditions.rules.every(condition => {
8
+ switch (condition.key) {
9
+ case 'itemPieces':
10
+ return actions.validateNumberCondition(
11
+ item.pieces,
12
+ condition.value,
13
+ condition.operand
14
+ );
15
+ case 'itemQuantity':
16
+ return actions.validateNumberCondition(
17
+ item.quantity,
18
+ condition.value,
19
+ condition.operand
20
+ );
21
+ case 'modifiers':
22
+ return actions.validateRequiredModifiers(
23
+ item.modifiers,
24
+ condition.value,
25
+ condition.operand
26
+ );
27
+ case 'endDateDays':
28
+ return actions.validateDateDaysDiff(
29
+ startRequestDate,
30
+ endRequestDate,
31
+ condition.value,
32
+ condition.operand
33
+ );
34
+ case 'paymentMethods':
35
+ return false;
36
+ case 'paymentTypes':
37
+ return false;
38
+ default:
39
+ return false;
40
+ }
41
+ }) || modifier.locked
42
+ : true;
43
+
44
+ function areConditionsMet(modifier, opts) {
45
+ const {
46
+ item = null,
47
+ endRequestDate = null,
48
+ startRequestDate = null,
49
+ } = opts;
50
+ // const recommendedEndDate = storeActions.getRecommendedEndDate();
51
+ return (
52
+ modifier &&
53
+ modifierConditionPass(modifier, {
54
+ item,
55
+ startRequestDate,
56
+ endRequestDate,
57
+ })
58
+ );
59
+ }
60
+ return areConditionsMet;
61
+ };
@@ -0,0 +1,31 @@
1
+ module.exports = ({ utils, actions, constants }) => {
2
+ const { math } = utils;
3
+
4
+ return function calculatePaymentDiscountModifier({
5
+ paymentModifier,
6
+ amountToPay,
7
+ }) {
8
+ let amount = 0;
9
+
10
+ if (actions.isFixed(paymentModifier)) {
11
+ amount = paymentModifier.compute.amount;
12
+ }
13
+
14
+ if (actions.isPercentage(paymentModifier)) {
15
+ const discountAmount = math.div(paymentModifier.compute.amount, 100);
16
+
17
+ amount = math.sub(
18
+ math.div(amountToPay, math.sub(1, discountAmount)),
19
+ amountToPay
20
+ );
21
+ }
22
+
23
+ return actions.createDiscountModifier({
24
+ amount,
25
+ type: constants.Modifier.Compute.Types.FIXED,
26
+ modifierId: paymentModifier.modifierId,
27
+ _id: paymentModifier._id,
28
+ properties: paymentModifier.properties,
29
+ });
30
+ };
31
+ };
@@ -0,0 +1,27 @@
1
+ module.exports = ({ utils, actions, constants }) => {
2
+ const { math } = utils;
3
+
4
+ return function calculatePaymentDiscountModifier({
5
+ paymentModifier,
6
+ amountToPay,
7
+ }) {
8
+ let amount = 0;
9
+
10
+ if (actions.isFixed(paymentModifier)) {
11
+ amount = paymentModifier.compute.amount;
12
+ }
13
+
14
+ if (actions.isPercentage(paymentModifier)) {
15
+ const feeAmount = math.div(paymentModifier.compute.amount, 100);
16
+ amount = math.mul(amountToPay, feeAmount);
17
+ }
18
+
19
+ return actions.createFeeModifier({
20
+ amount,
21
+ type: constants.Modifier.Compute.Types.FIXED,
22
+ modifierId: paymentModifier.modifierId,
23
+ _id: paymentModifier._id,
24
+ properties: paymentModifier.properties,
25
+ });
26
+ };
27
+ };
@@ -0,0 +1,67 @@
1
+ module.exports = ({ actions, utils }) => {
2
+ const { math } = utils;
3
+
4
+ return function calculatePaymentFeeModifier({
5
+ paymentModifier: paymentModifierParam,
6
+ amountToPay: amountToPayParam,
7
+ itemBalance: itemBalanceParam,
8
+ paymentMethod,
9
+ paymentType,
10
+ paymentId,
11
+ }) {
12
+ if (
13
+ !actions.hasPaymentMethodType({
14
+ paymentModifier: paymentModifierParam,
15
+ paymentMethod,
16
+ paymentType,
17
+ })
18
+ )
19
+ return undefined;
20
+
21
+ const paymentModifier = {
22
+ ...paymentModifierParam,
23
+ properties: {
24
+ ...(paymentModifierParam.properties || {}),
25
+ isCalculatedPaymentModifier: true,
26
+ paymentId,
27
+ },
28
+ };
29
+
30
+ const itemBalance =
31
+ typeof itemBalanceParam === 'number' ? itemBalanceParam : 0;
32
+
33
+ const calculatedPaymentMod = actions.calculate(paymentModifier, {
34
+ price: itemBalance,
35
+ quantity: 1,
36
+ });
37
+
38
+ const balanceIncludingPaymentModifier = math.add(
39
+ itemBalance,
40
+ calculatedPaymentMod._computed.amount
41
+ );
42
+
43
+ let amountToPay =
44
+ typeof amountToPayParam === 'number' ? amountToPayParam : 0;
45
+
46
+ amountToPay =
47
+ amountToPay && amountToPay < balanceIncludingPaymentModifier
48
+ ? amountToPay
49
+ : balanceIncludingPaymentModifier;
50
+
51
+ if (actions.isDiscount(paymentModifier)) {
52
+ return actions.calculatePaymentDiscountModifier({
53
+ amountToPay,
54
+ paymentModifier,
55
+ });
56
+ }
57
+
58
+ if (actions.isAdd(paymentModifier)) {
59
+ return actions.calculatePaymentFeeModifier({
60
+ amountToPay,
61
+ paymentModifier,
62
+ });
63
+ }
64
+
65
+ return undefined;
66
+ };
67
+ };
@@ -2,7 +2,7 @@ module.exports = ({ constants, actions, localization }) => {
2
2
  const { Modifier } = constants;
3
3
 
4
4
  return function createDiscountModifier(params) {
5
- const { amount, type, properties } = params;
5
+ const { amount, type, properties, ...rest } = params;
6
6
  const { formatAmount } = localization;
7
7
 
8
8
  const name =
@@ -21,6 +21,7 @@ module.exports = ({ constants, actions, localization }) => {
21
21
  properties: {
22
22
  ...properties,
23
23
  },
24
+ ...rest,
24
25
  });
25
26
  };
26
27
  };
@@ -2,7 +2,7 @@ module.exports = ({ constants, actions, localization }) => {
2
2
  const { Modifier } = constants;
3
3
 
4
4
  return function createFeeModifier(params) {
5
- const { amount, type, properties } = params;
5
+ const { amount, type, properties, ...rest } = params;
6
6
  const { formatAmount } = localization;
7
7
 
8
8
  const name =
@@ -22,6 +22,7 @@ module.exports = ({ constants, actions, localization }) => {
22
22
  ignoreQuantity: true,
23
23
  ...properties,
24
24
  },
25
+ ...rest,
25
26
  });
26
27
  };
27
28
  };
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function getChildren({ parentModifier, modifiers }) {
3
+ if (!parentModifier || !Array.isArray(modifiers)) return [];
4
+
5
+ return modifiers.filter(
6
+ modifier => modifier._parentId === parentModifier._id
7
+ );
8
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ utils }) =>
2
+ function getComputedAmount({ modifiers }) {
3
+ if (!Array.isArray(modifiers)) return 0;
4
+
5
+ return modifiers.reduce(
6
+ (prevVal, currVal) => utils.math.add(prevVal, currVal._computed.amount),
7
+ 0
8
+ );
9
+ };
@@ -0,0 +1,14 @@
1
+ module.exports = ({ actions }) =>
2
+ function hasPaymentMethodType({
3
+ paymentModifier,
4
+ paymentMethod,
5
+ paymentType,
6
+ }) {
7
+ return (
8
+ actions.isPaymentModifier(paymentModifier) &&
9
+ paymentModifier.conditions.rules.some(
10
+ rule =>
11
+ rule.value.includes(paymentMethod) || rule.value.includes(paymentType)
12
+ )
13
+ );
14
+ };
@@ -19,8 +19,6 @@ const duplicate = require('./duplicate');
19
19
  const enableAutoPopup = require('./enableAutoPopup');
20
20
  const filterByRequiredModifiers = require('./filterByRequiredModifiers');
21
21
  const findById = require('./findById');
22
- const findByPaymentMethod = require('./findByPaymentMethod');
23
- const findByPaymentType = require('./findByPaymentType');
24
22
  const getAvailablePromotions = require('./getAvailablePromotions');
25
23
  const getAvailablePromotionsOrSubscriptions = require('./getAvailablePromotionsOrSubscriptions');
26
24
  const getAvailableSubscriptions = require('./getAvailableSubscriptions');
@@ -82,6 +80,7 @@ const isDirect = require('./isDirect');
82
80
  const hasNoTags = require('./hasNoTags');
83
81
  const isRemoveModifier = require('./isRemoveModifier');
84
82
  const isGroupOfModifiers = require('./isGroupOfModifiers');
83
+ const areConditionsMet = require('./areConditionsMet');
85
84
  const isRequiredAndOverride = require('./isRequiredAndOverride');
86
85
  const isManual = require('./isManual');
87
86
  const isPriceOverride = require('./isPriceOverride');
@@ -102,6 +101,7 @@ const isDefault = require('./isDefault');
102
101
  const isIncluded = require('./isIncluded');
103
102
  const isCustomerTagsExtend = require('./isCustomerTagsExtend');
104
103
  const isAmountOverride = require('./isAmountOverride');
104
+ const isValid = require('./isValid');
105
105
  const isDiscount = require('./isDiscount');
106
106
  const isHidden = require('./isHidden');
107
107
  const isIgnoreQuantity = require('./isIgnoreQuantity');
@@ -117,22 +117,33 @@ const isCredit = require('./isCredit');
117
117
  const purifyModifiers = require('./purifyModifiers');
118
118
  const sort = require('./sort');
119
119
  const isPaymentModifier = require('./isPaymentModifier');
120
- const createPaymentModifier = require('./createPaymentModifier');
121
120
  const isSubtract = require('./isSubtract');
122
121
  const isFixed = require('./isFixed');
123
122
  const isFixedAdd = require('./isFixedAdd');
124
123
  const isFee = require('./isFee');
125
124
  const isAdd = require('./isAdd');
126
125
  const mutateModifier = require('./mutateModifier');
127
-
128
126
  const isFixedDiscount = require('./isFixedDiscount');
129
127
  const removeLocked = require('./removeLocked');
130
128
  const hasItems = require('./hasItems');
131
- const getLockedModifiers = require('./getLockedModifiers');
132
129
  const getGroupedModifiers = require('./getGroupedModifiers');
133
130
  const getNotesToModifierTags = require('./getNotesToModifierTags');
134
131
  const isOptionsOverride = require('./isOptionsOverride');
135
132
  const getGroupedModifierLabels = require('./getGroupedModifierLabels');
133
+ const validate = require('./validate');
134
+ const validateNumberCondition = require('./validateNumberCondition');
135
+ const validateRequiredModifiers = require('./validateRequiredModifiers');
136
+ const validateDateDaysDiff = require('./validateDateDaysDiff');
137
+ const validateInArr = require('./validateInArr');
138
+ const isPercentage = require('./isPercentage');
139
+ const getChildren = require('./getChildren');
140
+ const getComputedAmount = require('./getComputedAmount');
141
+ const hasPaymentMethodType = require('./hasPaymentMethodType');
142
+ const calculatePaymentModifier = require('./calculatePaymentModifier');
143
+ const calculatePaymentDiscountModifier = require('./calculatePaymentDiscountModifier');
144
+ const calculatePaymentFeeModifier = require('./calculatePaymentFeeModifier');
145
+ const isCalculatedPaymentModifier = require('./isCalculatedPaymentModifier');
146
+ const isChild = require('./isChild');
136
147
 
137
148
  const modifierActions = (deps = {}) => {
138
149
  const actions = {};
@@ -163,8 +174,6 @@ const modifierActions = (deps = {}) => {
163
174
  enableAutoPopup: enableAutoPopup(innerDeps),
164
175
  filterByRequiredModifiers: filterByRequiredModifiers(innerDeps),
165
176
  findById: findById(innerDeps),
166
- findByPaymentMethod: findByPaymentMethod(innerDeps),
167
- findByPaymentType: findByPaymentType(innerDeps),
168
177
  getAvailablePromotions: getAvailablePromotions(innerDeps),
169
178
  getAvailablePromotionsOrSubscriptions:
170
179
  getAvailablePromotionsOrSubscriptions(innerDeps),
@@ -247,6 +256,7 @@ const modifierActions = (deps = {}) => {
247
256
  isDefault: isDefault(innerDeps),
248
257
  isCustomerTagsExtend: isCustomerTagsExtend(innerDeps),
249
258
  isAmountOverride: isAmountOverride(innerDeps),
259
+ isValid: isValid(innerDeps),
250
260
  isDiscount: isDiscount(innerDeps),
251
261
  isHidden: isHidden(innerDeps),
252
262
  isIgnoreQuantity: isIgnoreQuantity(innerDeps),
@@ -262,13 +272,11 @@ const modifierActions = (deps = {}) => {
262
272
  purifyModifiers: purifyModifiers(innerDeps),
263
273
  sort: sort(innerDeps),
264
274
  isPaymentModifier: isPaymentModifier(innerDeps),
265
- createPaymentModifier: createPaymentModifier(innerDeps),
266
275
  isSubtract: isSubtract(innerDeps),
267
276
  isFixed: isFixed(innerDeps),
268
277
  isFixedDiscount: isFixedDiscount(innerDeps),
269
278
  removeLocked: removeLocked(innerDeps),
270
279
  hasItems: hasItems(innerDeps),
271
- getLockedModifiers: getLockedModifiers(innerDeps),
272
280
  isFixedAdd: isFixedAdd(innerDeps),
273
281
  isFee: isFee(innerDeps),
274
282
  isAdd: isAdd(innerDeps),
@@ -277,6 +285,22 @@ const modifierActions = (deps = {}) => {
277
285
  getNotesToModifierTags: getNotesToModifierTags(innerDeps),
278
286
  isOptionsOverride: isOptionsOverride(innerDeps),
279
287
  getGroupedModifierLabels: getGroupedModifierLabels(innerDeps),
288
+ validate: validate(innerDeps),
289
+ validateNumberCondition: validateNumberCondition(innerDeps),
290
+ validateRequiredModifiers: validateRequiredModifiers(innerDeps),
291
+ validateDateDaysDiff: validateDateDaysDiff(innerDeps),
292
+ validateInArr: validateInArr(innerDeps),
293
+ areConditionsMet: areConditionsMet(innerDeps),
294
+ isPercentage: isPercentage(innerDeps),
295
+ getChildren: getChildren(innerDeps),
296
+ getComputedAmount: getComputedAmount(innerDeps),
297
+ hasPaymentMethodType: hasPaymentMethodType(innerDeps),
298
+ calculatePaymentModifier: calculatePaymentModifier(innerDeps),
299
+ calculatePaymentDiscountModifier:
300
+ calculatePaymentDiscountModifier(innerDeps),
301
+ calculatePaymentFeeModifier: calculatePaymentFeeModifier(innerDeps),
302
+ isCalculatedPaymentModifier: isCalculatedPaymentModifier(innerDeps),
303
+ isChild: isChild(innerDeps),
280
304
  });
281
305
 
282
306
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,4 @@
1
+ module.exports = ({ actions }) =>
2
+ function isCalculatedPaymentModifier(modifier) {
3
+ return !!actions.getProperty(modifier, 'isCalculatedPaymentModifier');
4
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = () =>
2
+ function isChild({ parentModifier, modifier }) {
3
+ if (!parentModifier || !modifier) return false;
4
+
5
+ return modifier._parentId === parentModifier._id;
6
+ };
@@ -1,6 +1,10 @@
1
- module.exports = ({ constants }) => {
1
+ module.exports = ({ constants, actions }) => {
2
2
  const { Modifier } = constants;
3
3
  return function isDiscount(modifier) {
4
- return !!(modifier && modifier.type === Modifier.Types.DISCOUNT);
4
+ return !!(
5
+ modifier &&
6
+ (modifier.type === Modifier.Types.DISCOUNT ||
7
+ actions.isSubtract(modifier))
8
+ );
5
9
  };
6
10
  };
@@ -1,6 +1,9 @@
1
- module.exports = ({ constants }) => {
1
+ module.exports = ({ constants, actions }) => {
2
2
  const { Modifier } = constants;
3
3
  return function isFee(modifier) {
4
- return !!(modifier && modifier.type === Modifier.Types.FEE);
4
+ return !!(
5
+ modifier &&
6
+ (modifier.type === Modifier.Types.FEE || actions.isAdd(modifier))
7
+ );
5
8
  };
6
9
  };
@@ -3,6 +3,9 @@ module.exports = () =>
3
3
  return !!(
4
4
  modifier &&
5
5
  modifier.conditions &&
6
- (modifier.conditions.paymentMethods || []).length > 0
6
+ Array.isArray(modifier.conditions.rules) &&
7
+ modifier.conditions.rules.some(
8
+ condition => condition.key === 'paymentMethods'
9
+ )
7
10
  );
8
11
  };
@@ -3,6 +3,9 @@ module.exports = () =>
3
3
  return !!(
4
4
  modifier &&
5
5
  modifier.conditions &&
6
- (modifier.conditions.paymentTypes || []).length > 0
6
+ Array.isArray(modifier.conditions.rules) &&
7
+ modifier.conditions.rules.some(
8
+ condition => condition.key === 'paymentTypes'
9
+ )
7
10
  );
8
11
  };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ constants }) => {
2
+ const { Modifier } = constants;
3
+ return function isFixed(modifier) {
4
+ return !!(
5
+ modifier &&
6
+ modifier.compute &&
7
+ modifier.compute.type === Modifier.Compute.Types.PERCENTAGE
8
+ );
9
+ };
10
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = () =>
2
+ function isValid(modifier) {
3
+ if (
4
+ !modifier ||
5
+ !modifier.conditions ||
6
+ modifier.conditions.valid === undefined ||
7
+ modifier.conditions.valid === null
8
+ )
9
+ return true;
10
+
11
+ return !!modifier.conditions.valid;
12
+ };
@@ -6,6 +6,34 @@ module.exports = ({ actions }) => {
6
6
  const aVal = actions.getProperty(a, key);
7
7
  const bVal = actions.getProperty(b, key);
8
8
 
9
+ const aIsPaymentModifier = actions.isPaymentModifier(a);
10
+ const bIsPaymentModifier = actions.isPaymentModifier(b);
11
+ const aIsCalculatedPaymentModifier =
12
+ actions.isCalculatedPaymentModifier(a);
13
+ const bIsCalculatedPaymentModifier =
14
+ actions.isCalculatedPaymentModifier(b);
15
+
16
+ if (aIsCalculatedPaymentModifier && bIsPaymentModifier && aVal === null) {
17
+ return -1;
18
+ }
19
+ if (bIsCalculatedPaymentModifier && aIsPaymentModifier && bVal === null) {
20
+ return -1;
21
+ }
22
+
23
+ if (
24
+ (aIsPaymentModifier || aIsCalculatedPaymentModifier) &&
25
+ aVal === null
26
+ ) {
27
+ return 1;
28
+ }
29
+
30
+ if (
31
+ (bIsPaymentModifier || bIsCalculatedPaymentModifier) &&
32
+ bVal === null
33
+ ) {
34
+ return 1;
35
+ }
36
+
9
37
  if (aVal == null && bVal === null) {
10
38
  return 0;
11
39
  }
@@ -0,0 +1,14 @@
1
+ module.exports = ({ actions }) => {
2
+ function validate(modifier, opts) {
3
+ if (!modifier) return modifier;
4
+
5
+ return {
6
+ ...modifier,
7
+ conditions: {
8
+ ...(modifier.conditions || {}),
9
+ valid: !!actions.areConditionsMet(modifier, opts),
10
+ },
11
+ };
12
+ }
13
+ return validate;
14
+ };
@@ -0,0 +1,30 @@
1
+ module.exports = () =>
2
+ function validateDateDaysDiff(
3
+ startRequestDate,
4
+ endRequestDate,
5
+ conditionNumber,
6
+ operand
7
+ ) {
8
+ if (!conditionNumber && !operand) return true;
9
+ if (!startRequestDate || !endRequestDate) return false;
10
+ const diff = Math.abs(
11
+ new Date(endRequestDate) - new Date(startRequestDate)
12
+ );
13
+ const diffDays = Math.ceil(diff / (1000 * 60 * 60 * 24));
14
+ switch (operand) {
15
+ case '$eq':
16
+ return diffDays === conditionNumber;
17
+ case '$ne':
18
+ return diffDays !== conditionNumber;
19
+ case '$gt':
20
+ return diffDays > conditionNumber;
21
+ case '$gte':
22
+ return diffDays >= conditionNumber;
23
+ case '$lt':
24
+ return diffDays < conditionNumber;
25
+ case '$lte':
26
+ return diffDays <= conditionNumber;
27
+ default:
28
+ return false;
29
+ }
30
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ _ }) =>
2
+ function validateInArr(item, requiredArr, operand) {
3
+ if (_.isEmpty(requiredArr) && !operand) return true;
4
+ switch (operand) {
5
+ case '$in':
6
+ return requiredArr.some(each => item === each);
7
+ case '$nin':
8
+ return requiredArr.every(each => item !== each);
9
+ default:
10
+ return false;
11
+ }
12
+ };
@@ -0,0 +1,20 @@
1
+ module.exports = () =>
2
+ function validateNumberCondition(itemNumber, conditionNumber, operand) {
3
+ if (!conditionNumber && !operand) return true;
4
+ switch (operand) {
5
+ case '$eq':
6
+ return Number(conditionNumber) === itemNumber;
7
+ case '$ne':
8
+ return Number(conditionNumber) !== itemNumber;
9
+ case '$gt':
10
+ return Number(conditionNumber) < itemNumber;
11
+ case '$gte':
12
+ return Number(conditionNumber) <= itemNumber;
13
+ case '$lt':
14
+ return Number(conditionNumber) > itemNumber;
15
+ case '$lte':
16
+ return Number(conditionNumber) >= itemNumber;
17
+ default:
18
+ return false;
19
+ }
20
+ };