store-scrapper-js-common 1.0.73 → 1.0.74

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.
@@ -1,6 +1,6 @@
1
- import { checkIfSamePrices, isCheaper, getMinPrice, isValidPrice, getAvgPrice, getMaxPrice, getPriceOperation, removeZeroPrices } from './price-utils';
1
+ import { checkIfSamePrices, isCheaper, getMinPrice, isValidPrice, getAvgPrice, getMaxPrice, getPriceOperation, removeZeroPrices, hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier } from './price-utils';
2
2
  import { findLastQuery } from './entity-queries-utils';
3
3
  import { reverseString, removeNewLines, includesStringArray, getLastAfter, replaceMultipleSpacesByOne, removeIfEndsWith } from './string-utils';
4
4
  import { isUrl, getHostname, getParam, getPathname } from './url-utils';
5
5
  import { calculateAverage, roundNumber } from './number-utils';
6
- export { checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne, removeIfEndsWith, getLastAfter, includesStringArray, removeNewLines, reverseString, getParam, getPathname, getHostname, isUrl, isValidPrice, getMinPrice, isCheaper, getMaxPrice, getPriceOperation, getAvgPrice, calculateAverage, roundNumber, removeZeroPrices, };
6
+ export { checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne, hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier, removeIfEndsWith, getLastAfter, includesStringArray, removeNewLines, reverseString, getParam, getPathname, getHostname, isUrl, isValidPrice, getMinPrice, isCheaper, getMaxPrice, getPriceOperation, getAvgPrice, calculateAverage, roundNumber, removeZeroPrices, };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.removeZeroPrices = exports.roundNumber = exports.calculateAverage = exports.getAvgPrice = exports.getPriceOperation = exports.getMaxPrice = exports.isCheaper = exports.getMinPrice = exports.isValidPrice = exports.isUrl = exports.getHostname = exports.getPathname = exports.getParam = exports.reverseString = exports.removeNewLines = exports.includesStringArray = exports.getLastAfter = exports.removeIfEndsWith = exports.replaceMultipleSpacesByOne = exports.findLastQuery = exports.checkIfSamePrices = void 0;
3
+ exports.removeZeroPrices = exports.roundNumber = exports.calculateAverage = exports.getAvgPrice = exports.getPriceOperation = exports.getMaxPrice = exports.isCheaper = exports.getMinPrice = exports.isValidPrice = exports.isUrl = exports.getHostname = exports.getPathname = exports.getParam = exports.reverseString = exports.removeNewLines = exports.includesStringArray = exports.getLastAfter = exports.removeIfEndsWith = exports.getPriceByMeasurementUnitMultiplier = exports.hasMeasurementUnitMultiplier = exports.replaceMultipleSpacesByOne = exports.findLastQuery = exports.checkIfSamePrices = void 0;
4
4
  const price_utils_1 = require("./price-utils");
5
5
  Object.defineProperty(exports, "checkIfSamePrices", { enumerable: true, get: function () { return price_utils_1.checkIfSamePrices; } });
6
6
  Object.defineProperty(exports, "isCheaper", { enumerable: true, get: function () { return price_utils_1.isCheaper; } });
