@darkpos/pricing 1.0.73 → 1.0.76

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.
@@ -0,0 +1,21 @@
1
+ const usePricing = require('../../index');
2
+ const mockStores = require('../mocks/stores');
3
+
4
+ const session = {
5
+ store: mockStores[0],
6
+ };
7
+
8
+ const pricingService = usePricing(session);
9
+
10
+ describe('Item actions - unpick item', () => {
11
+ test('unpick item', () => {
12
+ const orderItem = {
13
+ price: 30,
14
+ quantity: 2,
15
+ status: { picked: { value: true, date: new Date() } },
16
+ };
17
+
18
+ const newItem = pricingService.item.unpickItem(orderItem);
19
+ expect(newItem.status.picked).toStrictEqual({ value: false, date: '' });
20
+ });
21
+ });
@@ -1751,4 +1751,39 @@ describe('hasModifier Function', () => {
1751
1751
 
1752
1752
  expect(result2).toBe(true);
1753
1753
  });
1754
+
1755
+ test('hasModifier, matching by spreadFrom', () => {
1756
+ const groupMod = {
1757
+ _id: 'groupMod10',
1758
+ attributes: ['group'],
1759
+ properties: {
1760
+ group: {},
1761
+ },
1762
+ modifierId: 'abcd123',
1763
+ };
1764
+
1765
+ const spreadedManualModifier = {
1766
+ _id: 'abc',
1767
+ name: 'related item abc',
1768
+ itemId: 'abc',
1769
+ properties: {
1770
+ spreadFrom: groupMod.modifierId,
1771
+ },
1772
+ };
1773
+
1774
+ const item = {
1775
+ _id: 1,
1776
+ itemId: 'ab',
1777
+ modifiers: [groupMod, spreadedManualModifier],
1778
+ price: 500,
1779
+ total: 10000,
1780
+ };
1781
+
1782
+ const result = pricingService.item.hasModifier({
1783
+ item,
1784
+ modifier: groupMod,
1785
+ });
1786
+
1787
+ expect(result).toBe(true);
1788
+ });
1754
1789
  });
@@ -680,4 +680,197 @@ describe('Modifier actions', () => {
680
680
  })
681
681
  );
682
682
  });
