@darkpos/pricing 1.0.32 → 1.0.33

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,356 @@
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
+ const dryCleaningModNoAutoSplit = {
11
+ name: 'Dry Cleaning',
12
+ attributes: ['department'],
13
+ code: 'D',
14
+ _id: '66d89d9b4f04f9eb99666483',
15
+ };
16
+
17
+ const laundryModNoAutoSplit = {
18
+ name: 'Laundry',
19
+ attributes: ['department'],
20
+ code: 'L',
21
+ _id: '66d89d9b4f04f9eb99666487',
22
+ };
23
+
24
+ const tailorinModNoAutoSplit = {
25
+ name: 'Tailoring',
26
+ attributes: ['department'],
27
+ code: 'T',
28
+ _id: '66d89d9b4f04f9eb99666484',
29
+ };
30
+
31
+ describe('Auto Split', () => {
32
+ test('Auto split only by department', () => {
33
+ const { autoSplit } = pricingService.order;
34
+
35
+ // Mock item to compare
36
+ const item1 = {
37
+ _id: '123',
38
+ itemId: '234',
39
+ modifiers: [laundryModNoAutoSplit],
40
+ };
41
+
42
+ const item2 = {
43
+ _id: '123',
44
+ itemId: '234',
45
+ modifiers: [dryCleaningModNoAutoSplit],
46
+ };
47
+
48
+ const item3 = {
49
+ _id: '567',
50
+ itemId: '567',
51
+ modifiers: [tailorinModNoAutoSplit],
52
+ quantity: 1000,
53
+ pieces: 2,
54
+ };
55
+
56
+ const item4 = {
57
+ _id: '444',
58
+ itemId: '444',
59
+ quantity: 1000,
60
+ modifiers: [tailorinModNoAutoSplit],
61
+ pieces: 2,
62
+ };
63
+
64
+ const subOrders = autoSplit({
65
+ parentOrder: {
66
+ items: [item1, item2, item3, item4],
67
+ status: {},
68
+ modifiers: [],
69
+ displayId: 1,
70
+ },
71
+ });
72
+
73
+ expect(subOrders.length).toEqual(3);
74
+ });
75
+
76
+ test('Auto split by department and Items Quantity', () => {
77
+ const { autoSplit } = pricingService.order;
78
+
79
+ const laundryModMaxItemsQuantity4 = {
80
+ ...laundryModNoAutoSplit,
81
+ properties: {
82
+ department: { autoSplit: true, maxItems: 2, splitUnit: 'quantity' },
83
+ },
84
+ };
85
+
86
+ // Mock item to compare
87
+ const item1 = {
88
+ _id: '123',
89
+ itemId: '234',
90
+ modifiers: [laundryModMaxItemsQuantity4],
91
+ quantity: 5,
92
+ pieces: 4,
93
+ };
94
+
95
+ const item2 = {
96
+ _id: '123',
97
+ itemId: '234',
98
+ modifiers: [laundryModMaxItemsQuantity4],
99
+ quantity: 5,
100
+ pieces: 4,
101
+ };
102
+
103
+ const item3 = {
104
+ _id: '567',
105
+ itemId: '567',
106
+ modifiers: [dryCleaningModNoAutoSplit],
107
+ quantity: 1000,
108
+ pieces: 2,
109
+ };
110
+
111
+ const item4 = {
112
+ _id: '444',
113
+ itemId: '444',
114
+ quantity: 1000,
115
+ modifiers: [tailorinModNoAutoSplit],
116
+ pieces: 2,
117
+ };
118
+
119
+ const subOrders = autoSplit({
120
+ parentOrder: {
121
+ items: [item1, item2, item3, item4],
122
+ status: {},
123
+ modifiers: [],
124
+ displayId: 1,
125
+ },
126
+ });
127
+
128
+ expect(subOrders.length).toEqual(7);
129
+ });
130
+
131
+ test('Auto split by department and Items Pieces', () => {
132
+ const { autoSplit } = pricingService.order;
133
+
134
+ const laundryModMaxItemsQuantity4 = {
135
+ ...laundryModNoAutoSplit,
136
+ properties: {
137
+ department: { autoSplit: true, maxItems: 2, splitUnit: 'pieces' },
138
+ },
139
+ };
140
+
141
+ // Mock item to compare
142
+ const item1 = {
143
+ _id: '123',
144
+ itemId: '234',
145
+ modifiers: [laundryModMaxItemsQuantity4],
146
+ quantity: 5,
147
+ pieces: 2,
148
+ };
149
+
150
+ const item2 = {
151
+ _id: '123',
152
+ itemId: '234',
153
+ modifiers: [laundryModMaxItemsQuantity4],
154
+ quantity: 5,
155
+ pieces: 2,
156
+ };
157
+
158
+ const item3 = {
159
+ _id: '567',
160
+ itemId: '567',
161
+ modifiers: [dryCleaningModNoAutoSplit],
162
+ quantity: 1000,
163
+ pieces: 2,
164
+ };
165
+
166
+ const item4 = {
167
+ _id: '444',
168
+ itemId: '444',
169
+ quantity: 1000,
170
+ modifiers: [tailorinModNoAutoSplit],
171
+ pieces: 2,
172
+ };
173
+
174
+ const subOrders = autoSplit({
175
+ parentOrder: {
176
+ items: [item1, item2, item3, item4],
177
+ status: {},
178
+ modifiers: [],
179
+ displayId: 1,
180
+ },
181
+ });
182
+
183
+ expect(subOrders.length).toEqual(12);
184
+ });
185
+
186
+ test('Auto split by department and Items Pieces 2', () => {
187
+ const { autoSplit } = pricingService.order;
188
+
189
+ const laundryModMaxItemsQuantity4 = {
190
+ ...laundryModNoAutoSplit,
191
+ properties: {
192
+ department: { autoSplit: true, maxItems: 6, splitUnit: 'pieces' },
193
+ },
194
+ };
195
+
196
+ const item1 = {
197
+ _id: '123',
198
+ itemId: '234',
199
+ modifiers: [laundryModMaxItemsQuantity4],
200
+ quantity: 10,
201
+ pieces: 2,
202
+ };
203
+
204
+ const subOrders = autoSplit({
205
+ parentOrder: {
206
+ items: [item1],
207
+ status: {},
208
+ modifiers: [],
209
+ displayId: 1,
210
+ },
211
+ });
212
+
213
+ expect(subOrders.length).toEqual(4);
214
+ expect(subOrders[0].items[0].quantity).toEqual(3);
215
+ expect(subOrders[1].items[0].quantity).toEqual(3);
216
+ expect(subOrders[2].items[0].quantity).toEqual(3);
217
+ expect(subOrders[3].items[0].quantity).toEqual(1);
218
+ });
219
+
220
+ test('Auto split by department and Items Pieces 3', () => {
221
+ const { autoSplit } = pricingService.order;
222
+
223
+ const laundryModMaxItemsQuantity4 = {
224
+ ...laundryModNoAutoSplit,
225
+ properties: {
226
+ department: { autoSplit: true, maxItems: 6, splitUnit: 'pieces' },
227
+ },
228
+ };
229
+
230
+ const item1 = {
231
+ _id: '123',
232
+ itemId: '234',
233
+ modifiers: [laundryModMaxItemsQuantity4],
234
+ quantity: 10,
235
+ pieces: 2,
236
+ };
237
+
238
+ const item2 = {
239
+ _id: '123',
240
+ itemId: '234',
241
+ modifiers: [tailorinModNoAutoSplit],
242
+ quantity: 5,
243
+ pieces: 2,
244
+ };
245
+
246
+ const item3 = {
247
+ _id: '567',
248
+ itemId: '567',
249
+ modifiers: [dryCleaningModNoAutoSplit],
250
+ quantity: 1000,
251
+ pieces: 2,
252
+ };
253
+
254
+ const subOrders = autoSplit({
255
+ parentOrder: {
256
+ items: [item1, item2, item3],
257
+ status: {},
258
+ modifiers: [],
259
+ displayId: 1,
260
+ },
261
+ });
262
+
263
+ expect(subOrders.length).toEqual(6);
264
+ expect(subOrders[0].items[0].quantity).toEqual(3);
265
+ expect(subOrders[1].items[0].quantity).toEqual(3);
266
+ expect(subOrders[2].items[0].quantity).toEqual(3);
267
+ expect(subOrders[3].items[0].quantity).toEqual(1);
268
+ expect(subOrders[4].items[0].quantity).toEqual(5);
269
+ expect(subOrders[5].items[0].quantity).toEqual(1000);
270
+ });
271
+
272
+ test('Auto split by department and Items Weight', () => {
273
+ const { autoSplit } = pricingService.order;
274
+
275
+ const laundryModMaxItems = {
276
+ ...laundryModNoAutoSplit,
277
+ properties: {
278
+ department: {
279
+ autoSplit: true,
280
+ maxItems: 100,
281
+ splitUnit: 'weight',
282
+ },
283
+ },
284
+ };
285
+
286
+ const item1 = {
287
+ _id: '123',
288
+ itemId: '234',
289
+ modifiers: [laundryModMaxItems],
290
+ quantity: 10,
291
+ pieces: 2,
292
+ weight: 30,
293
+ };
294
+
295
+ const subOrders = autoSplit({
296
+ parentOrder: {
297
+ items: [item1],
298
+ status: {},
299
+ modifiers: [],
300
+ displayId: 1,
301
+ },
302
+ });
303
+
304
+ expect(subOrders.length).toEqual(4);
305
+ expect(subOrders[0].items[0].quantity).toEqual(3);
306
+ expect(subOrders[1].items[0].quantity).toEqual(3);
307
+ expect(subOrders[2].items[0].quantity).toEqual(3);
308
+ expect(subOrders[3].items[0].quantity).toEqual(1);
309
+ });
310
+
311
+ test('Auto split by department and Items Weight 2', () => {
312
+ const { autoSplit } = pricingService.order;
313
+
314
+ const laundryModMaxItems = {
315
+ ...laundryModNoAutoSplit,
316
+ properties: {
317
+ department: {
318
+ autoSplit: true,
319
+ maxItems: 25,
320
+ splitUnit: 'weight',
321
+ },
322
+ },
323
+ };
324
+
325
+ const item1 = {
326
+ _id: '123',
327
+ itemId: '234',
328
+ modifiers: [laundryModMaxItems],
329
+ quantity: 1,
330
+ pieces: 2,
331
+ weight: 25,
332
+ };
333
+
334
+ const item2 = {
335
+ _id: '322',
336
+ itemId: '4555',
337
+ modifiers: [laundryModMaxItems],
338
+ quantity: 1,
339
+ pieces: 2,
340
+ weight: 25,
341
+ };
342
+
343
+ const subOrders = autoSplit({
344
+ parentOrder: {
345
+ items: [item1, item2],
346
+ status: {},
347
+ modifiers: [],
348
+ displayId: 1,
349
+ },
350
+ });
351
+
352
+ expect(subOrders.length).toEqual(2);
353
+ expect(subOrders[0].items[0].quantity).toEqual(1);
354
+ expect(subOrders[1].items[0].quantity).toEqual(1);
355
+ });
356
+ });
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function getItemsTotalPieces(items) {
3
+ return items.reduce(
4
+ (total, item) => total + actions.getTotalQuantity(item),
5
+ 0
6
+ );
7
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ actions }) =>
2
+ function getItemsTotalWeight(items) {
3
+ return items.reduce(
4
+ (total, item) => total + actions.getTotalWeight(item),
5
+ 0
6
+ );
7
+ };
@@ -2,6 +2,6 @@ module.exports = ({ utils }) => {
2
2
  const { math } = utils;
3
3
  return function getTotalPieces(item) {
4
4
  if (!item) return 0;
5
- return math.mul(item.quantity || 1, item.pieces || 1);
5
+ return math.mul(item.quantity || 0, item.pieces || 0);
6
6
  };
7
7
  };
