@darkpos/pricing 1.0.66 → 1.0.68

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.
@@ -1,6 +1,11 @@
1
1
  const usePricing = require('../../index');
2
+ const mockStores = require('../mocks/stores');
2
3
 
3
- const pricingService = usePricing();
4
+ const session = {
5
+ store: mockStores[0],
6
+ };
7
+
8
+ const pricingService = usePricing(session);
4
9
 
5
10
  describe('hasModifier Function', () => {
6
11
  test('hasModifier should return false for an item that only has white(group modifier)', () => {
@@ -1623,4 +1628,70 @@ describe('hasModifier Function', () => {
1623
1628
 
1624
1629
  expect(hasModifier).toBe(false);
1625
1630
  });
1631
+
1632
+ test('hasModifier, using only 1 related items', () => {
1633
+ const relatedModItem = {
1634
+ _id: 'abc',
1635
+ name: 'related item abc',
1636
+ itemId: 'abc',
1637
+ };
1638
+ const groupMod = {
1639
+ _id: 'groupMod10',
1640
+ attributes: ['group'],
1641
+ properties: {
1642
+ group: {
1643
+ items: [relatedModItem],
1644
+ modifiers: [
1645
+ {
1646
+ _id: '123',
1647
+ name: 'related mod',
1648
+ },
1649
+ ],
1650
+ },
1651
+ },
1652
+ };
1653
+
1654
+ const item = { _id: 1, itemId: 'ab', modifiers: [groupMod] };
1655
+
1656
+ const order = {
1657
+ items: [item],
1658
+ modifiers: [],
1659
+ };
1660
+
1661
+ // const modifier = groupMod;
1662
+ // const relatedItems = [];
1663
+
1664
+ // const result = pricingService.item.hasModifier({
1665
+ // item,
1666
+ // modifier,
1667
+ // relatedItems,
1668
+ // });
1669
+
1670
+ const { updatedOrder } = pricingService.order.addItem({
1671
+ order,
1672
+ item: {
1673
+ ...relatedModItem,
1674
+ properties: {
1675
+ relatedItem: true,
1676
+ parentItemId: item.itemId,
1677
+ parentId: item._id,
1678
+ includeParent: true,
1679
+ relatedItemId: relatedModItem._id,
1680
+ },
1681
+ },
1682
+ });
1683
+
1684
+ expect(updatedOrder.items.length).toBe(2);
1685
+
1686
+ const result = pricingService.item.hasModifier({
1687
+ item: updatedOrder.items[1],
1688
+ modifier: groupMod,
1689
+ relatedItems: pricingService.order.getRelatedItems({
1690
+ order: updatedOrder,
1691
+ item: updatedOrder.items[1],
1692
+ }),
1693
+ });
1694
+
1695
+ expect(result).toBe(true);
1696
+ });
1626
1697
  });
@@ -199,4 +199,107 @@ describe('addItem function', () => {
199
199
  ); // Check second modifier
200
200
  expect(updatedOrder.items[0].modifiers).toHaveLength(2); // Added item should have modifiers
201
201
  });
202
+
203
+ test('Add Related Item', () => {
204
+ const { addItem } = pricingService.order;
205
+
206
+ const parentItem = {
207
+ _id: '1',
208
+ quantity: 1,
209
+ price: 100,
210
+ modifiers: [],
211
+ name: 'the parent item',
212
+ };
213
+
214
+ const { updatedOrder } = addItem({
215
+ order: { items: [] },
216
+ item: parentItem,
217
+ });
218
+
219
+ expect(updatedOrder.items).toHaveLength(1);
220
+ expect(updatedOrder.items[0]).toMatchObject({
221
+ name: 'the parent item',
222
+ });
223
+
224
+ const relatedItem = {
225
+ _id: 'related1',
226
+ name: 'the related item',
227
+ quantity: 1,
228
+ price: 100,
229
+ modifiers: [],
230
+ properties: {
231
+ relatedItem: true,
232
+ parentItemId: updatedOrder.items[0].itemId,
233
+ parentId: updatedOrder.items[0]._id,
234
+ includeParent: true,
235
+ addModifiers: [
236
+ {
237
+ _id: 'mod1',
238
+ name: 'General Repair Department',
239
+ attributes: ['group'],
240
+ },
241
+ ],
242
+ },
243
+ };
244
+
245
+ const { updatedOrder: updatedOrder2 } = addItem({
246
+ order: updatedOrder,
247
+ item: relatedItem,
248
+ });
249
+
250
+ expect(updatedOrder2.items).toHaveLength(2);
251
+ expect(updatedOrder2.items[0]).toMatchObject({
252
+ name: 'the related item',
253
+ });
254
+ expect(updatedOrder2.items[1]).toMatchObject({
255
+ name: 'the parent item',
256
+ modifiers: [
257
+ {
258
+ name: 'General Repair Department',
259
+ },
260
+ ],
261
+ });
262
+
263
+ const relatedItem2 = {
264
+ _id: 'related1',
265
+ name: 'the 2nd related item',
266
+ quantity: 1,
267
+ price: 100,
268
+ modifiers: [],
269
+ properties: {
270
+ relatedItem: true,
271
+ parentItemId: updatedOrder.items[0].itemId,
272
+ parentId: updatedOrder.items[0]._id,
273
+ includeParent: true,
274
+ addModifiers: [
275
+ {
276
+ _id: 'mod1',
277
+ name: 'General Repair Department',
278
+ attributes: ['group'],
279
+ },
280
+ ],
281
+ },
282
+ };
283
+
284
+ const { updatedOrder: updatedOrder3 } = addItem({
285
+ order: updatedOrder2,
286
+ item: relatedItem2,
287
+ });
288
+
289
+ expect(updatedOrder3.items).toHaveLength(3);
290
+ expect(updatedOrder3.items[0]).toMatchObject({
291
+ name: 'the 2nd related item',
292
+ });
293
+ expect(updatedOrder3.items[1]).toMatchObject({
294
+ name: 'the related item',
295
+ });
296
+ expect(updatedOrder3.items[2]).toMatchObject({
297
+ name: 'the parent item',
298
+ modifiers: [
299
+ {
300
+ name: 'General Repair Department',
301
+ },
302
+ ],
303
+ });
304
+ });
202
305
  });
