idosell 0.4.12 → 0.4.16

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.d.ts CHANGED
@@ -1,29 +1,27 @@
1
+ import type { PRODUCT_SIZE_COUNTABLE, PRODUCT_SIZE_STRING } from "./enums.d";
1
2
  import type { SearchProductsResponse } from "./responses.d.ts"
2
3
 
3
- export enum ProductQuantityKey {
4
- ProductSizeQuantityOwnStock = "productSizeQuantityOwnStock",
5
- ProductSizeQuantityOutsideStock = "productSizeQuantityOutsideStock",
6
- ProductSizeQuantityAllStocks = "productSizeQuantityAllStocks",
7
- ProductStocksQuantities = "productStocksQuantities",
8
- ProductOrdersUnfinishedQuantities = "productOrdersUnfinishedQuantities",
9
- ProductSizesDeliveries = "productSizesDeliveries",
10
- ProductSizesDispositionsInAuctions = "productSizesDispositionsInAuctions",
11
- }
12
-
13
4
  export type IdosellProduct = SearchProductsResponse['results'][0];
14
5
 
15
6
  export type GetIaICodeFunction = (productId: number|string, sizeId: string) => string;
16
7
 
17
- export type SumProductQuantitiesFunction = (productStocksData: IdosellProduct['productStocksData'], stockType?: ProductQuantityKey) => number;
8
+ export type SumProductQuantitiesFunction = (productStocksData: IdosellProduct['productStocksqData'], stockType?: PRODUCT_SIZE_COUNTABLE | `${PRODUCT_SIZE_COUNTABLE}`) => number;
9
+
10
+ export type MapSizeQuantitesFunction = (product: IdosellProduct, stockType?: PRODUCT_SIZE_COUNTABLE | `${PRODUCT_SIZE_COUNTABLE}`) => Record<string,number>;
18
11
 
19
- export type MapSizeQuantitesFunction = (product: IdosellProduct, stockType?: ProductQuantityKey) => Record<string,number>;
12
+ export type MapProductCodesFunction = (product: IdosellProduct, codeType?: PRODUCT_SIZE_STRING | `${PRODUCT_SIZE_STRING}`, stockId?: number|string) => Record<string,string>;
20
13
 
21
- export type MapProductCodesFunction = (product: IdosellProduct, codeType?: 'productSizeCodeExternal'|'productSizeCodeProducer'|'sizePanelName') => Record<string,string>;
14
+ export type GetLangDataFunction = <T extends { langId: string}>(array: T[], langId?: string) => T|undefined;
15
+
16
+ export type ClearParametersLangDataFunction = (products: SearchProductsResponse['results'], langId: string = 'pol') => SearchProductsResponse['results'];
17
+
18
+ declare namespace utils {
19
+ const getIaiCode: GetIaICodeFunction;
20
+ const sumProductQuantities: SumProductQuantitiesFunction;
21
+ const mapSizeQuantites: MapSizeQuantitesFunction;
22
+ const mapProductCodes: MapProductCodesFunction;
23
+ const getLangData: GetLangDataFunction;
24
+ const clearParametersLangData: ClearParametersLangDataFunction;
25
+ }
22
26
 
