@darkpos/pricing 1.0.3 → 1.0.6

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 (123) hide show
  1. package/.eslintrc +22 -0
  2. package/README.md +110 -4
  3. package/__TEST__/item.test.js +285 -0
  4. package/__TEST__/order.test.js +234 -0
  5. package/index.js +1 -0
  6. package/lib/constants/index.js +5 -0
  7. package/lib/constants/status.js +39 -0
  8. package/lib/index.js +36 -9
  9. package/lib/item/addIndirectModifier.js +55 -0
  10. package/lib/item/calculate.js +108 -0
  11. package/lib/item/create.js +35 -0
  12. package/lib/item/filterByDirectModifiers.js +13 -0
  13. package/lib/item/findOriginalItem.js +8 -0
  14. package/lib/item/getBalanceToPay.js +12 -0
  15. package/lib/item/getDepartmentModifiers.js +5 -0
  16. package/lib/item/getDiscountModifiers.js +7 -0
  17. package/lib/item/getItemModifiers.js +16 -0
  18. package/lib/item/getItemModifiersDescription.js +22 -0
  19. package/lib/item/getItemPrice.js +57 -0
  20. package/lib/item/getItemsTotalPaid.js +9 -0
  21. package/lib/item/getItemsTotalPieces.js +7 -0
  22. package/lib/item/getNotIncludedModifiers.js +11 -0
  23. package/lib/item/getParentItem.js +5 -0
  24. package/lib/item/getPendingIndex.js +5 -0
  25. package/lib/item/getTotal.js +8 -0
  26. package/lib/item/getTotalPieces.js +7 -0
  27. package/lib/item/getTotals.js +25 -0
  28. package/lib/item/hasCreateSubscription.js +7 -0
  29. package/lib/item/hasModifier.js +15 -0
  30. package/lib/item/hasModifierWithValue.js +11 -0
  31. package/lib/item/hasModifiers.js +9 -0
  32. package/lib/item/hasSubscription.js +5 -0
  33. package/lib/item/index.js +80 -4
  34. package/lib/item/isParentIncluded.js +4 -0
  35. package/lib/item/isRelatedItem.js +4 -0
  36. package/lib/item/isSelected.js +13 -0
  37. package/lib/item/openRecommendationDialog.js +4 -0
  38. package/lib/item/removeModifier.js +84 -0
  39. package/lib/item/removeModifierById.js +8 -0
  40. package/lib/item/removeModifiers.js +14 -0
  41. package/lib/order/addCreditModifier.js +27 -0
  42. package/lib/order/addDiscountModifier.js +9 -0
  43. package/lib/order/addItem.js +292 -0
  44. package/lib/order/addItemModifier.js +214 -0
  45. package/lib/order/addModifier.js +9 -0
  46. package/lib/order/addModifierToAllItems.js +16 -0
  47. package/lib/order/addNote.js +25 -0
  48. package/lib/order/addTable.js +11 -0
  49. package/lib/order/calculate.js +105 -0
  50. package/lib/order/calculateDue.js +15 -0
  51. package/lib/order/calculateOrdersDue.js +26 -0
  52. package/lib/order/canSplit.js +4 -0
  53. package/lib/order/changeEndDate.js +15 -0
  54. package/lib/order/changeLocation.js +20 -0
  55. package/lib/order/changeStartDate.js +14 -0
  56. package/lib/order/combineSubOrders.js +14 -0
  57. package/lib/order/containsSerial.js +5 -0
  58. package/lib/order/create.js +67 -0
  59. package/lib/order/createParent.js +9 -0
  60. package/lib/order/duplicateItem.js +16 -0
  61. package/lib/order/findItemIndex.js +6 -0
  62. package/lib/order/getAppliedCredit.js +5 -0
  63. package/lib/order/getBalance.js +9 -0
  64. package/lib/order/getCustomer.js +4 -0
  65. package/lib/order/getCustomerStoreCredit.js +14 -0
  66. package/lib/order/getCustomerSubscriptions.js +8 -0
  67. package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
  68. package/lib/order/getDepartmentModifiers.js +9 -0
  69. package/lib/order/getEndDate.js +6 -0
  70. package/lib/order/getItemByItemId.js +6 -0
  71. package/lib/order/getItemIndex.js +9 -0
  72. package/lib/order/getItemsToPay.js +17 -0
  73. package/lib/order/getMenuItemsByCustomer.js +19 -0
  74. package/lib/order/getNumberOfItems.js +12 -0
  75. package/lib/order/getOrdersPieces.js +10 -0
  76. package/lib/order/getPendingItemIndex.js +5 -0
  77. package/lib/order/getRelatedItems.js +11 -0
  78. package/lib/order/getSameItems.js +14 -0
  79. package/lib/order/getScheduleByCustomer.js +20 -0
  80. package/lib/order/getScreenCustomerNotes.js +12 -0
  81. package/lib/order/getSelectedItem.js +6 -0
  82. package/lib/order/getStartDate.js +4 -0
  83. package/lib/order/getTip.js +10 -0
  84. package/lib/order/getTotalPieces.js +17 -0
  85. package/lib/order/getTotals.js +28 -0
  86. package/lib/order/hasAggregate.js +20 -0
  87. package/lib/order/hasItem.js +7 -0
  88. package/lib/order/hasRemainingSubscription.js +67 -0
  89. package/lib/order/hold.js +12 -0
  90. package/lib/order/index.js +167 -4
  91. package/lib/order/isDetailed.js +4 -0
  92. package/lib/order/isHold.js +4 -0
  93. package/lib/order/isNew.js +4 -0
  94. package/lib/order/isOpen.js +4 -0
  95. package/lib/order/isParent.js +7 -0
  96. package/lib/order/merge.js +96 -0
  97. package/lib/order/open.js +11 -0
  98. package/lib/order/pickEndDate.js +70 -0
  99. package/lib/order/removeApplyModifier.js +24 -0
  100. package/lib/order/removeDiscountModifier.js +16 -0
  101. package/lib/order/removeItem.js +56 -0
  102. package/lib/order/removeItemByIndex.js +5 -0
  103. package/lib/order/removeItemModifier.js +69 -0
  104. package/lib/order/removeModifier.js +21 -0
  105. package/lib/order/removeModifierByAttribute.js +23 -0
  106. package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
  107. package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
  108. package/lib/order/setCustomer.js +50 -0
  109. package/lib/order/splitByDepartments.js +151 -0
  110. package/lib/order/toggleModifier.js +9 -0
  111. package/lib/order/updateItem.js +8 -0
  112. package/lib/order/updateItemQuantity.js +35 -0
  113. package/lib/order/void.js +11 -0
  114. package/package.json +20 -23
  115. package/lib/item/actions.js +0 -135
  116. package/lib/modifier/actions.js +0 -163
  117. package/lib/modifier/constants.js +0 -46
  118. package/lib/modifier/index.js +0 -8
  119. package/lib/order/actions.js +0 -47
  120. package/lib/utils/defaultPrices.js +0 -10
  121. package/lib/utils/helpers.js +0 -26
  122. package/lib/utils/index.js +0 -9
  123. package/lib/utils/math.js +0 -71
