@things-factory/operato-hub 4.3.329 → 4.3.331

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 (21) hide show
  1. package/dist-server/graphql/resolvers/email/send-emails.js +130 -104
  2. package/dist-server/graphql/resolvers/email/send-emails.js.map +1 -1
  3. package/dist-server/routers/api/restful-apis/v1/utils/params.js +5 -0
  4. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -1
  5. package/dist-server/routers/api/restful-apis/v1/warehouse/complete-delivery-order.js +170 -0
  6. package/dist-server/routers/api/restful-apis/v1/warehouse/complete-delivery-order.js.map +1 -0
  7. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +4 -2
  8. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -1
  9. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js +4 -2
  10. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js.map +1 -1
  11. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +1 -0
  12. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -1
  13. package/openapi/v1/inbound.yaml +25 -11
  14. package/openapi/v1/outbound.yaml +477 -0
  15. package/package.json +4 -4
  16. package/server/graphql/resolvers/email/send-emails.ts +191 -154
  17. package/server/routers/api/restful-apis/v1/utils/params.ts +5 -0
  18. package/server/routers/api/restful-apis/v1/warehouse/complete-delivery-order.ts +190 -0
  19. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +4 -2
  20. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.ts +4 -2
  21. package/server/routers/api/restful-apis/v1/warehouse/index.ts +1 -0
@@ -1,15 +1,26 @@
1
1
  import * as cronParser from 'cron-parser'
2
2
  import gql from 'graphql-tag'
3
- import { getRepository, In } from 'typeorm'
4
-
5
- import { Partner, User } from '@things-factory/auth-base'
3
+ import {
4
+ getRepository,
5
+ In
6
+ } from 'typeorm'
7
+
8
+ import {
9
+ Partner,
10
+ User
11
+ } from '@things-factory/auth-base'
6
12
  import { Bizplace } from '@things-factory/biz-base'
7
- import { objDataToExcel, sendEmailSes } from '@things-factory/email-base'
13
+ import {
14
+ objDataToExcel,
15
+ sendEmailSes
16
+ } from '@things-factory/email-base'
8
17
  import { logger } from '@things-factory/env'
9
18
  import { GraphqlLocalClient } from '@things-factory/shell'
10
19
 
11
20
  import { Email } from '../../../entities'
12
21
 
22
+ const { PerformanceObserver, performance } = require('node:perf_hooks')
23
+
13
24
  const EMAIL_SEARCH_INTERVAL = 35
14
25
 
