@things-factory/sales-base 4.0.12 → 4.0.17

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 (40) hide show
  1. package/dist-server/service/arrival-notice/arrival-notice-query.js +0 -1
  2. package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
  3. package/dist-server/service/manifest/manifest-mutation.js +63 -72
  4. package/dist-server/service/manifest/manifest-mutation.js.map +1 -1
  5. package/dist-server/service/manifest/manifest-query.js +49 -8
  6. package/dist-server/service/manifest/manifest-query.js.map +1 -1
  7. package/dist-server/service/manifest/manifest-type.js +67 -27
  8. package/dist-server/service/manifest/manifest-type.js.map +1 -1
  9. package/dist-server/service/manifest/manifest.js +5 -0
  10. package/dist-server/service/manifest/manifest.js.map +1 -1
  11. package/dist-server/service/others/other-types.js +4 -0
  12. package/dist-server/service/others/other-types.js.map +1 -1
  13. package/dist-server/service/release-good/release-good-mutation.js +360 -1
  14. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  15. package/dist-server/service/release-good/release-good-query.js +160 -0
  16. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  17. package/dist-server/service/release-good/release-good-types.js +34 -2
  18. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  19. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js +66 -19
  20. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js.map +1 -1
  21. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js +84 -72
  22. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js.map +1 -1
  23. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js +144 -1
  24. package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js.map +1 -1
  25. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js +17 -7
  26. package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js.map +1 -1
  27. package/package.json +12 -12
  28. package/server/service/arrival-notice/arrival-notice-query.ts +0 -2
  29. package/server/service/manifest/manifest-mutation.ts +78 -88
  30. package/server/service/manifest/manifest-query.ts +64 -8
  31. package/server/service/manifest/manifest-type.ts +47 -20
  32. package/server/service/manifest/manifest.ts +5 -0
  33. package/server/service/others/other-types.ts +3 -0
  34. package/server/service/release-good/release-good-mutation.ts +512 -0
  35. package/server/service/release-good/release-good-query.ts +197 -2
  36. package/server/service/release-good/release-good-types.ts +31 -7
  37. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +82 -21
  38. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +95 -79
  39. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +106 -1
  40. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +31 -14
@@ -1,112 +1,102 @@
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'
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+
3
+ import { DISPATCHMENT_STATUS } from '../../constants'
4
+ import { OrderNoGenerator } from '../../utils'
5
+ import { ReleaseGood } from '../release-good/release-good'
6
+ import { Manifest, ManifestStatus } from './manifest'
7
+ import { ManifestPatch, NewManifest } from './manifest-type'
5
8
 
6
9
  @Resolver(Manifest)
7
10
  export class ManifestMutation {
8
11
  @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
- })
12
+ @Mutation(returns => Boolean, { description: 'To delete Manifest' })
13
+ async deleteManifest(@Arg('name') name: string, @Ctx() context: any): Promise<boolean> {
14
+ const { domain, tx } = context.state
34
15
 
35
- return await repository.save({
36
- ...manifest,
37
- ...patch,
38
- updater: user
39
- })
16
+ await tx.getRepository(Manifest).delete({ domain, name })
17
+ return true
40
18
  }
41
19
 
42
20
  @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[]> {
21
+ @Mutation(returns => Boolean, { description: 'To generate new Manifest' })
22
+ async generateManifest(@Arg('manifest') manifest: NewManifest, @Ctx() context: any): Promise<boolean> {
48
23
  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: '+' })
24
+ const manifestItems: any[] = manifest.manifestItems
25
+
26
+ // regroup array of object by transporter
27
+ let shippingProviderGrouping: any = manifestItems.reduce((a, b) => {
28
+ a[b.transporter] = [...(a[b.transporter] || []), b]
29
+ return a
30
+ }, {})
31
+
32
+ for (const transporter in shippingProviderGrouping) {
33
+ const items: any[] = shippingProviderGrouping[transporter]
34
+
35
+ const openManifest: Manifest = await tx
36
+ .getRepository(Manifest)
37
+ .findOne({ domain, shippingProvider: transporter, status: ManifestStatus.OPEN })
38
+
39
+ let manifest: Manifest
40
+
41
+ if (openManifest) {
42
+ manifest = openManifest
43
+ } else {
44
+ manifest = new Manifest()
45
+ manifest.domain = domain
46
+ manifest.shippingProvider = transporter
47
+ manifest.name = OrderNoGenerator.manifest()
48
+ manifest.creator = user
49
+ manifest = await tx.getRepository(Manifest).save(manifest)
67
50
  }
68
- }
69
51
 
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
52
+ await Promise.all(
53
+ items.map(async item => {
54
+ let releaseOrder: ReleaseGood = await tx
55
+ .getRepository(ReleaseGood)
56
+ .findOne({ domain, refNo: item.refNo, trackingNo: item.trackingNo })
57
+ releaseOrder.manifest = manifest
58
+ releaseOrder.updater = user
59
+ await tx.getRepository(ReleaseGood).save(releaseOrder)
79
60
  })
80
-
81
- results.push({ ...result, cuFlag: 'M' })
82
- }
61
+ )
83
62
  }
