@darkpos/pricing 1.0.79 → 1.0.81

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 (38) hide show
  1. package/__TEST__/modifier.test.js +584 -15
  2. package/__TEST__/order/conditionsNotMet.test.js +204 -0
  3. package/__TEST__/order/order.test.js +61 -8
  4. package/lib/item/adjustCreditModifiersDifference.js +34 -0
  5. package/lib/item/adjustFixedModifiersDifference.js +37 -0
  6. package/lib/item/getItemsTotals.js +2 -2
  7. package/lib/item/getModifierTags.js +1 -1
  8. package/lib/item/getSubtotal.js +5 -0
  9. package/lib/item/index.js +14 -0
  10. package/lib/item/removeModifiersByQuantity.js +5 -4
  11. package/lib/item/splitAndCalculate.js +18 -0
  12. package/lib/item/spreadModifiers.js +21 -0
  13. package/lib/item/validateCreditModifiersTotal.js +23 -0
  14. package/lib/item/validateFixedModifiersTotal.js +23 -0
  15. package/lib/modifier/areConditionsMet.js +13 -10
  16. package/lib/modifier/getCreditModifiersTotalEntities.js +12 -0
  17. package/lib/modifier/getFixedModifiersTotalEntities.js +12 -0
  18. package/lib/modifier/getMaxItemQuantity.js +5 -0
  19. package/lib/modifier/getMaxItemUse.js +5 -0
  20. package/lib/modifier/getMaxOrderUse.js +5 -0
  21. package/lib/modifier/getSplittedModifiers.js +15 -30
  22. package/lib/modifier/index.js +16 -8
  23. package/lib/modifier/isOrderUseValid.js +25 -0
  24. package/lib/modifier/isUnlimitedItemUse.js +4 -0
  25. package/lib/modifier/isUnlimitedOrderUse.js +4 -0
  26. package/lib/order/addItemModifier.js +27 -4
  27. package/lib/order/addModifier.js +8 -18
  28. package/lib/order/index.js +2 -4
  29. package/lib/order/splitItems.js +50 -0
  30. package/lib/order/validateCreditModifiersTotal.js +1 -1
  31. package/lib/order/validateFixedModifiersTotal.js +1 -1
  32. package/package.json +2 -2
  33. package/lib/modifier/getMaxAppliesItem.js +0 -5
  34. package/lib/modifier/getMaxAppliesOrder.js +0 -5
  35. package/lib/modifier/isUnlimitedAppliesItem.js +0 -6
  36. package/lib/modifier/isUnlimitedAppliesOrder.js +0 -6
  37. package/lib/order/getCreditModifiersTotal.js +0 -15
  38. package/lib/order/getFixedModifiersTotal.js +0 -15
