@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
package/lib/index.js CHANGED
@@ -1,9 +1,36 @@
1
- const modifier = require('./modifier');
2
- const item = require('./item');
3
- const order = require('./order');
4
-
5
- module.exports = {
6
- modifier,
7
- item,
8
- order,
9
- };
1
+ const makeModifierService = require('@darkpos/modifier');
2
+ const utils = require('@darkpos/utils');
3
+ const _ = require('lodash');
4
+ const moment = require('moment-timezone');
5
+ /** services */
6
+ const makeItemActions = require('./item');
7
+ const makeOrderActions = require('./order');
8
+
9
+ module.exports = session => {
10
+ const { useLocalization } = utils;
11
+ const settings = _.get(session, 'store._settings', {});
12
+ const localization = useLocalization(settings.localization);
13
+
14
+ const deps = {
15
+ settings,
16
+ utils,
17
+ localization,
18
+ _,
19
+ moment,
20
+ };
21
+
22
+ //
23
+ const modifierActions = makeModifierService(session);
24
+ const itemActions = makeItemActions({ ...deps, modifierActions });
25
+ const orderActions = makeOrderActions({
26
+ ...deps,
27
+ itemActions,
28
+ modifierActions,
29
+ });
30
+
31
+ return {
32
+ item: itemActions,
33
+ order: orderActions,
34
+ modifier: modifierActions,
35
+ };
36
+ };
@@ -0,0 +1,55 @@
1
+ module.exports = ({ utils, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function addIndirectModifier(orderTotal, items, modifier) {
5
+ const itemsModifiers = {};
6
+ // get distributed price in order level
7
+ const { _computed } = modifierActions.calculate(modifier, {
8
+ price: orderTotal,
9
+ quantity: 1,
10
+ });
11
+
12
+ const orderModifierTotal = math.abs(_computed.amount);
13
+ const totalDistributed = items.reduce((acc, item) => {
14
+ const inheritedModifier = modifierActions.createIndirectModifier(
15
+ modifier,
16
+ {
17
+ orderTotal,
18
+ itemTotal: item.total,
19
+ itemQuantity: item.quantity,
20
+ }
21
+ );
22
+ itemsModifiers[item._id] = inheritedModifier;
23
+ return math.add(
24
+ acc,
25
+ math.mul(inheritedModifier.compute.amount, item.quantity)
26
+ );
27
+ }, 0);
28
+
29
+ // check validation
30
+ if (math.abs(totalDistributed) !== math.abs(orderModifierTotal)) {
31
+ const difference = math.sub(orderModifierTotal, totalDistributed);
32
+ // console.log('difference => ', difference);
33
+ const selectedItem = items.find(
34
+ item => math.sub(item.total, difference) > 0
35
+ );
36
+
37
+ if (selectedItem) {
38
+ const inheritedModifier = itemsModifiers[selectedItem._id];
39
+ itemsModifiers[selectedItem._id] = {
40
+ ...inheritedModifier,
41
+ compute: {
42
+ ...inheritedModifier.compute,
43
+ amount: math.add(
44
+ inheritedModifier.compute.amount,
45
+ math.div(difference, selectedItem.quantity)
46
+ ),
47
+ },
48
+ };
49
+ }
50
+ return itemsModifiers;
51
+ }
52
+
53
+ return itemsModifiers;
54
+ };
55
+ };
@@ -0,0 +1,108 @@
1
+ /* eslint-disable no-restricted-syntax */
2
+ module.exports = ({ _, utils, modifierActions }) => {
3
+ const { math } = utils;
4
+ //
5
+ const calculateOne = inputItem => {
6
+ const item = _.cloneDeep(inputItem);
7
+ if (!item) return item;
8
+
9
+ const subTotals = {
10
+ _included: 0,
11
+ _xincluded: 0,
12
+ _direct: 0,
13
+ _xdirect: 0,
14
+ _simple: 0,
15
+ _actual: 0,
16
+ };
17
+
18
+ const price = parseFloat(item.price);
19
+ const quantity = parseInt(item.quantity, 10);
20
+ subTotals._simple = math.mul(price, quantity);
21
+
22
+ const modifiers = [];
23
+ const { modifiers: itemModifiers = [] } = item;
24
+ const amountOverride = itemModifiers.find(each =>
25
+ modifierActions.isAmountOverride(each)
26
+ );
27
+
28
+ const modifiersToCompute = itemModifiers.filter(
29
+ each =>
30
+ !modifierActions.isOverride(each) && each.compute && each.compute.type
31
+ );
32
+ if (amountOverride) modifiersToCompute.push(amountOverride);
33
+
34
+ const modifiersToNotCompute = itemModifiers
35
+ .filter(
36
+ each =>
37
+ !modifiersToCompute.find(
38
+ ceach => ceach.modifierId === each.modifierId
39
+ )
40
+ )
41
+ .map(each => modifierActions.calculate(each, { skip: true }));
42
+
43
+ if (modifiersToCompute.length) {
44
+ // sort modifiers based on sort
45
+ const sortedModifiers = modifierActions.sort(modifiersToCompute);
46
+ let computedPrice = price;
47
+ let prvPrice = 0;
48
+ let prvSort;
49
+
50
+ for (const modifier of sortedModifiers) {
51
+ const included = modifierActions.isIncluded(modifier);
52
+ const direct = modifierActions.isDirect(modifier);
53
+ const sort = modifierActions.getProperty(modifier, 'sort');
54
+ // check if add amount to computedPrice;
55
+ if (sort !== prvSort) {
56
+ computedPrice = math.add(computedPrice, prvPrice);
57
+ prvPrice = 0;
58
+ prvSort = null;
59
+ }
60
+
61
+ const _modifier = modifierActions.calculate(modifier, {
62
+ price: computedPrice,
63
+ quantity,
64
+ skip: !!amountOverride,
65
+ });
66
+
67
+ modifiers.push(_modifier);
68
+ const { type, _computed } = _modifier;
69
+ // console.log('computedPrice => ', _computed);
70
+ let computedAmount = math.mul(_computed.amount, quantity);
71
+ // subscription modifiers have fixed amount and can't be multiplied by quantity
72
+ if (modifierActions.isSubscription(_modifier))
73
+ computedAmount = _computed.amount;
74
+
75
+ if (included) {
76
+ subTotals._included = math.add(subTotals._included, computedAmount);
77
+ prvPrice = math.add(prvPrice, computedAmount);
78
+ prvSort = sort;
79
+ } else {
80
+ subTotals._xincluded = math.add(subTotals._xincluded, computedAmount);
81
+ subTotals[type] = math.add(subTotals[type] || 0, computedAmount);
82
+ }
83
+ if (direct)
84
+ subTotals._direct = math.add(subTotals._direct, computedAmount);
85
+ else subTotals._xdirect = math.add(subTotals._xdirect, computedAmount);
86
+ }
87
+ }
88
+
89
+ subTotals._actual = math.add(subTotals._simple, subTotals._included);
90
+ // console.log('subTotals =>', subTotals);
91
+ const total = math.add(subTotals._actual, subTotals._xincluded);
92
+
93
+ return {
94
+ ...item,
95
+ modifiers: [...modifiersToNotCompute, ...modifiers],
96
+ subTotals,
97
+ total,
98
+ };
99
+ };
100
+
101
+ //
102
+ const calculateMany = (items = []) => items.map(item => calculateOne(item));
103
+
104
+ return function calculate(item) {
105
+ if (Array.isArray(item)) return calculateMany(item);
106
+ return calculateOne(item);
107
+ };
108
+ };
@@ -0,0 +1,35 @@
1
+ module.exports = ({ utils }) => {
2
+ const { helpers } = utils;
3
+
4
+ const defaultItem = {
5
+ location: {},
6
+ status: {
7
+ picked: { value: false, date: '' },
8
+ paid: { value: false, date: '' },
9
+ tracker: [],
10
+ },
11
+ name: '',
12
+ description: '',
13
+ pieces: 0,
14
+ modifiersTotalAmount: 0,
15
+ total: 0,
16
+ totalPaid: 0,
17
+ price: 0,
18
+ quantity: 0,
19
+ path: [],
20
+ notes: [],
21
+ menuId: null,
22
+ serial: null,
23
+ sku: null,
24
+ modifiers: [],
25
+ };
26
+
27
+ return function create(params) {
28
+ return {
29
+ ...defaultItem,
30
+ ...params,
31
+ __typename: 'OrderItem',
32
+ _id: helpers.getObjectID(),
33
+ };
34
+ };
35
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Remove order modifiers from items
3
+ */
4
+ module.exports = ({ modifierActions }) =>
5
+ //
6
+ function filterByDirectModifiers(items = []) {
7
+ return items.map(item => ({
8
+ ...item,
9
+ modifiers: (item.modifiers || []).filter(modifier =>
10
+ modifierActions.isDirect(modifier)
11
+ ),
12
+ }));
13
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function findOriginalItem({ item, cache = {} }) {
3
+ const original =
4
+ Array.isArray(cache.items) &&
5
+ cache.items.find(each => each._id === item.itemId);
6
+
7
+ return original || item;
8
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ utils }) =>
2
+ function getBalanceToPay({ orderItems = [] }) {
3
+ const total = orderItems.reduce(
4
+ (t, item) => utils.math.add(t, item && item.total),
5
+ 0
6
+ );
7
+ const totalPaid = orderItems.reduce(
8
+ (t, item) => utils.math.add(t, item && item.totalPaid),
9
+ 0
10
+ );
11
+ return utils.math.sub(total, totalPaid);
12
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getDepartmentModifiers(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
+ return modifierActions.getDepartmentModifiers(item.modifiers);
5
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getDiscountModifiers(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
+ return item.modifiers.filter(
5
+ each => modifierActions.isDiscount(each) && modifierActions.isDirect(each)
6
+ );
7
+ };
@@ -0,0 +1,16 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getItemModifiers(item, orderModifiers) {
3
+ const existsInOrderModifier = modifier =>
4
+ orderModifiers &&
5
+ orderModifiers.find(each => each.modifierId === modifier.modifierId);
6
+
7
+ let modifiers = [];
8
+ if (!item || !Array.isArray(item.modifiers)) return modifiers;
9
+
10
+ modifiers.push(...item.modifiers);
11
+
12
+ if (Array.isArray(orderModifiers) && orderModifiers.length)
13
+ modifiers = modifiers.filter(each => !existsInOrderModifier(each));
14
+
15
+ return modifiers.filter(modifierActions.isDirect);
16
+ };
@@ -0,0 +1,22 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getItemModifiersDescription(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
+ const description = item.modifiers
5
+ .filter(
6
+ each =>
7
+ !modifierActions.isHidden(each) &&
8
+ !modifierActions.isAmountOverride(each) &&
9
+ modifierActions.isDirect(each)
10
+ )
11
+ .map(modifier => {
12
+ const { name } = modifier;
13
+ let label = name;
14
+ if (modifierActions.isGroupOfValues(modifier))
15
+ label = modifierActions.getSelectedValues(modifier) || label;
16
+
17
+ return label;
18
+ })
19
+ .join(', ');
20
+
21
+ return description;
22
+ };
@@ -0,0 +1,57 @@
1
+ module.exports = ({ actions, modifierActions, utils }) => {
2
+ const { math } = utils;
3
+
4
+ const getCustomerTags = (customer = {}) =>
5
+ ((customer && customer.tags) || []).filter(Boolean);
6
+
7
+ return function getItemPrice({ item, cache, customer }) {
8
+ const modifiers = item.modifiers || [];
9
+ let { priceLevels } = item;
10
+
11
+ // get cache Item
12
+ if (cache && cache.items) {
13
+ const orgItem = actions.findOriginalItem({
14
+ item,
15
+ cache,
16
+ });
17
+ ({ priceLevels } = orgItem);
18
+ }
19
+
20
+ if (!priceLevels) return 0;
21
+
22
+ const extendedTags = modifierActions.getExtendedTags(modifiers);
23
+ const customerTags = getCustomerTags(customer).concat(extendedTags);
24
+
25
+ const matchedPriceLevels = priceLevels.filter(
26
+ priceLevel =>
27
+ priceLevel.tags &&
28
+ priceLevel.tags.every(tag => customerTags.includes(tag))
29
+ );
30
+ if (!matchedPriceLevels.length) return 0;
31
+ const maxPriceLevel = matchedPriceLevels.reduce(
32
+ (prevPriceLevel, priceLevel) => {
33
+ const curLength = priceLevel.tags.length;
34
+ const preLength = prevPriceLevel.tags.length;
35
+
36
+ if (curLength > preLength) return priceLevel;
37
+ if (preLength === curLength && priceLevel.value < prevPriceLevel.value)
38
+ return priceLevel;
39
+
40
+ return prevPriceLevel;
41
+ }
42
+ );
43
+
44
+ const { value } = maxPriceLevel;
45
+
46
+ const overridPriceModifier = modifiers.find(each =>
47
+ modifierActions.isPriceOverride(each)
48
+ );
49
+ if (overridPriceModifier && overridPriceModifier.compute) {
50
+ if (modifierActions.isMultiplier(overridPriceModifier))
51
+ return math.mul(value, overridPriceModifier.compute.amount);
52
+ return overridPriceModifier.compute.amount;
53
+ }
54
+
55
+ return value;
56
+ };
57
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = ({ utils }) =>
2
+ function getItemsTotalPaid({ orderItems = [] }) {
3
+ return (
4
+ orderItems.reduce(
5
+ (t, item) => utils.math.add(t, item && item.totalPaid),
6
+ 0
7
+ ) || 0
8
+ );
9
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function getItemsTotalPieces(items) {
3
+ return items.reduce(
4
+ (total, item) => total + actions.getItemTotalPieces(item),
5
+ 0
6
+ );
7
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function getNotIncludedModifiers({ item, modifiers }) {
3
+ if (!item || !item.modifiers || !modifiers) return [];
4
+ return modifiers.filter(
5
+ each =>
6
+ !item.modifiers.find(
7
+ modifier =>
8
+ each._id === modifier.modifierId || each._id === modifier._id
9
+ )
10
+ );
11
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getParentItem(items, item) {
3
+ if (!Array.isArray(items) || !item) return null;
4
+ return items.find(each => each._id === item.properties.parentId);
5
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getPendingIndex(items) {
3
+ if (!items || !items.length) return -1;
4
+ return items.findIndex(each => each.isPending);
5
+ };
@@ -0,0 +1,8 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotal(item) {
4
+ if (!item || !item.subTotals) return 0;
5
+
6
+ return math.add(item.subTotals._simple, item.subTotals._direct);
7
+ };
8
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotalPieces(item) {
4
+ if (!item) return 0;
5
+ return math.mul(item.quantity || 1, item.pieces || 1);
6
+ };
7
+ };
@@ -0,0 +1,25 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotals(items) {
4
+ if (!Array.isArray(items)) return { total: 0, subTotals: {} };
5
+ return items.reduce(
6
+ (acc, item) => {
7
+ const subTotals = {};
8
+ const { subTotals: itemSubTotals = {} } = item;
9
+ const keys = Object.keys(itemSubTotals);
10
+ // eslint-disable-next-line no-restricted-syntax
11
+ for (const key of keys)
12
+ subTotals[key] = math.add(
13
+ acc.subTotals[key] || 0,
14
+ itemSubTotals[key]
15
+ );
16
+
17
+ return {
18
+ total: math.add(acc.total, item.total),
19
+ subTotals,
20
+ };
21
+ },
22
+ { total: 0, subTotals: {} }
23
+ );
24
+ };
25
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasCreateSubscription(items) {
3
+ return (
4
+ Array.isArray(items) &&
5
+ items.some(item => modifierActions.hasCreateSubscription(item.modifiers))
6
+ );
7
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = () =>
2
+ function hasModifier({ item, modifier }) {
3
+ if (!item || !modifier || !item.modifiers) return false;
4
+
5
+ const itemModifier = item.modifiers.find(
6
+ each =>
7
+ (each.modifierId &&
8
+ (each.modifierId === modifier.modifierId ||
9
+ each.modifierId === modifier._id)) ||
10
+ (typeof each.modifier === 'object' &&
11
+ each.modifier._id === modifier.modifierId)
12
+ );
13
+
14
+ return !!itemModifier;
15
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasModifierWithValue({ item, modifier, value }) {
3
+ if (!item || !modifier || !item.modifiers) return false;
4
+ const relatedModifier = item.modifiers.find(
5
+ itemModifier => modifier._id === itemModifier.modifierId
6
+ );
7
+ return modifierActions.isValueSelected({
8
+ modifier: relatedModifier,
9
+ value,
10
+ });
11
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function hasModifiers({ item, modifiers }) {
3
+ if (!item || !modifiers || !item.modifiers) return false;
4
+
5
+ return item.modifiers.some(
6
+ itemModifier =>
7
+ !!modifiers.find(each => each._id === itemModifier.modifierId)
8
+ );
9
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function hasSubscription(item) {
3
+ if (!item || !Array.isArray(item.modifiers)) return false;
4
+ return !!item.modifiers.find(each => modifierActions.isSubscription(each));
5
+ };
package/lib/item/index.js CHANGED
@@ -1,6 +1,82 @@
1
- const { filterExports } = require('../utils');
2
- const actions = require('./actions');
1
+ const getItemsTotalPieces = require('./getItemsTotalPieces');
2
+ const getTotalPieces = require('./getTotalPieces');
3
+ const removeModifier = require('./removeModifier');
4
+ const removeModifiers = require('./removeModifiers');
5
+ const findOriginalItem = require('./findOriginalItem');
6
+ const create = require('./create');
7
+ const hasModifier = require('./hasModifier');
8
+ const isSelected = require('./isSelected');
9
+ const hasModifiers = require('./hasModifiers');
10
+ const openRecommendationDialog = require('./openRecommendationDialog');
11
+ const addIndirectModifier = require('./addIndirectModifier');
12
+ const calculate = require('./calculate');
13
+ const filterByDirectModifiers = require('./filterByDirectModifiers');
14
+ const getItemPrice = require('./getItemPrice');
15
+ const getDepartmentModifiers = require('./getDepartmentModifiers');
16
+ const hasSubscription = require('./hasSubscription');
17
+ const removeModifierById = require('./removeModifierById');
18
+ const getDiscountModifiers = require('./getDiscountModifiers');
19
+ const getTotal = require('./getTotal');
20
+ const getPendingIndex = require('./getPendingIndex');
21
+ const getTotals = require('./getTotals');
22
+ const getNotIncludedModifiers = require('./getNotIncludedModifiers');
23
+ const hasModifierWithValue = require('./hasModifierWithValue');
24
+ const getBalanceToPay = require('./getBalanceToPay');
25
+ const getItemsTotalPaid = require('./getItemsTotalPaid');
26
+ const getItemModifiersDescription = require('./getItemModifiersDescription');
27
+ const isRelatedItem = require('./isRelatedItem');
28
+ const getParentItem = require('./getParentItem');
29
+ const isParentIncluded = require('./isParentIncluded');
30
+ const hasCreateSubscription = require('./hasCreateSubscription');
31
+ const getItemModifiers = require('./getItemModifiers');
3
32
 
4
- module.exports = {
5
- actions: filterExports(actions),
33
+ const itemActions = (deps = {}) => {
34
+ const actions = {};
35
+
36
+ const innerDeps = {
37
+ ...deps,
38
+ actions,
39
+ };
40
+
41
+ const freezedActions = Object.freeze({
42
+ getItemsTotalPieces: getItemsTotalPieces(innerDeps),
43
+ getTotalPieces: getTotalPieces(innerDeps),
44
+ removeModifier: removeModifier(innerDeps),
45
+ removeModifiers: removeModifiers(innerDeps),
46
+ findOriginalItem: findOriginalItem(innerDeps),
47
+ create: create(innerDeps),
48
+ hasModifier: hasModifier(innerDeps),
49
+ isSelected: isSelected(innerDeps),
50
+ hasModifiers: hasModifiers(innerDeps),
51
+ openRecommendationDialog: openRecommendationDialog(innerDeps),
52
+ addIndirectModifier: addIndirectModifier(innerDeps),
53
+ calculate: calculate(innerDeps),
54
+ filterByDirectModifiers: filterByDirectModifiers(innerDeps),
55
+ getItemPrice: getItemPrice(innerDeps),
56
+ getDepartmentModifiers: getDepartmentModifiers(innerDeps),
57
+ hasSubscription: hasSubscription(innerDeps),
58
+ removeModifierById: removeModifierById(innerDeps),
59
+ getDiscountModifiers: getDiscountModifiers(innerDeps),
60
+ getTotal: getTotal(innerDeps),
61
+ getPendingIndex: getPendingIndex(innerDeps),
62
+ getTotals: getTotals(innerDeps),
63
+ getNotIncludedModifiers: getNotIncludedModifiers(innerDeps),
64
+ hasModifierWithValue: hasModifierWithValue(innerDeps),
65
+ getBalanceToPay: getBalanceToPay(innerDeps),
66
+ getItemsTotalPaid: getItemsTotalPaid(innerDeps),
67
+ getItemModifiersDescription: getItemModifiersDescription(innerDeps),
68
+ isRelatedItem: isRelatedItem(innerDeps),
69
+ getParentItem: getParentItem(innerDeps),
70
+ isParentIncluded: isParentIncluded(innerDeps),
71
+ hasCreateSubscription: hasCreateSubscription(innerDeps),
72
+ getItemModifiers: getItemModifiers(innerDeps),
73
+ });
74
+
75
+ Object.keys(freezedActions).forEach(actionName => {
76
+ actions[actionName] = freezedActions[actionName];
77
+ });
78
+
79
+ return freezedActions;
6
80
  };
81
+
82
+ module.exports = itemActions;
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isParentIncluded(item) {
3
+ return item && item.properties && item.properties.includeParent;
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function isRelatedItem(item) {
3
+ return !!(item && item.properties && item.properties.relatedItem);
4
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = ({ modifierActions, actions }) =>
2
+ function isSelected({ item, modifier }) {
3
+ if (!item || !item.modifiers || !modifier) return false;
4
+ let hasModifier = actions.hasModifier({ item, modifier });
5
+
6
+ if (!hasModifier && modifierActions.isGroupOfModifiers(modifier))
7
+ hasModifier = actions.hasModifiers({
8
+ item,
9
+ modifiers: modifier.properties.group.modifiers,
10
+ });
11
+
12
+ return hasModifier;
13
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function openRecommendationDialog(item) {
3
+ return !!(item && item.openRecommendationDialog);
4
+ };