store-scrapper-js-common 1.0.205 → 1.0.207
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.
- package/dist/utils/product.utils.js +0 -4
- package/dist/utils/product.utils.js.map +1 -1
- package/dist/utils/string-formatter.js +1 -1
- package/dist/utils/string-formatter.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/product.utils.ts +6 -5
- package/src/utils/string-formatter.ts +3 -4
- package/tests/utils/string-formatter.test.ts +9 -4
|
@@ -37,10 +37,6 @@ const parseProductDtoToTypesenseDocument = (product) => {
|
|
|
37
37
|
if (maxDiscount === 0 ||
|
|
38
38
|
ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct) {
|
|
39
39
|
maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;
|
|
40
|
-
const useDate = ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;
|
|
41
|
-
if (useDate) {
|
|
42
|
-
priceUpdatedAt = new Date(useDate).getTime();
|
|
43
|
-
}
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
42
|
if (maxDiscount === 0 && ref.priceStats.currentPricePrevPriceDiffPct > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.utils.js","sourceRoot":"/","sources":["utils/product.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {hasElementInArray, isArrayEmpty} from './array-utils';\nimport {CATEGORY_ENUM, CurrencyEnum, Product, Store, UpdateReasonEnum} from '../entities';\nimport {ObjectLiteral} from \"../classes\";\nimport {getMinPrice} from \"./price-utils\";\nimport {getCategoryFacetLabel} from \"./facet-categories-map\";\nimport {getBucketTime} from \"./time-utils\";\nimport {getStringsAsStrArr, normalizeString} from \"./string-utils\";\n\nexport const getStoreName = (product: Product, stores: Store[]): string => {\n if ((!stores || stores.length === 0) && product) {\n return product.storeName;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n const store = stores.find((storeElement) => storeElement._id.toString() === product.storeRef);\n if (store) {\n return store.displayName || store.name;\n }\n\n return null;\n};\n\nexport const hasUpdateReason = (enums: UpdateReasonEnum[], search: UpdateReasonEnum[]): boolean => hasElementInArray<UpdateReasonEnum>(enums, search);\n\nexport const parseProductDtoToTypesenseDocument = (product: Product): ObjectLiteral => {\n if (!product) {\n return null;\n }\n\n const ref: Product = JSON.parse(JSON.stringify(product));\n\n let priceStats = null;\n\n let priceUpdatedAt = new Date(\n ref.price.updatedAt || ref.price.createdAt || ref.extractedAt || ref.updatedAt,\n ).getTime();\n\n if (ref.priceStats) {\n // TODO: Search how to look for specific pivot prices in Typesense search\n // Slice 3 pivot prices\n const pivotPrices = (ref.priceStats.pivotPrices || []).slice(0, 3);\n\n // Add max discount single field\n // Prioritize Current Offer and Conditional Price\n // If neither of those exists then use previous price\n let maxDiscount = 0;\n if (ref.priceStats.currentMinPriceMaxPriceDiffPct > 0) {\n maxDiscount = ref.priceStats.currentMinPriceMaxPriceDiffPct;\n }\n\n // TODO: Was updated to use currentMaxPrice, update or create a new field\n if (ref.priceStats.conditionalPriceMinPriceDiffPct) {\n if (\n maxDiscount === 0 ||\n ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct\n ) {\n maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;\n const useDate =\n ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;\n if (useDate) {\n priceUpdatedAt = new Date(useDate).getTime();\n }\n }\n }\n\n if (maxDiscount === 0 && ref.priceStats.currentPricePrevPriceDiffPct > 0) {\n let hasFakePrevPrice = false;\n\n // Pedidos Ya CL set to only use current price\n if (product.storeRef === '634b4c2ebf4c49e4b3672aba') {\n hasFakePrevPrice = true;\n }\n\n if (!hasFakePrevPrice && (!product.currency || product.currency === CurrencyEnum.CLP)) {\n const minPrevPrice = getMinPrice(ref.previousPrice);\n const minPrevPriceStr = minPrevPrice.toString();\n if (minPrevPrice > 0) {\n if (product.isMarketplace && minPrevPriceStr.endsWith('000')) {\n hasFakePrevPrice = true;\n }\n\n if (minPrevPrice === 9999999 || minPrevPrice === 10000000) {\n hasFakePrevPrice = true;\n }\n } else {\n hasFakePrevPrice = true;\n }\n }\n\n if (!hasFakePrevPrice) {\n maxDiscount = ref.priceStats.currentPricePrevPriceDiffPct;\n }\n }\n\n priceStats = {\n priceStats_pricesCount: ref.priceStats.pricesCount,\n priceStats_avgMinPrice: ref.priceStats.avgMinPrice,\n priceStats_currentMinPrice: ref.priceStats.currentMinPrice,\n priceStats_currentMaxPrice: ref.priceStats.currentMaxPrice,\n priceStats_currentPriceBestPriceDiffPct: ref.priceStats.currentPriceBestPriceDiffPct,\n priceStats_currentPricePrevPriceDiffPct: ref.priceStats.currentPricePrevPriceDiffPct,\n priceStats_currentMinPriceMaxPriceDiffPct: ref.priceStats.currentMinPriceMaxPriceDiffPct,\n priceStats_conditionalPriceMinPriceDiffPct: ref.priceStats.conditionalPriceMinPriceDiffPct || 0,\n priceStats_currentPriceAvgMinPriceDiffPct: ref.priceStats.currentPriceAvgMinPriceDiffPct,\n priceStats_maxDiscountPct: maxDiscount,\n priceStats_pivotPrices: pivotPrices,\n };\n }\n\n // If it doesn't have a price down or relisted or new listing then use current time - 30m to show to all users in web\n let customBucketTimeDate: Date | null = null;\n if (\n !hasUpdateReason(\n [UpdateReasonEnum.PRICE_DOWN, UpdateReasonEnum.RE_LISTING, UpdateReasonEnum.NEW_LISTING],\n product.updateReason,\n )\n ) {\n customBucketTimeDate = new Date(Date.now() - 1000 * 60 * 30);\n }\n\n // TODO: Append inferred categories to ref.categoryKeywordNames\n // TODO: Only append categories found in categoriesEnEsMap\n let foundCategories: string[] = [...(ref.categoryKeywordNames || [])];\n if (!isArrayEmpty(ref.inferredCategories)) {\n ref.inferredCategories.forEach((inferredCategory) => {\n if (getCategoryFacetLabel({ key: inferredCategory })) {\n foundCategories.push(inferredCategory);\n }\n });\n\n // remove CATEGORY_NOT_FOUND\n // as it found inferred categories\n foundCategories = foundCategories.filter((category) => category !== CATEGORY_ENUM.CATEGORY_NOT_FOUND);\n }\n\n let inferredCategories: string[] = [];\n if (!isArrayEmpty(ref.inferredCategories)) {\n inferredCategories = getStringsAsStrArr(ref.inferredCategories);\n }\n\n const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());\n const bucketData = getBucketTime(customBucketTimeDate || updatedAtDate);\n\n return <ObjectLiteral>{\n id: ref._id,\n ...priceStats,\n storeRef: ref.storeRef,\n storeName: ref.storeName || 'no store name',\n isMarketplace: ref.isMarketplace === true,\n name: ref.name || 'no name',\n sku: ref.sku,\n ean: ref.ean,\n url: ref.url,\n image: ref.image,\n brandName: ref.brandName ? normalizeString(ref.brandName) : undefined,\n sellerName: ref.sellerName,\n // priceStats: priceStats,\n category: ref.category,\n categoryPath: ref.categoryPath,\n price: ref.price,\n bestPrice: ref.bestPrice,\n conditionalPrice: ref.conditionalPrice,\n priceHistory: ref.priceHistory,\n currency: ref.currency || CurrencyEnum.CLP,\n enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null,\n categoryKeywordNames: foundCategories, // ref.categoryKeywordNames,\n inferredCategories: inferredCategories,\n updateReasons: (ref.updateReason || []).filter((e) => e),\n updatedAt: updatedAtDate.getTime(),\n priceUpdatedAt: priceUpdatedAt,\n updatedAtUnixTime: Math.floor(updatedAtDate.getTime() / 1000),\n priceUpdatedAtUnixTime: Math.floor(priceUpdatedAt / 1000),\n bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined,\n bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"product.utils.js","sourceRoot":"/","sources":["utils/product.utils.ts"],"names":[],"mappings":";;;AAAA,+CAA8D;AAC9D,0CAA0F;AAE1F,+CAA0C;AAC1C,iEAA6D;AAC7D,6CAA2C;AAC3C,iDAAmE;AAE5D,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,MAAe,EAAU,EAAE;IACxE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,SAAS,CAAC;IAC3B,CAAC;IAGD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9F,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAEK,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAE,MAA0B,EAAW,EAAE,CAAC,IAAA,+BAAiB,EAAmB,KAAK,EAAE,MAAM,CAAC,CAAC;AAAzI,QAAA,eAAe,mBAA0H;AAE/I,MAAM,kCAAkC,GAAG,CAAC,OAAgB,EAAiB,EAAE;IACpF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzD,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB,IAAI,cAAc,GAAG,IAAI,IAAI,CACzB,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CACjF,CAAC,OAAO,EAAE,CAAC;IAEZ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAGnB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAKnE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,8BAA8B,GAAG,CAAC,EAAE,CAAC;YACtD,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAC9D,CAAC;QAGD,IAAI,GAAG,CAAC,UAAU,CAAC,+BAA+B,EAAE,CAAC;YACnD,IACI,WAAW,KAAK,CAAC;gBACjB,GAAG,CAAC,UAAU,CAAC,+BAA+B,GAAG,GAAG,CAAC,UAAU,CAAC,8BAA8B,EAChG,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,+BAA+B,CAAC;YAO/D,CAAC;QACH,CAAC;QAED,IAAI,WAAW,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,4BAA4B,GAAG,CAAC,EAAE,CAAC;YACzE,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAG7B,IAAI,OAAO,CAAC,QAAQ,KAAK,0BAA0B,EAAE,CAAC;gBACpD,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,uBAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtF,MAAM,YAAY,GAAG,IAAA,yBAAW,EAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACpD,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAChD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,IAAI,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7D,gBAAgB,GAAG,IAAI,CAAC;oBAC1B,CAAC;oBAED,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;wBAC1D,gBAAgB,GAAG,IAAI,CAAC;oBAC1B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,4BAA4B,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,UAAU,GAAG;YACX,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;YAClD,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;YAClD,0BAA0B,EAAE,GAAG,CAAC,UAAU,CAAC,eAAe;YAC1D,0BAA0B,EAAE,GAAG,CAAC,UAAU,CAAC,eAAe;YAC1D,uCAAuC,EAAE,GAAG,CAAC,UAAU,CAAC,4BAA4B;YACpF,uCAAuC,EAAE,GAAG,CAAC,UAAU,CAAC,4BAA4B;YACpF,yCAAyC,EAAE,GAAG,CAAC,UAAU,CAAC,8BAA8B;YACxF,0CAA0C,EAAE,GAAG,CAAC,UAAU,CAAC,+BAA+B,IAAI,CAAC;YAC/F,yCAAyC,EAAE,GAAG,CAAC,UAAU,CAAC,8BAA8B;YACxF,yBAAyB,EAAE,WAAW;YACtC,sBAAsB,EAAE,WAAW;SACpC,CAAC;IACJ,CAAC;IAGD,IAAI,oBAAoB,GAAgB,IAAI,CAAC;IAC7C,IACI,CAAC,IAAA,uBAAe,EACZ,CAAC,2BAAgB,CAAC,UAAU,EAAE,2BAAgB,CAAC,UAAU,EAAE,2BAAgB,CAAC,WAAW,CAAC,EACxF,OAAO,CAAC,YAAY,CACvB,EACH,CAAC;QACD,oBAAoB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAID,IAAI,eAAe,GAAa,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAA,0BAAY,EAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,EAAE;YAClD,IAAI,IAAA,4CAAqB,EAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;gBACrD,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAIH,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,wBAAa,CAAC,kBAAkB,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,kBAAkB,GAAa,EAAE,CAAC;IACtC,IAAI,CAAC,IAAA,0BAAY,EAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,kBAAkB,GAAG,IAAA,iCAAkB,EAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,IAAA,0BAAa,EAAC,oBAAoB,IAAI,aAAa,CAAC,CAAC;IAExE,OAAO,8BACL,EAAE,EAAE,GAAG,CAAC,GAAG,IACR,UAAU,KACb,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,eAAe,EAC3C,aAAa,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,EACzC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS,EAC3B,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,8BAAe,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EACrE,UAAU,EAAE,GAAG,CAAC,UAAU,EAE1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EACtC,YAAY,EAAE,GAAG,CAAC,YAAY,EAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,uBAAY,CAAC,GAAG,EAC1C,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAC3F,oBAAoB,EAAE,eAAe,EACrC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EACxD,SAAS,EAAE,aAAa,CAAC,OAAO,EAAE,EAClC,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAC7D,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,EACzD,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACnF,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,GACpF,CAAC;AACJ,CAAC,CAAC;AAxJW,QAAA,kCAAkC,sCAwJ7C","sourcesContent":["import {hasElementInArray, isArrayEmpty} from './array-utils';\nimport {CATEGORY_ENUM, CurrencyEnum, Product, Store, UpdateReasonEnum} from '../entities';\nimport {ObjectLiteral} from \"../classes\";\nimport {getMinPrice} from \"./price-utils\";\nimport {getCategoryFacetLabel} from \"./facet-categories-map\";\nimport {getBucketTime} from \"./time-utils\";\nimport {getStringsAsStrArr, normalizeString} from \"./string-utils\";\n\nexport const getStoreName = (product: Product, stores: Store[]): string => {\n if ((!stores || stores.length === 0) && product) {\n return product.storeName;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n const store = stores.find((storeElement) => storeElement._id.toString() === product.storeRef);\n if (store) {\n return store.displayName || store.name;\n }\n\n return null;\n};\n\nexport const hasUpdateReason = (enums: UpdateReasonEnum[], search: UpdateReasonEnum[]): boolean => hasElementInArray<UpdateReasonEnum>(enums, search);\n\nexport const parseProductDtoToTypesenseDocument = (product: Product): ObjectLiteral => {\n if (!product) {\n return null;\n }\n\n const ref: Product = JSON.parse(JSON.stringify(product));\n\n let priceStats = null;\n\n let priceUpdatedAt = new Date(\n ref.price.updatedAt || ref.price.createdAt || ref.extractedAt || ref.updatedAt,\n ).getTime();\n\n if (ref.priceStats) {\n // TODO: Search how to look for specific pivot prices in Typesense search\n // Slice 3 pivot prices\n const pivotPrices = (ref.priceStats.pivotPrices || []).slice(0, 3);\n\n // Add max discount single field\n // Prioritize Current Offer and Conditional Price\n // If neither of those exists then use previous price\n let maxDiscount = 0;\n if (ref.priceStats.currentMinPriceMaxPriceDiffPct > 0) {\n maxDiscount = ref.priceStats.currentMinPriceMaxPriceDiffPct;\n }\n\n // TODO: Was updated to use currentMaxPrice, update or create a new field\n if (ref.priceStats.conditionalPriceMinPriceDiffPct) {\n if (\n maxDiscount === 0 ||\n ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct\n ) {\n maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;\n\n // don't use conditional price createdAt as it is not persisted with dates on products svc\n // const useDate = ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;\n // if (useDate) {\n // priceUpdatedAt = new Date(useDate).getTime();\n // }\n }\n }\n\n if (maxDiscount === 0 && ref.priceStats.currentPricePrevPriceDiffPct > 0) {\n let hasFakePrevPrice = false;\n\n // Pedidos Ya CL set to only use current price\n if (product.storeRef === '634b4c2ebf4c49e4b3672aba') {\n hasFakePrevPrice = true;\n }\n\n if (!hasFakePrevPrice && (!product.currency || product.currency === CurrencyEnum.CLP)) {\n const minPrevPrice = getMinPrice(ref.previousPrice);\n const minPrevPriceStr = minPrevPrice.toString();\n if (minPrevPrice > 0) {\n if (product.isMarketplace && minPrevPriceStr.endsWith('000')) {\n hasFakePrevPrice = true;\n }\n\n if (minPrevPrice === 9999999 || minPrevPrice === 10000000) {\n hasFakePrevPrice = true;\n }\n } else {\n hasFakePrevPrice = true;\n }\n }\n\n if (!hasFakePrevPrice) {\n maxDiscount = ref.priceStats.currentPricePrevPriceDiffPct;\n }\n }\n\n priceStats = {\n priceStats_pricesCount: ref.priceStats.pricesCount,\n priceStats_avgMinPrice: ref.priceStats.avgMinPrice,\n priceStats_currentMinPrice: ref.priceStats.currentMinPrice,\n priceStats_currentMaxPrice: ref.priceStats.currentMaxPrice,\n priceStats_currentPriceBestPriceDiffPct: ref.priceStats.currentPriceBestPriceDiffPct,\n priceStats_currentPricePrevPriceDiffPct: ref.priceStats.currentPricePrevPriceDiffPct,\n priceStats_currentMinPriceMaxPriceDiffPct: ref.priceStats.currentMinPriceMaxPriceDiffPct,\n priceStats_conditionalPriceMinPriceDiffPct: ref.priceStats.conditionalPriceMinPriceDiffPct || 0,\n priceStats_currentPriceAvgMinPriceDiffPct: ref.priceStats.currentPriceAvgMinPriceDiffPct,\n priceStats_maxDiscountPct: maxDiscount,\n priceStats_pivotPrices: pivotPrices,\n };\n }\n\n // If it doesn't have a price down or relisted or new listing then use current time - 30m to show to all users in web\n let customBucketTimeDate: Date | null = null;\n if (\n !hasUpdateReason(\n [UpdateReasonEnum.PRICE_DOWN, UpdateReasonEnum.RE_LISTING, UpdateReasonEnum.NEW_LISTING],\n product.updateReason,\n )\n ) {\n customBucketTimeDate = new Date(Date.now() - 1000 * 60 * 30);\n }\n\n // TODO: Append inferred categories to ref.categoryKeywordNames\n // TODO: Only append categories found in categoriesEnEsMap\n let foundCategories: string[] = [...(ref.categoryKeywordNames || [])];\n if (!isArrayEmpty(ref.inferredCategories)) {\n ref.inferredCategories.forEach((inferredCategory) => {\n if (getCategoryFacetLabel({ key: inferredCategory })) {\n foundCategories.push(inferredCategory);\n }\n });\n\n // remove CATEGORY_NOT_FOUND\n // as it found inferred categories\n foundCategories = foundCategories.filter((category) => category !== CATEGORY_ENUM.CATEGORY_NOT_FOUND);\n }\n\n let inferredCategories: string[] = [];\n if (!isArrayEmpty(ref.inferredCategories)) {\n inferredCategories = getStringsAsStrArr(ref.inferredCategories);\n }\n\n const updatedAtDate = new Date(ref.updatedAt || ref.extractedAt || Date.now());\n const bucketData = getBucketTime(customBucketTimeDate || updatedAtDate);\n\n return <ObjectLiteral>{\n id: ref._id,\n ...priceStats,\n storeRef: ref.storeRef,\n storeName: ref.storeName || 'no store name',\n isMarketplace: ref.isMarketplace === true,\n name: ref.name || 'no name',\n sku: ref.sku,\n ean: ref.ean,\n url: ref.url,\n image: ref.image,\n brandName: ref.brandName ? normalizeString(ref.brandName) : undefined,\n sellerName: ref.sellerName,\n // priceStats: priceStats,\n category: ref.category,\n categoryPath: ref.categoryPath,\n price: ref.price,\n bestPrice: ref.bestPrice,\n conditionalPrice: ref.conditionalPrice,\n priceHistory: ref.priceHistory,\n currency: ref.currency || CurrencyEnum.CLP,\n enabled: ref.enabled === true || typeof ref.enabled === 'undefined' || ref.enabled === null,\n categoryKeywordNames: foundCategories, // ref.categoryKeywordNames,\n inferredCategories: inferredCategories,\n updateReasons: (ref.updateReason || []).filter((e) => e),\n updatedAt: updatedAtDate.getTime(),\n priceUpdatedAt: priceUpdatedAt,\n updatedAtUnixTime: Math.floor(updatedAtDate.getTime() / 1000),\n priceUpdatedAtUnixTime: Math.floor(priceUpdatedAt / 1000),\n bucketTime: bucketData && bucketData.bucketTime ? bucketData.bucketTime : undefined,\n bucketDate: bucketData && bucketData.bucketDate ? bucketData.bucketDate : undefined,\n };\n};\n"]}
|
|
@@ -57,7 +57,7 @@ const formatMoney = (money, currency) => {
|
|
|
57
57
|
return '';
|
|
58
58
|
}
|
|
59
59
|
let moneyStr = money.toString();
|
|
60
|
-
if (moneyStr && (0, array_utils_1.hasElementInArray)([currency], [entities_1.CurrencyEnum.ARS]) && moneyStr.includes('.')) {
|
|
60
|
+
if (moneyStr && (0, array_utils_1.hasElementInArray)([currency], [entities_1.CurrencyEnum.ARS, entities_1.CurrencyEnum.USD]) && moneyStr.includes('.')) {
|
|
61
61
|
const beforeDot = moneyStr.split('.')[0];
|
|
62
62
|
const afterDot = moneyStr.split('.')[1];
|
|
63
63
|
const useDecimals = afterDot.length >= 2 ? 2 : afterDot.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-formatter.js","sourceRoot":"/","sources":["utils/string-formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"string-formatter.js","sourceRoot":"/","sources":["utils/string-formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import * as moment from 'moment-timezone';\nimport {CurrencyEnum} from '../entities';\nimport {hasElementInArray} from './array-utils';\n\nexport const addThousandSeparator = (str: string, separator = '.') => {\n let nStr = (`${str}`);\n if (nStr && separator === ',') {\n nStr = nStr.replace(',', '.');\n }\n\n const x = nStr.split(separator);\n let x1 = x[0];\n const x2 = x.length > 1 ? `${separator}${x[1]}` : '';\n const rgx = /(\\d+)(\\d{3})/;\n while (rgx.test(x1)) {\n x1 = x1.replace(rgx, `$1${separator}$2`);\n }\n return x1 + x2;\n};\n\nexport const formatMoney = (money: number | string, currency?: CurrencyEnum): string => {\n if (!money) {\n return '';\n }\n\n let moneyStr = money.toString();\n\n if (moneyStr && hasElementInArray([currency], [CurrencyEnum.ARS, CurrencyEnum.USD]) && moneyStr.includes('.')) {\n const beforeDot = moneyStr.split('.')[0];\n const afterDot = moneyStr.split('.')[1];\n\n const useDecimals = afterDot.length >= 2 ? 2 : afterDot.length;\n\n moneyStr = `${beforeDot}.${afterDot.substring(0, useDecimals)}`;\n }\n\n if (typeof money === 'number') {\n moneyStr = moneyStr.replace(/\\./g, ',');\n }\n\n let appendSign = currency && currency.toLowerCase().includes('pts') ? ' (pts)' : '';\n let prependSign = '';\n let thousandSeparator = '.';\n\n if (currency === CurrencyEnum.USD) {\n prependSign = 'U$';\n thousandSeparator = ',';\n } else if (currency === CurrencyEnum.EUR) {\n appendSign = `€ ${appendSign}`.trim();\n } else if (currency === CurrencyEnum.MXN) {\n prependSign = '$';\n thousandSeparator = ',';\n } else if (!currency || !currency.toLowerCase().includes('pts')) {\n prependSign = '$';\n }\n\n return prependSign + addThousandSeparator(moneyStr, thousandSeparator) + appendSign;\n};\n\nexport const formatDate = (str: string, timezone = 'America/Santiago', format = 'DD-MM-YYYY HH:mm:ss'): string => {\n if (!str) {\n return '';\n }\n\n const date = new Date(str);\n\n return moment.tz(date, timezone).format(format);\n};\n\nexport const formatPct = (pct: number | string): string => {\n if (!pct) {\n return '';\n }\n\n return `${pct}%`.replace('.', ',');\n};\n"]}
|
package/package.json
CHANGED
|
@@ -55,11 +55,12 @@ export const parseProductDtoToTypesenseDocument = (product: Product): ObjectLite
|
|
|
55
55
|
ref.priceStats.conditionalPriceMinPriceDiffPct > ref.priceStats.currentMinPriceMaxPriceDiffPct
|
|
56
56
|
) {
|
|
57
57
|
maxDiscount = ref.priceStats.conditionalPriceMinPriceDiffPct;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
|
|
59
|
+
// don't use conditional price createdAt as it is not persisted with dates on products svc
|
|
60
|
+
// const useDate = ref.conditionalPrice && ref.conditionalPrice.createdAt ? ref.conditionalPrice.createdAt : ref.extractedAt;
|
|
61
|
+
// if (useDate) {
|
|
62
|
+
// priceUpdatedAt = new Date(useDate).getTime();
|
|
63
|
+
// }
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as moment from 'moment-timezone';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import {CurrencyEnum} from '../entities';
|
|
3
|
+
import {hasElementInArray} from './array-utils';
|
|
4
4
|
|
|
5
5
|
export const addThousandSeparator = (str: string, separator = '.') => {
|
|
6
6
|
let nStr = (`${str}`);
|
|
@@ -25,8 +25,7 @@ export const formatMoney = (money: number | string, currency?: CurrencyEnum): st
|
|
|
25
25
|
|
|
26
26
|
let moneyStr = money.toString();
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
if (moneyStr && hasElementInArray([currency], [CurrencyEnum.ARS]) && moneyStr.includes('.')) {
|
|
28
|
+
if (moneyStr && hasElementInArray([currency], [CurrencyEnum.ARS, CurrencyEnum.USD]) && moneyStr.includes('.')) {
|
|
30
29
|
const beforeDot = moneyStr.split('.')[0];
|
|
31
30
|
const afterDot = moneyStr.split('.')[1];
|
|
32
31
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from '../../src/utils/string-formatter';
|
|
4
|
-
import { CurrencyEnum } from '../../src/entities';
|
|
1
|
+
import {addThousandSeparator, formatDate, formatMoney, formatPct,} from '../../src/utils/string-formatter';
|
|
2
|
+
import {CurrencyEnum} from '../../src/entities';
|
|
5
3
|
|
|
6
4
|
describe('string formatter', () => {
|
|
7
5
|
it('should add thousand separator', () => {
|
|
@@ -58,6 +56,13 @@ describe('string formatter', () => {
|
|
|
58
56
|
expect(formatMoney(1434591.1, CurrencyEnum.MXN)).toStrictEqual('$1,434,591.1');
|
|
59
57
|
});
|
|
60
58
|
|
|
59
|
+
it('should round dollars to 2 decimals', () => {
|
|
60
|
+
expect.hasAssertions();
|
|
61
|
+
|
|
62
|
+
expect(formatMoney(175.91, CurrencyEnum.USD)).toStrictEqual('U$175.91');
|
|
63
|
+
expect(formatMoney(175.91000366210938,CurrencyEnum.USD)).toStrictEqual('U$175.91');
|
|
64
|
+
})
|
|
65
|
+
|
|
61
66
|
it('should round ars price', () => {
|
|
62
67
|
expect.hasAssertions();
|
|
63
68
|
|