@@ -1,163 +0,0 @@
1
- const { math, applyQuantity, defaultPrices, objId } = require('../utils');
2
- const constants = require('./constants');
3
-
4
- /**
5
- * If Modifier has an attribute
6
- */
7
- const _hasAttribute = (modifier = {}, attribute) => {
8
- if (!Array.isArray(modifier.attributes)) return false;
9
- const { attributes = [] } = modifier;
10
- return attributes.includes(attribute);
11
- };
12
-
13
- //
14
- const _getNonOrderOverrideModifiers = (modifiers = []) =>
15
- modifiers.filter(
16
- modifier =>
17
- !_hasAttribute(modifier, constants.attributes.order) && modifier.action !== 'override'
18
- );
19
-
20
- //
21
- const _getTotalOverrideModifier = (modifiers = []) =>
22
- modifiers.find(modifier => _hasAttribute(modifier, constants.attributes.modifierTotalOverride));
23
-
24
- //
25
- const _getDistributedModifiers = (modifiers = []) =>
26
- modifiers.filter(modifier => _hasAttribute(modifier, constants.attributes.distributed));
27
-
28
- /**
29
- * create a distrubuted Modifier based on Order and Item
30
- */
31
- const _createDistributedModifier = (order, item, modifier) => {
32
- let { attributes } = modifier;
33
-
34
- if (!attributes.includes(constants.attributes.distributed))
35
- attributes = [...(modifier.attributes || []), constants.attributes.distributed];
36
-
37
- let modifierAmount = 0;
38
-
39
- if (modifier.type === 'percentage')
40
- modifierAmount = math.div(math.mul(order.total, modifier.amount), 100);
41
- else ({ amount: modifierAmount } = modifier);
42
-
43
- const amountToApply = math.div(math.mul(modifierAmount, item.total), order.total, item.quantity);
44
- return {
45
- _id: objId(),
46
- ...modifier,
47
- type: 'fixed',
48
- attributes: attributes.filter(a => a !== constants.order),
49
- amount: amountToApply,
50
- };
51
- };
52
-
53
- /**
54
- * Get Description of a modifier based on its fields
55
- */
56
- const _getDescription = modifier => {
57
- const { name, amount, properties = {}, action } = modifier;
58
-
59
- if (
60
- _hasAttribute(modifier, constants.attributes.list) &&
61
- properties.selectedValue &&
62
- Array.isArray(properties.selectedValue)
63
- )
64
- return properties.selectedValue.join(', ');
65
-
66
- const symbol = constants.symbols[action];
67
- const amountStr = math.gt(amount, 0)
68
- ? `(${[symbol, math.toFixed(amount)].filter(Boolean).join('')})`
69
- : null;
70
- const description = [name, amountStr].filter(Boolean).join('');
71
-
72
- return description;
73
- };
74
-
75
- /**
76
- * Get pricing of modifier
77
- */
78
- const pricing = (modifier = {}, options = { price: 0, quantity: 1 }) => {
79
- const isType = type => modifier.type === type;
80
- const isAction = action => modifier.action === action;
81
-
82
- let actionValue = 1;
83
- let amount = 0;
84
- const prices = { ...defaultPrices };
85
- const minItems = (modifier.properties || {}).minItems || 0;
86
- const isOverrideModifier = isAction('override');
87
-
88
- if (isAction('add')) actionValue = 1;
89
- else if (isAction('subtract')) actionValue = -1;
90
- else if (isOverrideModifier) actionValue = 1;
91
-
92
- if (isType('fixed')) amount = parseFloat(modifier.amount);
93
- else if (isType('percentage')) amount = math.div(math.mul(options.price, modifier.amount), 100);
94
-
95
- const value = math.mul(actionValue, amount);
96
- if (isOverrideModifier) prices.subTotal = value;
97
- else if (
98
- (_hasAttribute(modifier, constants.attributes.discount) ||
99
- _hasAttribute(modifier, constants.attributes.promotion)) &&
100
- ((minItems > 0 && options.quantity && options.quantity >= minItems) || minItems <= 0)
101
- )
102
- prices.discount = value;
103
- else if (_hasAttribute(modifier, constants.attributes.tax)) prices.tax = value;
104
- else if (_hasAttribute(modifier, constants.attributes.gratuity)) prices.tip = value;
105
- else if (
106
- _hasAttribute(modifier, constants.attributes.paymentMethods) ||
107
- _hasAttribute(modifier, constants.attributes.paymentTypes)
108
- )
109
- prices.fee = value;
110
- else prices.subTotal = value;
111
-
112
- if (_hasAttribute(modifier, constants.attributes.distributed))
113
- prices.distributed = math.add(prices.discount, prices.tax, prices.subTotal);
114
-
115
- return applyQuantity(prices, options.quantity);
116
- };
117
-
118
- /**
119
- * Get pricing of modifirs in item
120
- */
121
- const pricingModifiers = (modifiers, options = { price: 0, quantity: 1 }) => {
122
- const modifierDPrices = { ...defaultPrices };
123
- if (!modifiers.length) return modifierDPrices;
124
-
125
- // get modifiers in order level and without override action
126
- const itemModifiers = _getNonOrderOverrideModifiers(modifiers);
127
- // get distributed modifiers
128
- const distributedModifiers = _getDistributedModifiers(itemModifiers);
129
- // find one override modifier
130
- const totalOverrideModifier = _getTotalOverrideModifier(modifiers);
131
-
132
- if (totalOverrideModifier) {
133
- modifierDPrices.subTotal = totalOverrideModifier.amount;
134
- modifierDPrices.total = totalOverrideModifier.amount;
135
- }
136
- const modifiersToCalculate = totalOverrideModifier ? distributedModifiers : itemModifiers;
137
-
138
- const prices = modifiersToCalculate.reduce((acc, modifier) => {
139
- const modifierPrices = pricing(modifier, options);
140
- const subTotal = math.add(acc.subTotal, modifierPrices.subTotal);
141
- const tax = math.add(acc.tax, modifierPrices.tax);
142
- const fee = math.add(acc.fee, modifierPrices.fee);
143
- const tip = math.add(acc.tip, modifierPrices.tip);
144
- const discount = math.add(acc.discount, modifierPrices.discount);
145
- const distributed = math.add(acc.distributed, modifierPrices.distributed);
146
- return { subTotal, tax, fee, tip, discount, distributed };
147
- }, modifierDPrices);
148
-
149
- prices.total = math.add(prices.subTotal, prices.tax, prices.fee, prices.tip, prices.discount);
150
- return prices;
151
- };
152
-
153
- //
154
- module.exports = {
155
- pricing,
156
- pricingModifiers,
157
- _getDescription,
158
- _hasAttribute,
159
- _getDistributedModifiers,
160
- _getNonOrderOverrideModifiers,
161
- _getTotalOverrideModifier,
162
- _createDistributedModifier,
163
- };
@@ -1,46 +0,0 @@
1
- const primaryAttributes = {
2
- promotion: 'promotion',
3
- discount: 'discount',
4
- tax: 'tax',
5
- paymentMethods: 'paymentMethods',
6
- paymentTypes: 'paymentTypes',
7
- group: 'group',
8
- list: 'list',
9
- priceOverride: 'priceOverride',
10
- quantityOverride: 'quantityOverride',
11
- department: 'department',
12
- starch: 'starch',
13
- };
14
-
15
- const secondAttributes = {
16
- hidden: 'hidden',
17
- required: 'required',
18
- default: 'default',
19
- order: 'order',
20
- relatedItems: 'relatedItems',
21
- recommended: 'recommended',
22
- category: 'category',
23
- multiple: 'multiple',
24
- bind: 'bind',
25
- customerTagsExtend: 'customerTagsExtend',
26
- removeModifiers: 'removeModifiers',
27
- };
28
-
29
- const attributes = {
30
- ...primaryAttributes,
31
- ...secondAttributes,
32
- gratuity: 'gratuity',
33
- subscription: 'subscription',
34
- distributed: 'distributed',
35
- modifierTotalOverride: 'modifierTotalOverride',
36
- };
37
-
38
- const symbols = {
39
- add: '+',
40
- subtract: '-',
41
- };
42
-
43
- module.exports = {
44
- attributes,
45
- symbols,
46
- };
@@ -1,8 +0,0 @@
1
- const { filterExports } = require('../utils');
2
- const actions = require('./actions');
3
- const constants = require('./constants');
4
-
5
- module.exports = {
6
- actions: filterExports(actions),
7
- constants,
8
- };
@@ -1,47 +0,0 @@
1
- const { uniqBy, cloneDeep } = require('lodash');
2
- const itemActions = require('../item/actions');
3
- const modifierActions = require('../modifier/actions');
4
-
5
- /**
6
- * return calculated Order
7
- */
8
- const calculateOrder = order => {
9
- const { items = [] } = order;
10
- if (!items.length) return order;
11
-
12
- // WNDM: with not distributed modifiers
13
- let itemsWNDM = [];
14
- let newOrder = null;
15
- let prices = {};
16
-
17
- const orderItemsModifiers = itemActions._getOrderModifiers(items);
18
- const concatModifiers = [...(order.modifiers || []), ...orderItemsModifiers];
19
- const modifiers = uniqBy(concatModifiers, '_id');
20
- // if there is no order level modifiers, we have to remove them from items
21
- itemsWNDM = itemActions._removeOrderModifiers(items);
22
- itemsWNDM = itemActions.calculateItems(itemsWNDM);
23
- prices = itemActions._itemsPricing(itemsWNDM);
24
- newOrder = { ...order, ...prices, items: itemsWNDM };
25
-
26
- if (!modifiers.length) return newOrder;
27
-
28
- const newItems = itemsWNDM || items;
29
- let itemsWDM = cloneDeep(newItems);
30
- modifiers.forEach(mod => {
31
- const itemsModifiers = itemActions._addOrderModifier(newOrder, newItems, mod);
32
- // adding the modifiers to items
33
- itemsWDM = itemsWDM.map(item => ({
34
- ...item,
35
- modifiers: [...(item.modifiers || []), itemsModifiers[item._id]],
36
- }));
37
- });
38
-
39
- const calculatedItemWDM = itemActions.calculateItems(itemsWDM);
40
- prices = itemActions._itemsPricing(calculatedItemWDM);
41
- return { ...order, ...prices, items: calculatedItemWDM };
42
- };
43
-
44
- //
45
- module.exports = {
46
- calculateOrder,
47
- };
@@ -1,10 +0,0 @@
1
- module.exports = {
2
- subTotal: 0,
3
- total: 0,
4
- tax: 0,
5
- discount: 0,
6
- fee: 0,
7
- tip: 0,
8
- distributed: 0,
9
- totalPaid: 0,
10
- };
@@ -1,26 +0,0 @@
1
- const ObjectID = require('bson-objectid');
2
- const math = require('./math');
3
- const defaultPrices = require('./defaultPrices');
4
-
5
- const objId = () => ObjectID();
6
-
7
- const applyQuantity = (prices = defaultPrices, quantity = 1) =>
8
- Object.keys(prices).reduce(
9
- (obj, key) => ({
10
- ...obj,
11
- [key]: math.mul(prices[key], quantity),
12
- }),
13
- prices
14
- );
15
-
16
- const filterExports = funcs => {
17
- const names = Object.keys(funcs).filter(name => !name.includes('_'));
18
- return names.reduce((newFuncs, name) => ({ ...newFuncs, [name]: funcs[name] }), {});
19
- };
20
-
21
- //
22
- module.exports = {
23
- objId,
24
- applyQuantity,
25
- filterExports,
26
- };
@@ -1,9 +0,0 @@
1
- const helpers = require('./helpers');
2
- const math = require('./math');
3
- const defaultPrices = require('./defaultPrices');
4
-
5
- module.exports = {
6
- ...helpers,
7
- math,
8
- defaultPrices,
9
- };
package/lib/utils/math.js DELETED
@@ -1,71 +0,0 @@
1
- const Decimal = require('decimal.js');
2
-
3
- //
4
- const add = (...args) => {
5
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
6
-
7
- const sum = args.reduce((acc, current) => acc.add(Decimal(current)), Decimal(0));
8
-
9
- // console.log('add =>', args, ' : ', sum);
10
- return Decimal(sum.toFixed(2, 1)).toNumber();
11
- };
12
-
13
- //
14
- const sub = (...args) => {
15
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
16
-
17
- const numbers = [...args];
18
- const first = numbers.shift();
19
- const sum = numbers.reduce((acc, current) => acc.sub(Decimal(current)), Decimal(first));
20
-
21
- // console.log('sub =>', args, ' : ', sum);
22
- return Decimal(sum.toFixed(2, 1)).toNumber();
23
- };
24
-
25
- //
26
- const mul = (...args) => {
27
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
28
-
29
- const sum = args.reduce((acc, current) => acc.mul(Decimal(current)), Decimal(1));
30
-
31
- // console.log('mul =>', args, ' : ', sum);
32
- return Decimal(sum.toFixed(2, 1)).toNumber();
33
- };
34
-
35
- //
36
- const div = (...args) => {
37
- if (!args || !Array.isArray(args) || !args.length) throw new Error('Invalid argument');
38
-
39
- const numbers = [...args];
40
- const first = numbers.shift();
41
- const sum = numbers.reduce((acc, current) => acc.div(Decimal(current)), Decimal(first));
42
-
43
- // console.log('div =>', args, ' : ', sum);
44
- return Decimal(sum.toFixed(2, 1)).toNumber();
45
- };
46
-
47
- //
48
- const lte = (x, y) => Decimal(x).lte(Decimal(y));
49
-
50
- //
51
- const gt = (x, y) => Decimal(x).gt(Decimal(y));
52
-
53
- //
54
- const abs = x =>
55
- Decimal(x)
56
- .abs()
57
- .toNumber();
58
-
59
- //
60
- const toFixed = x => Decimal(x).toFixed(2, 1);
61
-
62
- module.exports = {
63
- mul,
64
- div,
65
- add,
66
- sub,
67
- abs,
68
- lte,
69
- gt,
70
- toFixed,
71
- };