@things-factory/operato-hub 4.3.300 → 4.3.302

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 (43) hide show
  1. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +12 -8
  2. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  3. package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js +1 -0
  4. package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js.map +1 -1
  5. package/dist-server/routers/api/restful-apis/v1/utils/params.js +72 -3
  6. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -1
  7. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +15 -11
  8. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -1
  9. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js +313 -0
  10. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js.map +1 -0
  11. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +50 -3
  12. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -1
  13. package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js +65 -0
  14. package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js.map +1 -0
  15. package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js +101 -0
  16. package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js.map +1 -0
  17. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +3 -1
  18. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -1
  19. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +96 -3
  20. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -1
  21. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +12 -3
  22. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -1
  23. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +4 -0
  24. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -1
  25. package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js +96 -0
  26. package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js.map +1 -0
  27. package/openapi/unstable/outbound.yaml +8 -0
  28. package/openapi/v1/inbound.yaml +210 -0
  29. package/openapi/v1/outbound.yaml +812 -0
  30. package/package.json +17 -17
  31. package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -0
  32. package/server/routers/api/restful-apis/unstable/get-release-order-list.ts +1 -0
  33. package/server/routers/api/restful-apis/v1/utils/params.ts +72 -3
  34. package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +5 -1
  35. package/server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.ts +356 -0
  36. package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +50 -3
  37. package/server/routers/api/restful-apis/v1/warehouse/get-do-document.ts +74 -0
  38. package/server/routers/api/restful-apis/v1/warehouse/get-grn-document.ts +116 -0
  39. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +3 -1
  40. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +102 -4
  41. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +12 -3
  42. package/server/routers/api/restful-apis/v1/warehouse/index.ts +4 -0
  43. package/server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.ts +109 -0
@@ -24,6 +24,10 @@ router.get(
24
24
  filter['name'] = filter['doNo']
25
25
  delete filter['doNo']
26
26
  }
27
+ if (_.has(filter, 'vehicleNo')) {
28
+ filter['truckNo'] = filter['vehicleNo']
29
+ delete filter['vehicleNo']
30
+ }
27
31
  filter['createdAt'] = Between(fromDate, toDate)
28
32
 
29
33
  delete filter['fromDate']
