@things-factory/operato-hub 4.2.12 → 4.3.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 (44) hide show
  1. package/client/pages/constants/setting.js +1 -0
  2. package/dist-server/controllers/bizplace-initializer/dataset/codes.js +9 -0
  3. package/dist-server/controllers/bizplace-initializer/dataset/codes.js.map +1 -1
  4. package/dist-server/controllers/bizplace-initializer/dataset/settings.js +10 -0
  5. package/dist-server/controllers/bizplace-initializer/dataset/settings.js.map +1 -1
  6. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js +171 -0
  7. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js.map +1 -0
  8. package/dist-server/routers/api/restful-apis/unstable/add-marketplace-order.js +85 -75
  9. package/dist-server/routers/api/restful-apis/unstable/add-marketplace-order.js.map +1 -1
  10. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +147 -35
  11. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  12. package/dist-server/routers/api/restful-apis/unstable/index.js +1 -0
  13. package/dist-server/routers/api/restful-apis/unstable/index.js.map +1 -1
  14. package/dist-server/routers/api/restful-apis/v1/add-draft-release-order.js +171 -0
  15. package/dist-server/routers/api/restful-apis/v1/add-draft-release-order.js.map +1 -0
  16. package/dist-server/routers/api/restful-apis/v1/add-marketplace-order.js +85 -75
  17. package/dist-server/routers/api/restful-apis/v1/add-marketplace-order.js.map +1 -1
  18. package/dist-server/routers/api/restful-apis/v1/add-release-order.js +146 -34
  19. package/dist-server/routers/api/restful-apis/v1/add-release-order.js.map +1 -1
  20. package/dist-server/routers/api/restful-apis/v1/index.js +1 -0
  21. package/dist-server/routers/api/restful-apis/v1/index.js.map +1 -1
  22. package/dist-server/routers/api/restful-apis/v2/add-draft-release-order.js +171 -0
  23. package/dist-server/routers/api/restful-apis/v2/add-draft-release-order.js.map +1 -0
  24. package/dist-server/routers/api/restful-apis/v2/add-marketplace-order.js +85 -75
  25. package/dist-server/routers/api/restful-apis/v2/add-marketplace-order.js.map +1 -1
  26. package/dist-server/routers/api/restful-apis/v2/add-release-order.js +149 -34
  27. package/dist-server/routers/api/restful-apis/v2/add-release-order.js.map +1 -1
  28. package/dist-server/routers/api/restful-apis/v2/index.js +1 -0
  29. package/dist-server/routers/api/restful-apis/v2/index.js.map +1 -1
  30. package/package.json +44 -44
  31. package/server/controllers/bizplace-initializer/dataset/codes.ts +9 -0
  32. package/server/controllers/bizplace-initializer/dataset/settings.ts +10 -0
  33. package/server/routers/api/restful-apis/unstable/add-draft-release-order.ts +196 -0
  34. package/server/routers/api/restful-apis/unstable/add-marketplace-order.ts +97 -85
  35. package/server/routers/api/restful-apis/unstable/add-release-order.ts +211 -28
  36. package/server/routers/api/restful-apis/unstable/index.ts +1 -0
  37. package/server/routers/api/restful-apis/v1/add-draft-release-order.ts +196 -0
  38. package/server/routers/api/restful-apis/v1/add-marketplace-order.ts +97 -85
  39. package/server/routers/api/restful-apis/v1/add-release-order.ts +209 -26
  40. package/server/routers/api/restful-apis/v1/index.ts +1 -0
  41. package/server/routers/api/restful-apis/v2/add-draft-release-order.ts +196 -0
  42. package/server/routers/api/restful-apis/v2/add-marketplace-order.ts +97 -85
  43. package/server/routers/api/restful-apis/v2/add-release-order.ts +212 -26
  44. package/server/routers/api/restful-apis/v2/index.ts +1 -0
@@ -5,6 +5,8 @@
5
5
  import gql from 'graphql-tag'
6
6
 
7
7
  import { restfulApiRouter as router } from '@things-factory/api'
8
+ import { EntityManager, getConnection } from 'typeorm'
9
+ import { MarketplaceOrder } from '@things-factory/marketplace-base'
8
10
 