84
63
 
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
64
  return true
95
65
  }
96
66
 
97
67
  @Directive('@transaction')
98
- @Mutation(returns => Boolean, { description: 'To delete multiple manifests' })
99
- async deleteManifests(
100
- @Arg('ids', type => [String]) ids: string[],
68
+ @Mutation(returns => Manifest, { description: 'To dispatch Manifest when courier service collect packages' })
69
+ async dispatchManifest(
70
+ @Arg('name') name: string,
71
+ @Arg('patch') patch: ManifestPatch,
101
72
  @Ctx() context: any
102
- ): Promise<boolean> {
103
- const { domain, tx } = context.state
73
+ ): Promise<Manifest> {
74
+ const { domain, user, tx } = context.state
104
75
 
105
- await tx.getRepository(Manifest).delete({
106
- domain,
107
- id: In(ids)
76
+ const manifest: Manifest = await tx.getRepository(Manifest).findOne({
77
+ where: { domain, name, status: ManifestStatus.OPEN }
108
78
  })
79
+ if (!manifest) throw new Error(`Unable to find ${name}`)
109
80
 
110
- return true
81
+ let releaseGoods: any[] = await tx.getRepository(ReleaseGood).find({ where: { domain, manifest } })
82
+
83
+ releaseGoods = await Promise.all(
84
+ releaseGoods.map((releaseGood: ReleaseGood) => {
85
+ return {
86
+ ...releaseGood,
87
+ dispatchmentStatus: DISPATCHMENT_STATUS.DISPATCHED,
88
+ updater: user
89
+ }
90
+ })
91
+ )
92
+ await tx.getRepository(ReleaseGood).save(releaseGoods)
93
+
94
+ return await tx.getRepository(Manifest).save({
95
+ ...manifest,
96
+ ...patch,
97
+ status: ManifestStatus.CLOSED,
98
+ dispatchedAt: new Date(),
99
+ updater: user
100
+ })
111
101
  }
112
102
  }
@@ -1,27 +1,83 @@
1
- import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
1
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
2
  import { getRepository } from 'typeorm'
3
- import { Domain, ListParam, convertListParams } from '@things-factory/shell'
3
+
4
4
  import { User } from '@things-factory/auth-base'
5
+ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+
7
+ import { ReleaseGood } from '../release-good/release-good'
5
8
  import { Manifest } from './manifest'
6
9
  import { ManifestList } from './manifest-type'
7
10
 
8
11
  @Resolver(Manifest)
9
12
  export class ManifestQuery {
10
13
  @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
14
+ async manifest(@Arg('name') name: string, @Ctx() context: any): Promise<Manifest> {
15
+ const { domain, tx } = context.state
16
+ const manifest: Manifest = await tx.getRepository(Manifest).findOne({ where: { domain, name } })
13
17
 
14
- return await getRepository(Manifest).findOne({
15
- where: { domain, id }
18
+ const releaseGoods: ReleaseGood[] = await tx.getRepository(ReleaseGood).find({ where: { manifest } })
19
+
20
+ const trackingNos: any[] = releaseGoods.map(releaseGood => {
21
+ return {
22
+ trackingNo: releaseGood.trackingNo,
23
+ refNo: releaseGood.refNo,
24
+ deliveryAddress: releaseGood.deliveryAddress1,
25
+ attentionTo: releaseGood.attentionTo,
26
+ postalCode: releaseGood.postalCode,
27
+ city: releaseGood.city,
28
+ phone: releaseGood.phone1,
29
+ dispatchmentStatus: releaseGood.dispatchmentStatus
30
+ }
16
31
  })
32
+
33
+ return {
34
+ ...manifest,
35
+ trackingNos
36
+ }
17
37
  }
18
38
 
19
39
  @Query(returns => ManifestList, { description: 'To fetch multiple Manifests' })
20
40
  async manifests(@Args() params: ListParam, @Ctx() context: any): Promise<ManifestList> {
21
41
  const { domain } = context.state
22
42
 
23
- const convertedParams = convertListParams(params, domain.id)
24
- const [items, total] = await getRepository(Manifest).findAndCount(convertedParams)
43
+ const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
44
+ if (fromDateParamIdx >= 0) {
45
+ let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
46
+ params.filters.splice(fromDateParamIdx, 1)
47
+
48
+ params.filters.push({
49
+ name: 'createdAt',
50
+ operator: 'gte',
51
+ value: fromDateVal.toISOString(),
52
+ relation: false
53
+ })
54
+ }
55
+
56
+ const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
57
+ if (toDateParamIdx >= 0) {
58
+ let toDateVal = new Date(params.filters[toDateParamIdx].value)
59
+ params.filters.splice(toDateParamIdx, 1)
60
+
61
+ params.filters.push({
62
+ name: 'createdAt',
63
+ operator: 'lt',
64
+ value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
65
+ relation: false
66
+ })
67
+ }
68
+
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
+ })
25
81
 
26
82
  return { items, total }
27
83
  }
@@ -1,23 +1,11 @@
1
- import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
3
  import { Manifest, ManifestStatus } from './manifest'
4
4
 
5
5
  @InputType()
6
6
  export class NewManifest {
7
- @Field()
8
- name: string
9
-
10
- @Field({ nullable: true })
11
- description?: string
12
-
13
- @Field(type => ManifestStatus, { nullable: true })
14
- state?: ManifestStatus
15
-
16
- @Field({ nullable: true })
17
- active?: boolean
18
-
19
- @Field({ nullable: true })
20
- params?: string
7
+ @Field(type => [ManifestItem])
8
+ manifestItems: ManifestItem[]
21
9
  }
22
10
 
23
11
  @InputType()
@@ -29,16 +17,28 @@ export class ManifestPatch {
29
17
  name?: string
30
18
 
31
19
  @Field({ nullable: true })
32
- description?: string
20
+ shippingProvider?: string
21
+
22
+ @Field({ nullable: true })
23
+ dispatcherName?: string
24
+
25
+ @Field({ nullable: true })
26
+ dispatcherIdentity?: string
33
27
 
34
28
  @Field(type => ManifestStatus, { nullable: true })
35
- state?: ManifestStatus
29
+ status?: ManifestStatus
30
+ }
36
31
 
32
+ @InputType()
33
+ export class ManifestItem {
37
34
  @Field({ nullable: true })
38
- active?: boolean
35
+ trackingNo?: string
39
36
 
40
- @Field()
41
- cuFlag: string
37
+ @Field({ nullable: true })
38
+ refNo?: string
39
+
40
+ @Field({ nullable: true })
41
+ transporter?: string
42
42
  }
43
43
 
44
44
  @ObjectType()
@@ -49,3 +49,30 @@ export class ManifestList {
49
49
  @Field(type => Int)
50
50
  total: number
51
51
  }
52
+
53
+ @ObjectType()
54
+ export class TrackingNo {
55
+ @Field({ nullable: true })
56
+ trackingNo?: string
57
+
58
+ @Field({ nullable: true })
59
+ refNo?: string
60
+
61
+ @Field({ nullable: true })
62
+ dispatchmentStatus?: string
63
+
64
+ @Field({ nullable: true })
65
+ deliveryAddress?: string
66
+
67
+ @Field({ nullable: true })
68
+ attentionTo?: string
69
+
70
+ @Field({ nullable: true })
71
+ postalCode?: string
72
+
73
+ @Field({ nullable: true })
74
+ phone?: string
75
+
76
+ @Field({ nullable: true })
77
+ city?: string
78
+ }
@@ -14,6 +14,8 @@ import { User } from '@things-factory/auth-base'
14
14
  import { config } from '@things-factory/env'
15
15
  import { Domain } from '@things-factory/shell'
16
16
 
17
+ import { TrackingNo } from './manifest-type'
18
+
17
19
  const ORMCONFIG = config.get('ormconfig', {})
18
20
  const DATABASE_TYPE = ORMCONFIG.type
19
21
 
@@ -74,6 +76,9 @@ export class Manifest {
74
76
  })
75
77
  status: ManifestStatus
76
78
 
79
+ @Field(type => [TrackingNo], { nullable: true })
80
+ trackingNos?: TrackingNo[]
81
+
77
82
  @CreateDateColumn()
78
83
  @Field({ nullable: true })
79
84
  createdAt?: Date
@@ -26,6 +26,9 @@ export class InventoryProductGroup {
26
26
  @Field({ nullable: true })
27
27
  productName: string
28
28
 
29
+ @Field({ nullable: true })
30
+ productBrand: string
31
+
29
32
  @Field({ nullable: true })
30
33
  packingType: string
31
34