683
+
684
+ describe('getManualModifiers', () => {
685
+ it('should generate manual modifiers correctly for dry cleaning tags', () => {
686
+ const modifier = {
687
+ _id: 'abc123',
688
+ name: 'Base Modifier',
689
+ group: 'colorGroup1',
690
+ properties: {
691
+ group: {
692
+ manualModifiers: 'Red Tag, White Shirt, White Shirt , Blue Label',
693
+ },
694
+ },
695
+ };
696
+
697
+ const relatedModifiers = [{ name: 'White Shirt' }];
698
+
699
+ const result = pricingService.modifier.getManualModifiers({
700
+ modifier,
701
+ relatedModifiers,
702
+ });
703
+
704
+ expect(result).toHaveLength(2);
705
+ expect(result).toEqual(
706
+ expect.arrayContaining([
707
+ expect.objectContaining({
708
+ name: 'Red Tag',
709
+ direct: true,
710
+ group: 'colorGroup1',
711
+ properties: {
712
+ isManual: true,
713
+ },
714
+ _id: 'ead6eb247a93bca8f802f9b2',
715
+ }),
716
+ expect.objectContaining({
717
+ name: 'Blue Label',
718
+ direct: true,
719
+ group: 'colorGroup1',
720
+ properties: {
721
+ isManual: true,
722
+ },
723
+ _id: '4e23edf8fa734884f4618003',
724
+ }),
725
+ ])
726
+ );
727
+ });
728
+
729
+ it('should return an empty array if no manual modifiers are present', () => {
730
+ const modifier = {
731
+ _id: 'xyz789',
732
+ properties: {
733
+ group: {
734
+ manualModifiers: '',
735
+ },
736
+ },
737
+ };
738
+
739
+ const result = pricingService.modifier.getManualModifiers({
740
+ modifier,
741
+ relatedModifiers: [],
742
+ });
743
+ expect(result).toEqual([]);
744
+ });
745
+
746
+ it('should return an empty array if required fields are missing', () => {
747
+ expect(
748
+ pricingService.modifier.getManualModifiers({ modifier: null })
749
+ ).toEqual([]);
750
+ expect(
751
+ pricingService.modifier.getManualModifiers({ modifier: {} })
752
+ ).toEqual([]);
753
+ });
754
+ });
755
+
756
+ describe('spreadSingleGroupModifiers', () => {
757
+ it('should spread the modifiers from a group, including its manual modifiers', () => {
758
+ const modifier = {
759
+ _id: 'abc123',
760
+ name: 'Base Modifier',
761
+ group: 'colorGroup1',
762
+ attributes: ['group'],
763
+ properties: {
764
+ group: {
765
+ manualModifiers: 'Red Tag, White Shirt, White Shirt , Blue Label',
766
+ },
767
+ },
768
+ };
769
+
770
+ const result = pricingService.modifier.spreadSingleGroupModifiers([
771
+ modifier,
772
+ ]);
773
+
774
+ expect(result).toStrictEqual([
775
+ {
776
+ name: 'Red Tag',
777
+ _id: 'ead6eb247a93bca8f802f9b2',
778
+ direct: true,
779
+ group: 'colorGroup1',
780
+ properties: { isManual: true, spreadFrom: 'abc123' },
781
+ },
782
+ {
783
+ name: 'White Shirt',
784
+ _id: '4e23edf8fa734884f4618003',
785
+ direct: true,
786
+ group: 'colorGroup1',
787
+ properties: { isManual: true, spreadFrom: 'abc123' },
788
+ },
789
+ {
790
+ name: 'Blue Label',
791
+ _id: '94b02ee7ba009b09a913a786',
792
+ direct: true,
793
+ group: 'colorGroup1',
794
+ properties: { isManual: true, spreadFrom: 'abc123' },
795
+ },
796
+ ]);
797
+ });
798
+
799
+ it('should not spread the modifiers from a group, as there are other modifiers with the same group', () => {
800
+ const modifier = {
801
+ _id: 'abc123',
802
+ name: 'Base Modifier',
803
+ group: 'colorGroup1',
804
+ attributes: ['group'],
805
+ properties: {
806
+ group: {
807
+ manualModifiers: 'Red Tag, White Shirt, White Shirt , Blue Label',
808
+ },
809
+ },
810
+ };
811
+
812
+ const otherModifier = {
813
+ _id: 'bcd123',
814
+ name: 'other Modifier',
815
+ group: 'colorGroup1',
816
+ };
817
+
818
+ const result = pricingService.modifier.spreadSingleGroupModifiers([
819
+ modifier,
820
+ otherModifier,
821
+ ]);
822
+
823
+ expect(result).toStrictEqual([modifier, otherModifier]);
824
+ });
825
+
826
+ it('should spread the modifiers from a group, as there are no other modifiers with the same group', () => {
827
+ const modifier = {
828
+ _id: 'abc123',
829
+ name: 'Base Modifier',
830
+ group: 'colorGroup1',
831
+ attributes: ['group'],
832
+ properties: {
833
+ group: {
834
+ manualModifiers: 'Red Tag, White Shirt, White Shirt , Blue Label',
835
+ },
836
+ },
837
+ };
838
+
839
+ const otherModifier = {
840
+ _id: 'bcd123',
841
+ name: 'other Modifier',
842
+ group: 'Repair',
843
+ };
844
+
845
+ const result = pricingService.modifier.spreadSingleGroupModifiers([
846
+ modifier,
847
+ otherModifier,
848
+ ]);
849
+
850
+ expect(result).toStrictEqual([
851
+ {
852
+ name: 'Red Tag',
853
+ _id: 'ead6eb247a93bca8f802f9b2',
854
+ direct: true,
855
+ group: 'colorGroup1',
856
+ properties: { isManual: true, spreadFrom: 'abc123' },
857
+ },
858
+ {
859
+ name: 'White Shirt',
860
+ _id: '4e23edf8fa734884f4618003',
861
+ direct: true,
862
+ group: 'colorGroup1',
863
+ properties: { isManual: true, spreadFrom: 'abc123' },
864
+ },
865
+ {
866
+ name: 'Blue Label',
867
+ _id: '94b02ee7ba009b09a913a786',
868
+ direct: true,
869
+ group: 'colorGroup1',
870
+ properties: { isManual: true, spreadFrom: 'abc123' },
871
+ },
872
+ { _id: 'bcd123', name: 'other Modifier', group: 'Repair' },
873
+ ]);
874
+ });
875
+ });
683
876
  });
