@darkpos/pricing 1.0.112 → 1.0.115
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.
- package/__TEST__/item.test.js +1973 -1776
- package/lib/item/calculate.js +7 -5
- package/lib/item/index.js +2 -2
- package/lib/item/validateModifiers.js +18 -13
- package/lib/item/validateModifiersByQuantity.js +32 -0
- package/lib/modifier/index.js +2 -0
- package/lib/modifier/isAvailableSubscription.js +3 -3
- package/lib/modifier/markModifierAsNotValid.js +10 -0
- package/lib/order/getOrderItemSubscriptions.js +4 -4
- package/lib/order/hasRemainingSubscription.js +10 -12
- package/package.json +2 -2
- package/lib/item/removeModifiersByQuantity.js +0 -36
package/lib/item/calculate.js
CHANGED
|
@@ -4,7 +4,10 @@ module.exports = ({ _, utils, actions, modifierActions }) => {
|
|
|
4
4
|
//
|
|
5
5
|
|
|
6
6
|
const calculateOne = (inputItem, opts = {}) => {
|
|
7
|
-
const item = _.cloneDeep(
|
|
7
|
+
const item = _.cloneDeep({
|
|
8
|
+
...inputItem,
|
|
9
|
+
quantity: math.max(0, Number(inputItem.quantity) || 0),
|
|
10
|
+
});
|
|
8
11
|
const amountToPay =
|
|
9
12
|
typeof opts.amountToPay === 'number' ? opts.amountToPay : 0;
|
|
10
13
|
const paymentMethod = opts.paymentMethod || null;
|
|
@@ -41,11 +44,9 @@ module.exports = ({ _, utils, actions, modifierActions }) => {
|
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
const modifiers = [];
|
|
44
|
-
let { modifiers: itemModifiersPrev = [] } =
|
|
45
|
-
actions.removeModifiersByQuantity(item);
|
|
46
47
|
|
|
47
|
-
itemModifiersPrev = modifierActions.unlockCustomerStatsModifiers({
|
|
48
|
-
modifiers:
|
|
48
|
+
const itemModifiersPrev = modifierActions.unlockCustomerStatsModifiers({
|
|
49
|
+
modifiers: item.modifiers,
|
|
49
50
|
customer,
|
|
50
51
|
});
|
|
51
52
|
|
|
@@ -175,6 +176,7 @@ module.exports = ({ _, utils, actions, modifierActions }) => {
|
|
|
175
176
|
};
|
|
176
177
|
item.price = priceOverride;
|
|
177
178
|
price = priceOverride;
|
|
179
|
+
computedPrice = priceOverride;
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
if (modifierActions.isQuantityOverride(modifier)) {
|
package/lib/item/index.js
CHANGED
|
@@ -43,7 +43,7 @@ const getTotalsDifference = require('./getTotalsDifference');
|
|
|
43
43
|
const getTotalNeareastDifference = require('./getTotalNeareastDifference');
|
|
44
44
|
const getNoteTags = require('./getNoteTags');
|
|
45
45
|
const getBasePrice = require('./getBasePrice');
|
|
46
|
-
const
|
|
46
|
+
const validateModifiersByQuantity = require('./validateModifiersByQuantity');
|
|
47
47
|
const getModifiersBySingleValueId = require('./getModifiersBySingleValueId');
|
|
48
48
|
const getLastLocation = require('./getLastLocation');
|
|
49
49
|
const hasAddModifiers = require('./hasAddModifiers');
|
|
@@ -126,7 +126,7 @@ const itemActions = (deps = {}) => {
|
|
|
126
126
|
getTotalNeareastDifference: getTotalNeareastDifference(innerDeps),
|
|
127
127
|
getNoteTags: getNoteTags(innerDeps),
|
|
128
128
|
getBasePrice: getBasePrice(innerDeps),
|
|
129
|
-
|
|
129
|
+
validateModifiersByQuantity: validateModifiersByQuantity(innerDeps),
|
|
130
130
|
getModifiersBySingleValueId: getModifiersBySingleValueId(innerDeps),
|
|
131
131
|
getLastLocation: getLastLocation(innerDeps),
|
|
132
132
|
hasAddModifiers: hasAddModifiers(innerDeps),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports = ({ modifierActions }) =>
|
|
1
|
+
module.exports = ({ modifierActions, actions }) =>
|
|
2
2
|
function validateModifiers({
|
|
3
3
|
item,
|
|
4
4
|
itemModifiers,
|
|
@@ -11,7 +11,7 @@ module.exports = ({ modifierActions }) =>
|
|
|
11
11
|
customer,
|
|
12
12
|
}) {
|
|
13
13
|
const validatedModifiers = [];
|
|
14
|
-
|
|
14
|
+
let firstValidatedModifiers = itemModifiers.map(each =>
|
|
15
15
|
modifierActions.validate(each, {
|
|
16
16
|
item,
|
|
17
17
|
startRequestDate,
|
|
@@ -24,20 +24,30 @@ module.exports = ({ modifierActions }) =>
|
|
|
24
24
|
})
|
|
25
25
|
);
|
|
26
26
|
|
|
27
|
+
firstValidatedModifiers = actions.validateModifiersByQuantity({
|
|
28
|
+
modifiers: firstValidatedModifiers,
|
|
29
|
+
quantity: item.quantity,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const isIdMatch = (mod, modifierId) => {
|
|
33
|
+
if (typeof mod === 'string') return mod === modifierId;
|
|
34
|
+
return mod._id === modifierId;
|
|
35
|
+
};
|
|
36
|
+
|
|
27
37
|
firstValidatedModifiers.forEach(validModifier => {
|
|
28
38
|
const parentAddModifier = firstValidatedModifiers.find(
|
|
29
39
|
validMod =>
|
|
30
40
|
validMod.addModifiers &&
|
|
31
|
-
validMod.addModifiers.some(
|
|
32
|
-
addMod
|
|
41
|
+
validMod.addModifiers.some(addMod =>
|
|
42
|
+
isIdMatch(addMod, validModifier.modifierId)
|
|
33
43
|
)
|
|
34
44
|
);
|
|
35
45
|
|
|
36
46
|
const parentDelModifier = firstValidatedModifiers.find(
|
|
37
47
|
validMod =>
|
|
38
48
|
validMod.delModifiers &&
|
|
39
|
-
validMod.delModifiers.some(
|
|
40
|
-
delMod
|
|
49
|
+
validMod.delModifiers.some(delMod =>
|
|
50
|
+
isIdMatch(delMod, validModifier.modifierId)
|
|
41
51
|
)
|
|
42
52
|
);
|
|
43
53
|
|
|
@@ -53,13 +63,8 @@ module.exports = ({ modifierActions }) =>
|
|
|
53
63
|
nextValidModifier.conditions.valid;
|
|
54
64
|
|
|
55
65
|
if (shouldInvalidateAddModifier || shouldInvalidateDelModifier) {
|
|
56
|
-
nextValidModifier =
|
|
57
|
-
|
|
58
|
-
conditions: {
|
|
59
|
-
...validModifier.conditions,
|
|
60
|
-
valid: false,
|
|
61
|
-
},
|
|
62
|
-
};
|
|
66
|
+
nextValidModifier =
|
|
67
|
+
modifierActions.markModifierAsNotValid(nextValidModifier);
|
|
63
68
|
}
|
|
64
69
|
|
|
65
70
|
if (
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, utils }) =>
|
|
2
|
+
function validateModifiersByQuantity({ modifiers, quantity }) {
|
|
3
|
+
if (!modifiers || !Array.isArray(modifiers)) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const modifierCounts = {};
|
|
8
|
+
|
|
9
|
+
return modifiers.map(modifier => {
|
|
10
|
+
if (
|
|
11
|
+
modifierActions.isPaymentModifier(modifier) ||
|
|
12
|
+
modifierActions.isCalculatedPaymentModifier(modifier) ||
|
|
13
|
+
modifierActions.isGroupOfModifiers(modifier) ||
|
|
14
|
+
!modifier.modifierId ||
|
|
15
|
+
!modifierActions.isDirect(modifier) ||
|
|
16
|
+
modifierActions.isUnlimitedItemUse(modifier)
|
|
17
|
+
)
|
|
18
|
+
return modifier;
|
|
19
|
+
|
|
20
|
+
const count = modifierCounts[modifier.modifierId] || 0;
|
|
21
|
+
|
|
22
|
+
const maxApplies = modifierActions.getMaxItemUse(modifier) || 0;
|
|
23
|
+
const maxQuantity = utils.math.mul(quantity || 0, maxApplies) || quantity;
|
|
24
|
+
|
|
25
|
+
if (count < maxQuantity) {
|
|
26
|
+
modifierCounts[modifier.modifierId] = count + 1;
|
|
27
|
+
return modifier;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return modifierActions.markModifierAsNotValid(modifier);
|
|
31
|
+
});
|
|
32
|
+
};
|
package/lib/modifier/index.js
CHANGED
|
@@ -177,6 +177,7 @@ const isAutoSplit = require('./isAutoSplit');
|
|
|
177
177
|
const isKeepRelatedItems = require('./isKeepRelatedItems');
|
|
178
178
|
const isSplitDepartment = require('./isSplitDepartment');
|
|
179
179
|
const isModifierValid = require('./isModifierValid');
|
|
180
|
+
const markModifierAsNotValid = require('./markModifierAsNotValid');
|
|
180
181
|
|
|
181
182
|
const modifierActions = (deps = {}) => {
|
|
182
183
|
const actions = {};
|
|
@@ -367,6 +368,7 @@ const modifierActions = (deps = {}) => {
|
|
|
367
368
|
isKeepRelatedItems: isKeepRelatedItems(innerDeps),
|
|
368
369
|
isSplitDepartment: isSplitDepartment(innerDeps),
|
|
369
370
|
isModifierValid: isModifierValid(innerDeps),
|
|
371
|
+
markModifierAsNotValid: markModifierAsNotValid(innerDeps),
|
|
370
372
|
});
|
|
371
373
|
|
|
372
374
|
Object.keys(freezedActions).forEach(actionName => {
|
|
@@ -14,9 +14,9 @@ module.exports = ({ utils, actions }) => {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
if (
|
|
17
|
-
properties.
|
|
18
|
-
properties.
|
|
19
|
-
math.gte(properties.
|
|
17
|
+
properties.uses &&
|
|
18
|
+
properties.usesLimit &&
|
|
19
|
+
math.gte(properties.uses, properties.usesLimit)
|
|
20
20
|
)
|
|
21
21
|
return false;
|
|
22
22
|
|
|
@@ -26,15 +26,15 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const { quantity, price } = orderItem;
|
|
29
|
-
let
|
|
29
|
+
let uses = quantity;
|
|
30
30
|
if (remaining) {
|
|
31
31
|
const left = remaining - (used || 0);
|
|
32
|
-
if (quantity > left)
|
|
32
|
+
if (quantity > left) uses = left;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
const modifier = modifierActions.createSubscriptionModifier({
|
|
36
|
-
amount: math.mul(
|
|
37
|
-
properties: { subscription: {
|
|
36
|
+
amount: math.mul(uses, price),
|
|
37
|
+
properties: { subscription: { uses } },
|
|
38
38
|
});
|
|
39
39
|
orderItem.modifiers.push(modifier);
|
|
40
40
|
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
module.exports = ({ actions, modifierActions }) => {
|
|
2
2
|
const getRemaining = (subscriptions, orderId) => {
|
|
3
3
|
const remaining = subscriptions.reduce((total, subscription) => {
|
|
4
|
-
const {
|
|
5
|
-
numberOfUsesLimit = 0,
|
|
6
|
-
numberOfUses = 0,
|
|
7
|
-
history = {},
|
|
8
|
-
} = subscription;
|
|
4
|
+
const { usesLimit = 0, uses = 0, history = {} } = subscription;
|
|
9
5
|
const orderHistory = history[orderId] || 0;
|
|
10
|
-
return total +
|
|
6
|
+
return total + usesLimit + orderHistory - uses;
|
|
11
7
|
}, 0);
|
|
12
8
|
|
|
13
9
|
return remaining;
|
|
@@ -27,16 +23,16 @@ module.exports = ({ actions, modifierActions }) => {
|
|
|
27
23
|
],
|
|
28
24
|
[]
|
|
29
25
|
);
|
|
30
|
-
const
|
|
26
|
+
const uses = modifiers.reduce(
|
|
31
27
|
(sum, each) =>
|
|
32
28
|
sum +
|
|
33
29
|
((each.properties &&
|
|
34
30
|
each.properties.subscription &&
|
|
35
|
-
each.properties.subscription.
|
|
31
|
+
each.properties.subscription.uses) ||
|
|
36
32
|
0),
|
|
37
33
|
0
|
|
38
34
|
);
|
|
39
|
-
return
|
|
35
|
+
return uses;
|
|
40
36
|
};
|
|
41
37
|
|
|
42
38
|
const getSubscriptions = subscriptions =>
|
|
@@ -56,12 +52,14 @@ module.exports = ({ actions, modifierActions }) => {
|
|
|
56
52
|
|
|
57
53
|
subscriptions = getSubscriptions(subscriptions);
|
|
58
54
|
|
|
59
|
-
const isUnlimited = subscriptions.some(
|
|
55
|
+
const isUnlimited = subscriptions.some(
|
|
56
|
+
each => !each.usesLimit || each.renewalType === 'limit_reached'
|
|
57
|
+
);
|
|
60
58
|
if (isUnlimited) return [true];
|
|
61
59
|
|
|
62
60
|
const remaining = getRemaining(subscriptions, order.parentId || order._id);
|
|
63
|
-
const
|
|
61
|
+
const uses = getNumberOfUses(order.items, item);
|
|
64
62
|
|
|
65
|
-
return [remaining >
|
|
63
|
+
return [remaining > uses, remaining, uses];
|
|
66
64
|
};
|
|
67
65
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkpos/pricing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.115",
|
|
4
4
|
"description": "Pricing calculator",
|
|
5
5
|
"author": "Dark POS",
|
|
6
6
|
"license": "ISC",
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"supertest": "^6.2.3",
|
|
56
56
|
"supervisor": "^0.12.0"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "c2e7e75c33bf1253408a3fab94fe14d6f7fed2ec"
|
|
59
59
|
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module.exports = ({ modifierActions, utils }) =>
|
|
2
|
-
function removeModifiersByQuantity(item) {
|
|
3
|
-
if (!item || !Array.isArray(item.modifiers)) {
|
|
4
|
-
return item;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const modifierCounts = {};
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
...item,
|
|
11
|
-
modifiers: item.modifiers.filter(modifier => {
|
|
12
|
-
if (
|
|
13
|
-
modifierActions.isPaymentModifier(modifier) ||
|
|
14
|
-
modifierActions.isCalculatedPaymentModifier(modifier) ||
|
|
15
|
-
modifierActions.isGroupOfModifiers(modifier) ||
|
|
16
|
-
!modifier.modifierId ||
|
|
17
|
-
!modifierActions.isDirect(modifier) ||
|
|
18
|
-
modifierActions.isUnlimitedItemUse(modifier)
|
|
19
|
-
)
|
|
20
|
-
return true;
|
|
21
|
-
|
|
22
|
-
const count = modifierCounts[modifier.modifierId] || 0;
|
|
23
|
-
|
|
24
|
-
const maxApplies = modifierActions.getMaxItemUse(modifier) || 0;
|
|
25
|
-
const maxQuantity =
|
|
26
|
-
utils.math.mul(item.quantity || 0, maxApplies) || item.quantity;
|
|
27
|
-
|
|
28
|
-
if (count < maxQuantity) {
|
|
29
|
-
modifierCounts[modifier.modifierId] = count + 1;
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return false;
|
|
34
|
-
}),
|
|
35
|
-
};
|
|
36
|
-
};
|