@darkpos/pricing 1.0.43 → 1.0.44

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 (42) hide show
  1. package/__TEST__/item/getItemsModifierDescription.test.js +10 -3
  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/unpaid/order-modifiers.json +48 -52
  6. package/__TEST__/modifier/calculate.test.js +1 -0
  7. package/__TEST__/modifier/getMatchTagsModifiers.test.js +72 -18
  8. package/__TEST__/modifier/getModifierIndex.test.js +10 -7
  9. package/__TEST__/modifier/getRecommendedModifiers.test.js +6 -4
  10. package/__TEST__/modifier/hasAttribute.test.js +11 -5
  11. package/__TEST__/modifier/hasMatchTags.test.js +33 -11
  12. package/__TEST__/modifier/sort.test.js +1 -1
  13. package/__TEST__/order/conditionsNotMet.test.js +133 -0
  14. package/__TEST__/order/order.test.js +7 -5
  15. package/__TEST__/order/pickEndDate.test.js +1 -1
  16. package/__TEST__/order/validateConditionsCalculate.test.js +397 -0
  17. package/lib/constants/index.js +1 -1
  18. package/lib/index.js +11 -2
  19. package/lib/item/calculate.js +27 -10
  20. package/lib/item/getItemModifiersDescription.js +1 -0
  21. package/lib/item/markModifiersAsLocked.js +3 -1
  22. package/lib/modifier/areConditionsMet.js +71 -0
  23. package/lib/modifier/index.js +14 -5
  24. package/lib/modifier/isPaymentMethodModifier.js +1 -1
  25. package/lib/modifier/isPaymentTypeModifier.js +1 -1
  26. package/lib/modifier/isValid.js +12 -0
  27. package/lib/modifier/validate.js +14 -0
  28. package/lib/modifier/validateDateDaysDiff.js +30 -0
  29. package/lib/modifier/validateInArr.js +12 -0
  30. package/lib/modifier/validateNumberCondition.js +20 -0
  31. package/lib/modifier/validateRequiredModifiers.js +16 -0
  32. package/lib/order/addItemModifier.js +72 -28
  33. package/lib/order/calculate.js +12 -7
  34. package/lib/order/index.js +0 -2
  35. package/lib/order/removeModifiersWithPaymentMethods.js +1 -2
  36. package/lib/order/removeModifiersWithPaymentTypes.js +1 -2
  37. package/lib/store/getRecommendedEndDate.js +13 -0
  38. package/lib/store/index.js +25 -0
  39. package/package.json +3 -3
  40. package/lib/modifier/findByPaymentMethod.js +0 -10
  41. package/lib/modifier/findByPaymentType.js +0 -10
  42. /package/lib/{order → store}/pickEndDate.js +0 -0
@@ -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
+ };
@@ -0,0 +1,16 @@
1
+ module.exports = ({ actions, _ }) =>
2
+ function validateRequiredModifiers(modifiers, requiredModifiers, operand) {
3
+ if (_.isEmpty(requiredModifiers) && !operand) return true;
4
+ switch (operand) {
5
+ case '$in':
6
+ return requiredModifiers.some(each =>
7
+ actions.contains(modifiers, each)
8
+ );
9
+ case '$nin':
10
+ return requiredModifiers.every(
11
+ each => !actions.contains(modifiers, each)
12
+ );
13
+ default:
14
+ return false;
15
+ }
16
+ };
@@ -27,31 +27,71 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
27
27
  return false;
28
28
  };
29
29
 