@@ -0,0 +1,97 @@
1
+ const usePricing = require('../../index');
2
+ const mockStores = require('../mocks/stores');
3
+
4
+ const session = {
5
+ store: mockStores[0],
6
+ };
7
+
8
+ const pricingService = usePricing(session);
9
+
10
+ describe('Order actions - unpick order', () => {
11
+ test('unpick items in parent order', () => {
12
+ const orderItem = {
13
+ price: 30,
14
+ quantity: 2,
15
+ status: { picked: { value: true, date: new Date() } },
16
+ };
17
+ const order = { items: [orderItem], status: { fullyPicked: true } };
18
+ const newOrder = pricingService.order.unpickOrder(order);
19
+ expect(newOrder.status.fullyPicked).toBe(false);
20
+ newOrder.items.map(item =>
21
+ expect(item.status.picked).toStrictEqual({ value: false, date: '' })
22
+ );
23
+ });
24
+ test('unpick 10 items in parent order', () => {
25
+ const orderItem = {
26
+ price: 30,
27
+ quantity: 2,
28
+ status: { picked: { value: true, date: new Date() } },
29
+ };
30
+ const order = {
31
+ status: { fullyPicked: true },
32
+ items: [
33
+ orderItem,
34
+ orderItem,
35
+ orderItem,
36
+ orderItem,
37
+ orderItem,
38
+ orderItem,
39
+ orderItem,
40
+ orderItem,
41
+ orderItem,
42
+ orderItem,
43
+ ],
44
+ };
45
+ const newOrder = pricingService.order.unpickOrder(order);
46
+ expect(newOrder.status.fullyPicked).toBe(false);
47
+ newOrder.items.map(item =>
48
+ expect(item.status.picked).toStrictEqual({ value: false, date: '' })
49
+ );
50
+ });
51
+ test('unpick items in parent order with items that are not picked', () => {
52
+ const orderItem = {
53
+ price: 30,
54
+ quantity: 2,
55
+ status: { picked: { value: true, date: new Date() } },
56
+ };
57
+ const orderItemNotPicked = {
58
+ price: 30,
59
+ quantity: 2,
60
+ status: { picked: { value: false, date: '' } },
61
+ };
62
+ const order = {
63
+ items: [orderItem, orderItemNotPicked],
64
+ status: { fullyPicked: true },
65
+ };
66
+ const newOrder = pricingService.order.unpickOrder(order);
67
+ expect(newOrder.status.fullyPicked).toBe(false);
68
+ newOrder.items.map(item =>
69
+ expect(item.status.picked).toStrictEqual({ value: false, date: '' })
70
+ );
71
+ });
72
+
73
+ test('unpick items in parent order with items and suborder with items picked', () => {
74
+ const orderItem = {
75
+ price: 30,
76
+ quantity: 2,
77
+ status: { picked: { value: true, date: new Date() } },
78
+ };
79
+
80
+ const subOrder = { items: [orderItem], status: { fullyPicked: true } };
81
+ const order = {
82
+ items: [orderItem],
83
+ orders: [subOrder],
84
+ status: { fullyPicked: true },
85
+ };
86
+ const newOrder = pricingService.order.unpickOrder(order);
87
+ newOrder.items.map(item =>
88
+ expect(item.status.picked).toStrictEqual({ value: false, date: '' })
89
+ );
90
+ newOrder.orders.map(_order => {
91
+ expect(_order.status.fullyPicked).toBe(false);
92
+ return _order.items.map(item =>
93
+ expect(item.status.picked).toStrictEqual({ value: false, date: '' })
94
+ );
95
+ });
96
+ });
97
+ });
package/lib/index.js CHANGED
@@ -2,6 +2,8 @@ const utils = require('@darkpos/utils');
2
2
  const _ = require('lodash');