15
26
  export const sendEmailsResolver = {
@@ -30,7 +41,7 @@ export const sendEmailsResolver = {
30
41
 
31
42
  if (dag < now && dag > thirtyMinsAgo) {
32
43
  try {
33
- processEmailCronJob(email, startDate.toISOString(), now.toISOString()) // removed await
44
+ processEmailCronJob(email, startDate.toISOString(), now.toISOString()) // removed await
34
45
  } catch (e) {
35
46
  logger.error(`[auto_email_log_by_id(${email.id})] ${e}`)
36
47
  }
@@ -39,171 +50,197 @@ export const sendEmailsResolver = {
39
50
  } catch (e) {
40
51
  logger.error(`[auto_email_log] ${e}`)
41
52
  }
42
-
43
53
  return true
44
54
  }
45
55
  }
46
56
 
47
57
  function replaceValues(variablesString: string, values: any = []) {
48
- for (let obj of values) {
49
- variablesString = variablesString.replace(obj.name, obj.value)
50
- }
51
- return JSON.parse(variablesString)
58
+
59
+ for (let obj of values) {
60
+ variablesString = variablesString.replace(obj.name, obj.value)
61
+ }
62
+ return JSON.parse(variablesString)
63
+
52
64
  }
53
65
 
54
66
  // NOTE: might show unused because of usage in eval function
55
67
  function flattenObject(obj, delimiter = '|') {
56
- var objResult = {}
57
- for (var items in obj) {
58
- if (!Object.hasOwnProperty.bind(obj)(items)) continue
59
68
 
60
- if (!!obj[items] && typeof obj[items] == 'object') {
61
- var flatObject = flattenObject(obj[items], delimiter)
62
- for (var x in flatObject) {
63
- if (!Object.hasOwnProperty.bind(flatObject)(x)) continue
69
+ var objResult = {}
70
+ for (var items in obj) {
71
+ if (!Object.hasOwnProperty.bind(obj)(items)) continue
72
+
73
+ if (!!obj[items] && typeof obj[items] == 'object') {
74
+ var flatObject = flattenObject(obj[items], delimiter)
75
+ for (var x in flatObject) {
76
+ if (!Object.hasOwnProperty.bind(flatObject)(x)) continue
64
77
 
65
- objResult[items + delimiter + x] = flatObject[x]
78
+ objResult[items + delimiter + x] = flatObject[x]
79
+ }
80
+ } else {
81
+ objResult[items] = obj[items]
66
82
  }
67
- } else {
68
- objResult[items] = obj[items]
69
83
  }
70
- }
71
- return objResult
84
+ return objResult
72
85
  }
73
86
 
74
87
  async function processEmailCronJob(email, fromDate, toDate) {
75
- let attachments: any = []
76
- // black list filtration
77
- // let partnerBlackList = JSON.parse(email.partnerBlackList) || []
78
-
79
- // partner list
80
- let partnerList = JSON.parse(email.partnerList) || []
81
-
82
- const partners: Partner[] = await getRepository(Partner).find({
83
- where: { domain: email.domain, id: In(partnerList) },
84
- relations: ['partnerDomain']
85
- })
86
-
87
- // retrieve and process xlsx attachmennts
88
- for (let attachment of email.emailAttachments) {
89
- let client = GraphqlLocalClient.client
90
- let attachmentVariables = JSON.parse(attachment.attachmentVariables)
91
- let numberOfMonths: number = attachmentVariables?.numberOfMonths || 1
92
- let numberOfWeeks: number = attachmentVariables?.numberOfWeeks ? attachmentVariables.numberOfWeeks * 7 : 7
93
- let numberOfDays: number = attachmentVariables?.numberOfDays || 1
94
-
95
- for (let partner of partners) {
96
- const bizplace: Bizplace = await getRepository(Bizplace).findOne({
97
- where: { domain: partner.partnerDomain }
98
- })
99
-
100
- // date params processing
101
- // let dateValue = new Date()
102
- // let yesterday = dateValue.getDate() - 1
103
- // let yesterdayBegin: any = new Date(dateValue.setDate(yesterday))
104
- // let yesterdayEnd: any = new Date(dateValue.setDate(yesterday))
105
-
106
- // yesterdayBegin.setHours(0, 0, 0, 0)
107
- // yesterdayEnd.setHours(23, 59, 59, 999)
108
-
109
- let timezoneOffset = email?.timezoneOffset || 0
110
-
111
- let curDate = new Date()
112
- let curDateForMonth = new Date(curDate)
113
- let curDateForWeek = new Date(curDate)
114
- let curDateForDay = new Date(curDate)
115
-
116
- let prevMonth = curDateForMonth.getMonth() - numberOfMonths
117
- let prevMonthBegin: any = new Date(curDateForMonth.setMonth(prevMonth))
118
- prevMonthBegin.setHours(0, 0, 0, 0)
119
- let prevMonthBeginDateTime = new Date(prevMonthBegin - timezoneOffset * 60000).toISOString()
120
-
121
- let prevWeek = curDateForWeek.getDate() - numberOfWeeks // subtract 1 week
122
- let prevWeekBegin: any = new Date(curDateForWeek.setDate(prevWeek))
123
- prevWeekBegin.setHours(0, 0, 0, 0)
124
- let prevWeekBeginDateTime = new Date(prevWeekBegin - timezoneOffset * 60000).toISOString()
125
-
126
- let prevDay = curDateForDay.getDate() - numberOfDays // subtract 1 day
127
- let prevDayBegin: any = new Date(curDateForDay.setDate(prevDay))
128
- prevDayBegin.setHours(0, 0, 0, 0)
129
- let prevDayBeginDateTime = new Date(prevDayBegin - timezoneOffset * 60000).toISOString()
130
-
131
- let endDate: any = curDate
132
- endDate.setHours(23, 59, 59, 999)
133
- let endDateTime = new Date(endDate - timezoneOffset * 60000).toISOString()
134
-
135
- // let fromDate = new Date(yesterdayBegin - timezoneOffset * 60000).toISOString()
136
- // let toDate = new Date(yesterdayEnd - timezoneOffset * 60000).toISOString()
137
-
138
- // to trace UTC conversion in production
139
- logger.info(`[email_utc_conversion] fromDate: ${fromDate}, toDate: ${toDate}`)
140
-
141
- let variables = replaceValues(attachment.variables, [
142
- { name: '{{bizplaceId}}', value: `"${bizplace.id}"` },
143
- { name: '{{timezoneOffset}}', value: `${timezoneOffset}` },
144
- { name: '{{lastRunDateTime}}', value: `"${fromDate}"` },
145
- { name: '{{toDateTime}}', value: `"${endDateTime}"` },
146
- { name: '{{prevMonthBeginDateTime}}', value: `"${prevMonthBeginDateTime}"` },
147
- { name: '{{prevWeekBeginDateTime}}', value: `"${prevWeekBeginDateTime}"` },
148
- { name: '{{prevDayBeginDateTime}}', value: `"${prevDayBeginDateTime}"` }
149
- ])
150
-
151
- let user: User = email.creator
152
- delete user.creatorId
153
- delete user.updaterId
154
-
155
- // might show unused because of usage in eval
156
- const response = await client.query({
157
- query: gql`
158
- ${attachment.gqlString}
159
- `,
160
- variables: variables || {},
161
- context: { state: { domain: email.domain, user } }
162
- } as any)
163
-
164
- let mappedResponse = eval(attachment.mappingFunction)
165
-
166
- let header = JSON.parse(attachment.headers)
167
-
168
- let excelResponse = await objDataToExcel({ name: 'name', data: { header, data: mappedResponse } })
169
-
170
- attachments.push({
171
- filename: `${bizplace.name} - ${attachment.name}.xlsx`,
172
- content: excelResponse,
173
- contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
174
- })
88
+
89
+ try {
90
+ performance.mark(`processEmailCronJob start:(${email.id})`)
91
+ // processEmailStartTime = performance.now()
92
+ let attachments: any = []
93
+ // black list filtration
94
+ // let partnerBlackList = JSON.parse(email.partnerBlackList) || []
95
+
96
+ // partner list
97
+ let partnerList = JSON.parse(email.partnerList) || []
98
+
99
+ const partners: Partner[] = await getRepository(Partner).find({
100
+ where: { domain: email.domain, id: In(partnerList) },
101
+ relations: ['partnerDomain']
102
+ })
103
+
104
+ // retrieve and process xlsx attachmennts
105
+ for (let attachment of email.emailAttachments) {
106
+ let client = GraphqlLocalClient.client
107
+ let attachmentVariables = JSON.parse(attachment.attachmentVariables)
108
+ let numberOfMonths: number = attachmentVariables?.numberOfMonths || 1
109
+ let numberOfWeeks: number = attachmentVariables?.numberOfWeeks ? attachmentVariables.numberOfWeeks * 7 : 7
110
+ let numberOfDays: number = attachmentVariables?.numberOfDays || 1
111
+
112
+ for (let partner of partners) {
113
+ const bizplace: Bizplace = await getRepository(Bizplace).findOne({
114
+ where: { domain: partner.partnerDomain }
115
+ })
116
+
117
+ // date params processing
118
+ // let dateValue = new Date()
119
+ // let yesterday = dateValue.getDate() - 1
120
+ // let yesterdayBegin: any = new Date(dateValue.setDate(yesterday))
121
+ // let yesterdayEnd: any = new Date(dateValue.setDate(yesterday))
122
+
123
+ // yesterdayBegin.setHours(0, 0, 0, 0)
124
+ // yesterdayEnd.setHours(23, 59, 59, 999)
125
+
126
+ let timezoneOffset = email?.timezoneOffset || 0
127
+
128
+ let curDate = new Date()
129
+ let curDateForMonth = new Date(curDate)
130
+ let curDateForWeek = new Date(curDate)
131
+ let curDateForDay = new Date(curDate)
132
+
133
+ let prevMonth = curDateForMonth.getMonth() - numberOfMonths
134
+ let prevMonthBegin: any = new Date(curDateForMonth.setMonth(prevMonth))
135
+ prevMonthBegin.setHours(0, 0, 0, 0)
136
+ let prevMonthBeginDateTime = new Date(prevMonthBegin - timezoneOffset * 60000).toISOString()
137
+
138
+ let prevWeek = curDateForWeek.getDate() - numberOfWeeks // subtract 1 week
139
+ let prevWeekBegin: any = new Date(curDateForWeek.setDate(prevWeek))
140
+ prevWeekBegin.setHours(0, 0, 0, 0)
141
+ let prevWeekBeginDateTime = new Date(prevWeekBegin - timezoneOffset * 60000).toISOString()
142
+
143
+ let prevDay = curDateForDay.getDate() - numberOfDays // subtract 1 day
144
+ let prevDayBegin: any = new Date(curDateForDay.setDate(prevDay))
145
+ prevDayBegin.setHours(0, 0, 0, 0)
146
+ let prevDayBeginDateTime = new Date(prevDayBegin - timezoneOffset * 60000).toISOString()
147
+
148
+ let endDate: any = curDate
149
+ endDate.setHours(23, 59, 59, 999)
150
+ let endDateTime = new Date(endDate - timezoneOffset * 60000).toISOString()
151
+
152
+ // let fromDate = new Date(yesterdayBegin - timezoneOffset * 60000).toISOString()
153
+ // let toDate = new Date(yesterdayEnd - timezoneOffset * 60000).toISOString()
154
+
155
+ // to trace UTC conversion in production
156
+ logger.info(`[email_utc_conversion] fromDate: ${fromDate}, toDate: ${toDate}`)
157
+
158
+ let variables = replaceValues(attachment.variables, [
159
+ { name: '{{bizplaceId}}', value: `"${bizplace.id}"` },
160
+ { name: '{{timezoneOffset}}', value: `${timezoneOffset}` },
161
+ { name: '{{lastRunDateTime}}', value: `"${fromDate}"` },
162
+ { name: '{{toDateTime}}', value: `"${endDateTime}"` },
163
+ { name: '{{prevMonthBeginDateTime}}', value: `"${prevMonthBeginDateTime}"` },
164
+ { name: '{{prevWeekBeginDateTime}}', value: `"${prevWeekBeginDateTime}"` },
165
+ { name: '{{prevDayBeginDateTime}}', value: `"${prevDayBeginDateTime}"` }
166
+ ])
167
+
168
+ let user: User = email.creator
169
+ delete user.creatorId
170
+ delete user.updaterId
171
+
172
+ // might show unused because of usage in eval
173
+ const response = await client.query({
174
+ query: gql`
175
+ ${attachment.gqlString}
176
+ `,
177
+ variables: variables || {},
178
+ context: { state: { domain: email.domain, user } }
179
+ } as any)
180
+
181
+ let excelResponse
182
+
183
+ try {
184
+ performance.mark(`objDataToExcel start:${email.id}`)
185
+ let mappedResponse = eval(attachment.mappingFunction)
186
+
187
+ let header = JSON.parse(attachment.headers)
188
+
189
+ excelResponse = await objDataToExcel({ name: 'name', data: { header, data: mappedResponse } })
190
+
191
+ performance.mark(`objDataToExcel end:${email.id}`)
192
+
193
+ } catch (e) {
194
+ performance.mark(`objDataToExcel end:${email.id}`)
195
+ logger.error(`[send-email] objDataToExcel(${email.id}): ${e}`)
196
+ } finally {
197
+ let perf = performance.measure(`emailId:${email.id}`, `objDataToExcel start:${email.id}`, `objDataToExcel end:${email.id}`)
198
+ logger.info(`objDataToExcel performance: ${perf.toJSON()}`)
199
+ }
200
+
201
+ attachments.push({
202
+ filename: `${bizplace.name} - ${attachment.name}.xlsx`,
203
+ content: excelResponse,
204
+ contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
205
+ })
206
+ }
175
207
  }
176
- }
177
208
 
178
- // modify content and subject
179
- let bizplace: Bizplace = await getRepository(Bizplace).findOne({
180
- where: { domain: email.domain },
181
- relations: ['company']
182
- })
183
-
184
- let modifiedContent = email.content.replace('{{companyName}}', bizplace.company.name)
185
-
186
- let modifiedSubject = email.subject.replace('{{warehouseName}}', email.domain.name)
187
- modifiedSubject = modifiedSubject.replace('{{reportDate}}', new Date().toLocaleDateString('en-GB'))
188
- //
189
-
190
- let res = await sendEmailSes({
191
- attachments,
192
- subject: modifiedSubject,
193
- content: modifiedContent,
194
- toMailList:
195
- email.emailRecipients
196
- .filter(er => er.type == 'to')
197
- .map(er => {
198
- return er.emailAddress
199
- }) || [],
200
- ccMailList:
201
- email.emailRecipients
202
- .filter(er => er.type == 'cc')
203
- .map(er => {
204
- return er.emailAddress
205
- }) || []
206
- })
207
-
208
- await getRepository(Email).update({ id: email.id }, { lastSent: new Date().toISOString() })
209
+ // modify content and subject
210
+ let bizplace: Bizplace = await getRepository(Bizplace).findOne({
211
+ where: { domain: email.domain },
212
+ relations: ['company']
213
+ })
214
+
215
+ let modifiedContent = email.content.replace('{{companyName}}', bizplace.company.name)
216
+ let modifiedSubject = email.subject.replace('{{warehouseName}}', email.domain.name)
217
+ modifiedSubject = modifiedSubject.replace('{{reportDate}}', new Date().toLocaleDateString('en-GB'))
218
+
219
+ let res = await sendEmailSes({
220
+ attachments,
221
+ subject: modifiedSubject,
222
+ content: modifiedContent,
223
+ toMailList:
224
+ email.emailRecipients
225
+ .filter(er => er.type == 'to')
226
+ .map(er => {
227
+ return er.emailAddress
228
+ }) || [],
229
+ ccMailList:
230
+ email.emailRecipients
231
+ .filter(er => er.type == 'cc')
232
+ .map(er => {
233
+ return er.emailAddress
234
+ }) || []
235
+ })
236
+
237
+ await getRepository(Email).update({ id: email.id }, { lastSent: new Date().toISOString() })
238
+ performance.mark(`processEmailCronJob end:(${email.id})`)
239
+ } catch (e) {
240
+ performance.mark(`processEmailCronJob end:(${email.id})`)
241
+ logger.error(`[send-email] processEmailCronJob(${email.id}): ${e}`)
242
+ } finally {
243
+ let perf = performance.measure(`emailId:${email.id}`, `processEmailCronJob start:(${email.id})`, `processEmailCronJob end:(${email.id})`)
244
+ logger.info(`processEmailCronJob performance: ${perf.toJSON()}`)
245
+ }
209
246
  }
@@ -421,6 +421,7 @@ export const params = {
421
421
  'shippingOrder.containerNo',
422
422
  'shippingOrder.shipName'
423
423
  ],
424
+ 'complete-delivery-order': ['remark', 'bizplaceId', 'name'],
424
425
  'update-gan-to-arrived': ['ganNo', 'bizplaceId']
425
426
  }
426
427
 
@@ -796,6 +797,10 @@ export const reqParams = {
796
797
  type: 'field'
797
798
  }
798
799
  ],
800
+ 'complete-delivery-order': [
801
+ { name: 'name', required: true, type: 'field' },
802
+ { name: 'bizplaceId', required: true, type: 'field' }
803
+ ],
799
804
  'update-gan-to-arrived': [
800
805
  { name: 'ganNo', required: true, type: 'field' },
801
806
  {
@@ -0,0 +1,190 @@
1
+ import { getConnection, EntityManager } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { TransportVehicle, TRUCK_STATUS } from '@things-factory/warehouse-base'
5
+ import {
6
+ ORDER_TYPES,
7
+ ORDER_STATUS,
8
+ ORDER_INVENTORY_STATUS,
9
+ OrderInventory,
10
+ DeliveryOrder
11
+ } from '@things-factory/sales-base'
12
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
13
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
14
+
15
+ router.post(
16
+ '/v1/warehouse/complete-delivery-order',
17
+ businessMiddleware,
18
+ validationMiddleware,
19
+ loggingMiddleware,
20
+ async (context, next) => {
21
+ try {
22
+ await getConnection().transaction(async (tx: EntityManager) => {
23
+ const { domain, user } = context.state
24
+ const data = context.request.body.data
25
+ const deliveryOrder: DeliveryOrder = await tx.getRepository(DeliveryOrder).findOne({
26
+ where: { domain, name: data.name },
27
+ relations: ['bizplace', 'transportDriver', 'transportVehicle', 'releaseGood', 'releaseGood.shippingOrder']
28
+ })
29
+
30
+ if (!deliveryOrder) throw new ApiError('E04', `Delivery order doesn't exists.`)
31
+ if (deliveryOrder.status !== ORDER_STATUS.DELIVERING) throw new ApiError('E04', `Status is not receivable.`)
32
+
33
+ await tx
34
+ .getRepository(OrderInventory)
35
+ .update(
36
+ { type: ORDER_TYPES.DELIVERY, status: ORDER_INVENTORY_STATUS.DELIVERING, domain, deliveryOrder },
37
+ { status: ORDER_INVENTORY_STATUS.DONE }
38
+ )
39
+
40
+ let orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({
41
+ where: { domain, deliveryOrder: deliveryOrder }
42
+ })
43
+
44
+ const updateDoPatch =
45
+ data.remark && data.remark !== ''
46
+ ? {
47
+ remark: data.remark,
48
+ status: ORDER_STATUS.DONE,
49
+ updater: user
50
+ }
51
+ : {
52
+ status: ORDER_STATUS.DONE,
53
+ updater: user
54
+ }
55
+
56
+ await tx.getRepository(DeliveryOrder).update({ id: deliveryOrder.id }, updateDoPatch)
57
+
58
+ if (!deliveryOrder?.ownCollection) {
59
+ await tx.getRepository(TransportVehicle).update(
60
+ { id: deliveryOrder.transportVehicle },
61
+ {
62
+ status: TRUCK_STATUS.IDLE,
63
+ updater: user
64
+ }
65
+ )
66
+ }
67
+
68
+ context.body = {
69
+ data: {
70
+ id: deliveryOrder.id,
71
+ doNo: deliveryOrder.name,
72
+ from: deliveryOrder.from,
73
+ to: deliveryOrder.to,
74
+ contactPointRefId: deliveryOrder.contactPointRefId,
75
+ truckNo: deliveryOrder.truckNo,
76
+ transportDriver: deliveryOrder.transportDriver
77
+ ? {
78
+ id: deliveryOrder.transportDriver.id,
79
+ name: deliveryOrder.transportDriver.name,
80
+ driverCode: deliveryOrder.transportDriver.driverCode
81
+ }
82
+ : null,
83
+ transportVehicle: deliveryOrder.transportVehicle
84
+ ? {
85
+ id: deliveryOrder.transportVehicle.id,
86
+ name: deliveryOrder.transportVehicle.name
87
+ }
88
+ : null,
89
+ otherDriver: deliveryOrder.otherDriver,
90
+ deliveryDate: deliveryOrder.deliveryDate,
91
+ status: ORDER_STATUS.DONE,
92
+ ownCollection: deliveryOrder.ownCollection,
93
+ looseItem: deliveryOrder.looseItem,
94
+ deliveryDateTime: deliveryOrder.deliveryDateTime,
95
+ loadWeight: deliveryOrder.loadWeight,
96
+ cargoType: deliveryOrder.cargoType,
97
+ urgency: deliveryOrder.urgency,
98
+ telNo: deliveryOrder.telNo,
99
+ refNo: deliveryOrder.refNo,
100
+ palletQty: deliveryOrder.palletQty,
101
+ remark: data.remark && data.remark !== '' ? data.remark : null,
102
+ description: deliveryOrder.description,
103
+ reusablePallet: deliveryOrder.reusablePallet,
104
+ attentionTo: deliveryOrder.attentionTo,
105
+ attentionCompany: deliveryOrder.attentionCompany,
106
+ //shipmentInformation
107
+ city: deliveryOrder.city,
108
+ country: deliveryOrder.country,
109
+ deliveryAddress1: deliveryOrder.deliveryAddress1,
110
+ phone1: deliveryOrder.phone1,
111
+ postalCode: deliveryOrder.postalCode,
112
+ state: deliveryOrder.state,
113
+ billingAddress: deliveryOrder.billingAddress,
114
+ billingCity: deliveryOrder.billingCity,
115
+ billingCountry: deliveryOrder.billingCountry,
116
+ billingPostalCode: deliveryOrder.billingPostalCode,
117
+ billingState: deliveryOrder.billingState,
118
+ bizplace: {
119
+ id: deliveryOrder.bizplace.id,
120
+ name: deliveryOrder.bizplace.name,
121
+ description: deliveryOrder.bizplace.description
122
+ },
123
+ domain: {
124
+ id: domain.id,
125
+ name: domain.name
126
+ },
127
+ releaseGood: {
128
+ id: deliveryOrder.releaseGood.id,
129
+ roNo: deliveryOrder.releaseGood.name,
130
+ description: deliveryOrder.releaseGood.description,
131
+ status: deliveryOrder.releaseGood.status,
132
+ refNo: deliveryOrder.releaseGood.refNo,
133
+ refNo2: deliveryOrder.releaseGood.refNo2,
134
+ refNo3: deliveryOrder.releaseGood.refNo3,
135
+ truckNo: deliveryOrder.releaseGood.truckNo,
136
+ exportOption: deliveryOrder.releaseGood.exportOption,
137
+ ownTransport: deliveryOrder.releaseGood.ownTransport,
138
+ crossDocking: deliveryOrder.releaseGood.crossDocking,
139
+ releaseDateTime: deliveryOrder.releaseGood.releaseDateTime,
140
+ releaseDate: deliveryOrder.releaseGood.releaseDate,
141
+ remark: deliveryOrder.releaseGood.remark,
142
+ courierOption: deliveryOrder.releaseGood.courierOption,
143
+ packingOption: deliveryOrder.releaseGood.packingOption,
144
+ type: deliveryOrder.releaseGood.type,
145
+ acceptedAt: deliveryOrder.releaseGood.acceptedAt,
146
+ marketplaceOrderStatus: deliveryOrder.releaseGood.marketplaceOrderStatus,
147
+ billingAddress: deliveryOrder.releaseGood.billingAddress,
148
+ deliveryAddress1: deliveryOrder.releaseGood.deliveryAddress1,
149
+ deliveryAddress2: deliveryOrder.releaseGood.deliveryAddress2,
150
+ deliveryAddress3: deliveryOrder.releaseGood.deliveryAddress3,
151
+ deliveryAddress4: deliveryOrder.releaseGood.deliveryAddress4,
152
+ deliveryAddress5: deliveryOrder.releaseGood.deliveryAddress5,
153
+ attentionTo: deliveryOrder.releaseGood.attentionTo,
154
+ attentionCompany: deliveryOrder.releaseGood.attentionCompany,
155
+ city: deliveryOrder.releaseGood.city,
156
+ state: deliveryOrder.releaseGood.state,
157
+ postalCode: deliveryOrder.releaseGood.postalCode,
158
+ country: deliveryOrder.releaseGood.country,
159
+ phone1: deliveryOrder.releaseGood.phone1,
160
+ phone2: deliveryOrder.releaseGood.phone2,
161
+ email: deliveryOrder.releaseGood.email,
162
+ transporter: deliveryOrder.releaseGood.transporter,
163
+ trackingNo: deliveryOrder.releaseGood.trackingNo,
164
+ airwayBill: deliveryOrder.releaseGood.airwayBill,
165
+ invoice: deliveryOrder.releaseGood.invoice,
166
+ pickupAddress: deliveryOrder.releaseGood.pickupAddress,
167
+ pickupTime: deliveryOrder.releaseGood.pickupTime,
168
+ handoverType: deliveryOrder.releaseGood.handoverType,
169
+ dropoffAddress: deliveryOrder.releaseGood.dropoffAddress,
170
+ noOfItems: deliveryOrder.releaseGood.noOfItems,
171
+ orderProducts: [],
172
+ shippingOrder: deliveryOrder.releaseGood.shippingOrder
173
+ ? {
174
+ containerArrivalDate: deliveryOrder.releaseGood.shippingOrder.containerArrivalDate,
175
+ containerLeavingDate: deliveryOrder.releaseGood.shippingOrder.containerLeavingDate,
176
+ containerNo: deliveryOrder.releaseGood.shippingOrder.containerNo,
177
+ shipName: deliveryOrder.releaseGood.shippingOrder.shipName
178
+ }
179
+ : null
180
+ },
181
+ orderInventories: { ...orderInventories }
182
+ }
183
+ }
184
+ })
185
+ } catch (e) {
186
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
187
+ else throwInternalServerError(context, e)
188
+ }
189
+ }
190
+ )
@@ -1,11 +1,11 @@
1
+ import _ from 'lodash'
1
2
  import { getRepository } from 'typeorm'
2
3
 
3
4
  import { restfulApiRouter as router } from '@things-factory/api'
4
5
  import { ArrivalNotice } from '@things-factory/sales-base'
5
6
 
7
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
6
8
  import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
- import _ from 'lodash'
8
- import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
9
9
 
10
10
  router.get(
11
11
  '/v1/warehouse/get-inbound-order-details',
@@ -44,6 +44,8 @@ router.get(
44
44
  batchId: orderProduct.batchId,
45
45
  packingType: orderProduct.packingType,
46
46
  packingSize: orderProduct.packingSize,
47
+ uom: orderProduct.uom,
48
+ uomValue: orderProduct.uomValue,
47
49
  qty: orderProduct.packQty,
48
50
  palletQty: orderProduct.palletQty
49
51
  }
@@ -1,11 +1,11 @@
1
+ import _ from 'lodash'
1
2
  import { Between, getRepository } from 'typeorm'
2
3
 
3
4
  import { restfulApiRouter as router } from '@things-factory/api'
4
5
  import { ArrivalNotice } from '@things-factory/sales-base'
5
6
 
7
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
6
8
  import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
- import _ from 'lodash'
8
- import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
9
9
 
10
10
  router.get(
11
11
  '/v1/warehouse/get-inbound-order-list',
@@ -52,6 +52,8 @@ router.get(
52
52
  batchId: orderProduct.batchId,
53
53
  packingType: orderProduct.packingType,
54
54
  packingSize: orderProduct.packingSize,
55
+ uom: orderProduct.uom,
56
+ uomValue: orderProduct.uomValue,
55
57
  qty: orderProduct.packQty,
56
58
  palletQty: orderProduct.palletQty
57
59
  }
@@ -16,3 +16,4 @@ import './get-grn-document'
16
16
  import './get-do-document'
17
17
  import './dispatch-delivery-order'
18
18
  import './update-gan-to-arrived'
19
+ import './complete-delivery-order'