@darkpos/pricing 1.0.41 → 1.0.44

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 (51) hide show
  1. package/__TEST__/item/getItemsModifierDescription.test.js +148 -0
  2. package/__TEST__/mocks/addItemMock.js +18729 -19357
  3. package/__TEST__/mocks/partially-paid/order-modifiers.json +48 -51
  4. package/__TEST__/mocks/partially-paid/order-partially-paid.json +893 -860
  5. package/__TEST__/mocks/unpaid/order-modifiers.json +48 -52
  6. package/__TEST__/modifier/calculate.test.js +1 -0
  7. package/__TEST__/modifier/getGroupedModifierLabels.test.js +95 -0
  8. package/__TEST__/modifier/getGroupedModifiers.test.js +65 -0
  9. package/__TEST__/modifier/getMatchTagsModifiers.test.js +72 -18
  10. package/__TEST__/modifier/getModifierIndex.test.js +10 -7
  11. package/__TEST__/modifier/getNotesToModifierTags.test.js +78 -0
  12. package/__TEST__/modifier/getRecommendedModifiers.test.js +6 -4
  13. package/__TEST__/modifier/hasAttribute.test.js +11 -5
  14. package/__TEST__/modifier/hasMatchTags.test.js +33 -11
  15. package/__TEST__/modifier/isOptionsOverride.test.js +46 -0
  16. package/__TEST__/modifier/sort.test.js +1 -1
  17. package/__TEST__/order/conditionsNotMet.test.js +133 -0
  18. package/__TEST__/order/order.test.js +7 -5
  19. package/__TEST__/order/pickEndDate.test.js +4 -4
  20. package/__TEST__/order/validateConditionsCalculate.test.js +397 -0
  21. package/lib/constants/index.js +1 -1
  22. package/lib/index.js +11 -2
  23. package/lib/item/calculate.js +27 -10
  24. package/lib/item/getItemModifiersDescription.js +40 -7
  25. package/lib/item/markModifiersAsLocked.js +3 -1
  26. package/lib/modifier/areConditionsMet.js +71 -0
  27. package/lib/modifier/getGroupedModifierLabels.js +10 -0
  28. package/lib/modifier/getGroupedModifiers.js +21 -0
  29. package/lib/modifier/getNotesToModifierTags.js +21 -0
  30. package/lib/modifier/index.js +22 -5
  31. package/lib/modifier/isOptionsOverride.js +9 -0
  32. package/lib/modifier/isPaymentMethodModifier.js +1 -1
  33. package/lib/modifier/isPaymentTypeModifier.js +1 -1
  34. package/lib/modifier/isValid.js +12 -0
  35. package/lib/modifier/validate.js +14 -0
  36. package/lib/modifier/validateDateDaysDiff.js +30 -0
  37. package/lib/modifier/validateInArr.js +12 -0
  38. package/lib/modifier/validateNumberCondition.js +20 -0
  39. package/lib/modifier/validateRequiredModifiers.js +16 -0
  40. package/lib/order/addItemModifier.js +72 -28
  41. package/lib/order/calculate.js +12 -7
  42. package/lib/order/index.js +0 -2
  43. package/lib/order/removeModifiersWithPaymentMethods.js +1 -2
  44. package/lib/order/removeModifiersWithPaymentTypes.js +1 -2
  45. package/lib/store/getRecommendedEndDate.js +13 -0
  46. package/lib/store/index.js +25 -0
  47. package/lib/store/pickEndDate.js +62 -0
  48. package/package.json +3 -3
  49. package/lib/modifier/findByPaymentMethod.js +0 -10
  50. package/lib/modifier/findByPaymentType.js +0 -10
  51. package/lib/order/pickEndDate.js +0 -65
@@ -19,8 +19,6 @@ const duplicate = require('./duplicate');
19
19
  const enableAutoPopup = require('./enableAutoPopup');
20
20
  const filterByRequiredModifiers = require('./filterByRequiredModifiers');
21
21
  const findById = require('./findById');