3
3
  const moment = require('moment-timezone');
4
4
  /** services */
5
+ const sha256 = require('crypto-js/sha256');
6
+
5
7
  const makeStoreActions = require('./store');
6
8
  const makeItemActions = require('./item');
7
9
  const makeOrderActions = require('./order');
@@ -18,6 +20,7 @@ module.exports = session => {
18
20
  utils,
19
21
  localization,
20
22
  _,
23
+ sha256,
21
24
  moment,
22
25
  constants,
23
26
  };
@@ -3,7 +3,7 @@ module.exports = ({ modifierActions }) =>
3
3
  if (!item || !Array.isArray(item.modifiers)) return [];
4
4
  return item.modifiers.filter(
5
5
  modifier =>
6
- modifierActions.isGroupOfModifiers(modifier) &&
6
+ modifierActions.isGroup(modifier) &&
7
7
  modifierActions.isRequired(modifier) &&
8
8
  modifierActions.enableAutoPopup(modifier)
9
9
  );
@@ -0,0 +1,14 @@
1
+ module.exports = ({ modifierActions }) =>
2
+ function getRelatedModifiers({ item }) {
3
+ if (!item || !Array.isArray(item.modifiers)) return [];
4
+
5
+ const relatedModifiers = [];
6
+
7
+ item.modifiers.forEach(itemMod => {
8
+ if (modifierActions.isRelatedModifier(itemMod)) {
9
+ relatedModifiers.push(itemMod);
10
+ }
11
+ });
12
+
13
+ return relatedModifiers;
14
+ };
@@ -2,29 +2,35 @@ module.exports = ({ modifierActions }) =>
2
2
  function hasModifier({ item, modifier, relatedItems }) {
3
3
  if (!item || !modifier || !item.modifiers) return false;
4
4
 
5
- const isGroupPath = groupPath =>
6
- groupPath &&
7
- (groupPath.includes(modifier.modifierId) ||
8
- groupPath.includes(modifier._id));
9
-
10
5
  if (modifierActions.isGroup(modifier)) {
11
6
  const matchByRelatedModifier = item.modifiers.some(itemMod => {
12
7
  if (
13
8
  modifierActions.isGroup(itemMod) ||
14
9
  !itemMod.properties ||
15
- !itemMod.properties.groupPath
10
+ (!itemMod.properties.groupPath && !itemMod.properties.spreadFrom)
16
11
  )
17
12
  return false;
18
- return isGroupPath(itemMod.properties.groupPath);
13
+ return (
14
+ modifierActions.isGroupPath({
15
+ groupPath: itemMod.properties.groupPath,
16
+ modifier,
17
+ }) ||
18
+ modifierActions.isSpreadFrom({
19
+ spreadFromId: itemMod.properties.spreadFrom,
20
+ modifier,
21
+ })
22
+ );
19
23
  });
20
24
 
21
25
  const matchByRelatedItems =
22
26
  !!relatedItems &&
23
27
  modifierActions.isGroup(modifier) &&
24
28
  relatedItems.some(relatedItem =>
25
- isGroupPath(
26
- relatedItem.properties && relatedItem.properties.groupPath
27
- )
29
+ modifierActions.isGroupPath({
30
+ groupPath:
31
+ relatedItem.properties && relatedItem.properties.groupPath,
32
+ modifier,
33
+ })
28
34
  );
29
35
 
30
36
  return matchByRelatedModifier || matchByRelatedItems;
package/lib/item/index.js CHANGED
@@ -50,6 +50,8 @@ const getLastLocation = require('./getLastLocation');
50
50
  const hasAddModifiers = require('./hasAddModifiers');
51
51
  const getAddModifiers = require('./getAddModifiers');
52
52
  const getRelatedItems = require('./getRelatedItems');
53
+ const getRelatedModifiers = require('./getRelatedModifiers');
54
+ const unpickItem = require('./unpick');
53
55
 
54
56
  const itemActions = (deps = {}) => {
55
57
  const actions = {};
@@ -113,6 +115,8 @@ const itemActions = (deps = {}) => {
113
115
  hasAddModifiers: hasAddModifiers(innerDeps),
114
116
  getAddModifiers: getAddModifiers(innerDeps),
115
117
  getRelatedItems: getRelatedItems(innerDeps),
118
+ getRelatedModifiers: getRelatedModifiers(innerDeps),
119
+ unpickItem: unpickItem(innerDeps),
116
120
  });
117
121
 
118
122
  Object.keys(freezedActions).forEach(actionName => {
@@ -15,7 +15,7 @@ module.exports = ({ modifierActions, _, actions }) => {
15
15
 
16
16
  if (!isValid(itemModifiers, modifier)) return item;
17
17
 
18
- const addModifiers = modifierActions.getRelatedModifiers({
18
+ const addModifiers = modifierActions.getAddModifiers({
19
19
  modifier,
20
20
  });
21
21
 
@@ -0,0 +1,15 @@
1
+ module.exports = () =>
2
+ function unpickItem(item) {
3
+ if (!item) return item;
4
+ const nextItem = { ...item };
5
+ if (nextItem.status) {
6
+ nextItem.status = {
7
+ ...nextItem.status,
8
+ picked: {
9
+ value: false,
10
+ date: '',
11
+ },
12
+ };
13
+ }
14
+ return nextItem;
15
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = () =>
2
+ function getAddModifiers({ modifier }) {
3
+ if (!modifier || !modifier.addModifiers) return [];
4
+
5
+ return modifier.addModifiers;
6
+ };
@@ -11,7 +11,7 @@ module.exports = ({ actions }) =>
11
11
 
12
12
  const relatedModifiers = enabledModifiers
13
13
  .map(each =>
14
- actions.getRelatedModifiers({
14
+ actions.getAddModifiers({
15
15
  modifier: each,
16
16
  })
17
17
  )
@@ -0,0 +1,64 @@
1
+ module.exports = ({ sha256 }) => {
2
+ const csvToArray = input =>
3
+ input
4
+ .split(',')
5
+ .map(item => item.trim())
6
+ .filter(item => item !== '');
7
+
8
+ const cleanCSV = input => {
9
+ if (!input) return '';
10
+ return Array.from(
11
+ new Set(
12
+ input
13
+ .split(',')
14
+ .map(item => item.trim())
15
+ .filter(item => item !== '')
16
+ )
17
+ ).join(',');
18
+ };
19
+
20
+ return function getManualModifiers({ modifier, relatedModifiers }) {
21
+ if (
22
+ !modifier ||
23
+ !modifier.properties ||
24
+ !modifier.properties.group ||
25
+ !modifier.properties.group.manualModifiers
26
+ )
27
+ return [];
28
+
29
+ const otherModifiers = Array.isArray(relatedModifiers)
30
+ ? relatedModifiers
31
+ : [];
32
+
33
+ const manualModifiersCsv = modifier.properties.group.manualModifiers;
34
+ const modifiers = [];
35
+
36
+ if (manualModifiersCsv) {
37
+ const manualModifiersNames = csvToArray(
38
+ cleanCSV(manualModifiersCsv)
39
+ ).filter(modName => otherModifiers.every(mod => mod.name !== modName));
40
+
41
+ modifiers.push(
42
+ ...manualModifiersNames.map((each, index) => {
43
+ const hash = sha256(`${index}-${modifier._id}`).toString();
44
+
45
+ const _id = hash.substring(0, 24);
46
+
47
+ const manualModifier = {
48
+ name: each,
49
+ _id,
50
+ direct: true,
51
+ group: modifier.group,
52
+ properties: {
53
+ isManual: true,
54
+ },
55
+ };
56
+
57
+ return manualModifier;
58
+ })
59
+ );
60
+ }
61
+
62
+ return modifiers;
63
+ };
64
+ };
@@ -1,8 +1,28 @@
1
- module.exports = () =>
2
- function getRelatedModifiers({ modifier }) {
3
- if (!modifier || !modifier.addModifiers) return [];
1
+ module.exports = ({ actions }) =>
2
+ function getRelatedModifiers({ groupModifier, modifiers }) {
3
+ if (!actions.isGroup(groupModifier) || !Array.isArray(modifiers)) return [];
4
4
 
5
- const relatedModifiers = modifier.addModifiers;
5
+ const relatedModifiers = [];
6
+
7
+ const otherModifiers = modifiers.filter(
8
+ mod =>
9
+ !actions.isGroup(mod) && mod._id !== groupModifier._id && mod.properties
10
+ );
11
+
12
+ otherModifiers.forEach(mod => {
13
+ if (
14
+ actions.isGroupPath({
15
+ groupPath: mod.properties.groupPath,
16
+ modifier: groupModifier,
17
+ }) ||
18
+ actions.isSpreadFrom({
19
+ spreadFromId: mod.properties.spreadFrom,
20
+ modifier: groupModifier,
21
+ })
22
+ ) {
23
+ relatedModifiers.push(mod);
24
+ }
25
+ });
6
26
 
7
27
  return relatedModifiers;
8
28
  };
@@ -43,7 +43,7 @@ const getPreferences = require('./getPreferences');
43
43
  const getPromotionModifiers = require('./getPromotionModifiers');
44
44
  const getPromptMessage = require('./getPromptMessage');
45
45
  const getProperty = require('./getProperty');
46
- const getRelatedModifiers = require('./getRelatedModifiers');
46
+ const getAddModifiers = require('./getAddModifiers');
47
47
  const getRecommendedModifiers = require('./getRecommendedModifiers');
48
48
  const getRequiredModifiers = require('./getRequiredModifiers');
49
49
  const getSubscriptionItem = require('./getSubscriptionItem');
@@ -114,7 +114,7 @@ const isFixedDiscount = require('./isFixedDiscount');
114
114
  const removeLocked = require('./removeLocked');
115
115
  const hasItems = require('./hasItems');
116
116
  const removeGroupData = require('./removeGroupData');
117
- const isRelatedModifier = require('./isRelatedModifier');
117
+ const isRelatedModifierById = require('./isRelatedModifierById');
118
118
  const getGroupedModifiers = require('./getGroupedModifiers');
119
119
  const isOptionsOverride = require('./isOptionsOverride');
120
120
  const getGroupedModifierLabels = require('./getGroupedModifierLabels');
@@ -143,6 +143,13 @@ const isFixedOverride = require('./isFixedOverride');
143
143
  const isLocked = require('./isLocked');
144
144
  const hasAddModifier = require('./hasAddModifier');
145
145
  const removeGroupRelations = require('./removeGroupRelations');
146
+ const getManualModifiers = require('./getManualModifiers');
147
+ const shouldSpreadModifier = require('./shouldSpreadModifier');
148
+ const spreadSingleGroupModifiers = require('./spreadSingleGroupModifiers');
149
+ const isGroupPath = require('./isGroupPath');
150
+ const isSpreadFrom = require('./isSpreadFrom');
151
+ const getRelatedModifiers = require('./getRelatedModifiers');
152
+ const isRelatedModifier = require('./isRelatedModifier');
146
153
 
147
154
  const modifierActions = (deps = {}) => {
148
155
  const actions = {};
@@ -198,7 +205,7 @@ const modifierActions = (deps = {}) => {
198
205
  getPromotionModifiers: getPromotionModifiers(innerDeps),
199
206
  getPromptMessage: getPromptMessage(innerDeps),
200
207
  getProperty: getProperty(innerDeps),
201
- getRelatedModifiers: getRelatedModifiers(innerDeps),
208
+ getAddModifiers: getAddModifiers(innerDeps),
202
209
  getRecommendedModifiers: getRecommendedModifiers(innerDeps),
203
210
  getRequiredModifiers: getRequiredModifiers(innerDeps),
204
211
  getSubscriptionItem: getSubscriptionItem(innerDeps),
@@ -268,7 +275,7 @@ const modifierActions = (deps = {}) => {
268
275
  isAdd: isAdd(innerDeps),
269
276
  mutateModifier: mutateModifier(innerDeps),
270
277
  removeGroupData: removeGroupData(innerDeps),
271
- isRelatedModifier: isRelatedModifier(innerDeps),
278
+ isRelatedModifierById: isRelatedModifierById(innerDeps),
272
279
  getGroupedModifiers: getGroupedModifiers(innerDeps),
273
280
  isOptionsOverride: isOptionsOverride(innerDeps),
274
281
  getGroupedModifierLabels: getGroupedModifierLabels(innerDeps),
@@ -299,6 +306,13 @@ const modifierActions = (deps = {}) => {
299
306
  isLocked: isLocked(innerDeps),
300
307
  hasAddModifier: hasAddModifier(innerDeps),
301
308
  removeGroupRelations: removeGroupRelations(innerDeps),
309
+ getManualModifiers: getManualModifiers(innerDeps),
310
+ shouldSpreadModifier: shouldSpreadModifier(innerDeps),
311
+ spreadSingleGroupModifiers: spreadSingleGroupModifiers(innerDeps),
312
+ isGroupPath: isGroupPath(innerDeps),
313
+ isSpreadFrom: isSpreadFrom(innerDeps),
314
+ getRelatedModifiers: getRelatedModifiers(innerDeps),
315
+ isRelatedModifier: isRelatedModifier(innerDeps),
302
316
  });
303
317
 
304
318
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,8 @@
1
+ module.exports = () =>
2
+ function isGroupPath({ groupPath, modifier }) {
3
+ return (
4
+ groupPath &&
5
+ (groupPath.includes(modifier.modifierId) ||
6
+ groupPath.includes(modifier._id))
7
+ );
8
+ };
@@ -1,13 +1,5 @@
1
- module.exports = ({ actions }) =>
2
- function isRelatedModifier({ _id, modifier }) {
3
- if (!modifier || !_id) return false;
4
-
5
- if (actions.isGroupOfModifiers(modifier)) {
6
- const relatedModifiers = modifier.properties.group.modifiers;
7
- return [actions.removeGroupData({ modifier }), ...relatedModifiers].some(
8
- relatedModifier => isRelatedModifier({ _id, modifier: relatedModifier })
9
- );
10
- }
11
-
12
- return modifier._id === _id || modifier.modifierId === _id;
1
+ module.exports = () =>
2
+ function isRelatedModifier(modifier) {
3
+ if (!modifier || !modifier.properties) return false;
4
+ return !!modifier.properties.groupPath || modifier.properties.spreadFrom;
13
5
  };
@@ -0,0 +1,14 @@
1
+ module.exports = ({ actions }) =>
2
+ function isRelatedModifierById({ _id, modifier }) {
3
+ if (!modifier || !_id) return false;
4
+
5
+ if (actions.isGroupOfModifiers(modifier)) {
6
+ const relatedModifiers = modifier.properties.group.modifiers;
7
+ return [actions.removeGroupData({ modifier }), ...relatedModifiers].some(
8
+ relatedModifier =>
9
+ isRelatedModifierById({ _id, modifier: relatedModifier })
10
+ );
11
+ }
12
+
13
+ return modifier._id === _id || modifier.modifierId === _id;
14
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = () =>
2
+ function isSpreadFrom({ spreadFromId, modifier }) {
3
+ return (
4
+ spreadFromId &&
5
+ (spreadFromId === modifier.modifierId || spreadFromId === modifier._id)
6
+ );
7
+ };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ actions }) =>
2
+ function shouldSpreadModifier(modifier, all) {
3
+ return (
4
+ actions.isGroupOfModifiers(modifier) &&
5
+ !actions.enableAutoPopup(modifier) &&
6
+ !actions.isGroupOfItems(modifier) &&
7
+ modifier.group &&
8
+ !all.some(m => m._id !== modifier._id && m.group === modifier.group)
9
+ );
10
+ };
@@ -0,0 +1,30 @@
1
+ module.exports = ({ actions }) =>
2
+ function spreadSingleGroupModifiers(modifiersParam) {
3
+ const result = [];
4
+
5
+ if (!Array.isArray(modifiersParam)) return [];
6
+
7
+ modifiersParam.forEach(modifier => {
8
+ if (actions.shouldSpreadModifier(modifier, modifiersParam)) {
9
+ const relatedModifiers = actions.getGroupRelatedModifiers({
10
+ modifier,
11
+ });
12
+ const manual = actions.getManualModifiers({
13
+ modifier,
14
+ relatedModifiers,
15
+ });
16
+
17
+ const nextModifiers = [...relatedModifiers, ...manual].map(mod => ({
18
+ ...mod,
19
+ properties: {
20
+ ...(mod.properties || {}),
21
+ spreadFrom: modifier._id,
22
+ },
23
+ }));
24
+ result.push(...nextModifiers);
25
+ } else {
26
+ result.push(modifier);
27
+ }
28
+ });
29
+ return result;
30
+ };
@@ -249,7 +249,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
249
249
  // Recursive Rules:
250
250
  if (modifierActions.hasAddModifiers(modifier)) {
251
251
  const relatedModifiers = modifierActions
252
- .getRelatedModifiers({ modifier })
252
+ .getAddModifiers({ modifier })
253
253
  .filter(each => !modifierActions.contains(item.modifiers, each));
254
254
 
255
255
  item = relatedModifiers.reduce(
@@ -38,6 +38,7 @@ const toggleModifier = require('./toggleModifier');
38
38
  const voidOrder = require('./void');
39
39
  const holdOrder = require('./hold');
40
40
  const openOrder = require('./open');
41
+ const unpickOrder = require('./unpick');
41
42
  const isDetailed = require('./isDetailed');
42
43
  const splitByDepartments = require('./splitByDepartments');
43
44
  const autoSplit = require('./autoSplit');
@@ -138,6 +139,7 @@ const orderActions = (deps = {}) => {
138
139
  voidOrder: voidOrder(innerDeps),
139
140
  holdOrder: holdOrder(innerDeps),
140
141
  openOrder: openOrder(innerDeps),
142
+ unpickOrder: unpickOrder(innerDeps),
141
143
  isDetailed: isDetailed(innerDeps),
142
144
  splitByDepartments: splitByDepartments(innerDeps),
143
145
  autoSplit: autoSplit(innerDeps),
@@ -0,0 +1,28 @@
1
+ module.exports = ({ itemActions }) =>
2
+ function unpickOrder(order) {
3
+ if (!order) return order;
4
+ const nextOrder = { ...order };
5
+ if (order.items.length > 0) {
6
+ const orderItems = [...(order.items || [])].map(item =>
7
+ itemActions.unpickItem(item)
8
+ );
9
+ if (nextOrder.status && nextOrder.status.fullyPicked) {
10
+ nextOrder.status.fullyPicked = false;
11
+ }
12
+ nextOrder.items = orderItems;
13
+ }
14
+ if (order.orders && order.orders.length > 0) {
15
+ const suborderWithItems = order.orders.map(_order => {
16
+ const nextsubOrder = {
17
+ ..._order,
18
+ items: _order.items.map(item => itemActions.unpickItem(item)),
19
+ };
20
+ if (nextsubOrder.status && nextsubOrder.status.fullyPicked) {
21
+ nextsubOrder.status.fullyPicked = false;
22
+ }
23
+ return nextsubOrder;
24
+ });
25
+ nextOrder.orders = suborderWithItems;
26
+ }
27
+ return nextOrder;
28
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.73",
3
+ "version": "1.0.76",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -34,6 +34,7 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@darkpos/utils": "^1.0.11",
37
+ "crypto-js": "^4.2.0",
37
38
  "lodash": "^4.17.21",
38
39
  "moment-timezone": "^0.5.34"
39
40
  },
@@ -50,5 +51,5 @@
50
51
  "supertest": "^6.2.3",
51
52
  "supervisor": "^0.12.0"
52
53
  },
53
- "gitHead": "276e28f676960107d60027bc70e22f698e6e124e"
54
+ "gitHead": "195250ff6ff1f2b38a7c47003006b8d2dcb2048b"
54
55
  }