@things-factory/operato-hub 4.3.299 → 4.3.301

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 (46) hide show
  1. package/dist-server/graphql/resolvers/synchronization/powrup-get-tracking-no.js +2 -1
  2. package/dist-server/graphql/resolvers/synchronization/powrup-get-tracking-no.js.map +1 -1
  3. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +12 -8
  4. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  5. package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js +1 -0
  6. package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js.map +1 -1
  7. package/dist-server/routers/api/restful-apis/v1/utils/params.js +72 -3
  8. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -1
  9. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +15 -11
  10. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -1
  11. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js +313 -0
  12. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js.map +1 -0
  13. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +50 -3
  14. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -1
  15. package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js +65 -0
  16. package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js.map +1 -0
  17. package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js +101 -0
  18. package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js.map +1 -0
  19. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +3 -1
  20. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -1
  21. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +96 -3
  22. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -1
  23. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +12 -3
  24. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -1
  25. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +4 -0
  26. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -1
  27. package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js +96 -0
  28. package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js.map +1 -0
  29. package/openapi/unstable/outbound.yaml +8 -0
  30. package/openapi/v1/inbound.yaml +210 -0
  31. package/openapi/v1/outbound.yaml +812 -0
  32. package/package.json +17 -17
  33. package/server/graphql/resolvers/synchronization/powrup-get-tracking-no.ts +1 -0
  34. package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -0
  35. package/server/routers/api/restful-apis/unstable/get-release-order-list.ts +1 -0
  36. package/server/routers/api/restful-apis/v1/utils/params.ts +72 -3
  37. package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +5 -1
  38. package/server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.ts +356 -0
  39. package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +50 -3
  40. package/server/routers/api/restful-apis/v1/warehouse/get-do-document.ts +74 -0
  41. package/server/routers/api/restful-apis/v1/warehouse/get-grn-document.ts +116 -0
  42. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +3 -1
  43. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +102 -4
  44. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +12 -3
  45. package/server/routers/api/restful-apis/v1/warehouse/index.ts +4 -0
  46. package/server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.ts +109 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/operato-hub",
3
- "version": "4.3.299",
3
+ "version": "4.3.301",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -60,8 +60,8 @@
60
60
  "@things-factory/attachment-base": "^4.3.281",
61
61
  "@things-factory/auth-base": "^4.3.281",
62
62
  "@things-factory/auth-ui": "^4.3.281",
63
- "@things-factory/biz-base": "^4.3.281",
64
- "@things-factory/biz-ui": "^4.3.281",
63
+ "@things-factory/biz-base": "^4.3.301",
64
+ "@things-factory/biz-ui": "^4.3.301",
65
65
  "@things-factory/board-service": "^4.3.281",
66
66
  "@things-factory/board-ui": "^4.3.281",
67
67
  "@things-factory/code-ui": "^4.3.281",
@@ -77,22 +77,22 @@
77
77
  "@things-factory/i18n-base": "^4.3.281",
78
78
  "@things-factory/import-ui": "^4.3.281",
79
79
  "@things-factory/import-ui-excel": "^4.3.281",
80
- "@things-factory/integration-accounting": "^4.3.291",
81
- "@things-factory/integration-fulfillment": "^4.3.281",
82
- "@things-factory/integration-lmd": "^4.3.297",
83
- "@things-factory/integration-marketplace": "^4.3.297",
84
- "@things-factory/integration-pos": "^4.3.281",
85
- "@things-factory/integration-powrup": "^4.3.297",
86
- "@things-factory/integration-sellercraft": "^4.3.297",
87
- "@things-factory/integration-sftp": "^4.3.281",
80
+ "@things-factory/integration-accounting": "^4.3.301",
81
+ "@things-factory/integration-fulfillment": "^4.3.301",
82
+ "@things-factory/integration-lmd": "^4.3.301",
83
+ "@things-factory/integration-marketplace": "^4.3.301",
84
+ "@things-factory/integration-pos": "^4.3.301",
85
+ "@things-factory/integration-powrup": "^4.3.301",
86
+ "@things-factory/integration-sellercraft": "^4.3.301",
87
+ "@things-factory/integration-sftp": "^4.3.301",
88
88
  "@things-factory/lite-menu": "^4.3.281",
89
- "@things-factory/marketplace-base": "^4.3.297",
89
+ "@things-factory/marketplace-base": "^4.3.301",
90
90
  "@things-factory/more-ui": "^4.3.281",