9
11
  import { businessMiddleware } from '../../../../middlewares/business-middleware'
10
12
  import { storeMiddleware } from '../../../../middlewares/store-middleware'
@@ -16,99 +18,109 @@ router.post(
16
18
  businessMiddleware,
17
19
  storeMiddleware,
18
20
  async (context, next) => {
19
- const { client, marketplaceStore, domain } = context.state
20
- const { t } = context
21
- const bodyReq = context.request.body
22
-
23
- if (typeof bodyReq === undefined || !Object.keys(bodyReq)?.length) {
24
- context.throw(400, t('error.invalid body request format'))
25
- }
26
-
27
- await checkMandatoryKey(context, bodyReq)
28
- debug('post:/add-marketplace-order body request', bodyReq)
29
-
30
- context.body = {
31
- result: (
32
- await client.mutate({
33
- mutation: gql`
34
- mutation generateMarketplaceOrder($marketplaceOrder: NewMarketplaceOrder!) {
35
- generateMarketplaceOrder(marketplaceOrder: $marketplaceOrder) {
36
- id
37
- orderNo
38
- currency
39
- itemCount
40
- totalAmount
41
- paymentMethod
42
- remark
43
- giftOption
44
- orderCreatedAt
45
- orderUpdatedAt
46
- marketplaceStore {
47
- storeId
48
- }
49
- marketplaceOrderItems {
21
+ return await getConnection().transaction(async (tx: EntityManager) => {
22
+ const { client, marketplaceStore, domain } = context.state
23
+ const { t } = context
24
+ const bodyReq = context.request.body
25
+
26
+ if (typeof bodyReq === undefined || !Object.keys(bodyReq)?.length) {
27
+ context.throw(400, t('error.invalid body request format'))
28
+ }
29
+
30
+ await checkMandatoryKey(context, bodyReq)
31
+ debug('post:/add-marketplace-order body request', bodyReq)
32
+
33
+ let existingMarketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
34
+ where: { name: bodyReq.name, domain, marketplaceStore }
35
+ })
36
+
37
+ if (existingMarketplaceOrder) {
38
+ context.throw(400, `error.duplicate entry for order ${bodyReq.name}`)
39
+ }
40
+
41
+ context.body = {
42
+ result: (
43
+ await client.mutate({
44
+ mutation: gql`
45
+ mutation generateMarketplaceOrder($marketplaceOrder: NewMarketplaceOrder!) {
46
+ generateMarketplaceOrder(marketplaceOrder: $marketplaceOrder) {
50
47
  id
51
- name
52
- qty
53
- cancelBy
54
- returnStatus
55
- paidPrice
56
- packageId
57
- invoiceNo
58
- status
59
- marketplaceOrderShippingItems {
60
- marketplaceOrderShipping {
61
- attentionTo
62
- address1
63
- address2
64
- address3
65
- address4
66
- address5
67
- state
68
- city
69
- postCode
70
- country
71
- phone1
72
- phone2
73
- email
74
- orderType
75
- freightType
76
- parcelType
77
- goodsType
78
- deliveryMethod
79
- totalWeight
80
- totalVolume
81
- transporter
82
- }
48
+ orderNo
49
+ currency
50
+ itemCount
51
+ totalAmount
52
+ paymentMethod
53
+ remark
54
+ giftOption
55
+ orderCreatedAt
56
+ orderUpdatedAt
57
+ marketplaceStore {
58
+ storeId
83
59
  }
84
- marketplaceProductVariation {
60
+ marketplaceOrderItems {
85
61
  id
86
- sku
87
- variationId
88
- variationSku
89
- channelSku
90
62
  name
91
- costPrice
92
- sellPrice
93
- marketplaceStatus
63
+ qty
64
+ cancelBy
65
+ returnStatus
66
+ paidPrice
67
+ packageId
68
+ invoiceNo
69
+ status
70
+ marketplaceOrderShippingItems {
71
+ marketplaceOrderShipping {
72
+ attentionTo
73
+ address1
74
+ address2
75
+ address3
76
+ address4
77
+ address5
78
+ state
79
+ city
80
+ postCode
81
+ country
82
+ phone1
83
+ phone2
84
+ email
85
+ orderType
86
+ freightType
87
+ parcelType
88
+ goodsType
89
+ deliveryMethod
90
+ totalWeight
91
+ totalVolume
92
+ transporter
93
+ }
94
+ }
95
+ marketplaceProductVariation {
96
+ id
97
+ sku
98
+ variationId
99
+ variationSku
100
+ channelSku
101
+ name
102
+ costPrice
103
+ sellPrice
104
+ marketplaceStatus
105
+ }
94
106
  }
95
107
  }
96
108
  }
109
+ `,
110
+ variables: { marketplaceOrder: bodyReq },
111
+ context: {
112
+ ...context,
113
+ state: {
114
+ ...context.state,
115
+ marketplaceStore,
116
+ domain,
117
+ type: 'api'
118
+ }
97
119
  }
98
- `,
99
- variables: { marketplaceOrder: bodyReq },
100
- context: {
101
- ...context,
102
- state: {
103
- ...context.state,
104
- marketplaceStore,
105
- domain,
106
- type: 'api'
107
- }
108
- }
109
- } as any)
110
- ).data
111
- }
120
+ } as any)
121
+ ).data
122
+ }
123
+ })
112
124
  }
