@nuskin/ns-product-lib 2.6.0-cx24-3377.15 → 2.6.0-cx24-3464.7

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -1,113 +1,70 @@
1
- # [2.6.0-cx24-3377.15](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.14...v2.6.0-cx24-3377.15) (2023-03-10)
1
+ # [2.6.0-cx24-3464.7](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.6...v2.6.0-cx24-3464.7) (2023-03-10)
2
2
 
3
3
 
4
- ### New
5
-
6
- * Fix multiple variants not loading properly (CX24-3377) ([5a2bf99](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/5a2bf996f7768baf5a7fe521786dbad0992f2b3e))
7
-
8
- # [2.6.0-cx24-3377.14](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.13...v2.6.0-cx24-3377.14) (2023-03-10)
9
-
10
-
11
- ### New
12
-
13
- * Fix multiple variants not loading properly (CX24-3377) ([4440174](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/4440174404fb6c2cafd335862ff212e0a3cb166e))
14
-
15
- # [2.6.0-cx24-3377.13](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.12...v2.6.0-cx24-3377.13) (2023-03-10)
16
-
17
-
18
- ### New
19
-
20
- * Fix multiple variants not loading properly (CX24-3377) ([a35e917](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/a35e917440df30c4a47d0167b0fd6702f4b6dbd6))
21
-
22
- # [2.6.0-cx24-3377.12](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.11...v2.6.0-cx24-3377.12) (2023-03-10)
23
-
24
-
25
- ### New
26
-
27
- * Fix multiple variants not loading properly (CX24-3377) ([b66be37](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/b66be37163a64c6fcc0d763b748a653d3fc0ebb9))
28
- * Fix multiple variants not loading properly (CX24-3377) ([10821f1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/10821f1924f5f0d7b985af15d382948e99592e42))
29
-
30
- # [2.6.0-cx24-3377.11](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.10...v2.6.0-cx24-3377.11) (2023-03-10)
31
-
32
-
33
- ### New
34
-
35
- * Fix multiple variants not loading properly (CX24-3377) ([9f8273b](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/9f8273b5a8ae3aaf40fb417d04e2087b4b0f036b))
36
-
37
- # [2.6.0-cx24-3377.10](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.9...v2.6.0-cx24-3377.10) (2023-03-09)
38
-
39
-
40
- ### New
41
-
42
- * Fix multiple variants not loading properly (CX24-3377) ([1b08b2a](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/1b08b2ad4ea7bdceca494f6121f14f74236afb97))
43
-
44
- # [2.6.0-cx24-3377.9](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.8...v2.6.0-cx24-3377.9) (2023-03-09)
45
-
46
-
47
- ### New
4
+ ### Update
48
5
 
49
- * Fix multiple variants not loading properly (CX24-3377) ([fbeaa05](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/fbeaa050c39a486c81979e6034ce1ae19a613ff6))
6
+ * get child skus to be used for add-to-cart #CX24-3464 ([e9059db](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/e9059db52bdd09dce542f905202f2b12ea017324)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
50
7
 
51
- # [2.6.0-cx24-3377.8](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.7...v2.6.0-cx24-3377.8) (2023-03-09)
8
+ # [2.6.0-cx24-3464.6](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.5...v2.6.0-cx24-3464.6) (2023-03-10)
52
9
 
53
10
 
54
- ### New
11
+ ### Update
55
12
 
56
- * Fix multiple variants not loading properly (CX24-3377) ([e32840a](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/e32840aabdec5b13c7a6b8dd276adb523689890f))
13
+ * get child skus to be used for add-to-cart #CX24-3464 ([b26d1f5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/b26d1f54ed4e7395788b8f15faf82042c26ee383)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
57
14
 
58
- # [2.6.0-cx24-3377.7](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.6...v2.6.0-cx24-3377.7) (2023-03-09)
15
+ # [2.6.0-cx24-3464.5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.4...v2.6.0-cx24-3464.5) (2023-03-10)
59
16
 
60
17
 
61
- ### New
18
+ ### Update
62
19
 
63
- * Fix multiple variants not loading properly (CX24-3377) ([15431ae](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/15431aef763e3d70ab8d1485509ec571df3b78f3))
20
+ * get child skus to be used for add-to-cart #CX24-3464 ([20439ce](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/20439ce10c3ae8ca2bf35912b7309e1bf5b12da1)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
64
21
 
65
- # [2.6.0-cx24-3377.6](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.5...v2.6.0-cx24-3377.6) (2023-03-09)
22
+ # [2.6.0-cx24-3464.4](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.3...v2.6.0-cx24-3464.4) (2023-03-10)
66
23
 
67
24
 
68
- ### New
25
+ ### Update
69
26
 
70
- * Fix multiple variants not loading properly (CX24-3377) ([d653c88](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/d653c887a529d2e93e05028e9eed8064991470ee))
27
+ * get child skus to be used for add-to-cart #CX24-3464 ([fd47876](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/fd478765fdbaa0cc11c1832a7667977923df1aef)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
71
28
 
72
- # [2.6.0-cx24-3377.5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.4...v2.6.0-cx24-3377.5) (2023-03-09)
29
+ # [2.6.0-cx24-3464.3](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.2...v2.6.0-cx24-3464.3) (2023-03-10)
73
30
 
