@darkpos/pricing 1.0.99 → 1.0.101
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 +25 -0
- package/__TEST__/modifier.test.js +10 -142
- package/__TEST__/order/conditionsNotMet.test.js +309 -58
- package/__TEST__/order/order-payment-modifier.test.js +10 -8
- package/__TEST__/order/order.test.js +18 -12
- package/__TEST__/order/pickEndDate.test.js +60 -0
- package/lib/item/calculate.js +10 -11
- package/lib/item/index.js +2 -0
- package/lib/item/removeModifier.js +15 -18
- package/lib/item/validateModifiers.js +71 -0
- package/lib/modifier/getDepartmentModifiers.js +1 -1
- package/lib/modifier/getInheritedModifiers.js +1 -1
- package/lib/modifier/index.js +0 -2
- package/lib/order/addItemModifier.js +0 -87
- package/lib/order/splitByDepartments.js +39 -2
- package/lib/store/pickEndDate.js +6 -2
- package/package.json +2 -2
- package/lib/modifier/purifyModifiers.js +0 -15
package/lib/item/index.js
CHANGED
|
@@ -65,6 +65,7 @@ const getUpdatedStatus = require('./getUpdatedStatus');
|
|
|
65
65
|
const isOverwrittenPrice = require('./isOverwrittenPrice');
|
|
66
66
|
const isOverwrittenQuantity = require('./isOverwrittenQuantity');
|
|
67
67
|
const overrideNotes = require('./overrideNotes');
|
|
68
|
+
const validateModifiers = require('./validateModifiers');
|
|
68
69
|
|
|
69
70
|
const itemActions = (deps = {}) => {
|
|
70
71
|
const actions = {};
|
|
@@ -143,6 +144,7 @@ const itemActions = (deps = {}) => {
|
|
|
143
144
|
isOverwrittenPrice: isOverwrittenPrice(innerDeps),
|
|
144
145
|
isOverwrittenQuantity: isOverwrittenQuantity(innerDeps),
|
|
145
146
|
overrideNotes: overrideNotes(innerDeps),
|
|
147
|
+
validateModifiers: validateModifiers(innerDeps),
|
|
146
148
|
});
|
|
147
149
|
|
|
148
150
|
Object.keys(freezedActions).forEach(actionName => {
|
|
@@ -15,24 +15,21 @@ module.exports = ({ modifierActions, _, actions }) => {
|
|
|
15
15
|
|
|
16
16
|
const modifiersToApply = [
|
|
17
17
|
modifier,
|
|
18
|
-
...addModifiers.filter(
|
|
19
|
-
addMod
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}),
|
|
34
|
-
}))
|
|
35
|
-
),
|
|
18
|
+
...addModifiers.filter(addMod => {
|
|
19
|
+
if (addMod.required) return false;
|
|
20
|
+
const hasModifier = actions.hasModifier({
|
|
21
|
+
item: {
|
|
22
|
+
...item,
|
|
23
|
+
modifiers: item.modifiers.filter(mod => mod._id !== modifier._id),
|
|
24
|
+
},
|
|
25
|
+
modifier: addMod,
|
|
26
|
+
relatedItems: actions.getRelatedItems({
|
|
27
|
+
items: order ? order.items : [],
|
|
28
|
+
item,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
return modifierActions.isGroup(addMod) ? !hasModifier : !!hasModifier;
|
|
32
|
+
}),
|
|
36
33
|
];
|
|
37
34
|
|
|
38
35
|
// Remove
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module.exports = ({ modifierActions }) =>
|
|
2
|
+
function validateModifiers({
|
|
3
|
+
item,
|
|
4
|
+
itemModifiers,
|
|
5
|
+
startRequestDate,
|
|
6
|
+
endRequestDate,
|
|
7
|
+
allItems,
|
|
8
|
+
paymentMethod,
|
|
9
|
+
paymentType,
|
|
10
|
+
isPrepay,
|
|
11
|
+
}) {
|
|
12
|
+
const validatedModifiers = [];
|
|
13
|
+
const firstValidatedModifiers = itemModifiers.map(each =>
|
|
14
|
+
modifierActions.validate(each, {
|
|
15
|
+
item,
|
|
16
|
+
startRequestDate,
|
|
17
|
+
endRequestDate,
|
|
18
|
+
allItems,
|
|
19
|
+
paymentMethod,
|
|
20
|
+
paymentType,
|
|
21
|
+
isPrepay,
|
|
22
|
+
})
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
firstValidatedModifiers.forEach(validModifier => {
|
|
26
|
+
const parentAddModifier = firstValidatedModifiers.find(
|
|
27
|
+
validMod =>
|
|
28
|
+
validMod.addModifiers &&
|
|
29
|
+
validMod.addModifiers.some(
|
|
30
|
+
addMod => addMod._id === validModifier.modifierId
|
|
31
|
+
)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const parentDelModifier = firstValidatedModifiers.find(
|
|
35
|
+
validMod =>
|
|
36
|
+
validMod.delModifiers &&
|
|
37
|
+
validMod.delModifiers.some(
|
|
38
|
+
delMod => delMod._id === validModifier.modifierId
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
let nextValidModifier = { ...validModifier };
|
|
43
|
+
const shouldInvalidateAddModifier =
|
|
44
|
+
parentAddModifier &&
|
|
45
|
+
!parentAddModifier.conditions.valid &&
|
|
46
|
+
nextValidModifier.conditions.valid;
|
|
47
|
+
|
|
48
|
+
const shouldInvalidateDelModifier =
|
|
49
|
+
parentDelModifier &&
|
|
50
|
+
parentDelModifier.conditions.valid &&
|
|
51
|
+
nextValidModifier.conditions.valid;
|
|
52
|
+
|
|
53
|
+
if (shouldInvalidateAddModifier || shouldInvalidateDelModifier) {
|
|
54
|
+
nextValidModifier = {
|
|
55
|
+
...nextValidModifier,
|
|
56
|
+
conditions: {
|
|
57
|
+
...validModifier.conditions,
|
|
58
|
+
valid: false,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (
|
|
64
|
+
!validatedModifiers.some(validMod => validMod._id === validModifier._id)
|
|
65
|
+
) {
|
|
66
|
+
validatedModifiers.push(nextValidModifier);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return validatedModifiers;
|
|
71
|
+
};
|
|
@@ -5,7 +5,7 @@ module.exports = ({ actions, utils }) => {
|
|
|
5
5
|
return function getDepartmentModifiers(modifiers) {
|
|
6
6
|
if (!modifiers || !Array.isArray(modifiers)) return [];
|
|
7
7
|
return modifiers
|
|
8
|
-
.filter(each => actions.isDepartment(each))
|
|
8
|
+
.filter(each => actions.isValid(each) && actions.isDepartment(each))
|
|
9
9
|
.sort((mod1, mod2) => math.sub(getOrder(mod1), getOrder(mod2)));
|
|
10
10
|
};
|
|
11
11
|
};
|
package/lib/modifier/index.js
CHANGED
|
@@ -102,7 +102,6 @@ const isPaymentTypeModifier = require('./isPaymentTypeModifier');
|
|
|
102
102
|
const isPreferences = require('./isPreferences');
|
|
103
103
|
const isCompact = require('./isCompact');
|
|
104
104
|
const isCredit = require('./isCredit');
|
|
105
|
-
const purifyModifiers = require('./purifyModifiers');
|
|
106
105
|
const sort = require('./sort');
|
|
107
106
|
const isPaymentModifier = require('./isPaymentModifier');
|
|
108
107
|
const isSubtract = require('./isSubtract');
|
|
@@ -278,7 +277,6 @@ const modifierActions = (deps = {}) => {
|
|
|
278
277
|
isCompact: isCompact(innerDeps),
|
|
279
278
|
isCredit: isCredit(innerDeps),
|
|
280
279
|
isIncluded: isIncluded(innerDeps),
|
|
281
|
-
purifyModifiers: purifyModifiers(innerDeps),
|
|
282
280
|
sort: sort(innerDeps),
|
|
283
281
|
isPaymentModifier: isPaymentModifier(innerDeps),
|
|
284
282
|
isSubtract: isSubtract(innerDeps),
|
|
@@ -1,88 +1,12 @@
|
|
|
1
1
|
module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
2
2
|
const { math } = utils;
|
|
3
3
|
|
|
4
|
-
const filterByRemoveModifiers = (modifiers, modifier) => {
|
|
5
|
-
const { delModifiers = [] } = modifier;
|
|
6
|
-
|
|
7
|
-
return modifiers.filter(
|
|
8
|
-
each => !modifierActions.findById(delModifiers, each.modifierId)
|
|
9
|
-
);
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const areConditionsMet = (item, conditions) => {
|
|
13
|
-
const conditionsBag = [];
|
|
14
|
-
if (!conditions || !conditions.rules) return conditionsBag;
|
|
15
|
-
// Find conditions with itemPieces as key
|
|
16
|
-
const itemPiecesConditions = conditions.rules.filter(
|
|
17
|
-
each => each.key === 'itemPieces'
|
|
18
|
-
);
|
|
19
|
-
if (itemPiecesConditions.length > 0) {
|
|
20
|
-
itemPiecesConditions.forEach(each => {
|
|
21
|
-
if (
|
|
22
|
-
!modifierActions.validateNumberCondition(
|
|
23
|
-
item.pieces,
|
|
24
|
-
each.value,
|
|
25
|
-
each.operand
|
|
26
|
-
)
|
|
27
|
-
) {
|
|
28
|
-
conditionsBag.push({
|
|
29
|
-
name: `${each.operand}.itemPieces`,
|
|
30
|
-
value: each.value,
|
|
31
|
-
current: item.pieces,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
const itemQtyConditions = conditions.rules.filter(
|
|
37
|
-
each => each.key === 'itemQuantity'
|
|
38
|
-
);
|
|
39
|
-
if (itemQtyConditions.length > 0) {
|
|
40
|
-
itemQtyConditions.forEach(each => {
|
|
41
|
-
if (
|
|
42
|
-
!modifierActions.validateNumberCondition(
|
|
43
|
-
item.quantity,
|
|
44
|
-
each.value,
|
|
45
|
-
each.operand
|
|
46
|
-
)
|
|
47
|
-
) {
|
|
48
|
-
conditionsBag.push({
|
|
49
|
-
name: `${each.operand}.itemQuantity`,
|
|
50
|
-
value: each.value,
|
|
51
|
-
current: item.quantity,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
const requiredModifiersConditions = conditions.rules.filter(
|
|
57
|
-
each => each.key === 'modifiers'
|
|
58
|
-
);
|
|
59
|
-
if (requiredModifiersConditions.length > 0) {
|
|
60
|
-
requiredModifiersConditions.forEach(each => {
|
|
61
|
-
if (
|
|
62
|
-
!modifierActions.validateRequiredModifiers(
|
|
63
|
-
item.modifiers,
|
|
64
|
-
each.value,
|
|
65
|
-
each.operand
|
|
66
|
-
)
|
|
67
|
-
) {
|
|
68
|
-
conditionsBag.push({
|
|
69
|
-
name: `${each.operand}.modifiers`,
|
|
70
|
-
value: each.value,
|
|
71
|
-
current: item.modifiers,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return conditionsBag;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
4
|
const addModifier = ({
|
|
80
5
|
order,
|
|
81
6
|
modifier: _modifier,
|
|
82
7
|
item: itemProp,
|
|
83
8
|
customer,
|
|
84
9
|
originalItem,
|
|
85
|
-
onConditionsNotMet,
|
|
86
10
|
onError,
|
|
87
11
|
}) => {
|
|
88
12
|
if (
|
|
@@ -99,20 +23,11 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
99
23
|
|
|
100
24
|
const modifier = modifierActions.removeGroupRelations(_modifier); // to avoid no param reassign lint rule
|
|
101
25
|
const item = { ...itemProp };
|
|
102
|
-
const conditionsBag = areConditionsMet(item, modifier.conditions);
|
|
103
26
|
|
|
104
|
-
if (conditionsBag.length > 0 && !modifierActions.isRequired(modifier)) {
|
|
105
|
-
if (onConditionsNotMet) onConditionsNotMet(conditionsBag);
|
|
106
|
-
return item;
|
|
107
|
-
}
|
|
108
27
|
const modifierToAdd = modifierActions.duplicate(modifier);
|
|
109
28
|
|
|
110
29
|
item.modifiers.push(modifierToAdd);
|
|
111
30
|
|
|
112
|
-
if (modifierActions.isRemoveModifier(modifier)) {
|
|
113
|
-
item.modifiers = filterByRemoveModifiers(item.modifiers, modifier);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
31
|
item.properties = {
|
|
117
32
|
...(item.properties || {}),
|
|
118
33
|
};
|
|
@@ -131,7 +46,6 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
131
46
|
modifier,
|
|
132
47
|
itemIndex,
|
|
133
48
|
originalItem,
|
|
134
|
-
onConditionsNotMet,
|
|
135
49
|
onError,
|
|
136
50
|
}) {
|
|
137
51
|
let order = _.cloneDeep(orderProp);
|
|
@@ -225,7 +139,6 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
|
|
|
225
139
|
modifier,
|
|
226
140
|
originalItem,
|
|
227
141
|
customer,
|
|
228
|
-
onConditionsNotMet,
|
|
229
142
|
onError,
|
|
230
143
|
});
|
|
231
144
|
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
module.exports = ({
|
|
1
|
+
module.exports = ({
|
|
2
|
+
utils,
|
|
3
|
+
_,
|
|
4
|
+
actions,
|
|
5
|
+
itemActions,
|
|
6
|
+
modifierActions,
|
|
7
|
+
settings,
|
|
8
|
+
storeActions,
|
|
9
|
+
}) => {
|
|
2
10
|
const { helpers } = utils;
|
|
3
11
|
|
|
4
12
|
const isSplitByPieces = splitUnit => splitUnit === 'pieces';
|
|
@@ -26,16 +34,45 @@ module.exports = ({ utils, _, actions, itemActions, modifierActions }) => {
|
|
|
26
34
|
return { ...order, items };
|
|
27
35
|
});
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
const getDepartmentSchedules = department => {
|
|
38
|
+
if (!department) return null;
|
|
39
|
+
const allSchedules = _.get(settings, 'order.schedules', []);
|
|
40
|
+
return allSchedules.filter(item =>
|
|
41
|
+
item.departments.some(dep => dep._id === department.modifierId)
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return function splitByDepartments({
|
|
46
|
+
parentOrder: parentOrderParam,
|
|
47
|
+
newItems,
|
|
48
|
+
}) {
|
|
30
49
|
const itemsByDepartments = _.groupBy(newItems, getDepartmentName);
|
|
31
50
|
const itemGroups = Object.values(itemsByDepartments);
|
|
32
51
|
let splitOrders = [];
|
|
52
|
+
const defaultEndDate = storeActions.pickEndDate();
|
|
53
|
+
const isDefaultEndDate =
|
|
54
|
+
!parentOrderParam.end ||
|
|
55
|
+
!parentOrderParam.end.requestDate ||
|
|
56
|
+
utils.date.isEqual(defaultEndDate, parentOrderParam.end.requestDate);
|
|
33
57
|
|
|
34
58
|
itemGroups.forEach(items => {
|
|
35
59
|
// Assuming there is one department in the item
|
|
36
60
|
const department = itemActions.getDepartmentModifiers(items[0])[0];
|
|
37
61
|
const departmentName = getDepartmentName(items[0]);
|
|
38
62
|
const maxItems = modifierActions.getDepartmentMaxItems(department);
|
|
63
|
+
const departmentSchedules = getDepartmentSchedules(department);
|
|
64
|
+
let parentOrder = { ...parentOrderParam };
|
|
65
|
+
|
|
66
|
+
if (
|
|
67
|
+
departmentSchedules &&
|
|
68
|
+
departmentSchedules.length &&
|
|
69
|
+
isDefaultEndDate
|
|
70
|
+
) {
|
|
71
|
+
parentOrder = actions.changeEndDate({
|
|
72
|
+
date: storeActions.pickEndDate(departmentSchedules),
|
|
73
|
+
order: parentOrder,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
39
76
|
|
|
40
77
|
const autoSplit = _.get(
|
|
41
78
|
department || {},
|
package/lib/store/pickEndDate.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module.exports = ({ settings, _, moment }) => {
|
|
2
|
-
const timezone =
|
|
2
|
+
const timezone =
|
|
3
|
+
_.get(settings, 'localization.timezone', 'America/New_York') ||
|
|
4
|
+
'America/New_York';
|
|
3
5
|
|
|
4
6
|
const getSchedule = (schedules, isoWeekday) => {
|
|
5
7
|
const todayTZ = moment().tz(timezone);
|
|
@@ -7,7 +9,9 @@ module.exports = ({ settings, _, moment }) => {
|
|
|
7
9
|
const _schedules =
|
|
8
10
|
schedules && schedules.length
|
|
9
11
|
? schedules
|
|
10
|
-
: _.get(settings, 'order.schedules', [])
|
|
12
|
+
: _.get(settings, 'order.schedules', []).filter(
|
|
13
|
+
item => !item.departments || !item.departments.length
|
|
14
|
+
);
|
|
11
15
|
|
|
12
16
|
if (!_schedules.length) {
|
|
13
17
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkpos/pricing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.101",
|
|
4
4
|
"description": "Pricing calculator",
|
|
5
5
|
"author": "Dark POS",
|
|
6
6
|
"license": "ISC",
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"supertest": "^6.2.3",
|
|
55
55
|
"supervisor": "^0.12.0"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "aad940d770d15b6072fd45e300302002bfc8fc08"
|
|
58
58
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
module.exports = ({ actions }) =>
|
|
2
|
-
function purifyModifiers(modifiers) {
|
|
3
|
-
if (!modifiers) return [];
|
|
4
|
-
const removeIds = modifiers
|
|
5
|
-
.filter(modifier => actions.isRemoveModifier(modifier))
|
|
6
|
-
.reduce(
|
|
7
|
-
(acc, modifier) => [
|
|
8
|
-
...acc,
|
|
9
|
-
modifier.properties.delModifiers.map(each => each._id),
|
|
10
|
-
],
|
|
11
|
-
[]
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
return modifiers.filter(each => !removeIds.includes(each.modifierId));
|
|
15
|
-
};
|