@darkpos/pricing 1.0.92 → 1.0.95

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 (45) hide show
  1. package/__TEST__/item.test.js +46 -48
  2. package/__TEST__/modifier/addItemModifier.test.js +181 -60
  3. package/__TEST__/modifier/overrideModifiers.test.js +196 -0
  4. package/__TEST__/order/conditionsNotMet.test.js +124 -0
  5. package/__TEST__/order/getParentTotals.test.js +79 -0
  6. package/__TEST__/order/order-payment-modifier.test.js +335 -28
  7. package/lib/item/calculate.js +76 -19
  8. package/lib/item/getItemPrice.js +1 -12
  9. package/lib/item/getPriceWithoutModifiers.js +7 -5
  10. package/lib/item/hasPaymentMethodType.js +7 -1
  11. package/lib/item/index.js +6 -0
  12. package/lib/item/isOverwrittenPrice.js +4 -0
  13. package/lib/item/isOverwrittenQuantity.js +4 -0
  14. package/lib/item/overrideNotes.js +24 -0
  15. package/lib/item/removeModifier.js +1 -22
  16. package/lib/item/removeModifiers.js +1 -2
  17. package/lib/modifier/areConditionsMet.js +4 -1
  18. package/lib/modifier/calculate.js +20 -2
  19. package/lib/modifier/calculatePaymentModifier.js +2 -0
  20. package/lib/modifier/createDescription.js +1 -1
  21. package/lib/modifier/duplicate.js +3 -0
  22. package/lib/modifier/getOverrideAmount.js +7 -0
  23. package/lib/modifier/getOverrideNote.js +5 -0
  24. package/lib/modifier/getServiceOverride.js +5 -0
  25. package/lib/modifier/hasPaymentMethodType.js +21 -6
  26. package/lib/modifier/index.js +20 -12
  27. package/lib/modifier/{isManual.js → isManualOverride.js} +1 -1
  28. package/lib/modifier/{isMultiplier.js → isMultiplierOverride.js} +1 -1
  29. package/lib/modifier/isNotesOverride.js +7 -0
  30. package/lib/modifier/isOverrideSubtotal.js +9 -0
  31. package/lib/modifier/isPaymentModifier.js +2 -1
  32. package/lib/modifier/isPercentage.js +1 -1
  33. package/lib/modifier/isPrepayModifier.js +11 -0
  34. package/lib/modifier/{isService.js → isServiceOverride.js} +1 -1
  35. package/lib/modifier/isTotalOverride.js +7 -0
  36. package/lib/modifier/sort.js +16 -27
  37. package/lib/order/addItem.js +10 -12
  38. package/lib/order/addItemModifier.js +15 -62
  39. package/lib/order/getTotals.js +21 -22
  40. package/lib/order/removeItemModifier.js +2 -27
  41. package/lib/order/splitItems.js +2 -1
  42. package/package.json +5 -2
  43. package/lib/modifier/createAmountOverrideModifier.js +0 -18
  44. package/lib/modifier/getService.js +0 -5
  45. package/lib/modifier/mutateModifier.js +0 -23
@@ -2,6 +2,7 @@ module.exports = ({ actions }) =>
2
2
  function isPaymentModifier(modifier) {
3
3
  return (
4
4
  actions.isPaymentTypeModifier(modifier) ||
5
- actions.isPaymentMethodModifier(modifier)
5
+ actions.isPaymentMethodModifier(modifier) ||
6
+ actions.isPrepayModifier(modifier)
6
7
  );
7
8
  };