91
91
  "@things-factory/notification": "^4.3.281",
92
92
  "@things-factory/pdf": "^4.3.281",
93
- "@things-factory/product-ui": "^4.3.291",
93
+ "@things-factory/product-ui": "^4.3.301",
94
94
  "@things-factory/resource-ui": "^4.3.281",
95
- "@things-factory/sales-base": "^4.3.297",
95
+ "@things-factory/sales-base": "^4.3.301",
96
96
  "@things-factory/scene-data-transform": "^4.3.281",
97
97
  "@things-factory/scene-excel": "^4.3.281",
98
98
  "@things-factory/scene-firebase": "^4.3.281",
@@ -107,8 +107,8 @@
107
107
  "@things-factory/setting-ui": "^4.3.281",
108
108
  "@things-factory/shell": "^4.3.281",
109
109
  "@things-factory/system-ui": "^4.3.281",
110
- "@things-factory/warehouse-base": "^4.3.297",
111
- "@things-factory/worksheet-base": "^4.3.297",
110
+ "@things-factory/warehouse-base": "^4.3.301",
111
+ "@things-factory/worksheet-base": "^4.3.301",
112
112
  "cron-parser": "^4.7.0",
113
113
  "koa2-swagger-ui": "^5.0.2",
114
114
  "swagger-jsdoc": "^5.0.0",
@@ -120,5 +120,5 @@
120
120
  "resolutions": {
121
121
  "core-js": "^3.16.0"
122
122
  },
123
- "gitHead": "8017573a5b68412ff07b56a782b357fede921bb3"
123
+ "gitHead": "649c7b97ee31690da25cca5afd11583eb2d8f605"
124
124
  }
@@ -29,6 +29,7 @@ export const powrupGetTrackingNoResolver = {
29
29
  })
30
30
  .andWhere(`opk.tracking_no IS NULL`)
31
31
  .andWhere(`opk.airway_bill NOTNULL`)
32
+ .limit(500)
32
33
 
33
34
  let orderPackagesWithoutTrackingNo: OrderPackage[] = await orderPackageQb.getMany()
34
35
 