@@ -0,0 +1,11 @@
1
+ module.exports = () =>
2
+ function getAddModifiers(item) {
3
+ if (
4
+ !item ||
5
+ !item.properties ||
6
+ !Array.isArray(item.properties.addModifiers)
7
+ )
8
+ return [];
9
+
10
+ return item.properties.addModifiers;
11
+ };
@@ -1,6 +1,6 @@
1
- module.exports = ({ modifierActions }) =>
2
- function getInvalidRequiredModifiers({ item }) {
3
- if (!item || !Array.isArray(item.modifiers)) return true;
1
+ module.exports = ({ modifierActions, actions }) =>
2
+ function getInvalidRequiredModifiers({ item, otherItems }) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
4
  const invalidModifiers = [];
5
5
 
6
6
  item.modifiers.forEach(modifier => {
@@ -14,7 +14,16 @@ module.exports = ({ modifierActions }) =>
14
14
  _id: itemModifier.modifierId || itemModifier._id,
15
15
  modifier,
16
16
  })
17
+ ) &&
18
+ Array.isArray(otherItems) &&
19
+ modifierActions.isGroupOfItems(modifier) &&
20
+ !modifier.properties.group.items.some(relatedItem =>
21
+ otherItems.some(
22
+ otherItem =>
23
+ actions.isRelatedItem(otherItem) &&
24
+ otherItem.itemId === relatedItem._id
17
25
  )
26
+ )
18
27
  ) {
19
28
  invalidModifiers.push(modifier);
20
29
  }