@@ -1,6 +1,6 @@
1
1
  module.exports = ({ constants }) => {
2
2
  const { Modifier } = constants;
3
- return function isFixed(modifier) {
3
+ return function isPercentage(modifier) {
4
4
  return !!(
5
5
  modifier &&
6
6
  modifier.compute &&
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function isPrepayModifier(modifier) {
3
+ return !!(
4
+ modifier &&
5
+ modifier.conditions &&
6
+ Array.isArray(modifier.conditions.rules) &&
7
+ modifier.conditions.rules.some(
8
+ condition => condition.key === 'payment' && condition.value === 'prepay'
9
+ )
10
+ );
11
+ };
@@ -1,5 +1,5 @@
1
1
  module.exports = () =>
2
- function isService(modifier) {
2
+ function isServiceOverride(modifier) {
3
3
  return !!(
4
4
  modifier &&
5
5
  modifier.properties &&
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function isTotalOverride(modifier) {
3
+ return (
4
+ actions.isOverride(modifier) &&
5
+ modifier.properties.override.field === 'total'
6
+ );
7
+ };
@@ -2,7 +2,6 @@
2
2
  module.exports = ({ actions }) => {
3
3
  function compareValues(key, order = 'asc') {
4
4
  return function innerSort(a, b) {
5
- // property doesn't exist on either object
6
5
  const aVal = actions.getProperty(a, key);
7
6
  const bVal = actions.getProperty(b, key);
8
7
 
@@ -13,38 +12,27 @@ module.exports = ({ actions }) => {
13
12
  const bIsCalculatedPaymentModifier =
14
13
  actions.isCalculatedPaymentModifier(b);
15
14
 
16
- if (aIsCalculatedPaymentModifier && bIsPaymentModifier && aVal === null) {
17
- return -1;
18
- }
19
- if (bIsCalculatedPaymentModifier && aIsPaymentModifier && bVal === null) {
20
- return -1;
21
- }
15
+ const aIsPercentageNoSort = actions.isPercentage(a) && aVal == null;
16
+ const bIsPercentageNoSort = actions.isPercentage(b) && bVal == null;
22
17
 
23
- if (
24
- (aIsPaymentModifier || aIsCalculatedPaymentModifier) &&
25
- aVal === null
26
- ) {
18
+ if (bIsPaymentModifier && aIsPercentageNoSort && !bIsPercentageNoSort)
27
19
  return 1;
28
- }
29
-
30
- if (
31
- (bIsPaymentModifier || bIsCalculatedPaymentModifier) &&
32
- bVal === null
33
- ) {
34
- return 1;
35
- }
36
-
37
- if (aVal == null && bVal === null) {
38
- return 0;
39
- }
20
+ if (aIsPaymentModifier && !aIsPercentageNoSort && bIsPercentageNoSort)
21
+ return -1;
40
22
 
41
- if (aVal == null) {
23
+ if (aIsCalculatedPaymentModifier && bIsPaymentModifier && aVal === null)
24
+ return -1;
25
+ if (bIsCalculatedPaymentModifier && aIsPaymentModifier && bVal === null)
42
26
  return -1;
43
- }
44
27
 
45
- if (bVal === null) {
28
+ if ((aIsPaymentModifier || aIsCalculatedPaymentModifier) && aVal === null)
29
+ return 1;
30
+ if ((bIsPaymentModifier || bIsCalculatedPaymentModifier) && bVal === null)
46
31
  return 1;
47
- }
32
+
33
+ if (aVal == null && bVal === null) return 0;
34
+ if (aVal == null) return -1;
35
+ if (bVal === null) return 1;
48
36
 
49
37
  const varA = typeof aVal === 'string' ? aVal.toUpperCase() : aVal;
50
38
  const varB = typeof bVal === 'string' ? bVal.toUpperCase() : bVal;
@@ -52,6 +40,7 @@ module.exports = ({ actions }) => {
52
40
  let comparison = 0;
53
41
  if (varA > varB) comparison = 1;
54
42
  else if (varA < varB) comparison = -1;
43
+
55
44
  return order === 'desc' ? comparison * -1 : comparison;
56
45
  };
57
46
  }
@@ -218,18 +218,16 @@ module.exports = ({ actions, itemActions, modifierActions, settings, _ }) => {
218
218
  );
219
219
 
220
220
  if (modifiersToAdd.length) {
221
- nextOrder = modifiersToAdd
222
- .filter(modToAdd => !modifierActions.isOverride(modToAdd))
223
- .reduce(
224
- (acc, modifier) =>
225
- actions.addItemModifier({
226
- itemIndex: nextItemIndex,
227
- order: acc,
228
- modifier,
229
- originalItem: item,
230
- }),
231
- nextOrder
232
- );
221
+ nextOrder = modifiersToAdd.reduce(
222
+ (acc, modifier) =>
223
+ actions.addItemModifier({
224
+ itemIndex: nextItemIndex,
225
+ order: acc,
226
+ modifier,
227
+ originalItem: item,
228
+ }),
229
+ nextOrder
230
+ );
233
231
  }
234
232
 
235
233
  const { reArrangedOrder, newIndex } = reArrangeNewItem({
@@ -1,14 +1,5 @@
1
1
  module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
2
2
  const { math } = utils;
3
- const { getComputeModField } = require('../modifier/utils');
4
-
5
- const getPrice = ({ item, modifier }) => {
6
- const compute = getComputeModField(modifier);
7
- const amount = (modifier && compute && compute.amount) || 0;
8
- const { price = 0 } = item;
9
- if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
10
- return amount;
11
- };
12
3
 
13
4
  const filterByRemoveModifiers = (modifiers, modifier) => {
14
5
  const { delModifiers = [] } = modifier;
@@ -107,64 +98,31 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
107
98
  }
108
99
 
109
100
  const modifier = modifierActions.removeGroupRelations(_modifier); // to avoid no param reassign lint rule
110
- let item = { ...itemProp };
111
- const compute = getComputeModField(modifier);
101
+ const item = { ...itemProp };
112
102
  const conditionsBag = areConditionsMet(item, modifier.conditions);
113
- const isAmountOverride = modifierActions.isAmountOverride(modifier);
114
- const isPriceOverride = modifierActions.isPriceOverride(modifier);
115
- // is the modifier suggestion required
103
+
116
104
  if (conditionsBag.length > 0 && !modifierActions.isRequired(modifier)) {
117
105
  if (onConditionsNotMet) onConditionsNotMet(conditionsBag);
118
106
  return item;
119
107
  }
120
- const modifierToAdd = modifierActions.mutateModifier(modifier);
121
- const modifierIndex = item.modifiers.findIndex(
122
- ieach => ieach.modifierId === modifier._id
123
- );
108
+ const modifierToAdd = modifierActions.duplicate(modifier);
124
109
 
125
- if (modifierActions.isOverride(modifier) && !isAmountOverride) {
126
- if (modifierIndex > -1) item.modifiers[modifierIndex] = modifierToAdd;
127
- else item.modifiers.push(modifierToAdd);
128
- } else {
129
- item.modifiers.push(modifierToAdd);
130
- }
110
+ item.modifiers.push(modifierToAdd);
131
111
 
132
112
  if (modifierActions.isRemoveModifier(modifier)) {
133
113
  item.modifiers = filterByRemoveModifiers(item.modifiers, modifier);
134
114
  }
135
115
 
136
- if (modifierActions.isAmountOverride(modifier)) {
137
- item = {
138
- ...item,
139
- price: compute.amount,
140
- };
141
- }
142
-
143
- if (modifierActions.isQuantityOverride(modifier)) {
144
- if (modifier.compute && typeof modifier.compute.amount === 'number') {
145
- item.quantity = modifier.compute.amount || 1;
146
- } else if (typeof modifier.properties.override.fixedValue === 'number') {
147
- item.quantity = modifier.properties.override.fixedValue;
148
- }
149
- }
116
+ item.properties = {
117
+ ...(item.properties || {}),
118
+ basePrice: item.price,
119
+ };
120
+ item.price = itemActions.getItemPrice({
121
+ item,
122
+ itemPriceLevels: originalItem ? originalItem.priceLevels : undefined,
123
+ customer,
124
+ });
150
125
 
151
- if (isPriceOverride) {
152
- item.properties = {
153
- ...(item.properties || {}),
154
- basePrice: item.price,
155
- };
156
- item.price = getPrice({ modifier: modifierToAdd, item });
157
- } else {
158
- item.properties = {
159
- ...(item.properties || {}),
160
- basePrice: item.price,
161
- };
162
- item.price = itemActions.getItemPrice({
163
- item,
164
- itemPriceLevels: originalItem ? originalItem.priceLevels : undefined,
165
- customer,
166
- });
167
- }
168
126
  return item;
169
127
  };
170
128
 
@@ -204,7 +162,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
204
162
  ) {
205
163
  return order;
206
164
  }
207
- // Remove if it has it already only if it is not group of value or override modifier
165
+ // Remove if it has it already only if it is not group of value
208
166
 
209
167
  const maxApplies = modifierActions.getMaxItemUse(modifier) || 0;
210
168
  const isUnlimitedItemUse = modifierActions.isUnlimitedItemUse(modifier);
@@ -212,12 +170,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
212
170
  const maxQuantity =
213
171
  math.mul(item.quantity || 0, maxApplies) || item.quantity;
214
172
 
215
- if (
216
- !isUnlimitedItemUse &&
217
- contains &&
218
- usingCount >= maxQuantity &&
219
- !modifierActions.isOverride(modifier)
220
- ) {
173
+ if (!isUnlimitedItemUse && contains && usingCount >= maxQuantity) {
221
174
  if (maxApplies && onError) {
222
175
  onError('modifier.has.reached.the.maximum.amount.of.applies');
223
176
  return order;
@@ -1,29 +1,28 @@
1
1
  module.exports = ({ utils }) => {
2
2
  const { math } = utils;
3
+
3
4
  return function getTotals(orders) {
4
- if (!Array.isArray(orders)) return { total: 0, subTotals: {} };
5
- return orders
6
- .filter(each => !!each.parentId || !each.isParent)
7
- .reduce(
8
- (acc, order) => {
9
- const subTotals = {};
10
- const { subTotals: orderSubTotals } = order;
11
- if (orderSubTotals) {
12
- const keys = Object.keys(orderSubTotals);
13
- // eslint-disable-next-line no-restricted-syntax
14
- for (const key of keys)
15
- subTotals[key] = math.add(
16
- acc.subTotals[key] || 0,
17
- orderSubTotals[key]
18
- );
5
+ if (!Array.isArray(orders)) {
6
+ return { total: 0, subTotal: 0, subTotals: {} };
7
+ }
8
+
9
+ return orders.reduce(
10
+ (acc, order) => {
11
+ const { subTotals: orderSubTotals, subTotal = 0, total = 0 } = order;
12
+
13
+ if (orderSubTotals) {
14
+ // eslint-disable-next-line no-restricted-syntax
15
+ for (const [key, value] of Object.entries(orderSubTotals)) {
16
+ acc.subTotals[key] = math.add(acc.subTotals[key] || 0, value);
19
17
  }
18
+ }
19
+
20
+ acc.total = math.add(acc.total, total);
21
+ acc.subTotal = math.add(acc.subTotal, subTotal);
20
22
 
21
- return {
22
- total: math.add(acc.total, order.total),
23
- subTotals,
24
- };
25
- },
26
- { total: 0, subTotals: {} }
27
- );
23
+ return acc;
24
+ },
25
+ { total: 0, subTotal: 0, subTotals: {} }
26
+ );
28
27
  };
29
28
  };
@@ -1,15 +1,5 @@
1
- module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
2
- const { math } = utils;
3
-
4
- const getPrice = ({ item, modifier }) => {
5
- const amount =
6
- (modifier && modifier.compute && modifier.compute.amount) || 0;
7
- const { price = 0 } = item;
8
- if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
9
- return amount;
10
- };
11
-
12
- const removeModifier = ({ item, modifier, originalItem }) => {
1
+ module.exports = ({ actions, modifierActions, itemActions, _ }) => {
2
+ const removeModifier = ({ item, modifier }) => {
13
3
  const nextItem = { ...item, modifiers: [] };
14
4
 
15
5
  nextItem.modifiers = item.modifiers.filter(each => {
@@ -19,17 +9,6 @@ module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
19
9
  return each._id !== modifier._id;
20
10
  });
21
11
 
22
- if (modifierActions.isAmountOverride(modifier))
23
- return {
24
- ...originalItem,
25
- ...nextItem,
26
- };
27
-
28
- if (modifierActions.isPriceOverride(modifier))
29
- nextItem.price = getPrice({ modifier, item: nextItem });
30
-
31
- if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
32
-
33
12
  return nextItem;
34
13
  };
35
14
 
@@ -56,10 +35,6 @@ module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
56
35
 
57
36
  if (!contains) return order;
58
37
 
59
- if (modifierActions.isRequiredAndOverride(modifier)) {
60
- return order;
61
- }
62
-
63
38
  // Remove
64
39
  item = removeModifier({
65
40
  item,
@@ -1,4 +1,4 @@
1
- module.exports = ({ actions, modifierActions, itemActions }) =>
1
+ module.exports = ({ actions, modifierActions, itemActions, utils }) =>
2
2
  function splitItems({ order }) {
3
3
  if (!order || !order.items) return order;
4
4
 
@@ -32,6 +32,7 @@ module.exports = ({ actions, modifierActions, itemActions }) =>
32
32
  ...item,
33
33
  quantity: splitQty,
34
34
  modifiers: [],
35
+ _id: utils.helpers.getObjectID(),
35
36
  });
36
37
  remaining -= splitQty;
37
38
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.92",
3
+ "version": "1.0.95",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -27,6 +27,9 @@
27
27
  "test:modifier": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier.test.js",
28
28
  "test:paymentModifiers": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/order-payment-modifier.test.js",
29
29
  "test:addItem": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/addItem.test.js",
30
+ "test:getParentTotals": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/getParentTotals.test.js",
31
+ "test:overrideModifiers": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier/overrideModifiers.test.js",
32
+ "test:addItemModifier": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier/addItemModifier.test.js",
30
33
  "lint": "eslint --quiet lib/"
31
34
  },
32
35
  "publishConfig": {
@@ -51,5 +54,5 @@
51
54
  "supertest": "^6.2.3",
52
55
  "supervisor": "^0.12.0"
53
56
  },
54
- "gitHead": "ae4955dc540555ef6c2e4b8c758e9d8df4d0a03c"
57
+ "gitHead": "edb497d37801c9749d2c3722a67657abe77c9ab6"
55
58
  }
@@ -1,18 +0,0 @@
1
- module.exports = ({ constants, actions }) => {
2
- const { Modifier } = constants;
3
-
4
- return function createAmountOverrideModifier(params) {
5
- return actions.create({
6
- compute: {
7
- amount: params.amount,
8
- action: Modifier.Compute.Actions.OVERRIDE,
9
- },
10
- properties: {
11
- override: { field: 'amount' },
12
- },
13
- attributes: [Modifier.Attributes.OVERRIDE],
14
- name: `Modifier Amount ${Modifier.Compute.Actions.OVERRIDE}`,
15
- included: true,
16
- });
17
- };
18
- };
@@ -1,5 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function getService(modifier) {
3
- if (!actions.isService(modifier)) return null;
4
- return modifier.properties.override.service;
5
- };
@@ -1,23 +0,0 @@
1
- module.exports = ({ _, actions }) =>
2
- function mutateModifier(mod) {
3
- const modifier = actions.duplicate(mod);
4
- const fixedValue = _.get(modifier, 'properties.override.fixedValue', '');
5
- const isAmountOverride = actions.isAmountOverride(mod);
6
- const isPriceOverride = actions.isPriceOverride(mod);
7
-
8
- if (isPriceOverride && fixedValue) {
9
- modifier.compute = {
10
- amount: fixedValue,
11
- };
12
- }
13
-
14
- if (isAmountOverride && fixedValue) {
15
- modifier.compute = {
16
- type: 'fixed',
17
- amount: fixedValue,
18
- action: 'add',
19
- };
20
- }
21
-
22
- return modifier;
23
- };