22
- const findByPaymentMethod = require('./findByPaymentMethod');
23
- const findByPaymentType = require('./findByPaymentType');
24
22
  const getAvailablePromotions = require('./getAvailablePromotions');
25
23
  const getAvailablePromotionsOrSubscriptions = require('./getAvailablePromotionsOrSubscriptions');
26
24
  const getAvailableSubscriptions = require('./getAvailableSubscriptions');
@@ -82,6 +80,7 @@ const isDirect = require('./isDirect');
82
80
  const hasNoTags = require('./hasNoTags');
83
81
  const isRemoveModifier = require('./isRemoveModifier');
84
82
  const isGroupOfModifiers = require('./isGroupOfModifiers');
83
+ const areConditionsMet = require('./areConditionsMet');
85
84
  const isRequiredAndOverride = require('./isRequiredAndOverride');
86
85
  const isManual = require('./isManual');
87
86
  const isPriceOverride = require('./isPriceOverride');
@@ -102,6 +101,7 @@ const isDefault = require('./isDefault');
102
101
  const isIncluded = require('./isIncluded');
103
102
  const isCustomerTagsExtend = require('./isCustomerTagsExtend');
104
103
  const isAmountOverride = require('./isAmountOverride');
104
+ const isValid = require('./isValid');
105
105
  const isDiscount = require('./isDiscount');
106
106
  const isHidden = require('./isHidden');
107
107
  const isIgnoreQuantity = require('./isIgnoreQuantity');
@@ -124,11 +124,19 @@ const isFixedAdd = require('./isFixedAdd');
124
124
  const isFee = require('./isFee');
125
125
  const isAdd = require('./isAdd');
126
126
  const mutateModifier = require('./mutateModifier');
127
-
128
127
  const isFixedDiscount = require('./isFixedDiscount');
129
128
  const removeLocked = require('./removeLocked');
130
129
  const hasItems = require('./hasItems');
131
130
  const getLockedModifiers = require('./getLockedModifiers');
131
+ const getGroupedModifiers = require('./getGroupedModifiers');
132
+ const getNotesToModifierTags = require('./getNotesToModifierTags');
133
+ const isOptionsOverride = require('./isOptionsOverride');
134
+ const getGroupedModifierLabels = require('./getGroupedModifierLabels');
135
+ const validate = require('./validate');
136
+ const validateNumberCondition = require('./validateNumberCondition');
137
+ const validateRequiredModifiers = require('./validateRequiredModifiers');
138
+ const validateDateDaysDiff = require('./validateDateDaysDiff');
139
+ const validateInArr = require('./validateInArr');
132
140
 