@@ -3,28 +3,21 @@ module.exports = ({ utils }) => {
3
3
  const { getComputeModField } = require('./utils');
4
4
 
5
5
  const divideModifierAmount = ({
6
- totalOriginOrder,
6
+ totalOrigin,
7
7
  modifierAmount,
8
- totalSplitedOrder,
8
+ totalSplited,
9
9
  }) =>
10
- totalOriginOrder
10
+ totalOrigin
11
11
  ? math.toDecimalPlaces(
12
- math.div(
13
- math.mul(modifierAmount, totalSplitedOrder || 0),
14
- totalOriginOrder
15
- )
12
+ math.div(math.mul(modifierAmount, totalSplited || 0), totalOrigin)
16
13
  )
17
14
  : 0;
18
15
 
19
- const splitCreditModifier = ({
20
- modifier,
21
- totalOriginOrder,
22
- totalSplitedOrder,
23
- }) => {
16
+ const splitCreditModifier = ({ modifier, totalOrigin, totalSplited }) => {
24
17
  const maxAmount = divideModifierAmount({
25
18
  modifierAmount: modifier.properties.maxAmount,
26
- totalOriginOrder,
27
- totalSplitedOrder,
19
+ totalOrigin,
20
+ totalSplited,
28
21
  });
29
22
  const compute = getComputeModField(modifier);
30
23
  return {
@@ -39,15 +32,11 @@ module.exports = ({ utils }) => {
39
32
  };
40
33
  };
41
34
 
42
- const splitFixedModifier = ({
43
- modifier,
44
- totalOriginOrder,
45
- totalSplitedOrder,
46
- }) => {
35
+ const splitFixedModifier = ({ modifier, totalOrigin, totalSplited }) => {
47
36
  const amount = divideModifierAmount({
48
37
  modifierAmount: modifier.compute.amount,
49
- totalOriginOrder,
50
- totalSplitedOrder,
38
+ totalOrigin,
39
+ totalSplited,
51
40
  });
52
41
  return {
53
42
  ...modifier,
@@ -58,27 +47,23 @@ module.exports = ({ utils }) => {
58
47
  };
59
48
  };
60
49
 
61
- return function getSplittedModifiers(
62
- modifiers,
63
- totalOriginOrder,
64
- totalSplitedOrder
65
- ) {
50
+ return function getSplittedModifiers(modifiers, totalOrigin, totalSplited) {
66
51
  return modifiers.map(each => {
67
52
  const modifier = { ...each };
68
53
  const compute = getComputeModField(modifier);
69
54
  if (modifier.type === 'credit') {
70
55
  return splitCreditModifier({
71
56
  modifier,
72
- totalOriginOrder,
73
- totalSplitedOrder,
57
+ totalOrigin,
58
+ totalSplited,
74
59
  });
75
60
  }
76
61
 
77
62
  if (compute && compute.type === 'fixed' && compute.amount) {
78
63
  return splitFixedModifier({
79
64
  modifier,
80
- totalOriginOrder,
81
- totalSplitedOrder,
65
+ totalOrigin,
66
+ totalSplited,
82
67
  });
83
68
  }
84
69
  return modifier;
@@ -54,6 +54,8 @@ const getSuggestion = require('./getSuggestion');
54
54
  const getUnhiddenModifiers = require('./getUnhiddenModifiers');
55
55
  const getUsingCount = require('./getUsingCount');
56
56
  const getFixedModifiersTotal = require('./getFixedModifiersTotal');
57
+ const getFixedModifiersTotalEntities = require('./getFixedModifiersTotalEntities');
58
+ const getCreditModifiersTotalEntities = require('./getCreditModifiersTotalEntities');
57
59
  const getCreditModifiersTotal = require('./getCreditModifiersTotal');
58
60
  const hasAddModifiers = require('./hasAddModifiers');
59
61
  const hasAllTag = require('./hasAllTag');
@@ -150,13 +152,15 @@ const isGroupPath = require('./isGroupPath');
150
152
  const isSpreadFrom = require('./isSpreadFrom');
151
153
  const getRelatedModifiers = require('./getRelatedModifiers');
152
154
  const isRelatedModifier = require('./isRelatedModifier');
153
- const getMaxAppliesItem = require('./getMaxAppliesItem');
154
- const getMaxAppliesOrder = require('./getMaxAppliesOrder');
155
- const isUnlimitedAppliesItem = require('./isUnlimitedAppliesItem');
156
- const isUnlimitedAppliesOrder = require('./isUnlimitedAppliesOrder');
155
+ const getMaxItemUse = require('./getMaxItemUse');
156
+ const getMaxOrderUse = require('./getMaxOrderUse');
157
+ const isUnlimitedItemUse = require('./isUnlimitedItemUse');
158
+ const isUnlimitedOrderUse = require('./isUnlimitedOrderUse');
157
159
  const validateItemNumber = require('./validateItemNumber');
158
160
  const isLimits = require('./isLimits');
159
161
  const isItemSet = require('./isItemSet');
162
+ const isOrderUseValid = require('./isOrderUseValid');
163
+ const getMaxItemQuantity = require('./getMaxItemQuantity');
160
164
 
161
165
  const modifierActions = (deps = {}) => {
162
166
  const actions = {};
@@ -321,12 +325,16 @@ const modifierActions = (deps = {}) => {
321
325
  isSpreadFrom: isSpreadFrom(innerDeps),
322
326
  getRelatedModifiers: getRelatedModifiers(innerDeps),
323
327
  isRelatedModifier: isRelatedModifier(innerDeps),
324
- getMaxAppliesItem: getMaxAppliesItem(innerDeps),
325
- getMaxAppliesOrder: getMaxAppliesOrder(innerDeps),
326
- isUnlimitedAppliesItem: isUnlimitedAppliesItem(innerDeps),
327
- isUnlimitedAppliesOrder: isUnlimitedAppliesOrder(innerDeps),
328
+ getMaxItemUse: getMaxItemUse(innerDeps),
329
+ getMaxOrderUse: getMaxOrderUse(innerDeps),
330
+ isUnlimitedItemUse: isUnlimitedItemUse(innerDeps),
331
+ isUnlimitedOrderUse: isUnlimitedOrderUse(innerDeps),
328
332
  isLimits: isLimits(innerDeps),
329
333
  isItemSet: isItemSet(innerDeps),
334
+ isOrderUseValid: isOrderUseValid(innerDeps),
335
+ getMaxItemQuantity: getMaxItemQuantity(innerDeps),
336
+ getFixedModifiersTotalEntities: getFixedModifiersTotalEntities(innerDeps),
337
+ getCreditModifiersTotalEntities: getCreditModifiersTotalEntities(innerDeps),
330
338
  });
331
339
 
332
340
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,25 @@
1
+ module.exports = ({ actions }) =>
2
+ function isOrderUseValid({ order, modifier, item: itemParam }) {
3
+ if (
4
+ !actions.isLimits(modifier) ||
5
+ actions.isUnlimitedOrderUse(modifier) ||
6
+ !actions.getMaxOrderUse(modifier)
7
+ )
8
+ return true;
9
+
10
+ const limit = actions.getMaxOrderUse(modifier);
11
+
12
+ const usedIn = new Set();
13
+
14
+ // eslint-disable-next-line no-restricted-syntax
15
+ for (const item of order.items) {
16
+ if (item.modifiers.some(mod => mod.modifierId === modifier._id)) {
17
+ usedIn.add(item.itemId);
18
+ }
19
+ }
20
+
21
+ if (itemParam && itemParam.itemId && usedIn.has(itemParam.itemId))
22
+ return true;
23
+
24
+ return usedIn.size < limit;
25
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = ({ actions }) =>
2
+ function isUnlimitedItemUse(modifier) {
3
+ return actions.getMaxItemUse(modifier) === -1;
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = ({ actions }) =>
2
+ function isUnlimitedOrderUse(modifier) {
3
+ return actions.getMaxOrderUse(modifier) === -1;
4
+ };
@@ -86,12 +86,26 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
86
86
  };
87
87
 
88
88
  const addModifier = ({
89
+ order,
89
90
  modifier: _modifier,
90
91
  item: itemProp,
91
92
  customer,
92
93
  originalItem,
93
94
  onConditionsNotMet,
95
+ onError,
94
96
  }) => {
97
+ if (
98
+ !modifierActions.isOrderUseValid({
99
+ order,
100
+ modifier: _modifier,
101
+ item: itemProp,
102
+ })
103
+ ) {
104
+ onError('modifier.has.reached.the.maximum.amount.of.applies');
105
+
106
+ return itemProp;
107
+ }
108
+
95
109
  const modifier = modifierActions.removeGroupRelations(_modifier); // to avoid no param reassign lint rule
96
110
  let item = { ...itemProp };
97
111
  const compute = getComputeModField(modifier);
@@ -191,17 +205,22 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
191
205
  }
192
206
  // Remove if it has it already only if it is not group of value or override modifier
193
207
 
194
- const maxApplies = modifierActions.getMaxAppliesItem(modifier);
195
- const maxQuantity = maxApplies || item.quantity;
208
+ const maxApplies = modifierActions.getMaxItemUse(modifier) || 0;
209
+ const isUnlimitedItemUse = modifierActions.isUnlimitedItemUse(modifier);
210
+
211
+ const maxQuantity =
212
+ math.mul(item.quantity || 0, maxApplies) || item.quantity;
196
213
 
197
214
  if (
198
- !modifierActions.isUnlimitedAppliesItem(modifier) &&
215
+ !isUnlimitedItemUse &&
199
216
  contains &&
200
217
  usingCount >= maxQuantity &&
201
218
  !modifierActions.isOverride(modifier)
202
219
  ) {
203
- if (maxApplies && onError)
220
+ if (maxApplies && onError) {
204
221
  onError('modifier.has.reached.the.maximum.amount.of.applies');
222
+ return order;
223
+ }
205
224
 
206
225
  order = actions.removeItemModifier({
207
226
  order,
@@ -247,11 +266,13 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
247
266
  }
248
267
 
249
268
  item = addModifier({
269
+ order,
250
270
  item,
251
271
  modifier,
252
272
  originalItem,
253
273
  customer,
254
274
  onConditionsNotMet,
275
+ onError,
255
276
  });
256
277
 
257
278
  // Recursive Rules:
@@ -263,10 +284,12 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
263
284
  item = relatedModifiers.reduce(
264
285
  (acc, each) =>
265
286
  addModifier({
287
+ order,
266
288
  item: acc,
267
289
  modifier: each,
268
290
  originalItem,
269
291
  customer,
292
+ onError,
270
293
  }),
271
294
  item
272
295
  );
@@ -1,25 +1,15 @@
1
1
  module.exports = ({ modifierActions }) =>
2
2
  function addModifier({ order, modifier }) {
3
3
  if (!modifier) return order;
4
- const { modifiers = [] } = order;
5
4
 
6
- let usingCount = 0;
5
+ const orderModifiers = Array.isArray(order.modifiers)
6
+ ? order.modifiers
7
+ : [];
7
8
 
8
- modifiers.forEach(orderMod => {
9
- if (orderMod.modifierId === modifier.modifierId) {
10
- usingCount += 1;
11
- }
12
- });
13
- const maxQty = modifierActions.getMaxAppliesOrder(modifier) || 1;
9
+ if (modifierActions.contains(orderModifiers, modifier)) return order;
14
10
 
15
- if (
16
- modifierActions.isUnlimitedAppliesOrder(modifier) ||
17
- usingCount < maxQty
18
- )
19
- return {
20
- ...order,
21
- modifiers: [...modifiers, { ...modifier }],
22
- };
23
-
24
- return order;
11
+ return {
12
+ ...order,
13
+ modifiers: [...orderModifiers, { ...modifier }],
14
+ };
25
15
  };
@@ -73,8 +73,6 @@ const getAppliedCredit = require('./getAppliedCredit');
73
73
  const addCreditModifier = require('./addCreditModifier');
74
74
  const adjustCreditModifiersDifference = require('./adjustCreditModifiersDifference');
75
75
  const adjustFixedModifiersDifference = require('./adjustFixedModifiersDifference');
76
- const getCreditModifiersTotal = require('./getCreditModifiersTotal');
77
- const getFixedModifiersTotal = require('./getFixedModifiersTotal');
78
76
  const splitAndCalculate = require('./splitAndCalculate');
79
77
  const spreadModifiers = require('./spreadModifiers');
80
78
  const validateCreditModifiersTotal = require('./validateCreditModifiersTotal');
@@ -90,6 +88,7 @@ const getBalance = require('./getBalance');
90
88
  const getLastLocation = require('./getLastLocation');
91
89
  const getModifierRelations = require('./getModifierRelations');
92
90
  const resetItem = require('./resetItem');
91
+ const splitItems = require('./splitItems');
93
92
 
94
93
  const orderActions = (deps = {}) => {
95
94
  const actions = {};
@@ -174,8 +173,6 @@ const orderActions = (deps = {}) => {
174
173
  addCreditModifier: addCreditModifier(innerDeps),
175
174
  adjustCreditModifiersDifference: adjustCreditModifiersDifference(innerDeps),
176
175
  adjustFixedModifiersDifference: adjustFixedModifiersDifference(innerDeps),
177
- getCreditModifiersTotal: getCreditModifiersTotal(innerDeps),
178
- getFixedModifiersTotal: getFixedModifiersTotal(innerDeps),
179
176
  splitAndCalculate: splitAndCalculate(innerDeps),
180
177
  spreadModifiers: spreadModifiers(innerDeps),
181
178
  validateCreditModifiersTotal: validateCreditModifiersTotal(innerDeps),
@@ -191,6 +188,7 @@ const orderActions = (deps = {}) => {
191
188
  getLastLocation: getLastLocation(innerDeps),
192
189
  getModifierRelations: getModifierRelations(innerDeps),
193
190
  resetItem: resetItem(innerDeps),
191
+ splitItems: splitItems(innerDeps),
194
192
  });
195
193
 
196
194
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,50 @@
1
+ module.exports = ({ actions, modifierActions, itemActions }) =>
2
+ function splitItems({ order }) {
3
+ if (!order || !order.items) return order;
4
+
5
+ const newItems = [];
6
+ let shouldRecalculate = false;
7
+
8
+ order.items.forEach(item => {
9
+ if (!item.modifiers) {
10
+ newItems.push(item);
11
+ return;
12
+ }
13
+
14
+ const maxItemQuantityMod = item.modifiers.find(mod =>
15
+ modifierActions.getMaxItemQuantity(mod)
16
+ );
17
+
18
+ const maxQuantity =
19
+ modifierActions.getMaxItemQuantity(maxItemQuantityMod);
20
+
21
+ if (!maxQuantity || item.quantity <= maxQuantity) {
22
+ newItems.push(item);
23
+ return;
24
+ }
25
+
26
+ let remaining = item.quantity;
27
+ let spreadedItems = [];
28
+ while (remaining > 0) {
29
+ if (!shouldRecalculate) shouldRecalculate = true;
30
+ const splitQty = Math.min(remaining, maxQuantity);
31
+ spreadedItems.push({
32
+ ...item,
33
+ quantity: splitQty,
34
+ modifiers: [],
35
+ });
36
+ remaining -= splitQty;
37
+ }
38
+
39
+ spreadedItems = itemActions.spreadModifiers({
40
+ parentItem: item,
41
+ subItems: spreadedItems,
42
+ });
43
+
44
+ newItems.push(...spreadedItems);
45
+ });
46
+
47
+ return shouldRecalculate
48
+ ? actions.calculate({ ...order, items: newItems })
49
+ : order;
50
+ };
@@ -6,7 +6,7 @@ module.exports = ({ utils, actions, modifierActions }) => {
6
6
  parentOrder.modifiers
7
7
  );
8
8
  const subOrdersCreditModifiersTotalAmount =
9
- actions.getCreditModifiersTotal(subOrders);
9
+ modifierActions.getCreditModifiersTotalEntities(subOrders);
10
10
 
11
11
  if (creditModifiersTotalAmount !== subOrdersCreditModifiersTotalAmount) {
12
12
  return actions.adjustCreditModifiersDifference({
@@ -6,7 +6,7 @@ module.exports = ({ utils, actions, modifierActions }) => {
6
6
  parentOrder.modifiers
7
7
  );
8
8
  const subOrdersFixedModifiersTotalAmount =
9
- actions.getFixedModifiersTotal(subOrders);
9
+ modifierActions.getFixedModifiersTotalEntities(subOrders);
10
10
 
11
11
  if (fixedModifiersTotalAmount !== subOrdersFixedModifiersTotalAmount) {
12
12
  return actions.adjustFixedModifiersDifference({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.79",
3
+ "version": "1.0.81",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -51,5 +51,5 @@
51
51
  "supertest": "^6.2.3",
52
52
  "supervisor": "^0.12.0"
53
53
  },
54
- "gitHead": "1ebec123fd5b4e7d3aaa6b259cd4467c9dccb74b"
54
+ "gitHead": "41babe2d2f61ea0fac42d1f76c1c98a3afde8507"
55
55
  }
@@ -1,5 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function getMaxAppliesItem(modifier) {
3
- if (!actions.isLimits(modifier)) return false;
4
- return modifier.properties.limits.maxAppliesItem;
5
- };
@@ -1,5 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function getMaxAppliesOrder(modifier) {
3
- if (!actions.isLimits(modifier)) return false;
4
- return modifier.properties.limits.maxAppliesOrder;
5
- };
@@ -1,6 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function isUnlimitedAppliesItem(modifier) {
3
- if (!actions.isLimits(modifier)) return false;
4
-
5
- return !!modifier.properties.limits.isUnlimitedAppliesItem;
6
- };
@@ -1,6 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function isUnlimitedAppliesOrder(modifier) {
3
- if (!actions.isLimits(modifier)) return false;
4
-
5
- return !!modifier.properties.limits.isUnlimitedAppliesOrder;
6
- };
@@ -1,15 +0,0 @@
1
- module.exports = ({ utils, modifierActions }) => {
2
- const { math } = utils;
3
-
4
- return function getCreditModifiersTotal(orders) {
5
- if (!Array.isArray(orders)) return 0;
6
- return orders.reduce(
7
- (acc, subOrder) =>
8
- math.add(
9
- acc,
10
- modifierActions.getCreditModifiersTotal(subOrder.modifiers)
11
- ),
12
- 0
13
- );
14
- };
15
- };
@@ -1,15 +0,0 @@
1
- module.exports = ({ utils, modifierActions }) => {
2
- const { math } = utils;
3
-
4
- return function getFixedModifiersTotal(orders) {
5
- if (!Array.isArray(orders)) return 0;
6
- return orders.reduce(
7
- (acc, subOrder) =>
8
- math.add(
9
- acc,
10
- modifierActions.getFixedModifiersTotal(subOrder.modifiers)
11
- ),
12
- 0
13
- );
14
- };
15
- };