74
31
 
75
- ### New
32
+ ### Update
76
33
 
77
- * Fix multiple variants not loading properly (CX24-3377) ([d681803](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/d681803ccbc2290a0e843e8eb1b191d33ba97cbe))
34
+ * get child skus to be used for add-to-cart #CX24-3464 ([b3c334f](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/b3c334f01b851737aff78d8345e4eea8aa702bb3)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
78
35
 
79
- # [2.6.0-cx24-3377.4](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.3...v2.6.0-cx24-3377.4) (2023-03-09)
36
+ # [2.6.0-cx24-3464.2](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3464.1...v2.6.0-cx24-3464.2) (2023-03-10)
80
37
 
81
38
 
82
39
  ### New
83
40
 
84
- * Fix multiple variants not loading properly (CX24-3377) ([1b37ed5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/1b37ed513dbd9a8751b8378d5133582b88fdcb97))
85
- * Fix multiple variants not loading properly (CX24-3377) ([ae2c91f](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/ae2c91fa98838e60745009e4b66b8c728fad58b8))
41
+ * Update equinox query for KIT and its mapping ([7df6f96](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/7df6f9671c58eddb57c9acfd9d4b79b8dec6a78e))
86
42
 
87
- # [2.6.0-cx24-3377.3](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.2...v2.6.0-cx24-3377.3) (2023-03-08)
43
+ ### Release
88
44
 
45
+ * Automated changes by GitLab pipeline [skip ci] ([f8233b3](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/f8233b37ecf0c805404395c68e0237930e274904))
46
+ * Automated changes by GitLab pipeline [skip ci] ([8aa3e84](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/8aa3e84df61f6855ad1544f592f4a2825a92e6fb))
89
47
 
90
- ### New
48
+ ### Update
91
49
 
92
- * Fix multiple variants not loading properly (CX24-3377) ([da9eff4](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/da9eff46094279a657d6318d96291b94fddcfcf9))
93
- * Fix multiple variants not loading properly (CX24-3377) ([c6e06c4](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/c6e06c488ecdd74876c9cb989a8766b473e7d1f2))
94
- * Fix multiple variants not loading properly (CX24-3377) ([9b75c96](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/9b75c96f681bd3c780bf8ba0ac018d525abe7033))
50
+ * get child skus to be used for add-to-cart #CX24-3464 ([9bf1a82](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/9bf1a828a3073dd4118abba088a22b854db78172)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
51
+ * get child skus to be used for add-to-cart #CX24-3464 ([b1b7dc9](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/b1b7dc9f9ed85aca18fd2ec98d5938131e79aaed)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
52
+ * get child skus to be used for add-to-cart #CX24-3464 ([9cc5a85](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/9cc5a85768a9080fd232acb8096eb7cd50e37028)), closes [#CX24-3464](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3464)
53
+ * removed with credentials default ([48f7bdb](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/48f7bdbe9154a82ed48195d0f93f9e4772bf92dc))
95
54
 
96
- # [2.6.0-cx24-3377.2](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-3377.1...v2.6.0-cx24-3377.2) (2023-03-08)
55
+ # [2.6.0-cx24-33721.2](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0-cx24-33721.1...v2.6.0-cx24-33721.2) (2023-03-09)
97
56
 
98
57
 
99
- ### New
58
+ ### Update
100
59
 
101
- * Fix multiple variants not loading properly (CX24-3377) ([d3a2663](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/d3a266319c8ff7b4650c9ef9a06f411b117d98d3))
60
+ * removed with credentials default ([48f7bdb](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/48f7bdbe9154a82ed48195d0f93f9e4772bf92dc))
102
61
 
103
- # [2.6.0-cx24-3377.1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.5.1...v2.6.0-cx24-3377.1) (2023-03-08)
62
+ # [2.6.0-cx24-33721.1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.5.1...v2.6.0-cx24-33721.1) (2023-03-08)
104
63
 
105
64
 
106
65
  ### New
107
66
 
108
- * Fix multiple variants not loading properly (CX24-3377) ([fb7a856](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/fb7a856a39cb7189862d7b7be51b36b15569189e))
109
- * Fix multiple variants not loading properly (CX24-3377) ([2990272](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/29902726ac21a246638586b5645a070bed1b7fa4))
110
- * Fix multiple variants not loading properly (CX24-3377) ([0cee74b](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/0cee74bc366a9032966d235e54b731d03333f902))
67
+ * Update equinox query for KIT and its mapping ([7df6f96](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/7df6f9671c58eddb57c9acfd9d4b79b8dec6a78e))
111
68
 
112
69
  ## [2.5.1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.5.0...v2.5.1) (2023-03-07)
113
70
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuskin/ns-product-lib",
3
- "version": "2.6.0-cx24-3377.15",
3
+ "version": "2.6.0-cx24-3464.7",
4
4
  "description": "This project contains shared Product models and code between the backend and frontend.",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
package/src/product.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- const { isTrue } = require("@nuskin/ns-common-lib");
3
+ const { isTrue } = require("@nuskin/ns-common-lib");
4
4
 
5
5
  const ProductUtils = require("./productUtils.js");
6
6
 