133
141
  const modifierActions = (deps = {}) => {
134
142
  const actions = {};
@@ -159,8 +167,6 @@ const modifierActions = (deps = {}) => {
159
167
  enableAutoPopup: enableAutoPopup(innerDeps),
160
168
  filterByRequiredModifiers: filterByRequiredModifiers(innerDeps),
161
169
  findById: findById(innerDeps),
162
- findByPaymentMethod: findByPaymentMethod(innerDeps),
163
- findByPaymentType: findByPaymentType(innerDeps),
164
170
  getAvailablePromotions: getAvailablePromotions(innerDeps),
165
171
  getAvailablePromotionsOrSubscriptions:
166
172
  getAvailablePromotionsOrSubscriptions(innerDeps),
@@ -243,6 +249,7 @@ const modifierActions = (deps = {}) => {
243
249
  isDefault: isDefault(innerDeps),
244
250
  isCustomerTagsExtend: isCustomerTagsExtend(innerDeps),
245
251
  isAmountOverride: isAmountOverride(innerDeps),
252
+ isValid: isValid(innerDeps),
246
253
  isDiscount: isDiscount(innerDeps),
247
254
  isHidden: isHidden(innerDeps),
248
255
  isIgnoreQuantity: isIgnoreQuantity(innerDeps),
@@ -269,6 +276,16 @@ const modifierActions = (deps = {}) => {
269
276
  isFee: isFee(innerDeps),
270
277
  isAdd: isAdd(innerDeps),
271
278
  mutateModifier: mutateModifier(innerDeps),
279
+ getGroupedModifiers: getGroupedModifiers(innerDeps),
280
+ getNotesToModifierTags: getNotesToModifierTags(innerDeps),
281
+ isOptionsOverride: isOptionsOverride(innerDeps),
282
+ getGroupedModifierLabels: getGroupedModifierLabels(innerDeps),
283
+ validate: validate(innerDeps),
284
+ validateNumberCondition: validateNumberCondition(innerDeps),
285
+ validateRequiredModifiers: validateRequiredModifiers(innerDeps),
286
+ validateDateDaysDiff: validateDateDaysDiff(innerDeps),
287
+ validateInArr: validateInArr(innerDeps),
288
+ areConditionsMet: areConditionsMet(innerDeps),
272
289
  });
273
290
 
274
291
  Object.keys(freezedActions).forEach(actionName => {
@@ -0,0 +1,9 @@
1
+ module.exports = () =>
2
+ function isOptionsOverride(modifier) {
3
+ if (!modifier || !modifier.properties || !modifier.properties.override)
4
+ return false;
5
+ return (
6
+ modifier.properties.override.options &&
7
+ modifier.properties.override.options.length > 0
8
+ );
9
+ };
@@ -3,6 +3,6 @@ module.exports = () =>
3
3
  return !!(
4
4
  modifier &&
5
5
  modifier.conditions &&
6
- (modifier.conditions.paymentMethods || []).length > 0
6
+ modifier.conditions.some(condition => condition.key === 'paymentMethods')
7
7
  );
8
8
  };
@@ -3,6 +3,6 @@ module.exports = () =>
3
3
  return !!(
4
4
  modifier &&
5
5
  modifier.conditions &&
6
- (modifier.conditions.paymentTypes || []).length > 0
6
+ modifier.conditions.some(condition => condition.key === 'paymentTypes')
7
7
  );
8
8
  };
@@ -0,0 +1,12 @@
1
+ module.exports = () =>
2
+ function isValid(modifier) {
3
+ if (
4
+ !modifier ||
5
+ !modifier.conditions ||
6
+ modifier.conditions.valid === undefined ||
7
+ modifier.conditions.valid === null
8
+ )
9
+ return true;
10
+
11
+ return !!modifier.conditions.valid;
12
+ };
@@ -0,0 +1,14 @@
1
+ module.exports = ({ actions }) => {
2
+ function validate(modifier, opts) {
3
+ if (!modifier) return modifier;
4
+
5
+ return {
6
+ ...modifier,
7
+ conditions: {
8
+ ...(modifier.conditions || {}),
9
+ valid: !!actions.areConditionsMet(modifier, opts),
10
+ },
11
+ };
12
+ }
13
+ return validate;
14
+ };
@@ -0,0 +1,30 @@
1
+ module.exports = () =>
2
+ function validateDateDaysDiff(
3
+ startRequestDate,
4
+ endRequestDate,
5
+ conditionNumber,
6
+ operand
7
+ ) {
8
+ if (!conditionNumber && !operand) return true;
9
+ if (!startRequestDate || !endRequestDate) return false;
10
+ const diff = Math.abs(
11
+ new Date(endRequestDate) - new Date(startRequestDate)
12
+ );
13
+ const diffDays = Math.ceil(diff / (1000 * 60 * 60 * 24));
14
+ switch (operand) {
15
+ case '$eq':
16
+ return diffDays === conditionNumber;
17
+ case '$ne':
18
+ return diffDays !== conditionNumber;
19
+ case '$gt':
20
+ return diffDays > conditionNumber;
21
+ case '$gte':
22
+ return diffDays >= conditionNumber;
23
+ case '$lt':
24
+ return diffDays < conditionNumber;
25
+ case '$lte':
26
+ return diffDays <= conditionNumber;
27
+ default:
28
+ return false;
29
+ }
30
+ };
@@ -0,0 +1,12 @@
1
+ module.exports = ({ _ }) =>
2
+ function validateInArr(item, requiredArr, operand) {
3
+ if (_.isEmpty(requiredArr) && !operand) return true;
4
+ switch (operand) {
5
+ case '$in':
6
+ return requiredArr.some(each => item === each);
7
+ case '$nin':
8
+ return requiredArr.every(each => item !== each);
9
+ default:
10
+ return false;
11
+ }
12
+ };
@@ -0,0 +1,20 @@
1
+ module.exports = () =>
2
+ function validateNumberCondition(itemNumber, conditionNumber, operand) {
3
+ if (!conditionNumber && !operand) return true;
4
+ switch (operand) {
5
+ case '$eq':
6
+ return Number(conditionNumber) === itemNumber;
7
+ case '$ne':
8
+ return Number(conditionNumber) !== itemNumber;
9
+ case '$gt':
10
+ return Number(conditionNumber) < itemNumber;
11
+ case '$gte':
12
+ return Number(conditionNumber) <= itemNumber;
13
+ case '$lt':
14
+ return Number(conditionNumber) > itemNumber;
15
+ case '$lte':
16
+ return Number(conditionNumber) >= itemNumber;
17
+ default:
18
+ return false;
19
+ }
20
+ };
@@ -0,0 +1,16 @@
1
+ module.exports = ({ actions, _ }) =>
2
+ function validateRequiredModifiers(modifiers, requiredModifiers, operand) {
3
+ if (_.isEmpty(requiredModifiers) && !operand) return true;
4
+ switch (operand) {
5
+ case '$in':
6
+ return requiredModifiers.some(each =>
7
+ actions.contains(modifiers, each)
8
+ );
9
+ case '$nin':
10
+ return requiredModifiers.every(
11
+ each => !actions.contains(modifiers, each)
12
+ );
13
+ default:
14
+ return false;
15
+ }
16
+ };
@@ -27,31 +27,71 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
27
27
  return false;
28
28
  };
29
29
 
30
- const validateItemPiecesCondition = (itemPieces, minPieces) => {
31
- if (!minPieces) return true;
32
- return minPieces <= itemPieces;
33
- };
34
-
35
- const validateItemQtyCondition = (itemQuantity, minQuantity) => {
36
- if (!minQuantity) return true;
37
- return minQuantity <= itemQuantity;
38
- };
39
-
40
- const validateRequiredModifiers = (modifiers, requiredModifiers) => {
41
- if (_.isEmpty(modifiers) || _.isEmpty(requiredModifiers)) return true;
42
- return requiredModifiers.every(each =>
43
- modifierActions.contains(modifiers, each)
44
- );
45
- };
46
-
47
30
  const areConditionsMet = (item, conditions) => {
48
- if (!conditions) return true;
49
-
50
- return (
51
- validateItemPiecesCondition(item.pieces, conditions.minItemPieces) &&
52
- validateItemQtyCondition(item.quantity, conditions.minItemQuantity) &&
53
- validateRequiredModifiers(item.modifiers, conditions.modifiers)
31
+ const conditionsBag = [];
32
+ if (!conditions || !conditions.rules) return conditionsBag;
33
+ // Find conditions with itemPieces as key
34
+ const itemPiecesConditions = conditions.rules.filter(
35
+ each => each.key === 'itemPieces'
54
36
  );
37
+ if (itemPiecesConditions.length > 0) {
38
+ itemPiecesConditions.forEach(each => {
39
+ if (
40
+ !modifierActions.validateNumberCondition(
41
+ item.pieces,
42
+ each.value,
43
+ each.operand
44
+ )
45
+ ) {
46
+ conditionsBag.push({
47
+ name: `${each.operand}.itemPieces`,
48
+ value: each.value,
49
+ current: item.pieces,
50
+ });
51
+ }
52
+ });
53
+ }
54
+ const itemQtyConditions = conditions.rules.filter(
55
+ each => each.key === 'itemQuantity'
56
+ );
57
+ if (itemQtyConditions.length > 0) {
58
+ itemQtyConditions.forEach(each => {
59
+ if (
60
+ !modifierActions.validateNumberCondition(
61
+ item.quantity,
62
+ each.value,
63
+ each.operand
64
+ )
65
+ ) {
66
+ conditionsBag.push({
67
+ name: `${each.operand}.itemQuantity`,
68
+ value: each.value,
69
+ current: item.quantity,
70
+ });
71
+ }
72
+ });
73
+ }
74
+ const requiredModifiersConditions = conditions.rules.filter(
75
+ each => each.key === 'modifiers'
76
+ );
77
+ if (requiredModifiersConditions.length > 0) {
78
+ requiredModifiersConditions.forEach(each => {
79
+ if (
80
+ !modifierActions.validateRequiredModifiers(
81
+ item.modifiers,
82
+ each.value,
83
+ each.operand
84
+ )
85
+ ) {
86
+ conditionsBag.push({
87
+ name: `${each.operand}.modifiers`,
88
+ value: each.value,
89
+ current: item.modifiers,
90
+ });
91
+ }
92
+ });
93
+ }
94
+ return conditionsBag;
55
95
  };
56
96
 
57
97
  const addModifier = ({
@@ -63,19 +103,21 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
63
103
  items: [],
64
104
  itemModifiers: [],
65
105
  },
106
+ onConditionsNotMet,
66
107
  }) => {
67
108
  const modifier = _modifier; // to avoid no param reassign lint rule
68
109
  let item = { ...itemProp };
69
110
  const compute = getComputeModField(modifier);
70
111
  if (hasBehaivoralFields(modifier)) return item;
71
- // check conditions
72
- if (!areConditionsMet(item, modifier.conditions)) return item;
112
+ const conditionsBag = areConditionsMet(item, modifier.conditions);
73
113
  const isAmountOverride = modifierActions.isAmountOverride(modifier);
74
114
  const isPriceOverride = modifierActions.isPriceOverride(modifier);
75
-
76
- // change modifier compute based on onverride and creates a clone of the modifier
115
+ // is the modifier suggestion required
116
+ if (conditionsBag.length > 0 && !modifierActions.isRequired(modifier)) {
117
+ if (onConditionsNotMet) onConditionsNotMet(conditionsBag);
118
+ return item;
119
+ }
77
120
  const modifierToAdd = modifierActions.mutateModifier(modifier);
78
-
79
121
  const modifierIndex = item.modifiers.findIndex(
80
122
  ieach => ieach.modifierId === modifier._id
81
123
  );
@@ -122,6 +164,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
122
164
  modifier,
123
165
  itemIndex,
124
166
  cache,
167
+ onConditionsNotMet,
125
168
  }) {
126
169
  let order = _.cloneDeep(orderProp);
127
170
  if (!order || itemIndex < 0 || !modifier) return order;
@@ -166,6 +209,7 @@ module.exports = ({ actions, itemActions, modifierActions, utils, _ }) => {
166
209
  modifier,
167
210
  cache,
168
211
  customer,
212
+ onConditionsNotMet,
169
213
  });
