@things-factory/sales-base 4.3.46 → 4.3.50
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/constants/order.js +2 -1
- package/dist-server/constants/order.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +102 -94
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js +93 -21
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
- package/dist-server/service/draft-release-good/draft-release-good.js +5 -0
- package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -1
- package/dist-server/service/manifest/manifest-mutation.js +78 -1
- package/dist-server/service/manifest/manifest-mutation.js.map +1 -1
- package/dist-server/service/manifest/manifest-query.js +47 -12
- package/dist-server/service/manifest/manifest-query.js.map +1 -1
- package/dist-server/service/manifest/manifest-type.js +8 -0
- package/dist-server/service/manifest/manifest-type.js.map +1 -1
- package/dist-server/service/manifest/manifest.js +5 -0
- package/dist-server/service/manifest/manifest.js.map +1 -1
- package/dist-server/service/purchase-order/purchase-order-mutation.js +8 -4
- package/dist-server/service/purchase-order/purchase-order-mutation.js.map +1 -1
- package/dist-server/service/release-good/release-good-mutation.js +2 -16
- package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
- package/dist-server/service/release-good/release-good-query.js +70 -58
- package/dist-server/service/release-good/release-good-query.js.map +1 -1
- package/package.json +13 -13
- package/server/constants/order.ts +2 -1
- package/server/controllers/ecommerce/sellercraft-controller.ts +124 -107
- package/server/service/arrival-notice/arrival-notice-mutation.ts +110 -22
- package/server/service/draft-release-good/draft-release-good.ts +7 -3
- package/server/service/manifest/manifest-mutation.ts +78 -3
- package/server/service/manifest/manifest-query.ts +68 -18
- package/server/service/manifest/manifest-type.ts +6 -0
- package/server/service/manifest/manifest.ts +6 -2
- package/server/service/purchase-order/purchase-order-mutation.ts +10 -5
- package/server/service/release-good/release-good-mutation.ts +23 -30
- package/server/service/release-good/release-good-query.ts +81 -65
- package/translations/en.json +4 -0
- package/translations/ko.json +6 -2
- package/translations/ms.json +5 -1
|
@@ -1,13 +1,58 @@
|
|
|
1
1
|
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
-
|
|
3
|
-
import { DISPATCHMENT_STATUS } from '../../constants'
|
|
2
|
+
import { In, Not } from 'typeorm'
|
|
3
|
+
import { DISPATCHMENT_STATUS, MANIFEST_STATUS } from '../../constants'
|
|
4
4
|
import { OrderNoGenerator } from '../../utils'
|
|
5
5
|
import { ReleaseGood } from '../release-good/release-good'
|
|
6
6
|
import { Manifest, ManifestStatus } from './manifest'
|
|
7
7
|
import { ManifestPatch, NewManifest } from './manifest-type'
|
|
8
|
+
import i18next from 'i18next'
|
|
8
9
|
|
|
9
10
|
@Resolver(Manifest)
|
|
10
11
|
export class ManifestMutation {
|
|
12
|
+
@Directive('@transaction')
|
|
13
|
+
@Mutation(returns => Boolean, { description: 'To update Manifest' })
|
|
14
|
+
async updateManifest(
|
|
15
|
+
@Arg('manifestId', { nullable: true }) manifestId: string,
|
|
16
|
+
@Arg('status', { nullable: true }) status: string,
|
|
17
|
+
@Arg('shippingProvider', { nullable: true }) shippingProvider: string,
|
|
18
|
+
@Arg('removeOrders', type => [String], { nullable: true }) removeOrders: string[],
|
|
19
|
+
@Ctx() context: any
|
|
20
|
+
): Promise<boolean> {
|
|
21
|
+
const { domain, tx } = context.state
|
|
22
|
+
const ManifestRepo = tx.getRepository(Manifest)
|
|
23
|
+
//update status
|
|
24
|
+
if (status) {
|
|
25
|
+
if (status == MANIFEST_STATUS.OPEN) {
|
|
26
|
+
//check if there is only one manifest is open, if yes update it to in queue and update current to open
|
|
27
|
+
|
|
28
|
+
let foundOpenOrder = await ManifestRepo.find({
|
|
29
|
+
where: { domain, shippingProvider, status: MANIFEST_STATUS.OPEN }
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
if (foundOpenOrder.length == 1) {
|
|
33
|
+
await ManifestRepo.update({ id: foundOpenOrder[0].id }, { status: MANIFEST_STATUS.IN_QUEUE })
|
|
34
|
+
} else if (foundOpenOrder.length > 1) {
|
|
35
|
+
let manifestNames = foundOpenOrder.map(itm => itm.name)
|
|
36
|
+
throw new Error(i18next.t('error.Manifest(s) (x) already in open status', { x: manifestNames.toString() }))
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await ManifestRepo.update({ id: manifestId }, { status })
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//remove orders from manifest
|
|
44
|
+
if (removeOrders?.length > 0) {
|
|
45
|
+
//check if user removing all tracking no, if yes then delete
|
|
46
|
+
let totalTrackingNo = await tx.getRepository(ReleaseGood).count({ where: { manifest: manifestId } })
|
|
47
|
+
await tx.getRepository(ReleaseGood).update({ domain, refNo: In(removeOrders) }, { manifest: null })
|
|
48
|
+
if (removeOrders.length == totalTrackingNo) {
|
|
49
|
+
await tx.getRepository(Manifest).delete(manifestId)
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return true
|
|
54
|
+
}
|
|
55
|
+
|
|
11
56
|
@Directive('@transaction')
|
|
12
57
|
@Mutation(returns => Boolean, { description: 'To delete Manifest' })
|
|
13
58
|
async deleteManifest(@Arg('name') name: string, @Ctx() context: any): Promise<boolean> {
|
|
@@ -64,6 +109,36 @@ export class ManifestMutation {
|
|
|
64
109
|
return true
|
|
65
110
|
}
|
|
66
111
|
|
|
112
|
+
@Directive('@transaction')
|
|
113
|
+
@Mutation(returns => Boolean, { description: 'To add tracking no into manifest' })
|
|
114
|
+
async addTrackingNo(
|
|
115
|
+
@Arg('manifestId', { nullable: true }) manifestId: string,
|
|
116
|
+
@Arg('trackingNo', { nullable: true }) trackingNo: string,
|
|
117
|
+
@Arg('shippingProvider', { nullable: true }) shippingProvider: string,
|
|
118
|
+
@Ctx() context: any
|
|
119
|
+
): Promise<boolean> {
|
|
120
|
+
const { domain, tx } = context.state
|
|
121
|
+
const releaseGoodRepo = tx.getRepository(ReleaseGood)
|
|
122
|
+
//check if order belongs to same shipping provider
|
|
123
|
+
let foundReleaseOrder = await releaseGoodRepo.findOne({ where: { trackingNo }, relations: ['manifest'] })
|
|
124
|
+
|
|
125
|
+
if (!foundReleaseOrder) {
|
|
126
|
+
throw new Error(i18next.t('error.release_order_not_found'))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (foundReleaseOrder.manifest) {
|
|
130
|
+
throw new Error(i18next.t('error.tracking_no_already_scanned_before'))
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (foundReleaseOrder.transporter !== shippingProvider) {
|
|
134
|
+
throw new Error(i18next.t('error.tracking_no_belongs_to_x', { x: foundReleaseOrder.transporter }))
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
await releaseGoodRepo.update({ id: foundReleaseOrder.id }, { manifest: manifestId })
|
|
138
|
+
|
|
139
|
+
return true
|
|
140
|
+
}
|
|
141
|
+
|
|
67
142
|
@Directive('@transaction')
|
|
68
143
|
@Mutation(returns => Manifest, { description: 'To dispatch Manifest when courier service collect packages' })
|
|
69
144
|
async dispatchManifest(
|
|
@@ -74,7 +149,7 @@ export class ManifestMutation {
|
|
|
74
149
|
const { domain, user, tx } = context.state
|
|
75
150
|
|
|
76
151
|
const manifest: Manifest = await tx.getRepository(Manifest).findOne({
|
|
77
|
-
where: { domain, name, status:
|
|
152
|
+
where: { domain, name, status: Not(MANIFEST_STATUS.CLOSED) }
|
|
78
153
|
})
|
|
79
154
|
if (!manifest) throw new Error(`Unable to find ${name}`)
|
|
80
155
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
-
import { getRepository } from 'typeorm'
|
|
2
|
+
import { getRepository, SelectQueryBuilder } from 'typeorm'
|
|
3
3
|
|
|
4
4
|
import { User } from '@things-factory/auth-base'
|
|
5
|
-
import { convertListParams, Domain, ListParam } from '@things-factory/shell'
|
|
5
|
+
import { convertListParams, Domain, ListParam, buildQuery, Sorting } from '@things-factory/shell'
|
|
6
6
|
|
|
7
7
|
import { ReleaseGood } from '../release-good/release-good'
|
|
8
8
|
import { Manifest } from './manifest'
|
|
@@ -11,11 +11,38 @@ import { ManifestList } from './manifest-type'
|
|
|
11
11
|
@Resolver(Manifest)
|
|
12
12
|
export class ManifestQuery {
|
|
13
13
|
@Query(returns => Manifest, { description: 'To fetch a Manifest' })
|
|
14
|
-
async manifest(
|
|
14
|
+
async manifest(
|
|
15
|
+
@Arg('name') name: string,
|
|
16
|
+
@Ctx() context: any,
|
|
17
|
+
@Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
|
|
18
|
+
): Promise<Manifest> {
|
|
19
|
+
const phoneSort = sortings.findIndex(sort => sort.name === 'phone')
|
|
20
|
+
if (phoneSort >= 0) {
|
|
21
|
+
sortings[phoneSort].name = 'phone1'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const deliveryAddressSort = sortings.findIndex(sort => sort.name === 'deliveryAddress')
|
|
25
|
+
if (deliveryAddressSort >= 0) {
|
|
26
|
+
sortings[deliveryAddressSort].name = 'deliveryAddress1'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const orderRemarkSort = sortings.findIndex(sort => sort.name === 'orderRemark')
|
|
30
|
+
if (orderRemarkSort >= 0) {
|
|
31
|
+
sortings[orderRemarkSort].name = 'remark'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const orderStatusSort = sortings.findIndex(sort => sort.name === 'orderStatus')
|
|
35
|
+
if (orderStatusSort >= 0) {
|
|
36
|
+
sortings[orderStatusSort].name = 'status'
|
|
37
|
+
}
|
|
38
|
+
const convertedParams = convertListParams({ sortings })
|
|
15
39
|
const { domain, tx } = context.state
|
|
16
40
|
const manifest: Manifest = await getRepository(Manifest).findOne({ where: { domain, name } })
|
|
17
41
|
|
|
18
|
-
const releaseGoods: ReleaseGood[] = await getRepository(ReleaseGood).find({
|
|
42
|
+
const releaseGoods: ReleaseGood[] = await getRepository(ReleaseGood).find({
|
|
43
|
+
...convertedParams,
|
|
44
|
+
where: { manifest }
|
|
45
|
+
})
|
|
19
46
|
|
|
20
47
|
const trackingNos: any[] = releaseGoods.map(releaseGood => {
|
|
21
48
|
return {
|
|
@@ -26,7 +53,9 @@ export class ManifestQuery {
|
|
|
26
53
|
postalCode: releaseGood.postalCode,
|
|
27
54
|
city: releaseGood.city,
|
|
28
55
|
phone: releaseGood.phone1,
|
|
29
|
-
dispatchmentStatus: releaseGood.dispatchmentStatus
|
|
56
|
+
dispatchmentStatus: releaseGood.dispatchmentStatus,
|
|
57
|
+
orderStatus: releaseGood.status,
|
|
58
|
+
orderRemark: releaseGood.remark
|
|
30
59
|
}
|
|
31
60
|
})
|
|
32
61
|
|
|
@@ -40,6 +69,22 @@ export class ManifestQuery {
|
|
|
40
69
|
async manifests(@Args() params: ListParam, @Ctx() context: any): Promise<ManifestList> {
|
|
41
70
|
const { domain } = context.state
|
|
42
71
|
|
|
72
|
+
let orderInfoFilter
|
|
73
|
+
const orderInfoParamIdx = params.filters.findIndex(param => param.name === 'orderInfo')
|
|
74
|
+
if (orderInfoParamIdx >= 0) {
|
|
75
|
+
orderInfoFilter = params.filters[orderInfoParamIdx].value.toLowerCase().split(',').join('|')
|
|
76
|
+
|
|
77
|
+
params.filters.splice(orderInfoParamIdx, 1)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let trackingNoFilter
|
|
81
|
+
const trackingNoParamIdx = params.filters.findIndex(param => param.name === 'trackingNo')
|
|
82
|
+
if (trackingNoParamIdx >= 0) {
|
|
83
|
+
trackingNoFilter = params.filters[trackingNoParamIdx].value
|
|
84
|
+
|
|
85
|
+
params.filters.splice(trackingNoParamIdx, 1)
|
|
86
|
+
}
|
|
87
|
+
|
|
43
88
|
const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
|
|
44
89
|
if (fromDateParamIdx >= 0) {
|
|
45
90
|
let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
|
|
@@ -66,19 +111,24 @@ export class ManifestQuery {
|
|
|
66
111
|
})
|
|
67
112
|
}
|
|
68
113
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
114
|
+
const qb: SelectQueryBuilder<Manifest> = getRepository(Manifest).createQueryBuilder('mf')
|
|
115
|
+
buildQuery(qb, params, context)
|
|
116
|
+
qb.innerJoin('release_goods', 'rg', 'rg.manifest_id = mf.id')
|
|
117
|
+
orderInfoFilter
|
|
118
|
+
? qb.andWhere(
|
|
119
|
+
'(rg.name ~* :orderInfoFilter or rg.ref_no ~* :orderInfoFilter or rg.ref_no_2 ~* :orderInfoFilter or rg.ref_no_3 ~* :orderInfoFilter)',
|
|
120
|
+
{ orderInfoFilter }
|
|
121
|
+
)
|
|
122
|
+
: ''
|
|
123
|
+
trackingNoFilter ? qb.andWhere('rg.tracking_no ilike :trackingNo', { trackingNo: trackingNoFilter }) : ''
|
|
124
|
+
|
|
125
|
+
const [items, total] = await qb.getManyAndCount()
|
|
126
|
+
|
|
127
|
+
await Promise.all(
|
|
128
|
+
items.map(async item => {
|
|
129
|
+
item.totalTrackingNo = await getRepository(ReleaseGood).count({ where: { manifest: item.id } })
|
|
130
|
+
})
|
|
131
|
+
)
|
|
82
132
|
return { items, total }
|
|
83
133
|
}
|
|
84
134
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Field, ID, ObjectType, registerEnumType } from 'type-graphql'
|
|
1
|
+
import { Field, ID, ObjectType, registerEnumType, Int } from 'type-graphql'
|
|
2
2
|
import {
|
|
3
3
|
Column,
|
|
4
4
|
CreateDateColumn,
|
|
@@ -21,7 +21,8 @@ const DATABASE_TYPE = ORMCONFIG.type
|
|
|
21
21
|
|
|
22
22
|
export enum ManifestStatus {
|
|
23
23
|
OPEN = 'OPEN',
|
|
24
|
-
CLOSED = 'CLOSED'
|
|
24
|
+
CLOSED = 'CLOSED',
|
|
25
|
+
IN_QUEUE = 'IN_QUEUE'
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
registerEnumType(ManifestStatus, {
|
|
@@ -80,6 +81,9 @@ export class Manifest {
|
|
|
80
81
|
@Field(type => [TrackingNo], { nullable: true })
|
|
81
82
|
trackingNos?: TrackingNo[]
|
|
82
83
|
|
|
84
|
+
@Field(type => Int, { nullable: true })
|
|
85
|
+
totalTrackingNo?: number
|
|
86
|
+
|
|
83
87
|
@CreateDateColumn()
|
|
84
88
|
@Field({ nullable: true })
|
|
85
89
|
createdAt?: Date
|
|
@@ -23,7 +23,8 @@ import {
|
|
|
23
23
|
ATTACHMENT_TYPE,
|
|
24
24
|
ORDER_NUMBER_RULE_TYPE,
|
|
25
25
|
ORDER_NUMBER_SETTING_KEY,
|
|
26
|
-
PURCHASE_ORDER_STATUS
|
|
26
|
+
PURCHASE_ORDER_STATUS,
|
|
27
|
+
ORDER_STATUS
|
|
27
28
|
} from '../../constants'
|
|
28
29
|
import { OrderNoGenerator } from '../../utils'
|
|
29
30
|
import {
|
|
@@ -109,12 +110,14 @@ export class PurchaseOrderMutation {
|
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
delete newGANOrder.id
|
|
113
|
+
//change gan status to intransit and call check arrived notice function right
|
|
114
|
+
newGANOrder.status = ORDER_STATUS.INTRANSIT
|
|
112
115
|
|
|
113
|
-
const createdGAN: ArrivalNotice = await generateArrivalNoticeFunction(null, newGANOrder, [], context, tx)
|
|
116
|
+
const createdGAN: ArrivalNotice = await generateArrivalNoticeFunction(null, newGANOrder, true, [], context, tx)
|
|
114
117
|
|
|
115
|
-
await confirmArrivalNoticeFunction(createdGAN.name, context, tx)
|
|
118
|
+
// await confirmArrivalNoticeFunction(createdGAN.name, context, tx)
|
|
116
119
|
|
|
117
|
-
await receiveArrivalNoticeFunction(null, createdGAN.name, context)
|
|
120
|
+
// await receiveArrivalNoticeFunction(null, createdGAN.name, context)
|
|
118
121
|
|
|
119
122
|
await checkArrivedNoticeFunction(createdGAN.name, context, tx)
|
|
120
123
|
|
|
@@ -264,7 +267,9 @@ export async function createPurchaseOrderFunction(
|
|
|
264
267
|
}
|
|
265
268
|
})
|
|
266
269
|
|
|
267
|
-
orderNo = poNoSetting
|
|
270
|
+
orderNo = poNoSetting
|
|
271
|
+
? await generateId({ domain, type: ORDER_NUMBER_RULE_TYPE.PO_NUMBER, seed: {} })
|
|
272
|
+
: OrderNoGenerator.purchaseOrder()
|
|
268
273
|
|
|
269
274
|
// // 1. Create purchase order
|
|
270
275
|
const createdPurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).save({
|
|
@@ -228,7 +228,7 @@ export class ReleaseGoodMutation {
|
|
|
228
228
|
|
|
229
229
|
releaseGood.shippingOrder = newShippingOrder
|
|
230
230
|
}
|
|
231
|
-
|
|
231
|
+
|
|
232
232
|
foundReleaseGood = await tx.getRepository(ReleaseGood).save({
|
|
233
233
|
...foundReleaseGood,
|
|
234
234
|
...releaseGood,
|
|
@@ -565,41 +565,33 @@ export async function generateReleaseGoodFunction(
|
|
|
565
565
|
ownTransport: releaseGood.ownTransport,
|
|
566
566
|
packingOption: releaseGood.packingOption,
|
|
567
567
|
marketplaceOrderStatus: releaseGood?.marketplaceOrderStatus || null,
|
|
568
|
-
billingAddress:
|
|
569
|
-
? releaseGood?.billingAddress || null
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
? releaseGood?.deliveryAddress1 || null
|
|
573
|
-
: shippingOrderInfo.deliveryAddress1 || null),
|
|
568
|
+
billingAddress:
|
|
569
|
+
releaseGood.type == 'b2c' ? releaseGood?.billingAddress || null : shippingOrderInfo.billingAddress || null,
|
|
570
|
+
deliveryAddress1:
|
|
571
|
+
releaseGood.type == 'b2c' ? releaseGood?.deliveryAddress1 || null : shippingOrderInfo.deliveryAddress1 || null,
|
|
574
572
|
deliveryAddress2: releaseGood?.deliveryAddress2 || null,
|
|
575
573
|
deliveryAddress3: releaseGood?.deliveryAddress3 || null,
|
|
576
574
|
deliveryAddress4: releaseGood?.deliveryAddress4 || null,
|
|
577
575
|
deliveryAddress5: releaseGood?.deliveryAddress5 || null,
|
|
578
|
-
attentionTo:
|
|
579
|
-
|
|
580
|
-
: shippingOrderInfo.
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
postalCode: (releaseGood.type == 'b2c' ? releaseGood?.postalCode || null : shippingOrderInfo.postalCode || null),
|
|
587
|
-
country: (releaseGood.type == 'b2c' ? releaseGood?.country || null : shippingOrderInfo.country || null),
|
|
588
|
-
phone1: (releaseGood.type == 'b2c' ? releaseGood?.phone1 || null : shippingOrderInfo.phone1 || null),
|
|
576
|
+
attentionTo: releaseGood.type == 'b2c' ? releaseGood?.attentionTo || null : shippingOrderInfo.attentionTo || null,
|
|
577
|
+
attentionCompany:
|
|
578
|
+
releaseGood.type == 'b2c' ? releaseGood?.companyName || null : shippingOrderInfo.attentionCompany || null,
|
|
579
|
+
city: releaseGood.type == 'b2c' ? releaseGood?.city || null : shippingOrderInfo.city || null,
|
|
580
|
+
state: releaseGood.type == 'b2c' ? releaseGood?.state || null : shippingOrderInfo.state || null,
|
|
581
|
+
postalCode: releaseGood.type == 'b2c' ? releaseGood?.postalCode || null : shippingOrderInfo.postalCode || null,
|
|
582
|
+
country: releaseGood.type == 'b2c' ? releaseGood?.country || null : shippingOrderInfo.country || null,
|
|
583
|
+
phone1: releaseGood.type == 'b2c' ? releaseGood?.phone1 || null : shippingOrderInfo.phone1 || null,
|
|
589
584
|
phone2: releaseGood?.phone2 || null,
|
|
590
585
|
email: releaseGood?.email || null,
|
|
591
|
-
billingCity:
|
|
592
|
-
|
|
593
|
-
: shippingOrderInfo.
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
: shippingOrderInfo.
|
|
600
|
-
billingState: (releaseGood.type == 'b2c'
|
|
601
|
-
? releaseGood?.billingState || null
|
|
602
|
-
: shippingOrderInfo.billingState || null),
|
|
586
|
+
billingCity: releaseGood.type == 'b2c' ? releaseGood?.billingCity || null : shippingOrderInfo.billingCity || null,
|
|
587
|
+
billingCountry:
|
|
588
|
+
releaseGood.type == 'b2c' ? releaseGood?.billingCountry || null : shippingOrderInfo.billingCountry || null,
|
|
589
|
+
billingPostalCode:
|
|
590
|
+
releaseGood.type == 'b2c'
|
|
591
|
+
? releaseGood?.billingPostalCode || null
|
|
592
|
+
: shippingOrderInfo.billingPostalCode || null,
|
|
593
|
+
billingState:
|
|
594
|
+
releaseGood.type == 'b2c' ? releaseGood?.billingState || null : shippingOrderInfo.billingState || null,
|
|
603
595
|
transporter: releaseGood?.transporter,
|
|
604
596
|
trackingNo: releaseGood?.trackingNo,
|
|
605
597
|
airwayBill: releaseGood?.airwayBill,
|
|
@@ -614,6 +606,7 @@ export async function generateReleaseGoodFunction(
|
|
|
614
606
|
orderInventories: releaseGood.orderInventories,
|
|
615
607
|
type: releaseGood?.type ? releaseGood.type : 'b2b',
|
|
616
608
|
status: ORDER_STATUS.PENDING,
|
|
609
|
+
packageId: releaseGood?.packageId,
|
|
617
610
|
storeName: releaseGood?.storeName,
|
|
618
611
|
storeId: releaseGood?.storeId,
|
|
619
612
|
routeId: releaseGood?.routeId,
|
|
@@ -62,52 +62,47 @@ export class ReleaseGoodQuery {
|
|
|
62
62
|
buildQuery(qb, params, context)
|
|
63
63
|
let items: any
|
|
64
64
|
let total: number
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
subQuery
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
)
|
|
65
|
+
qb.addSelect('COALESCE("cc".rank, 99999)', 'rank')
|
|
66
|
+
qb.leftJoinAndSelect('rg.domain', 'domain')
|
|
67
|
+
qb.leftJoinAndSelect('rg.bizplace', 'bizplace')
|
|
68
|
+
qb.leftJoinAndSelect('rg.orderInventories', 'oi')
|
|
69
|
+
qb.leftJoinAndSelect('rg.orderProducts', 'op')
|
|
70
|
+
qb.leftJoinAndSelect('oi.inventory', 'inv')
|
|
71
|
+
qb.leftJoinAndSelect('oi.product', 'prod')
|
|
72
|
+
qb.leftJoinAndSelect('rg.arrivalNotice', 'an')
|
|
73
|
+
qb.leftJoinAndSelect('rg.creator', 'creator')
|
|
74
|
+
qb.leftJoinAndSelect('rg.updater', 'updater')
|
|
75
|
+
qb.leftJoin(
|
|
76
|
+
subQuery => {
|
|
77
|
+
return subQuery
|
|
78
|
+
.select(`ccd.rank`, 'rank')
|
|
79
|
+
.addSelect(`ccd.name`, 'status')
|
|
80
|
+
.from(`common_code_details`, 'ccd')
|
|
81
|
+
.innerJoin(`ccd.commonCode`, 'cc')
|
|
82
|
+
.where(`ccd.domain_id = :domainId`, { domainId: domain.id })
|
|
83
|
+
.andWhere(`cc.name = 'RO_LIST_STATUS'`)
|
|
84
|
+
},
|
|
85
|
+
'cc',
|
|
86
|
+
'cc.status = rg.status'
|
|
87
|
+
)
|
|
89
88
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
const arrChildSortData = ['bizplace']
|
|
90
|
+
const sort = (params.sortings || []).reduce(
|
|
91
|
+
(acc, sort) => ({
|
|
92
|
+
...acc,
|
|
93
|
+
[arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'rg.' + sort.name]: sort.desc
|
|
94
|
+
? 'DESC'
|
|
95
|
+
: 'ASC'
|
|
96
|
+
}),
|
|
97
|
+
!params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
|
|
98
|
+
)
|
|
100
99
|
|
|
101
|
-
|
|
100
|
+
qb.orderBy(sort)
|
|
101
|
+
|
|
102
|
+
let [itemsRes, totalRes] = await qb.getManyAndCount()
|
|
103
|
+
items = itemsRes
|
|
104
|
+
total = totalRes
|
|
102
105
|
|
|
103
|
-
let [itemsRes, totalRes] = await qb.getManyAndCount()
|
|
104
|
-
items = itemsRes
|
|
105
|
-
total = totalRes
|
|
106
|
-
} else {
|
|
107
|
-
let itemsRes = await qb.getOne()
|
|
108
|
-
items = itemsRes ? [itemsRes] : []
|
|
109
|
-
total = items.length
|
|
110
|
-
}
|
|
111
106
|
return { items, total }
|
|
112
107
|
} catch (error) {
|
|
113
108
|
throw error
|
|
@@ -116,30 +111,51 @@ export class ReleaseGoodQuery {
|
|
|
116
111
|
|
|
117
112
|
@Directive('@privilege(category: "order", privilege: "query")')
|
|
118
113
|
@Query(returns => ReleaseGood)
|
|
119
|
-
async releaseGood(
|
|
114
|
+
async releaseGood(
|
|
115
|
+
@Ctx() context: any,
|
|
116
|
+
@Arg('name', { nullable: true }) name: string,
|
|
117
|
+
@Arg('trackingNo', { nullable: true }) trackingNo: string
|
|
118
|
+
): Promise<ReleaseGood> {
|
|
120
119
|
const { domain, user }: { domain: Domain; user: User } = context.state
|
|
121
120
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
121
|
+
if (name) {
|
|
122
|
+
return await getRepository(ReleaseGood).findOne({
|
|
123
|
+
where: {
|
|
124
|
+
domain,
|
|
125
|
+
name,
|
|
126
|
+
bizplace: In(await getPermittedBizplaceIds(domain, user))
|
|
127
|
+
},
|
|
128
|
+
relations: [
|
|
129
|
+
'domain',
|
|
130
|
+
'bizplace',
|
|
131
|
+
'shippingOrder',
|
|
132
|
+
'arrivalNotice',
|
|
133
|
+
'orderInventories',
|
|
134
|
+
'orderInventories.product',
|
|
135
|
+
'orderInventories.inventory',
|
|
136
|
+
'orderInventories.inventory.product',
|
|
137
|
+
'orderVass',
|
|
138
|
+
'orderVass.vas',
|
|
139
|
+
'creator',
|
|
140
|
+
'updater'
|
|
141
|
+
]
|
|
142
|
+
})
|
|
143
|
+
} else if (trackingNo) {
|
|
144
|
+
let releaseGood = await getRepository(ReleaseGood).findOne({
|
|
145
|
+
where: {
|
|
146
|
+
domain,
|
|
147
|
+
trackingNo,
|
|
148
|
+
bizplace: In(await getPermittedBizplaceIds(domain, user))
|
|
149
|
+
},
|
|
150
|
+
relations: ['bizplace']
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
if (!releaseGood) {
|
|
154
|
+
throw new Error('Tracking No not found in any orders')
|
|
155
|
+
} else {
|
|
156
|
+
return releaseGood
|
|
157
|
+
}
|
|
158
|
+
}
|
|
143
159
|
}
|
|
144
160
|
|
|
145
161
|
@Directive('@privilege(category: "order", privilege: "query")')
|
package/translations/en.json
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
+
"error.Manifest(s) (x) already in open status": "Manifest(s) ({x}) already in open status",
|
|
3
|
+
"error.release_order_not_found": "release order not found",
|
|
4
|
+
"error.tracking_no_already_scanned_before": "tracking no already scanned before",
|
|
5
|
+
"error.tracking_no_belongs_to_x": "tracking no belongs to {x}",
|
|
2
6
|
"field.customer": "customer",
|
|
3
7
|
"field.issued_on": "issued on",
|
|
4
8
|
"field.payment_due": "payment due",
|
package/translations/ko.json
CHANGED
|
@@ -16,5 +16,9 @@
|
|
|
16
16
|
"field.options": "옵션",
|
|
17
17
|
"field.unit": "단위",
|
|
18
18
|
"field.start_at": "시작 시간",
|
|
19
|
-
"field.end_at": "완료 시간"
|
|
20
|
-
}
|
|
19
|
+
"field.end_at": "완료 시간",
|
|
20
|
+
"error.Manifest(s) (x) already in open status": "[ko] Manifest(s) ({x}) already in open status",
|
|
21
|
+
"error.release_order_not_found": "[ko] release order not found",
|
|
22
|
+
"error.tracking_no_belongs_to_x": "[ko] tracking no belongs to {x}",
|
|
23
|
+
"error.tracking_no_already_scanned_before": "[ko] tracking no already scanned before"
|
|
24
|
+
}
|
package/translations/ms.json
CHANGED
|
@@ -16,5 +16,9 @@
|
|
|
16
16
|
"field.options": "pilihan-pilihan",
|
|
17
17
|
"field.unit": "unit",
|
|
18
18
|
"field.start_at": "bermula pada",
|
|
19
|
-
"field.end_at": "berakhir pada"
|
|
19
|
+
"field.end_at": "berakhir pada",
|
|
20
|
+
"error.Manifest(s) (x) already in open status": "[ms] Manifest(s) ({x}) already in open status",
|
|
21
|
+
"error.release_order_not_found": "[ms] release order not found",
|
|
22
|
+
"error.tracking_no_belongs_to_x": "[ms] tracking no belongs to {x}",
|
|
23
|
+
"error.tracking_no_already_scanned_before": "[ms] tracking no already scanned before"
|
|
20
24
|
}
|