@@ -0,0 +1,5 @@
1
+ module.exports = () =>
2
+ function getQuantity(item) {
3
+ if (!item || !item.quantity) return 0;
4
+ return item.quantity;
5
+ };
@@ -0,0 +1,7 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+ return function getTotalWeight(item) {
4
+ if (!item) return 0;
5
+ return math.mul(item.quantity || 0, item.weight || 0);
6
+ };
7
+ };
package/lib/item/index.js CHANGED
@@ -1,5 +1,9 @@
1
1
  const getItemsTotalPieces = require('./getItemsTotalPieces');
2
2
  const getTotalPieces = require('./getTotalPieces');
3
+ const getItemsTotalQuantity = require('./getItemsTotalQuantity');
4
+ const getTotalQuantity = require('./getTotalQuantity');
5
+ const getItemsTotalWeight = require('./getItemsTotalWeight');
6
+ const getTotalWeight = require('./getTotalWeight');
3
7
  const removeModifier = require('./removeModifier');
4
8
  const removeModifiers = require('./removeModifiers');
5
9
  const findOriginalItem = require('./findOriginalItem');
@@ -45,6 +49,10 @@ const itemActions = (deps = {}) => {
45
49
  };
46
50
 
47
51
  const freezedActions = Object.freeze({
52
+ getItemsTotalWeight: getItemsTotalWeight(innerDeps),
53
+ getTotalWeight: getTotalWeight(innerDeps),
54
+ getItemsTotalQuantity: getItemsTotalQuantity(innerDeps),
55
+ getTotalQuantity: getTotalQuantity(innerDeps),
48
56
  getItemsTotalPieces: getItemsTotalPieces(innerDeps),
49
57
  getTotalPieces: getTotalPieces(innerDeps),
50
58
  removeModifier: removeModifier(innerDeps),
@@ -76,7 +76,6 @@ const hasModifier = require('./hasModifier');
76
76
  const hasRelatedItems = require('./hasRelatedItems');
77
77
  const hasFixedModifier = require('./hasFixedModifier');
78
78
  const hasCreditModifier = require('./hasCreditModifier');
79
- const includePiecesInQuantity = require('./includePiecesInQuantity');
80
79
  const includesInGroup = require('./includesInGroup');
81
80
  const isTrackUsageSubscription = require('./isTrackUsageSubscription');
82
81
  const isDirect = require('./isDirect');
@@ -218,7 +217,6 @@ const modifierActions = (deps = {}) => {
218
217
  hasAttributes: hasAttributes(innerDeps),
219
218
  hasFixedModifier: hasFixedModifier(innerDeps),
220
219
  hasCreditModifier: hasCreditModifier(innerDeps),
221
- includePiecesInQuantity: includePiecesInQuantity(innerDeps),
222
220
  includesInGroup: includesInGroup(innerDeps),
223
221
  isTrackUsageSubscription: isTrackUsageSubscription(innerDeps),
224
222
  isDirect: isDirect(innerDeps),
@@ -80,6 +80,9 @@ module.exports = ({ utils, _, itemActions, modifierActions, settings }) => {
80
80
  return (deps.length && deps[0].name) || 'other';
81
81
  };
82
82
 
83
+ const isSplitByPieces = splitUnit => splitUnit === 'pieces';
84
+ const isSplitByWeight = splitUnit => splitUnit === 'weight';
85
+
83
86
  return function splitByDepartments(order) {
84
87
  const { items } = order;
85
88
  const itemsByDepartments = _.groupBy(items, getDepartmentName);
@@ -94,11 +97,37 @@ module.exports = ({ utils, _, itemActions, modifierActions, settings }) => {
94
97
  const departmentName = getDepartmentName(newItems[0]);
95
98
  const maxItems = modifierActions.getDepartmentMaxItems(department);
96
99
 
97
- if (
98
- department &&
99
- maxItems &&
100
- itemActions.getItemsTotalPieces(newItems) > maxItems
101
- ) {
100
+ const autoSplit = _.get(
101
+ department || {},
102
+ 'properties.department.autoSplit',
103
+ false
104
+ );
105
+
106
+ const splitUnit = _.get(
107
+ department || {},
108
+ 'properties.department.splitUnit',
109
+ 'quantity'
110
+ );
111
+
112
+ const getItemsTotalCount = itemsParam => {
113
+ if (isSplitByPieces(splitUnit))
114
+ return itemActions.getItemsTotalPieces(itemsParam);
115
+ if (isSplitByWeight(splitUnit))
116
+ return itemActions.getItemsTotalWeight(itemsParam);
117
+ return itemActions.getItemsTotalQuantity(itemsParam);
118
+ };
119
+
120
+ const getItemTotalCount = itemParam => {
121
+ if (isSplitByPieces(splitUnit))
122
+ return itemActions.getTotalPieces(itemParam);
123
+ if (isSplitByWeight(splitUnit))
124
+ return itemActions.getTotalWeight(itemParam);
125
+ return itemActions.getTotalQuantity(itemParam);
126
+ };
127
+
128
+ const totalCount = getItemsTotalCount(newItems);
129
+
130
+ if (department && autoSplit && maxItems && totalCount > maxItems) {
102
131
  newItems.forEach(newItem => {
103
132
  for (let j = 0; j < newItem.quantity; j += 1) {
104
133
  const item = {
@@ -106,11 +135,12 @@ module.exports = ({ utils, _, itemActions, modifierActions, settings }) => {
106
135
  quantity: 1,
107
136
  _id: helpers.getObjectID(),
108
137
  };
109
- const totalPieces = itemActions.getTotalPieces(item);
138
+ const totalCountPerItem = getItemTotalCount(item);
139
+
110
140
  const index = splitOrders.findIndex(
111
141
  newOrder =>
112
142
  newOrder.items &&
113
- itemActions.getItemsTotalPieces(newOrder.items) + totalPieces <=
143
+ getItemsTotalCount(newOrder.items) + totalCountPerItem <=
114
144
  maxItems &&
115
145
  departmentName === getDepartmentName(newOrder.items[0])
116
146
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -36,5 +36,5 @@
36
36
  "supertest": "^6.2.3",
37
37
  "supervisor": "^0.12.0"
38
38
  },
39
- "gitHead": "5c5b8c5f55437733d8f9d8f9bbba00d27a6f7c59"
39
+ "gitHead": "fed12242f23f92ff8cad9122afd770e6569f627a"
40
40
  }
@@ -1,10 +0,0 @@
1
- module.exports = () =>
2
- function includePiecesInQuantity(modifier) {
3
- return (
4
- (modifier &&
5
- modifier.properties &&
6
- modifier.properties.department &&
7
- modifier.properties.department.includePieces) ||
8
- false
9
- );
10
- };