170
214
 
171
215
  // Recursive Rules:
@@ -3,18 +3,23 @@
3
3
  * return calculated Order
4
4
  */
5
5
  module.exports = ({ _, actions, itemActions, modifierActions }) =>
6
- function calculateorder(inputOrder) {
6
+ function calculateorder(inputOrder, opts = {}) {
7
7
  if (!inputOrder) return inputOrder;
8
8
  const order = _.cloneDeep(inputOrder);
9
9
  const { items = [], orders = [] } = order;
10
-
11
10
  if (!items.length) {
12
11
  if (!orders.length)
13
12
  return { ...order, subTotals: {}, subTotal: 0, total: 0 };
14
13
 
15
14
  return { ...order, ...actions.getTotals(order.orders) };
16
15
  }
17
-
16
+ const startRequestDate = order.start ? order.start.requestDate : null;
17
+ const endRequestDate = order.end ? order.end.requestDate : null;
18
+ const options = {
19
+ ...opts,
20
+ startRequestDate,
21
+ endRequestDate,
22
+ };
18
23
  const sortedOrderModifiers = modifierActions.sort(
19
24
  modifierActions.removeLocked(order.modifiers)
20
25
  );
@@ -23,7 +28,7 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
23
28
  itemActions.removeModifiers({ item, modifiers: sortedOrderModifiers })
24
29
  );
25
30
 
26
- itemsWNIM = itemActions.calculate(itemsWNIM);
31
+ itemsWNIM = itemActions.calculate(itemsWNIM, options);
27
32
 
28
33
  const newOrder = {
29
34
  ...order,
@@ -55,11 +60,11 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
55
60
  } else {
56
61
  tempItems = itemsWIM;
57
62
  }
58
- tempItems = itemActions.calculate(tempItems);
63
+ tempItems = itemActions.calculate(tempItems, options);
59
64
  }
