rerobe-js-orm 2.4.82 → 2.4.86
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/lib/factories/Product/ProductFromFormState.js +24 -21
- package/lib/form-states/Product/ProductFormState.d.ts +1 -0
- package/lib/form-states/Product/ProductFormState.js +24 -1
- package/lib/helpers/OrderHelpers.js +9 -0
- package/lib/helpers/ReRobeProductHelpers.js +3 -5
- package/lib/helpers/Utilities.d.ts +5 -0
- package/lib/helpers/Utilities.js +24 -0
- package/lib/models/Product.d.ts +18 -0
- package/lib/models/Product.js +372 -1
- package/lib/types/rerobe-product-types.d.ts +72 -0
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ const ProductFactory_1 = require("./ProductFactory");
|
|
|
4
4
|
const Product_1 = require("../../models/Product");
|
|
5
5
|
class ProductFromFormState extends ProductFactory_1.default {
|
|
6
6
|
createProduct(props) {
|
|
7
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11;
|
|
7
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13;
|
|
8
8
|
const productAttributes = {
|
|
9
9
|
availableForSale: props.fields.availableForSale.selectedValue,
|
|
10
10
|
description: props.fields.description.inputValue,
|
|
@@ -76,28 +76,31 @@ class ProductFromFormState extends ProductFactory_1.default {
|
|
|
76
76
|
discountValue: props.fields.discountValue.inputValue || '',
|
|
77
77
|
selectedForClearance: ((_r = props.props) === null || _r === void 0 ? void 0 : _r.selectedForClearance) || '',
|
|
78
78
|
locationIds: props.fields.locationIds.selectedValues || [],
|
|
79
|
+
inventoryLocations: props.fields.inventoryLocations.selectedValues || [],
|
|
79
80
|
};
|
|
80
81
|
const timestampAttributes = {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
82
|
+
createdAtTimestamp: (_s = props.props) === null || _s === void 0 ? void 0 : _s.createdAtTimestamp,
|
|
83
|
+
updatedAtTimestamp: (_t = props.props) === null || _t === void 0 ? void 0 : _t.updatedAtTimestamp,
|
|
84
|
+
sellRequestReviewTimestamp: (_u = props.props) === null || _u === void 0 ? void 0 : _u.sellRequestReviewTimestamp,
|
|
85
|
+
sellRequestReviewDraftTimestamp: (_v = props.props) === null || _v === void 0 ? void 0 : _v.sellRequestReviewDraftTimestamp,
|
|
86
|
+
rejectedTimestamp: (_w = props.props) === null || _w === void 0 ? void 0 : _w.rejectedTimestamp,
|
|
87
|
+
holdTimestamp: (_x = props.props) === null || _x === void 0 ? void 0 : _x.holdTimestamp,
|
|
88
|
+
acceptedTimestamp: (_y = props.props) === null || _y === void 0 ? void 0 : _y.acceptedTimestamp,
|
|
89
|
+
sellerToDropOffTimestamp: (_z = props.props) === null || _z === void 0 ? void 0 : _z.sellerToDropOffTimestamp,
|
|
90
|
+
sellerToShipTimestamp: (_0 = props.props) === null || _0 === void 0 ? void 0 : _0.sellerToShipTimestamp,
|
|
91
|
+
sellerToGetPickUpTimestamp: (_1 = props.props) === null || _1 === void 0 ? void 0 : _1.sellerToGetPickUpTimestamp,
|
|
92
|
+
qualityControlTimestamp: (_2 = props.props) === null || _2 === void 0 ? void 0 : _2.qualityControlTimestamp,
|
|
93
|
+
pendingPublicationTimestamp: (_3 = props.props) === null || _3 === void 0 ? void 0 : _3.pendingPublicationTimestamp,
|
|
94
|
+
listedTimestamp: (_4 = props.props) === null || _4 === void 0 ? void 0 : _4.listedTimestamp,
|
|
95
|
+
clearanceTimestamp: (_5 = props.props) === null || _5 === void 0 ? void 0 : _5.clearanceTimestamp,
|
|
96
|
+
reservedTimestamp: (_6 = props.props) === null || _6 === void 0 ? void 0 : _6.reservedTimestamp,
|
|
97
|
+
soldTimestamp: (_7 = props.props) === null || _7 === void 0 ? void 0 : _7.soldTimestamp,
|
|
98
|
+
returnedTimestamp: (_8 = props.props) === null || _8 === void 0 ? void 0 : _8.returnedTimestamp,
|
|
99
|
+
soldSellerToBePaidTimestamp: (_9 = props.props) === null || _9 === void 0 ? void 0 : _9.soldSellerToBePaidTimestamp,
|
|
100
|
+
soldSellerPaidTimestamp: (_10 = props.props) === null || _10 === void 0 ? void 0 : _10.soldSellerPaidTimestamp,
|
|
101
|
+
sellerSelfRejectTimestamp: (_11 = props.props) === null || _11 === void 0 ? void 0 : _11.sellerSelfRejectTimestamp,
|
|
102
|
+
liquidationRequestedTimestamp: (_12 = props.props) === null || _12 === void 0 ? void 0 : _12.liquidationRequestedTimestamp,
|
|
103
|
+
sellerLiquidatedTimestamp: (_13 = props.props) === null || _13 === void 0 ? void 0 : _13.sellerLiquidatedTimestamp,
|
|
101
104
|
};
|
|
102
105
|
return new Product_1.default(Object.assign(Object.assign(Object.assign(Object.assign({}, productAttributes), productFilterAttributes), consignmentAttributes), timestampAttributes));
|
|
103
106
|
}
|
|
@@ -71,6 +71,7 @@ class ProductFormState extends FormState_1.default {
|
|
|
71
71
|
this.fields.vendorName = this.fieldFactory('singleSelect', 'vendorName');
|
|
72
72
|
this.fields.rfidTag = this.fieldFactory('textInput', 'rfidTag');
|
|
73
73
|
this.fields.locationIds = this.fieldFactory('multiSelect', 'locationIds');
|
|
74
|
+
this.fields.inventoryLocations = this.fieldFactory('multiSelect', 'inventoryLocations');
|
|
74
75
|
this.fields.featuredCollections = this.fieldFactory('multiSelect', 'featuredCollections');
|
|
75
76
|
this.fields.tags = this.fieldFactory('multiSelect', 'tags');
|
|
76
77
|
}
|
|
@@ -413,6 +414,24 @@ class ProductFormState extends FormState_1.default {
|
|
|
413
414
|
}
|
|
414
415
|
return '';
|
|
415
416
|
}
|
|
417
|
+
inventoryLocationsChangeHandler(val) {
|
|
418
|
+
const { id, incomingAmount, availableAmount } = val;
|
|
419
|
+
const existingIds = this.fields.inventoryLocations.selectedValues.map((i) => i.id);
|
|
420
|
+
if (existingIds.includes(id)) {
|
|
421
|
+
const foundInd = this.fields.inventoryLocations.selectedValues.findIndex((i) => i.id === id);
|
|
422
|
+
const foundI = this.fields.inventoryLocations.selectedValues[foundInd];
|
|
423
|
+
// Delete case: val is exact same object
|
|
424
|
+
if (incomingAmount === foundI.incomingAmount && availableAmount === foundI.availableAmount) {
|
|
425
|
+
this.fields.inventoryLocations.selectedValues.splice(foundInd, 1);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
this.fields.inventoryLocations.selectedValues.splice(foundInd, 1, val);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
this.multiSelectChangeHandler('inventoryLocations', val);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
416
435
|
fieldFactory(fieldType, fieldKey, fieldOptions) {
|
|
417
436
|
let options = fieldOptions || [];
|
|
418
437
|
let hidden = false;
|
|
@@ -499,6 +518,7 @@ class ProductFormState extends FormState_1.default {
|
|
|
499
518
|
};
|
|
500
519
|
}
|
|
501
520
|
if (fieldType === 'multiSelect') {
|
|
521
|
+
let onChangeHandler = (val) => this.multiSelectChangeHandler(fieldKey, val);
|
|
502
522
|
if (fieldKey === 'productStyle') {
|
|
503
523
|
options = this.setProductStylesFromCategoryAndType(this.props.productCategory, this.props.productType);
|
|
504
524
|
if (this.props.productStyle && this.props.productStyle.length > 0) {
|
|
@@ -608,12 +628,15 @@ class ProductFormState extends FormState_1.default {
|
|
|
608
628
|
}
|
|
609
629
|
hidden = this.props.productCategory !== 'Clothing' || this.props.productType === 'Jeans';
|
|
610
630
|
}
|
|
631
|
+
if (fieldKey === 'inventoryLocations') {
|
|
632
|
+
onChangeHandler = (val) => this.inventoryLocationsChangeHandler(val);
|
|
633
|
+
}
|
|
611
634
|
return {
|
|
612
635
|
options,
|
|
613
636
|
hidden,
|
|
614
637
|
selectedValues: this.props[fieldKey] || [],
|
|
615
638
|
valid: this.props[fieldKey].length > 0,
|
|
616
|
-
onChangeHandler
|
|
639
|
+
onChangeHandler,
|
|
617
640
|
};
|
|
618
641
|
}
|
|
619
642
|
if (fieldType === 'textInput') {
|
|
@@ -16,6 +16,15 @@ class OrderHelpers {
|
|
|
16
16
|
}
|
|
17
17
|
getShippingTypeFromShopifyObj(shippingLines) {
|
|
18
18
|
if (shippingLines && shippingLines[0]) {
|
|
19
|
+
if (shippingLines[0].title === 'Local pickup') {
|
|
20
|
+
return Order_1.default.SHIPPING_TYPES.localPickUp;
|
|
21
|
+
}
|
|
22
|
+
if (shippingLines[0].title === 'Shipping fee') {
|
|
23
|
+
return Order_1.default.SHIPPING_TYPES.shipping;
|
|
24
|
+
}
|
|
25
|
+
if (shippingLines[0].title === 'Localy delivery') {
|
|
26
|
+
return Order_1.default.SHIPPING_TYPES.localDelivery;
|
|
27
|
+
}
|
|
19
28
|
return shippingLines[0].price_set.shop_money.amount > 0
|
|
20
29
|
? Order_1.default.SHIPPING_TYPES.localDelivery
|
|
21
30
|
: Order_1.default.SHIPPING_TYPES.localPickUp;
|
|
@@ -226,7 +226,7 @@ class ReRobeProductHelpers {
|
|
|
226
226
|
static createTimestampsForStates(productObj) {
|
|
227
227
|
const docFieldsToUpdate = {};
|
|
228
228
|
if (productObj) {
|
|
229
|
-
const {
|
|
229
|
+
const { status, sellRequestReviewDraftTimestamp, sellRequestReviewTimestamp, rejectedTimestamp, holdTimestamp, acceptedTimestamp, sellerToDropOffTimestamp, sellerToShipTimestamp, sellerToGetPickUpTimestamp, qualityControlTimestamp, pendingPublicationTimestamp, listedTimestamp, clearanceTimestamp, reservedTimestamp, soldTimestamp, soldSellerToBePaidTimestamp, soldSellerPaidTimestamp, returnedTimestamp, sellerSelfRejectTimestamp, liquidationRequestedTimestamp, sellerLiquidatedTimestamp, } = productObj;
|
|
230
230
|
if (status === ProductStateManager_1.default.PRODUCT_STATES.sellRequestReviewDraft && !sellRequestReviewDraftTimestamp) {
|
|
231
231
|
docFieldsToUpdate.sellRequestReviewDraftTimestamp = new Date().getTime();
|
|
232
232
|
}
|
|
@@ -273,8 +273,7 @@ class ReRobeProductHelpers {
|
|
|
273
273
|
const timeNow = new Date().getTime();
|
|
274
274
|
docFieldsToUpdate.soldSellerToBePaidTimestamp = timeNow;
|
|
275
275
|
if (!soldTimestamp) {
|
|
276
|
-
docFieldsToUpdate.soldTimestamp =
|
|
277
|
-
dateSold && typeof dateSold === 'string' ? new Date(dateSold).getTime() : timeNow;
|
|
276
|
+
docFieldsToUpdate.soldTimestamp = timeNow;
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
if (status === ProductStateManager_1.default.PRODUCT_STATES.soldSellerPaid && !soldSellerPaidTimestamp) {
|
|
@@ -284,8 +283,7 @@ class ReRobeProductHelpers {
|
|
|
284
283
|
docFieldsToUpdate.soldSellerToBePaidTimestamp = timeNow;
|
|
285
284
|
}
|
|
286
285
|
if (!soldTimestamp) {
|
|
287
|
-
docFieldsToUpdate.soldTimestamp =
|
|
288
|
-
dateSold && typeof dateSold === 'string' ? new Date(dateSold).getTime() : timeNow;
|
|
286
|
+
docFieldsToUpdate.soldTimestamp = timeNow;
|
|
289
287
|
}
|
|
290
288
|
}
|
|
291
289
|
if (status === ProductStateManager_1.default.PRODUCT_STATES.returned && !returnedTimestamp) {
|
|
@@ -7,6 +7,11 @@ export default class Utilities {
|
|
|
7
7
|
getWeekNumberFromDate(dateString: string): string;
|
|
8
8
|
capitalizeString(s: string): string;
|
|
9
9
|
startCase(s: string): string;
|
|
10
|
+
camelCase(s: string): string;
|
|
10
11
|
constantCase(str: string): any;
|
|
11
12
|
makeRandId(length: number): string;
|
|
13
|
+
sanitizeString(v: any): string;
|
|
14
|
+
sanitzeStringArr(v: any): string[];
|
|
15
|
+
sanitizeNumber(v: any, to?: number): number;
|
|
16
|
+
sanitizeMillisTimeStamp(t: any): number;
|
|
12
17
|
}
|
package/lib/helpers/Utilities.js
CHANGED
|
@@ -47,6 +47,9 @@ class Utilities {
|
|
|
47
47
|
startCase(s) {
|
|
48
48
|
return lodash_1.startCase(s);
|
|
49
49
|
}
|
|
50
|
+
camelCase(s) {
|
|
51
|
+
return lodash_1.camelCase(s);
|
|
52
|
+
}
|
|
50
53
|
constantCase(str) {
|
|
51
54
|
return lodash_1.snakeCase(str).toUpperCase();
|
|
52
55
|
}
|
|
@@ -60,5 +63,26 @@ class Utilities {
|
|
|
60
63
|
}
|
|
61
64
|
return result;
|
|
62
65
|
}
|
|
66
|
+
sanitizeString(v) {
|
|
67
|
+
if (v && (typeof v === 'string' || typeof v === 'number')) {
|
|
68
|
+
return String(v);
|
|
69
|
+
}
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
sanitzeStringArr(v) {
|
|
73
|
+
if (v && Array.isArray(v)) {
|
|
74
|
+
return v.filter((e) => e).map((e) => String(e));
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
sanitizeNumber(v, to = 1) {
|
|
79
|
+
return Number.isNaN(parseFloat(String(v))) ? Number(to) : parseFloat(String(v));
|
|
80
|
+
}
|
|
81
|
+
sanitizeMillisTimeStamp(t) {
|
|
82
|
+
if (t && typeof t === 'number') {
|
|
83
|
+
return t;
|
|
84
|
+
}
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
63
87
|
}
|
|
64
88
|
exports.default = Utilities;
|
package/lib/models/Product.d.ts
CHANGED
|
@@ -10,11 +10,29 @@ export default class Product extends Base {
|
|
|
10
10
|
toObj(): CompleteProduct;
|
|
11
11
|
toProductInputObjForShopify(location?: string): any;
|
|
12
12
|
toObjForTextTranslation(): TranslatableAttributes;
|
|
13
|
+
toObjForTypesense(): TypesenseProductObj;
|
|
13
14
|
updateSelfFromTranslatedTextArray(translatedTextArray?: string[]): void;
|
|
14
15
|
autoCreateTitle(): string;
|
|
15
16
|
autoCreateDescriptionHTML(): string;
|
|
17
|
+
generateSchemaForTypesense(name?: string): {
|
|
18
|
+
default_sorting_field: string;
|
|
19
|
+
fields: ({
|
|
20
|
+
facet: boolean;
|
|
21
|
+
name: string;
|
|
22
|
+
type: string;
|
|
23
|
+
optional?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
facet: boolean;
|
|
26
|
+
optional: boolean;
|
|
27
|
+
name: string;
|
|
28
|
+
type: string;
|
|
29
|
+
})[];
|
|
30
|
+
name: string;
|
|
31
|
+
};
|
|
16
32
|
private materialCompTagsArrayForShopify;
|
|
17
33
|
private materialCompJoinedString;
|
|
18
34
|
private measurementsJoinedString;
|
|
19
35
|
private convertMaterialCompJoinedStrToObj;
|
|
36
|
+
private sanitizeMaterialComp;
|
|
37
|
+
private sanitizeCommission;
|
|
20
38
|
}
|
package/lib/models/Product.js
CHANGED
|
@@ -80,8 +80,11 @@ class Product extends Base_1.default {
|
|
|
80
80
|
discountValue: (props === null || props === void 0 ? void 0 : props.discountValue) || '',
|
|
81
81
|
selectedForClearance: (props === null || props === void 0 ? void 0 : props.selectedForClearance) || '',
|
|
82
82
|
locationIds: (props === null || props === void 0 ? void 0 : props.locationIds) || [],
|
|
83
|
+
inventoryLocations: (props === null || props === void 0 ? void 0 : props.inventoryLocations) || [],
|
|
83
84
|
};
|
|
84
85
|
this.timestampAttributes = {
|
|
86
|
+
createdAtTimestamp: (props === null || props === void 0 ? void 0 : props.createdAtTimestamp) ? Number(props === null || props === void 0 ? void 0 : props.createdAtTimestamp) : null,
|
|
87
|
+
updatedAtTimestamp: (props === null || props === void 0 ? void 0 : props.updatedAtTimestamp) ? Number(props === null || props === void 0 ? void 0 : props.updatedAtTimestamp) : null,
|
|
85
88
|
sellRequestReviewDraftTimestamp: (props === null || props === void 0 ? void 0 : props.sellRequestReviewDraftTimestamp)
|
|
86
89
|
? Number(props === null || props === void 0 ? void 0 : props.sellRequestReviewDraftTimestamp)
|
|
87
90
|
: null,
|
|
@@ -114,7 +117,7 @@ class Product extends Base_1.default {
|
|
|
114
117
|
}
|
|
115
118
|
toPartialObj() {
|
|
116
119
|
return Object.assign(Object.assign({}, this.attributes), this.filterAttributes);
|
|
117
|
-
}
|
|
120
|
+
} // ToDo: Deprecate soon
|
|
118
121
|
toObj() {
|
|
119
122
|
return Object.assign(Object.assign(Object.assign(Object.assign({}, this.attributes), this.filterAttributes), this.consignmentAttributes), this.timestampAttributes);
|
|
120
123
|
}
|
|
@@ -225,6 +228,83 @@ class Product extends Base_1.default {
|
|
|
225
228
|
condition: this.filterAttributes.condition || this.FIELD_NOT_TRANSLATABLE_KEY,
|
|
226
229
|
};
|
|
227
230
|
}
|
|
231
|
+
toObjForTypesense() {
|
|
232
|
+
const stagedObj = {
|
|
233
|
+
brand: this.utilities.sanitizeString(this.filterAttributes.brand),
|
|
234
|
+
clothingSize: this.utilities.sanitzeStringArr(this.filterAttributes.clothingSize),
|
|
235
|
+
jeanSize: this.utilities.sanitizeString(this.filterAttributes.jeanSize),
|
|
236
|
+
shoeSize: this.utilities.sanitizeString(this.filterAttributes.shoeSize),
|
|
237
|
+
condition: this.utilities.sanitizeString(this.filterAttributes.condition),
|
|
238
|
+
featuredCollections: this.utilities.sanitzeStringArr(this.filterAttributes.featuredCollections),
|
|
239
|
+
isOnSale: this.utilities.sanitizeString(this.consignmentAttributes.isOnSale),
|
|
240
|
+
merchants: this.utilities.sanitzeStringArr(this.attributes.merchants),
|
|
241
|
+
price: this.utilities.sanitizeNumber(this.attributes.price),
|
|
242
|
+
suggestedResalePrice: this.utilities.sanitizeNumber(this.consignmentAttributes.suggestedResalePrice),
|
|
243
|
+
salePrice: this.utilities.sanitizeNumber(this.consignmentAttributes.salePrice),
|
|
244
|
+
compareAtPrice: this.utilities.sanitizeNumber(this.attributes.compareAtPrice),
|
|
245
|
+
costPerItem: this.utilities.sanitizeNumber(this.attributes.costPerItem),
|
|
246
|
+
priceRange: this.utilities.sanitizeString(this.filterAttributes.priceRange),
|
|
247
|
+
productCategory: this.utilities.sanitizeString(this.filterAttributes.productCategory),
|
|
248
|
+
productType: this.utilities.sanitizeString(this.filterAttributes.productType),
|
|
249
|
+
productStyle: this.utilities.sanitzeStringArr(this.filterAttributes.productStyle),
|
|
250
|
+
reRobeCommission: this.sanitizeCommission(),
|
|
251
|
+
rfidTag: this.utilities.sanitizeString(this.attributes.rfidTag),
|
|
252
|
+
salesChannel: this.utilities.sanitzeStringArr(this.consignmentAttributes.salesChannel),
|
|
253
|
+
status: this.utilities.sanitizeString(this.consignmentAttributes.status),
|
|
254
|
+
tags: this.utilities.sanitzeStringArr(this.filterAttributes.tags),
|
|
255
|
+
title: this.utilities.sanitizeString(this.attributes.title),
|
|
256
|
+
vendorName: this.utilities.sanitizeString(this.attributes.vendorName),
|
|
257
|
+
createdAtTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.createdAtTimestamp),
|
|
258
|
+
updatedAtTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.updatedAtTimestamp),
|
|
259
|
+
sellRequestReviewTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellRequestReviewTimestamp),
|
|
260
|
+
sellRequestReviewDraftTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellRequestReviewDraftTimestamp),
|
|
261
|
+
rejectedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.rejectedTimestamp),
|
|
262
|
+
holdTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.holdTimestamp),
|
|
263
|
+
acceptedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.acceptedTimestamp),
|
|
264
|
+
sellerToDropOffTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellerToDropOffTimestamp),
|
|
265
|
+
sellerToShipTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellerToShipTimestamp),
|
|
266
|
+
sellerToGetPickUpTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellerToGetPickUpTimestamp),
|
|
267
|
+
qualityControlTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.qualityControlTimestamp),
|
|
268
|
+
pendingPublicationTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.pendingPublicationTimestamp),
|
|
269
|
+
listedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.listedTimestamp),
|
|
270
|
+
clearanceTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.clearanceTimestamp),
|
|
271
|
+
reservedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.reservedTimestamp),
|
|
272
|
+
soldTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.soldTimestamp),
|
|
273
|
+
returnedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.returnedTimestamp),
|
|
274
|
+
soldSellerToBePaidTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.soldSellerToBePaidTimestamp),
|
|
275
|
+
soldSellerPaidTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.soldSellerPaidTimestamp),
|
|
276
|
+
sellerSelfRejectTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellerSelfRejectTimestamp),
|
|
277
|
+
liquidationRequestedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.liquidationRequestedTimestamp),
|
|
278
|
+
sellerLiquidatedTimestamp: this.utilities.sanitizeMillisTimeStamp(this.timestampAttributes.sellerLiquidatedTimestamp),
|
|
279
|
+
availableForSale: !!this.attributes.availableForSale,
|
|
280
|
+
color: this.utilities.sanitizeString(this.filterAttributes.color),
|
|
281
|
+
description: this.utilities.sanitizeString(this.attributes.description),
|
|
282
|
+
discountType: this.utilities.sanitizeString(this.consignmentAttributes.discountType),
|
|
283
|
+
discountValue: this.utilities.sanitizeNumber(this.consignmentAttributes.discountValue, 0),
|
|
284
|
+
id: this.utilities.sanitizeString(this.filterAttributes.documentId),
|
|
285
|
+
gender: this.utilities.sanitizeString(this.filterAttributes.gender),
|
|
286
|
+
handle: this.utilities.sanitizeString(this.attributes.handle),
|
|
287
|
+
imageUrls: this.utilities.sanitzeStringArr(this.attributes.imageUrls),
|
|
288
|
+
sellRequestImageUrls: this.utilities.sanitzeStringArr(this.consignmentAttributes.sellRequestImageUrls),
|
|
289
|
+
reservedBy: this.utilities.sanitzeStringArr(this.attributes.reservedBy),
|
|
290
|
+
'materialComposition.names': Object.keys(this.sanitizeMaterialComp()),
|
|
291
|
+
'inventoryLocations.ids': this.consignmentAttributes.inventoryLocations && Array.isArray(this.consignmentAttributes.inventoryLocations)
|
|
292
|
+
? this.consignmentAttributes.inventoryLocations.map((c) => String(c.id))
|
|
293
|
+
: [],
|
|
294
|
+
};
|
|
295
|
+
this.consignmentAttributes.inventoryLocations.forEach((l) => {
|
|
296
|
+
if (l.id) {
|
|
297
|
+
stagedObj[`inventoryLocations.${l.id}.availableAmount`] = l.availableAmount || 0;
|
|
298
|
+
stagedObj[`inventoryLocations.${l.id}.incomingAmount`] = l.incomingAmount || 0;
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
Object.values(this.sanitizeMaterialComp()).forEach((v, i) => {
|
|
302
|
+
if (v) {
|
|
303
|
+
stagedObj[`materialComposition.${Object.keys(this.sanitizeMaterialComp())[i]}.value`] = v;
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
return stagedObj;
|
|
307
|
+
}
|
|
228
308
|
updateSelfFromTranslatedTextArray(translatedTextArray = []) {
|
|
229
309
|
const checkFieldTranslated = (val) => {
|
|
230
310
|
return val !== this.FIELD_NOT_TRANSLATABLE_KEY;
|
|
@@ -323,6 +403,261 @@ class Product extends Base_1.default {
|
|
|
323
403
|
return acc;
|
|
324
404
|
}, '');
|
|
325
405
|
}
|
|
406
|
+
generateSchemaForTypesense(name = 'prod_products_202101061') {
|
|
407
|
+
return {
|
|
408
|
+
default_sorting_field: 'createdAtTimestamp',
|
|
409
|
+
fields: [
|
|
410
|
+
{
|
|
411
|
+
facet: true,
|
|
412
|
+
name: 'brand',
|
|
413
|
+
type: 'string',
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
facet: true,
|
|
417
|
+
name: 'clothingSize',
|
|
418
|
+
type: 'string[]',
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
facet: true,
|
|
422
|
+
name: 'jeanSize',
|
|
423
|
+
type: 'string',
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
facet: true,
|
|
427
|
+
name: 'shoeSize',
|
|
428
|
+
type: 'string',
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
facet: true,
|
|
432
|
+
name: 'condition',
|
|
433
|
+
type: 'string',
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
facet: true,
|
|
437
|
+
optional: true,
|
|
438
|
+
name: 'featuredCollections',
|
|
439
|
+
type: 'string[]',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
facet: true,
|
|
443
|
+
optional: true,
|
|
444
|
+
name: 'isOnSale',
|
|
445
|
+
type: 'string',
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
facet: false,
|
|
449
|
+
optional: false,
|
|
450
|
+
name: 'merchants',
|
|
451
|
+
type: 'string[]',
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
facet: true,
|
|
455
|
+
name: 'price',
|
|
456
|
+
type: 'float',
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
facet: true,
|
|
460
|
+
optional: true,
|
|
461
|
+
name: 'suggestedResalePrice',
|
|
462
|
+
type: 'float',
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
facet: true,
|
|
466
|
+
optional: true,
|
|
467
|
+
name: 'salePrice',
|
|
468
|
+
type: 'float',
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
facet: false,
|
|
472
|
+
optional: true,
|
|
473
|
+
name: 'compareAtPrice',
|
|
474
|
+
type: 'float',
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
facet: false,
|
|
478
|
+
optional: true,
|
|
479
|
+
name: 'costPerItem',
|
|
480
|
+
type: 'float',
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
facet: true,
|
|
484
|
+
name: 'priceRange',
|
|
485
|
+
type: 'string',
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
facet: true,
|
|
489
|
+
name: 'productCategory',
|
|
490
|
+
type: 'string',
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
facet: true,
|
|
494
|
+
name: 'productType',
|
|
495
|
+
type: 'string',
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
facet: true,
|
|
499
|
+
name: 'productStyle',
|
|
500
|
+
type: 'string[]',
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
facet: true,
|
|
504
|
+
name: 'reRobeCommission',
|
|
505
|
+
type: 'float',
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
facet: true,
|
|
509
|
+
optional: true,
|
|
510
|
+
name: 'rfidTag',
|
|
511
|
+
type: 'string',
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
facet: true,
|
|
515
|
+
optional: true,
|
|
516
|
+
name: 'salesChannel',
|
|
517
|
+
type: 'string[]',
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
facet: true,
|
|
521
|
+
name: 'status',
|
|
522
|
+
type: 'string',
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
facet: true,
|
|
526
|
+
optional: true,
|
|
527
|
+
name: 'tags',
|
|
528
|
+
type: 'string[]',
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
facet: false,
|
|
532
|
+
name: 'title',
|
|
533
|
+
type: 'string',
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
facet: true,
|
|
537
|
+
name: 'vendorName',
|
|
538
|
+
type: 'string',
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
facet: false,
|
|
542
|
+
optional: true,
|
|
543
|
+
name: '.*Timestamp',
|
|
544
|
+
type: 'int32',
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
facet: false,
|
|
548
|
+
name: 'createdAtTimestamp',
|
|
549
|
+
type: 'int32',
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
facet: false,
|
|
553
|
+
name: 'updatedAtTimestamp',
|
|
554
|
+
type: 'int32',
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
facet: false,
|
|
558
|
+
name: 'availableForSale',
|
|
559
|
+
type: 'bool',
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
facet: true,
|
|
563
|
+
name: 'color',
|
|
564
|
+
type: 'string',
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
facet: false,
|
|
568
|
+
name: 'description',
|
|
569
|
+
type: 'string',
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
facet: false,
|
|
573
|
+
optional: true,
|
|
574
|
+
name: 'discountType',
|
|
575
|
+
type: 'string',
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
facet: false,
|
|
579
|
+
optional: true,
|
|
580
|
+
name: 'discountValue',
|
|
581
|
+
type: 'string',
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
facet: false,
|
|
585
|
+
name: 'id',
|
|
586
|
+
type: 'string',
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
facet: true,
|
|
590
|
+
name: 'gender',
|
|
591
|
+
type: 'string',
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
facet: false,
|
|
595
|
+
optional: true,
|
|
596
|
+
name: 'handle',
|
|
597
|
+
type: 'string',
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
facet: false,
|
|
601
|
+
name: 'imageUrls',
|
|
602
|
+
type: 'string[]',
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
facet: false,
|
|
606
|
+
name: 'sellRequestImageUrls',
|
|
607
|
+
type: 'string[]',
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
facet: false,
|
|
611
|
+
optional: true,
|
|
612
|
+
name: 'notesForProductionTeam',
|
|
613
|
+
type: 'string',
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
facet: false,
|
|
617
|
+
optional: true,
|
|
618
|
+
name: 'nextAvailableSeason',
|
|
619
|
+
type: 'string',
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
facet: false,
|
|
623
|
+
optional: true,
|
|
624
|
+
name: 'reservedBy',
|
|
625
|
+
type: 'string[]',
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
facet: true,
|
|
629
|
+
optional: true,
|
|
630
|
+
name: 'inventoryLocations.ids',
|
|
631
|
+
type: 'string[]',
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
facet: true,
|
|
635
|
+
optional: true,
|
|
636
|
+
name: 'inventoryLocations..*.availableAmount',
|
|
637
|
+
type: 'int32',
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
facet: true,
|
|
641
|
+
optional: true,
|
|
642
|
+
name: 'inventoryLocations..*.incomingAmount',
|
|
643
|
+
type: 'int32',
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
facet: true,
|
|
647
|
+
optional: true,
|
|
648
|
+
name: 'materialComposition.names',
|
|
649
|
+
type: 'string[]',
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
facet: true,
|
|
653
|
+
optional: true,
|
|
654
|
+
name: 'materialComposition..*.value',
|
|
655
|
+
type: 'int32',
|
|
656
|
+
},
|
|
657
|
+
],
|
|
658
|
+
name,
|
|
659
|
+
};
|
|
660
|
+
}
|
|
326
661
|
materialCompTagsArrayForShopify() {
|
|
327
662
|
return Object.keys(this.filterAttributes.materialComposition).reduce((acc, cur, idx) => {
|
|
328
663
|
acc.push(`${cur} ${Object.values(this.filterAttributes.materialComposition)[idx]}`);
|
|
@@ -364,5 +699,41 @@ class Product extends Base_1.default {
|
|
|
364
699
|
}
|
|
365
700
|
return materialObj;
|
|
366
701
|
}
|
|
702
|
+
sanitizeMaterialComp() {
|
|
703
|
+
let materialComp = this.filterAttributes.materialComposition;
|
|
704
|
+
if (materialComp && Array.isArray(materialComp)) {
|
|
705
|
+
materialComp = materialComp.reduce((acc, cur) => {
|
|
706
|
+
const camelKey = this.utilities.camelCase(cur);
|
|
707
|
+
acc[camelKey] = 100;
|
|
708
|
+
return acc;
|
|
709
|
+
}, {});
|
|
710
|
+
}
|
|
711
|
+
if (typeof materialComp !== 'object') {
|
|
712
|
+
materialComp = {};
|
|
713
|
+
}
|
|
714
|
+
if (materialComp && Object.keys(materialComp).length > 0) {
|
|
715
|
+
const mcKeys = Object.keys(materialComp);
|
|
716
|
+
const mcValues = Object.values(materialComp);
|
|
717
|
+
materialComp = mcKeys.reduce((acc, curr, ind) => {
|
|
718
|
+
if (curr.charCodeAt(0) >= 65 && curr.charCodeAt(0) <= 90) {
|
|
719
|
+
return acc;
|
|
720
|
+
}
|
|
721
|
+
const camelKey = this.utilities.camelCase(curr);
|
|
722
|
+
acc[camelKey] = Number(mcValues[ind]);
|
|
723
|
+
return acc;
|
|
724
|
+
}, {});
|
|
725
|
+
}
|
|
726
|
+
return materialComp;
|
|
727
|
+
}
|
|
728
|
+
sanitizeCommission() {
|
|
729
|
+
const com = this.consignmentAttributes.reRobeCommission;
|
|
730
|
+
if (Number.isNaN(parseFloat(String(com)))) {
|
|
731
|
+
return 0.5;
|
|
732
|
+
}
|
|
733
|
+
if (parseFloat(String(com)) <= 1) {
|
|
734
|
+
return parseFloat(String(com));
|
|
735
|
+
}
|
|
736
|
+
return parseFloat(String(com)) / 100;
|
|
737
|
+
}
|
|
367
738
|
}
|
|
368
739
|
exports.default = Product;
|
|
@@ -69,8 +69,11 @@ declare type ProductConsignmentAttributes = {
|
|
|
69
69
|
discountValue: string;
|
|
70
70
|
selectedForClearance: string;
|
|
71
71
|
locationIds?: string[];
|
|
72
|
+
inventoryLocations: InventoryLocation[];
|
|
72
73
|
};
|
|
73
74
|
declare type ProductTimestampAttributes = {
|
|
75
|
+
createdAtTimestamp: number | null;
|
|
76
|
+
updatedAtTimestamp: number | null;
|
|
74
77
|
sellRequestReviewTimestamp: number | null;
|
|
75
78
|
sellRequestReviewDraftTimestamp: number | null;
|
|
76
79
|
rejectedTimestamp: number | null;
|
|
@@ -188,6 +191,7 @@ declare type ProductConsignmentAttributesFormFields = {
|
|
|
188
191
|
discountType: SingleSelectFormField<string>;
|
|
189
192
|
discountValue: TextInputFormField<string>;
|
|
190
193
|
locationIds: MultiSelectFormField<string>;
|
|
194
|
+
inventoryLocations: MultiSelectFormField<InventoryLocation>;
|
|
191
195
|
};
|
|
192
196
|
declare type ProductFormFields = ProductAttributesFormFields & ProductFilterAttributesFormFields & ProductConsignmentAttributesFormFields;
|
|
193
197
|
interface ParamsForBuildProductInputObjForShopify {
|
|
@@ -221,3 +225,71 @@ declare type ProductLineItem = {
|
|
|
221
225
|
image: string;
|
|
222
226
|
quantity: number;
|
|
223
227
|
};
|
|
228
|
+
declare type InventoryLocation = {
|
|
229
|
+
id: string;
|
|
230
|
+
name: string;
|
|
231
|
+
incomingAmount: number;
|
|
232
|
+
availableAmount: number;
|
|
233
|
+
};
|
|
234
|
+
declare type TypesenseProductObj = {
|
|
235
|
+
brand: string;
|
|
236
|
+
clothingSize: string[];
|
|
237
|
+
jeanSize: string;
|
|
238
|
+
shoeSize: string;
|
|
239
|
+
condition: string;
|
|
240
|
+
featuredCollections: string[];
|
|
241
|
+
isOnSale: string;
|
|
242
|
+
merchants: string[];
|
|
243
|
+
price: number;
|
|
244
|
+
suggestedResalePrice: number;
|
|
245
|
+
salePrice: number;
|
|
246
|
+
compareAtPrice: number;
|
|
247
|
+
costPerItem: number;
|
|
248
|
+
priceRange: string;
|
|
249
|
+
productCategory: string;
|
|
250
|
+
productType: string;
|
|
251
|
+
productStyle: string[];
|
|
252
|
+
reRobeCommission: number;
|
|
253
|
+
rfidTag: string;
|
|
254
|
+
salesChannel: string[];
|
|
255
|
+
status: string;
|
|
256
|
+
tags: string[];
|
|
257
|
+
title: string;
|
|
258
|
+
vendorName: string;
|
|
259
|
+
createdAtTimestamp: number;
|
|
260
|
+
updatedAtTimestamp: number;
|
|
261
|
+
sellRequestReviewTimestamp: number;
|
|
262
|
+
sellRequestReviewDraftTimestamp: number;
|
|
263
|
+
rejectedTimestamp: number;
|
|
264
|
+
holdTimestamp: number;
|
|
265
|
+
acceptedTimestamp: number;
|
|
266
|
+
sellerToDropOffTimestamp: number;
|
|
267
|
+
sellerToShipTimestamp: number;
|
|
268
|
+
sellerToGetPickUpTimestamp: number;
|
|
269
|
+
qualityControlTimestamp: number;
|
|
270
|
+
pendingPublicationTimestamp: number;
|
|
271
|
+
listedTimestamp: number;
|
|
272
|
+
clearanceTimestamp: number;
|
|
273
|
+
reservedTimestamp: number;
|
|
274
|
+
soldTimestamp: number;
|
|
275
|
+
returnedTimestamp: number;
|
|
276
|
+
soldSellerToBePaidTimestamp: number;
|
|
277
|
+
soldSellerPaidTimestamp: number;
|
|
278
|
+
sellerSelfRejectTimestamp: number;
|
|
279
|
+
liquidationRequestedTimestamp: number;
|
|
280
|
+
sellerLiquidatedTimestamp: number;
|
|
281
|
+
availableForSale: boolean;
|
|
282
|
+
color: string;
|
|
283
|
+
description: string;
|
|
284
|
+
discountType: string;
|
|
285
|
+
discountValue: number;
|
|
286
|
+
id: string;
|
|
287
|
+
gender: string;
|
|
288
|
+
handle: string;
|
|
289
|
+
imageUrls: string[];
|
|
290
|
+
sellRequestImageUrls: string[];
|
|
291
|
+
reservedBy: string[];
|
|
292
|
+
'inventoryLocations.ids': string[];
|
|
293
|
+
'materialComposition.names': string[];
|
|
294
|
+
[key: string]: any;
|
|
295
|
+
};
|