@darkpos/pricing 1.0.15 → 1.0.16

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 (65) hide show
  1. package/__TEST__/mocks/partially-paid/input-items.json +1 -0
  2. package/__TEST__/mocks/partially-paid/order-modifiers.json +53 -0
  3. package/__TEST__/mocks/partially-paid/order-partially-paid.json +890 -0
  4. package/__TEST__/mocks/scripts/calculate-partially-paid/index.js +27 -0
  5. package/__TEST__/mocks/scripts/calculate-unpaid/index.js +28 -0
  6. package/__TEST__/mocks/scripts/order-to-string.js +18 -0
  7. package/__TEST__/mocks/stores.js +435 -0
  8. package/__TEST__/mocks/unpaid/input-items.json +6 -0
  9. package/__TEST__/mocks/unpaid/order-modifiers.json +53 -0
  10. package/__TEST__/mocks/unpaid/order-not-paid.json +684 -0
  11. package/__TEST__/order/order.test.js +610 -0
  12. package/lib/item/addIndirectModifier.js +2 -3
  13. package/lib/item/calculate.js +1 -2
  14. package/lib/item/getBalance.js +9 -0
  15. package/lib/item/getItemModifiers.js +3 -14
  16. package/lib/item/getItems.js +5 -0
  17. package/lib/item/getTotal.js +1 -1
  18. package/lib/item/getTotalPrice.js +10 -0
  19. package/lib/item/getTotals.js +31 -18
  20. package/lib/item/index.js +12 -0
  21. package/lib/item/isFullyPaid.js +6 -0
  22. package/lib/item/markModifiersAsLocked.js +11 -0
  23. package/lib/item/removeModifier.js +10 -9
  24. package/lib/item/removePaymentModifiers.js +15 -0
  25. package/lib/modifier/create.js +2 -2
  26. package/lib/modifier/createAmountOverrideModifier.js +1 -3
  27. package/lib/modifier/createCreditModifier.js +2 -4
  28. package/lib/modifier/createDiscountModifier.js +1 -3
  29. package/lib/modifier/createIndirectModifier.js +1 -1
  30. package/lib/modifier/createPaymentModifier.js +12 -0
  31. package/lib/modifier/createSubscriptionModifier.js +1 -3
  32. package/lib/modifier/duplicate.js +1 -1
  33. package/lib/modifier/findById.js +4 -1
  34. package/lib/modifier/findByPaymentMethod.js +1 -1
  35. package/lib/modifier/findByPaymentType.js +1 -1
  36. package/lib/modifier/getItemModifiers.js +1 -3
  37. package/lib/modifier/getLockedModifiers.js +5 -0
  38. package/lib/modifier/getSplittedModifiers.js +4 -6
  39. package/lib/modifier/hasItems.js +8 -0
  40. package/lib/modifier/index.js +20 -4
  41. package/lib/modifier/isFixed.js +10 -0
  42. package/lib/modifier/isFixedDiscount.js +4 -0
  43. package/lib/modifier/isPaymentMethodModifier.js +8 -0
  44. package/lib/modifier/isPaymentModifier.js +7 -0
  45. package/lib/modifier/isPaymentTypeModifier.js +8 -0
  46. package/lib/modifier/isSubtract.js +10 -0
  47. package/lib/modifier/removeLocked.js +8 -0
  48. package/lib/order/addItem.js +104 -106
  49. package/lib/order/addItemModifier.js +0 -3
  50. package/lib/order/addModifier.js +14 -2
  51. package/lib/order/addModifiers.js +15 -0
  52. package/lib/order/autoSplit.js +34 -0
  53. package/lib/order/calculate.js +46 -68
  54. package/lib/order/getScheduleByCustomer.js +0 -1
  55. package/lib/order/index.js +10 -0
  56. package/lib/order/markModifiersAsLocked.js +14 -0
  57. package/lib/order/removeItem.js +0 -2
  58. package/lib/order/removeModifier.js +5 -1
  59. package/lib/order/removeModifiers.js +18 -0
  60. package/lib/order/splitByDepartments.js +1 -13
  61. package/lib/order/syncSubOrderItemsFromParent.js +24 -0
  62. package/package.json +3 -2
  63. package/__TEST__/order.test.js +0 -233
  64. package/lib/modifier/isPaymentMethods.js +0 -8
  65. package/lib/modifier/isPaymentTypes.js +0 -8