113
125
  )
114
126
 
@@ -4,7 +4,7 @@ import { EntityManager, getConnection, SelectQueryBuilder } from 'typeorm'
4
4
  import { restfulApiRouter as router } from '@things-factory/api'
5
5
  import { Bizplace, getCompanyBizplace } from '@things-factory/biz-base'
6
6
  import { Product, ProductBundle, ProductDetail } from '@things-factory/product-base'
7
- import { ORDER_TYPES, OrderInventory } from '@things-factory/sales-base'
7
+ import { ORDER_TYPES, OrderInventory, OrderProduct } from '@things-factory/sales-base'
8
8
  import { Setting } from '@things-factory/setting-base'
9
9
  import { Inventory, INVENTORY_STATUS, LOCATION_TYPE } from '@things-factory/warehouse-base'
10
10
  import { WorksheetDetail } from '@things-factory/worksheet-base'
@@ -254,17 +254,37 @@ router.post(
254
254
 
255
255
  if (!response.errors) {
256
256
  const items = response.data.inventoriesByPallet.items || []
257
- if (!items?.length)
258
- context.throw(
259
- 404,
260
- t(
261
- `error.no inventories found for ${orderInventory.product?.sku} with batch ID ${orderInventory?.batchId}`
257
+ if (!items?.length) {
258
+ context.body = {
259
+ result: await createDraftOrder(
260
+ client,
261
+ customerBizplace,
262
+ bodyReq,
263
+ bundleInfo,
264
+ domain,
265
+ context,
266
+ orderInventories,
267
+ tx
262
268
  )
263
- )
269
+ }
270
+ return
271
+ }
264
272
 
265
- items.forEach(item => {
273
+ items.forEach(async item => {
266
274
  if (orderInventory.releaseQty > item.remainQty || orderInventory.releaseQty <= 0) {
267
- context.throw(404, t(`error.invalid release qty for ${orderInventory.product?.sku}`))
275
+ context.body = {
276
+ result: await createDraftOrder(
277
+ client,
278
+ customerBizplace,
279
+ bodyReq,
280
+ bundleInfo,
281
+ domain,
282
+ context,
283
+ orderInventories,
284
+ tx
285
+ )
286
+ }
287
+ return
268
288
  }
269
289
 
270
290
  // 3. add more information to orderInventory
@@ -277,7 +297,21 @@ router.post(
277
297
  })
278
298
 
279
299
  return orderInventory
280
- } else context.throw(404, t('error.failed to fetch inventory'))
300
+ } else {
301
+ context.body = {
302
+ result: await createDraftOrder(
303
+ client,
304
+ customerBizplace,
305
+ bodyReq,
306
+ bundleInfo,
307
+ domain,
308
+ context,
309
+ orderInventories,
310
+ tx
311
+ )
312
+ }
313
+ return
314
+ }
281
315
  })
282
316
  )
283
317
  } else {
@@ -362,8 +396,21 @@ router.post(
362
396
  }
363
397
 
364
398
  let inventories: Inventory[] = await qb.getMany()
365
- if (!inventories?.length) context.throw(404, t(`error.no inventories found for ${product.sku}`))
366
-
399
+ if (!inventories?.length) {
400
+ context.body = {
401
+ result: await createDraftOrder(
402
+ client,
403
+ customerBizplace,
404
+ bodyReq,
405
+ bundleInfo,
406
+ domain,
407
+ context,
408
+ orderInventories,
409
+ tx
410
+ )
411
+ }
412
+ return
413
+ }
367
414
  inventories = inventories
368
415
  .map(inventory => {
369
416
  return {
@@ -374,12 +421,24 @@ router.post(
374
421
  })
375
422
  .filter(inventory => inventory.remainQty > 0)
376
423
 
377
- const targetInventories: WorksheetDetail[] = _composeTargetInventories(
378
- context,
379
- product,
380
- orderInventory,
381
- inventories
382
- )
424
+ let targetInventories: WorksheetDetail[]
425
+ try {
426
+ targetInventories = _composeTargetInventories(context, product, orderInventory, inventories)
427
+ } catch (e) {
428
+ context.body = {
429
+ result: await createDraftOrder(
430
+ client,
431
+ customerBizplace,
432
+ bodyReq,
433
+ bundleInfo,
434
+ domain,
435
+ context,
436
+ orderInventories,
437
+ tx
438
+ )
439
+ }
440
+ return
441
+ }
383
442
  targetInventories.map(item => {
384
443
  finalOrderInventories.push(item.targetInventory)
385
444
  })
@@ -428,17 +487,37 @@ router.post(
428
487
 
429
488
  if (!response.errors) {
430
489
  const items = response.data.inventoryProductGroup.items || []
431
- if (!items?.length)
432
- context.throw(
433
- 404,
434
- t(
435
- `error.no inventories found for ${orderInventory.product?.sku} with batch ID ${orderInventory?.batchId}`
490
+ if (!items?.length) {
491
+ context.body = {
492
+ result: await createDraftOrder(
493
+ client,
494
+ customerBizplace,
495
+ bodyReq,
496
+ bundleInfo,
497
+ domain,
498
+ context,
499
+ orderInventories,
500
+ tx
436
501
  )
437
- )
502
+ }
503
+ return
504
+ }
438
505
 
439
- items.forEach(item => {
506
+ items.forEach(async item => {
440
507
  if (orderInventory.releaseQty > item.remainQty || orderInventory.releaseQty <= 0) {
441
- context.throw(404, t(`error.invalid release qty for ${orderInventory.product?.sku}`))
508
+ context.body = {
509
+ result: await createDraftOrder(
510
+ client,
511
+ customerBizplace,
512
+ bodyReq,
513
+ bundleInfo,
514
+ domain,
515
+ context,
516
+ orderInventories,
517
+ tx
518
+ )
519
+ }
520
+ return
442
521
  }
443
522
 
444
523
  // 3. add more information to orderInventory
@@ -452,7 +531,21 @@ router.post(
452
531
 
453
532
  delete orderInventory.uomValue
454
533
  finalOrderInventories.push(orderInventory)
455
- } else context.throw(404, t('error.failed to fetch inventory'))
534
+ } else {
535
+ context.body = {
536
+ result: await createDraftOrder(
537
+ client,
538
+ customerBizplace,
539
+ bodyReq,
540
+ bundleInfo,
541
+ domain,
542
+ context,
543
+ orderInventories,
544
+ tx
545
+ )
546
+ }
547
+ return
548
+ }
456
549
  }
457
550
  }
458
551
  }
@@ -660,7 +753,7 @@ export function _composeTargetInventories(context, product, record, inventories)
660
753
  })
661
754
 
662
755
  if (totalInventoryQty < record.releaseQty) {
663
- context.throw(404, t(`error.invalid release qty for ${product?.sku}`))
756
+ context.throw(404, t(`error.invalid release qty for ${product?.sku}`)) //
664
757
  }
665
758
 
666
759
  let targetInventories = []
@@ -726,3 +819,93 @@ function combineItems(inventoryList) {
726
819
 
727
820
  return mappedList
728
821
  }
822
+
823
+ async function createDraftOrder(client, customerBizplace, bodyReq, bundleInfo, domain, context, orderInventories, tx) {
824
+ return (
825
+ await client.mutate({
826
+ mutation: gql`
827
+ mutation upsertDraftReleaseGood(
828
+ $draftReleaseGood: DraftReleaseGoodPatch!
829
+ $orderProducts: [OrderProductPatch!]!
830
+ ) {
831
+ upsertDraftReleaseGood(draftReleaseGood: $draftReleaseGood, orderProducts: $orderProducts) {
832
+ id
833
+ name
834
+ refNo
835
+ refNo2
836
+ status
837
+ truckNo
838
+ ownTransport
839
+ marketplaceOrderStatus
840
+ billingAddress
841
+ deliveryAddress1
842
+ deliveryAddress2
843
+ deliveryAddress3
844
+ deliveryAddress4
845
+ deliveryAddress5
846
+ attentionTo
847
+ attentionCompany
848
+ city
849
+ state
850
+ postalCode
851
+ country
852
+ phone1
853
+ phone2
854
+ email
855
+ type
856
+ exportOption
857
+ releaseDate
858
+ collectionOrderNo
859
+ bizplace {
860
+ name
861
+ }
862
+ }
863
+ }
864
+ `,
865
+ variables: {
866
+ draftReleaseGood: {
867
+ bizplace: {
868
+ id: customerBizplace.id
869
+ },
870
+ courierOption: bodyReq.courierOption,
871
+ collectionOrderNo: bodyReq.collectionOrderNo,
872
+ exportOption: bodyReq.exportOption,
873
+ ownTransport: bodyReq.ownTransport,
874
+ packingOption: bodyReq.packingOption,
875
+ refNo: bodyReq.refNo,
876
+ refNo2: bodyReq?.refNo2,
877
+ releaseDate: bodyReq.releaseDate,
878
+ type: bodyReq.type,
879
+ marketplaceOrderStatus: bodyReq?.marketplaceOrderStatus,
880
+ remark: bodyReq?.remark || null,
881
+ billingAddress: bodyReq?.billTo?.billingAddress || null,
882
+ deliveryAddress1: bodyReq?.deliverTo?.deliveryAddress1 || null,
883
+ deliveryAddress2: bodyReq?.deliverTo?.deliveryAddress2 || null,
884
+ deliveryAddress3: bodyReq?.deliverTo?.deliveryAddress3 || null,
885
+ deliveryAddress4: bodyReq?.deliverTo?.deliveryAddress4 || null,
886
+ deliveryAddress5: bodyReq?.deliverTo?.deliveryAddress5 || null,
887
+ attentionTo: bodyReq?.deliverTo?.attentionTo || null,
888
+ attentionCompany: bodyReq?.deliverTo?.attentionCompany || null,
889
+ city: bodyReq?.deliverTo?.city || null,
890
+ state: bodyReq?.deliverTo?.state || null,
891
+ postalCode: bodyReq?.deliverTo?.postalCode || null,
892
+ country: bodyReq?.deliverTo?.country || null,
893
+ phone1: bodyReq?.deliverTo?.phone1 || null,
894
+ phone2: bodyReq?.deliverTo?.phone2 || null,
895
+ email: bodyReq?.deliverTo?.email || null
896
+ },
897
+ orderProducts: orderInventories
898
+ },
899
+ context: {
900
+ ...context,
901
+ hasUpload: true,
902
+ state: {
903
+ ...context.state,
904
+ customerBizplace,
905
+ domain,
906
+ type: 'api'
907
+ }
908
+ }
909
+ } as any)
910
+ ).data
911
+ }
@@ -2,6 +2,7 @@ import './add-contact-point'
2
2
  import './add-inbound-order'
3
3
  import './add-marketplace-order'
4
4
  import './add-products'
5
+ import './add-draft-release-order'
5
6
  import './add-release-order'
6
7
  import './add-sales-invoice'
7
8
  import './bizplace'