@darkpos/pricing 1.0.3 → 1.0.6
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/.eslintrc +22 -0
- package/README.md +110 -4
- package/__TEST__/item.test.js +285 -0
- package/__TEST__/order.test.js +234 -0
- package/index.js +1 -0
- package/lib/constants/index.js +5 -0
- package/lib/constants/status.js +39 -0
- package/lib/index.js +36 -9
- package/lib/item/addIndirectModifier.js +55 -0
- package/lib/item/calculate.js +108 -0
- package/lib/item/create.js +35 -0
- package/lib/item/filterByDirectModifiers.js +13 -0
- package/lib/item/findOriginalItem.js +8 -0
- package/lib/item/getBalanceToPay.js +12 -0
- package/lib/item/getDepartmentModifiers.js +5 -0
- package/lib/item/getDiscountModifiers.js +7 -0
- package/lib/item/getItemModifiers.js +16 -0
- package/lib/item/getItemModifiersDescription.js +22 -0
- package/lib/item/getItemPrice.js +57 -0
- package/lib/item/getItemsTotalPaid.js +9 -0
- package/lib/item/getItemsTotalPieces.js +7 -0
- package/lib/item/getNotIncludedModifiers.js +11 -0
- package/lib/item/getParentItem.js +5 -0
- package/lib/item/getPendingIndex.js +5 -0
- package/lib/item/getTotal.js +8 -0
- package/lib/item/getTotalPieces.js +7 -0
- package/lib/item/getTotals.js +25 -0
- package/lib/item/hasCreateSubscription.js +7 -0
- package/lib/item/hasModifier.js +15 -0
- package/lib/item/hasModifierWithValue.js +11 -0
- package/lib/item/hasModifiers.js +9 -0
- package/lib/item/hasSubscription.js +5 -0
- package/lib/item/index.js +80 -4
- package/lib/item/isParentIncluded.js +4 -0
- package/lib/item/isRelatedItem.js +4 -0
- package/lib/item/isSelected.js +13 -0
- package/lib/item/openRecommendationDialog.js +4 -0
- package/lib/item/removeModifier.js +84 -0
- package/lib/item/removeModifierById.js +8 -0
- package/lib/item/removeModifiers.js +14 -0
- package/lib/order/addCreditModifier.js +27 -0
- package/lib/order/addDiscountModifier.js +9 -0
- package/lib/order/addItem.js +292 -0
- package/lib/order/addItemModifier.js +214 -0
- package/lib/order/addModifier.js +9 -0
- package/lib/order/addModifierToAllItems.js +16 -0
- package/lib/order/addNote.js +25 -0
- package/lib/order/addTable.js +11 -0
- package/lib/order/calculate.js +105 -0
- package/lib/order/calculateDue.js +15 -0
- package/lib/order/calculateOrdersDue.js +26 -0
- package/lib/order/canSplit.js +4 -0
- package/lib/order/changeEndDate.js +15 -0
- package/lib/order/changeLocation.js +20 -0
- package/lib/order/changeStartDate.js +14 -0
- package/lib/order/combineSubOrders.js +14 -0
- package/lib/order/containsSerial.js +5 -0
- package/lib/order/create.js +67 -0
- package/lib/order/createParent.js +9 -0
- package/lib/order/duplicateItem.js +16 -0
- package/lib/order/findItemIndex.js +6 -0
- package/lib/order/getAppliedCredit.js +5 -0
- package/lib/order/getBalance.js +9 -0
- package/lib/order/getCustomer.js +4 -0
- package/lib/order/getCustomerStoreCredit.js +14 -0
- package/lib/order/getCustomerSubscriptions.js +8 -0
- package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
- package/lib/order/getDepartmentModifiers.js +9 -0
- package/lib/order/getEndDate.js +6 -0
- package/lib/order/getItemByItemId.js +6 -0
- package/lib/order/getItemIndex.js +9 -0
- package/lib/order/getItemsToPay.js +17 -0
- package/lib/order/getMenuItemsByCustomer.js +19 -0
- package/lib/order/getNumberOfItems.js +12 -0
- package/lib/order/getOrdersPieces.js +10 -0
- package/lib/order/getPendingItemIndex.js +5 -0
- package/lib/order/getRelatedItems.js +11 -0
- package/lib/order/getSameItems.js +14 -0
- package/lib/order/getScheduleByCustomer.js +20 -0
- package/lib/order/getScreenCustomerNotes.js +12 -0
- package/lib/order/getSelectedItem.js +6 -0
- package/lib/order/getStartDate.js +4 -0
- package/lib/order/getTip.js +10 -0
- package/lib/order/getTotalPieces.js +17 -0
- package/lib/order/getTotals.js +28 -0
- package/lib/order/hasAggregate.js +20 -0
- package/lib/order/hasItem.js +7 -0
- package/lib/order/hasRemainingSubscription.js +67 -0
- package/lib/order/hold.js +12 -0
- package/lib/order/index.js +167 -4
- package/lib/order/isDetailed.js +4 -0
- package/lib/order/isHold.js +4 -0
- package/lib/order/isNew.js +4 -0
- package/lib/order/isOpen.js +4 -0
- package/lib/order/isParent.js +7 -0
- package/lib/order/merge.js +96 -0
- package/lib/order/open.js +11 -0
- package/lib/order/pickEndDate.js +70 -0
- package/lib/order/removeApplyModifier.js +24 -0
- package/lib/order/removeDiscountModifier.js +16 -0
- package/lib/order/removeItem.js +56 -0
- package/lib/order/removeItemByIndex.js +5 -0
- package/lib/order/removeItemModifier.js +69 -0
- package/lib/order/removeModifier.js +21 -0
- package/lib/order/removeModifierByAttribute.js +23 -0
- package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
- package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
- package/lib/order/setCustomer.js +50 -0
- package/lib/order/splitByDepartments.js +151 -0
- package/lib/order/toggleModifier.js +9 -0
- package/lib/order/updateItem.js +8 -0
- package/lib/order/updateItemQuantity.js +35 -0
- package/lib/order/void.js +11 -0
- package/package.json +20 -23
- package/lib/item/actions.js +0 -135
- package/lib/modifier/actions.js +0 -163
- package/lib/modifier/constants.js +0 -46
- package/lib/modifier/index.js +0 -8
- package/lib/order/actions.js +0 -47
- package/lib/utils/defaultPrices.js +0 -10
- package/lib/utils/helpers.js +0 -26
- package/lib/utils/index.js +0 -9
- package/lib/utils/math.js +0 -71
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, itemActions }) =>
|
|
2
|
+
function removeModifier({ order, modifier }) {
|
|
3
|
+
if (!order || !modifier) return order;
|
|
4
|
+
|
|
5
|
+
const index = modifierActions.getModifierIndex({
|
|
6
|
+
entity: order,
|
|
7
|
+
modifier,
|
|
8
|
+
});
|
|
9
|
+
const nextOrder = { ...order };
|
|
10
|
+
|
|
11
|
+
if (index > -1) {
|
|
12
|
+
const { items, modifiers } = nextOrder;
|
|
13
|
+
if (items)
|
|
14
|
+
nextOrder.items = items.map(each =>
|
|
15
|
+
itemActions.removeModifier({ item: each, modifier: modifiers[index] })
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
nextOrder.modifiers.splice(index, 1);
|
|
19
|
+
}
|
|
20
|
+
return nextOrder;
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = ({ modifierActions }) =>
|
|
2
|
+
function removeModifierByAttribute({ order, attribute, applyItems = false }) {
|
|
3
|
+
if (!order || !attribute) return order;
|
|
4
|
+
if (!Array.isArray(order.modifiers)) return order;
|
|
5
|
+
|
|
6
|
+
const newOrder = { ...order };
|
|
7
|
+
newOrder.modifiers = order.modifiers.filter(
|
|
8
|
+
each => !modifierActions.hasAttribute(each, attribute)
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
12
|
+
newOrder.items = order.items.map(item => {
|
|
13
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
14
|
+
return {
|
|
15
|
+
...item,
|
|
16
|
+
modifiers: item.modifiers.filter(
|
|
17
|
+
each => !modifierActions.hasAttribute(each, attribute)
|
|
18
|
+
),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return newOrder;
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module.exports = () => {
|
|
2
|
+
const hasPaymentMethods = modifier =>
|
|
3
|
+
modifier.conditions &&
|
|
4
|
+
Array.isArray(modifier.conditions.paymentMethods) &&
|
|
5
|
+
modifier.conditions.paymentMethods.length;
|
|
6
|
+
|
|
7
|
+
return function removeModifiersWithPaymentMethods({
|
|
8
|
+
order,
|
|
9
|
+
applyItems = false,
|
|
10
|
+
}) {
|
|
11
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
12
|
+
|
|
13
|
+
const newOrder = { ...order };
|
|
14
|
+
newOrder.modifiers = order.modifiers.filter(
|
|
15
|
+
each => !hasPaymentMethods(each)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
19
|
+
newOrder.items = order.items.map(item => {
|
|
20
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
21
|
+
return {
|
|
22
|
+
...item,
|
|
23
|
+
modifiers: item.modifiers.filter(each => !hasPaymentMethods(each)),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return newOrder;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module.exports = () => {
|
|
2
|
+
const hasPaymentTypes = modifier =>
|
|
3
|
+
modifier.conditions &&
|
|
4
|
+
Array.isArray(modifier.conditions.paymentTypes) &&
|
|
5
|
+
modifier.conditions.paymentTypes.length;
|
|
6
|
+
|
|
7
|
+
return function removeModifiersWithPaymentTypes({
|
|
8
|
+
order,
|
|
9
|
+
applyItems = false,
|
|
10
|
+
}) {
|
|
11
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
12
|
+
|
|
13
|
+
const newOrder = { ...order };
|
|
14
|
+
newOrder.modifiers = order.modifiers.filter(each => !hasPaymentTypes(each));
|
|
15
|
+
|
|
16
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
17
|
+
newOrder.items = order.items.map(item => {
|
|
18
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
19
|
+
return {
|
|
20
|
+
...item,
|
|
21
|
+
modifiers: item.modifiers.filter(each => !hasPaymentTypes(each)),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return newOrder;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module.exports = ({ itemActions, modifierActions, _ }) => {
|
|
2
|
+
const getTags = customer =>
|
|
3
|
+
(customer.tags || []).map(tag => tag.toLowerCase());
|
|
4
|
+
|
|
5
|
+
return function setCustomer({ order, customer, cache }) {
|
|
6
|
+
if (!order) return null;
|
|
7
|
+
// if (!customer) return { ...order, customer: null };
|
|
8
|
+
|
|
9
|
+
const { items = [] } = order;
|
|
10
|
+
const tags = customer ? getTags(customer) : ['default'];
|
|
11
|
+
|
|
12
|
+
const nextOrder = _.cloneDeep(order);
|
|
13
|
+
if (customer) {
|
|
14
|
+
nextOrder.customer = {
|
|
15
|
+
..._.cloneDeep(customer),
|
|
16
|
+
isEmbedded: true,
|
|
17
|
+
tags,
|
|
18
|
+
};
|
|
19
|
+
} else nextOrder.customer = null;
|
|
20
|
+
|
|
21
|
+
if (!items.length) return nextOrder;
|
|
22
|
+
|
|
23
|
+
nextOrder.items = items.map(item => {
|
|
24
|
+
const originalItem = itemActions.findOriginalItem({ item, cache });
|
|
25
|
+
if (!originalItem) return item;
|
|
26
|
+
|
|
27
|
+
const newModifiers = modifierActions.getMatchTagsModifiers({
|
|
28
|
+
entity: customer,
|
|
29
|
+
modifiers: item.modifiers,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const price = itemActions.getItemPrice({
|
|
33
|
+
item,
|
|
34
|
+
customer,
|
|
35
|
+
cache,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const newItem = {
|
|
39
|
+
...originalItem,
|
|
40
|
+
...item,
|
|
41
|
+
modifiers: newModifiers,
|
|
42
|
+
price,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return newItem;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return nextOrder;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module.exports = ({
|
|
2
|
+
utils,
|
|
3
|
+
_,
|
|
4
|
+
itemActions,
|
|
5
|
+
modifierActions,
|
|
6
|
+
actions,
|
|
7
|
+
settings,
|
|
8
|
+
}) => {
|
|
9
|
+
const orderSettings = _.get(settings, 'order');
|
|
10
|
+
const { date, math, helpers } = utils;
|
|
11
|
+
const noteDefaults = {
|
|
12
|
+
message: '',
|
|
13
|
+
attributes: [],
|
|
14
|
+
date: date.toISOString(),
|
|
15
|
+
user: null,
|
|
16
|
+
url: '',
|
|
17
|
+
__typename: 'Note',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const getSplitModifiers = (modifiers, totalOriginOrder, totalSplitedOrder) =>
|
|
21
|
+
modifiers.map(each => {
|
|
22
|
+
const modifier = { ...each };
|
|
23
|
+
if (modifier.type === 'fixed' && modifier.amount) {
|
|
24
|
+
const amount = totalOriginOrder
|
|
25
|
+
? math.div(
|
|
26
|
+
math.mul(modifier.amount, totalSplitedOrder || 0),
|
|
27
|
+
totalOriginOrder
|
|
28
|
+
)
|
|
29
|
+
: 0;
|
|
30
|
+
return {
|
|
31
|
+
...modifier,
|
|
32
|
+
_id: helpers.getObjectID(),
|
|
33
|
+
amount,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return modifier;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const joinItemQuantity = orders =>
|
|
40
|
+
orders.map(order => {
|
|
41
|
+
const items = order.items.reduce((arr, item) => {
|
|
42
|
+
const _items = arr;
|
|
43
|
+
const index = _items.findIndex(each => {
|
|
44
|
+
const preSubs = modifierActions.getSubscriptionModifiers(
|
|
45
|
+
each.modifiers
|
|
46
|
+
);
|
|
47
|
+
const curSubs = modifierActions.getSubscriptionModifiers(
|
|
48
|
+
item.modifiers
|
|
49
|
+
);
|
|
50
|
+
return (
|
|
51
|
+
each.itemId === item.itemId &&
|
|
52
|
+
((!each.serial && !item.serial) || each.serial === item.serial) &&
|
|
53
|
+
((preSubs.length < 1 && curSubs.length < 1) ||
|
|
54
|
+
(preSubs.length > 0 && curSubs.length > 0))
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
if (index !== -1)
|
|
58
|
+
_items[index] = {
|
|
59
|
+
..._items[index],
|
|
60
|
+
quantity: _items[index].quantity + item.quantity,
|
|
61
|
+
};
|
|
62
|
+
else _items.push(item);
|
|
63
|
+
return _items;
|
|
64
|
+
}, []);
|
|
65
|
+
return { ...order, items };
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const getOrder =
|
|
69
|
+
({ order, name }) =>
|
|
70
|
+
(items, index) => {
|
|
71
|
+
let displayId = '';
|
|
72
|
+
if (orderSettings.allowSuborder)
|
|
73
|
+
displayId = `${order.displayId}-${index}`;
|
|
74
|
+
else if (index === 1) displayId = order.displayId;
|
|
75
|
+
return {
|
|
76
|
+
...order,
|
|
77
|
+
_id: helpers.getObjectID(),
|
|
78
|
+
displayId,
|
|
79
|
+
discount: 0,
|
|
80
|
+
tax: 0,
|
|
81
|
+
parentId: orderSettings.allowSuborder ? order._id : null,
|
|
82
|
+
items,
|
|
83
|
+
modifiers: [],
|
|
84
|
+
notes: [
|
|
85
|
+
...(order.notes || []),
|
|
86
|
+
{
|
|
87
|
+
...noteDefaults,
|
|
88
|
+
message: `Split from ${order.displayId}, for department ${name}`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const getDepartmentName = item => {
|
|
95
|
+
const deps = itemActions.getDepartmentModifiers(item);
|
|
96
|
+
return (deps.length && deps[0].name) || 'other';
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
return function splitByDepartments(order) {
|
|
100
|
+
const { items } = order;
|
|
101
|
+
const itemsByDepartments = _.groupBy(items, getDepartmentName);
|
|
102
|
+
const orders = Object.entries(itemsByDepartments);
|
|
103
|
+
let splitOrders = [];
|
|
104
|
+
|
|
105
|
+
orders.forEach(each => {
|
|
106
|
+
const [name, newItems] = each;
|
|
107
|
+
const create = getOrder({ order, name });
|
|
108
|
+
// Assuming there is one department in the item
|
|
109
|
+
const department = itemActions.getDepartmentModifiers(newItems[0])[0];
|
|
110
|
+
const departmentName = getDepartmentName(newItems[0]);
|
|
111
|
+
const maxItems = modifierActions.getDepartmentMaxItems(department);
|
|
112
|
+
|
|
113
|
+
if (
|
|
114
|
+
department &&
|
|
115
|
+
maxItems &&
|
|
116
|
+
itemActions.getItemsTotalPieces(newItems) > maxItems
|
|
117
|
+
) {
|
|
118
|
+
newItems.forEach(newItem => {
|
|
119
|
+
for (let j = 0; j < newItem.quantity; j += 1) {
|
|
120
|
+
const item = {
|
|
121
|
+
...newItem,
|
|
122
|
+
quantity: 1,
|
|
123
|
+
_id: helpers.getObjectID(),
|
|
124
|
+
};
|
|
125
|
+
const totalPieces = itemActions.getItemTotalPieces(item);
|
|
126
|
+
const index = splitOrders.findIndex(
|
|
127
|
+
newOrder =>
|
|
128
|
+
newOrder.items &&
|
|
129
|
+
itemActions.getItemsTotalPieces(newOrder.items) + totalPieces <=
|
|
130
|
+
maxItems &&
|
|
131
|
+
departmentName === getDepartmentName(newOrder.items[0])
|
|
132
|
+
);
|
|
133
|
+
if (index > -1) splitOrders[index].items.push(item);
|
|
134
|
+
else splitOrders.push(create([item], splitOrders.length + 1));
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
} else splitOrders.push(create(newItems, splitOrders.length + 1));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
splitOrders = joinItemQuantity(splitOrders);
|
|
141
|
+
|
|
142
|
+
return splitOrders.map(each => {
|
|
143
|
+
const { subTotal } = actions.calculate(each);
|
|
144
|
+
const newOrder = {
|
|
145
|
+
...each,
|
|
146
|
+
modifiers: getSplitModifiers(order.modifiers, order.subTotal, subTotal),
|
|
147
|
+
};
|
|
148
|
+
return actions.calculate(newOrder);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions }) =>
|
|
2
|
+
function toggleModifier({ order, modifier }) {
|
|
3
|
+
if (!order || !modifier) return order;
|
|
4
|
+
|
|
5
|
+
if (modifierActions.hasModifier({ entity: order, modifier })) {
|
|
6
|
+
return actions.removeModifier({ order, modifier });
|
|
7
|
+
}
|
|
8
|
+
return actions.addModifier({ order, modifier });
|
|
9
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module.exports = ({ _ }) =>
|
|
2
|
+
function updateItem({ order, itemIndex, item }) {
|
|
3
|
+
const updatedOrder = _.cloneDeep(order);
|
|
4
|
+
if (!order || !order.items || order.items.length < itemIndex)
|
|
5
|
+
return updatedOrder;
|
|
6
|
+
updatedOrder.items[itemIndex] = item;
|
|
7
|
+
return updatedOrder;
|
|
8
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module.exports = ({ actions, settings, _ }) => {
|
|
2
|
+
const orderSettings = _.get(settings, 'order');
|
|
3
|
+
return function updateItemQuantity({
|
|
4
|
+
order,
|
|
5
|
+
quantity,
|
|
6
|
+
itemIndex,
|
|
7
|
+
reset,
|
|
8
|
+
cache,
|
|
9
|
+
}) {
|
|
10
|
+
const item = actions.getSelectedItem({ order, itemIndex });
|
|
11
|
+
const isBefore = orderSettings.useKeypadOnItemAdd === 'before';
|
|
12
|
+
|
|
13
|
+
if ((!isBefore && item) || (item && item.isPending)) {
|
|
14
|
+
const updatedQuantity = reset
|
|
15
|
+
? quantity
|
|
16
|
+
: parseInt(`${item.quantity}${quantity}`, 10);
|
|
17
|
+
return actions.addItem({
|
|
18
|
+
order,
|
|
19
|
+
item,
|
|
20
|
+
itemIndex,
|
|
21
|
+
cache,
|
|
22
|
+
overridenQuantity: updatedQuantity,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (isBefore) {
|
|
26
|
+
return actions.addItem({
|
|
27
|
+
order,
|
|
28
|
+
item: { isPending: true },
|
|
29
|
+
cache,
|
|
30
|
+
overridenQuantity: quantity,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return order;
|
|
34
|
+
};
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkpos/pricing",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Pricing
|
|
3
|
+
"version": "1.0.6",
|
|
4
|
+
"description": "Pricing calculator",
|
|
5
5
|
"author": "Dark POS",
|
|
6
6
|
"license": "ISC",
|
|
7
7
|
"homepage": "https://gitlab.com/darkpos/packages/dark#readme",
|
|
@@ -9,35 +9,32 @@
|
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://gitlab.com/darkpos/packages/dark"
|
|
11
11
|
},
|
|
12
|
-
"main": "
|
|
12
|
+
"main": "index.js",
|
|
13
13
|
"scripts": {
|
|
14
|
-
"test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__"
|
|
14
|
+
"test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__",
|
|
15
|
+
"lint": "eslint --quiet --fix lib/"
|
|
15
16
|
},
|
|
16
17
|
"publishConfig": {
|
|
17
18
|
"access": "public"
|
|
18
19
|
},
|
|
19
|
-
"directories": {
|
|
20
|
-
"lib": "lib"
|
|
21
|
-
},
|
|
22
|
-
"files": [
|
|
23
|
-
"lib"
|
|
24
|
-
],
|
|
25
20
|
"dependencies": {
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"lodash": "^4.17.
|
|
21
|
+
"@darkpos/modifier": "1.0.2",
|
|
22
|
+
"@darkpos/utils": "1.0.7",
|
|
23
|
+
"lodash": "^4.17.21",
|
|
24
|
+
"moment-timezone": "^0.5.34"
|
|
29
25
|
},
|
|
30
26
|
"devDependencies": {
|
|
31
|
-
"eslint": "^
|
|
32
|
-
"eslint-config-airbnb": "^
|
|
33
|
-
"eslint-config-airbnb-base": "^
|
|
34
|
-
"eslint-config-prettier": "^
|
|
35
|
-
"eslint-plugin-
|
|
36
|
-
"eslint-plugin-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
27
|
+
"eslint": "^8.2.0",
|
|
28
|
+
"eslint-config-airbnb": "^19.0.4",
|
|
29
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
30
|
+
"eslint-config-prettier": "^8.5.0",
|
|
31
|
+
"eslint-plugin-import": "^2.26.0",
|
|
32
|
+
"eslint-plugin-jest": "^26.5.3",
|
|
33
|
+
"eslint-plugin-prettier": "^4.0.0",
|
|
34
|
+
"jest": "^28.1.1",
|
|
35
|
+
"prettier": "^2.7.0",
|
|
36
|
+
"supertest": "^6.2.3",
|
|
40
37
|
"supervisor": "^0.12.0"
|
|
41
38
|
},
|
|
42
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "61d62f77f8bbbff2bfe0230bdb803d87516db17b"
|
|
43
40
|
}
|
package/lib/item/actions.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
const modifierConstants = require('../modifier/constants');
|
|
2
|
-
const modifierActions = require('../modifier/actions');
|
|
3
|
-
const { math, defaultPrices } = require('../utils');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Remove order modifiers from items
|
|
7
|
-
*/
|
|
8
|
-
const _removeOrderModifiers = items =>
|
|
9
|
-
items.map(item => ({
|
|
10
|
-
...item,
|
|
11
|
-
modifiers: (item.modifiers || []).filter(
|
|
12
|
-
modifier => !modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed)
|
|
13
|
-
),
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Get items with order modifier
|
|
18
|
-
*/
|
|
19
|
-
const _getOrderModifiers = (items = []) =>
|
|
20
|
-
items
|
|
21
|
-
.reduce((modifiers, item) => [...modifiers, ...(item.modifiers || [])], [])
|
|
22
|
-
.filter(modifier =>
|
|
23
|
-
modifierActions._hasAttribute(modifier, modifierConstants.attributes.order)
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Get Total prices of items
|
|
28
|
-
*/
|
|
29
|
-
const _itemsPricing = (items = []) =>
|
|
30
|
-
items.reduce(
|
|
31
|
-
(prices, item) => ({
|
|
32
|
-
tax: math.add(prices.tax, item.tax),
|
|
33
|
-
subTotal: math.add(prices.subTotal, item.subTotal),
|
|
34
|
-
discount: math.add(prices.discount, item.discount),
|
|
35
|
-
distributed: math.add(prices.distributed, item.distributed),
|
|
36
|
-
total: math.add(prices.total, item.total),
|
|
37
|
-
fee: math.add(prices.fee, item.fee),
|
|
38
|
-
}),
|
|
39
|
-
defaultPrices
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* add order modifier to items
|
|
44
|
-
*/
|
|
45
|
-
const _addOrderModifier = (order, items, modifier) => {
|
|
46
|
-
if (!modifierActions._hasAttribute(modifier, modifierConstants.attributes.distributed))
|
|
47
|
-
return items;
|
|
48
|
-
|
|
49
|
-
const itemsModifiers = {};
|
|
50
|
-
// get distributed price in order level
|
|
51
|
-
const modifierPrices = modifierActions.pricing(modifier, {
|
|
52
|
-
price: order.total,
|
|
53
|
-
quantity: 1,
|
|
54
|
-
});
|
|
55
|
-
const orderModifierTotal = math.abs(modifierPrices.distributed);
|
|
56
|
-
|
|
57
|
-
const totalDistributed = items.reduce((acc, item) => {
|
|
58
|
-
const distributedMod = modifierActions._createDistributedModifier(order, item, modifier);
|
|
59
|
-
itemsModifiers[item._id] = distributedMod;
|
|
60
|
-
return math.add(acc, math.mul(distributedMod.amount, item.quantity));
|
|
61
|
-
}, 0);
|
|
62
|
-
|
|
63
|
-
// check validation
|
|
64
|
-
if (math.abs(totalDistributed) !== math.abs(orderModifierTotal)) {
|
|
65
|
-
const difference = math.sub(orderModifierTotal, totalDistributed);
|
|
66
|
-
// console.log('difference => ', difference);
|
|
67
|
-
const selectedItem = items.find(item => math.sub(item.total, difference) > 0);
|
|
68
|
-
|
|
69
|
-
const distributedMod = itemsModifiers[selectedItem._id];
|
|
70
|
-
itemsModifiers[selectedItem._id] = {
|
|
71
|
-
...distributedMod,
|
|
72
|
-
amount: math.add(distributedMod.amount, math.div(difference, selectedItem.quantity)),
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return itemsModifiers;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Get prices of an item
|
|
81
|
-
*/
|
|
82
|
-
const pricing = item => {
|
|
83
|
-
const { modifiers = [] } = item;
|
|
84
|
-
const price = parseFloat(item.price);
|
|
85
|
-
const quantity = parseInt(item.quantity, 10);
|
|
86
|
-
const subTotal = math.mul(price, quantity);
|
|
87
|
-
|
|
88
|
-
if (modifiers.length) {
|
|
89
|
-
const modifiersPrices = modifierActions.pricingModifiers(modifiers, {
|
|
90
|
-
price,
|
|
91
|
-
quantity,
|
|
92
|
-
});
|
|
93
|
-
const total = math.add(subTotal, modifiersPrices.total);
|
|
94
|
-
return { ...modifiersPrices, price, total, subTotal };
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return { ...defaultPrices, price, total: subTotal, subTotal };
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Get a calculated item
|
|
102
|
-
*/
|
|
103
|
-
const calculateItem = item => {
|
|
104
|
-
const descriptions = [];
|
|
105
|
-
const modifiers = (item.modifiers || []).map(mod => {
|
|
106
|
-
const description = modifierActions._getDescription(mod);
|
|
107
|
-
descriptions.push(description);
|
|
108
|
-
return { ...mod, description };
|
|
109
|
-
});
|
|
110
|
-
//
|
|
111
|
-
const prices = pricing(item);
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
...item,
|
|
115
|
-
modifiers,
|
|
116
|
-
...prices,
|
|
117
|
-
description: descriptions.join(', '),
|
|
118
|
-
};
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Get calculated items
|
|
123
|
-
*/
|
|
124
|
-
const calculateItems = (items = []) => items.map(item => calculateItem(item));
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
module.exports = {
|
|
128
|
-
calculateItem,
|
|
129
|
-
calculateItems,
|
|
130
|
-
pricing,
|
|
131
|
-
_getOrderModifiers,
|
|
132
|
-
_removeOrderModifiers,
|
|
133
|
-
_addOrderModifier,
|
|
134
|
-
_itemsPricing,
|
|
135
|
-
};
|