@@ -0,0 +1,610 @@
1
+ const usePricing = require('../../index');
2
+ const mockStores = require('../mocks/stores');
3
+
4
+ const orderNotPaid = require('../mocks/unpaid/order-not-paid.json');
5
+ const orderModifiersNotPaid = require('../mocks/unpaid/order-modifiers.json');
6
+ const inputItemsNotPaidOrder = require('../mocks/unpaid/input-items.json');
7
+
8
+ const orderPartiallyPaid = require('../mocks/partially-paid/order-partially-paid.json');
9
+ const orderModifiersPartiallyPaid = require('../mocks/partially-paid/order-modifiers.json');
10
+ const inputItemsPartiallyPaidOrder = require('../mocks/partially-paid/input-items.json');
11
+
12
+ const session = {
13
+ store: mockStores[0],
14
+ };
15
+
16
+ const pricingService = usePricing(session);
17
+
18
+ describe('Order actions', () => {
19
+ test('Get calculated Order, one item', () => {
20
+ const modifiers = [
21
+ {
22
+ compute: {
23
+ amount: 20,
24
+ type: 'percentage',
25
+ action: 'add',
26
+ },
27
+ name: 'modifier1',
28
+ type: 'discount',
29
+ },
30
+ {
31
+ compute: {
32
+ amount: 20,
33
+ type: 'percentage',
34
+ action: 'subtract',
35
+ },
36
+ name: 'modifier2',
37
+ type: 'discount',
38
+ },
39
+ {
40
+ compute: { amount: 2, type: 'fixed', action: 'subtract' },
41
+ name: 'modifier3',
42
+ type: 'discount',
43
+ },
44
+ ];
45
+ const orderItem = { price: 30, quantity: 2, modifiers };
46
+ const order = { items: [orderItem] };
47
+ const newOrder = pricingService.order.calculate(order);
48
+
49
+ expect(newOrder).toHaveProperty('total', 56);
50
+ expect(newOrder).toHaveProperty('subTotal', 60);
51
+ expect(newOrder).toHaveProperty('subTotals', {
52
+ discount: -4,
53
+ });
54
+ });
55
+ test('Get calculated Order, multiple items', () => {
56
+ const item1 = {
57
+ _id: 1,
58
+ price: 30,
59
+ quantity: 2,
60
+ modifiers: [
61
+ {
62
+ compute: {
63
+ amount: 2,
64
+ type: 'fixed',
65
+ action: 'subtract',
66
+ },
67
+ name: 'modifier1',
68
+ type: 'discount',
69
+ },
70
+ ],
71
+ };
72
+ const item2 = {
73
+ _id: 2,
74
+ price: 10,
75
+ quantity: 1,
76
+ modifiers: [
77
+ {
78
+ compute: {
79
+ amount: 2,
80
+ type: 'fixed',
81
+ action: 'subtract',
82
+ },
83
+ name: 'modifier1',
84
+ type: 'discount',
85
+ },
86
+ ],
87
+ };
88
+ const order = { items: [item1, item2] };
89
+ const newOrder = pricingService.order.calculate(order);
90
+ expect(newOrder).toHaveProperty('total', 64);
91
+ expect(newOrder).toHaveProperty('subTotal', 70);
92
+ expect(newOrder).toHaveProperty('subTotals', {
93
+ discount: -6,
94
+ });
95
+ // console.log(JSON.stringify(newOrder, 0, 2));
96
+ });
97
+ test('Get calculated Order, multiple items and indirect modifiers', () => {
98
+ const item1 = {
99
+ _id: 1,
100
+ price: 30,
101
+ quantity: 2,
102
+ };
103
+ const item2 = {
104
+ _id: 2,
105
+ price: 10,
106
+ quantity: 1,
107
+ };
108
+ const modifier1 = {
109
+ compute: {
110
+ amount: 2,
111
+ type: 'fixed',
112
+ action: 'subtract',
113
+ },
114
+ name: 'modifier1',
115
+ type: 'discount',
116
+ };
117
+
118
+ const order = { items: [item1, item2], modifiers: [modifier1] };
119
+
120
+ const newOrder = pricingService.order.calculate(order);
121
+ expect(newOrder).toHaveProperty('total', 68);
122
+ expect(newOrder).toHaveProperty('subTotal', 70);
123
+ expect(newOrder).toHaveProperty('subTotals', {
124
+ discount: -2,
125
+ });
126
+ expect(newOrder.items[0]).toHaveProperty('total', 58.28);
127
+ expect(newOrder.items[0]).toHaveProperty('subTotals', {
128
+ discount: -1.72,
129
+ _included: 0,
130
+ _xincluded: -1.72,
131
+ _direct: 0,
132
+ _xdirect: -1.72,
133
+ _simple: 60,
134
+ _actual: 60,
135
+ });
136
+ expect(newOrder.items[1]).toHaveProperty('total', 9.72);
137
+ expect(newOrder.items[1]).toHaveProperty('subTotals', {
138
+ discount: -0.28,
139
+ _included: 0,
140
+ _xincluded: -0.28,
141
+ _direct: 0,
142
+ _xdirect: -0.28,
143
+ _simple: 10,
144
+ _actual: 10,
145
+ });
146
+ });
147
+ test('Get calculated Order, multiple items and indirect modifiers #2', () => {
148
+ const item1 = {
149
+ _id: 1,
150
+ price: 15.99,
151
+ quantity: 1,
152
+ };
153
+ const item2 = {
154
+ _id: 2,
155
+ price: 4.65,
156
+ quantity: 1,
157
+ };
158
+ const modifier1 = {
159
+ compute: {
160
+ amount: 10,
161
+ action: 'subtract',
162
+ type: 'percentage',
163
+ },
164
+ name: 'modifier1',
165
+ type: 'discount',
166
+ };
167
+
168
+ const order = { items: [item1, item2], modifiers: [modifier1] };
169
+ const newOrder = pricingService.order.calculate(order);
170
+ expect(newOrder).toHaveProperty('total', 18.58);
171
+ expect(newOrder).toHaveProperty('subTotal', 20.64);
172
+ expect(newOrder).toHaveProperty('subTotals', {
173
+ discount: -2.06,
174
+ });
175
+ expect(newOrder.items[0]).toHaveProperty('total', 14.39);
176
+ expect(newOrder.items[0]).toHaveProperty('subTotals', {
177
+ discount: -1.6,
178
+ _included: 0,
179
+ _xincluded: -1.6,
180
+ _direct: 0,
181
+ _xdirect: -1.6,
182
+ _simple: 15.99,
183
+ _actual: 15.99,
184
+ });
185
+ expect(newOrder.items[1]).toHaveProperty('total', 4.19);
186
+ expect(newOrder.items[1]).toHaveProperty('subTotals', {
187
+ discount: -0.46,
188
+ _included: 0,
189
+ _xincluded: -0.46,
190
+ _direct: 0,
191
+ _xdirect: -0.46,
192
+ _simple: 4.65,
193
+ _actual: 4.65,
194
+ });
195
+ });
196
+ test('Get calculated Order, multiple items and indirect modifiers #3', () => {
197
+ const item1 = {
198
+ _id: 1,
199
+ price: 3,
200
+ quantity: 1,
201
+ };
202
+ const item2 = {
203
+ _id: 2,
204
+ price: 3,
205
+ quantity: 1,
206
+ };
207
+ const item3 = {
208
+ _id: 3,
209
+ price: 4,
210
+ quantity: 1,
211
+ };
212
+ const modifier1 = {
213
+ _id: 1,
214
+ compute: {
215
+ amount: 10,
216
+ type: 'percentage',
217
+ action: 'subtract',
218
+ },
219
+ name: `10% Discount`,
220
+ type: 'discount',
221
+ };
222
+
223
+ const modifier2 = {
224
+ _id: 2,
225
+ name: `20% tax`,
226
+ type: 'tax',
227
+ compute: {
228
+ amount: 20,
229
+ type: 'percentage',
230
+ action: 'add',
231
+ },
232
+ };
233
+
234
+ const order = {
235
+ items: [item1, item2, item3],
236
+ modifiers: [modifier1, modifier2],
237
+ };
238
+ const newOrder = pricingService.order.calculate(order);
239
+ expect(newOrder).toHaveProperty('total', 11);
240
+ expect(newOrder).toHaveProperty('subTotal', 10);
241
+ expect(newOrder).toHaveProperty('subTotals', {
242
+ discount: -1,
243
+ tax: 2,
244
+ });
245
+ });
246
+
247
+ test('Auto split a Parent Order', () => {
248
+ const parentOrder = {
249
+ _id: '6392069cb6c81965a442289d',
250
+ displayId: '1',
251
+ parentId: null,
252
+ isParent: false,
253
+ subTotal: 15,
254
+ tax: 0,
255
+ discount: 0,
256
+ total: 15,
257
+ description: '',
258
+ type: '',
259
+ fee: 0,
260
+ location: {},
261
+ status: {
262
+ order: 'open',
263
+ kitchen: 'open',
264
+ delivery: 'none',
265
+ detailed: true,
266
+ },
267
+ attributes: [],
268
+ properties: {
269
+ pieces: [],
270
+ notify: {
271
+ sms: false,
272
+ },
273
+ print: {},
274
+ split: 'auto',
275
+ },
276
+ subTotals: {},
277
+ user: {
278
+ _id: '5a09fd650cd56e741f78aba6',
279
+ },
280
+ items: [
281
+ {
282
+ _id: '639206f1b6c81965a44228ba',
283
+ itemId: '62cdbfd01ee1b40019328252',
284
+ name: 'Box Shirt - Fold',
285
+ description: '',
286
+ modifiersTotalAmount: 0,
287
+ location: {},
288
+ price: 2,
289
+ pieces: 1,
290
+ quantity: 1,
291
+ path: ['menuCategories', 8],
292
+ menuId: '62cdbfd0aaf93c00193d2efe',
293
+ serial: null,
294
+ sku: null,
295
+ total: 2,
296
+ status: {
297
+ picked: {
298
+ value: false,
299
+ date: '',
300
+ },
301
+ paid: {
302
+ value: false,
303
+ date: '',
304
+ },
305
+ tracker: [],
306
+ },
307
+ subTotals: {
308
+ _included: 0,
309
+ _xincluded: 0,
310
+ _direct: 0,
311
+ _xdirect: 0,
312
+ _simple: 2,
313
+ _actual: 2,
314
+ },
315
+ properties: false,
316
+ modifiers: [
317
+ {
318
+ _id: '639206f1b6c81965a44228bc',
319
+ modifierId: '62cdbfd01ee1b4001932816c',
320
+ name: 'Laundry',
321
+ sku: '',
322
+ description: '',
323
+ group: '',
324
+ type: null,
325
+ attributes: ['department'],
326
+ color: '',
327
+ backgroundColor: null,
328
+ icon: null,
329
+ url: '',
330
+ tags: [],
331
+ order: 2,
332
+ included: false,
333
+ direct: true,
334
+ hidden: true,
335
+ print: false,
336
+ required: true,
337
+ recommended: false,
338
+ default: false,
339
+ code: 'L',
340
+ properties: {
341
+ department: {
342
+ tagSize: 'Small',
343
+ customerTagsExtend: null,
344
+ maxItems: 4,
345
+ },
346
+ },
347
+ _computed: {
348
+ amount: 0,
349
+ description: 'Laundry ($0.00)',
350
+ },
351
+ addModifiers: [],
352
+ delModifiers: [],
353
+ conditions: null,
354
+ compute: null,
355
+ },
356
+ ],
357
+ notes: [],
358
+ },
359
+ {
360
+ _id: '639206efb6c81965a44228b7',
361
+ itemId: '62cdbfd01ee1b40019328284',
362
+ name: 'Pants',
363
+ description: '',
364
+ modifiersTotalAmount: 0,
365
+ location: {},
366
+ price: 4,
367
+ pieces: 1,
368
+ quantity: 1,
369
+ path: ['menuCategories', 11],
370
+ menuId: '62cdbfd0aaf93c00193d2efe',
371
+ serial: null,
372
+ sku: null,
373
+ total: 4,
374
+ status: {
375
+ picked: {
376
+ value: false,
377
+ date: '',
378
+ },
379
+ paid: {
380
+ value: false,
381
+ date: '',
382
+ },
383
+ tracker: [],
384
+ },
385
+ subTotals: {
386
+ _included: 0,
387
+ _xincluded: 0,
388
+ _direct: 0,
389
+ _xdirect: 0,
390
+ _simple: 4,
391
+ _actual: 4,
392
+ },
393
+ properties: false,
394
+ modifiers: [
395
+ {
396
+ _id: '639206efb6c81965a44228b9',
397
+ modifierId: '62cdbfd01ee1b4001932816d',
398
+ name: 'Dry Cleaning',
399
+ sku: '',
400
+ description: '',
401
+ group: '',
402
+ type: null,
403
+ attributes: ['department'],
404
+ color: '',
405
+ backgroundColor: null,
406
+ icon: null,
407
+ url: '',
408
+ tags: null,
409
+ order: 1,
410
+ included: false,
411
+ direct: true,
412
+ hidden: true,
413
+ print: false,
414
+ required: true,
415
+ recommended: false,
416
+ default: false,
417
+ code: 'D',
418
+ properties: {
419
+ department: {
420
+ tagSize: 'Small',
421
+ customerTagsExtend: null,
422
+ maxItems: 4,
423
+ },
424
+ },
425
+ _computed: {
426
+ amount: 0,
427
+ description: 'Dry Cleaning ($0.00)',
428
+ },
429
+ addModifiers: [],
430
+ delModifiers: [],
431
+ conditions: null,
432
+ compute: null,
433
+ },
434
+ ],
435
+ notes: [],
436
+ },
437
+ {
438
+ _id: '639206edb6c81965a44228b4',
439
+ itemId: '62cdbfd01ee1b400193281f1',
440
+ name: 'M-L 2pc Suit',
441
+ description: null,
442
+ modifiersTotalAmount: 0,
443
+ location: {},
444
+ price: 9,
445
+ pieces: 2,
446
+ quantity: 1,
447
+ path: ['menuCategories', 0],
448
+ menuId: '62cdbfd0aaf93c00193d2efe',
449
+ serial: null,
450
+ sku: null,
451
+ total: 9,
452
+ status: {
453
+ picked: {
454
+ value: false,
455
+ date: '',
456
+ },
457
+ paid: {
458
+ value: false,
459
+ date: '',
460
+ },
461
+ tracker: [],
462
+ },
463
+ subTotals: {
464
+ _included: 0,
465
+ _xincluded: 0,
466
+ _direct: 0,
467
+ _xdirect: 0,
468
+ _simple: 9,
469
+ _actual: 9,
470
+ },
471
+ properties: false,
472
+ modifiers: [
473
+ {
474
+ _id: '639206edb6c81965a44228b6',
475
+ modifierId: '62cdbfd01ee1b4001932816d',
476
+ name: 'Dry Cleaning',
477
+ sku: '',
478
+ description: '',
479
+ group: '',
480
+ type: null,
481
+ attributes: ['department'],
482
+ color: '',
483
+ backgroundColor: null,
484
+ icon: null,
485
+ url: '',
486
+ tags: null,
487
+ order: 1,
488
+ included: false,
489
+ direct: true,
490
+ hidden: true,
491
+ print: false,
492
+ required: true,
493
+ recommended: false,
494
+ default: false,
495
+ code: 'D',
496
+ properties: {
497
+ department: {
498
+ tagSize: 'Small',
499
+ customerTagsExtend: null,
500
+ maxItems: 4,
501
+ },
502
+ },
503
+ _computed: {
504
+ amount: 0,
505
+ description: 'Dry Cleaning ($0.00)',
506
+ },
507
+ addModifiers: [],
508
+ delModifiers: [],
509
+ conditions: null,
510
+ compute: null,
511
+ },
512
+ ],
513
+ notes: [],
514
+ },
515
+ ],
516
+ notes: [],
517
+ start: {
518
+ actualDate: '2022-12-08T15:45:27.838Z',
519
+ requestDate: '2022-12-08T15:45:27.838Z',
520
+ location: null,
521
+ },
522
+ end: {
523
+ actualDate: '',
524
+ requestDate: '2022-12-12T22:00:00.000Z',
525
+ location: {
526
+ name: 'Location Name',
527
+ locationType: 'store',
528
+ storeId: '59c042222a985ae70278619f',
529
+ },
530
+ },
531
+ customer: {
532
+ _id: '5c73d50b213453368dd30422',
533
+ },
534
+ modifiers: [],
535
+ };
536
+
537
+ const subOrders = pricingService.order
538
+ .autoSplit({ parentOrder })
539
+ .sort((a, b) => {
540
+ if (a.displayId < b.displayId) return -1;
541
+ if (a.displayId > b.displayId) return 1;
542
+ return 0;
543
+ });
544
+
545
+ expect(subOrders[0].displayId).toBe('1-1');
546
+ expect(subOrders[0].items.map(item => item.name)).toEqual([
547
+ 'Box Shirt - Fold',
548
+ ]);
549
+ expect(subOrders[1].displayId).toBe('1-2');
550
+ expect(subOrders[1].items.map(item => item.name)).toEqual([
551
+ 'Pants',
552
+ 'M-L 2pc Suit',
553
+ ]);
554
+ });
555
+ test('Get calculated UNPAID Order, multiple items and paymentModifiers', () => {
556
+ const paymentModifiers = orderModifiersNotPaid.map(orderMod =>
557
+ pricingService.modifier.createPaymentModifier({
558
+ modifier: orderMod,
559
+ items: inputItemsNotPaidOrder,
560
+ })
561
+ );
562
+
563
+ let order = { ...orderNotPaid };
564
+
565
+ order = pricingService.order.addModifiers({
566
+ modifiers: paymentModifiers,
567
+ order,
568
+ });
569
+
570
+ const newOrder = pricingService.order.calculate(order);
571
+
572
+ expect(newOrder).toHaveProperty('total', 34.45);
573
+ expect(newOrder).toHaveProperty('subTotal', 42.45);
574
+ expect(newOrder).toHaveProperty('subTotals', {
575
+ discount: -10,
576
+ fee: 2,
577
+ });
578
+ expect(newOrder.items[0]).toHaveProperty('total', 8.08);
579
+ expect(newOrder.items[1]).toHaveProperty('total', 7.71);
580
+ expect(newOrder.items[2]).toHaveProperty('total', 11.36);
581
+ expect(newOrder.items[3]).toHaveProperty('total', 7.3);
582
+ });
583
+ test('Get calculated PARTIALLY PAID Order, multiple items and paymentModifiers', () => {
584
+ const paymentModifiers = orderModifiersPartiallyPaid.map(orderMod =>
585
+ pricingService.modifier.createPaymentModifier({
586
+ modifier: orderMod,
587
+ items: inputItemsPartiallyPaidOrder,
588
+ })
589
+ );
590
+
591
+ let order = { ...orderPartiallyPaid };
592
+
593
+ order = pricingService.order.addModifiers({
594
+ modifiers: paymentModifiers,
595
+ order,
596
+ });
597
+ const newOrder = pricingService.order.calculate(order);
598
+
599
+ expect(newOrder).toHaveProperty('total', 36.45);
600
+ expect(newOrder).toHaveProperty('subTotal', 42.45);
601
+ expect(newOrder).toHaveProperty('subTotals', {
602
+ discount: -10,
603
+ fee: 4,
604
+ });
605
+ expect(newOrder.items[0]).toHaveProperty('total', 8.07);
606
+ expect(newOrder.items[1]).toHaveProperty('total', 7.71);
607
+ expect(newOrder.items[2]).toHaveProperty('total', 11.37);
608
+ expect(newOrder.items[3]).toHaveProperty('total', 9.3);
609
+ });
610
+ });
@@ -1,14 +1,13 @@
1
1
  module.exports = ({ utils, modifierActions }) => {
2
2
  const { math } = utils;
3
3
 
4
- return function addIndirectModifier(orderTotal, items, modifier) {
4
+ return function addIndirectModifier({ orderTotal, items, modifier }) {
5
5
  const itemsModifiers = {};
6
6
  // get distributed price in order level
7
7
  const { _computed } = modifierActions.calculate(modifier, {
8
8
  price: orderTotal,
9
9
  quantity: 1,
10
10
  });
11
-
12
11
  const orderModifierTotal = math.abs(_computed.amount);
13
12
  const totalDistributed = items.reduce((acc, item) => {
14
13
  const inheritedModifier = modifierActions.createIndirectModifier(
@@ -29,7 +28,6 @@ module.exports = ({ utils, modifierActions }) => {
29
28
  // check validation
30
29
  if (math.abs(totalDistributed) !== math.abs(orderModifierTotal)) {
31
30
  const difference = math.sub(orderModifierTotal, totalDistributed);
32
- // console.log('difference => ', difference);
33
31
  const selectedItem = items.find(
34
32
  item => math.sub(item.total, difference) > 0
35
33
  );
@@ -51,6 +49,7 @@ module.exports = ({ utils, modifierActions }) => {
51
49
  },
52
50
  };
53
51
  }
52
+
54
53
  return itemsModifiers;
55
54
  }
56
55
 
@@ -66,7 +66,6 @@ module.exports = ({ _, utils, modifierActions }) => {
66
66
 
67
67
  modifiers.push(_modifier);
68
68
  const { type, _computed } = _modifier;
69
- // console.log('computedPrice => ', _computed);
70
69
  let computedAmount = modifierActions.isIgnoreQuantity(_modifier)
71
70
  ? _computed.amount
72
71
  : math.mul(_computed.amount, quantity);
@@ -89,7 +88,7 @@ module.exports = ({ _, utils, modifierActions }) => {
89
88
  }
90
89
 
91
90
  subTotals._actual = math.add(subTotals._simple, subTotals._included);
92
- // console.log('subTotals =>', subTotals);
91
+
93
92
  const total = math.add(subTotals._actual, subTotals._xincluded);
94
93
 
95
94
  return {
@@ -0,0 +1,9 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getBalance({ item }) {
4
+ if (!item) return 0;
5
+ if (Array.isArray(item)) return 0;
6
+
7
+ return math.sub(item.total, item.totalPaid);
8
+ };
9
+ };
@@ -1,16 +1,5 @@
1
- module.exports = ({ modifierActions }) =>
2
- function getItemModifiers(item, orderModifiers) {
3
- const existsInOrderModifier = modifier =>
4
- orderModifiers &&
5
- orderModifiers.find(each => each.modifierId === modifier.modifierId);
1
+ module.exports = () =>
2
+ function getItemModifiers(item) {
6
3
 
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);
4
+ return item.modifiers;
16
5
  };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getItems(items, itemsToPay) {
3
+ if (!Array.isArray(itemsToPay)) return items;
4
+ return items.filter(item => itemsToPay.includes(item._id));
5
+ };
@@ -3,6 +3,6 @@ module.exports = ({ utils }) => {
3
3
  return function getTotal(item) {
4
4
  if (!item || !item.subTotals) return 0;
5
5
 
6
- return math.add(item.subTotals._simple, item.subTotals._direct);
6
+ return math.add(item.subTotals._simple, item.subTotals._xincluded);
7
7
  };
8
8
  };
@@ -0,0 +1,10 @@
1
+ module.exports = ({ utils }) =>
2
+ function getTotalPrice({ items = [] }) {
3
+ if (!Array.isArray(items)) return 0;
4
+
5
+ return items.reduce(
6
+ (totalPrice, item) => utils.math.add(totalPrice, item.price),
7
+ 0
8
+ );
9
+
10
+ };