@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.
Files changed (77) hide show
  1. package/dist-server/constants/order.js +9 -1
  2. package/dist-server/constants/order.js.map +1 -1
  3. package/dist-server/constants/validation-error-code.js +2 -1
  4. package/dist-server/constants/validation-error-code.js.map +1 -1
  5. package/dist-server/controllers/ecommerce/sellercraft-controller.js +3 -3
  6. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  7. package/dist-server/service/arrival-notice/arrival-notice-mutation.js +21 -0
  8. package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
  9. package/dist-server/service/arrival-notice/arrival-notice-query.js +74 -76
  10. package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
  11. package/dist-server/service/delivery-order/delivery-order-query.js +21 -5
  12. package/dist-server/service/delivery-order/delivery-order-query.js.map +1 -1
  13. package/dist-server/service/goods-receival-note/goods-receival-note-query.js +93 -43
  14. package/dist-server/service/goods-receival-note/goods-receival-note-query.js.map +1 -1
  15. package/dist-server/service/index.js +4 -0
  16. package/dist-server/service/index.js.map +1 -1
  17. package/dist-server/service/manifest/index.js +9 -0
  18. package/dist-server/service/manifest/index.js.map +1 -0
  19. package/dist-server/service/manifest/manifest-mutation.js +120 -0
  20. package/dist-server/service/manifest/manifest-mutation.js.map +1 -0
  21. package/dist-server/service/manifest/manifest-query.js +87 -0
  22. package/dist-server/service/manifest/manifest-query.js.map +1 -0
  23. package/dist-server/service/manifest/manifest-type.js +85 -0
  24. package/dist-server/service/manifest/manifest-type.js.map +1 -0
  25. package/dist-server/service/manifest/manifest.js +117 -0
  26. package/dist-server/service/manifest/manifest.js.map +1 -0
  27. package/dist-server/service/order-inventory/order-inventory-mutation.js +24 -0
  28. package/dist-server/service/order-inventory/order-inventory-mutation.js.map +1 -1
  29. package/dist-server/service/order-inventory/order-inventory-query.js +20 -19
  30. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  31. package/dist-server/service/order-inventory/order-inventory-types.js +17 -13
  32. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  33. package/dist-server/service/order-inventory/order-inventory.js +24 -2
  34. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  35. package/dist-server/service/others/other-query.js +1 -0
  36. package/dist-server/service/others/other-query.js.map +1 -1
  37. package/dist-server/service/release-good/release-good-mutation.js +33 -0
  38. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  39. package/dist-server/service/release-good/release-good.js +28 -1
  40. package/dist-server/service/release-good/release-good.js.map +1 -1
  41. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js +56 -23
  42. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js.map +1 -1
  43. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js +76 -15
  44. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js.map +1 -1
  45. package/dist-server/utils/inventory-util.js +26 -7
  46. package/dist-server/utils/inventory-util.js.map +1 -1
  47. package/dist-server/utils/order-no-generator.js +35 -31
  48. package/dist-server/utils/order-no-generator.js.map +1 -1
  49. package/package.json +12 -12
  50. package/server/constants/index.ts +1 -1
  51. package/server/constants/order.ts +10 -0
  52. package/server/constants/validation-error-code.ts +3 -2
  53. package/server/controllers/ecommerce/sellercraft-controller.ts +4 -3
  54. package/server/service/arrival-notice/arrival-notice-mutation.ts +20 -0
  55. package/server/service/arrival-notice/arrival-notice-query.ts +82 -76
  56. package/server/service/delivery-order/delivery-order-query.ts +26 -7
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +116 -53
  58. package/server/service/index.ts +4 -0
  59. package/server/service/manifest/index.ts +6 -0
  60. package/server/service/manifest/manifest-mutation.ts +112 -0
  61. package/server/service/manifest/manifest-query.ts +43 -0
  62. package/server/service/manifest/manifest-type.ts +51 -0
  63. package/server/service/manifest/manifest.ts +98 -0
  64. package/server/service/order-inventory/order-inventory-mutation.ts +26 -1
  65. package/server/service/order-inventory/order-inventory-query.ts +17 -18
  66. package/server/service/order-inventory/order-inventory-types.ts +15 -10
  67. package/server/service/order-inventory/order-inventory.ts +24 -5
  68. package/server/service/others/other-query.ts +2 -6
  69. package/server/service/release-good/release-good-mutation.ts +45 -0
  70. package/server/service/release-good/release-good.ts +26 -0
  71. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +76 -27
  72. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +85 -17
  73. package/server/utils/inventory-util.ts +30 -7
  74. package/server/utils/order-no-generator.ts +43 -36
  75. package/dist-server/middlewares/index.js +0 -1
  76. package/dist-server/middlewares/index.js.map +0 -1
  77. 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 foundGAN: ArrivalNotice
