@things-factory/integration-sellercraft 5.0.0-alpha.9 → 5.0.0-y.0

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.
Files changed (49) hide show
  1. package/dist-server/constants/order-status-mapping.js +24 -3
  2. package/dist-server/constants/order-status-mapping.js.map +1 -1
  3. package/dist-server/constants/platform.js +4 -1
  4. package/dist-server/constants/platform.js.map +1 -1
  5. package/dist-server/controllers/sellercraft/sellercraft.js +2 -2
  6. package/dist-server/controllers/sellercraft/sellercraft.js.map +1 -1
  7. package/dist-server/controllers/sellercraft-api/decorators.js +2 -0
  8. package/dist-server/controllers/sellercraft-api/decorators.js.map +1 -1
  9. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.js +18 -21
  10. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.js.map +1 -1
  11. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.js +5 -2
  12. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.js.map +1 -1
  13. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.js +21 -14
  14. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.js.map +1 -1
  15. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.js +23 -23
  16. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.js.map +1 -1
  17. package/dist-server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.js +17 -6
  18. package/dist-server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.js.map +1 -1
  19. package/dist-server/routers/sellercraft-router.js +204 -134
  20. package/dist-server/routers/sellercraft-router.js.map +1 -1
  21. package/dist-server/service/marketplace-channel/marketplace-channel-order-mutation.js +327 -103
  22. package/dist-server/service/marketplace-channel/marketplace-channel-order-mutation.js.map +1 -1
  23. package/dist-server/service/marketplace-channel/marketplace-channel-product-mutation.js +173 -99
  24. package/dist-server/service/marketplace-channel/marketplace-channel-product-mutation.js.map +1 -1
  25. package/dist-server/service/marketplace-channel/marketplace-channel.js +5 -0
  26. package/dist-server/service/marketplace-channel/marketplace-channel.js.map +1 -1
  27. package/dist-server/service/sellercraft/sellercraft-mutation.js +3 -6
  28. package/dist-server/service/sellercraft/sellercraft-mutation.js.map +1 -1
  29. package/dist-server/service/sellercraft/sellercraft-query.js +1 -1
  30. package/dist-server/service/sellercraft/sellercraft-query.js.map +1 -1
  31. package/dist-server/utils/tokencraft-util.js +63 -0
  32. package/dist-server/utils/tokencraft-util.js.map +1 -0
  33. package/package.json +15 -15
  34. package/server/constants/order-status-mapping.ts +24 -2
  35. package/server/constants/platform.ts +4 -1
  36. package/server/controllers/sellercraft/sellercraft.ts +2 -2
  37. package/server/controllers/sellercraft-api/decorators.ts +3 -0
  38. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.ts +19 -22
  39. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.ts +6 -2
  40. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.ts +22 -15
  41. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.ts +32 -26
  42. package/server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.ts +15 -6
  43. package/server/routers/sellercraft-router.ts +218 -164
  44. package/server/service/marketplace-channel/marketplace-channel-order-mutation.ts +392 -156
  45. package/server/service/marketplace-channel/marketplace-channel-product-mutation.ts +199 -145
  46. package/server/service/marketplace-channel/marketplace-channel.ts +4 -0
  47. package/server/service/sellercraft/sellercraft-mutation.ts +3 -3
  48. package/server/service/sellercraft/sellercraft-query.ts +1 -1
  49. package/server/utils/tokencraft-util.ts +60 -0
@@ -1,182 +1,418 @@
1
1
  import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
- import { MarketplaceChannel } from './marketplace-channel'
5
-
6
4
  import { config } from '@things-factory/env'
7
5
  import { StoreAPI } from '@things-factory/integration-marketplace'
6
+
7
+ import { SHIPPING_TYPE } from '../../constants'
8
8
  import { SellercraftChannelIntegrationAPI } from '../../controllers/sellercraft-channel-integration-api'
9
+ import { MarketplaceChannel } from './marketplace-channel'
10
+ import { getShops } from '../../utils/tokencraft-util'
9
11
 
10
12
  @Resolver()