@@ -111,6 +111,7 @@ router.post(
111
111
  attentionTo: bodyReq?.deliverTo?.attentionTo || null,
112
112
  attentionCompany: bodyReq?.deliverTo?.attentionCompany || null,
113
113
  city: bodyReq?.deliverTo?.city || null,
114
+ ward: bodyReq?.deliverTo?.ward || null,
114
115
  district: bodyReq?.deliverTo?.district || null,
115
116
  state: bodyReq?.deliverTo?.state || null,
116
117
  postalCode: bodyReq?.deliverTo?.postalCode || null,
@@ -249,6 +250,7 @@ router.post(
249
250
  attentionTo: result.attentionTo,
250
251
  attentionCompany: result.attentionCompany,
251
252
  city: result.city,
253
+ ward: result.ward,
252
254
  district: result.district,
253
255
  state: result.state,
254
256
  postalCode: result.postalCode,
@@ -322,6 +324,7 @@ router.post(
322
324
  attentionTo: result.attentionTo,
323
325
  attentionCompany: result.attentionCompany,
324
326
  city: result.city,
327
+ ward: result.ward,
325
328
  district: result.district,
326
329
  state: result.state,
327
330
  postalCode: result.postalCode,
@@ -567,6 +570,7 @@ async function createReleaseGood(
567
570
  attentionTo: releaseGood?.attentionTo || null,
568
571
  attentionCompany: releaseGood?.attentionCompany || null,
569
572
  city: releaseGood?.city || null,
573
+ ward: releaseGood?.ward || null,
570
574
  district: releaseGood?.district || null,
571
575
  state: releaseGood?.state || null,
572
576
  postalCode: releaseGood?.postalCode || null,
@@ -108,6 +108,7 @@ router.get(
108
108
  attentionTo
109
109
  attentionCompany
110
110
  city
111
+ ward
111
112
  district
112
113
  state
113
114
  postalCode
@@ -1,6 +1,7 @@
1
1
  const limitOffset = ['limit', 'offset']
2
2
  const fromToDate = ['fromDate', 'toDate']
3
3
 
4
+ // Params
4
5
  export const params = {
5
6
  'get-bizplace-list': [...limitOffset],
6
7
  'get-contact-point-list': ['bizplaceId', 'companyName', 'email', ...limitOffset],
@@ -21,7 +22,7 @@ export const params = {
21
22
  'get-goods-received-note-list': ['bizplaceId', ...fromToDate, ...limitOffset],
22
23
  'get-release-order-list': ['bizplaceId', 'roNo', 'status', ...fromToDate, ...limitOffset],
23
24
  'get-release-order-details': ['bizplaceId', 'roNo'],
24
- 'get-delivery-order-list': ['bizplaceId', ...fromToDate, ...limitOffset],
25
+ 'get-delivery-order-list': ['bizplaceId', 'doNo', 'vehicleNo', ...fromToDate, ...limitOffset],
25
26
  'get-onhand-inventory-list': ['bizplaceId', 'sku', 'batchId', ...fromToDate, ...limitOffset],
26
27
  'get-inventory-product-group-list': ['bizplaceId', 'sku', 'batchId', ...fromToDate, ...limitOffset],
27
28
  'add-contact-points': [
@@ -302,6 +303,7 @@ export const params = {
302
303
  'deliverTo.deliveryAddress5',
303
304
  'deliverTo.attentionTo',
304
305
  'deliverTo.city',
306
+ 'deliverTo.ward',
305
307
  'deliverTo.district',
306
308
  'deliverTo.postalCode',
307
309
  'deliverTo.country',
@@ -356,6 +358,7 @@ export const params = {
356
358
  'releaseGood.deliveryAddress1',
357
359
  'releaseGood.attentionTo',
358
360
  'releaseGood.city',
361
+ 'releaseGood.ward',
359
362
  'releaseGood.district',
360
363
  'releaseGood.country',
361
364
  'releaseGood.postalCode',
@@ -374,9 +377,54 @@ export const params = {
374
377
  'shippingOrder.containerLeavingDate'
375
378
  ],
376
379
  'update-marketplace-shipping-order': ['storeId', 'orderNo', 'transporter', 'airwayBill', 'trackingNo'],
377
- 'get-draft-order-list': ['bizplaceId', 'draftOrderNo', ...fromToDate, ...limitOffset]
380
+ 'get-grn-document': ['fileType', 'bizplaceId', 'grnNo', 'timezoneOffSet'],
381
+ 'get-draft-order-list': ['bizplaceId', 'draftOrderNo', ...fromToDate, ...limitOffset],
382
+ 'get-do-document': ['bizplaceId', 'doNo', 'fileType'],
383
+ 'dispatch-delivery-order': [
384
+ 'coNo',
385
+ 'contactPoint',
386
+ 'deliveryDate',
387
+ 'exportOption',
388
+ 'name',
389
+ 'otherDriver',
390
+ 'otherTruck',
391
+ 'bizplaceId',
392
+ 'remark',
393
+ 'totalPalletQty',
394
+ 'transportType',
395
+ 'transportDriver',
396
+ 'transportDriver.id',
397
+ 'transportDriver.driverCode',
398
+ 'transportDriver.name',
399
+ 'transportVehicle',
400
+ 'transportVehicle.id',
401
+ 'transportVehicle.name',
402
+ 'attentionCompany',
403
+ 'attentionTo',
404
+ 'billingAddress',
405
+ 'billingCity',
406
+ 'billingCountry',
407
+ 'billingPostalCode',
408
+ 'billingState',
409
+ 'city',
410
+ 'country',
411
+ 'deliveryAddress1',
412
+ 'phone1',
413
+ 'postalCode',
414
+ 'state',
415
+ 'orderInventories',
416
+ 'orderInventories.id',
417
+ 'orderInventories.remark',
418
+ 'shippingOrder ',
419
+ 'shippingOrder.containerArrivalDate',
420
+ 'shippingOrder.containerLeavingDate',
421
+ 'shippingOrder.containerNo',
422
+ 'shippingOrder.shipName'
423
+ ],
424
+ 'update-gan-to-arrived': ['ganNo', 'bizplaceId']
378
425
  }
379
426
 
427
+ // Required Params
380
428
  export const reqParams = {
381
429
  'get-contact-point-list': ['bizplaceId'],
382
430
  'get-product-list': ['bizplaceId'],
@@ -735,9 +783,29 @@ export const reqParams = {
735
783
  { name: 'airwayBill', required: true, type: 'field' },
736
784
  { name: 'trackingNo', required: true, type: 'field' }
737
785
  ],
738
- 'get-draft-order-list': ['bizplaceId']
786
+ 'get-grn-document': ['fileType', 'bizplaceId', 'grnNo'],
787
+ 'get-draft-order-list': ['bizplaceId'],
788
+ 'get-do-document': ['bizplaceId', 'doNo', 'fileType'],
789
+ 'dispatch-delivery-order': [
790
+ { name: 'name', required: true, type: 'field' },
791
+ { name: 'deliveryDate', required: true, type: 'field' },
792
+ {
793
+ name: 'bizplaceId',
794
+ required: true,
795
+ type: 'field'
796
+ }
797
+ ],
798
+ 'update-gan-to-arrived': [
799
+ { name: 'ganNo', required: true, type: 'field' },
800
+ {
801
+ name: 'bizplaceId',
802
+ required: true,
803
+ type: 'field'
804
+ }
805
+ ]
739
806
  }
740
807
 
808
+ // Require Offset
741
809
  export const requireLimitOffsetValidation = [
742
810
  'get-release-order-list',
743
811
  'get-onhand-inventory-list',
@@ -754,6 +822,7 @@ export const requireLimitOffsetValidation = [
754
822
  'get-draft-order-list'
755
823
  ]
756
824
 
825
+ // Require fromDate and toDate
757
826
  export const requireFromToDateValidation = [
758
827
  'get-release-order-list',
759
828
  'get-onhand-inventory-list',
@@ -116,6 +116,7 @@ router.post(
116
116
  attentionTo: bodyReq?.deliverTo?.attentionTo || null,
117
117
  attentionCompany: bodyReq?.deliverTo?.attentionCompany || null,
118
118
  city: bodyReq?.deliverTo?.city || null,
119
+ ward: bodyReq?.deliverTo?.ward,
119
120
  district: bodyReq?.deliverTo?.district,
120
121
  state: bodyReq?.deliverTo?.state || null,
121
122
  postalCode: bodyReq?.deliverTo?.postalCode || null,
@@ -244,6 +245,7 @@ router.post(
244
245
  attentionTo: result.attentionTo,
245
246
  attentionCompany: result.attentionCompany,
246
247
  city: result.city,
248
+ ward: result.ward,
247
249
  district: result.district,
248
250
  state: result.state,
249
251
  postalCode: result.postalCode,
@@ -300,6 +302,7 @@ router.post(
300
302
  attentionTo: result.attentionTo,
301
303
  attentionCompany: result.attentionCompany,
302
304
  city: result.city,
305
+ ward: result.ward,
303
306
  district: result.district,
304
307
  state: result.state,
305
308
  postalCode: result.postalCode,
@@ -491,7 +494,8 @@ async function createReleaseGood(
491
494
  attentionTo: releaseGood?.attentionTo || null,
492
495
  attentionCompany: releaseGood?.attentionCompany || null,
493
496
  city: releaseGood?.city || null,
494
- district: releaseGood?.district || null,
497
+ ward: releaseGood?.ward || null,
498
+ district: releaseGood?.district|| null,
495
499
  state: releaseGood?.state || null,
496
500
  postalCode: releaseGood?.postalCode || null,
497
501
  country: deliveryCountry?.description || releaseGood?.country || null,
@@ -0,0 +1,356 @@
1
+ import { getConnection, EntityManager, In, Brackets } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { DeliveryOrder, ShippingOrder, OrderNoGenerator, ReleaseGood, OrderInventory } from '@things-factory/sales-base'
5
+ import { TransportDriver, TransportVehicle } from '@things-factory/transport-base'
6
+ import { ContactPoint } from '@things-factory/biz-base'
7
+
8
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
9
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
10
+
11
+ router.post(
12
+ '/v1/warehouse/dispatch-delivery-order',
13
+ businessMiddleware,
14
+ validationMiddleware,
15
+ loggingMiddleware,
16
+ async (context, next) => {
17
+ try {
18
+ const { domain, user } = context.state
19
+ await getConnection().transaction(async (tx: EntityManager) => {
20
+ const foundDeliveryOrder: DeliveryOrder = await tx.getRepository(DeliveryOrder).findOne({
21
+ where: {
22
+ domain: domain,
23
+ name: context.request.body.data.name,
24
+ bizplace: context.request.body.data.bizplaceId
25
+ },
26
+ relations: ['releaseGood']
27
+ })
28
+
29
+ let transportDriver: TransportDriver = {}
30
+ let transportVehicle: TransportVehicle = {}
31
+ const data = context.request.body.data
32
+ const shippingOrder = context.request.body.shippingOrder
33
+
34
+ // throw and error if not found DO
35
+
36
+ // throw and error id do status is not in READY_TO_DISPATCH
37
+ if (foundDeliveryOrder.status !== 'READY_TO_DISPATCH') {
38
+ throw new ApiError('E04', `delivery order status is ${foundDeliveryOrder.status} `)
39
+ }
40
+ // throw error for RO status not in LOADING or DONE
41
+ if (foundDeliveryOrder.releaseGood.status !== 'LOADING' && foundDeliveryOrder.releaseGood.status !== 'DONE') {
42
+ throw new ApiError('E04', `release goods status is ${foundDeliveryOrder.releaseGood.status} `)
43
+ }
44
+
45
+ // throw an error is totalPalletQty is not a number
46
+ if (data.totalPalletQty) {
47
+ const parsedPalletQty = parseInt(data.totalPalletQty)
48
+ if (isNaN(parsedPalletQty)) {
49
+ throw new ApiError('E02', `totalPalletQty is not an integer`)
50
+ } else {
51
+ data.totalPalletQty = parsedPalletQty
52
+ }
53
+ }
54
+
55
+ // Drive and Vehicle Validation
56
+ if (
57
+ !data.transportDriver?.name ||
58
+ !data.transportDriver ||
59
+ (!data.transportDriver?.driverCode && data.transportType?.toUpperCase() === 'WAREHOUSE TRANSPORT')
60
+ ) {
61
+ throw new ApiError('E03', 'transportDriver')
62
+ } else if (!data.transportVehicle?.name || !data.transportVehicle) {
63
+ throw new ApiError('E03', 'transportVehicle')
64
+ }
65
+
66
+ if (data.transportType?.toUpperCase() === 'WAREHOUSE TRANSPORT') {
67
+ // find transportDriver & transportVehicle
68
+ const foundTransportDriver: TransportDriver = await tx.getRepository(TransportDriver).findOne({
69
+ where: {
70
+ domain: domain,
71
+ name: data.transportDriver?.name,
72
+ driverCode: data.transportDriver?.driverCode
73
+ }
74
+ })
75
+
76
+ const foundTransporVehicle: TransportVehicle = await tx.getRepository(TransportVehicle).findOne({
77
+ where: { domain: domain, name: data.transportVehicle?.name }
78
+ })
79
+
80
+ // validation for transportDriver & transportVehicle
81
+ if (!foundTransportDriver) {
82
+ throw new ApiError(
83
+ 'E04',
84
+ `transportDriver: { name: ${data.transportDriver?.name}, driverCode: ${data.transportDriver?.driverCode}}`
85
+ )
86
+ } else if (!foundTransporVehicle) {
87
+ throw new ApiError('E04', `transportVehicle: { name: ${data.transportVehicle?.name} }`)
88
+ } else {
89
+ transportDriver = foundTransportDriver
90
+
91
+ await tx
92
+ .getRepository(TransportVehicle)
93
+ .update({ id: foundTransporVehicle.id }, { status: 'IN_USE', updater: user })
94
+
95
+ transportVehicle = foundTransporVehicle
96
+ }
97
+ } else if (data.transportType?.toUpperCase() === 'OWN TRANSPORT') {
98
+ transportDriver = { name: data.transportDriver?.name }
99
+ transportVehicle = { name: data.transportVehicle?.name }
100
+ }
101
+
102
+ if (data.exportOption) {
103
+ // if exportOption is true,
104
+ // update or create shipping order if exportOption is set to true
105
+ if (!shippingOrder?.containerNo) {
106
+ throw new ApiError('E03', 'containerNo')
107
+ }
108
+
109
+ // shippingOrderId is present in RG
110
+ if (foundDeliveryOrder.releaseGood.shippingOrderId) {
111
+ const foundShippingOrder: ShippingOrder = await tx.getRepository(ShippingOrder).findOne({
112
+ where: { domain: domain, id: foundDeliveryOrder.releaseGood.shippingOrderId }
113
+ })
114
+
115
+ await tx.getRepository(ShippingOrder).update(
116
+ {
117
+ domain: domain,
118
+ id: foundDeliveryOrder.releaseGood.shippingOrderId
119
+ },
120
+ {
121
+ containerNo: shippingOrder.containerNo,
122
+ shipName: shippingOrder.shipName ? shippingOrder.shipName : foundShippingOrder.shipName,
123
+ containerArrivalDate: shippingOrder.containerArrivalDate
124
+ ? shippingOrder.containerArrivalDate
125
+ : foundShippingOrder.containerArrivalDate,
126
+ containerLeavingDate: shippingOrder.containerLeavingDate
127
+ ? shippingOrder.containerLeavingDate
128
+ : foundShippingOrder.containerLeavingDate,
129
+ updatedAt: new Date(),
130
+ updater: user
131
+ }
132
+ )
133
+ } else {
134
+ const newShippingOrder: ShippingOrder = {
135
+ name: OrderNoGenerator.shippingOrder(),
136
+ status: 'PENDING',
137
+ ...shippingOrder,
138
+ createdAt: new Date(),
139
+ updatedAt: new Date(),
140
+ bizplace: data.bizplaceId,
141
+ creator: user,
142
+ updater: user,
143
+ domain: domain
144
+ }
145
+ const result = await tx.getRepository(ShippingOrder).insert({ ...newShippingOrder })
146
+ }
147
+ }
148
+ // update DeliveryOrder - setCollection
149
+ await tx.getRepository(DeliveryOrder).update(
150
+ { id: foundDeliveryOrder.id },
151
+ {
152
+ status: 'DELIVERING',
153
+ deliveryDate: data?.deliveryDate,
154
+ otherDriver: data.transportType?.toUpperCase() === 'OWN TRANSPORT' ? transportDriver.name : null,
155
+ truckNo: transportVehicle.name,
156
+ remark: data.remark || null,
157
+ palletQty: data.totalPalletQty || null,
158
+ transportDriver: data.transportType?.toUpperCase() === 'OWN TRANSPORT' ? null : transportDriver.id,
159
+ transportVehicle: data.transportType?.toUpperCase() === 'OWN TRANSPORT' ? null : transportVehicle.id,
160
+ updatedAt: new Date(),
161
+ updater: user,
162
+ // shipment Info
163
+ city: data.city,
164
+ country: data.country,
165
+ deliveryAddress1: data.deliveryAddress1,
166
+ phone1: data.phone1,
167
+ postalCode: data.postalCode,
168
+ state: data.state,
169
+ attentionCompany: data.attentionCompany || null,
170
+ attentionTo: data.attentionTo || null,
171
+ billingAddress: data.billingAddress || null,
172
+ billingCity: data.billingCity || null,
173
+ billingCountry: data.billingCountry || null,
174
+ billingPostalCode: data.billingPostalCode || null,
175
+ billingState: data.billingState || null
176
+ }
177
+ )
178
+
179
+ // update OrderInventories remark
180
+
181
+ const foundOIs: OrderInventory[] = await tx.getRepository(OrderInventory).find({
182
+ where: {
183
+ id: In(data.orderInventories.map(oi => oi.id)),
184
+ domain: domain,
185
+ releaseGood: foundDeliveryOrder.releaseGood.id
186
+ }
187
+ })
188
+ if (foundOIs.length > 0) {
189
+ await Promise.all(
190
+ foundOIs.map(async orderInventory => {
191
+ await tx.getRepository(OrderInventory).update(
192
+ { id: orderInventory.id },
193
+ {
194
+ remark: data.orderInventories.find(dOi => dOi.id === orderInventory.id)?.remark,
195
+ updater: user,
196
+ updatedAt: new Date()
197
+ }
198
+ )
199
+ })
200
+ )
201
+ } else {
202
+ throw new ApiError('E04', `Unable to find orderInventory`)
203
+ }
204
+
205
+ // update release Good
206
+ await tx.getRepository(ReleaseGood).update(
207
+ { id: foundDeliveryOrder.releaseGood.id },
208
+ {
209
+ exportOption: shippingOrder?.containerNo ? true : false,
210
+ collectionOrderNo: data.transportType?.toUpperCase() === 'OWN TRANSPORT' && data.coNo ? data?.coNo : null
211
+ }
212
+ )
213
+
214
+ const dispatchedDeliveryOrder: DeliveryOrder = await tx.getRepository(DeliveryOrder).findOne({
215
+ where: {
216
+ domain: domain,
217
+ name: context.request.body.data.name,
218
+ bizplace: context.request.body.data.bizplaceId
219
+ },
220
+ relations: [
221
+ 'releaseGood',
222
+ 'releaseGood.shippingOrder',
223
+ 'bizplace',
224
+ 'domain',
225
+ 'transportDriver',
226
+ 'transportVehicle'
227
+ ]
228
+ })
229
+
230
+ const allOrderInventories: OrderInventory[] = await tx
231
+ .getRepository(OrderInventory)
232
+ .find({ where: { deliveryOrder: dispatchedDeliveryOrder.id } })
233
+
234
+ context.body = {
235
+ data: {
236
+ id: dispatchedDeliveryOrder.id,
237
+ doNo: dispatchedDeliveryOrder.name,
238
+ from: dispatchedDeliveryOrder.from,
239
+ to: dispatchedDeliveryOrder.to,
240
+ contactPointRefId: dispatchedDeliveryOrder.contactPointRefId,
241
+ truckNo: dispatchedDeliveryOrder.truckNo,
242
+ transportDriver: dispatchedDeliveryOrder.transportDriver
243
+ ? {
244
+ id: dispatchedDeliveryOrder.transportDriver.id,
245
+ name: dispatchedDeliveryOrder.transportDriver.name,
246
+ driverCode: dispatchedDeliveryOrder.transportDriver.driverCode
247
+ }
248
+ : null,
249
+ transportVehicle: dispatchedDeliveryOrder.transportVehicle
250
+ ? {
251
+ id: dispatchedDeliveryOrder.transportVehicle.id,
252
+ name: dispatchedDeliveryOrder.transportVehicle.name
253
+ }
254
+ : null,
255
+ otherDriver: dispatchedDeliveryOrder.otherDriver,
256
+ deliveryDate: dispatchedDeliveryOrder.deliveryDate,
257
+ status: dispatchedDeliveryOrder.status,
258
+ ownCollection: dispatchedDeliveryOrder.ownCollection,
259
+ looseItem: dispatchedDeliveryOrder.looseItem,
260
+ deliveryDateTime: dispatchedDeliveryOrder.deliveryDateTime,
261
+ loadWeight: dispatchedDeliveryOrder.loadWeight,
262
+ cargoType: dispatchedDeliveryOrder.cargoType,
263
+ urgency: dispatchedDeliveryOrder.urgency,
264
+ telNo: dispatchedDeliveryOrder.telNo,
265
+ refNo: dispatchedDeliveryOrder.refNo,
266
+ palletQty: dispatchedDeliveryOrder.palletQty,
267
+ remark: dispatchedDeliveryOrder.remark,
268
+ description: dispatchedDeliveryOrder.description,
269
+ reusablePallet: dispatchedDeliveryOrder.reusablePallet,
270
+ attentionTo: dispatchedDeliveryOrder.attentionTo,
271
+ attentionCompany: dispatchedDeliveryOrder.attentionCompany,
272
+ //shipmentInformation
273
+ city: dispatchedDeliveryOrder.city,
274
+ country: dispatchedDeliveryOrder.country,
275
+ deliveryAddress1: dispatchedDeliveryOrder.deliveryAddress1,
276
+ phone1: dispatchedDeliveryOrder.phone1,
277
+ postalCode: dispatchedDeliveryOrder.postalCode,
278
+ state: dispatchedDeliveryOrder.state,
279
+ billingAddress: dispatchedDeliveryOrder.billingAddress,
280
+ billingCity: dispatchedDeliveryOrder.billingCity,
281
+ billingCountry: dispatchedDeliveryOrder.billingCountry,
282
+ billingPostalCode: dispatchedDeliveryOrder.billingPostalCode,
283
+ billingState: dispatchedDeliveryOrder.billingState,
284
+ bizplace: {
285
+ id: dispatchedDeliveryOrder.bizplace.id,
286
+ name: dispatchedDeliveryOrder.bizplace.name,
287
+ description: dispatchedDeliveryOrder.bizplace.description
288
+ },
289
+ domain: {
290
+ id: dispatchedDeliveryOrder.domain.id,
291
+ name: dispatchedDeliveryOrder.domain.name
292
+ },
293
+ releaseGood: {
294
+ id: dispatchedDeliveryOrder.releaseGood.id,
295
+ roNo: dispatchedDeliveryOrder.releaseGood.name,
296
+ description: dispatchedDeliveryOrder.releaseGood.description,
297
+ status: dispatchedDeliveryOrder.releaseGood.status,
298
+ refNo: dispatchedDeliveryOrder.releaseGood.refNo,
299
+ refNo2: dispatchedDeliveryOrder.releaseGood.refNo2,
300
+ refNo3: dispatchedDeliveryOrder.releaseGood.refNo3,
301
+ truckNo: dispatchedDeliveryOrder.releaseGood.truckNo,
302
+ exportOption: dispatchedDeliveryOrder.releaseGood.exportOption,
303
+ ownTransport: dispatchedDeliveryOrder.releaseGood.ownTransport,
304
+ crossDocking: dispatchedDeliveryOrder.releaseGood.crossDocking,
305
+ releaseDateTime: dispatchedDeliveryOrder.releaseGood.releaseDateTime,
306
+ releaseDate: dispatchedDeliveryOrder.releaseGood.releaseDate,
307
+ remark: dispatchedDeliveryOrder.releaseGood.remark,
308
+ courierOption: dispatchedDeliveryOrder.releaseGood.courierOption,
309
+ packingOption: dispatchedDeliveryOrder.releaseGood.packingOption,
310
+ type: dispatchedDeliveryOrder.releaseGood.type,
311
+ acceptedAt: dispatchedDeliveryOrder.releaseGood.acceptedAt,
312
+ marketplaceOrderStatus: dispatchedDeliveryOrder.releaseGood.marketplaceOrderStatus,
313
+ billingAddress: dispatchedDeliveryOrder.releaseGood.billingAddress,
314
+ deliveryAddress1: dispatchedDeliveryOrder.releaseGood.deliveryAddress1,
315
+ deliveryAddress2: dispatchedDeliveryOrder.releaseGood.deliveryAddress2,
316
+ deliveryAddress3: dispatchedDeliveryOrder.releaseGood.deliveryAddress3,
317
+ deliveryAddress4: dispatchedDeliveryOrder.releaseGood.deliveryAddress4,
318
+ deliveryAddress5: dispatchedDeliveryOrder.releaseGood.deliveryAddress5,
319
+ attentionTo: dispatchedDeliveryOrder.releaseGood.attentionTo,
320
+ attentionCompany: dispatchedDeliveryOrder.releaseGood.attentionCompany,
321
+ city: dispatchedDeliveryOrder.releaseGood.city,
322
+ state: dispatchedDeliveryOrder.releaseGood.state,
323
+ postalCode: dispatchedDeliveryOrder.releaseGood.postalCode,
324
+ country: dispatchedDeliveryOrder.releaseGood.country,
325
+ phone1: dispatchedDeliveryOrder.releaseGood.phone1,
326
+ phone2: dispatchedDeliveryOrder.releaseGood.phone2,
327
+ email: dispatchedDeliveryOrder.releaseGood.email,
328
+ transporter: dispatchedDeliveryOrder.releaseGood.transporter,
329
+ trackingNo: dispatchedDeliveryOrder.releaseGood.trackingNo,
330
+ airwayBill: dispatchedDeliveryOrder.releaseGood.airwayBill,
331
+ invoice: dispatchedDeliveryOrder.releaseGood.invoice,
332
+ pickupAddress: dispatchedDeliveryOrder.releaseGood.pickupAddress,
333
+ pickupTime: dispatchedDeliveryOrder.releaseGood.pickupTime,
334
+ handoverType: dispatchedDeliveryOrder.releaseGood.handoverType,
335
+ dropoffAddress: dispatchedDeliveryOrder.releaseGood.dropoffAddress,
336
+ noOfItems: dispatchedDeliveryOrder.releaseGood.noOfItems,
337
+ orderProducts: [],
338
+ shippingOrder: dispatchedDeliveryOrder.releaseGood.shippingOrder
339
+ ? {
340
+ containerArrivalDate: dispatchedDeliveryOrder.releaseGood.shippingOrder.containerArrivalDate,
341
+ containerLeavingDate: dispatchedDeliveryOrder.releaseGood.shippingOrder.containerLeavingDate,
342
+ containerNo: dispatchedDeliveryOrder.releaseGood.shippingOrder.containerNo,
343
+ shipName: dispatchedDeliveryOrder.releaseGood.shippingOrder.shipName
344
+ }
345
+ : null
346
+ },
347
+ orderInventories: { ...allOrderInventories }
348
+ }
349
+ }
350
+ })
351
+ } catch (e) {
352
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
353
+ else throwInternalServerError(context, e)
354
+ }
355
+ }
356
+ )