@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.
Files changed (37) hide show
  1. package/dist-server/constants/order.js +2 -1
  2. package/dist-server/constants/order.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +102 -94
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/service/arrival-notice/arrival-notice-mutation.js +93 -21
  6. package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
  7. package/dist-server/service/draft-release-good/draft-release-good.js +5 -0
  8. package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -1
  9. package/dist-server/service/manifest/manifest-mutation.js +78 -1
  10. package/dist-server/service/manifest/manifest-mutation.js.map +1 -1
  11. package/dist-server/service/manifest/manifest-query.js +47 -12
  12. package/dist-server/service/manifest/manifest-query.js.map +1 -1
  13. package/dist-server/service/manifest/manifest-type.js +8 -0
  14. package/dist-server/service/manifest/manifest-type.js.map +1 -1
  15. package/dist-server/service/manifest/manifest.js +5 -0
  16. package/dist-server/service/manifest/manifest.js.map +1 -1
  17. package/dist-server/service/purchase-order/purchase-order-mutation.js +8 -4
  18. package/dist-server/service/purchase-order/purchase-order-mutation.js.map +1 -1
  19. package/dist-server/service/release-good/release-good-mutation.js +2 -16
  20. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  21. package/dist-server/service/release-good/release-good-query.js +70 -58
  22. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  23. package/package.json +13 -13
  24. package/server/constants/order.ts +2 -1
  25. package/server/controllers/ecommerce/sellercraft-controller.ts +124 -107
  26. package/server/service/arrival-notice/arrival-notice-mutation.ts +110 -22
  27. package/server/service/draft-release-good/draft-release-good.ts +7 -3
  28. package/server/service/manifest/manifest-mutation.ts +78 -3
  29. package/server/service/manifest/manifest-query.ts +68 -18
  30. package/server/service/manifest/manifest-type.ts +6 -0
  31. package/server/service/manifest/manifest.ts +6 -2
  32. package/server/service/purchase-order/purchase-order-mutation.ts +10 -5
  33. package/server/service/release-good/release-good-mutation.ts +23 -30
  34. package/server/service/release-good/release-good-query.ts +81 -65
  35. package/translations/en.json +4 -0
  36. package/translations/ko.json +6 -2
  37. 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: ManifestStatus.OPEN }
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(@Arg('name') name: string, @Ctx() context: any): Promise<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({ where: { manifest } })
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
- params.filters.push({
70
- name: 'domain',
71
- operator: 'eq',
72
- value: domain.id,
73
- relation: true
74
- })
75
-
76
- const convertedParams = convertListParams(params)
77
- const [items, total] = await getRepository(Manifest).findAndCount({
78
- ...convertedParams,
79
- relations: ['domain', 'creator', 'updater']
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
 
@@ -75,4 +75,10 @@ export class TrackingNo {
75
75
 
76
76
  @Field({ nullable: true })
77
77
  city?: string
78
+
79
+ @Field({ nullable: true })
80
+ orderStatus?: string
81
+
82
+ @Field({ nullable: true })
83
+ orderRemark?: string
78
84
  }
@@ -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 ? await generateId({ domain, type: ORDER_NUMBER_RULE_TYPE.PO_NUMBER, seed: {} }) : OrderNoGenerator.purchaseOrder()
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: (releaseGood.type == 'b2c'
569
- ? releaseGood?.billingAddress || null
570
- : shippingOrderInfo.billingAddress || null),
571
- deliveryAddress1: (releaseGood.type == 'b2c'
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: (releaseGood.type == 'b2c'
579
- ? releaseGood?.attentionTo || null
580
- : shippingOrderInfo.attentionTo || null),
581
- attentionCompany: (releaseGood.type =='b2c'
582
- ? releaseGood?.companyName || null
583
- : shippingOrderInfo.attentionCompany || null),
584
- city: (releaseGood.type == 'b2c' ? releaseGood?.city || null : shippingOrderInfo.city || null),
585
- state: (releaseGood.type == 'b2c' ? releaseGood?.state || null : shippingOrderInfo.state || null),
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: (releaseGood.type == 'b2c'
592
- ? releaseGood?.billingCity || null
593
- : shippingOrderInfo.billingCity || null),
594
- billingCountry: (releaseGood.type == 'b2c'
595
- ? releaseGood?.billingCountry || null
596
- : shippingOrderInfo.billingCountry || null),
597
- billingPostalCode: (releaseGood.type == 'b2c'
598
- ? releaseGood?.billingPostalCode || null
599
- : shippingOrderInfo.billingPostalCode || null),
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
- if (!params.filters.find((filter: any) => filter.name === 'releaseGoodOnly')) {
66
- qb.addSelect('COALESCE("cc".rank, 99999)', 'rank')
67
- qb.leftJoinAndSelect('rg.domain', 'domain')
68
- qb.leftJoinAndSelect('rg.bizplace', 'bizplace')
69
- qb.leftJoinAndSelect('rg.orderInventories', 'oi')
70
- qb.leftJoinAndSelect('rg.orderProducts', 'op')
71
- qb.leftJoinAndSelect('oi.inventory', 'inv')
72
- qb.leftJoinAndSelect('oi.product', 'prod')
73
- qb.leftJoinAndSelect('rg.arrivalNotice', 'an')
74
- qb.leftJoinAndSelect('rg.creator', 'creator')
75
- qb.leftJoinAndSelect('rg.updater', 'updater')
76
- qb.leftJoin(
77
- subQuery => {
78
- return subQuery
79
- .select(`ccd.rank`, 'rank')
80
- .addSelect(`ccd.name`, 'status')
81
- .from(`common_code_details`, 'ccd')
82
- .innerJoin(`ccd.commonCode`, 'cc')
83
- .where(`ccd.domain_id = :domainId`, { domainId: domain.id })
84
- .andWhere(`cc.name = 'RO_LIST_STATUS'`)
85
- },
86
- 'cc',
87
- 'cc.status = rg.status'
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
- const arrChildSortData = ['bizplace']
91
- const sort = (params.sortings || []).reduce(
92
- (acc, sort) => ({
93
- ...acc,
94
- [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'rg.' + sort.name]: sort.desc
95
- ? 'DESC'
96
- : 'ASC'
97
- }),
98
- !params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
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
- qb.orderBy(sort)
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(@Ctx() context: any, @Arg('name') name: string): Promise<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
- 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
- })
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")')
@@ -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",
@@ -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
+ }
@@ -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
  }