60
65
 
61
66
  if (isCredit) {
62
- const calculatedItemWIM = itemActions.calculate(itemsWIM);
67
+ const calculatedItemWIM = itemActions.calculate(itemsWIM, options);
63
68
  computedTotal = itemActions.getTotals(calculatedItemWIM).total;
64
69
  }
65
70
 
@@ -92,7 +97,7 @@ module.exports = ({ _, actions, itemActions, modifierActions }) =>
92
97
  prvSort = sort;
93
98
  }
94
99
 
95
- const calculatedItemWIM = itemActions.calculate(itemsWIM);
100
+ const calculatedItemWIM = itemActions.calculate(itemsWIM, options);
96
101
 
97
102
  return {
98
103
  ...order,
@@ -72,7 +72,6 @@ const getItemIndex = require('./getItemIndex');
72
72
  const getRelatedItems = require('./getRelatedItems');
73
73
  const getItemByItemId = require('./getItemByItemId');
74
74
  const getScheduleByCustomer = require('./getScheduleByCustomer');
75
- const pickEndDate = require('./pickEndDate');
76
75
  const getAppliedCredit = require('./getAppliedCredit');
77
76
  const addCreditModifier = require('./addCreditModifier');
78
77
  const adjustCreditModifiersDifference = require('./adjustCreditModifiersDifference');
@@ -172,7 +171,6 @@ const orderActions = (deps = {}) => {
172
171
  getItemIndex: getItemIndex(innerDeps),
173
172
  getRelatedItems: getRelatedItems(innerDeps),
174
173
  getScheduleByCustomer: getScheduleByCustomer(innerDeps),
175
- pickEndDate: pickEndDate(innerDeps),
176
174
  getAppliedCredit: getAppliedCredit(innerDeps),
177
175
  addCreditModifier: addCreditModifier(innerDeps),
178
176
  adjustCreditModifiersDifference: adjustCreditModifiersDifference(innerDeps),
@@ -1,8 +1,7 @@
1
1
  module.exports = () => {
2
2
  const hasPaymentMethods = modifier =>
3
3
  modifier.conditions &&
4
- Array.isArray(modifier.conditions.paymentMethods) &&
5
- modifier.conditions.paymentMethods.length;
4
+ modifier.conditions.some(condition => condition.key === 'paymentMethods');
6
5
 
7
6
  return function removeModifiersWithPaymentMethods({
8
7
  order,
@@ -1,8 +1,7 @@
1
1
  module.exports = () => {
2
2
  const hasPaymentTypes = modifier =>
3
3
  modifier.conditions &&
4
- Array.isArray(modifier.conditions.paymentTypes) &&
5
- modifier.conditions.paymentTypes.length;
4
+ modifier.conditions.some(condition => condition.key === 'paymentMethods');
6
5
 
7
6
  return function removeModifiersWithPaymentTypes({
8
7
  order,
@@ -0,0 +1,13 @@
1
+ module.exports = ({ actions, settings }) =>
2
+ function getRecommendedEndDate() {
3
+ const defaultSchedule =
4
+ settings.order &&
5
+ settings.order.endDate &&
6
+ settings.order.endDate.default;
7
+
8
+ return defaultSchedule
9
+ ? actions.pickEndDate({
10
+ ...defaultSchedule,
11
+ })
12
+ : null;
13
+ };
@@ -0,0 +1,25 @@
1
+ //
2
+ const pickEndDate = require('./pickEndDate');
3
+ const getRecommendedEndDate = require('./getRecommendedEndDate');
4
+
5
+ const storeActions = (deps = {}) => {
6
+ const actions = {};
7
+
8
+ const innerDeps = {
9
+ ...deps,
10
+ actions,
11
+ };
12
+
13
+ const freezedActions = Object.freeze({
14
+ pickEndDate: pickEndDate(innerDeps),
15
+ getRecommendedEndDate: getRecommendedEndDate(innerDeps),
16
+ });
17
+
18
+ Object.keys(freezedActions).forEach(actionName => {
19
+ actions[actionName] = freezedActions[actionName];
20
+ });
21
+
22
+ return freezedActions;
23
+ };
24
+
25
+ module.exports = storeActions;
@@ -0,0 +1,62 @@
1
+ module.exports = ({ settings, _, moment }) => {
2
+ const timezone = _.get(settings, 'localization.timezone', 'America/New_York');
3
+
4
+ const getClosedDays = () => {
5
+ const schedule = _.get(settings, 'schedule', {});
6
+ const { close = [] } = schedule;
7
+
8
+ if (!Array.isArray(close)) return [];
9
+ return close.map(closedDate => ({
10
+ date: moment(closedDate.date), // the date is saved with the user timezone, no need to convert it back here (ex: date: '2024-08-27' would become date:'2024-08-26 23:00 -4:00')
11
+ }));
12
+ };
13
+
14
+ return function pickEndDate(schedule = {}) {
15
+ const {
16
+ addDays = 1,
17
+ hour,
18
+ minute,
19
+ skipDays = [],
20
+ cutHour,
21
+ cutDay = 1,
22
+ } = schedule;
23
+
24
+ const todayTZ = moment().tz(timezone);
25
+ let endDateTZ = todayTZ.clone();
26
+ const closedDays = getClosedDays();
27
+ const todayHours = todayTZ.get('hours');
28
+ const todayMinutes = todayTZ.get('minutes');
29
+ if (
30
+ (cutHour && todayHours > cutHour.hour) ||
31
+ (todayHours >= cutHour.hour && todayMinutes > cutHour.minute)
32
+ ) {
33
+ endDateTZ = endDateTZ.add(cutDay, 'days'); // if the cut day is zero should we add a day based on hours? ask Nabil/Vicky
34
+ }
35
+
36
+ endDateTZ.add(addDays, 'days');
37
+ // do the logic related to skipdays
38
+ // if the date already pass the skip day, do nothing
39
+ // if the date is the same as one of the skip day, check the next skip day if any, then add one more day
40
+ skipDays.forEach(day => {
41
+ if (todayTZ.isoWeekday() <= day) {
42
+ endDateTZ.add(1, 'days');
43
+ }
44
+ });
45
+
46
+ /**
47
+ * setting the hour and minute so we can compare with closedDays
48
+ */
49
+ if (hour !== undefined) endDateTZ.set('hour', hour);
50
+ if (minute !== undefined) endDateTZ.set('minute', minute);
51
+ closedDays.forEach(closed => {
52
+ const closedDay = moment(closed.date);
53
+ closedDay.set('hour', hour);
54
+ closedDay.set('minute', minute);
55
+ if (endDateTZ.startOf('day').isSame(closedDay, 'day')) {
56
+ endDateTZ.add(1, 'days');
57
+ }
58
+ });
59
+
60
+ return moment.utc(endDateTZ).format();
61
+ };
62
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darkpos/pricing",
3
- "version": "1.0.41",
3
+ "version": "1.0.44",
4
4
  "description": "Pricing calculator",
5
5
  "author": "Dark POS",
6
6
  "license": "ISC",
@@ -13,7 +13,7 @@
13
13
  "scripts": {
14
14
  "test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__",
15
15
  "test:me": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit",
16
- "lint": "eslint --quiet --fix lib/"
16
+ "lint": "eslint --quiet --fix lib/ __TEST__/"
17
17
  },
18
18
  "publishConfig": {
19
19
  "access": "public"
@@ -36,5 +36,5 @@
36
36
  "supertest": "^6.2.3",
37
37
  "supervisor": "^0.12.0"
38
38
  },
39
- "gitHead": "0ab9e8f6bf59ef671ffb2005712a5ec6f998b36e"
39
+ "gitHead": "9237aef8561cbdf9c29150a0915cf55ff54f3c80"
40
40
  }
@@ -1,10 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function findByPaymentMethod({ modifiers, paymentMethod = '' }) {
3
- if (!Array.isArray(modifiers) || !paymentMethod) return null;
4
-
5
- return modifiers.find(
6
- each =>
7
- actions.isPaymentMethodModifier(each) &&
8
- each.conditions.paymentMethods.includes(paymentMethod)
9
- );
10
- };
@@ -1,10 +0,0 @@
1
- module.exports = ({ actions }) =>
2
- function findByPaymentType({ modifiers, paymentType = '' }) {
3
- if (!Array.isArray(modifiers) || !paymentType) return null;
4
-
5
- return modifiers.find(
6
- each =>
7
- actions.isPaymentTypeModifier(each) &&
8
- each.conditions.paymentTypes.includes(paymentType)
9
- );
10
- };
@@ -1,65 +0,0 @@
1
- module.exports = ({ settings, _, moment }) => {
2
- const timezone = _.get(settings, 'localization.timezone', 'America/New_York');
3
-
4
- const getClosedDays = () => {
5
- const schedule = _.get(settings, 'schedule', {});
6
- const { close = [] } = schedule;
7
-
8
- if (!Array.isArray(close)) return [];
9
- return close.map(closedDate => ({
10
- date: moment(closedDate.date), // the date is saved with the user timezone, no need to convert it back here (ex: date: '2024-08-27' would become date:'2024-08-26 23:00 -4:00')
11
- }));
12
- };
13
-
14
- return function pickEndDate(schedule = {}) {
15
- const {
16
- addDays = 1,
17
- hour,
18
- minute,
19
- skipDays = [],
20
- cutHour,
21
- cutDay = 1,
22
- } = schedule;
23
-
24
- const todayTZ = moment().tz(timezone);
25
- let endDateTZ = todayTZ.clone();
26
-
27
- const closedDays = getClosedDays();
28
-
29
- if (
30
- (cutHour && todayTZ.get('hours') > cutHour.hour) ||
31
- (todayTZ.get('hours') >= cutHour.hour &&
32
- todayTZ.get('minutes') > cutHour.minute)
33
- ) {
34
- endDateTZ = endDateTZ.add(cutDay, 'days');
35
- }
36
-
37
- let addDaysCounter = 0;
38
- // adding the skip days to the loop
39
- const loop = addDays + skipDays.length;
40
- while (addDaysCounter < loop) {
41
- endDateTZ = endDateTZ.add(1, 'days');
42
- const endDateISOWeekday = endDateTZ.isoWeekday();
43
- // does the current endDateISOWeekday match with any skip day?
44
- // is endDateISOWeekday a sunday?
45
- const shouldSkip =
46
- skipDays.includes(endDateISOWeekday) || endDateISOWeekday === 7;
47
- // if addDaysCounter is greater than loop, than we shouldn't add more days
48
- // day condition stays working until addDaysCounter is greater than loop
49
- if (
50
- !shouldSkip ||
51
- // eslint-disable-next-line no-loop-func
52
- !closedDays.some(closedDay => closedDay.date.isSame(endDateTZ, 'day'))
53
- ) {
54
- // eslint-disable-next-line no-plusplus
55
- addDaysCounter++;
56
- }
57
- }
58
-
59
- if (hour !== undefined) endDateTZ.set('hour', hour);
60
- if (minute !== undefined) endDateTZ.set('minute', minute);
61
- endDateTZ.set('second', 0);
62
-
63
- return moment.utc(endDateTZ).format();
64
- };
65
- };