30
- const validateItemPiecesCondition = (itemPieces, minPieces) => {
31
- if (!minPieces) return true;
32
- return minPieces <= itemPieces;
33
- };
34
-
35
- const validateItemQtyCondition = (itemQuantity, minQuantity) => {
36
- if (!minQuantity) return true;
37
- return minQuantity <= itemQuantity;
38
- };
39
-
40
- const validateRequiredModifiers = (modifiers, requiredModifiers) => {
41
- if (_.isEmpty(modifiers) || _.isEmpty(requiredModifiers)) return true;
42
- return requiredModifiers.every(each =>
43
- modifierActions.contains(modifiers, each)
44
- );
45
- };
46
-
47
30
  const areConditionsMet = (item, conditions) => {
48
- if (!conditions) return true;
49
-
50
- return (
51
- validateItemPiecesCondition(item.pieces, conditions.minItemPieces) &&
52
- validateItemQtyCondition(item.quantity, conditions.minItemQuantity) &&
53
- validateRequiredModifiers(item.modifiers, conditions.modifiers)
31
+ const conditionsBag = [];
32
+ if (!conditions || !conditions.rules) return conditionsBag;
33
+ // Find conditions with itemPieces as key
34
+ const itemPiecesConditions = conditions.rules.filter(
35
+ each => each.key === 'itemPieces'
54
36
  );
37
+ if (itemPiecesConditions.length > 0) {
38
+ itemPiecesConditions.forEach(each => {
39
+ if (
40
+ !modifierActions.validateNumberCondition(
41
+ item.pieces,
42
+ each.value,
43
+ each.operand
44
+ )
45
+ ) {
46
+ conditionsBag.push({
47
+ name: `${each.operand}.itemPieces`,
48
+ value: each.value,
49
+ current: item.pieces,
50
+ });
51
+ }
52
+ });
53
+ }
54
+ const itemQtyConditions = conditions.rules.filter(
55
+ each => each.key === 'itemQuantity'
56
+ );
57
+ if (itemQtyConditions.length > 0) {
58
+ itemQtyConditions.forEach(each => {
59
+ if (
60
+ !modifierActions.validateNumberCondition(
61
+ item.quantity,
62
+ each.value,
63
+ each.operand
64
+ )
65
+ ) {
66
+ conditionsBag.push({
67
+ name: `${each.operand}.itemQuantity`,
68
+ value: each.value,
69
+ current: item.quantity,
70
+ });
71
+ }
72
+ });
73
+ }
74
+ const requiredModifiersConditions = conditions.rules.filter(
75
+ each => each.key === 'modifiers'
76
+ );
77
+ if (requiredModifiersConditions.length > 0) {
78
+ requiredModifiersConditions.forEach(each => {
79
+ if (
80
+ !modifierActions.validateRequiredModifiers(
81
+ item.modifiers,
82
+ each.value,
83
+ each.operand
84
+ )
85
+ ) {
86
+ conditionsBag.push({
87
+ name: `${each.operand}.modifiers`,
88
+ value: each.value,
89
+ current: item.modifiers,
90
+ });
91
+ }
92
+ });
93
+ }
94
+ return conditionsBag;
55
95
  };
56
96
 
57
97
  const addModifier = ({
@@ -63,19 +103,21 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
63
103
  items: [],
64
104
  itemModifiers: [],
65
105
  },
106
+ onConditionsNotMet,
66
107
  }) => {
67
108
  const modifier = _modifier; // to avoid no param reassign lint rule
68
109
  let item = { ...itemProp };
69
110
  const compute = getComputeModField(modifier);
70
111
  if (hasBehaivoralFields(modifier)) return item;
71
- // check conditions
72
- if (!areConditionsMet(item, modifier.conditions)) return item;
112
+ const conditionsBag = areConditionsMet(item, modifier.conditions);
73
113
  const isAmountOverride = modifierActions.isAmountOverride(modifier);
74
114
  const isPriceOverride = modifierActions.isPriceOverride(modifier);
75
-
76
- // change modifier compute based on onverride and creates a clone of the modifier
115
+ // is the modifier suggestion required
116
+ if (conditionsBag.length > 0 && !modifierActions.isRequired(modifier)) {
117
+ if (onConditionsNotMet) onConditionsNotMet(conditionsBag);
118
+ return item;
119
+ }
77
120
  const modifierToAdd = modifierActions.mutateModifier(modifier);
78
-
79
121
  const modifierIndex = item.modifiers.findIndex(
80
122
  ieach => ieach.modifierId === modifier._id
81
123
  );
@@ -122,6 +164,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
122
164
  modifier,
123
165
  itemIndex,
124
166
  cache,
167
+ onConditionsNotMet,
125
168
  }) {
126
169
  let order = _.cloneDeep(orderProp);
127
170
  if (!order || itemIndex < 0 || !modifier) return order;
@@ -166,6 +209,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
166
209
  modifier,
167
210
  cache,
168
211
  customer,
212
+ onConditionsNotMet,
169
213
  });