@@ -10,6 +10,8 @@ Object.defineProperty(exports, "getAvgPrice", { enumerable: true, get: function
10
10
  Object.defineProperty(exports, "getMaxPrice", { enumerable: true, get: function () { return price_utils_1.getMaxPrice; } });
11
11
  Object.defineProperty(exports, "getPriceOperation", { enumerable: true, get: function () { return price_utils_1.getPriceOperation; } });
12
12
  Object.defineProperty(exports, "removeZeroPrices", { enumerable: true, get: function () { return price_utils_1.removeZeroPrices; } });
13
+ Object.defineProperty(exports, "hasMeasurementUnitMultiplier", { enumerable: true, get: function () { return price_utils_1.hasMeasurementUnitMultiplier; } });
14
+ Object.defineProperty(exports, "getPriceByMeasurementUnitMultiplier", { enumerable: true, get: function () { return price_utils_1.getPriceByMeasurementUnitMultiplier; } });
13
15
  const entity_queries_utils_1 = require("./entity-queries-utils");
14
16
  Object.defineProperty(exports, "findLastQuery", { enumerable: true, get: function () { return entity_queries_utils_1.findLastQuery; } });
15
17
  const string_utils_1 = require("./string-utils");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["utils/index.ts"],"names":[],"mappings":";;;AAAA,+CAEuB;AAcrB,kGAfA,+BAAiB,OAeA;AAE8B,0FAjB5B,uBAAS,OAiB4B;AAAtB,4FAjBJ,yBAAW,OAiBI;AAAzB,6FAjBuB,0BAAY,OAiBvB;AAA0D,4FAjBjC,yBAAW,OAiBiC;AAA3C,4FAjBY,yBAAW,OAiBZ;AAAE,kGAjBY,+BAAiB,OAiBZ;AAC3E,iGAlByF,8BAAgB,OAkBzF;AAhB/B,iEAAuD;AAalC,8FAbZ,oCAAa,OAaY;AAZlC,iDAGwB;AAU+C,8FAZrE,4BAAa,OAYqE;AAA7B,+FAZtC,6BAAc,OAYsC;AAAnC,oGAZD,kCAAmB,OAYC;AAAjC,6FAZkC,2BAAY,OAYlC;AADI,2GAXgC,yCAA0B,OAWhC;AAC5D,iGAZ8F,+BAAgB,OAY9F;AATlB,2CAEqB;AAQN,sFATb,iBAAK,OASa;AAAlB,4FATO,uBAAW,OASP;AADyE,yFARhE,oBAAQ,OAQgE;AAAE,4FARhE,uBAAW,OAQgE;AAN3G,iDAEwB;AAKiF,iGANvG,+BAAgB,OAMuG;AACvH,4FAPkB,0BAAW,OAOlB","sourcesContent":["import {\n checkIfSamePrices, isCheaper, getMinPrice, isValidPrice, getAvgPrice, getMaxPrice, getPriceOperation, removeZeroPrices,\n} from './price-utils';\nimport { findLastQuery } from './entity-queries-utils';\nimport {\n reverseString, removeNewLines, includesStringArray, getLastAfter, replaceMultipleSpacesByOne, removeIfEndsWith,\n}\n from './string-utils';\nimport {\n isUrl, getHostname, getParam, getPathname,\n} from './url-utils';\nimport {\n calculateAverage, roundNumber,\n} from './number-utils';\n\nexport {\n checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne,\n removeIfEndsWith, getLastAfter, includesStringArray, removeNewLines, reverseString, getParam, getPathname,\n getHostname, isUrl, isValidPrice, getMinPrice, isCheaper, getMaxPrice, getPriceOperation, getAvgPrice, calculateAverage,\n roundNumber, removeZeroPrices,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["utils/index.ts"],"names":[],"mappings":";;;AAAA,+CAGuB;AAcrB,kGAhBA,+BAAiB,OAgBA;AAE8B,0FAlB5B,uBAAS,OAkB4B;AAAtB,4FAlBJ,yBAAW,OAkBI;AAAzB,6FAlBuB,0BAAY,OAkBvB;AAA0D,4FAlBjC,yBAAW,OAkBiC;AAA3C,4FAlBY,yBAAW,OAkBZ;AAAE,kGAlBY,+BAAiB,OAkBZ;AAC3E,iGAnByF,8BAAgB,OAmBzF;AAHiC,6GAf9D,0CAA4B,OAe8D;AAAE,oHAf9D,iDAAmC,OAe8D;AAbjI,iEAAuD;AAalC,8FAbZ,oCAAa,OAaY;AAZlC,iDAGwB;AAU+C,8FAZrE,4BAAa,OAYqE;AAA7B,+FAZtC,6BAAc,OAYsC;AAAnC,oGAZD,kCAAmB,OAYC;AAAjC,6FAZkC,2BAAY,OAYlC;AADI,2GAXgC,yCAA0B,OAWhC;AAC5D,iGAZ8F,+BAAgB,OAY9F;AATlB,2CAEqB;AAQN,sFATb,iBAAK,OASa;AAAlB,4FATO,uBAAW,OASP;AADyE,yFARhE,oBAAQ,OAQgE;AAAE,4FARhE,uBAAW,OAQgE;AAN3G,iDAEwB;AAKiF,iGANvG,+BAAgB,OAMuG;AACvH,4FAPkB,0BAAW,OAOlB","sourcesContent":["import {\n checkIfSamePrices, isCheaper, getMinPrice, isValidPrice, getAvgPrice, getMaxPrice, getPriceOperation, removeZeroPrices,\n hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier,\n} from './price-utils';\nimport { findLastQuery } from './entity-queries-utils';\nimport {\n reverseString, removeNewLines, includesStringArray, getLastAfter, replaceMultipleSpacesByOne, removeIfEndsWith,\n}\n from './string-utils';\nimport {\n isUrl, getHostname, getParam, getPathname,\n} from './url-utils';\nimport {\n calculateAverage, roundNumber,\n} from './number-utils';\n\nexport {\n checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne, hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier,\n removeIfEndsWith, getLastAfter, includesStringArray, removeNewLines, reverseString, getParam, getPathname,\n getHostname, isUrl, isValidPrice, getMinPrice, isCheaper, getMaxPrice, getPriceOperation, getAvgPrice, calculateAverage,\n roundNumber, removeZeroPrices,\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import { Price } from '../entities';
2
+ export declare const hasMeasurementUnitMultiplier: (price: Price) => boolean;
2
3
  export declare const checkIfSamePrices: (_price: Price, _price2: Price) => boolean;
3
4
  export declare const isValidPrice: (price: Price) => boolean;
4
5
  export declare const removeZeroPrices: (price: Price) => Price;
@@ -6,4 +7,5 @@ export declare const getPriceOperation: (price: Price, fn: (...p: any[]) => numb
6
7
  export declare const getMinPrice: (price: Price) => number;
7
8
  export declare const getMaxPrice: (price: Price) => number;
8
9
  export declare const getAvgPrice: (price: Price) => number;
10
+ export declare const getPriceByMeasurementUnitMultiplier: (price: Price, minUnit?: number) => number;
9
11
  export declare const isCheaper: (price: Price, comparePrice: Price) => boolean | null;
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isCheaper = exports.getAvgPrice = exports.getMaxPrice = exports.getMinPrice = exports.getPriceOperation = exports.removeZeroPrices = exports.isValidPrice = exports.checkIfSamePrices = void 0;
3
+ exports.isCheaper = exports.getPriceByMeasurementUnitMultiplier = exports.getAvgPrice = exports.getMaxPrice = exports.getMinPrice = exports.getPriceOperation = exports.removeZeroPrices = exports.isValidPrice = exports.checkIfSamePrices = exports.hasMeasurementUnitMultiplier = void 0;
4
4
  const lodash_1 = require("lodash");
5
+ const entities_1 = require("../entities");
6
+ exports.hasMeasurementUnitMultiplier = (price) => !!price && !!price.unitMultiplier && !!price.measurementUnit;
5
7
  exports.checkIfSamePrices = (_price, _price2) => _price && _price2 && lodash_1.isEqual(lodash_1.pickBy({ normalPrice: _price.normalPrice, offerPrice: _price.offerPrice, cardPrice: _price.cardPrice }, lodash_1.identity), lodash_1.pickBy({ normalPrice: _price2.normalPrice, offerPrice: _price2.offerPrice, cardPrice: _price2.cardPrice }, lodash_1.identity));
6
8
  exports.isValidPrice = (price) => !(!price || (!price.normalPrice && !price.cardPrice && !price.offerPrice));
7
9
  exports.removeZeroPrices = (price) => {
@@ -36,12 +38,38 @@ exports.getAvgPrice = (price) => {
36
38
  };
37
39
  return exports.getPriceOperation(price, fn);
38
40
  };
41
+ exports.getPriceByMeasurementUnitMultiplier = (price, minUnit = 100) => {
42
+ if (!exports.hasMeasurementUnitMultiplier(price)) {
43
+ return null;
44
+ }
45
+ const { measurementUnit, unitMultiplier } = price;
46
+ const minPrice = exports.getMinPrice(price);
47
+ let value;
48
+ if ([entities_1.MeasurementUnitEnum.KG, entities_1.MeasurementUnitEnum.L].includes(measurementUnit)) {
49
+ const grams = unitMultiplier * 1000;
50
+ value = (minPrice / grams) * minUnit;
51
+ }
52
+ else if ([entities_1.MeasurementUnitEnum.G, entities_1.MeasurementUnitEnum.ML].includes(measurementUnit)) {
53
+ value = (minPrice / unitMultiplier) * minUnit;
54
+ }
55
+ else {
56
+ value = minPrice * unitMultiplier;
57
+ }
58
+ return value ? Math.round(value) : null;
59
+ };
39
60
  exports.isCheaper = (price, comparePrice) => {
40
61
  if (!exports.isValidPrice(price) || !exports.isValidPrice(comparePrice)) {
41
62
  return null;
42
63
  }
43
64
  const minPrice = exports.getMinPrice(price);
44
65
  const minComparePrice = exports.getMinPrice(comparePrice);
66
+ if (exports.hasMeasurementUnitMultiplier(price) && exports.hasMeasurementUnitMultiplier(comparePrice)) {
67
+ const minPriceWithMeasurementUnit = exports.getPriceByMeasurementUnitMultiplier(price);
68
+ const comparePriceWithMeasurementUnit = exports.getPriceByMeasurementUnitMultiplier(comparePrice);
69
+ if (minPriceWithMeasurementUnit && comparePriceWithMeasurementUnit) {
70
+ return minPriceWithMeasurementUnit < comparePriceWithMeasurementUnit;
71
+ }
72
+ }
45
73
  return minPrice < minComparePrice;
46
74
  };
47
75
  //# sourceMappingURL=price-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"price-utils.js","sourceRoot":"/","sources":["utils/price-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { identity, isEqual, pickBy } from 'lodash';\nimport { Price } from '../entities';\n\nexport const checkIfSamePrices = (_price: Price, _price2: Price): boolean => _price && _price2 && isEqual(\n pickBy({ normalPrice: _price.normalPrice, offerPrice: _price.offerPrice, cardPrice: _price.cardPrice }, identity),\n pickBy({ normalPrice: _price2.normalPrice, offerPrice: _price2.offerPrice, cardPrice: _price2.cardPrice }, identity),\n);\n\nexport const isValidPrice = (price: Price): boolean => !(!price || (!price.normalPrice && !price.cardPrice && !price.offerPrice));\n\nexport const removeZeroPrices = (price:Price): Price => {\n const removedZeroesPrice = price;\n\n if (!price.cardPrice) {\n delete removedZeroesPrice.cardPrice;\n }\n\n if (!price.normalPrice) {\n delete removedZeroesPrice.normalPrice;\n }\n\n if (!price.offerPrice) {\n delete removedZeroesPrice.offerPrice;\n }\n\n return removedZeroesPrice;\n};\n\nexport const getPriceOperation = (price: Price, fn: (...p) => number): number => {\n if (!price) {\n return null;\n }\n\n const arr = [price.normalPrice, price.offerPrice, price.cardPrice].filter((v) => v);\n if (arr.length === 0) {\n return null;\n }\n\n return fn(...arr);\n};\n\nexport const getMinPrice = (price: Price): number => getPriceOperation(price, Math.min);\n\nexport const getMaxPrice = (price: Price): number => getPriceOperation(price, Math.max);\n\nexport const getAvgPrice = (price: Price): number => {\n const fn = (...arr) => {\n const sum = arr.reduce(((previousValue, currentValue) => previousValue + currentValue));\n\n return (sum / arr.length);\n };\n\n return getPriceOperation(price, fn);\n};\n\nexport const isCheaper = (price: Price, comparePrice: Price): boolean | null => {\n if (!isValidPrice(price) || !isValidPrice(comparePrice)) {\n return null;\n }\n\n const minPrice = getMinPrice(price);\n const minComparePrice = getMinPrice(comparePrice);\n\n return minPrice < minComparePrice;\n};\n"]}
1
+ {"version":3,"file":"price-utils.js","sourceRoot":"/","sources":["utils/price-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { identity, isEqual, pickBy } from 'lodash';\nimport { MeasurementUnitEnum, Price } from '../entities';\n\nexport const hasMeasurementUnitMultiplier = (price: Price): boolean => !!price && !!price.unitMultiplier && !!price.measurementUnit;\n\nexport const checkIfSamePrices = (_price: Price, _price2: Price): boolean => _price && _price2 && isEqual(\n pickBy({ normalPrice: _price.normalPrice, offerPrice: _price.offerPrice, cardPrice: _price.cardPrice }, identity),\n pickBy({ normalPrice: _price2.normalPrice, offerPrice: _price2.offerPrice, cardPrice: _price2.cardPrice }, identity),\n);\n\nexport const isValidPrice = (price: Price): boolean => !(!price || (!price.normalPrice && !price.cardPrice && !price.offerPrice));\n\nexport const removeZeroPrices = (price:Price): Price => {\n const removedZeroesPrice = price;\n\n if (!price.cardPrice) {\n delete removedZeroesPrice.cardPrice;\n }\n\n if (!price.normalPrice) {\n delete removedZeroesPrice.normalPrice;\n }\n\n if (!price.offerPrice) {\n delete removedZeroesPrice.offerPrice;\n }\n\n return removedZeroesPrice;\n};\n\nexport const getPriceOperation = (price: Price, fn: (...p) => number): number => {\n if (!price) {\n return null;\n }\n\n const arr = [price.normalPrice, price.offerPrice, price.cardPrice].filter((v) => v);\n if (arr.length === 0) {\n return null;\n }\n\n return fn(...arr);\n};\n\nexport const getMinPrice = (price: Price): number => getPriceOperation(price, Math.min);\n\nexport const getMaxPrice = (price: Price): number => getPriceOperation(price, Math.max);\n\nexport const getAvgPrice = (price: Price): number => {\n const fn = (...arr) => {\n const sum = arr.reduce(((previousValue, currentValue) => previousValue + currentValue));\n\n return (sum / arr.length);\n };\n\n return getPriceOperation(price, fn);\n};\n\n// TODO: Adds tests\nexport const getPriceByMeasurementUnitMultiplier = (price: Price, minUnit = 100): number => {\n if (!hasMeasurementUnitMultiplier(price)) {\n return null;\n }\n\n const { measurementUnit, unitMultiplier } = price;\n\n const minPrice = getMinPrice(price);\n\n let value;\n if ([MeasurementUnitEnum.KG, MeasurementUnitEnum.L].includes(measurementUnit)) {\n const grams = unitMultiplier * 1000;\n value = (minPrice / grams) * minUnit;\n } else if ([MeasurementUnitEnum.G, MeasurementUnitEnum.ML].includes(measurementUnit)) {\n value = (minPrice / unitMultiplier) * minUnit;\n } else {\n value = minPrice * unitMultiplier;\n }\n\n return value ? Math.round(value) : null;\n};\n\nexport const isCheaper = (price: Price, comparePrice: Price): boolean | null => {\n if (!isValidPrice(price) || !isValidPrice(comparePrice)) {\n return null;\n }\n\n const minPrice = getMinPrice(price);\n const minComparePrice = getMinPrice(comparePrice);\n\n if (hasMeasurementUnitMultiplier(price) && hasMeasurementUnitMultiplier(comparePrice)) {\n const minPriceWithMeasurementUnit = getPriceByMeasurementUnitMultiplier(price);\n const comparePriceWithMeasurementUnit = getPriceByMeasurementUnitMultiplier(comparePrice);\n\n if (minPriceWithMeasurementUnit && comparePriceWithMeasurementUnit) {\n return minPriceWithMeasurementUnit < comparePriceWithMeasurementUnit;\n }\n }\n\n return minPrice < minComparePrice;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "store-scrapper-js-common",
3
- "version": "1.0.73",
3
+ "version": "1.0.74",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  checkIfSamePrices, isCheaper, getMinPrice, isValidPrice, getAvgPrice, getMaxPrice, getPriceOperation, removeZeroPrices,
3
+ hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier,
3
4
  } from './price-utils';
4
5
  import { findLastQuery } from './entity-queries-utils';
5
6
  import {
@@ -14,7 +15,7 @@ import {
14
15
  } from './number-utils';
15
16
 
16
17
  export {
17
- checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne,
18
+ checkIfSamePrices, findLastQuery, replaceMultipleSpacesByOne, hasMeasurementUnitMultiplier, getPriceByMeasurementUnitMultiplier,
18
19
  removeIfEndsWith, getLastAfter, includesStringArray, removeNewLines, reverseString, getParam, getPathname,
19
20
  getHostname, isUrl, isValidPrice, getMinPrice, isCheaper, getMaxPrice, getPriceOperation, getAvgPrice, calculateAverage,
20
21
  roundNumber, removeZeroPrices,
@@ -1,5 +1,7 @@
1
1
  import { identity, isEqual, pickBy } from 'lodash';
2
- import { Price } from '../entities';
2
+ import { MeasurementUnitEnum, Price } from '../entities';
3
+
4
+ export const hasMeasurementUnitMultiplier = (price: Price): boolean => !!price && !!price.unitMultiplier && !!price.measurementUnit;
3
5
 
4
6
  export const checkIfSamePrices = (_price: Price, _price2: Price): boolean => _price && _price2 && isEqual(
5
7
  pickBy({ normalPrice: _price.normalPrice, offerPrice: _price.offerPrice, cardPrice: _price.cardPrice }, identity),
@@ -53,6 +55,29 @@ export const getAvgPrice = (price: Price): number => {
53
55
  return getPriceOperation(price, fn);
54
56
  };
55
57
 
58
+ // TODO: Adds tests
59
+ export const getPriceByMeasurementUnitMultiplier = (price: Price, minUnit = 100): number => {
60
+ if (!hasMeasurementUnitMultiplier(price)) {
61
+ return null;
62
+ }
63
+
64
+ const { measurementUnit, unitMultiplier } = price;
65
+
66
+ const minPrice = getMinPrice(price);
67
+
68
+ let value;
69
+ if ([MeasurementUnitEnum.KG, MeasurementUnitEnum.L].includes(measurementUnit)) {
70
+ const grams = unitMultiplier * 1000;
71
+ value = (minPrice / grams) * minUnit;
72
+ } else if ([MeasurementUnitEnum.G, MeasurementUnitEnum.ML].includes(measurementUnit)) {
73
+ value = (minPrice / unitMultiplier) * minUnit;
74
+ } else {
75
+ value = minPrice * unitMultiplier;
76
+ }
77
+
78
+ return value ? Math.round(value) : null;
79
+ };
80
+
56
81
  export const isCheaper = (price: Price, comparePrice: Price): boolean | null => {
57
82
  if (!isValidPrice(price) || !isValidPrice(comparePrice)) {
58
83
  return null;
@@ -61,5 +86,14 @@ export const isCheaper = (price: Price, comparePrice: Price): boolean | null =>
61
86
  const minPrice = getMinPrice(price);
62
87
  const minComparePrice = getMinPrice(comparePrice);
63
88
 
89
+ if (hasMeasurementUnitMultiplier(price) && hasMeasurementUnitMultiplier(comparePrice)) {
90
+ const minPriceWithMeasurementUnit = getPriceByMeasurementUnitMultiplier(price);
91
+ const comparePriceWithMeasurementUnit = getPriceByMeasurementUnitMultiplier(comparePrice);
92
+
93
+ if (minPriceWithMeasurementUnit && comparePriceWithMeasurementUnit) {
94
+ return minPriceWithMeasurementUnit < comparePriceWithMeasurementUnit;
95
+ }
96
+ }
97
+
64
98
  return minPrice < minComparePrice;
65
99
  };
@@ -1,8 +1,8 @@
1
1
  import {
2
- checkIfSamePrices, Price, getMinPrice, isCheaper, removeZeroPrices,
2
+ checkIfSamePrices, Price, getMinPrice, isCheaper, removeZeroPrices, hasMeasurementUnitMultiplier,
3
+ getAvgPrice, getMaxPrice, getPriceByMeasurementUnitMultiplier,
4
+ isValidPrice,
3
5
  } from '../../src';
4
- import { getAvgPrice, getMaxPrice } from '../../src/utils/price-utils';
5
- import { isValidPrice } from '../../dist';
6
6
 
7
7
  describe('price utils tests', () => {
8
8
  it('should check if both Prices objects are equal', () => {
@@ -56,6 +56,81 @@ describe('price utils tests', () => {
56
56
  expect(isCheaper(<Price>{ offerPrice: 2, cardPrice: 1 }, <Price>{ normalPrice: 2 })).toStrictEqual(true);
57
57
  });
58
58
 
59
+ it('should return true if price is cheaper than comparing price using measurement unit', () => {
60
+ expect.hasAssertions();
61
+
62
+ // Real example from Santa Isabel
63
+ expect(isCheaper(
64
+ <Price>{ measurementUnit: 'kg', unitMultiplier: 0.1, normalPrice: 720 },
65
+ <Price>{ measurementUnit: 'kg', unitMultiplier: 1.0, normalPrice: 7196 },
66
+ )).toStrictEqual(false);
67
+
68
+ expect(isCheaper(
69
+ <Price>{ normalPrice: 100, unitMultiplier: 0.1, measurementUnit: 'kg' },
70
+ <Price>{ offerPrice: 1000, unitMultiplier: 1, measurementUnit: 'kg' },
71
+ )).toStrictEqual(false);
72
+
73
+ expect(isCheaper(
74
+ <Price>{
75
+ normalPrice: 100, offerPrice: 2, unitMultiplier: 0.1, measurementUnit: 'kg',
76
+ },
77
+ <Price>{
78
+ cardPrice: 1, offerPrice: 1000, unitMultiplier: 1, measurementUnit: 'kg',
79
+ },
80
+ )).toStrictEqual(false);
81
+
82
+ expect(isCheaper(
83
+ <Price>{ normalPrice: 100, unitMultiplier: 1, measurementUnit: 'kg' },
84
+ <Price>{ cardPrice: 900, unitMultiplier: 1, measurementUnit: 'kg' },
85
+ )).toStrictEqual(true);
86
+
87
+ expect(isCheaper(<Price>{ normalPrice: 100, unitMultiplier: 0.1, measurementUnit: 'kg' },
88
+ <Price>{
89
+ cardPrice: 150, offerPrice: 300, unitMultiplier: 0.1, measurementUnit: 'kg',
90
+ })).toStrictEqual(true);
91
+
92
+ expect(isCheaper(
93
+ <Price>{ normalPrice: 90, unitMultiplier: 0.1, measurementUnit: 'kg' },
94
+ <Price>{ cardPrice: 1000, unitMultiplier: 1, measurementUnit: 'kg' },
95
+ )).toStrictEqual(true);
96
+
97
+ // Second item without measurementUnit nor unitMultiplier
98
+ expect(isCheaper(
99
+ <Price>{ normalPrice: 100, unitMultiplier: 0.1, measurementUnit: 'kg' },
100
+ <Price>{ offerPrice: 1000 },
101
+ )).toStrictEqual(true);
102
+ });
103
+
104
+ it('should return true if price have measurement unit and multiplier', () => {
105
+ expect.hasAssertions();
106
+
107
+ expect(hasMeasurementUnitMultiplier(null)).toStrictEqual(false);
108
+ expect(hasMeasurementUnitMultiplier(<Price>{ })).toStrictEqual(false);
109
+ expect(hasMeasurementUnitMultiplier(<Price>{ unitMultiplier: 1 })).toStrictEqual(false);
110
+ expect(hasMeasurementUnitMultiplier(<Price>{ measurementUnit: 'kg' })).toStrictEqual(false);
111
+
112
+ expect(hasMeasurementUnitMultiplier(<Price>{ unitMultiplier: 1, measurementUnit: 'kg' })).toStrictEqual(true);
113
+ });
114
+
115
+ it('should return minimum price unit using measurement unit and unit multiplier', () => {
116
+ expect.hasAssertions();
117
+
118
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{})).toBeNull();
119
+
120
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 1000, unitMultiplier: 1, measurementUnit: 'unit' })).toStrictEqual(1000);
121
+
122
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 120000, unitMultiplier: 1.2, measurementUnit: 'kg' })).toStrictEqual(10000);
123
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 100000, unitMultiplier: 1.0, measurementUnit: 'kg' })).toStrictEqual(10000);
124
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 10000, unitMultiplier: 0.1, measurementUnit: 'kg' })).toStrictEqual(10000);
125
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 20000, unitMultiplier: 0.2, measurementUnit: 'kg' })).toStrictEqual(10000);
126
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 1000, unitMultiplier: 100, measurementUnit: 'g' })).toStrictEqual(1000);
127
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 100, unitMultiplier: 10, measurementUnit: 'g' })).toStrictEqual(1000);
128
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 10, unitMultiplier: 1, measurementUnit: 'g' })).toStrictEqual(1000);
129
+
130
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 10000, unitMultiplier: 0.1, measurementUnit: 'l' })).toStrictEqual(10000);
131
+ expect(getPriceByMeasurementUnitMultiplier(<Price>{ normalPrice: 1000, unitMultiplier: 100, measurementUnit: 'ml' })).toStrictEqual(1000);
132
+ });
133
+
59
134
  it('should remove prices with value of 0', () => {
60
135
  expect.hasAssertions();
61
136