@@ -8,7 +8,7 @@ const Agelocme = require("./agelocme.js");
8
8
  const PriceType = require("./models/priceType.js");
9
9
  const ProductStatus = require("./models/productStatus.js");
10
10
 
11
- const Product = function (productData) {
11
+ const Product = function(productData) {
12
12
  this.priceMap = {};
13
13
  this.pvMap = {};
14
14
  this.cvMap = {};
@@ -77,13 +77,13 @@ const Product = function (productData) {
77
77
  this.inventory = "";
78
78
  this.equinoxProductId = "";
79
79
 
80
- this.setMarketAttributes = function (productStatus) {
80
+ this.setMarketAttributes = function(productStatus) {
81
81
  if (productStatus.marketAttributes) {
82
82
  this.marketAttributes = productStatus.marketAttributes;
83
83
  }
84
84
  };
85
85
 
86
- this.getAgelocmeKeyPart = function () {
86
+ this.getAgelocmeKeyPart = function() {
87
87
  let keyPart = null;
88
88
  if (this.agelocme) {
89
89
  keyPart =
@@ -97,27 +97,27 @@ const Product = function (productData) {
97
97
  return keyPart;
98
98
  };
99
99
 
100
- this.getHighlightedSku = function () {
100
+ this.getHighlightedSku = function() {
101
101
  let rv = this.sku;
102
102
  if (this.highlightedSku) rv = this.highlightedSku;
103
103
  return rv;
104
104
  };
105
105
 
106
- this.getProductSearchTitle = function () {
106
+ this.getProductSearchTitle = function() {
107
107
  if (this.agelocme && this.agelocme.label) {
108
108
  return this.agelocme.label;
109
109
  }
110
110
  return this.title;
111
111
  };
112
112
 
113
- this.getProductSearchSku = function () {
113
+ this.getProductSearchSku = function() {
114
114
  if (this.agelocme && this.agelocme.code) {
115
115
  return this.agelocme.code;
116
116
  }
117
117
  return this.getHighlightedSku();
118
118
  };
119
119
 
120
- this.getDescription = function () {
120
+ this.getDescription = function() {
121
121
  let description = this.longDescr;
122
122
  if (!description || description.length === 0) {
123
123
  return this.shortDescr;
@@ -125,7 +125,7 @@ const Product = function (productData) {
125
125
  return description;
126
126
  };
127
127
 
128
- this.setFullImage = function (fullImage) {
128
+ this.setFullImage = function(fullImage) {
129
129
  if (fullImage) {
130
130
  this.fullImage = fullImage.replace("http:", "https:");
131
131
  } else {
@@ -133,19 +133,19 @@ const Product = function (productData) {
133
133
  }
134
134
  };
135
135
 
136
- this.getFullImage = function () {
136
+ this.getFullImage = function() {
137
137
  return this.fullImage ? this.fullImage.replace("http:", "https:") : "";
138
138
  };
139
139
 
140
- this.setProductCarouselImages = function (productCarouselImages) {
140
+ this.setProductCarouselImages = function(productCarouselImages) {
141
141
  this.productCarouselImages = productCarouselImages;
142
142
  };
143
143
 
144
- this.getProductCarouselImages = function () {
144
+ this.getProductCarouselImages = function() {
145
145
  return this.productCarouselImages;
146
146
  };
147
147
 
148
- this.setImageAltText = function (altText) {
148
+ this.setImageAltText = function(altText) {
149
149
  if (altText) {
150
150
  this.imageAltText = altText;
151
151
  } else {
@@ -153,11 +153,11 @@ const Product = function (productData) {
153
153
  }
154
154
  };
155
155
 
156
- this.getImageAltText = function () {
156
+ this.getImageAltText = function() {
157
157
  return this.imageAltText || this.title;
158
158
  };
159
159
 
160
- this.setThumbnail = function (thumbnail) {
160
+ this.setThumbnail = function(thumbnail) {
161
161
  if (thumbnail) {
162
162
  this.thumbnail = thumbnail.replace("http:", "https:");
163
163
  } else {
@@ -165,7 +165,7 @@ const Product = function (productData) {
165
165
  }
166
166
  };
167
167
 
168
- this.setThumbnailFromSku = function (sku) {
168
+ this.setThumbnailFromSku = function(sku) {
169
169
  // WARNING: Base URL will need to be handled in the client (call setBaseUrl)
170
170
  // eslint-disable-next-line max-len
171
171
  // this.thumbnail = `${RunConfigService.getBaseUrl()}/content/products/${ProductUtils.getTokenizedSku(sku)}/jcr:content/fullImage.img.100.100.png`;
@@ -175,43 +175,43 @@ const Product = function (productData) {
175
175
  )}/jcr:content/fullImage.img.100.100.png`;
176
176
  };
177
177
 
178
- this.getThumbnail = function () {
178
+ this.getThumbnail = function() {
179
179
  return this.thumbnail ? this.thumbnail.replace("http:", "https:") : "";
180
180
  };
181
181
 
182
- this.hasAvailableQuantity = function (qty = 1) {
182
+ this.hasAvailableQuantity = function(qty = 1) {
183
183
  return Math.min(this.maxQuantity, this.availableQuantity) >= qty;
184
184
  };
185
185
 
186
- this.setPoints = function (points) {
186
+ this.setPoints = function(points) {
187
187
  this.points = ensureFloatVal(points) || "";
188
188
  };
189
189
 
190
- this.getPointsFixed = function () {
190
+ this.getPointsFixed = function() {
191
191
  return parseFloat(this.points).toFixed(2);
192
192
  };
193
193
 
194
- this.setCv = function (cv) {
194
+ this.setCv = function(cv) {
195
195
  this.cv = ensureFloatVal(cv) || "";
196
196
  };
197
197
 
198
- this.getCvFixed = function () {
198
+ this.getCvFixed = function() {
199
199
  return parseFloat(this.cv).toFixed(2);
200
200
  };
201
201
 
202
- this.setPv = function (pv) {
202
+ this.setPv = function(pv) {
203
203
  this.pv = ensureFloatVal(pv) || "";
204
204
  };
205
205
 
206
- this.getPvFixed = function () {
206
+ this.getPvFixed = function() {
207
207
  return parseFloat(this.pv || 0).toFixed(2);
208
208
  };
209
209
 
210
- this.setPrice = function (price) {
210
+ this.setPrice = function(price) {
211
211
  this.price = ensureFloatVal(price, true);
212
212
  };
213
213
 
214
- this.setFormattedPrice = function (formattedPrice) {
214
+ this.setFormattedPrice = function(formattedPrice) {
215
215
  this.formattedPrice = formattedPrice;
216
216
  };
217
217
 
@@ -220,13 +220,13 @@ const Product = function (productData) {
220
220
  * added to the cart the event pricing needs to be remembered if toggling between
221
221
  * pricetypes with event pricing and pricetype without event pricing
222
222
  */
223
- this.lockEventName = function () {
223
+ this.lockEventName = function() {
224
224
  if (!this.savedEventName && this.eventName) {
225
225
  this.savedEventName = this.eventName;
226
226
  }
227
227
  };
228
228
 
229
- this.setPriceAndPvFromType = function (_priceType, _activeEvents = null, option = {}) {
229
+ this.setPriceAndPvFromType = function(_priceType, _activeEvents = null, option = {}) {
230
230
  // WARNING: priceType needs to be handled client-side
231
231
  // const priceType = ConfigService.getMarketConfig().showWholeSalePricing && !AccountManager.isLoggedIn()
232
232
  // ? PriceType.WWHL
@@ -271,11 +271,11 @@ const Product = function (productData) {
271
271
  return changed;
272
272
  };
273
273
 
274
- this.getPrice = function () {
274
+ this.getPrice = function() {
275
275
  return this.price ? this.price : 0;
276
276
  };
277
277
 
278
- this.getPriceFixed = function () {
278
+ this.getPriceFixed = function() {
279
279
  if (typeof this.price === "number") {
280
280
  return parseFloat(this.price.toFixed(2));
281
281
  } else {
@@ -283,15 +283,15 @@ const Product = function (productData) {
283
283
  }
284
284
  };
285
285
 
286
- this.getOriginalPrice = function () {
286
+ this.getOriginalPrice = function() {
287
287
  return this.priceType ? this.priceMap[this.priceType] : null;
288
288
  };
289
289
 
290
- this.addPricing = function (type, price) {
290
+ this.addPricing = function(type, price) {
291
291
  this.priceMap[type] = price;
292
292
  };
293
293
 
294
- this.addPricingFromStatus = function (productStatus, priceType, option = {}) {
294
+ this.addPricingFromStatus = function(productStatus, priceType, option ={}) {
295
295
  let modified = false;
296
296
 
297
297
  if (!priceType) {
@@ -326,7 +326,7 @@ const Product = function (productData) {
326
326
  }, this);
327
327
  }
328
328
  this.orderTypes = ProductUtils.mergeOrderTypes(this.orderTypes, productStatus.orderType);
329
- if (productStatus.childSkus) {
329
+ if(productStatus.childSkus) {
330
330
  this.childSkus = productStatus.childSkus;
331
331
  }
332
332
  this.setPriceAndPvFromType(priceType, null, option);
@@ -346,15 +346,15 @@ const Product = function (productData) {
346
346
  return modified;
347
347
  };
348
348
 
349
- this.addPvWithType = function (type, pv) {
349
+ this.addPvWithType = function(type, pv) {
350
350
  this.pvMap[type] = pv;
351
351
  };
352
352
 
353
- this.addCvWithType = function (type, cv) {
353
+ this.addCvWithType = function(type, cv) {
354
354
  this.cvMap[type] = cv;
355
355
  };
356
356
 
357
- this.getPricing = function (type) {
357
+ this.getPricing = function(type) {
358
358
  let retVal = null;
359
359
 
360
360
  if (type) {
@@ -381,7 +381,7 @@ const Product = function (productData) {
381
381
  return eventPriceTypes;
382
382
  };
383
383
 
384
- this.getPvWithType = function (type) {
384
+ this.getPvWithType = function(type) {
385
385
  let rv = this.pvMap[type];
386
386
  if (rv == null) {
387
387
  // Assumption: we always have WWHL from the service
@@ -391,7 +391,7 @@ const Product = function (productData) {
391
391
  return rv;
392
392
  };
393
393
 
394
- this.getCvWithType = function (type) {
394
+ this.getCvWithType = function(type) {
395
395
  let rv = this.cvMap[type];
396
396
  if (rv == null) {
397
397
  rv = this.cvMap[PriceType.WWHL];
@@ -399,80 +399,77 @@ const Product = function (productData) {
399
399
  return rv;
400
400
  };
401
401
 
402
- this.hasAdrOption = function () {
402
+ this.hasAdrOption = function() {
403
403
  return this.orderTypes["adr"];
404
404
  };
405
405
 
406
- this.isAdrOnly = function () {
406
+ this.isAdrOnly = function() {
407
407
  return this.hasAdrOption() && !this.hasOrderOption();
408
408
  };
409
409
 
410
- this.hasMultipleOrderTypes = function () {
410
+ this.hasMultipleOrderTypes = function() {
411
411
  return this.hasOrderOption() && this.hasAdrOption();
412
412
  };
413
413
 
414
- this.hasOrderOption = function () {
414
+ this.hasOrderOption = function() {
415
415
  return this.orderTypes["order"];
416
416
  };
417
417
 
418
- this.isDistributor = function () {
418
+ this.isDistributor = function() {
419
419
  return this.custTypes.includes("10");
420
420
  };
421
421
 
422
- this.isCustomer = function () {
422
+ this.isCustomer = function() {
423
423
  return this.custTypes.includes("20");
424
424
  };
425
425
 
426
- this.isPreferredCustomer = function () {
426
+ this.isPreferredCustomer = function() {
427
427
  return this.custTypes.includes("30");
428
428
  };
429
429
 
430
- this.isBase = function () {
430
+ this.isBase = function() {
431
431
  return this.sku.substring(2, 4) === "55";
432
432
  };
433
433
 
434
- this.isVariant = function () {
435
- if (this.equinoxProductId != "") {
436
- return this.variantSkus().length === 0
437
- }
434
+ this.isVariant = function() {
438
435
  return this.baseSku.length > 0 && this.variantSkus().length === 0;
439
436
  };
440
437
 
441
- this.setVariant = function (variantProduct) {
438
+ this.setVariant = function(variantProduct) {
442
439
  if (variantProduct && variantProduct.sku) {
443
440
  this.variants[variantProduct.sku] = variantProduct;
444
441
  }
445
442
  };
446
443
 
447
- this.getVariant = function (sku) {
444
+ this.getVariant = function(sku) {
448
445
  return this.variants[sku];
449
446
  };
450
447
 
451
- this.variantSkus = function () {
448
+ this.variantSkus = function() {
452
449
  return Object.keys(this.variants);
453
450
  };
454
451
 
455
- this.getVariantsList = function () {
452
+ this.getVariantsList = function() {
456
453
  return Object.values(this.variants);
457
454
  };
458
455
 
459
- this.getMinPrice = function () {
456
+ this.getMinPrice = function() {
460
457
  return this.priceMap[`min-${this.priceType}`];
461
458
  };
462
459
 
463
- this.getMaxPrice = function () {
460
+ this.getMaxPrice = function() {
464
461
  return this.priceMap[`max-${this.priceType}`];
465
462
  };
466
463
 
467
- this.getMinPv = function () {
464
+ this.getMinPv = function() {
468
465
  return this.pvMap[`min-${this.priceType}`];
469
466
  };
470
467
 
471
- this.getMaxPv = function () {
468
+ this.getMaxPv = function() {
472
469
  return this.pvMap[`max-${this.priceType}`];
473
470
  };
474
471
 
475
- this.toJSON = function () {
472
+ this.toJSON = function() {
476
473
  let retData = {};
477
474
  retData.sku = this.sku;
478
475
  retData.globalProductID = this.globalProductID;
@@ -541,11 +538,11 @@ const Product = function (productData) {
541
538
  return retData;
542
539
  };
543
540
 
544
- this.setMeCommerceProductData = function (/*productData*/) {
541
+ this.setMeCommerceProductData = function(/*productData*/) {
545
542
  console.error("setMeCommerceProductData is deprecated!");
546
543
  };
547
544
 
548
- this.setBaseUrl = function (baseUrl) {
545
+ this.setBaseUrl = function(baseUrl) {
549
546
  this.thumbnail = ProductUtils.applyBaseUrl(this.thumbnail, baseUrl);
550
547
  this.fullImage = ProductUtils.applyBaseUrl(this.fullImage, baseUrl);
551
548
 
@@ -557,7 +554,7 @@ const Product = function (productData) {
557
554
  }
558
555
  };
559
556
 
560
- this.setProductData = function (productData) {
557
+ this.setProductData = function(productData) {
561
558
  let data;
562
559
 
563
560
  if (productData) {
@@ -665,7 +662,7 @@ const Product = function (productData) {
665
662
  ? data.pvMap
666
663
  : this.pvMap;
667
664
  this.orderTypes = ProductUtils.mergeOrderTypes(this.orderTypes, data.orderTypes);
668
- if (data.childSkus) {
665
+ if(data.childSkus) {
669
666
  this.childSkus = data.childSkus;
670
667
  }
671
668
  this.custTypes = data.custTypes || [];
@@ -681,7 +678,7 @@ const Product = function (productData) {
681
678
  }
682
679
  };
683
680
 
684
- this.isEmpty = function () {
681
+ this.isEmpty = function() {
685
682
  return (
686
683
  isFieldEmpty(this.sku) &&
687
684
  isFieldEmpty(this.title) &&
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
- const { getConfiguration } = require('@nuskin/configuration-sdk');
2
+ const { getConfiguration, getCachedConfigurations } = require('@nuskin/configuration-sdk');
3
3
  const axios = require("axios");
4
4
  const contentstack = require('./contentstack/contentstack');
5
5
  const Product = require("./product");
6
6
  const CustomerTypes = require('./models/customerTypes');
7
7
  const ProductStatus = require("./models/productStatus");
8
+
9
+ const productTypes = {
10
+ kit: 'kit'
11
+ };
12
+
8
13
  /** @type {*} */
9
14
  const ProductData = {
10
15
  /**
@@ -27,9 +32,43 @@ const ProductData = {
27
32
  },
28
33
 
29
34
  getProductFromEquinox: async function (skus, locale, config) {
30
- const filter = `{"filters": [{"field": "index_key_skuId","operation": "IN", "value": "${skus.toString()}"}]}`;
35
+ const response = await this.searchEquinoxProduct(skus, locale, config);
36
+
37
+ if (response.data.product) {
38
+ return await this.eqProductMapper(response.data.product, skus);
39
+ }
40
+
41
+ return {
42
+ status: 400,
43
+ messages: [response.data.message],
44
+ data: { count: 0, products: [] }
45
+ }
46
+ },
47
+
48
+ /**
49
+ *
50
+ * @param {string[]} skus
51
+ * @param {string} locale
52
+ * @param {ConfigMap} config
53
+ * @returns
54
+ */
55
+ searchEquinoxProduct: async function(skus, locale, config) {
56
+ let skuFilter = [];
57
+
58
+ if(Array.isArray(skus)) {
59
+ skus.forEach((sku) => {
60
+ skuFilter.push(`index_key_productId="${sku}" OR index_key_skuId="${sku}"`)
61
+ })
62
+ } else {
63
+ //all featured products
64
+ skuFilter.push(`index_key_productId="${skus}" OR index_key_skuId="${skus}"`)
65
+ }
66
+
67
+ const filter = skuFilter.join(" OR ")
68
+ //axios.defaults.withCredentials = true;
69
+
31
70
  const url = `${config.API_Base_URLs}/orchestrationservices/storefront/catalogs/search/`;
32
- const href = `${url}?filter=${encodeURI(filter)}`;
71
+ const href = `${url}?filter='\\\\''${encodeURI(filter)}'\\''`;
33
72
  const response = await axios.request({
34
73
  method: 'get',
35
74
  url: href,
@@ -40,18 +79,9 @@ const ProductData = {
40
79
  headers: this.getEquinoxRequestHeaders(),
41
80
  responseType: 'json',
42
81
  withCredentials: true
43
-
44
82
  });
45
83
 
46
- if (response.data.product) {
47
- return this.eqProductMapper(response.data.product, skus);
48
- }
49
-
50
- return {
51
- status: 400,
52
- messages: [response.data.message],
53
- data: { count: 0, products: [] }
54
- }
84
+ return response;
55
85
  },
56
86
 
57
87
  getEquinoxRequestHeaders() {
@@ -99,7 +129,7 @@ const ProductData = {
99
129
  eqProductVariantMapper: function (eqVariant) {
100
130
 
101
131
  let imageURL = eqVariant.properties.imageURL;
102
- const regex = /\d+.\d+/
132
+ const regex = /\d+\.\d+/
103
133
  let thumbnailImage = ''
104
134
 
105
135
  if (imageURL.includes('contentstack')) {
@@ -252,10 +282,9 @@ const ProductData = {
252
282
  "shade": "",
253
283
  "status": this.switchStatusFromEquinox(eqVariant.properties.status),
254
284
  "variantType": "Other",
255
- "variantDropdownLabel": eqVariant.properties.variantLabel || "",
285
+ "variantDropdownLabel": eqVariant.properties.variantSelectLabel || "",
256
286
  "variantDropdownPlaceholder": "Select Type",
257
- "variantsLabel": eqVariant.properties.variantLabel || "",
258
- "variants": {},
287
+ "variantsLabel": eqVariant.properties.variantSelectLabel || "",
259
288
  "groupOffer": false,
260
289
  "personalOffer": false,
261
290
  "savedEventName": eventName,
@@ -313,14 +342,16 @@ const ProductData = {
313
342
  }
314
343
  },
315
344
 
316
- eqProductMapper: function (productDataResponse, skus) {
317
- let prod = [];
345
+ eqProductMapper: async function (productDataResponse, skus) {
346
+ // console.log(productDataResponse, skus);
318
347
  let count = 0;
319
348
  let variants = {};
349
+ const products = [];
320
350
 
321
- let prodArr = productDataResponse.map((data) => {
322
- let imageURL = data.sku[count].properties.imageURL;
323
- const regex = /\d+.\d+/
351
+ for (const productData of productDataResponse) {
352
+ let product = (productData.type && productData.type === "kit") ? productData : productData.sku[count];
353
+ let imageURL = product.properties.imageURL;
354
+ const regex = /\d+\.\d+/
324
355
  let thumbnailImage = ''
325
356
 
326
357
  if (imageURL.includes('contentstack')) {
@@ -329,9 +360,9 @@ const ProductData = {
329
360
  thumbnailImage = imageURL.replace(regex, '40.40')
330
361
  }
331
362
 
332
- if (data.sku && data.sku.length > 1) {
333
- //exclude base product from variants
334
- data.sku.filter(v => v.identifier.substring(2, 4) !== "55").map(variant => {
363
+ if (productData.sku && productData.sku.length > 1) {
364
+ // exclude base product from variants
365
+ productData.sku.filter(v => v.identifier.substring(2, 4) !== "55").map(variant => {
335
366
  variants[variant.identifier] = this.eqProductVariantMapper(variant);
336
367
  return variant;
337
368
  });
@@ -342,20 +373,20 @@ const ProductData = {
342
373
  eventLabels,
343
374
  computedPrice,
344
375
  defaultProductPrice
345
- } = this.getEqProductPromotions(data.sku[count]);
346
- const productPrice = eventName ? defaultProductPrice : data.sku[count].priceFacets["Regular Price"];
347
- const discountedPrice = eventName ? computedPrice : data.sku[count].priceFacets["Regular Price"];
348
-
349
- prod = {
350
- "sku": data.sku[count].identifier,
351
- "globalProductID": data.identifier,
352
- "title": data.properties.name,
353
- "country": data.sku[count].properties.market,
376
+ } = this.getEqProductPromotions(product);
377
+ const productPrice = eventName ? defaultProductPrice : product.priceFacets["Regular Price"];
378
+ const discountedPrice = eventName ? computedPrice : product.priceFacets["Regular Price"];
379
+
380
+ product = {
381
+ "sku": product.identifier,
382
+ "globalProductID": productData.identifier,
383
+ "title": productData.properties.name,
384
+ "country": product.properties.market,
354
385
  "language": "en",
355
- "shortDescr": data.properties.description,
356
- "longDescr": data.properties.productDetailsDescription,
386
+ "shortDescr": productData.properties.description,
387
+ "longDescr": productData.properties.productDetailsDescription,
357
388
  "fullImage": imageURL,
358
- "imageAltText": data.properties.name,
389
+ "imageAltText": productData.properties.name,
359
390
  "productCarouselImages": [
360
391
  {
361
392
  "contentType": "img",
@@ -364,10 +395,10 @@ const ProductData = {
364
395
  }
365
396
  ],
366
397
  "thumbnail": thumbnailImage,
367
- "ingredients": data.properties.ingredients,
368
- "benefits": data.properties.benefits,
369
- "usage": data.properties.usage,
370
- "resources": data.sku[count].properties.resources,
398
+ "ingredients": productData.properties.ingredients,
399
+ "benefits": productData.properties.benefits,
400
+ "usage": productData.properties.usage,
401
+ "resources": product.properties.resources,
371
402
  "videos": "",
372
403
  "movie": "",
373
404
  "youtube": "",
@@ -377,49 +408,49 @@ const ProductData = {
377
408
  "sectionContent": "<div class=\"contentSections\"></div>\n"
378
409
  }
379
410
  ],
380
- "scanQualified": data.properties.scanQualifiedCount,
381
- "availableQuantity": data.sku[count].inventoryProperties.atpQty,
411
+ "scanQualified": productData.properties.scanQualifiedCount,
412
+ "availableQuantity": (product.inventoryProperties) ? product.inventoryProperties.atpQty : 0,
382
413
  "maxQuantity": 999,
383
414
  "points": "",
384
- "cv": (data.sku[count].priceFacets.CV) ? data.sku[count].priceFacets.CV : '',
385
- "pv": data.sku[count].priceFacets.PV,
415
+ "cv": (product.priceFacets.CV) ? product.priceFacets.CV : '',
416
+ "pv": product.priceFacets.PV,
386
417
  "priceType": "WRTL",
387
418
  "price": discountedPrice,
388
419
  "priceMap": {
389
420
  "WRTL": productPrice,
390
- "WADW-WRTL": data.sku[count].priceFacets["Regular Price"],
391
- "WADR": data.sku[count].priceFacets["Regular Price"],
392
- "RTL": data.sku[count].priceFacets["Regular Price"],
393
- "WADW": data.sku[count].priceFacets["Wholesale Price"],
394
- "WHL": data.sku[count].priceFacets["Wholesale Price"],
395
- "WWHL": data.sku[count].priceFacets["Wholesale Price"]
421
+ "WADW-WRTL": product.priceFacets["Regular Price"],
422
+ "WADR": product.priceFacets["Regular Price"],
423
+ "RTL": product.priceFacets["Regular Price"],
424
+ "WADW": product.priceFacets["Wholesale Price"],
425
+ "WHL": product.priceFacets["Wholesale Price"],
426
+ "WWHL": product.priceFacets["Wholesale Price"]
396
427
  },
397
428
  "cvMap": {
398
- "WWHL": (data.sku[count].priceFacets.CV) ? data.sku[count].priceFacets.CV : '',
399
- "WADW": (data.sku[count].priceFacets.CV) ? data.sku[count].priceFacets.CV : '',
400
- "WHL": (data.sku[count].priceFacets.CV) ? data.sku[count].priceFacets.CV : ''
429
+ "WWHL": (product.priceFacets.CV) ? product.priceFacets.CV : '',
430
+ "WADW": (product.priceFacets.CV) ? product.priceFacets.CV : '',
431
+ "WHL": (product.priceFacets.CV) ? product.priceFacets.CV : ''
401
432
  },
402
433
  "pvMap": {
403
- "WWHL": data.sku[count].priceFacets.PV,
404
- "WADW": data.sku[count].priceFacets.PV,
405
- "WHL": data.sku[count].priceFacets.PV
434
+ "WWHL": product.priceFacets.PV,
435
+ "WADW": product.priceFacets.PV,
436
+ "WHL": product.priceFacets.PV
406
437
  },
407
- "orderTypes": this._setOrderType(data.sku[count].properties),
408
- "childSkus": [],
409
- "custTypes": this.switchCustType(data.sku[count].properties.customerTypes),
410
- "division": data.properties.division,
438
+ "orderTypes": this._setOrderType(product.properties),
439
+ childSkus: await this.fetchChildSkus(product),
440
+ "custTypes": this.switchCustType(product.properties.customerTypes),
441
+ "division": productData.properties.division,
411
442
  "backOrderDate": null,
412
443
  "locallyProduced": false,
413
444
  "agelocme": null,
414
445
  "count": "",
415
446
  "flavor": "",
416
- "size": data.sku[count].properties.size,
447
+ "size": product.properties.size,
417
448
  "shade": "",
418
- "status": this.switchStatusFromEquinox(data.sku[count].properties.productStatus),
449
+ "status": this.switchStatusFromEquinox(product.properties.productStatus),
419
450
  "variantType": "Other",
420
- "variantDropdownLabel": data.sku[count].properties.variantSelectLabel || "",
451
+ "variantDropdownLabel": product.properties.variantLabel || "",
421
452
  "variantDropdownPlaceholder": "Select Type",
422
- "variantsLabel": data.sku[count].properties.variantSelectLabel || "",
453
+ "variantsLabel": product.properties.variantLabel || "",
423
454
  "groupOffer": false,
424
455
  "personalOffer": false,
425
456
  "savedEventName": eventName,
@@ -429,7 +460,7 @@ const ProductData = {
429
460
  "nettoWeight": "",
430
461
  "variants": variants,
431
462
  "searchScore": 0,
432
- "isExclusive": data.sku[count].properties.isExclusive || false,
463
+ "isExclusive": product.properties.isExclusive || false,
433
464
  "marketAttributes": {
434
465
  "discount": true,
435
466
  "redeem": true,
@@ -437,15 +468,15 @@ const ProductData = {
437
468
  },
438
469
  "restrictedMarkets": [],
439
470
  "addOns": [],
440
- "inventory": data.sku[count].inventory || "", //inventory label
441
- "equinoxProductId": data.identifier
471
+ "inventory": product.inventory || "", //inventory label
472
+ "equinoxProductId": productData.identifier
442
473
  };
443
- let newProduct = new Product(prod);
444
- return newProduct
445
- });
474
+
475
+ products.push(new Product(product));
476
+ }
446
477
 
447
478
  let data = {
448
- products: this._sortProductsBySku(skus, prodArr),
479
+ products: this._sortProductsBySku(skus, products),
449
480
  count: productDataResponse.length
450
481
  };
451
482
  return {
@@ -457,6 +488,48 @@ const ProductData = {
457
488
  };
458
489
  },
459
490
 
491
+ /**
492
+ * fetchChildSkus make requests to Equinox to get the SKUs of a kit.
493
+ * @param {*} product
494
+ */
495
+ fetchChildSkus: async function(product) {
496
+ if (product.type === productTypes.kit) {
497
+ const config = getCachedConfigurations(['Equinox_Markets']).Equinox_Markets;
498
+ const { skukits } = product.properties;
499
+ const { locale } = product.tempProperties[0];
500
+
501
+ if (!skukits) {
502
+ return [];
503
+ }
504
+
505
+ const kits = skukits.split(',').map(kit => {
506
+ const [sku, qty] = kit.split('~');
507
+ return { sku, qty };
508
+ });
509
+ const skus = kits.map(k => k.sku);
510
+ const res = await this.searchEquinoxProduct(skus, locale, config);
511
+ const childSkus = res.product.map(p => this.buildChildSkus(kits, p));
512
+
513
+ return childSkus;
514
+ }
515
+
516
+ return [];
517
+ },
518
+
519
+ buildChildSkus: function(kits, product) {
520
+ const sku = product.sku[0];
521
+ const kit = kits.filter(k => k.sku === sku.identifier);
522
+
523
+ return {
524
+ productId: product.identifier,
525
+ skuId: sku.identifier,
526
+ type: 'MANDATORY',
527
+ skuQuantity: kit.qty,
528
+ availableChannels: sku.properties.availableChannels,
529
+ backOrdered: sku.inventoryProperties.backOrdered
530
+ }
531
+ },
532
+
460
533
  /**
461
534
  *
462
535
  * Map status from equinox to legacy