@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.
- package/dist-server/graphql/resolvers/synchronization/powrup-get-tracking-no.js +2 -1
- package/dist-server/graphql/resolvers/synchronization/powrup-get-tracking-no.js.map +1 -1
- package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +12 -8
- package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
- package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js +1 -0
- package/dist-server/routers/api/restful-apis/unstable/get-release-order-list.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/utils/params.js +72 -3
- package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +15 -11
- package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js +313 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js.map +1 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +50 -3
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js +65 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-do-document.js.map +1 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js +101 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-grn-document.js.map +1 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +3 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +96 -3
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +12 -3
- package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +4 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -1
- package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js +96 -0
- package/dist-server/routers/api/restful-apis/v1/warehouse/update-gan-to-arrived.js.map +1 -0
- package/openapi/unstable/outbound.yaml +8 -0
- package/openapi/v1/inbound.yaml +210 -0
- package/openapi/v1/outbound.yaml +812 -0
- package/package.json +17 -17
- package/server/graphql/resolvers/synchronization/powrup-get-tracking-no.ts +1 -0
- package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -0
- package/server/routers/api/restful-apis/unstable/get-release-order-list.ts +1 -0
- package/server/routers/api/restful-apis/v1/utils/params.ts +72 -3
- package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +5 -1
- package/server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.ts +356 -0
- package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +50 -3
- package/server/routers/api/restful-apis/v1/warehouse/get-do-document.ts +74 -0
- package/server/routers/api/restful-apis/v1/warehouse/get-grn-document.ts +116 -0
- package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +3 -1
- package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +102 -4
- package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +12 -3
- package/server/routers/api/restful-apis/v1/warehouse/index.ts +4 -0
- 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: [
|
|
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: [
|
|
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
|
-
|
|
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: [
|
|
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
|
-
|
|
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.
|
|
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
|
+
)
|