@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.
Files changed (123) hide show
  1. package/.eslintrc +22 -0
  2. package/README.md +110 -4
  3. package/__TEST__/item.test.js +285 -0
  4. package/__TEST__/order.test.js +234 -0
  5. package/index.js +1 -0
  6. package/lib/constants/index.js +5 -0
  7. package/lib/constants/status.js +39 -0
  8. package/lib/index.js +36 -9
  9. package/lib/item/addIndirectModifier.js +55 -0
  10. package/lib/item/calculate.js +108 -0
  11. package/lib/item/create.js +35 -0
  12. package/lib/item/filterByDirectModifiers.js +13 -0
  13. package/lib/item/findOriginalItem.js +8 -0
  14. package/lib/item/getBalanceToPay.js +12 -0
  15. package/lib/item/getDepartmentModifiers.js +5 -0
  16. package/lib/item/getDiscountModifiers.js +7 -0
  17. package/lib/item/getItemModifiers.js +16 -0
  18. package/lib/item/getItemModifiersDescription.js +22 -0
  19. package/lib/item/getItemPrice.js +57 -0
  20. package/lib/item/getItemsTotalPaid.js +9 -0
  21. package/lib/item/getItemsTotalPieces.js +7 -0
  22. package/lib/item/getNotIncludedModifiers.js +11 -0
  23. package/lib/item/getParentItem.js +5 -0
  24. package/lib/item/getPendingIndex.js +5 -0
  25. package/lib/item/getTotal.js +8 -0
  26. package/lib/item/getTotalPieces.js +7 -0
  27. package/lib/item/getTotals.js +25 -0
  28. package/lib/item/hasCreateSubscription.js +7 -0
  29. package/lib/item/hasModifier.js +15 -0
  30. package/lib/item/hasModifierWithValue.js +11 -0
  31. package/lib/item/hasModifiers.js +9 -0
  32. package/lib/item/hasSubscription.js +5 -0
  33. package/lib/item/index.js +80 -4
  34. package/lib/item/isParentIncluded.js +4 -0
  35. package/lib/item/isRelatedItem.js +4 -0
  36. package/lib/item/isSelected.js +13 -0
  37. package/lib/item/openRecommendationDialog.js +4 -0
  38. package/lib/item/removeModifier.js +84 -0
  39. package/lib/item/removeModifierById.js +8 -0
  40. package/lib/item/removeModifiers.js +14 -0
  41. package/lib/order/addCreditModifier.js +27 -0
  42. package/lib/order/addDiscountModifier.js +9 -0
  43. package/lib/order/addItem.js +292 -0
  44. package/lib/order/addItemModifier.js +214 -0
  45. package/lib/order/addModifier.js +9 -0
  46. package/lib/order/addModifierToAllItems.js +16 -0
  47. package/lib/order/addNote.js +25 -0
  48. package/lib/order/addTable.js +11 -0
  49. package/lib/order/calculate.js +105 -0
  50. package/lib/order/calculateDue.js +15 -0
  51. package/lib/order/calculateOrdersDue.js +26 -0
  52. package/lib/order/canSplit.js +4 -0
  53. package/lib/order/changeEndDate.js +15 -0
  54. package/lib/order/changeLocation.js +20 -0
  55. package/lib/order/changeStartDate.js +14 -0
  56. package/lib/order/combineSubOrders.js +14 -0
  57. package/lib/order/containsSerial.js +5 -0
  58. package/lib/order/create.js +67 -0
  59. package/lib/order/createParent.js +9 -0
  60. package/lib/order/duplicateItem.js +16 -0
  61. package/lib/order/findItemIndex.js +6 -0
  62. package/lib/order/getAppliedCredit.js +5 -0
  63. package/lib/order/getBalance.js +9 -0
  64. package/lib/order/getCustomer.js +4 -0
  65. package/lib/order/getCustomerStoreCredit.js +14 -0
  66. package/lib/order/getCustomerSubscriptions.js +8 -0
  67. package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
  68. package/lib/order/getDepartmentModifiers.js +9 -0
  69. package/lib/order/getEndDate.js +6 -0
  70. package/lib/order/getItemByItemId.js +6 -0
  71. package/lib/order/getItemIndex.js +9 -0
  72. package/lib/order/getItemsToPay.js +17 -0
  73. package/lib/order/getMenuItemsByCustomer.js +19 -0
  74. package/lib/order/getNumberOfItems.js +12 -0
  75. package/lib/order/getOrdersPieces.js +10 -0
  76. package/lib/order/getPendingItemIndex.js +5 -0
  77. package/lib/order/getRelatedItems.js +11 -0
  78. package/lib/order/getSameItems.js +14 -0
  79. package/lib/order/getScheduleByCustomer.js +20 -0
  80. package/lib/order/getScreenCustomerNotes.js +12 -0
  81. package/lib/order/getSelectedItem.js +6 -0
  82. package/lib/order/getStartDate.js +4 -0
  83. package/lib/order/getTip.js +10 -0
  84. package/lib/order/getTotalPieces.js +17 -0
  85. package/lib/order/getTotals.js +28 -0
  86. package/lib/order/hasAggregate.js +20 -0
  87. package/lib/order/hasItem.js +7 -0
  88. package/lib/order/hasRemainingSubscription.js +67 -0
  89. package/lib/order/hold.js +12 -0
  90. package/lib/order/index.js +167 -4
  91. package/lib/order/isDetailed.js +4 -0
  92. package/lib/order/isHold.js +4 -0
  93. package/lib/order/isNew.js +4 -0
  94. package/lib/order/isOpen.js +4 -0
  95. package/lib/order/isParent.js +7 -0
  96. package/lib/order/merge.js +96 -0
  97. package/lib/order/open.js +11 -0
  98. package/lib/order/pickEndDate.js +70 -0
  99. package/lib/order/removeApplyModifier.js +24 -0
  100. package/lib/order/removeDiscountModifier.js +16 -0
  101. package/lib/order/removeItem.js +56 -0
  102. package/lib/order/removeItemByIndex.js +5 -0
  103. package/lib/order/removeItemModifier.js +69 -0
  104. package/lib/order/removeModifier.js +21 -0
  105. package/lib/order/removeModifierByAttribute.js +23 -0
  106. package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
  107. package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
  108. package/lib/order/setCustomer.js +50 -0
  109. package/lib/order/splitByDepartments.js +151 -0
  110. package/lib/order/toggleModifier.js +9 -0
  111. package/lib/order/updateItem.js +8 -0
  112. package/lib/order/updateItemQuantity.js +35 -0
  113. package/lib/order/void.js +11 -0
  114. package/package.json +20 -23
  115. package/lib/item/actions.js +0 -135
  116. package/lib/modifier/actions.js +0 -163
  117. package/lib/modifier/constants.js +0 -46
  118. package/lib/modifier/index.js +0 -8
  119. package/lib/order/actions.js +0 -47
  120. package/lib/utils/defaultPrices.js +0 -10
  121. package/lib/utils/helpers.js +0 -26
  122. package/lib/utils/index.js +0 -9
  123. 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
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = ({ constants }) =>
2
+ function voidOrder(order) {
3
+ if (!order) return order;
4
+ return {
5
+ ...order,
6
+ status: {
7
+ ...(order.status || {}),
8
+ order: constants.status.Order.VOID,
9
+ },
10
+ };
11
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.3",
4
- "description": "Pricing calculation",
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": "./lib/index.js",
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
- "bson-objectid": "^1.3.0",
27
- "decimal.js": "^10.2.0",
28
- "lodash": "^4.17.15"
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": "^6.3.0",
32
- "eslint-config-airbnb": "^18.0.1",
33
- "eslint-config-airbnb-base": "^14.0.0",
34
- "eslint-config-prettier": "^6.2.0",
35
- "eslint-plugin-jest": "^22.17.0",
36
- "eslint-plugin-prettier": "^3.1.0",
37
- "jest": "^25.1.0",
38
- "prettier": "^1.18.2",
39
- "supertest": "^4.0.2",
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": "e25675947c015b6eb69a49e918ed778ee41ecc85"
39
+ "gitHead": "61d62f77f8bbbff2bfe0230bdb803d87516db17b"
43
40
  }
@@ -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
- };