@darkpos/pricing 1.0.67 → 1.0.69

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.
@@ -356,11 +356,12 @@ describe('getModifierTags Function', () => {
356
356
 
357
357
  const result = pricingServiceGroupModifiers.item.getModifierTags({ item });
358
358
 
359
- expect(result).toHaveLength(2);
360
- expect(result[0].label.replace(/\s/g, '')).toEqual(
359
+ expect(result).toHaveLength(3);
360
+ expect(result[0].label.replace(/\s/g, '')).toEqual('1White');
361
+ expect(result[1].label.replace(/\s/g, '')).toEqual(
361
362
  '1CRC5.10discount(-CRC5.10)'
362
363
  );
363
- expect(result[1].label.replace(/\s/g, '')).toEqual(
364
+ expect(result[2].label.replace(/\s/g, '')).toEqual(
364
365
  '1CRC37.50discount(-CRC37.50)'
365
366
  );
366
367
  });
@@ -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('Item actions', () => {
6
11
  test('Get calculated Item: included: false && direct: false', () => {
@@ -856,4 +861,448 @@ describe('Item actions', () => {
856
861
  _actual: 135,
857
862
  });
858
863
  });
864
+
865
+ test('Remove Item', () => {
866
+ const item1 = {
867
+ _id: '1',
868
+ };
869
+ const item2 = {
870
+ _id: '2',
871
+ };
872
+
873
+ const order = {
874
+ items: [item1, item2],
875
+ };
876
+ const result = pricingService.order.removeItem({ order, item: item2 });
877
+
878
+ expect(result.items).toMatchObject([{ _id: '1' }]);
879
+ });
880
+
881
+ test('Remove related Item', () => {
882
+ const item1 = {
883
+ _id: '1',
884
+ itemId: 'a',
885
+ };
886
+ const item2 = {
887
+ _id: '2',
888
+ };
889
+ const item3 = {
890
+ _id: '3',
891
+ properties: {
892
+ relatedItem: true,
893
+ parentId: item1._id,
894
+ parentItemId: item1.itemId,
895
+ },
896
+ };
897
+
898
+ const order = {
899
+ items: [item1, item2, item3],
900
+ };
901
+ const result = pricingService.order.removeItem({ order, item: item3 });
902
+
903
+ expect(result.items).toMatchObject([
904
+ {
905
+ _id: '1',
906
+ },
907
+ {
908
+ _id: '2',
909
+ },
910
+ ]);
911
+ });
912
+
913
+ test('Remove parent Item having 1 related item', () => {
914
+ const item1 = {
915
+ _id: '1',
916
+ itemId: 'a',
917
+ };
918
+ const item2 = {
919
+ _id: '2',
920
+ };
921
+ const item3 = {
922
+ _id: '3',
923
+ properties: {
924
+ relatedItem: true,
925
+ parentId: item1._id,
926
+ parentItemId: item1.itemId,
927
+ },
928
+ };
929
+
930
+ const order = {
931
+ items: [item1, item2, item3],
932
+ };
933
+ const result = pricingService.order.removeItem({ order, item: item1 });
934
+
935
+ expect(result.items).toMatchObject([
936
+ {
937
+ _id: '2',
938
+ },
939
+ ]);
940
+ });
941
+
942
+ test('Remove parent Item, having more than 1 related item', () => {
943
+ const item1 = {
944
+ _id: '1',
945
+ itemId: 'a',
946
+ };
947
+ const item2 = {
948
+ _id: '2',
949
+ };
950
+ const item3 = {
951
+ _id: '3',
952
+ properties: {
953
+ relatedItem: true,
954
+ parentId: item1._id,
955
+ parentItemId: item1.itemId,
956
+ },
957
+ };
958
+ const item4 = {
959
+ _id: '4',
960
+ properties: {
961
+ relatedItem: true,
962
+ parentId: item1._id,
963
+ parentItemId: item1.itemId,
964
+ },
965
+ };
966
+
967
+ const order = {
968
+ items: [item1, item2, item3, item4],
969
+ };
970
+ const result = pricingService.order.removeItem({ order, item: item1 });
971
+
972
+ expect(result.items).toMatchObject([
973
+ {
974
+ _id: '2',
975
+ },
976
+ ]);
977
+ });
978
+
979
+ test('Remove related Item, having nested related items', () => {
980
+ const item1 = {
981
+ _id: '1',
982
+ itemId: 'a',
983
+ };
984
+ const item2 = {
985
+ _id: '2',
986
+ };
987
+ const item3 = {
988
+ _id: '3',
989
+ properties: {
990
+ relatedItem: true,
991
+ parentId: item1._id,
992
+ parentItemId: item1.itemId,
993
+ },
994
+ };
995
+ const item4 = {
996
+ _id: '4',
997
+ itemId: 'd',
998
+ properties: {
999
+ relatedItem: true,
1000
+ parentId: item1._id,
1001
+ parentItemId: item1.itemId,
1002
+ },
1003
+ };
1004
+
1005
+ const nestedItem5 = {
1006
+ _id: '5',
1007
+ properties: {
1008
+ relatedItem: true,
1009
+ parentId: item4._id,
1010
+ parentItemId: item4.itemId,
1011
+ },
1012
+ };
1013
+
1014
+ const order = {
1015
+ items: [item1, item2, item3, item4, nestedItem5],
1016
+ };
1017
+ const result = pricingService.order.removeItem({
1018
+ order,
1019
+ item: nestedItem5,
1020
+ });
1021
+
1022
+ expect(result.items).toMatchObject([item1, item2, item3, item4]);
1023
+ });
1024
+
1025
+ test('Remove related Item, having nested related items 2', () => {
1026
+ const item1 = {
1027
+ _id: '1',
1028
+ itemId: 'a',
1029
+ };
1030
+ const item2 = {
1031
+ _id: '2',
1032
+ };
1033
+ const item3 = {
1034
+ _id: '3',
1035
+ properties: {
1036
+ relatedItem: true,
1037
+ parentId: item1._id,
1038
+ parentItemId: item1.itemId,
1039
+ },
1040
+ };
1041
+ const item4 = {
1042
+ _id: '4',
1043
+ itemId: 'd',
1044
+ properties: {
1045
+ relatedItem: true,
1046
+ parentId: item1._id,
1047
+ parentItemId: item1.itemId,
1048
+ },
1049
+ };
1050
+
1051
+ const nestedItem5 = {
1052
+ _id: '5',
1053
+ properties: {
1054
+ relatedItem: true,
1055
+ parentId: item4._id,
1056
+ parentItemId: item4.itemId,
1057
+ },
1058
+ };
1059
+
1060
+ const nestedItem6 = {
1061
+ _id: '6',
1062
+ properties: {
1063
+ relatedItem: true,
1064
+ parentId: item4._id,
1065
+ parentItemId: item4.itemId,
1066
+ },
1067
+ };
1068
+
1069
+ const order = {
1070
+ items: [item1, item2, item3, item4, nestedItem5, nestedItem6],
1071
+ };
1072
+ const result = pricingService.order.removeItem({
1073
+ order,
1074
+ item: nestedItem5,
1075
+ });
1076
+
1077
+ expect(result.items).toMatchObject([
1078
+ item1,
1079
+ item2,
1080
+ item3,
1081
+ item4,
1082
+ nestedItem6,
1083
+ ]);
1084
+ });
1085
+
1086
+ test('Remove parent related Item, having nested related items', () => {
1087
+ const item1 = {
1088
+ _id: '1',
1089
+ itemId: 'a',
1090
+ };
1091
+ const item2 = {
1092
+ _id: '2',
1093
+ };
1094
+ const item3 = {
1095
+ _id: '3',
1096
+ properties: {
1097
+ relatedItem: true,
1098
+ parentId: item1._id,
1099
+ parentItemId: item1.itemId,
1100
+ },
1101
+ };
1102
+ const item4 = {
1103
+ _id: '4',
1104
+ itemId: 'd',
1105
+ properties: {
1106
+ relatedItem: true,
1107
+ parentId: item1._id,
1108
+ parentItemId: item1.itemId,
1109
+ },
1110
+ };
1111
+
1112
+ const nestedItem5 = {
1113
+ _id: '5',
1114
+ properties: {
1115
+ relatedItem: true,
1116
+ parentId: item4._id,
1117
+ parentItemId: item4.itemId,
1118
+ },
1119
+ };
1120
+
1121
+ const nestedItem6 = {
1122
+ _id: '6',
1123
+ properties: {
1124
+ relatedItem: true,
1125
+ parentId: item4._id,
1126
+ parentItemId: item4.itemId,
1127
+ },
1128
+ };
1129
+
1130
+ const order = {
1131
+ items: [item1, item2, item3, item4, nestedItem5, nestedItem6],
1132
+ };
1133
+ const result = pricingService.order.removeItem({ order, item: item1 });
1134
+
1135
+ expect(result.items).toMatchObject([item2]);
1136
+ });
1137
+
1138
+ test('Should add related item and its related addModifiers to the parent item, then removing that relateditem should also remove the mod from the parent item', () => {
1139
+ const rawRelatedItem1 = {
1140
+ name: 'the related item',
1141
+
1142
+ _id: '67e2cadd8dcf08ebcc5ef888',
1143
+ };
1144
+
1145
+ const rawRelatedItem2 = {
1146
+ name: 'the 2nd related item',
1147
+ _id: '67e2cadd8dcf08ebcc5ef88a',
1148
+ };
1149
+
1150
+ const groupMod = {
1151
+ _id: '67e2cadd8dcf08ebcc5ef889',
1152
+ name: 'General Repair Department',
1153
+ attributes: ['group'],
1154
+ modifierId: 'mod1',
1155
+ properties: {
1156
+ group: {
1157
+ items: [rawRelatedItem1, rawRelatedItem2],
1158
+ },
1159
+ },
1160
+ };
1161
+
1162
+ const parentItem = {
1163
+ name: 'the parent item',
1164
+ modifiers: [groupMod],
1165
+ _id: '67e2cadd8dcf08ebcc5ef887',
1166
+ __typename: 'OrderItem',
1167
+ properties: {
1168
+ basePrice: 100,
1169
+ },
1170
+ };
1171
+
1172
+ const relatedItem1 = {
1173
+ ...rawRelatedItem1,
1174
+ properties: {
1175
+ relatedItem: true,
1176
+ parentId: parentItem._id,
1177
+ includeParent: true,
1178
+ addModifiers: [groupMod],
1179
+ relatedItemId: rawRelatedItem1._id,
1180
+ },
1181
+ __typename: 'OrderItem',
1182
+ };
1183
+
1184
+ const relatedItem2 = {
1185
+ ...rawRelatedItem2,
1186
+ properties: {
1187
+ relatedItem: true,
1188
+ parentId: parentItem._id,
1189
+ includeParent: true,
1190
+ addModifiers: [groupMod],
1191
+ relatedItemId: rawRelatedItem2._id,
1192
+ },
1193
+ __typename: 'OrderItem',
1194
+ };
1195
+ const order = {
1196
+ items: [parentItem, relatedItem1, relatedItem2],
1197
+ };
1198
+
1199
+ const result = pricingService.order.removeItem({
1200
+ order,
1201
+ item: relatedItem2,
1202
+ });
1203
+
1204
+ expect(result.items.length).toBe(2);
1205
+ expect(result.items[0].modifiers.length).toBe(1);
1206
+ expect(result.items[0].modifiers[0].modifierId).toBe('mod1');
1207
+
1208
+ const result2 = pricingService.order.removeItem({
1209
+ order: result,
1210
+ item: relatedItem1,
1211
+ });
1212
+
1213
+ expect(result2.items.length).toBe(1);
1214
+ expect(result2.items[0].modifiers.length).toBe(0);
1215
+ });
1216
+
1217
+ test('Should not remove the group modifier if it still hasModifiers', () => {
1218
+ const rawRelatedItem1 = {
1219
+ name: 'the related item',
1220
+ _id: '67e2cadd8dcf08ebcc5ef888',
1221
+ };
1222
+
1223
+ const rawRelatedItem2 = {
1224
+ name: 'the 2nd related item',
1225
+ _id: '67e2cadd8dcf08ebcc5ef88a',
1226
+ };
1227
+
1228
+ const rawRelatedMod1 = {
1229
+ name: 'related modifier',
1230
+ _id: '123',
1231
+ modifierId: 'abc',
1232
+ addModifiers: [
1233
+ {
1234
+ _id: '67e2cadd8dcf08ebcc5ef889',
1235
+ name: 'General Repair Department',
1236
+ attributes: ['group'],
1237
+ modifierId: 'mod1',
1238
+ properties: {
1239
+ group: {
1240
+ items: [rawRelatedItem1, rawRelatedItem2],
1241
+ },
1242
+ },
1243
+ },
1244
+ ],
1245
+ };
1246
+
1247
+ const groupMod = {
1248
+ _id: '67e2cadd8dcf08ebcc5ef889',
1249
+ name: 'General Repair Department',
1250
+ attributes: ['group'],
1251
+ modifierId: 'mod1',
1252
+ properties: {
1253
+ group: {
1254
+ items: [rawRelatedItem1, rawRelatedItem2],
1255
+ modifiers: [rawRelatedMod1],
1256
+ },
1257
+ },
1258
+ };
1259
+
1260
+ const parentItem = {
1261
+ name: 'the parent item',
1262
+ modifiers: [groupMod, rawRelatedMod1],
1263
+ _id: '67e2cadd8dcf08ebcc5ef887',
1264
+ __typename: 'OrderItem',
1265
+ properties: {
1266
+ basePrice: 100,
1267
+ },
1268
+ };
1269
+
1270
+ const relatedItem1 = {
1271
+ ...rawRelatedItem1,
1272
+ properties: {
1273
+ relatedItem: true,
1274
+ parentId: parentItem._id,
1275
+ includeParent: true,
1276
+ addModifiers: [groupMod],
1277
+ relatedItemId: rawRelatedItem1._id,
1278
+ },
1279
+ __typename: 'OrderItem',
1280
+ };
1281
+
1282
+ const relatedItem2 = {
1283
+ ...rawRelatedItem2,
1284
+ properties: {
1285
+ relatedItem: true,
1286
+ parentId: parentItem._id,
1287
+ includeParent: true,
1288
+ addModifiers: [groupMod],
1289
+ relatedItemId: rawRelatedItem2._id,
1290
+ },
1291
+ __typename: 'OrderItem',
1292
+ };
1293
+ const order = {
1294
+ items: [parentItem, relatedItem1, relatedItem2],
1295
+ };
1296
+
1297
+ const newItem = pricingService.item.removeModifiers({
1298
+ item: parentItem,
1299
+ modifiers: [rawRelatedMod1],
1300
+ originalItem: parentItem,
1301
+ customer: undefined,
1302
+ order,
1303
+ });
1304
+
1305
+ expect(newItem.modifiers.length).toBe(1);
1306
+ expect(newItem.modifiers[0].name).toBe('General Repair Department');
1307
+ });
859
1308
  });
@@ -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,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,36 @@
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
+ const originalMod = originalModifier || modifier;
6
+
5
7
  if (modifierActions.isGroupOfModifiers(modifier)) {
6
8
  const relatedModifiers = modifier.properties.group.modifiers;
7
9
  return [
8
10
  modifierActions.removeGroupData({ modifier }),
9
11
  ...relatedModifiers,
10
12
  ].some(relatedModifier =>
11
- hasModifier({ item, modifier: relatedModifier })
13
+ hasModifier({
14
+ item,
15
+ modifier: relatedModifier,
16
+ relatedItems,
17
+ originalModifier: originalMod,
18
+ })
12
19
  );
13
20
  }
14
21
 
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)
22
+ const matchByModifier = item.modifiers.some(
23
+ each => !modifierActions.isGroup(each) && each.modifierId === modifier._id
24
+ );
25
+
26
+ const matchByRelatedItems =
27
+ !!relatedItems &&
28
+ modifierActions.isGroupOfItems(originalMod) &&
29
+ relatedItems.some(relatedItem =>
30
+ originalMod.properties.group.items.some(
31
+ modItem => modItem._id === relatedItem.properties.relatedItemId
32
+ )
24
33
  );
25
34
 
26
- return !!itemModifier;
35
+ return matchByModifier || matchByRelatedItems;
27
36
  };
