@darkpos/pricing 1.0.13 → 1.0.14

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,14 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+
4
+ return function getCreditModifiersTotal(modifiers) {
5
+ if (!Array.isArray(modifiers)) return 0;
6
+
7
+ const creditModifiers = modifiers.filter(mod => mod.type === 'credit');
8
+
9
+ return creditModifiers.reduce(
10
+ (acc, modifier) => math.add(acc, modifier.properties.maxAmount || 0),
11
+ 0
12
+ );
13
+ };
14
+ };
@@ -0,0 +1,16 @@
1
+ module.exports = ({ utils }) => {
2
+ const { math } = utils;
3
+
4
+ return function getFixedModifiersTotal(modifiers) {
5
+ if (!Array.isArray(modifiers)) return 0;
6
+
7
+ const fixedModifiers = modifiers.filter(
8
+ mod => mod.compute.type === 'fixed'
9
+ );
10
+
11
+ return fixedModifiers.reduce(
12
+ (acc, modifier) => math.add(acc, modifier.compute.amount || 0),
13
+ 0
14
+ );
15
+ };
16
+ };
@@ -1,5 +1,61 @@
1
1
  module.exports = ({ utils }) => {
2
2
  const { math, helpers } = utils;
3
+
4
+ const divideModifierAmount = ({
5
+ totalOriginOrder,
6
+ modifierAmount,
7
+ totalSplitedOrder,
8
+ }) =>
9
+ totalOriginOrder
10
+ ? math.div(
11
+ math.mul(modifierAmount, totalSplitedOrder || 0),
12
+ totalOriginOrder
13
+ )
14
+ : 0;
15
+
16
+ const splitCreditModifier = ({
17
+ modifier,
18
+ totalOriginOrder,
19
+ totalSplitedOrder,
20
+ }) => {
21
+ const maxAmount = divideModifierAmount({
22
+ modifierAmount: modifier.properties.maxAmount,
23
+ totalOriginOrder,
24
+ totalSplitedOrder,
25
+ });
26
+ return {
27
+ ...modifier,
28
+ compute: {
29
+ ...modifier.compute,
30
+ _id: helpers.getObjectID(),
31
+ },
32
+ properties: {
33
+ ...modifier.properties,
34
+ maxAmount,
35
+ },
36
+ };
37
+ };
38
+
39
+ const splitFixedModifier = ({
40
+ modifier,
41
+ totalOriginOrder,
42
+ totalSplitedOrder,
43
+ }) => {
44
+ const amount = divideModifierAmount({
45
+ modifierAmount: modifier.compute.amount,
46
+ totalOriginOrder,
47
+ totalSplitedOrder,
48
+ });
49
+ return {
50
+ ...modifier,
51
+ compute: {
52
+ ...modifier.compute,
53
+ _id: helpers.getObjectID(),
54
+ amount,
55
+ },
56
+ };
57
+ };
58
+
3
59
  return function getSplittedModifiers(
4
60
  modifiers,
5
61
  totalOriginOrder,
@@ -7,22 +63,25 @@ module.exports = ({ utils }) => {
7
63
  ) {
8
64
  return modifiers.map(each => {
9
65
  const modifier = { ...each };
10
- const { compute = {} } = modifier;
11
- if (compute.type === 'fixed' && compute.amount) {
12
- const amount = totalOriginOrder
13
- ? math.div(
14
- math.mul(compute.amount, totalSplitedOrder || 0),
15
- totalOriginOrder
16
- )
17
- : 0;
18
- return {
19
- ...modifier,
20
- _id: helpers.getObjectID(),
21
- compute: {
22
- ...compute,
23
- amount,
24
- },
25
- };
66
+
67
+ if (modifier.type === 'credit') {
68
+ return splitCreditModifier({
69
+ modifier,
70
+ totalOriginOrder,
71
+ totalSplitedOrder,
72
+ });
73
+ }
74
+
75
+ if (
76
+ modifier.compute &&
77
+ modifier.compute.type === 'fixed' &&
78
+ modifier.compute.amount
79
+ ) {
80
+ return splitFixedModifier({
81
+ modifier,
82
+ totalOriginOrder,
83
+ totalSplitedOrder,
84
+ });
26
85
  }
27
86
  return modifier;
28
87
  });
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function hasFixedModifier(modifiers) {
3
+ return modifiers.some(mod => mod.type === 'credit');
4
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = () =>
2
+ function hasFixedModifier(modifiers) {
3
+ return modifiers.some(mod => mod.compute && mod.compute.type === 'fixed');
4
+ };
@@ -61,6 +61,8 @@ const getSplittedModifiers = require('./getSplittedModifiers');
61
61
  const getSuggestion = require('./getSuggestion');
62
62
  const getUnhiddenModifiers = require('./getUnhiddenModifiers');
63
63
  const getUsingCount = require('./getUsingCount');
64
+ const getFixedModifiersTotal = require('./getFixedModifiersTotal');
65
+ const getCreditModifiersTotal = require('./getCreditModifiersTotal');
64
66
  const hasAddModifiers = require('./hasAddModifiers');
65
67
  const hasAllTag = require('./hasAllTag');
66
68
  const hasAttribute = require('./hasAttribute');
@@ -70,6 +72,8 @@ const hasDisplayPrompt = require('./hasDisplayPrompt');
70
72
  const hasMatchTags = require('./hasMatchTags');
71
73
  const hasModifier = require('./hasModifier');
72
74
  const hasRelatedItems = require('./hasRelatedItems');
75
+ const hasFixedModifier = require('./hasFixedModifier');
76
+ const hasCreditModifier = require('./hasCreditModifier');
73
77
  const includePiecesInQuantity = require('./includePiecesInQuantity');
74
78
  const includesInGroup = require('./includesInGroup');
75
79
  const isTrackUsageSubscription = require('./isTrackUsageSubscription');
@@ -184,6 +188,8 @@ const modifierActions = (deps = {}) => {
184
188
  getSuggestion: getSuggestion(innerDeps),
185
189
  getUnhiddenModifiers: getUnhiddenModifiers(innerDeps),
186
190
  getUsingCount: getUsingCount(innerDeps),
191
+ getFixedModifiersTotal: getFixedModifiersTotal(innerDeps),
192
+ getCreditModifiersTotal: getCreditModifiersTotal(innerDeps),
187
193
  hasAddModifiers: hasAddModifiers(innerDeps),
188
194
  hasAllTag: hasAllTag(innerDeps),
189
195
  hasNoTags: hasNoTags(innerDeps),
@@ -194,6 +200,8 @@ const modifierActions = (deps = {}) => {
194
200
  hasRelatedItems: hasRelatedItems(innerDeps),
195
201
  hasAttribute: hasAttribute(innerDeps),
196
202
  hasAttributes: hasAttributes(innerDeps),
203
+ hasFixedModifier: hasFixedModifier(innerDeps),
204
+ hasCreditModifier: hasCreditModifier(innerDeps),
197
205
  includePiecesInQuantity: includePiecesInQuantity(innerDeps),
198
206
  includesInGroup: includesInGroup(innerDeps),
199
207
  isTrackUsageSubscription: isTrackUsageSubscription(innerDeps),
@@ -0,0 +1,34 @@
1
+ module.exports = ({ utils, actions, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function adjustCreditModifiersDifference({ subOrders, difference }) {
5
+ const selectedSubOrderIndex = subOrders.findIndex(
6
+ subOrder =>
7
+ modifierActions.hasCreditModifier(subOrder.modifiers) &&
8
+ actions.isOpen(subOrder) &&
9
+ subOrder.total > difference
10
+ );
11
+
12
+ if (selectedSubOrderIndex !== -1) {
13
+ const subOrderToUpdate = {
14
+ ...subOrders[selectedSubOrderIndex],
15
+ };
16
+ const modifierToUpdateIdx = subOrderToUpdate.modifiers.findIndex(
17
+ mod => mod.type === 'credit'
18
+ );
19
+ const prevAmount =
20
+ subOrderToUpdate.modifiers[modifierToUpdateIdx].properties.maxAmount;
21
+
22
+ subOrderToUpdate.modifiers[modifierToUpdateIdx].properties.maxAmount =
23
+ math.add(prevAmount, difference);
24
+
25
+ subOrders.splice(
26
+ selectedSubOrderIndex,
27
+ 1,
28
+ actions.calculate(subOrderToUpdate)
29
+ );
30
+ }
31
+
32
+ return subOrders;
33
+ };
34
+ };
@@ -0,0 +1,36 @@
1
+ module.exports = ({ utils, actions, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function adjustFixedModifiersDifference({ subOrders, difference }) {
5
+ const selectedSubOrderIndex = subOrders.findIndex(
6
+ subOrder =>
7
+ modifierActions.hasFixedModifier(subOrder.modifiers) &&
8
+ actions.isOpen(subOrder) &&
9
+ subOrder.total > difference
10
+ );
11
+
12
+ if (selectedSubOrderIndex !== -1) {
13
+ const subOrderToUpdate = {
14
+ ...subOrders[selectedSubOrderIndex],
15
+ };
16
+
17
+ const modifierToUpdateIdx = subOrderToUpdate.modifiers.findIndex(
18
+ mod => mod.compute.type === 'fixed'
19
+ );
20
+ const prevAmount =
21
+ subOrderToUpdate.modifiers[modifierToUpdateIdx].compute.amount;
22
+
23
+ subOrderToUpdate.modifiers[modifierToUpdateIdx].compute.amount = math.add(
24
+ prevAmount,
25
+ difference
26
+ );
27
+ subOrders.splice(
28
+ selectedSubOrderIndex,
29
+ 1,
30
+ actions.calculate(subOrderToUpdate)
31
+ );
32
+ }
33
+
34
+ return subOrders;
35
+ };
36
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = ({ utils, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function getCreditModifiersTotal(orders) {
5
+ if (!Array.isArray(orders)) return 0;
6
+ return orders.reduce(
7
+ (acc, subOrder) =>
8
+ math.add(
9
+ acc,
10
+ modifierActions.getCreditModifiersTotal(subOrder.modifiers)
11
+ ),
12
+ 0
13
+ );
14
+ };
15
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = ({ utils, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function getFixedModifiersTotal(orders) {
5
+ if (!Array.isArray(orders)) return 0;
6
+ return orders.reduce(
7
+ (acc, subOrder) =>
8
+ math.add(
9
+ acc,
10
+ modifierActions.getFixedModifiersTotal(subOrder.modifiers)
11
+ ),
12
+ 0
13
+ );
14
+ };
15
+ };
@@ -72,6 +72,14 @@ const getScheduleByCustomer = require('./getScheduleByCustomer');
72
72
  const pickEndDate = require('./pickEndDate');
73
73
  const getAppliedCredit = require('./getAppliedCredit');
74
74
  const addCreditModifier = require('./addCreditModifier');
75
+ const adjustCreditModifiersDifference = require('./adjustCreditModifiersDifference');
76
+ const adjustFixedModifiersDifference = require('./adjustFixedModifiersDifference');
77
+ const getCreditModifiersTotal = require('./getCreditModifiersTotal');
78
+ const getFixedModifiersTotal = require('./getFixedModifiersTotal');
79
+ const splitAndCalculate = require('./splitAndCalculate');
80
+ const spreadModifiers = require('./spreadModifiers');
81
+ const validateCreditModifiersTotal = require('./validateCreditModifiersTotal');
82
+ const validateFixedModifiersTotal = require('./validateFixedModifiersTotal');
75
83
 
76
84
  const orderActions = (deps = {}) => {
77
85
  const actions = {};
@@ -156,6 +164,14 @@ const orderActions = (deps = {}) => {
156
164
  pickEndDate: pickEndDate(innerDeps),
157
165
  getAppliedCredit: getAppliedCredit(innerDeps),
158
166
  addCreditModifier: addCreditModifier(innerDeps),
167
+ adjustCreditModifiersDifference: adjustCreditModifiersDifference(innerDeps),
168
+ adjustFixedModifiersDifference: adjustFixedModifiersDifference(innerDeps),
169
+ getCreditModifiersTotal: getCreditModifiersTotal(innerDeps),
170
+ getFixedModifiersTotal: getFixedModifiersTotal(innerDeps),
171
+ splitAndCalculate: splitAndCalculate(innerDeps),
172
+ spreadModifiers: spreadModifiers(innerDeps),
173
+ validateCreditModifiersTotal: validateCreditModifiersTotal(innerDeps),
174
+ validateFixedModifiersTotal: validateFixedModifiersTotal(innerDeps),
159
175
  });
160
176
 
161
177
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,16 @@
1
+ module.exports = ({ actions, modifierActions }) =>
2
+ function splitAndCalculate({ parentOrder, subOrders }) {
3
+ if (!parentOrder || !Array.isArray(subOrders)) return [];
4
+ return subOrders.map(each => {
5
+ const { subTotal } = actions.calculate(each);
6
+ const newOrder = {
7
+ ...each,
8
+ modifiers: modifierActions.getSplittedModifiers(
9
+ parentOrder.modifiers,
10
+ parentOrder.subTotal,
11
+ subTotal
12
+ ),
13
+ };
14
+ return actions.calculate(newOrder);
15
+ });
16
+ };
@@ -1,13 +1,13 @@
1
1
  module.exports = ({
2
2
  utils,
3
3
  _,
4
+ actions,
4
5
  itemActions,
5
6
  modifierActions,
6
- actions,
7
7
  settings,
8
8
  }) => {
9
9
  const orderSettings = _.get(settings, 'order');
10
- const { date, math, helpers } = utils;
10
+ const { date, helpers } = utils;
11
11
  const noteDefaults = {
12
12
  message: '',
13
13
  attributes: [],
@@ -17,25 +17,6 @@ module.exports = ({
17
17
  __typename: 'Note',
18
18
  };
19
19
 
20
- const getSplitModifiers = (modifiers, totalOriginOrder, totalSplitedOrder) =>
21
- modifiers.map(each => {
22
- const modifier = { ...each };
23
- if (modifier.type === 'fixed' && modifier.amount) {
24
- const amount = totalOriginOrder
25
- ? math.div(
26
- math.mul(modifier.amount, totalSplitedOrder || 0),
27
- totalOriginOrder
28
- )
29
- : 0;
30
- return {
31
- ...modifier,
32
- _id: helpers.getObjectID(),
33
- amount,
34
- };
35
- }
36
- return modifier;
37
- });
38
-
39
20
  const joinItemQuantity = orders =>
40
21
  orders.map(order => {
41
22
  const items = order.items.reduce((arr, item) => {
@@ -67,29 +48,29 @@ module.exports = ({
67
48
 
68
49
  const getOrder =
69
50
  ({ order, name }) =>
70
- (items, index) => {
71
- let displayId = '';
72
- if (orderSettings.allowSuborder)
73
- displayId = `${order.displayId}-${index}`;
74
- else if (index === 1) displayId = order.displayId;
75
- return {
76
- ...order,
77
- _id: helpers.getObjectID(),
78
- displayId,
79
- discount: 0,
80
- tax: 0,
81
- parentId: orderSettings.allowSuborder ? order._id : null,
82
- items,
83
- modifiers: [],
84
- notes: [
85
- ...(order.notes || []),
86
- {
87
- ...noteDefaults,
88
- message: `Split from ${order.displayId}, for department ${name}`,
89
- },
90
- ],
51
+ (items, index) => {
52
+ let displayId = '';
53
+ if (orderSettings.allowSuborder)
54
+ displayId = `${order.displayId}-${index}`;
55
+ else if (index === 1) displayId = order.displayId;
56
+ return {
57
+ ...order,
58
+ _id: helpers.getObjectID(),
59
+ displayId,
60
+ discount: 0,
61
+ tax: 0,
62
+ parentId: orderSettings.allowSuborder ? order._id : null,
63
+ items,
64
+ modifiers: [],
65
+ notes: [
66
+ ...(order.notes || []),
67
+ {
68
+ ...noteDefaults,
69
+ message: `Split from ${order.displayId}, for department ${name}`,
70
+ },
71
+ ],
72
+ };
91
73
  };
92
- };
93
74
 
94
75
  const getDepartmentName = item => {
95
76
  const deps = itemActions.getDepartmentModifiers(item);
@@ -127,7 +108,7 @@ module.exports = ({
127
108
  newOrder =>
128
109
  newOrder.items &&
129
110
  itemActions.getItemsTotalPieces(newOrder.items) + totalPieces <=
130
- maxItems &&
111
+ maxItems &&
131
112
  departmentName === getDepartmentName(newOrder.items[0])
132
113
  );
133
114
  if (index > -1) splitOrders[index].items.push(item);
@@ -139,13 +120,11 @@ module.exports = ({
139
120
 
140
121
  splitOrders = joinItemQuantity(splitOrders);
141
122
 
142
- return splitOrders.map(each => {
143
- const { subTotal } = actions.calculate(each);
144
- const newOrder = {
145
- ...each,
146
- modifiers: getSplitModifiers(order.modifiers, order.subTotal, subTotal),
147
- };
148
- return actions.calculate(newOrder);
123
+ splitOrders = actions.spreadModifiers({
124
+ parentOrder: order,
125
+ subOrders: splitOrders,
149
126
  });
127
+
128
+ return splitOrders;
150
129
  };
151
130
  };
@@ -0,0 +1,21 @@
1
+ module.exports = ({ actions }) =>
2
+ function spreadModifiers({ parentOrder, subOrders }) {
3
+ let subOrdersWithCalculatedModifiers = actions.splitAndCalculate({
4
+ parentOrder,
5
+ subOrders,
6
+ });
7
+
8
+ // Validation
9
+
10
+ subOrdersWithCalculatedModifiers = actions.validateFixedModifiersTotal({
11
+ parentOrder,
12
+ subOrders: [...subOrdersWithCalculatedModifiers],
13
+ });
14
+
15
+ subOrdersWithCalculatedModifiers = actions.validateCreditModifiersTotal({
16
+ parentOrder,
17
+ subOrders: [...subOrdersWithCalculatedModifiers],
18
+ });
19
+
20
+ return subOrdersWithCalculatedModifiers;
21
+ };
@@ -0,0 +1,23 @@
1
+ module.exports = ({ utils, actions, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function validateCreditModifiersTotal({ parentOrder, subOrders }) {
5
+ const creditModifiersTotalAmount = modifierActions.getCreditModifiersTotal(
6
+ parentOrder.modifiers
7
+ );
8
+ const subOrdersCreditModifiersTotalAmount =
9
+ actions.getCreditModifiersTotal(subOrders);
10
+
11
+ if (creditModifiersTotalAmount !== subOrdersCreditModifiersTotalAmount) {
12
+ return actions.adjustCreditModifiersDifference({
13
+ subOrders: [...subOrders],
14
+ difference: math.sub(
15
+ creditModifiersTotalAmount,
16
+ subOrdersCreditModifiersTotalAmount
17
+ ),
18
+ });
19
+ }
20
+
21
+ return subOrders;
22
+ };
23
+ };
@@ -0,0 +1,23 @@
1
+ module.exports = ({ utils, actions, modifierActions }) => {
2
+ const { math } = utils;
3
+
4
+ return function validateFixedModifiersTotal({ parentOrder, subOrders }) {
5
+ const fixedModifiersTotalAmount = modifierActions.getFixedModifiersTotal(
6
+ parentOrder.modifiers
7
+ );
8
+ const subOrdersFixedModifiersTotalAmount =
9
+ actions.getFixedModifiersTotal(subOrders);
10
+
11
+ if (fixedModifiersTotalAmount !== subOrdersFixedModifiersTotalAmount) {
12
+ return actions.adjustFixedModifiersDifference({
13
+ subOrders: [...subOrders],
14
+ difference: math.sub(
15
+ fixedModifiersTotalAmount,
16
+ subOrdersFixedModifiersTotalAmount
17
+ ),
18
+ });
19
+ }
20
+
21
+ return subOrders;
22
+ };
23
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -35,5 +35,5 @@
35
35
  "supertest": "^6.2.3",
36
36
  "supervisor": "^0.12.0"
37
37
  },
38
- "gitHead": "e70158333e19e0d6106cb2db4efe0a25842c323b"
38
+ "gitHead": "67ed395c1d86589b37c5adcb74606a8db7423536"
39
39
  }