25
-
26
- if (context?.state?.bizplace) {
27
- let param: any
28
-
29
- if (name) param = { domain, name, bizplace }
30
- else param = { domain, refNo, bizplace }
31
-
32
- foundGAN = 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
- })
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
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
86
- where: {
87
- domain,
88
- refBy: foundGAN?.id,
89
- category: ATTACHMENT_TYPE.GAN
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
- const foundPOAttachments: Attachment[] = foundGAN?.purchaseOrder?.id
94
- ? await getRepository(Attachment).find({
95
- where: {
96
- domain,
97
- refBy: foundGAN.purchaseOrder?.id,
98
- category: ATTACHMENT_TYPE.PO
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
- const attachments: Attachment[] = [...foundPOAttachments, ...foundAttachments]
104
- if (attachments.length) foundGAN.attachment = attachments
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
- return foundGAN
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', 'rg')
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
- const arrChildSortData = ['bizplace', 'releaseGood']
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 ? sort.name + '.name' : 'do.' + sort.name]: sort.desc
121
- ? 'DESC'
122
- : 'ASC'
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
- !params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
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 { Bizplace, getPermittedBizplaceIds } from '@things-factory/biz-base'
3
- import { convertListParams, Domain, Filter, Pagination, Sorting } from '@things-factory/shell'
4
- import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
5
- import { getRepository, In, IsNull } from 'typeorm'
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 convertedParams = convertListParams({ filters, pagination, sortings })
21
-
22
- const arrivalNoticeParam: any = filters.find((param: any) => param.name === 'arrivalNoticeNo')
23
- const arrivalNoticeRefNoParam = filters.find(param => param.name === 'arrivalNoticeRefNo')
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
- const bizplaceParam = filters.find(param => param.name === 'bizplaceName')
26
- if (bizplaceParam) {
27
- const foundBizplaces: Bizplace[] = await getRepository(Bizplace).find({
28
- where: {
29
- ...convertListParams({ filters: [{ ...bizplaceParam, name: 'name' }] }).where
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
- if (arrivalNoticeParam || arrivalNoticeRefNoParam) {
47
- let arrFilters = []
48
- if (arrivalNoticeParam) {
49
- arrFilters.push({ ...arrivalNoticeParam, name: 'name' })
50
- }
51
- if (arrivalNoticeRefNoParam) arrFilters.push({ ...arrivalNoticeRefNoParam, name: 'refNo' })
52
- const foundArrivalNotices: ArrivalNotice[] = await getRepository(ArrivalNotice).find({
53
- ...convertListParams({ filters: arrFilters })
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
- // remove non-column params
57
- delete convertedParams.where.arrivalNoticeNo
58
- delete convertedParams.where.arrivalNoticeRefNo
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
- if (foundArrivalNotices && foundArrivalNotices.length) {
61
- convertedParams.where.arrivalNotice = In(foundArrivalNotices.map((foundAN: ArrivalNotice) => foundAN.id))
62
- } else {
63
- convertListParams.where.arrivalNotice = IsNull()
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
- let [items, total] = await getRepository(GoodsReceivalNote).findAndCount({
68
- ...convertedParams,
69
- relations: ['domain', 'arrivalNotice', 'bizplace', 'creator', 'updater']
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
  }
@@ -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,6 @@
1
+ import { Manifest } from './manifest'
2
+ import { ManifestQuery } from './manifest-query'
3
+ import { ManifestMutation } from './manifest-mutation'
4
+
5
+ export const entities = [Manifest]
6
+ export const resolvers = [ManifestQuery, ManifestMutation]
@@ -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
+ }