@@ -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,59 @@
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
+ const modifiersToApply = [
23
+ modifier,
24
+ ...addModifiers.filter(
25
+ addMod =>
26
+ !addMod.required &&
27
+ (!order ||
28
+ !actions.hasModifier({
29
+ item: {
30
+ ...item,
31
+ modifiers: item.modifiers.filter(
32
+ mod => mod._id !== modifier._id
33
+ ),
34
+ },
35
+ modifier: addMod,
36
+ relatedItems: actions.getRelatedItems({
37
+ items: order.items,
38
+ item,
39
+ }),
40
+ originalModifier: addMod,
41
+ }))
42
+ ),
43
+ ];
23
44
 
24
- modifiersToApply.push(modifier);
25
45
  // Remove
26
46
  const nextModifiers = item.modifiers.filter(
27
47
  each =>
28
48
  !modifiersToApply.find(
29
- mod => each._parentId === mod._id || each._id === mod._id
49
+ mod =>
50
+ each._parentId === mod._id ||
51
+ each._id === mod._id ||
52
+ each.modifierId === mod._id
30
53
  )
31
54
  );
32
55
 
33
- const hasOverride = modifiersToApply.find(each =>
56
+ const hasOverride = nextModifiers.find(each =>
34
57
  modifierActions.isOverride(each)
35
58
  );
36
59
 
@@ -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 => {
@@ -1,53 +1,94 @@
1
- module.exports = ({ actions, _, itemActions }) => {
2
- const updateRelatedItems = (items, parentId) =>
3
- items.map(each => {
4
- const item = { ...each };
5
- if (item.properties && item.properties.parentId === parentId)
6
- item.properties.includeParent = false;
7
- return item;
8
- });
9
-
10
- return function removeItem({ order, item, checkQuantity, hard = true }) {
11
- if (!item) return order;
12
-
1
+ module.exports = ({ actions, itemActions }) => {
2
+ const remove = ({ order, item, checkQuantity }) => {
13
3
  const orderItemIdx = actions.getItemIndex({ order, item });
14
4
  if (orderItemIdx < 0) return order;
15
5
 
16
- let { items } = order;
17
- const orderItem = items[orderItemIdx];
18
- const relatedItems = actions.getRelatedItems({ order, item });
19
- const hasRelatedItem = !_.isEmpty(relatedItems);
6
+ const items = [...order.items];
20
7
 
21
- if (!hard || hasRelatedItem) {
22
- items[orderItemIdx] = { ...orderItem, price: 0, modifiers: [] };
23
- if (hasRelatedItem) {
24
- items = updateRelatedItems(items, item._id);
25
- }
26
- }
27
- // Decrease the quantity
28
- else if (
8
+ if (
29
9
  checkQuantity &&
30
10
  items[orderItemIdx] &&
31
11
  items[orderItemIdx].quantity > 1
32
- )
33
- items[orderItemIdx] = { ...orderItem, quantity: orderItem.quantity - 1 };
34
- // Remove
35
- else items.splice(orderItemIdx, 1);
36
-
37
- // if it is the last relatedItem
38
- if (
39
- itemActions.isRelatedItem(item) &&
40
- !itemActions.isParentIncluded(item)
41
12
  ) {
42
- const parent = itemActions.getParentItem(items, orderItem);
43
- const parentIndex = actions.getItemIndex({ order, item: parent });
44
- const siblings = actions.getRelatedItems({ order, item: parent });
45
- if (siblings <= 1) items.splice(parentIndex, 1);
13
+ items[orderItemIdx] = { ...item, quantity: item.quantity - 1 };
14
+ return {
15
+ ...order,
16
+ items,
17
+ };
46
18
  }
47
19
 
48
- return {
20
+ items.splice(orderItemIdx, 1);
21
+
22
+ let resultedOrder = {
49
23
  ...order,
50
24
  items,
51
25
  };
26
+
27
+ if (itemActions.isRelatedItem(item) && itemActions.hasAddModifiers(item)) {
28
+ const parentItem = itemActions.getParentItem(order.items, item);
29
+
30
+ if (parentItem) {
31
+ resultedOrder = item.properties.addModifiers.reduce(
32
+ (prevOrder, addModifier) => {
33
+ if (
34
+ !itemActions.hasModifier({
35
+ item: parentItem,
36
+ modifier: addModifier,
37
+ relatedItems: actions.getRelatedItems({
38
+ order: prevOrder,
39
+ item: parentItem,
40
+ }),
41
+ originalModifier: addModifier,
42
+ })
43
+ ) {
44
+ const updatedItem = itemActions.removeModifier({
45
+ item: parentItem,
46
+ modifier: addModifier,
47
+ originalItem: parentItem,
48
+ });
49
+ const itemIndexToUpdate = actions.getItemIndex({
50
+ order: prevOrder,
51
+ item: parentItem,
52
+ });
53
+ if (itemIndexToUpdate >= 0) {
54
+ const itemsToUpdate = [...prevOrder.items];
55
+
56
+ itemsToUpdate.splice(itemIndexToUpdate, 1, updatedItem);
57
+
58
+ return {
59
+ ...resultedOrder,
60
+ items: itemsToUpdate,
61
+ };
62
+ }
63
+ }
64
+ return resultedOrder;
65
+ },
66
+ resultedOrder
67
+ );
68
+ }
69
+ }
70
+
71
+ const relatedItems = actions.getRelatedItems({ order, item });
72
+ if (relatedItems.length > 0) {
73
+ return relatedItems.reduce(
74
+ (prevOrder, relatedItem) =>
75
+ remove({
76
+ order: prevOrder,
77
+ item: relatedItem,
78
+ checkQuantity,
79
+ }),
80
+ resultedOrder
81
+ );
82
+ }
83
+
84
+ return resultedOrder;
85
+ };
86
+
87
+ return function removeItem({ order, item, checkQuantity }) {
88
+ if (!order || !Array.isArray(order.items) || !item) return order;
89
+
90
+ const nextOrder = remove({ order, item, checkQuantity });
91
+
92
+ return nextOrder;
52
93
  };
53
94
  };
@@ -16,6 +16,7 @@ module.exports = ({ modifierActions, itemActions }) =>
16
16
  itemActions.removeModifier({
17
17
  item: each,
18
18
  modifier: modifiers[index],
19
+ order: nextOrder,
19
20
  })
20
21
  );
21
22
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.67",
3
+ "version": "1.0.69",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -25,6 +25,7 @@
25
25
  "test:pickEndDate": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/pickEndDate.test.js",
26
26
  "test:modifier": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/modifier.test.js",
27
27
  "test:paymentModifiers": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/order-payment-modifier.test.js",
28
+ "test:addItem": "jest --runInBand --detectOpenHandles --logHeapUsage --forceExit ./__TEST__/order/addItem.test.js",
28
29
  "lint": "eslint --quiet lib/"
29
30
  },
30
31
  "publishConfig": {
@@ -48,5 +49,5 @@
48
49
  "supertest": "^6.2.3",
49
50
  "supervisor": "^0.12.0"
50
51
  },
51
- "gitHead": "81b85576c1eb0f3546c48188dc1356146f385176"
52
+ "gitHead": "eb168a1c07915c479303713d45c4d40ebf692689"
52
53
  }
@@ -1,15 +0,0 @@
1
- module.exports = ({ actions, modifierActions }) =>
2
- function removePaymentModifiers({ items }) {
3
- const paymentModifiers = items.modifiers.filter(mod =>
4
- modifierActions.isPaymentModifier(mod)
5
- );
6
-
7
- return paymentModifiers.map(paymentMod =>
8
- items.map(item =>
9
- actions.removeModifier({
10
- item,
11
- modifier: paymentMod,
12
- })
13
- )
14
- );
15
- };
@@ -1,9 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function addDiscountModifier({ order, modifier }) {
3
- if (!order || !modifier) return order;
4
- const clearedOrder = actions.removeDiscountModifier(order);
5
- return actions.addModifier({
6
- order: clearedOrder,
7
- modifier,
8
- });
9
- };
@@ -1,16 +0,0 @@
1
- module.exports = ({ modifierActions, itemActions }) =>
2
- function removeDiscountModifiers(order) {
3
- if (!order || !Array.isArray(order.modifiers)) return order;
4
- const nextOrder = { ...order };
5
- let { modifiers, items } = nextOrder;
6
- const discountModifiers = modifiers.filter(modifierActions.isDiscount);
7
- modifiers = modifiers.filter(each => !modifierActions.isDiscount(each));
8
- if (items)
9
- items = items.map(each =>
10
- itemActions.removeModifiers({
11
- item: each,
12
- modifiers: discountModifiers,
13
- })
14
- );
15
- return { ...order, modifiers, items };
16
- };