@@ -1,22 +1,12 @@
1
1
  module.exports = ({ modifierActions, settings }) =>
2
- function getModifierTags({
3
- item,
4
- includePaymentModifiers,
5
- skipGrouping = false,
6
- }) {
2
+ function getModifierTags({ item, skipGrouping = false }) {
7
3
  const groupModifiers =
8
4
  settings && settings.order && settings.order.groupModifiers;
9
5
 
10
6
  if (!item || !Array.isArray(item.modifiers)) return [];
11
7
 
12
8
  let modifierTags = item.modifiers
13
- .filter(
14
- each =>
15
- (modifierActions.isValid(each) ||
16
- (modifierActions.isPaymentModifier(each) &&
17
- includePaymentModifiers)) &&
18
- !modifierActions.isGroup(each)
19
- )
9
+ .filter(each => modifierActions.isValid(each))
20
10
  .map(modifier => {
21
11
  const { name, _id } = modifier;
22
12
 
@@ -0,0 +1,12 @@
1
+ module.exports = () =>
2
+ function getRelatedItems({ items, item, compareId = true }) {
3
+ if (!items || !item) return [];
4
+
5
+ return items
6
+ .filter(each => each.properties && each.properties.relatedItem)
7
+ .filter(
8
+ each =>
9
+ each.properties.parentItemId === item.itemId &&
10
+ (compareId ? each.properties.parentId === item._id : true)
11
+ );
12
+ };
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function hasAddModifiers(item) {
3
+ return (
4
+ !!item &&
5
+ !!item.properties &&
6
+ !!item.properties.addModifiers &&
7
+ !!item.properties.addModifiers.length
8
+ );
9
+ };
@@ -1,27 +1,38 @@
1
1
  module.exports = ({ modifierActions }) =>
2
- function hasModifier({ item, modifier }) {
2
+ function hasModifier({ item, modifier, relatedItems, originalModifier }) {
3
3
  if (!item || !modifier || !item.modifiers) return false;
4
4
 
5
+ console.log({ item, modifier, relatedItems });
6
+
7
+ const originalMod = originalModifier || modifier;
8
+
5
9
  if (modifierActions.isGroupOfModifiers(modifier)) {
6
10
  const relatedModifiers = modifier.properties.group.modifiers;
7
11
  return [
8
12
  modifierActions.removeGroupData({ modifier }),
9
13
  ...relatedModifiers,
10
14
  ].some(relatedModifier =>
11
- hasModifier({ item, modifier: relatedModifier })
15
+ hasModifier({
16
+ item,
17
+ modifier: relatedModifier,
18
+ relatedItems,
19
+ originalModifier: originalMod,
20
+ })
12
21
  );
13
22
  }
14
23
 
15
- const itemModifier = item.modifiers
16
- .filter(itemMod => !modifierActions.isGroupOfModifiers(itemMod))
17
- .find(
18
- each =>
19
- (each.modifierId &&
20
- (each.modifierId === modifier.modifierId ||
21
- each.modifierId === modifier._id)) ||
22
- (typeof each.modifier === 'object' &&
23
- each.modifier._id === modifier.modifierId)
24
+ const matchByModifier = item.modifiers.some(
25
+ each => !modifierActions.isGroup(each) && each.modifierId === modifier._id
26
+ );
27
+
28
+ const matchByRelatedItems =
29
+ !!relatedItems &&
30
+ modifierActions.isGroupOfItems(originalMod) &&
31
+ relatedItems.some(relatedItem =>
32
+ originalMod.properties.group.items.some(
33
+ modItem => modItem._id === relatedItem.properties.relatedItemId
34
+ )
24
35
  );
25
36
 
26
- return !!itemModifier;
37
+ return matchByModifier || matchByRelatedItems;
27
38
  };
@@ -1,8 +1,8 @@
1
1
  module.exports = ({ actions }) =>
2
- function hasModifiers({ item, modifiers }) {
2
+ function hasModifiers({ item, modifiers, relatedItems }) {
3
3
  if (!item || !modifiers || !item.modifiers) return false;
4
4
 
5
5
  return modifiers.some(each =>
6
- actions.hasModifier({ item, modifier: each })
6
+ actions.hasModifier({ item, modifier: each, relatedItems })
7
7
  );
8
8
  };
package/lib/item/index.js CHANGED
@@ -31,7 +31,6 @@ const getItemModifiers = require('./getItemModifiers');
31
31
  const getItemsBalance = require('./getItemsBalance');
32
32
  const isFullyPaid = require('./isFullyPaid');
33
33
  const getTotalPrice = require('./getTotalPrice');
34
- const removePaymentModifiers = require('./removePaymentModifiers');
35
34
  const getItems = require('./getItems');
36
35
  const getAmounts = require('./getAmounts');
37
36
  const hasPaymentMethodType = require('./hasPaymentMethodType');
@@ -48,6 +47,9 @@ const getBasePrice = require('./getBasePrice');
48
47
  const removeModifiersByQuantity = require('./removeModifiersByQuantity');
49
48
  const getModifiersBySingleValueId = require('./getModifiersBySingleValueId');
50
49
  const getLastLocation = require('./getLastLocation');
50
+ const hasAddModifiers = require('./hasAddModifiers');
51
+ const getAddModifiers = require('./getAddModifiers');
52
+ const getRelatedItems = require('./getRelatedItems');
51
53
 
52
54
  const itemActions = (deps = {}) => {
53
55
  const actions = {};
@@ -91,7 +93,6 @@ const itemActions = (deps = {}) => {
91
93
  getItemsBalance: getItemsBalance(innerDeps),
92
94
  isFullyPaid: isFullyPaid(innerDeps),
93
95
  getTotalPrice: getTotalPrice(innerDeps),
94
- removePaymentModifiers: removePaymentModifiers(innerDeps),
95
96
  getItems: getItems(innerDeps),
96
97
  getAmounts: getAmounts(innerDeps),
97
98
  hasPaymentMethodType: hasPaymentMethodType(innerDeps),
@@ -109,6 +110,9 @@ const itemActions = (deps = {}) => {
109
110
  removeModifiersByQuantity: removeModifiersByQuantity(innerDeps),
110
111
  getModifiersBySingleValueId: getModifiersBySingleValueId(innerDeps),
111
112
  getLastLocation: getLastLocation(innerDeps),
113
+ hasAddModifiers: hasAddModifiers(innerDeps),
114
+ getAddModifiers: getAddModifiers(innerDeps),
115
+ getRelatedItems: getRelatedItems(innerDeps),
112
116
  });
113
117
 
114
118
  Object.keys(freezedActions).forEach(actionName => {
@@ -1,36 +1,61 @@
1
1
  module.exports = ({ modifierActions, _, actions }) => {
2
2
  const isValid = (itemModifiers, modifier) =>
3
- !!modifierActions.findById(itemModifiers, modifier._id);
3
+ !!modifierActions.findById(itemModifiers, modifier._id) &&
4
+ (!modifier.required || !modifier._parentId);
4
5
 
5
- return function removeModifier({ item, modifier, customer, originalItem }) {
6
+ return function removeModifier({
7
+ item,
8
+ modifier,
9
+ customer,
10
+ originalItem,
11
+ order,
12
+ }) {
6
13
  const nextItem = _.cloneDeep(item);
7
14
  const itemModifiers = item.modifiers || [];
8
- let modifiersToApply = [];
9
15
 
10
16
  if (!isValid(itemModifiers, modifier)) return item;
11
17
 
12
- // Check for multiple and add them to menuModifiers
13
- if (modifierActions.hasAddModifiers(modifier)) {
14
- const relatedModifiers = modifierActions.getRelatedModifiers({
15
- modifier,
16
- });
17
- // Removing only those children who are selected
18
- const currentModifiersIds = itemModifiers.map(each => each.modifierId);
19
- modifiersToApply = relatedModifiers.filter(each =>
20
- currentModifiersIds.includes(each._id)
21
- );
22
- }
18
+ const addModifiers = modifierActions.getRelatedModifiers({
19
+ modifier,
20
+ });
21
+
22
+ console.log(item, '<=====', actions.getRelatedItems({ order, item }));
23
+
24
+ const modifiersToApply = [
25
+ modifier,
26
+ ...addModifiers.filter(
27
+ addMod =>
28
+ !addMod.required &&
29
+ (!order ||
30
+ !actions.hasModifier({
31
+ item: {
32
+ ...item,
33
+ modifiers: item.modifiers.filter(
34
+ mod => mod._id !== modifier._id
35
+ ),
36
+ },
37
+ modifier: addMod,
38
+ relatedItems: actions.getRelatedItems({
39
+ items: order.items,
40
+ item,
41
+ }),
42
+ originalModifier: addMod,
43
+ }))
44
+ ),
45
+ ];
23
46
 
24
- modifiersToApply.push(modifier);
25
47
  // Remove
26
48
  const nextModifiers = item.modifiers.filter(
27
49
  each =>
28
50
  !modifiersToApply.find(
29
- mod => each._parentId === mod._id || each._id === mod._id
51
+ mod =>
52
+ each._parentId === mod._id ||
53
+ each._id === mod._id ||
54
+ each.modifierId === mod._id
30
55
  )
31
56
  );
32
57
 
33
- const hasOverride = modifiersToApply.find(each =>
58
+ const hasOverride = nextModifiers.find(each =>
34
59
  modifierActions.isOverride(each)
35
60
  );
36
61
 
@@ -1,5 +1,5 @@
1
1
  module.exports = ({ actions }) =>
2
- function removeModifiers({ item, modifiers, originalItem, customer }) {
2
+ function removeModifiers({ item, modifiers, originalItem, customer, order }) {
3
3
  const newItem = modifiers.reduce(
4
4
  (nextItem, modifier) =>
5
5
  actions.removeModifier({
@@ -7,6 +7,7 @@ module.exports = ({ actions }) =>
7
7
  modifier,
8
8
  originalItem,
9
9
  customer,
10
+ order,
10
11
  }),
11
12
  item
12
13
  );
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function hasAddModifier({ modifier, addModifier }) {
3
+ return (
4
+ actions.hasAddModifiers(modifier) &&
5
+ !modifier.addModifiers.some(addMod => addMod._id !== addModifier._id)
6
+ );
7
+ };
@@ -141,6 +141,7 @@ const isQuantityMultiplier = require('./isQuantityMultiplier');
141
141
  const isCompute = require('./isCompute');
142
142
  const isFixedOverride = require('./isFixedOverride');
143
143
  const isLocked = require('./isLocked');
144
+ const hasAddModifier = require('./hasAddModifier');
144
145
 
145
146
  const modifierActions = (deps = {}) => {
146
147
  const actions = {};
@@ -295,6 +296,7 @@ const modifierActions = (deps = {}) => {
295
296
  isCompute: isCompute(innerDeps),
296
297
  isFixedOverride: isFixedOverride(innerDeps),
297
298
  isLocked: isLocked(innerDeps),
299
+ hasAddModifier: hasAddModifier(innerDeps),
298
300
  });
299
301
 
300
302
  Object.keys(freezedActions).forEach(actionName => {
@@ -169,7 +169,7 @@ module.exports = ({ actions, itemActions, modifierActions, settings, _ }) => {
169
169
  modifiersToAdd.push(...inheritedModifiers);
170
170
  // Remove parent if it is only a repair Item
171
171
  if (!itemActions.isParentIncluded(orderItem)) {
172
- order = actions.removeItem({ order, item: parent, hard: false });
172
+ order = actions.removeItem({ order, item: parent });
173
173
  }
174
174
  }
175
175
  }
@@ -249,6 +249,33 @@ module.exports = ({ actions, itemActions, modifierActions, settings, _ }) => {
249
249
  nextOrder.items.splice(idxToRemove, 1);
250
250
  }
251
251
 
252
+ if (itemActions.isRelatedItem(item) && itemActions.hasAddModifiers(item)) {
253
+ const parentItem = itemActions.getParentItem(nextOrder.items, item);
254
+ const parentIndex = actions.getItemIndex({
255
+ order: nextOrder,
256
+ item: parentItem,
257
+ });
258
+ const relatedModifiersToAdd = itemActions
259
+ .getAddModifiers(item)
260
+ .filter(
261
+ mod =>
262
+ !parentItem.modifiers.some(
263
+ itemMod => itemMod.modifierId === mod._id
264
+ )
265
+ );
266
+
267
+ nextOrder = relatedModifiersToAdd.reduce(
268
+ (acc, modifier) =>
269
+ actions.addItemModifier({
270
+ itemIndex: parentIndex,
271
+ order: acc,
272
+ modifier,
273
+ originalItem: parentItem,
274
+ }),
275
+ nextOrder
276
+ );
277
+ }
278
+
252
279
  return {
253
280
  updatedOrder: nextOrder,
254
281
  itemIndex: nextItemIndex,
@@ -0,0 +1,7 @@
1
+ module.exports = () =>
2
+ function getModifierRelations({ items, modifier }) {
3
+ if (!items || !Array.isArray(items) || !modifier)
4
+ return { items: [], modifier: [] };
5
+
6
+ return true;
7
+ };
@@ -1,6 +1,7 @@
1
1
  module.exports = () =>
2
2
  function getRelatedItems({ order, item, compareId = true }) {
3
3
  if (!order || !order.items || !item) return [];
4
+
4
5
  return order.items
5
6
  .filter(each => each.properties && each.properties.relatedItem)
6
7
  .filter(
@@ -32,9 +32,7 @@ const calculate = require('./calculate');
32
32
  const isParent = require('./isParent');
33
33
  const canSplit = require('./canSplit');
34
34
  const removeModifier = require('./removeModifier');
35
- const removeDiscountModifier = require('./removeDiscountModifier');
36
35
  const addModifier = require('./addModifier');
37
- const addDiscountModifier = require('./addDiscountModifier');
38
36
  const calculateDue = require('./calculateDue');
39
37
  const toggleModifier = require('./toggleModifier');
40
38
  const voidOrder = require('./void');
@@ -89,6 +87,7 @@ const manualSplitByQuantity = require('./manualSplitByQuantity');
89
87
  const applyPayment = require('./applyPayment');
90
88
  const getBalance = require('./getBalance');
91
89
  const getLastLocation = require('./getLastLocation');
90
+ const getModifierRelations = require('./getModifierRelations');
92
91
 
93
92
  const orderActions = (deps = {}) => {
94
93
  const actions = {};
@@ -132,9 +131,7 @@ const orderActions = (deps = {}) => {
132
131
  isParent: isParent(innerDeps),
133
132
  canSplit: canSplit(innerDeps),
134
133
  removeModifier: removeModifier(innerDeps),
135
- removeDiscountModifier: removeDiscountModifier(innerDeps),
136
134
  addModifier: addModifier(innerDeps),
137
- addDiscountModifier: addDiscountModifier(innerDeps),
138
135
  calculateDue: calculateDue(innerDeps),
139
136
  toggleModifier: toggleModifier(innerDeps),
140
137
  voidOrder: voidOrder(innerDeps),
@@ -189,6 +186,7 @@ const orderActions = (deps = {}) => {
189
186
  applyPayment: applyPayment(innerDeps),
190
187
  getOrdersBalance: getOrdersBalance(innerDeps),
191
188
  getLastLocation: getLastLocation(innerDeps),
189
+ getModifierRelations: getModifierRelations(innerDeps),
192
190
  });
193
191
 
194
192
  Object.keys(freezedActions).forEach(actionName => {