@@ -32,7 +36,15 @@ router.get(
32
36
  delete filter['offset']
33
37
  const [deliveryOrders, totalCount]: DeliveryOrder[] = await getRepository(DeliveryOrder).findAndCount({
34
38
  where: filter,
35
- relations: ['releaseGood', 'releaseGood.orderInventories', 'bizplace', 'domain'],
39
+ relations: [
40
+ 'releaseGood',
41
+ 'releaseGood.orderInventories',
42
+ 'releaseGood.shippingOrder',
43
+ 'bizplace',
44
+ 'domain',
45
+ 'transportDriver',
46
+ 'transportVehicle'
47
+ ],
36
48
  skip: offset,
37
49
  take: limit,
38
50
  order: { createdAt: 'DESC' }
@@ -52,6 +64,20 @@ router.get(
52
64
  to: deliveryOrder.to,
53
65
  contactPointRefId: deliveryOrder.contactPointRefId,
54
66
  truckNo: deliveryOrder.truckNo,
67
+ transportDriver: deliveryOrder.transportDriver
68
+ ? {
69
+ id: deliveryOrder.transportDriver.id,
70
+ name: deliveryOrder.transportDriver.name,
71
+ driverCode: deliveryOrder.transportDriver.driverCode
72
+ }
73
+ : null,
74
+ transportVehicle: deliveryOrder.transportVehicle
75
+ ? {
76
+ id: deliveryOrder.transportVehicle.id,
77
+ name: deliveryOrder.transportVehicle.name
78
+ }
79
+ : null,
80
+ otherDriver: deliveryOrder.otherDriver,
55
81
  deliveryDate: deliveryOrder.deliveryDate,
56
82
  status: deliveryOrder.status,
57
83
  ownCollection: deliveryOrder.ownCollection,
@@ -62,11 +88,24 @@ router.get(
62
88
  urgency: deliveryOrder.urgency,
63
89
  telNo: deliveryOrder.telNo,
64
90
  refNo: deliveryOrder.refNo,
65
- otherDriver: deliveryOrder.otherDriver,
66
91
  palletQty: deliveryOrder.palletQty,
67
92
  remark: deliveryOrder.remark,
68
93
  description: deliveryOrder.description,
69
94
  reusablePallet: deliveryOrder.reusablePallet,
95
+ attentionTo: deliveryOrder.attentionTo,
96
+ attentionCompany: deliveryOrder.attentionCompany,
97
+ // shipmentInformation
98
+ city: deliveryOrder.city,
99
+ country: deliveryOrder.country,
100
+ deliveryAddress1: deliveryOrder.deliveryAddress1,
101
+ phone1: deliveryOrder.phone1,
102
+ postalCode: deliveryOrder.postalCode,
103
+ state: deliveryOrder.state,
104
+ billingAddress: deliveryOrder.billingAddress,
105
+ billingCity: deliveryOrder.billingCity,
106
+ billingCountry: deliveryOrder.billingCountry,
107
+ billingPostalCode: deliveryOrder.billingPostalCode,
108
+ billingState: deliveryOrder.billingState,
70
109
  bizplace: {
71
110
  id: deliveryOrder.bizplace.id,
72
111
  name: deliveryOrder.bizplace.name,
@@ -120,7 +159,15 @@ router.get(
120
159
  handoverType: deliveryOrder.releaseGood.handoverType,
121
160
  dropoffAddress: deliveryOrder.releaseGood.dropoffAddress,
122
161
  noOfItems: deliveryOrder.releaseGood.noOfItems,
123
- orderProducts: []
162
+ orderProducts: [],
163
+ shippingOrder: deliveryOrder.releaseGood.shippingOrder
164
+ ? {
165
+ containerArrivalDate: deliveryOrder.releaseGood.shippingOrder.containerArrivalDate,
166
+ containerLeavingDate: deliveryOrder.releaseGood.shippingOrder.containerLeavingDate,
167
+ containerNo: deliveryOrder.releaseGood.shippingOrder.containerNo,
168
+ shipName: deliveryOrder.releaseGood.shippingOrder.shipName
169
+ }
170
+ : null
124
171
  },
125
172
  orderInventories
126
173
  }
@@ -0,0 +1,74 @@
1
+ import { Between, getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { DeliveryOrder } from '@things-factory/sales-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
8
+ import { renderOrientageDO, renderRODO } from '@things-factory/worksheet-base'
9
+
10
+ router.get(
11
+ '/v1/warehouse/get-do-document',
12
+ businessMiddleware,
13
+ validationMiddleware,
14
+ loggingMiddleware,
15
+ async (context, next) => {
16
+ try {
17
+ let filter = { ...context.query }
18
+ const { limit, offset } = filter
19
+ filter['bizplace'] = filter['bizplaceId']
20
+ filter['name'] = filter['doNo']
21
+
22
+ const fileType = filter['fileType'].toUpperCase()
23
+ const timezoneOffSet = parseInt(filter['timezoneOffSet'])
24
+ const doNo = filter['name']
25
+
26
+ delete filter['bizplaceId']
27
+ delete filter['doNo']
28
+ delete filter['fileType']
29
+
30
+ // change to switch case
31
+ switch (fileType) {
32
+ case 'HTML':
33
+ const deliveryOrder: DeliveryOrder = await getRepository(DeliveryOrder).findOne({
34
+ where: filter,
35
+ relations: ['releaseGood', 'releaseGood.orderInventories', 'bizplace', 'domain'],
36
+ skip: offset,
37
+ take: limit,
38
+ order: { createdAt: 'DESC' }
39
+ })
40
+
41
+ if (!deliveryOrder) {
42
+ throw new ApiError('E04', `goods receival note: ${filter['name']}`)
43
+ }
44
+
45
+ // give content
46
+ let content: string = ''
47
+
48
+ // Rerouting render-grn based on subdomain
49
+ switch (deliveryOrder.domain.subdomain) {
50
+ case 'orientage-warehouse':
51
+ content = await renderOrientageDO({ doNo }, context)
52
+ break
53
+ case 'shah-alam-warehouse':
54
+ content = await renderOrientageDO({ doNo }, context)
55
+ break
56
+ default:
57
+ // reroute to render-grn
58
+ content = await renderRODO({ doNo }, context)
59
+ break
60
+ }
61
+ // create and format data response
62
+ context.body = { fileType: fileType, content: content }
63
+ // for testing
64
+ // context.body = content
65
+ break
66
+ default:
67
+ throw new ApiError('E04', `file type: ${fileType}`)
68
+ }
69
+ } catch (e) {
70
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
71
+ else throwInternalServerError(context, e)
72
+ }
73
+ }
74
+ )
@@ -0,0 +1,116 @@
1
+ import { Between, getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { GoodsReceivalNote } from '@things-factory/sales-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
8
+ import {
9
+ renderGRN,
10
+ renderSeebuuGRN,
11
+ renderElcclGRN,
12
+ renderFmGRN,
13
+ renderKimedaGRN,
14
+ renderOrientageGRN
15
+ } from '@things-factory/worksheet-base'
16
+
17
+ router.get(
18
+ '/v1/warehouse/get-grn-document',
19
+ businessMiddleware,
20
+ validationMiddleware,
21
+ loggingMiddleware,
22
+ async (context, next) => {
23
+ try {
24
+ let filter = { ...context.query }
25
+ const { limit, offset } = filter
26
+ filter['bizplace'] = filter['bizplaceId']
27
+ filter['name'] = filter['grnNo']
28
+
29
+ const fileType = filter['fileType'].toUpperCase()
30
+ const timezoneOffSet = parseInt(filter['timezoneOffSet'])
31
+ const grnNo = filter['name']
32
+
33
+ delete filter['bizplaceId']
34
+ delete filter['grnNo']
35
+ delete filter['fileType']
36
+ delete filter['timezoneOffSet']
37
+
38
+ // change to switch case
39
+ switch (fileType) {
40
+ case 'HTML':
41
+ const [goodsReceivedNotes]: GoodsReceivalNote[] = await getRepository(GoodsReceivalNote).find({
42
+ where: filter,
43
+ relations: [
44
+ 'bizplace',
45
+ 'domain',
46
+ 'arrivalNotice',
47
+ 'arrivalNotice.orderProducts',
48
+ 'arrivalNotice.orderProducts.product'
49
+ ]
50
+ })
51
+ if (!goodsReceivedNotes) {
52
+ throw new ApiError('E04', `goods receival note: ${filter['name']}`)
53
+ }
54
+
55
+ // give content
56
+ let content: string = ''
57
+
58
+ // Rerouting render-grn based on subdomain
59
+ switch (goodsReceivedNotes.domain.subdomain) {
60
+ case 'el-cold-chain-warehouse':
61
+ // reroute to view_elccl_grn
62
+ content = await renderElcclGRN({ grnNo }, context)
63
+ break
64
+ case 'orientage-warehouse':
65
+ content = await renderOrientageGRN({ grnNo }, context)
66
+ break
67
+ case 'shah-alam-warehouse':
68
+ content = await renderOrientageGRN({ grnNo }, context)
69
+ // reroute to view_orientage_gr
70
+ break
71
+ // seebuu-grn
72
+ case 'seebuu-warehouse-a':
73
+ // reroute to render-seebuu-grn
74
+ content = await renderSeebuuGRN({ grnNo }, context)
75
+ break
76
+ case 'seebuu-warehouse-c':
77
+ // reroute to render-seebuu-grn
78
+ content = await renderSeebuuGRN({ grnNo }, context)
79
+ break
80
+ case 'seebuu-warehouse-logistics':
81
+ // reroute to render-seebuu-grn
82
+ content = await renderSeebuuGRN({ grnNo }, context)
83
+ break
84
+ case 'freight-mark-warehouse':
85
+ // reroute to view_fm_gr
86
+ content = await renderFmGRN({ grnNo }, context)
87
+ break
88
+ case 'kimeda-warehouse':
89
+ if (!timezoneOffSet) {
90
+ throw new ApiError('E03', 'timezoneOffSet')
91
+ }
92
+ // reroute to view_kimeda_gr
93
+ content = await renderKimedaGRN({ grnNo, timezoneOffSet }, context)
94
+ break
95
+ default:
96
+ if (!timezoneOffSet) {
97
+ throw new ApiError('E03', 'timezoneOffSet')
98
+ }
99
+ // reroute to render-grn
100
+ content = await renderGRN({ grnNo, timezoneOffSet }, context)
101
+ break
102
+ }
103
+ // create and format data response
104
+ context.body = { fileType: fileType, content: content }
105
+ // for testing
106
+ // context.body = content
107
+ break
108
+ default:
109
+ throw new ApiError('E04', `file type: ${fileType}`)
110
+ }
111
+ } catch (e) {
112
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
113
+ else throwInternalServerError(context, e)
114
+ }
115
+ }
116
+ )
@@ -26,7 +26,7 @@ router.get(
26
26
 
27
27
  const arrivalNotice: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
28
28
  where: filter,
29
- relations: ['orderProducts', 'orderProducts.product']
29
+ relations: ['orderProducts', 'orderProducts.product', 'bizplace']
30
30
  })
31
31
 
32
32
  if (!arrivalNotice) {
@@ -55,6 +55,7 @@ router.get(
55
55
  refNo: arrivalNotice.refNo,
56
56
  refNo2: arrivalNotice.refNo2,
57
57
  refNo3: arrivalNotice.refNo3,
58
+ status: arrivalNotice.status,
58
59
  etaDate: arrivalNotice.etaDate,
59
60
  ownTransport: arrivalNotice.ownTransport,
60
61
  importCargo: arrivalNotice.importCargo,
@@ -63,6 +64,7 @@ router.get(
63
64
  deliveryOrderNo: arrivalNotice.deliveryOrderNo,
64
65
  containerNo: arrivalNotice.containerNo,
65
66
  containerSize: arrivalNotice.containerSize,
67
+ bizplace: { id: arrivalNotice.bizplace.id, name: arrivalNotice.bizplace.name },
66
68
  orderProducts,
67
69
  supplier: {
68
70
  name: arrivalNotice?.supplier?.name || null,
@@ -2,7 +2,8 @@ import _ from 'lodash'
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { restfulApiRouter as router } from '@things-factory/api'
5
- import { ReleaseGood } from '@things-factory/sales-base'
5
+ import { ReleaseGood, DeliveryOrder } from '@things-factory/sales-base'
6
+ import { Attachment } from '@things-factory/attachment-base'
6
7
 
7
8
  import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
8
9
  import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
@@ -26,7 +27,14 @@ router.get(
26
27
 
27
28
  const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
28
29
  where: filter,
29
- relations: ['orderInventories', 'orderInventories.product', 'orderPackages', 'orderPackages.orderPackageItems']
30
+ relations: [
31
+ 'orderInventories',
32
+ 'orderInventories.product',
33
+ 'orderInventories.productDetail',
34
+ 'orderPackages',
35
+ 'orderPackages.orderPackageItems',
36
+ 'bizplace'
37
+ ]
30
38
  })
31
39
 
32
40
  if (!releaseGood) throw new ApiError('E04', `release order: ${filter['name']}`)
@@ -37,7 +45,9 @@ router.get(
37
45
  const orderInventoriesDataPoint = {
38
46
  product: {
39
47
  sku: orderInventory.product.sku,
40
- refCode: orderInventory.product.refCode
48
+ productDetail: {
49
+ refCode: orderInventory.productDetail.refCode ? orderInventory.productDetail.refCode : null
50
+ }
41
51
  },
42
52
  batchId: orderInventory.batchId,
43
53
  packingType: orderInventory.packingType,
@@ -63,6 +73,90 @@ router.get(
63
73
  orderPackages.push(orderPackagesDataPoint)
64
74
  }
65
75
 
76
+ let deliveryOrders: DeliveryOrder[] = []
77
+ deliveryOrders = await getRepository(DeliveryOrder).find({
78
+ where: { releaseGood: releaseGood.id },
79
+ relations: [
80
+ 'orderInventories',
81
+ 'orderInventories.product',
82
+ 'orderInventories.productDetail',
83
+ 'transportDriver',
84
+ 'transportVehicle',
85
+ 'creator',
86
+ 'updater'
87
+ ]
88
+ })
89
+
90
+ if (deliveryOrders.length > 0) {
91
+ deliveryOrders = deliveryOrders.map(deliveryOrder => {
92
+ return {
93
+ id: deliveryOrder.id,
94
+ name: deliveryOrder.name,
95
+ to: deliveryOrder.to,
96
+ truckNo: deliveryOrder.truckNo,
97
+ ownCollection: deliveryOrder.ownCollection,
98
+ looseItem: deliveryOrder.looseItem,
99
+ deliveryDate: deliveryOrder.deliveryDate,
100
+ palletQty: deliveryOrder.palletQty,
101
+ remark: deliveryOrder.remark,
102
+ status: deliveryOrder.status,
103
+ creator: deliveryOrder.creator ? { id: deliveryOrder.creator.id, name: deliveryOrder.creator.name } : null,
104
+ createdAt: deliveryOrder.createdAt,
105
+ updater: deliveryOrder.updater ? { id: deliveryOrder.updater.id, name: deliveryOrder.updater.name } : null,
106
+ updatedAt: deliveryOrder.updatedAt,
107
+ transportDriver: deliveryOrder.transportDriver
108
+ ? { id: deliveryOrder.transportDriver.id, name: deliveryOrder.transportDriver.name }
109
+ : null,
110
+ transportVehicle: deliveryOrder.transportVehicle
111
+ ? { id: deliveryOrder.transportVehicle.id, name: deliveryOrder.transportVehicle.name }
112
+ : null,
113
+ orderInventories: deliveryOrder.orderInventories.map(oi=>{
114
+ return{
115
+ releaseQty: oi.releaseQty,
116
+ releaseUomValue: oi.releaseUomValue,
117
+ packingType: oi.packingType,
118
+ packingSize: oi.packingSize,
119
+ remark: oi.remark,
120
+ product: {
121
+ id: oi.product.id,
122
+ name: oi.product.name,
123
+ description: oi.product.description,
124
+ sku: oi.product.sku,
125
+ },
126
+ productDetail: { refCode: oi.productDetail.refCode ? oi.productDetail.refCode : null
127
+ }
128
+ }})
129
+
130
+ // {
131
+ // product: deliveryOrder.orderInventories.map(oi => {
132
+ // return {
133
+ // id: oi.product.id,
134
+ // name: oi.product.name,
135
+ // description: oi.product.description,
136
+ // sku: oi.product.sku,
137
+ // productDetail: { refCode: oi.productDetail.refCode }
138
+ // }
139
+ // }),
140
+ // }
141
+ }
142
+ })
143
+ }
144
+
145
+ let attachments: Attachment[] = []
146
+ attachments = await getRepository(Attachment).find({
147
+ where: { refBy: releaseGood.id }
148
+ })
149
+
150
+ if(attachments.length >0){
151
+ attachments = attachments.map(attachment => {
152
+
153
+ return{
154
+ name: attachment.name,
155
+ fullpath: `${context.origin}/attachment/${attachment.path}`
156
+ }
157
+ })
158
+ }
159
+
66
160
  const data = {
67
161
  id: releaseGood.id,
68
162
  roNo: releaseGood.roNo,
@@ -89,6 +183,7 @@ router.get(
89
183
  routeId: releaseGood.routeId,
90
184
  stopId: releaseGood.stopId,
91
185
  status: releaseGood.status,
186
+ bizplace: { id: releaseGood.bizplace.id, name: releaseGood.bizplace.name },
92
187
  billTo: {
93
188
  billingAddress: releaseGood.billingAddress
94
189
  },
@@ -101,6 +196,7 @@ router.get(
101
196
  attentionTo: releaseGood.attentionTo,
102
197
  attentionCompany: releaseGood.attentionCompany,
103
198
  city: releaseGood.city,
199
+ ward: releaseGood.ward,
104
200
  district: releaseGood.district,
105
201
  state: releaseGood.state,
106
202
  postalCode: releaseGood.postalCode,
@@ -110,7 +206,9 @@ router.get(
110
206
  email: releaseGood.email
111
207
  },
112
208
  orderInventories,
113
- orderPackages
209
+ orderPackages: orderPackages.length > 0 ? orderPackages: null,
210
+ deliveryOrders: deliveryOrders.length > 0 ? deliveryOrders : null,
211
+ attachment: attachments.length > 0 ? attachments : null
114
212
  }
115
213
 
116
214
  context.body = {
@@ -33,7 +33,13 @@ router.get(
33
33
 
34
34
  const [releaseGoods, totalCount]: ReleaseGood[] = await getRepository(ReleaseGood).findAndCount({
35
35
  where: filter,
36
- relations: ['orderInventories', 'orderInventories.product', 'orderPackages', 'orderPackages.orderPackageItems'],
36
+ relations: [
37
+ 'orderInventories',
38
+ 'orderInventories.product',
39
+ 'orderInventories.productDetail',
40
+ 'orderPackages',
41
+ 'orderPackages.orderPackageItems'
42
+ ],
37
43
  skip: offset,
38
44
  take: limit,
39
45
  order: { createdAt: 'DESC' }
@@ -47,7 +53,9 @@ router.get(
47
53
  const orderInventoriesDataPoint = {
48
54
  product: {
49
55
  sku: orderInventory.product.sku,
50
- refCode: orderInventory.product.refCode
56
+ productDetail: {
57
+ refCode: orderInventory.productDetail.refCode
58
+ }
51
59
  },
52
60
  batchId: orderInventory.batchId,
53
61
  packingType: orderInventory.packingType,
@@ -73,7 +81,7 @@ router.get(
73
81
  }
74
82
  const datapoint = {
75
83
  id: releaseGood.id,
76
- roNo: releaseGood.roNo,
84
+ roNo: releaseGood.name,
77
85
  refNo: releaseGood.refNo,
78
86
  refNo2: releaseGood.refNo2,
79
87
  refNo3: releaseGood.refNo3,
@@ -109,6 +117,7 @@ router.get(
109
117
  attentionTo: releaseGood.attentionTo,
110
118
  attentionCompany: releaseGood.attentionCompany,
111
119
  city: releaseGood.city,
120
+ ward: releaseGood.ward,
112
121
  district: releaseGood.district,
113
122
  state: releaseGood.state,
114
123
  postalCode: releaseGood.postalCode,
@@ -12,3 +12,7 @@ import './get-onhand-inventory-list'
12
12
  import './get-release-order-details'
13
13
  import './get-release-order-list'
14
14
  import './update-release-order-details'
15
+ import './get-grn-document'
16
+ import './get-do-document'
17
+ import './dispatch-delivery-order'
18
+ import './update-gan-to-arrived'
@@ -0,0 +1,109 @@
1
+ import { getConnection, EntityManager } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { ArrivalNotice, OrderProduct } from '@things-factory/sales-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
8
+
9
+ router.post(
10
+ '/v1/warehouse/update-gan-to-arrived',
11
+ businessMiddleware,
12
+ validationMiddleware,
13
+ loggingMiddleware,
14
+ async (context, next) => {
15
+ try {
16
+ await getConnection().transaction(async (tx: EntityManager) => {
17
+ const { domain, user } = context.state
18
+
19
+ const foundGAN: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
20
+ where: {
21
+ domain: domain,
22
+ name: context.request.body.data.ganNo,
23
+ bizplace: context.request.body.data.bizplaceId
24
+ },
25
+ relations: ['bizplace', 'orderProducts']
26
+ })
27
+
28
+ if (!foundGAN) {
29
+ throw new ApiError('E04', `ganNo : ${context.request.body.data.ganNo}`)
30
+ } else if (foundGAN.status !== 'INTRANSIT') {
31
+ throw new ApiError('E02', `ganNo: ${context.request.body.data.ganNo} status is not INTRANSIT `)
32
+ }
33
+
34
+ if (foundGAN.orderProducts.length > 0) {
35
+ await Promise.all(
36
+ foundGAN.orderProducts.map(async orderProduct => {
37
+ await tx
38
+ .getRepository(OrderProduct)
39
+ .update({ id: orderProduct.id }, { status: 'ARRIVED', updater: user, updatedAt: new Date() })
40
+ })
41
+ )
42
+ }
43
+
44
+ await tx
45
+ .getRepository(ArrivalNotice)
46
+ .update(
47
+ { id: foundGAN.id, domain: domain, bizplace: context.request.body.data.bizplaceId },
48
+ { status: 'ARRIVED', updater: user, updatedAt: new Date() }
49
+ )
50
+
51
+ const updatedGAN: ArrivalNotice = await tx.getRepository(ArrivalNotice).findOne({
52
+ where: {
53
+ domain: domain,
54
+ id: foundGAN.id,
55
+ bizplace: context.request.body.data.bizplaceId
56
+ },
57
+ relations: ['bizplace', 'orderProducts', 'orderProducts.product']
58
+ })
59
+
60
+ let orderProducts = []
61
+ for (const orderProduct of updatedGAN.orderProducts) {
62
+ const orderProductsDataPoint = {
63
+ product: {
64
+ sku: orderProduct.product.sku,
65
+ uom: orderProduct.product.uom,
66
+ uomValue: orderProduct.product.uomValue
67
+ },
68
+ batchId: orderProduct.batchId,
69
+ packingType: orderProduct.packingType,
70
+ packingSize: orderProduct.packingSize,
71
+ qty: orderProduct.packQty,
72
+ palletQty: orderProduct.palletQty
73
+ }
74
+ orderProducts.push(orderProductsDataPoint)
75
+ }
76
+
77
+ context.body = {
78
+ data: {
79
+ id: updatedGAN.id,
80
+ ganNo: updatedGAN.name,
81
+ refNo: updatedGAN.refNo,
82
+ refNo2: updatedGAN.refNo2,
83
+ refNo3: updatedGAN.refNo3,
84
+ status: updatedGAN.status,
85
+ etaDate: updatedGAN.etaDate,
86
+ ownTransport: updatedGAN.ownTransport,
87
+ importCargo: updatedGAN.importCargo,
88
+ container: updatedGAN.container,
89
+ truckNo: updatedGAN.truckNo,
90
+ deliveryOrderNo: updatedGAN.deliveryOrderNo,
91
+ containerNo: updatedGAN.containerNo,
92
+ containerSize: updatedGAN.containerSize,
93
+ bizplace: { id: updatedGAN.bizplace.id, name: updatedGAN.bizplace.name },
94
+ supplier: {
95
+ name: updatedGAN?.supplier?.name || null,
96
+ companyName: updatedGAN?.supplier?.companyName || null,
97
+ email: updatedGAN?.supplier?.email || null,
98
+ accountNo: updatedGAN?.supplier?.accountNo || null
99
+ },
100
+ orderProducts
101
+ }
102
+ }
103
+ })
104
+ } catch (e) {
105
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
106
+ else throwInternalServerError(context, e)
107
+ }
108
+ }
109
+ )