170
214
 
171
215
  // Recursive Rules:
@@ -3,18 +3,23 @@
3
3
  * return calculated Order
4
4
  */
5
5
  module.exports = ({ _, actions, itemActions, modifierActions }) =>
6
- function calculateorder(inputOrder) {
6
+ function calculateorder(inputOrder, opts = {}) {
7
7
  if (!inputOrder) return inputOrder;
8
8
  const order = _.cloneDeep(inputOrder);
9
9
  const { items = [], orders = [] } = order;
10
-
11
10
  if (!items.length) {
12
11
  if (!orders.length)
13
12
  return { ...order, subTotals: {}, subTotal: 0, total: 0 };
14
13
 
15
14
  return { ...order, ...actions.getTotals(order.orders) };
16
15
  }
17
-
16
+ const startRequestDate = order.start ? order.start.requestDate : null;
17
+ const endRequestDate = order.end ? order.end.requestDate : null;
18
+ const options = {
19
+ ...opts,
20
+ startRequestDate,
21
+ endRequestDate,
22
+ };
18
23
  const sortedOrderModifiers = modifierActions.sort(
19
24
  modifierActions.removeLocked(order.modifiers)
20
25
  );
@@ -23,7 +28,7 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
23
28
  itemActions.removeModifiers({ item, modifiers: sortedOrderModifiers })
24
29
  );
25
30
 
26
- itemsWNIM = itemActions.calculate(itemsWNIM);
31
+ itemsWNIM = itemActions.calculate(itemsWNIM, options);
27
32
 
28
33
  const newOrder = {
29
34
  ...order,
@@ -55,11 +60,11 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
55
60
  } else {
56
61
  tempItems = itemsWIM;
57
62
  }
58
- tempItems = itemActions.calculate(tempItems);
63
+ tempItems = itemActions.calculate(tempItems, options);
59
64
  }
60
65
 
61
66
  if (isCredit) {
62
- const calculatedItemWIM = itemActions.calculate(itemsWIM);
67
+ const calculatedItemWIM = itemActions.calculate(itemsWIM, options);
63
68
  computedTotal = itemActions.getTotals(calculatedItemWIM).total;
64
69
  }
65
70
 
@@ -92,7 +97,7 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
92
97
  prvSort = sort;
93
98
  }
94
99
 
95
- const calculatedItemWIM = itemActions.calculate(itemsWIM);
100
+ const calculatedItemWIM = itemActions.calculate(itemsWIM, options);
96
101
 
