@things-factory/sales-base 4.0.7 → 4.0.12
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 +9 -1
- package/dist-server/constants/order.js.map +1 -1
- package/dist-server/constants/validation-error-code.js +2 -1
- package/dist-server/constants/validation-error-code.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +3 -3
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js +21 -0
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-query.js +74 -76
- package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order-query.js +21 -5
- package/dist-server/service/delivery-order/delivery-order-query.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note-query.js +93 -43
- package/dist-server/service/goods-receival-note/goods-receival-note-query.js.map +1 -1
- package/dist-server/service/index.js +4 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/manifest/index.js +9 -0
- package/dist-server/service/manifest/index.js.map +1 -0
- package/dist-server/service/manifest/manifest-mutation.js +120 -0
- package/dist-server/service/manifest/manifest-mutation.js.map +1 -0
- package/dist-server/service/manifest/manifest-query.js +87 -0
- package/dist-server/service/manifest/manifest-query.js.map +1 -0
- package/dist-server/service/manifest/manifest-type.js +85 -0
- package/dist-server/service/manifest/manifest-type.js.map +1 -0
- package/dist-server/service/manifest/manifest.js +117 -0
- package/dist-server/service/manifest/manifest.js.map +1 -0
- package/dist-server/service/order-inventory/order-inventory-mutation.js +24 -0
- package/dist-server/service/order-inventory/order-inventory-mutation.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory-query.js +20 -19
- package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory-types.js +17 -13
- package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory.js +24 -2
- package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
- package/dist-server/service/others/other-query.js +1 -0
- package/dist-server/service/others/other-query.js.map +1 -1
- package/dist-server/service/release-good/release-good-mutation.js +33 -0
- package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
- package/dist-server/service/release-good/release-good.js +28 -1
- package/dist-server/service/release-good/release-good.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js +56 -23
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js +76 -15
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js.map +1 -1
- package/dist-server/utils/inventory-util.js +26 -7
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/dist-server/utils/order-no-generator.js +35 -31
- package/dist-server/utils/order-no-generator.js.map +1 -1
- package/package.json +12 -12
- package/server/constants/index.ts +1 -1
- package/server/constants/order.ts +10 -0
- package/server/constants/validation-error-code.ts +3 -2
- package/server/controllers/ecommerce/sellercraft-controller.ts +4 -3
- package/server/service/arrival-notice/arrival-notice-mutation.ts +20 -0
- package/server/service/arrival-notice/arrival-notice-query.ts +82 -76
- package/server/service/delivery-order/delivery-order-query.ts +26 -7
- package/server/service/goods-receival-note/goods-receival-note-query.ts +116 -53
- package/server/service/index.ts +4 -0
- package/server/service/manifest/index.ts +6 -0
- package/server/service/manifest/manifest-mutation.ts +112 -0
- package/server/service/manifest/manifest-query.ts +43 -0
- package/server/service/manifest/manifest-type.ts +51 -0
- package/server/service/manifest/manifest.ts +98 -0
- package/server/service/order-inventory/order-inventory-mutation.ts +26 -1
- package/server/service/order-inventory/order-inventory-query.ts +17 -18
- package/server/service/order-inventory/order-inventory-types.ts +15 -10
- package/server/service/order-inventory/order-inventory.ts +24 -5
- package/server/service/others/other-query.ts +2 -6
- package/server/service/release-good/release-good-mutation.ts +45 -0
- package/server/service/release-good/release-good.ts +26 -0
- package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +76 -27
- package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +85 -17
- package/server/utils/inventory-util.ts +30 -7
- package/server/utils/order-no-generator.ts +43 -36
- package/dist-server/middlewares/index.js +0 -1
- package/dist-server/middlewares/index.js.map +0 -1
- package/server/middlewares/index.ts +0 -0
|
@@ -4,10 +4,12 @@ import { getRepository, In, SelectQueryBuilder } from 'typeorm'
|
|
|
4
4
|
import { Attachment } from '@things-factory/attachment-base'
|
|
5
5
|
import { User } from '@things-factory/auth-base'
|
|
6
6
|
import { Bizplace, getPermittedBizplaceIds } from '@things-factory/biz-base'
|
|
7
|
+
import { ProductDetail } from '@things-factory/product-base'
|
|
7
8
|
import { buildQuery, Domain, ListParam } from '@things-factory/shell'
|
|
8
9
|
|
|
9
10
|
import { ArrivalNoticeList } from '../'
|
|
10
11
|
import { ATTACHMENT_TYPE, ORDER_STATUS } from '../../constants'
|
|
12
|
+
import { OrderInventory, OrderProduct } from '../../service'
|
|
11
13
|
import { ArrivalNotice } from './arrival-notice'
|
|
12
14
|
|
|
13
15
|
@Resolver(ArrivalNotice)
|
|
@@ -21,89 +23,93 @@ export class ArrivalNoticeQuery {
|
|
|
21
23
|
): Promise<ArrivalNotice> {
|
|
22
24
|
const { domain, user, bizplace }: { domain: Domain; user: User; bizplace: Bizplace } = context.state
|
|
23
25
|
|
|
24
|
-
let
|
|
25
|
-
|
|
26
|
-
if (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
]
|
|
53
|
-
})
|
|
54
|
-
} else {
|
|
55
|
-
let param: any
|
|
56
|
-
|
|
57
|
-
if (name) param = { domain, name, bizplace: In(await getPermittedBizplaceIds(domain, user)) }
|
|
58
|
-
else param = { domain, refNo, bizplace: In(await getPermittedBizplaceIds(domain, user)) }
|
|
59
|
-
|
|
60
|
-
foundGAN = await getRepository(ArrivalNotice).findOne({
|
|
61
|
-
where: { ...param },
|
|
62
|
-
relations: [
|
|
63
|
-
'domain',
|
|
64
|
-
'bizplace',
|
|
65
|
-
'releaseGood',
|
|
66
|
-
'purchaseOrder',
|
|
67
|
-
'purchaseOrder.bufferLocation',
|
|
68
|
-
'orderProducts',
|
|
69
|
-
'orderProducts.product',
|
|
70
|
-
'orderInventories',
|
|
71
|
-
'orderInventories.inventory',
|
|
72
|
-
'orderInventories.inventory.product',
|
|
73
|
-
'orderInventories.inventory.location',
|
|
74
|
-
'orderVass',
|
|
75
|
-
'orderVass.vas',
|
|
76
|
-
'orderVass.targetProduct',
|
|
77
|
-
'creator',
|
|
78
|
-
'updater'
|
|
79
|
-
]
|
|
80
|
-
})
|
|
81
|
-
}
|
|
26
|
+
let param: any = { domain, bizplace: bizplace ? bizplace : In(await getPermittedBizplaceIds(domain, user)) }
|
|
27
|
+
|
|
28
|
+
if (name) param = { ...param, name }
|
|
29
|
+
else if (refNo) param = { ...param, refNo }
|
|
30
|
+
else return
|
|
31
|
+
|
|
32
|
+
let foundGAN: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
|
|
33
|
+
where: { ...param },
|
|
34
|
+
relations: [
|
|
35
|
+
'domain',
|
|
36
|
+
'bizplace',
|
|
37
|
+
'releaseGood',
|
|
38
|
+
'purchaseOrder',
|
|
39
|
+
'purchaseOrder.bufferLocation',
|
|
40
|
+
'orderProducts',
|
|
41
|
+
'orderProducts.product',
|
|
42
|
+
'orderInventories',
|
|
43
|
+
'orderInventories.inventory',
|
|
44
|
+
'orderInventories.inventory.product',
|
|
45
|
+
'orderInventories.inventory.location',
|
|
46
|
+
'orderVass',
|
|
47
|
+
'orderVass.vas',
|
|
48
|
+
'orderVass.targetProduct',
|
|
49
|
+
'supplier',
|
|
50
|
+
'creator',
|
|
51
|
+
'updater'
|
|
52
|
+
]
|
|
53
|
+
})
|
|
82
54
|
|
|
83
55
|
if (name && !foundGAN) throw new Error(`Failed to find arrival notice with ${name}`)
|
|
84
56
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
57
|
+
if (foundGAN) {
|
|
58
|
+
const foundAttachments: Attachment[] = await getRepository(Attachment).find({
|
|
59
|
+
where: {
|
|
60
|
+
domain,
|
|
61
|
+
refBy: foundGAN?.id,
|
|
62
|
+
category: ATTACHMENT_TYPE.GAN
|
|
63
|
+
}
|
|
64
|
+
})
|
|
92
65
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
66
|
+
const foundPOAttachments: Attachment[] = foundGAN?.purchaseOrder?.id
|
|
67
|
+
? await getRepository(Attachment).find({
|
|
68
|
+
where: {
|
|
69
|
+
domain,
|
|
70
|
+
refBy: foundGAN.purchaseOrder?.id,
|
|
71
|
+
category: ATTACHMENT_TYPE.PO
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
: []
|
|
75
|
+
|
|
76
|
+
// add productDetails data to orderProduct.product
|
|
77
|
+
foundGAN.orderProducts = await Promise.all(
|
|
78
|
+
foundGAN.orderProducts.map(async (orderProduct: OrderProduct) => {
|
|
79
|
+
orderProduct.product['productDetails'] = await getRepository(ProductDetail).find({
|
|
80
|
+
where: {
|
|
81
|
+
product: orderProduct.product.id,
|
|
82
|
+
packingType: orderProduct.packingType,
|
|
83
|
+
packingSize: orderProduct.packingSize
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
return orderProduct
|
|
100
87
|
})
|
|
101
|
-
|
|
88
|
+
)
|
|
102
89
|
|
|
103
|
-
|
|
104
|
-
|
|
90
|
+
// add productDetails data to orderInventory.inventory.product if orderInventory is exist
|
|
91
|
+
if (foundGAN.orderInventories && foundGAN.orderInventories.length) {
|
|
92
|
+
foundGAN.orderInventories = await Promise.all(
|
|
93
|
+
foundGAN.orderInventories.map(async (orderInventory: OrderInventory) => {
|
|
94
|
+
orderInventory.inventory.product['productDetails'] = await getRepository(ProductDetail).find({
|
|
95
|
+
where: {
|
|
96
|
+
product: orderInventory.inventory.product.id,
|
|
97
|
+
packingType: orderInventory.inventory.packingType,
|
|
98
|
+
packingSize: orderInventory.inventory.packingSize
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
return orderInventory
|
|
102
|
+
})
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
return {
|
|
107
|
+
...foundGAN,
|
|
108
|
+
attachment: [...foundPOAttachments, ...foundAttachments]
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
107
113
|
}
|
|
108
114
|
|
|
109
115
|
@Directive('@privilege(category: "order_customer", privilege: "query")')
|
|
@@ -86,12 +86,18 @@ export class DeliveryOrderQuery {
|
|
|
86
86
|
})
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
let refNoFilter = params.filters.find(x => x.name == 'refNo')
|
|
90
|
+
let refNo2Filter = params.filters.find(x => x.name == 'refNo2')
|
|
91
|
+
let refNo3Filter = params.filters.find(x => x.name == 'refNo3')
|
|
92
|
+
|
|
93
|
+
params.filters = params.filters.filter(x => x.name != 'refNo' && x.name != 'refNo2' && x.name != 'refNo3')
|
|
94
|
+
|
|
89
95
|
const qb: any = getRepository(DeliveryOrder).createQueryBuilder('do')
|
|
90
96
|
buildQuery(qb, params, context)
|
|
91
97
|
qb.addSelect('COALESCE("cc".rank, 99999)', 'rank')
|
|
92
98
|
qb.leftJoinAndSelect('do.domain', 'domain')
|
|
93
99
|
qb.leftJoinAndSelect('do.bizplace', 'bizplace')
|
|
94
|
-
qb.leftJoinAndSelect('do.releaseGood', '
|
|
100
|
+
qb.leftJoinAndSelect('do.releaseGood', 'releaseGood')
|
|
95
101
|
qb.leftJoinAndSelect('do.transportDriver', 'td')
|
|
96
102
|
qb.leftJoinAndSelect('do.transportVehicle', 'th')
|
|
97
103
|
qb.leftJoinAndSelect('do.orderInventories', 'oi')
|
|
@@ -113,20 +119,33 @@ export class DeliveryOrderQuery {
|
|
|
113
119
|
'cc.status = do.status'
|
|
114
120
|
)
|
|
115
121
|
|
|
116
|
-
|
|
122
|
+
if (refNoFilter?.value) {
|
|
123
|
+
qb.andWhere('releaseGood.ref_no ilike :refNo', { refNo: refNoFilter.value })
|
|
124
|
+
}
|
|
125
|
+
if (refNo2Filter?.value) {
|
|
126
|
+
qb.andWhere('releaseGood.ref_no_2 ilike :refNo2', { refNo2: refNo2Filter.value })
|
|
127
|
+
}
|
|
128
|
+
if (refNo3Filter?.value) {
|
|
129
|
+
qb.andWhere('releaseGood.ref_no_3 ilike :refNo3', { refNo3: refNo3Filter.value })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const arrChildSortData = ['refNo', 'refNo2', 'refNo3']
|
|
133
|
+
const arrNameSortData = ['bizplace', 'releaseGood', 'updater']
|
|
117
134
|
const sort = (params.sortings || []).reduce(
|
|
118
135
|
(acc, sort) => ({
|
|
119
136
|
...acc,
|
|
120
|
-
[arrChildSortData.indexOf(sort.name) >= 0
|
|
121
|
-
? '
|
|
122
|
-
:
|
|
137
|
+
[arrChildSortData.indexOf(sort.name) >= 0
|
|
138
|
+
? 'releaseGood.' + sort.name
|
|
139
|
+
: arrNameSortData.indexOf(sort.name) >= 0
|
|
140
|
+
? sort.name + '.name'
|
|
141
|
+
: 'do.' + sort.name]: sort.desc ? 'DESC' : 'ASC'
|
|
123
142
|
}),
|
|
124
|
-
|
|
143
|
+
params.sortings.length < 1 ? { rank: 'ASC', 'do.createdAt': 'DESC' } : {}
|
|
125
144
|
)
|
|
126
145
|
|
|
127
146
|
qb.orderBy(sort)
|
|
128
|
-
const [items, total] = await qb.getManyAndCount()
|
|
129
147
|
|
|
148
|
+
const [items, total] = await qb.getManyAndCount()
|
|
130
149
|
return { items, total }
|
|
131
150
|
} catch (error) {
|
|
132
151
|
debug('deliveryOrders', error.toString())
|
|
@@ -1,73 +1,136 @@
|
|
|
1
|
+
import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
+
import { getRepository, SelectQueryBuilder } from 'typeorm'
|
|
3
|
+
|
|
1
4
|
import { User } from '@things-factory/auth-base'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
import { ArrivalNotice, GoodsReceivalNoteList } from '../'
|
|
5
|
+
import { getPermittedBizplaceIds } from '@things-factory/biz-base'
|
|
6
|
+
import { buildQuery, Domain, ListParam } from '@things-factory/shell'
|
|
7
|
+
|
|
8
|
+
import { GoodsReceivalNoteList } from '../'
|
|
7
9
|
import { GoodsReceivalNote } from './goods-receival-note'
|
|
8
10
|
|
|
9
11
|
@Resolver(GoodsReceivalNote)
|
|
10
12
|
export class GoodsReceivalNoteQuery {
|
|
11
13
|
@Query(returns => GoodsReceivalNoteList)
|
|
12
|
-
async goodsReceivalNotes(
|
|
13
|
-
@Ctx() context: any,
|
|
14
|
-
@Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
|
|
15
|
-
@Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
|
|
16
|
-
@Arg('sortings', type => [Sorting], { nullable: true }) sortings?: [Sorting]
|
|
17
|
-
): Promise<GoodsReceivalNoteList> {
|
|
14
|
+
async goodsReceivalNotes(@Ctx() context: any, @Args() params: ListParam): Promise<GoodsReceivalNoteList> {
|
|
18
15
|
const { domain, user }: { domain: Domain; user: User } = context.state
|
|
19
16
|
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
|
|
18
|
+
if (fromDateParamIdx >= 0) {
|
|
19
|
+
let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
|
|
20
|
+
params.filters.splice(fromDateParamIdx, 1)
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
22
|
+
params.filters.push({
|
|
23
|
+
name: 'createdAt',
|
|
24
|
+
operator: 'gte',
|
|
25
|
+
value: fromDateVal.toISOString(),
|
|
26
|
+
relation: false
|
|
31
27
|
})
|
|
32
|
-
|
|
33
|
-
// remove non-column params
|
|
34
|
-
delete convertedParams.where.bizplaceName
|
|
35
|
-
|
|
36
|
-
if (foundBizplaces && foundBizplaces.length) {
|
|
37
|
-
convertedParams.where.bizplace = In(foundBizplaces.map((foundBizplace: Bizplace) => foundBizplace.id))
|
|
38
|
-
} else {
|
|
39
|
-
convertedParams.where.bizplace = IsNull()
|
|
40
|
-
}
|
|
41
|
-
} else {
|
|
42
|
-
convertedParams.where.bizplace = In(await getPermittedBizplaceIds(domain, user))
|
|
43
|
-
convertedParams.where.domain = domain
|
|
44
28
|
}
|
|
45
29
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
30
|
+
const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
|
|
31
|
+
if (toDateParamIdx >= 0) {
|
|
32
|
+
let toDateVal = new Date(params.filters[toDateParamIdx].value)
|
|
33
|
+
params.filters.splice(toDateParamIdx, 1)
|
|
34
|
+
|
|
35
|
+
params.filters.push({
|
|
36
|
+
name: 'createdAt',
|
|
37
|
+
operator: 'lt',
|
|
38
|
+
value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
|
|
39
|
+
relation: false
|
|
54
40
|
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let refNoFilter = params.filters.find(x => x.name == 'refNo')
|
|
44
|
+
let refNo2Filter = params.filters.find(x => x.name == 'refNo2')
|
|
45
|
+
let refNo3Filter = params.filters.find(x => x.name == 'refNo3')
|
|
46
|
+
let ganNameFilter = params.filters.find(x => x.name == 'arrivalNoticeNo')
|
|
47
|
+
let bizplaceFilter = params.filters.find(x => x.name == 'bizplaceName')
|
|
48
|
+
let ganStatusFilter = params.filters.find(x => x.name == 'ganStatus')
|
|
49
|
+
let grnStatusFilter = params.filters.find(x => x.name == 'grnStatus')
|
|
50
|
+
|
|
51
|
+
params.filters = params.filters.filter(
|
|
52
|
+
x =>
|
|
53
|
+
x.name != 'refNo' &&
|
|
54
|
+
x.name != 'refNo2' &&
|
|
55
|
+
x.name != 'refNo3' &&
|
|
56
|
+
x.name != 'arrivalNoticeNo' &&
|
|
57
|
+
x.name != 'bizplaceName' &&
|
|
58
|
+
x.name != 'ganStatus' &&
|
|
59
|
+
x.name != 'grnStatus'
|
|
60
|
+
)
|
|
55
61
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
62
|
+
const qb: SelectQueryBuilder<GoodsReceivalNote> = getRepository(GoodsReceivalNote).createQueryBuilder('grn')
|
|
63
|
+
buildQuery(qb, params, context)
|
|
64
|
+
qb.addSelect('COALESCE("cc".rank, 9999)', 'rank')
|
|
65
|
+
qb.leftJoinAndSelect('grn.domain', 'domain')
|
|
66
|
+
qb.leftJoinAndSelect('grn.bizplace', 'bizplace')
|
|
67
|
+
qb.leftJoinAndSelect('grn.creator', 'creator')
|
|
68
|
+
qb.leftJoinAndSelect('grn.updater', 'updater')
|
|
69
|
+
qb.innerJoinAndSelect('grn.arrivalNotice', 'arrivalNotice')
|
|
70
|
+
qb.leftJoin(
|
|
71
|
+
subQuery => {
|
|
72
|
+
return subQuery
|
|
73
|
+
.select(`ccd.rank`, 'rank')
|
|
74
|
+
.addSelect(`ccd.name`, 'status')
|
|
75
|
+
.from(`common_code_details`, 'ccd')
|
|
76
|
+
.innerJoin(`ccd.commonCode`, 'cc')
|
|
77
|
+
.where(`ccd.domain_id = :domainId`, { domainId: domain.id })
|
|
78
|
+
.andWhere(`cc.name = 'GRN_STATUS'`)
|
|
79
|
+
.andWhere(`cc.name = 'GAN_REQUESTS_STATUS'`)
|
|
80
|
+
},
|
|
81
|
+
'cc',
|
|
82
|
+
'cc.status = arrivalNotice.status'
|
|
83
|
+
)
|
|
59
84
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
85
|
+
let permittedBizplaceIds = await getPermittedBizplaceIds(domain, user)
|
|
86
|
+
qb.andWhere('grn.bizplace_id IN (:...bizplaceIds)', { bizplaceIds: permittedBizplaceIds })
|
|
87
|
+
|
|
88
|
+
if (refNoFilter?.value) {
|
|
89
|
+
qb.andWhere('arrivalNotice.ref_no ilike :refNo', { refNo: refNoFilter.value })
|
|
90
|
+
}
|
|
91
|
+
if (refNo2Filter?.value) {
|
|
92
|
+
qb.andWhere('arrivalNotice.ref_no_2 ilike :refNo2', { refNo2: refNo2Filter.value })
|
|
93
|
+
}
|
|
94
|
+
if (refNo3Filter?.value) {
|
|
95
|
+
qb.andWhere('arrivalNotice.ref_no_3 ilike :refNo3', { refNo3: refNo3Filter.value })
|
|
96
|
+
}
|
|
97
|
+
if (ganNameFilter?.value) {
|
|
98
|
+
qb.andWhere('arrivalNotice.name ilike :ganName', { ganName: ganNameFilter.value })
|
|
99
|
+
}
|
|
100
|
+
if (bizplaceFilter?.value) {
|
|
101
|
+
qb.andWhere('bizplace.name ilike :bizName', { bizName: bizplaceFilter.value })
|
|
65
102
|
}
|
|
66
103
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
104
|
+
if (ganStatusFilter?.value) {
|
|
105
|
+
qb.andWhere('arrivalNotice.status ilike :ganStatus', { ganStatus: ganStatusFilter.value })
|
|
106
|
+
}
|
|
107
|
+
if (grnStatusFilter?.value) {
|
|
108
|
+
qb.andWhere('grn.status ilike :grnStatus', { grnStatus: grnStatusFilter.value })
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const arrChildSortData = ['refNo', 'refNo2', 'refNo3']
|
|
112
|
+
const arrNameSortData = ['bizplace', 'arrivalNotice', 'updater']
|
|
113
|
+
const arrGanStatusSortData = ['ganStatus']
|
|
114
|
+
const arrGrnStatuSortData = ['status']
|
|
115
|
+
const sort = (params.sortings || []).reduce(
|
|
116
|
+
(acc, sort) => ({
|
|
117
|
+
...acc,
|
|
118
|
+
[arrChildSortData.indexOf(sort.name) >= 0
|
|
119
|
+
? 'arrivalNotice.' + sort.name
|
|
120
|
+
: arrNameSortData.indexOf(sort.name) >= 0
|
|
121
|
+
? sort.name + '.name'
|
|
122
|
+
: arrGanStatusSortData.indexOf(sort.name) >= 0
|
|
123
|
+
? 'arrivalNotice.status'
|
|
124
|
+
: arrGrnStatuSortData.indexOf(sort.name) >= 0
|
|
125
|
+
? 'grn.status'
|
|
126
|
+
: 'grn.' + sort.name]: sort.desc ? 'DESC' : 'ASC'
|
|
127
|
+
}),
|
|
128
|
+
!params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
qb.orderBy(sort)
|
|
132
|
+
|
|
133
|
+
const [items, total] = await qb.getManyAndCount()
|
|
71
134
|
|
|
72
135
|
return { items, total }
|
|
73
136
|
}
|
package/server/service/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* IMPORT ENTITIES AND RESOLVERS */
|
|
2
|
+
import { entities as ManifestEntities, resolvers as ManifestResolvers } from './manifest'
|
|
2
3
|
import {
|
|
3
4
|
entities as ReverseKittingOrderInventoryEntities,
|
|
4
5
|
resolvers as ReverseKittingOrderInventoryResolvers
|
|
@@ -38,6 +39,7 @@ import { entities as VasEntity, resolvers as VasResolvers } from './vas'
|
|
|
38
39
|
import { entities as VasOrderEntity, resolvers as VasOrderResolvers } from './vas-order'
|
|
39
40
|
|
|
40
41
|
/* EXPORT ENTITY TYPES */
|
|
42
|
+
export * from './manifest/manifest'
|
|
41
43
|
export * from './reverse-kitting-order-inventory/reverse-kitting-order-inventory'
|
|
42
44
|
export * from './reverse-kitting-order/reverse-kitting-order'
|
|
43
45
|
export * from './arrival-notice/arrival-notice'
|
|
@@ -139,6 +141,7 @@ export * from './vas/vas-query'
|
|
|
139
141
|
|
|
140
142
|
export const entities = [
|
|
141
143
|
/* ENTITIES */
|
|
144
|
+
...ManifestEntities,
|
|
142
145
|
...ReverseKittingOrderInventoryEntities,
|
|
143
146
|
...ReverseKittingOrderEntities,
|
|
144
147
|
...ArrivalNoticeEntity,
|
|
@@ -168,6 +171,7 @@ export const entities = [
|
|
|
168
171
|
export const schema = {
|
|
169
172
|
resolverClasses: [
|
|
170
173
|
/* RESOLVER CLASSES */
|
|
174
|
+
...ManifestResolvers,
|
|
171
175
|
...ReverseKittingOrderInventoryResolvers,
|
|
172
176
|
...ReverseKittingOrderResolvers,
|
|
173
177
|
...ArrivalNoticeResolvers,
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
|
+
import { getRepository, In } from 'typeorm'
|
|
3
|
+
import { Manifest } from './manifest'
|
|
4
|
+
import { NewManifest, ManifestPatch } from './manifest-type'
|
|
5
|
+
|
|
6
|
+
@Resolver(Manifest)
|
|
7
|
+
export class ManifestMutation {
|
|
8
|
+
@Directive('@transaction')
|
|
9
|
+
@Mutation(returns => Manifest, { description: 'To create new Manifest' })
|
|
10
|
+
async createManifest(@Arg('manifest') manifest: NewManifest, @Ctx() context: any): Promise<Manifest> {
|
|
11
|
+
const { domain, user, tx } = context.state
|
|
12
|
+
|
|
13
|
+
return await tx.getRepository(Manifest).save({
|
|
14
|
+
...manifest,
|
|
15
|
+
domain,
|
|
16
|
+
creator: user,
|
|
17
|
+
updater: user
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Directive('@transaction')
|
|
22
|
+
@Mutation(returns => Manifest, { description: 'To modify Manifest information' })
|
|
23
|
+
async updateManifest(
|
|
24
|
+
@Arg('id') id: string,
|
|
25
|
+
@Arg('patch') patch: ManifestPatch,
|
|
26
|
+
@Ctx() context: any
|
|
27
|
+
): Promise<Manifest> {
|
|
28
|
+
const { domain, user, tx } = context.state
|
|
29
|
+
|
|
30
|
+
const repository = tx.getRepository(Manifest)
|
|
31
|
+
const manifest = await repository.findOne({
|
|
32
|
+
where: { domain, id }
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return await repository.save({
|
|
36
|
+
...manifest,
|
|
37
|
+
...patch,
|
|
38
|
+
updater: user
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Directive('@transaction')
|
|
43
|
+
@Mutation(returns => [Manifest], { description: "To modify multiple Manifests' information" })
|
|
44
|
+
async updateMultipleManifest(
|
|
45
|
+
@Arg('patches', type => [ManifestPatch]) patches: ManifestPatch[],
|
|
46
|
+
@Ctx() context: any
|
|
47
|
+
): Promise<Manifest[]> {
|
|
48
|
+
const { domain, user, tx } = context.state
|
|
49
|
+
|
|
50
|
+
let results = []
|
|
51
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
52
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
53
|
+
const manifestRepo = tx.getRepository(Manifest)
|
|
54
|
+
|
|
55
|
+
if (_createRecords.length > 0) {
|
|
56
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
57
|
+
const newRecord = _createRecords[i]
|
|
58
|
+
|
|
59
|
+
const result = await manifestRepo.save({
|
|
60
|
+
...newRecord,
|
|
61
|
+
domain,
|
|
62
|
+
creator: user,
|
|
63
|
+
updater: user
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
results.push({ ...result, cuFlag: '+' })
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (_updateRecords.length > 0) {
|
|
71
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
72
|
+
const newRecord = _updateRecords[i]
|
|
73
|
+
const manifest = await manifestRepo.findOne(newRecord.id)
|
|
74
|
+
|
|
75
|
+
const result = await manifestRepo.save({
|
|
76
|
+
...manifest,
|
|
77
|
+
...newRecord,
|
|
78
|
+
updater: user
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
results.push({ ...result, cuFlag: 'M' })
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return results
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Directive('@transaction')
|
|
89
|
+
@Mutation(returns => Boolean, { description: 'To delete Manifest' })
|
|
90
|
+
async deleteManifest(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
|
|
91
|
+
const { domain, tx } = context.state
|
|
92
|
+
|
|
93
|
+
await tx.getRepository(Manifest).delete({ domain, id })
|
|
94
|
+
return true
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@Directive('@transaction')
|
|
98
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple manifests' })
|
|
99
|
+
async deleteManifests(
|
|
100
|
+
@Arg('ids', type => [String]) ids: string[],
|
|
101
|
+
@Ctx() context: any
|
|
102
|
+
): Promise<boolean> {
|
|
103
|
+
const { domain, tx } = context.state
|
|
104
|
+
|
|
105
|
+
await tx.getRepository(Manifest).delete({
|
|
106
|
+
domain,
|
|
107
|
+
id: In(ids)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
return true
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
|
+
import { getRepository } from 'typeorm'
|
|
3
|
+
import { Domain, ListParam, convertListParams } from '@things-factory/shell'
|
|
4
|
+
import { User } from '@things-factory/auth-base'
|
|
5
|
+
import { Manifest } from './manifest'
|
|
6
|
+
import { ManifestList } from './manifest-type'
|
|
7
|
+
|
|
8
|
+
@Resolver(Manifest)
|
|
9
|
+
export class ManifestQuery {
|
|
10
|
+
@Query(returns => Manifest, { description: 'To fetch a Manifest' })
|
|
11
|
+
async manifest(@Arg('id') id: string, @Ctx() context: any): Promise<Manifest> {
|
|
12
|
+
const { domain } = context.state
|
|
13
|
+
|
|
14
|
+
return await getRepository(Manifest).findOne({
|
|
15
|
+
where: { domain, id }
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Query(returns => ManifestList, { description: 'To fetch multiple Manifests' })
|
|
20
|
+
async manifests(@Args() params: ListParam, @Ctx() context: any): Promise<ManifestList> {
|
|
21
|
+
const { domain } = context.state
|
|
22
|
+
|
|
23
|
+
const convertedParams = convertListParams(params, domain.id)
|
|
24
|
+
const [items, total] = await getRepository(Manifest).findAndCount(convertedParams)
|
|
25
|
+
|
|
26
|
+
return { items, total }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@FieldResolver(type => Domain)
|
|
30
|
+
async domain(@Root() manifest: Manifest): Promise<Domain> {
|
|
31
|
+
return await getRepository(Domain).findOne(manifest.domainId)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@FieldResolver(type => User)
|
|
35
|
+
async updater(@Root() manifest: Manifest): Promise<User> {
|
|
36
|
+
return await getRepository(User).findOne(manifest.updaterId)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@FieldResolver(type => User)
|
|
40
|
+
async creator(@Root() manifest: Manifest): Promise<User> {
|
|
41
|
+
return await getRepository(User).findOne(manifest.creatorId)
|
|
42
|
+
}
|
|
43
|
+
}
|