11
13
  export class MarketplaceChannelOrderMutation {
12
14
  @Mutation(returns => Boolean)
13
15
  async syncAllMarketplaceChannelOrders(
14
- @Arg('fromDate') fromDate: string,
15
- @Arg('toDate') toDate: string,
16
- @Ctx() context: any
16
+ @Ctx() context: any,
17
+ @Arg('fromCreatedDate', { nullable: true }) fromCreatedDate?: string,
18
+ @Arg('toCreatedDate', { nullable: true }) toCreatedDate?: string,
19
+ @Arg('fromUpdatedDate', { nullable: true }) fromUpdatedDate?: string,
20
+ @Arg('toUpdatedDate', { nullable: true }) toUpdatedDate?: string
17
21
  ): Promise<boolean> {
18
22
  const sellercraftChannelIntegrationConfig = config.get('sellercraftChannelIntegrationConfig', {})
19
- const { tokenCraftApiKey: apiKey, getShopsTokenCraftUrl } = sellercraftChannelIntegrationConfig
20
23
 
21
- const channels: MarketplaceChannel[] = await getRepository(MarketplaceChannel).find()
24
+ const channels: MarketplaceChannel[] = await getRepository(MarketplaceChannel).find({ where: { isActive: true } })
22
25
 
23
26
  for (var i = 0; i < channels.length; i++) {
24
- var channelsFullPath = getShopsTokenCraftUrl + '?channel_id=' + channels[i].channelId
25
- const channelResponse: any = await fetch(channelsFullPath, {
26
- method: 'get',
27
- headers: {
28
- 'Content-Type': 'application/json',
29
- 'x-api-key': apiKey
30
- }
31
- })
27
+ try {
28
+ const channel: MarketplaceChannel = channels[i]
29
+ let shops: any = await getShops(channel.channelId)
32
30
 
33
- if (!channelResponse.ok) {
34
- throw new Error(channelResponse)
35
- }
36
- var shopsResponse = await channelResponse.json()
37
- var shops = shopsResponse.shops
38
-
39
- for (var j = 0; j < shops.length; j++) {
40
- var store = {
41
- accessKey: shops[j].credential.consumer_key,
42
- accessSecret: shops[j].credential.consumer_secret,
43
- storeURL: shops[j].credential.store_url,
44
- platform: channels[i].name
45
- }
31
+ for (var j = 0; j < shops.length; j++) {
32
+ try {
33
+ var store = {
34
+ accessKey: shops[j]?.credential?.consumer_key || '',
35
+ accessSecret: shops[j]?.credential?.consumer_secret || '',
36
+ storeURL: shops[j]?.credential?.store_url || '',
37
+ platform: channel.name,
38
+ accessToken: shops[j]?.credential?.access_token, // Magento+, Tiktok
39
+ channelShopId: shops[j]?.channel_shop_id,
40
+ storeId: shops[j]?.credential?.store_url || ''
41
+ }
46
42
 
47
- // let countryCode = shops[j].country_code
48
- // let channelCode = shops[j].org_prefix
49
- let organisationId = shops[j].credential.account_id
50
- let channelShopId = shops[j].credential.channel_shop_id
43
+ // let countryCode = shops[j].country_code
44
+ // let channelCode = shops[j].org_prefix
45
+ let organisationId = shops[j].account_id
46
+ let channelShopId = shops[j].channel_shop_id
51
47
 
52
- const orderReq = {
53
- fromDate: fromDate,
54
- toDate: toDate
55
- }
56
- const orderResult = await StoreAPI.getStoreOrders(store, orderReq)
57
-
58
- var sellercraftStore = { ...store, platform: 'sellercraftChannelIntegration' }
59
-
60
- let mappedOrderResult = orderResult.results.map(order => {
61
- let {
62
- firstName: custFirstName,
63
- lastName: custLastName,
64
- orderCreatedAt: createdAt,
65
- orderUpdatedAt: updatedAt,
66
- orderNo: id,
67
- status
68
- } = order
69
-
70
- let {
71
- first_name: billFirstName,
72
- last_name: billLastName,
73
- address_1: billAddress1,
74
- address_2: billAddress2,
75
- address_3: billAddress3,
76
- address_4: billAddress4,
77
- address_5: billAddress5,
78
- city: billCity,
79
- postcode: billPostalCode,
80
- country: billCountry,
81
- phone: billPhone1,
82
- phone_2: billPhone2
83
- } = order.billing
84
-
85
- let {
86
- first_name: shipFirstName,
87
- last_name: shipLastName,
88
- address_1: shipAddress1,
89
- address_2: shipAddress2,
90
- address_3: shipAddress3,
91
- address_4: shipAddress4,
92
- address_5: shipAddress5,
93
- city: shipCity,
94
- postcode: shipPostalCode,
95
- country: shipCountry,
96
- phone: shipPhone1,
97
- phone_2: shipPhone2
98
- } = order.shipping
99
-
100
- let orderItems = order.orderItems.map(item => {
101
- let {
102
- name: id,
103
- variationId: variationId,
104
- slaExpiresAt,
105
- total,
106
- totalTax,
107
- subtotal,
108
- subtotalTax
109
- } = item
110
-
111
- return {
112
- id,
113
- variationId,
114
- currency: order.orderShipping.collectionCurrency,
115
- createdAt: order.orderCreatedAt,
116
- updatedAt: order.orderUpdatedAt,
117
- charges: [
118
- {
119
- name: 'PRICE_NORMAL_SELLING',
120
- grossAmount: total,
121
- nettAmount: subtotal
122
- },
123
- {
124
- name: 'TAXES',
125
- grossAmount: totalTax,
126
- nettAmount: subtotalTax
48
+ let orderResult = []
49
+ let page: number = store.platform == 'magento' ? 1 : 0
50
+ let hasMorePage: boolean = true
51
+ let lastOrderId: string
52
+ let cursor: string
53
+ var limit: number = 50
54
+
55
+ while (hasMorePage) {
56
+ const {
57
+ results: marketplaceOrders,
58
+ more,
59
+ nextCursor
60
+ } = await StoreAPI.getStoreOrders(store, {
61
+ fromCreatedDate,
62
+ toCreatedDate,
63
+ fromUpdatedDate,
64
+ toUpdatedDate,
65
+ pagination: { page, limit },
66
+ lastOrderId,
67
+ nextCursor: cursor
68
+ })
69
+
70
+ orderResult.push(...marketplaceOrders)
71
+
72
+ if (more) page++
73
+ hasMorePage = more
74
+ cursor = nextCursor
75
+ }
76
+
77
+ var sellercraftStore = { ...store, platform: 'sellercraftChannelIntegration' }
78
+
79
+ let mappedOrderResult = orderResult.map(order => {
80
+ let id = store.platform == 'magento' || store.platform == 'shopify' ? order.name : order.orderNo
81
+ let {
82
+ firstName: custFirstName,
83
+ lastName: custLastName,
84
+ orderCreatedAt: createdAt,
85
+ orderUpdatedAt: updatedAt,
86
+ status,
87
+ sellercraftStatus,
88
+ isSOF
89
+ } = order
90
+
91
+ let {
92
+ first_name: billFirstName,
93
+ last_name: billLastName,
94
+ address_1: billAddress1,
95
+ address_2: billAddress2,
96
+ address_3: billAddress3,
97
+ address_4: billAddress4,
98
+ address_5: billAddress5,
99
+ city: billCity,
100
+ postcode: billPostalCode,
101
+ country: billCountry,
102
+ phone: billPhone1,
103
+ phone_2: billPhone2
104
+ } = order?.billing
105
+
106
+ let {
107
+ first_name: shipFirstName,
108
+ last_name: shipLastName,
109
+ address_1: shipAddress1,
110
+ address_2: shipAddress2,
111
+ address_3: shipAddress3,
112
+ address_4: shipAddress4,
113
+ address_5: shipAddress5,
114
+ city: shipCity,
115
+ postcode: shipPostalCode,
116
+ country: shipCountry,
117
+ phone: shipPhone1,
118
+ phone_2: shipPhone2
119
+ } = order.shipping
120
+
121
+ let orderPackage = order?.orderPackage || {}
122
+
123
+ let orderItems = order.orderItems.map(item => {
124
+ let {
125
+ name: id,
126
+ variationId: variationId,
127
+ slaExpiresAt,
128
+ total,
129
+ totalTax,
130
+ subtotal,
131
+ subtotalTax,
132
+ qty
133
+ } = item
134
+
135
+ return {
136
+ id,
137
+ variationId,
138
+ currency: order.orderShipping.collectionCurrency,
139
+ createdAt: order.orderCreatedAt,
140
+ updatedAt: order.orderUpdatedAt,
141
+ charges: [
142
+ {
143
+ name: 'CHARGES_MARKETING',
144
+ grossAmount: 0,
145
+ nettAmount: 0
146
+ },
147
+ {
148
+ name: 'CLAIMS_DAMAGE',
149
+ grossAmount: 0,
150
+ nettAmount: 0
151
+ },
152
+ {
153
+ name: 'CLAIMS_LOST',
154
+ grossAmount: 0,
155
+ nettAmount: 0
156
+ },
157
+ {
158
+ name: 'COMMISSION_PLATFORM',
159
+ grossAmount: 0,
160
+ nettAmount: 0
161
+ },
162
+ {
163
+ name: 'DEPOSIT_PRESALE',
164
+ grossAmount: 0,
165
+ nettAmount: 0
166
+ },
167
+ {
168
+ name: 'FEE_MISCELLANEOUS',
169
+ grossAmount: 0,
170
+ nettAmount: 0
171
+ },
172
+ {
173
+ name: 'FEE_TRANSACTION',
174
+ grossAmount: 0,
175
+ nettAmount: 0
176
+ },
177
+ {
178
+ name: 'PRICE_NORMAL_SELLING',
179
+ grossAmount: total,
180
+ nettAmount: subtotal
181
+ },
182
+ {
183
+ name: 'PRICE_RECOMMENDED_RETAIL',
184
+ grossAmount: 0,
185
+ nettAmount: 0
186
+ },
187
+ {
188
+ name: 'PROMOTIONS_CUSTOMER_RECEIVED',
189
+ grossAmount: 0,
190
+ nettAmount: 0
191
+ },
192
+ {
193
+ name: 'PROMOTIONS_REBATE_PLATFORM',
194
+ grossAmount: 0,
195
+ nettAmount: 0
196
+ },
197
+ {
198
+ name: 'PROMOTIONS_REBATE_SELLER',
199
+ grossAmount: 0,
200
+ nettAmount: 0
201
+ },
202
+ {
203
+ name: 'REVERSAL_CHARGES_MARKETING',
204
+ grossAmount: 0,
205
+ nettAmount: 0
206
+ },
207
+ {
208
+ name: 'REVERSAL_COMMISSION',
209
+ grossAmount: 0,
210
+ nettAmount: 0
211
+ },
212
+ {
213
+ name: 'REVERSAL_FEE_MISCELLANEOUS',
214
+ grossAmount: 0,
215
+ nettAmount: 0
216
+ },
217
+ {
218
+ name: 'REVERSAL_PROMOTIONS_CUSTOMER_RECEIVED',
219
+ grossAmount: 0,
220
+ nettAmount: 0
221
+ },
222
+ {
223
+ name: 'REVERSAL_SELLER_RETURN_REFUND_AMOUNT',
224
+ grossAmount: 0,
225
+ nettAmount: 0
226
+ },
227
+ {
228
+ name: 'REVERSAL_SHIPPING_CUSTOMER_PAID',
229
+ grossAmount: 0,
230
+ nettAmount: 0
231
+ },
232
+ {
233
+ name: 'REVERSAL_SHIPPING_REBATE_PLATFORM',
234
+ grossAmount: 0,
235
+ nettAmount: 0
236
+ },
237
+ {
238
+ name: 'REVERSAL_SHIPPING_SELLER_PAID',
239
+ grossAmount: 0,
240
+ nettAmount: 0
241
+ },
242
+ {
243
+ name: 'SHIPPING_COST_TOTAL',
244
+ grossAmount: 0,
245
+ nettAmount: 0
246
+ },
247
+ {
248
+ name: 'SHIPPING_CUSTOMER_PAID',
249
+ grossAmount: 0,
250
+ nettAmount: 0
251
+ },
252
+ {
253
+ name: 'SHIPPING_REBATE_PLATFORM',
254
+ grossAmount: 0,
255
+ nettAmount: 0
256
+ },
257
+ {
258
+ name: 'SHIPPING_SELLER_PAID',
259
+ grossAmount: 0,
260
+ nettAmount: 0
261
+ },
262
+ {
263
+ name: 'TAXES',
264
+ grossAmount: totalTax,
265
+ nettAmount: subtotalTax
266
+ },
267
+ {
268
+ name: 'VOUCHERS_CUSTOMER_RECEIVED',
269
+ grossAmount: 0,
270
+ nettAmount: 0
271
+ },
272
+ {
273
+ name: 'VOUCHERS_REBATE_PLATFORM',
274
+ grossAmount: 0,
275
+ nettAmount: 0
276
+ },
277
+ {
278
+ name: 'VOUCHERS_REBATE_SELLER',
279
+ grossAmount: 0,
280
+ nettAmount: 0
281
+ }
282
+ ],
283
+ slaExpiresAt,
284
+ qty
285
+ }
286
+ })
287
+
288
+ let mappedOrderItems = []
289
+ orderItems.map(oi => {
290
+ for (let i = 0; i < oi.qty; i++) {
291
+ mappedOrderItems.push({
292
+ ...oi,
293
+ id: `${oi.id}-${i + 1}`
294
+ })
127
295
  }
128
- ],
129
- slaExpiresAt
296
+ })
297
+
298
+ return {
299
+ custFirstName,
300
+ custLastName,
301
+ createdAt,
302
+ updatedAt,
303
+ id,
304
+ billFirstName,
305
+ billLastName,
306
+ billAddress1: billAddress1.toString() || shipAddress1.toString(),
307
+ billAddress2: billAddress2 || shipAddress2,
308
+ billAddress3: billAddress3 || shipAddress3,
309
+ billAddress4: billAddress4 || shipAddress4,
310
+ billAddress5: billAddress5 || shipAddress5,
311
+ billCity: billCity || shipCity,
312
+ billPostalCode: billPostalCode || shipPostalCode,
313
+ billCountry: billCountry || shipCountry,
314
+ billPhone1: billPhone1 || shipPhone1,
315
+ billPhone2: billPhone2 || shipPhone2,
316
+ shipFirstName,
317
+ shipLastName,
318
+ shipAddress1: shipAddress1.toString(),
319
+ shipAddress2,
320
+ shipAddress3,
321
+ shipAddress4,
322
+ shipAddress5,
323
+ shipCity,
324
+ shipPostalCode,
325
+ shipCountry,
326
+ shipPhone1,
327
+ shipPhone2,
328
+ mappedOrderItems,
329
+ channelShopId,
330
+ organisationId,
331
+ status: sellercraftStatus || status,
332
+ isSOF: isSOF ? isSOF : false,
333
+ orderPackage,
334
+ charges: getOrderCharges(mappedOrderItems)
335
+ }
336
+ })
337
+
338
+ if (mappedOrderResult.length > 0) {
339
+ while (mappedOrderResult.length > 0) {
340
+ let spliceResult = mappedOrderResult.splice(
341
+ 0,
342
+ mappedOrderResult.length >= 20 ? 20 : mappedOrderResult.length
343
+ )
344
+
345
+ try {
346
+ await SellercraftChannelIntegrationAPI.ingestChannelOrder(sellercraftStore, {
347
+ orders: spliceResult
348
+ })
349
+ } catch (e) {}
350
+
351
+ await Promise.all(
352
+ spliceResult.map(async result => {
353
+ if (!result?.isSOF && result?.orderPackage?.packageId) {
354
+ let orderPackage: any = result.orderPackage
355
+ let newOrderPackage: any = {
356
+ channelShopId,
357
+ nativeOrderId: result.id,
358
+ nativePackageId: orderPackage.packageId,
359
+ shippingTrackingCode: orderPackage.trackingNumber,
360
+ shippingTypeValue: orderPackage?.shippingType
361
+ ? orderPackage.shippingType
362
+ : SHIPPING_TYPE.DROP_SHIPPING,
363
+ warehouseCode: SHIPPING_TYPE.DROP_SHIPPING,
364
+ shipper: {
365
+ name: orderPackage.shippingProvider,
366
+ isCodSupported: orderPackage?.isCodSupport ? orderPackage.isCodSupport : false
367
+ },
368
+ documents: orderPackage?.orderDocument || [],
369
+ shipperLastMile: {
370
+ name: orderPackage.shippingProvider,
371
+ isCodSupported: orderPackage?.isCodSupport ? orderPackage.isCodSupport : false
372
+ },
373
+ orderItemIds: orderPackage?.orderListIdList
374
+ ? orderPackage.orderListIdList
375
+ : result.mappedOrderItems.map(orderItem => orderItem.id)
376
+ }
377
+ try {
378
+ await SellercraftChannelIntegrationAPI.ingestChannelOrderPackage(
379
+ sellercraftStore,
380
+ newOrderPackage
381
+ )
382
+ } catch (e) {}
383
+ }
384
+ })
385
+ )
386
+ }
130
387
  }
131
- })
132
-
133
- return {
134
- custFirstName,
135
- custLastName,
136
- createdAt,
137
- updatedAt,
138
- id,
139
- billFirstName,
140
- billLastName,
141
- billAddress1,
142
- billAddress2,
143
- billAddress3,
144
- billAddress4,
145
- billAddress5,
146
- billCity,
147
- billPostalCode,
148
- billCountry,
149
- billPhone1,
150
- billPhone2,
151
- shipFirstName,
152
- shipLastName,
153
- shipAddress1,
154
- shipAddress2,
155
- shipAddress3,
156
- shipAddress4,
157
- shipAddress5,
158
- shipCity,
159
- shipPostalCode,
160
- shipCountry,
161
- shipPhone1,
162
- shipPhone2,
163
- orderItems,
164
- channelShopId,
165
- organisationId,
166
- status
167
- }
168
-
169
- })
170
-
171
- if (mappedOrderResult.length > 0) {
172
- const ingestOrder = await SellercraftChannelIntegrationAPI.ingestChannelOrder(
173
- sellercraftStore,
174
- { orders: mappedOrderResult }
175
- )
388
+ } catch (e) {}
176
389
  }
177
- }
390
+ } catch (e) {}
391
+ }
392
+ return true
393
+ }
394
+ }
395
+
396
+ function getOrderCharges(mappedOrderItems) {
397
+ let chargesList = []
178
398
 
179
- return true
399
+ for (let i = 0; i < mappedOrderItems.length; i++) {
400
+ for (let j = 0; j < mappedOrderItems[i].charges.length; j++) {
401
+ let charge = mappedOrderItems[i].charges[j]
402
+ let foundCharge = chargesList.find(cl => cl.name == charge.name)
403
+ if (foundCharge) {
404
+ foundCharge.grossAmount = parseFloat(foundCharge.grossAmount) + parseFloat(charge.grossAmount)
405
+ foundCharge.nettAmount = parseFloat(foundCharge.nettAmount) + parseFloat(charge.nettAmount)
406
+ chargesList = chargesList.filter(cl => cl.name != charge.name)
407
+ } else {
408
+ foundCharge = {
409
+ name: charge.name,
410
+ grossAmount: charge.grossAmount,
411
+ nettAmount: charge.nettAmount
412
+ }
413
+ }
414
+ chargesList.push(foundCharge)
180
415
  }
181
416
  }
417
+ return chargesList
182
418
  }