97
102
  return {
98
103
  ...order,
@@ -72,7 +72,6 @@ const getItemIndex = require('./getItemIndex');
72
72
  const getRelatedItems = require('./getRelatedItems');
73
73
  const getItemByItemId = require('./getItemByItemId');
74
74
  const getScheduleByCustomer = require('./getScheduleByCustomer');
75
- const pickEndDate = require('./pickEndDate');
76
75
  const getAppliedCredit = require('./getAppliedCredit');
77
76
  const addCreditModifier = require('./addCreditModifier');
78
77
  const adjustCreditModifiersDifference = require('./adjustCreditModifiersDifference');
@@ -172,7 +171,6 @@ const orderActions = (deps = {}) => {
172
171
  getItemIndex: getItemIndex(innerDeps),
173
172
  getRelatedItems: getRelatedItems(innerDeps),
174
173
  getScheduleByCustomer: getScheduleByCustomer(innerDeps),
175
- pickEndDate: pickEndDate(innerDeps),
176
174
  getAppliedCredit: getAppliedCredit(innerDeps),
177
175
  addCreditModifier: addCreditModifier(innerDeps),
178
176
  adjustCreditModifiersDifference: adjustCreditModifiersDifference(innerDeps),
@@ -1,8 +1,7 @@
1
1
  module.exports = () => {
2
2
  const hasPaymentMethods = modifier =>
3
3
  modifier.conditions &&
4
- Array.isArray(modifier.conditions.paymentMethods) &&
5
- modifier.conditions.paymentMethods.length;
4
+ modifier.conditions.some(condition => condition.key === 'paymentMethods');
6
5
 
7
6
  return function removeModifiersWithPaymentMethods({
8
7
  order,
@@ -1,8 +1,7 @@
1
1
  module.exports = () => {
2
2
  const hasPaymentTypes = modifier =>
3
3
  modifier.conditions &&
4
- Array.isArray(modifier.conditions.paymentTypes) &&
5
- modifier.conditions.paymentTypes.length;
4
+ modifier.conditions.some(condition => condition.key === 'paymentMethods');
6
5
 
7
6
  return function removeModifiersWithPaymentTypes({
8
7
  order,
@@ -0,0 +1,13 @@
1
+ module.exports = ({ actions, settings }) =>
2
+ function getRecommendedEndDate() {
3
+ const defaultSchedule =
4
+ settings.order &&
5
+ settings.order.endDate &&
6
+ settings.order.endDate.default;
7
+
8
+ return defaultSchedule
9
+ ? actions.pickEndDate({
10
+ ...defaultSchedule,
11
+ })
12
+ : null;
13
+ };
@@ -0,0 +1,25 @@
1
+ //
2
+ const pickEndDate = require('./pickEndDate');
3
+ const getRecommendedEndDate = require('./getRecommendedEndDate');
4
+
5
+ const storeActions = (deps = {}) => {
6
+ const actions = {};
7
+
8
+ const innerDeps = {
9
+ ...deps,
10
+ actions,
11
+ };
12
+
13
+ const freezedActions = Object.freeze({
14
+ pickEndDate: pickEndDate(innerDeps),
15
+ getRecommendedEndDate: getRecommendedEndDate(innerDeps),
16
+ });
17
+
18
+ Object.keys(freezedActions).forEach(actionName => {
19
+ actions[actionName] = freezedActions[actionName];
20
+ });
21
+
22
+ return freezedActions;
23
+ };
24
+
25
+ module.exports = storeActions;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.43",
3
+ "version": "1.0.44",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -13,7 +13,7 @@
13
13
  "scripts": {
14
14
  "test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__",
15
15
  "test:me": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit",
16
- "lint": "eslint --quiet --fix lib/"
16
+ "lint": "eslint --quiet --fix lib/ __TEST__/"
17
17
  },
18
18
  "publishConfig": {
19
19
  "access": "public"
@@ -36,5 +36,5 @@
36
36
  "supertest": "^6.2.3",
37
37
  "supervisor": "^0.12.0"
38
38
  },
39
- "gitHead": "60a1eef3eb458c750cda95b701904c8ea7e68157"
39
+ "gitHead": "9237aef8561cbdf9c29150a0915cf55ff54f3c80"
40
40
  }
@@ -1,10 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function findByPaymentMethod({ modifiers, paymentMethod = '' }) {
3
- if (!Array.isArray(modifiers) || !paymentMethod) return null;
4
-
5
- return modifiers.find(
6
- each =>
7
- actions.isPaymentMethodModifier(each) &&
8
- each.conditions.paymentMethods.includes(paymentMethod)
9
- );
10
- };
@@ -1,10 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function findByPaymentType({ modifiers, paymentType = '' }) {
3
- if (!Array.isArray(modifiers) || !paymentType) return null;
4
-
5
- return modifiers.find(
6
- each =>
7
- actions.isPaymentTypeModifier(each) &&
8
- each.conditions.paymentTypes.includes(paymentType)
9
- );
10
- };
File without changes