@darkpos/pricing 1.0.5 → 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 (113) hide show
  1. package/.eslintrc +8 -10
  2. package/__TEST__/item.test.js +137 -99
  3. package/__TEST__/order.test.js +50 -36
  4. package/index.js +1 -25
  5. package/lib/constants/index.js +5 -0
  6. package/lib/constants/status.js +39 -0
  7. package/lib/index.js +36 -0
  8. package/lib/item/addIndirectModifier.js +34 -17
  9. package/lib/item/calculate.js +41 -19
  10. package/lib/item/create.js +35 -0
  11. package/lib/item/filterByDirectModifiers.js +5 -6
  12. package/lib/item/findOriginalItem.js +8 -0
  13. package/lib/item/getBalanceToPay.js +12 -0
  14. package/lib/item/getDepartmentModifiers.js +5 -0
  15. package/lib/item/getDiscountModifiers.js +7 -0
  16. package/lib/item/getItemModifiers.js +16 -0
  17. package/lib/item/getItemModifiersDescription.js +22 -0
  18. package/lib/item/getItemPrice.js +57 -0
  19. package/lib/item/getItemsTotalPaid.js +9 -0
  20. package/lib/item/getItemsTotalPieces.js +7 -0
  21. package/lib/item/getNotIncludedModifiers.js +11 -0
  22. package/lib/item/getParentItem.js +5 -0
  23. package/lib/item/getPendingIndex.js +5 -0
  24. package/lib/item/getTotal.js +8 -0
  25. package/lib/item/getTotalPieces.js +7 -0
  26. package/lib/item/getTotals.js +25 -0
  27. package/lib/item/hasCreateSubscription.js +7 -0
  28. package/lib/item/hasModifier.js +15 -0
  29. package/lib/item/hasModifierWithValue.js +11 -0
  30. package/lib/item/hasModifiers.js +9 -0
  31. package/lib/item/hasSubscription.js +5 -0
  32. package/lib/item/index.js +80 -10
  33. package/lib/item/isParentIncluded.js +4 -0
  34. package/lib/item/isRelatedItem.js +4 -0
  35. package/lib/item/isSelected.js +13 -0
  36. package/lib/item/openRecommendationDialog.js +4 -0
  37. package/lib/item/removeModifier.js +84 -0
  38. package/lib/item/removeModifierById.js +8 -0
  39. package/lib/item/removeModifiers.js +14 -0
  40. package/lib/order/addCreditModifier.js +27 -0
  41. package/lib/order/addDiscountModifier.js +9 -0
  42. package/lib/order/addItem.js +292 -0
  43. package/lib/order/addItemModifier.js +214 -0
  44. package/lib/order/addModifier.js +9 -0
  45. package/lib/order/addModifierToAllItems.js +16 -0
  46. package/lib/order/addNote.js +25 -0
  47. package/lib/order/addTable.js +11 -0
  48. package/lib/order/calculate.js +51 -16
  49. package/lib/order/calculateDue.js +15 -0
  50. package/lib/order/calculateOrdersDue.js +26 -0
  51. package/lib/order/canSplit.js +4 -0
  52. package/lib/order/changeEndDate.js +15 -0
  53. package/lib/order/changeLocation.js +20 -0
  54. package/lib/order/changeStartDate.js +14 -0
  55. package/lib/order/combineSubOrders.js +14 -0
  56. package/lib/order/containsSerial.js +5 -0
  57. package/lib/order/create.js +67 -0
  58. package/lib/order/createParent.js +9 -0
  59. package/lib/order/duplicateItem.js +16 -0
  60. package/lib/order/findItemIndex.js +6 -0
  61. package/lib/order/getAppliedCredit.js +5 -0
  62. package/lib/order/getBalance.js +9 -0
  63. package/lib/order/getCustomer.js +4 -0
  64. package/lib/order/getCustomerStoreCredit.js +14 -0
  65. package/lib/order/getCustomerSubscriptions.js +8 -0
  66. package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
  67. package/lib/order/getDepartmentModifiers.js +9 -0
  68. package/lib/order/getEndDate.js +6 -0
  69. package/lib/order/getItemByItemId.js +6 -0
  70. package/lib/order/getItemIndex.js +9 -0
  71. package/lib/order/getItemsToPay.js +17 -0
  72. package/lib/order/getMenuItemsByCustomer.js +19 -0
  73. package/lib/order/getNumberOfItems.js +12 -0
  74. package/lib/order/getOrdersPieces.js +10 -0
  75. package/lib/order/getPendingItemIndex.js +5 -0
  76. package/lib/order/getRelatedItems.js +11 -0
  77. package/lib/order/getSameItems.js +14 -0
  78. package/lib/order/getScheduleByCustomer.js +20 -0
  79. package/lib/order/getScreenCustomerNotes.js +12 -0
  80. package/lib/order/getSelectedItem.js +6 -0
  81. package/lib/order/getStartDate.js +4 -0
  82. package/lib/order/getTip.js +10 -0
  83. package/lib/order/getTotalPieces.js +17 -0
  84. package/lib/order/getTotals.js +28 -0
  85. package/lib/order/hasAggregate.js +20 -0
  86. package/lib/order/hasItem.js +7 -0
  87. package/lib/order/hasRemainingSubscription.js +67 -0
  88. package/lib/order/hold.js +12 -0
  89. package/lib/order/index.js +166 -5
  90. package/lib/order/isDetailed.js +4 -0
  91. package/lib/order/isHold.js +4 -0
  92. package/lib/order/isNew.js +4 -0
  93. package/lib/order/isOpen.js +4 -0
  94. package/lib/order/isParent.js +7 -0
  95. package/lib/order/merge.js +96 -0
  96. package/lib/order/open.js +11 -0
  97. package/lib/order/pickEndDate.js +70 -0
  98. package/lib/order/removeApplyModifier.js +24 -0
  99. package/lib/order/removeDiscountModifier.js +16 -0
  100. package/lib/order/removeItem.js +56 -0
  101. package/lib/order/removeItemByIndex.js +5 -0
  102. package/lib/order/removeItemModifier.js +69 -0
  103. package/lib/order/removeModifier.js +21 -0
  104. package/lib/order/removeModifierByAttribute.js +23 -0
  105. package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
  106. package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
  107. package/lib/order/setCustomer.js +50 -0
  108. package/lib/order/splitByDepartments.js +151 -0
  109. package/lib/order/toggleModifier.js +9 -0
  110. package/lib/order/updateItem.js +8 -0
  111. package/lib/order/updateItemQuantity.js +35 -0
  112. package/lib/order/void.js +11 -0
  113. package/package.json +16 -18
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -18,25 +18,23 @@
18
18
  "access": "public"
19
19
  },
20
20
  "dependencies": {
21
- "@darkpos/modifier": "1.0.1",
22
- "@darkpos/utils": "1.0.6",
23
- "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"
24
25
  },
25
26
  "devDependencies": {
26
- "eslint": "^6.8.0",
27
- "eslint-config-airbnb": "^18.1.0",
28
- "eslint-config-airbnb-base": "^14.1.0",
29
- "eslint-config-prettier": "^6.10.1",
30
- "eslint-plugin-import": "^2.20.1",
31
- "eslint-plugin-jest": "^23.8.2",
32
- "eslint-plugin-jsx-a11y": "^6.2.3",
33
- "eslint-plugin-prettier": "^3.1.3",
34
- "eslint-plugin-react": "^7.19.0",
35
- "eslint-plugin-react-hooks": "^2.5.1",
36
- "jest": "^25.1.0",
37
- "prettier": "^1.19.1",
38
- "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",
39
37
  "supervisor": "^0.12.0"
40
38
  },
41
- "gitHead": "21acd4771ef10c9d65081a430d6e9cfe2c08069b"
39
+ "gitHead": "61d62f77f8bbbff2bfe0230bdb803d87516db17b"
42
40
  }