23
- declare const _default: {
24
- getIaiCode: GetIaICodeFunction;
25
- sumProductQuantities: SumProductQuantitiesFunction;
26
- mapSizeQuantites: MapSizeQuantitesFunction;
27
- mapProductCodes: MapProductCodesFunction;
28
- };
29
- export default _default;
27
+ export default utils;
package/dist/utils.js CHANGED
@@ -1,96 +1,185 @@
1
- export var ProductQuantityKey;
2
- (function (ProductQuantityKey) {
3
- ProductQuantityKey["ProductSizeQuantityOwnStock"] = "productSizeQuantityOwnStock";
4
- ProductQuantityKey["ProductSizeQuantityOutsideStock"] = "productSizeQuantityOutsideStock";
5
- ProductQuantityKey["ProductSizeQuantityAllStocks"] = "productSizeQuantityAllStocks";
6
- ProductQuantityKey["ProductStocksQuantities"] = "productStocksQuantities";
7
- ProductQuantityKey["ProductOrdersUnfinishedQuantities"] = "productOrdersUnfinishedQuantities";
8
- ProductQuantityKey["ProductSizesDeliveries"] = "productSizesDeliveries";
9
- ProductQuantityKey["ProductSizesDispositionsInAuctions"] = "productSizesDispositionsInAuctions";
10
- })(ProductQuantityKey || (ProductQuantityKey = {}));
11
- const productQuantityPathMap = {
12
- // ----- Product Dispositions -----
13
- [ProductQuantityKey.ProductSizeQuantityOwnStock]: ["productSizesDispositions", "productSizesDispositionsInSales", "productSizeQuantityOwnStock"],
14
- [ProductQuantityKey.ProductSizeQuantityOutsideStock]: ["productSizesDispositions", "productSizesDispositionsInSales", "productSizeQuantityOutsideStock"],
15
- [ProductQuantityKey.ProductSizeQuantityAllStocks]: ["productSizesDispositions", "productSizesDispositionsInSales", "productSizeQuantityAllStocks"],
16
- [ProductQuantityKey.ProductSizesDispositionsInAuctions]: ["productSizesDispositions", "productSizesDispositionsInAuctions", "productSizeQuantity"],
17
- // ----- Stocks & related quantities -----
18
- [ProductQuantityKey.ProductStocksQuantities]: ["productStocksQuantities", "productSizeQuantity"],
19
- [ProductQuantityKey.ProductOrdersUnfinishedQuantities]: ["productOrdersUnfinishedQuantities", "productSizeQuantity"],
20
- [ProductQuantityKey.ProductSizesDeliveries]: ["productSizesDeliveries", "productSizeQuantity"],
21
- };
22
- const getProductSizeArrayNode = (productStocksData, key) => {
23
- const pathNode = productQuantityPathMap[key];
24
- if (!pathNode)
25
- throw new Error("Invalid stock type " + key);
26
- const path = pathNode.slice(0, -1);
27
- const node = pathNode[pathNode.length - 1];
28
- const arr = getProductSizeArray(productStocksData, path);
29
- return { arr, node };
1
+ import ENUMS from "./enums.js";
2
+ const getIaiCode = (productId, sizeId) => {
3
+ if (sizeId === 'uniw')
4
+ return productId.toString();
5
+ return [productId, sizeId].join('-');
30
6
  };
31
- const getProductSizeArray = (productStocksData, path) => {
32
- let current = productStocksData;
33
- for (const segment of path) {
34
- if (current && typeof current === "object" && segment in current) {
35
- current = current[segment];
36
- }
37
- else {
38
- return [];
7
+ const traverseNodes = (node, pathIndex, path, results = []) => {
8
+ if (!node) {
9
+ return;
10
+ }
11
+ if (pathIndex >= path.length) {
12
+ results.push(node);
13
+ return;
14
+ }
15
+ const key = path[pathIndex];
16
+ if (key === 'array') {
17
+ if (Array.isArray(node)) {
18
+ node.forEach(item => traverseNodes(item, pathIndex + 1, path, results));
39
19
  }
40
20
  }
41
- if (Array.isArray(current)) {
42
- if (current.length && current[0]?.productSizesData) {
43
- return current.flatMap((s) => s.productSizesData);
21
+ else {
22
+ if (node[key] !== undefined) {
23
+ traverseNodes(node[key], pathIndex + 1, path, results);
44
24
  }
45
- return current;
46
25
  }
47
- return [];
48
26
  };
49
- const sumProductQuantities = (productStocksData, stockType = ProductQuantityKey.ProductSizeQuantityOwnStock) => {
50
- const { arr, node } = getProductSizeArrayNode(productStocksData, stockType);
51
- return arr.reduce((total, item) => {
52
- const value = item[node];
53
- if (typeof value === 'number')
54
- total += value;
55
- return total;
56
- }, 0);
27
+ const productSizesPathMap = {
28
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY]: [
29
+ 'productStocksData',
30
+ 'productStocksQuantities',
31
+ 'array',
32
+ 'productSizesData',
33
+ 'array'
34
+ ],
35
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_OWN]: [
36
+ 'productStocksData',
37
+ 'productSizesDispositions',
38
+ 'productSizesDispositionsInSales',
39
+ 'array'
40
+ ],
41
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_OUTSIDE]: [
42
+ 'productStocksData',
43
+ 'productSizesDispositions',
44
+ 'productSizesDispositionsInSales',
45
+ 'array'
46
+ ],
47
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_ALL]: [
48
+ 'productStocksData',
49
+ 'productSizesDispositions',
50
+ 'productSizesDispositionsInSales',
51
+ 'array'
52
+ ],
53
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_ORDERS_UNFINISHED]: [
54
+ 'productStocksData',
55
+ 'productOrdersUnfinishedQuantities',
56
+ 'array',
57
+ 'productSizesData',
58
+ 'array'
59
+ ],
60
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.DELIVERIES]: [
61
+ 'productStocksData',
62
+ 'productSizesDeliveries',
63
+ 'array'
64
+ ],
65
+ [ENUMS.PRODUCT_SIZE_COUNTABLE.AUCTIONS]: [
66
+ 'productStocksData',
67
+ 'productSizesDispositions',
68
+ 'productSizesDispositionsInAuctions',
69
+ 'array'
70
+ ],
71
+ [ENUMS.PRODUCT_SIZE_STRING.NAME]: [
72
+ 'productSizes',
73
+ 'array'
74
+ ],
75
+ [ENUMS.PRODUCT_SIZE_STRING.CODE_PRODUCER]: [
76
+ 'productSizesAttributes',
77
+ 'array'
78
+ ],
79
+ [ENUMS.PRODUCT_SIZE_STRING.CODE_EXTERNAL]: [
80
+ 'productStocksData',
81
+ 'productStocksQuantities',
82
+ 'array',
83
+ 'productSizesData',
84
+ 'array'
85
+ ],
86
+ [ENUMS.PRODUCT_SIZE_STRING.LOCATION]: [
87
+ 'productStocksData',
88
+ 'productSizesStocksLocations',
89
+ 'array',
90
+ 'productSizesLocation',
91
+ 'array'
92
+ ],
93
+ [ENUMS.PRODUCT_SIZE_STRING.LOCATION_CODE]: [
94
+ 'productStocksData',
95
+ 'productSizesStocksLocations',
96
+ 'array',
97
+ 'productSizesLocation',
98
+ 'array'
99
+ ],
57
100
  };
58
- const getIaiCode = (productId, sizeId) => {
59
- return [productId, sizeId].join('-');
101
+ const getTraversedPathElements = (product, nodeName) => {
102
+ const path = productSizesPathMap[nodeName];
103
+ if (!path)
104
+ throw new Error(`Invalid path for ${nodeName}`);
105
+ const results = [];
106
+ traverseNodes(product, 0, path, results);
107
+ return results;
60
108
  };
61
- const mapSizeQuantites = (product, stockType = ProductQuantityKey.ProductSizeQuantityOwnStock) => {
62
- const obj = {};
63
- if (!product.productStocksData)
64
- return obj;
65
- const { arr, node } = getProductSizeArrayNode(product.productStocksData, stockType);
66
- for (const item of arr) {
67
- const value = item[node];
68
- if (typeof value !== 'number')
69
- continue;
70
- const index = getIaiCode(product.productId, item.sizeId);
71
- if (!obj[index])
72
- obj[index] = value;
73
- else
74
- obj[index] += value;
109
+ const sumProductQuantities = (productStocksData, nodeName = ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_OWN) => {
110
+ const results = getTraversedPathElements({ productStocksData, productId: 0 }, nodeName);
111
+ let sum = 0;
112
+ if (['productOrdersUnfinishedQuantities', 'productSizesDeliveries', 'productSizesDispositionsInAuctions'].includes(nodeName))
113
+ nodeName = 'productSizeQuantity';
114
+ results.forEach(item => {
115
+ if (item?.sizeId && item[nodeName] !== undefined) {
116
+ const value = Number(item[nodeName]) || 0;
117
+ sum += value;
118
+ }
119
+ });
120
+ return sum;
121
+ };
122
+ const mapSizeQuantites = (product, nodeName = ENUMS.PRODUCT_SIZE_COUNTABLE.QUANTITY_OWN) => {
123
+ const results = getTraversedPathElements(product, nodeName);
124
+ const aggregated = {};
125
+ if (['productOrdersUnfinishedQuantities', 'productSizesDeliveries', 'productSizesDispositionsInAuctions'].includes(nodeName))
126
+ nodeName = 'productSizeQuantity';
127
+ results.forEach(item => {
128
+ if (item?.sizeId && item[nodeName] !== undefined) {
129
+ const sizeId = String(item.sizeId);
130
+ const value = Number(item[nodeName]) || 0;
131
+ aggregated[sizeId] = (aggregated[sizeId] || 0) + value;
132
+ }
133
+ });
134
+ return aggregated;
135
+ };
136
+ const mapProductCodes = (product, codeType = ENUMS.PRODUCT_SIZE_STRING.NAME, stockId) => {
137
+ let results = getTraversedPathElements(product, codeType);
138
+ if (['stockLocationTextId', 'stockLocationCode'].includes(codeType)) {
139
+ if (!stockId)
140
+ throw new Error("Stock Id is required to map locations");
141
+ const prefix = 'M' + stockId;
142
+ results = results.filter(item => item.stockLocationTextId.startsWith(prefix));
75
143
  }
76
- return obj;
144
+ const mapped = {};
145
+ results.forEach(item => {
146
+ if (item?.sizeId && item[codeType] !== undefined) {
147
+ const sizeId = String(item.sizeId);
148
+ const value = String(item[codeType] || '');
149
+ if (!mapped[sizeId] || value) {
150
+ mapped[sizeId] = value;
151
+ }
152
+ }
153
+ });
154
+ return mapped;
77
155
  };
78
- const mapProductCodes = (product, codeType = 'productSizeCodeProducer') => {
79
- const obj = {};
80
- if (product.productSizesAttributes) {
81
- for (const size of product.productSizesAttributes) {
82
- const code = size[codeType];
83
- if (!code)
156
+ const getLangData = (arr, langId = 'pol') => {
157
+ if (!arr.length)
158
+ return undefined;
159
+ if (!arr[0].langId)
160
+ throw new Error('Array has no langId');
161
+ return arr.find(item => item.langId === langId);
162
+ };
163
+ const clearParametersLangData = (products, langId = 'pol') => {
164
+ for (const product of products) {
165
+ if (!product.productParameters)
166
+ continue;
167
+ for (const parameter of product.productParameters) {
168
+ if (!parameter.parameterValues)
84
169
  continue;
85
- const sku = getIaiCode(product.productId, size.sizeId);
86
- obj[sku] = code;
170
+ parameter.parameterDescriptionsLangData = parameter.parameterDescriptionsLangData.filter(lang => lang.langId === langId);
171
+ for (const value of parameter.parameterValues) {
172
+ value.parameterValueDescriptionsLangData = value.parameterValueDescriptionsLangData.filter(lang => lang.langId === langId).map((item) => { item.parameterValueShopsData = []; return item; });
173
+ }
87
174
  }
88
175
  }
89
- return obj;
176
+ return products;
90
177
  };
91
178
  export default {
92
- getIaiCode,
93
179
  sumProductQuantities,
180
+ getIaiCode,
94
181
  mapSizeQuantites,
95
- mapProductCodes
182
+ mapProductCodes,
183
+ getLangData,
184
+ clearParametersLangData
96
185
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "idosell",
3
- "version": "0.4.12",
3
+ "version": "0.4.16",
4
4
  "description": "Idosell 3 REST connector",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/gateways.d.ts",