@things-factory/sales-base 4.2.12 → 4.3.0

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 (109) hide show
  1. package/dist-server/constants/attachment-type.js +2 -1
  2. package/dist-server/constants/attachment-type.js.map +1 -1
  3. package/dist-server/constants/index.js +1 -0
  4. package/dist-server/constants/index.js.map +1 -1
  5. package/dist-server/constants/order.js +12 -3
  6. package/dist-server/constants/order.js.map +1 -1
  7. package/dist-server/constants/release-good.js +9 -0
  8. package/dist-server/constants/release-good.js.map +1 -0
  9. package/dist-server/service/draft-release-good/draft-release-good-mutation.js +501 -0
  10. package/dist-server/service/draft-release-good/draft-release-good-mutation.js.map +1 -0
  11. package/dist-server/service/draft-release-good/draft-release-good-query.js +289 -0
  12. package/dist-server/service/draft-release-good/draft-release-good-query.js.map +1 -0
  13. package/dist-server/service/draft-release-good/draft-release-good-type.js +364 -0
  14. package/dist-server/service/draft-release-good/draft-release-good-type.js.map +1 -0
  15. package/dist-server/service/draft-release-good/draft-release-good.js +321 -0
  16. package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -0
  17. package/dist-server/service/draft-release-good/index.js +21 -0
  18. package/dist-server/service/draft-release-good/index.js.map +1 -0
  19. package/dist-server/service/index.js +47 -19
  20. package/dist-server/service/index.js.map +1 -1
  21. package/dist-server/service/order-inventory/order-inventory-query.js +38 -1
  22. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  23. package/dist-server/service/order-inventory/order-inventory-types.js +9 -1
  24. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  25. package/dist-server/service/order-inventory/order-inventory.js +5 -1
  26. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  27. package/dist-server/service/order-product/order-product-types.js +13 -13
  28. package/dist-server/service/order-product/order-product-types.js.map +1 -1
  29. package/dist-server/service/order-product/order-product.js +39 -4
  30. package/dist-server/service/order-product/order-product.js.map +1 -1
  31. package/dist-server/service/order-tote/index.js +21 -0
  32. package/dist-server/service/order-tote/index.js.map +1 -0
  33. package/dist-server/service/order-tote/order-tote-mutation.js +56 -0
  34. package/dist-server/service/order-tote/order-tote-mutation.js.map +1 -0
  35. package/dist-server/service/order-tote/order-tote-query.js +123 -0
  36. package/dist-server/service/order-tote/order-tote-query.js.map +1 -0
  37. package/dist-server/service/order-tote/order-tote-types.js +79 -0
  38. package/dist-server/service/order-tote/order-tote-types.js.map +1 -0
  39. package/dist-server/service/order-tote/order-tote.js +91 -0
  40. package/dist-server/service/order-tote/order-tote.js.map +1 -0
  41. package/dist-server/service/order-tote-item/index.js +21 -0
  42. package/dist-server/service/order-tote-item/index.js.map +1 -0
  43. package/dist-server/service/order-tote-item/order-tote-item-mutation.js +56 -0
  44. package/dist-server/service/order-tote-item/order-tote-item-mutation.js.map +1 -0
  45. package/dist-server/service/order-tote-item/order-tote-item-query.js +100 -0
  46. package/dist-server/service/order-tote-item/order-tote-item-query.js.map +1 -0
  47. package/dist-server/service/order-tote-item/order-tote-item-types.js +91 -0
  48. package/dist-server/service/order-tote-item/order-tote-item-types.js.map +1 -0
  49. package/dist-server/service/order-tote-item/order-tote-item.js +104 -0
  50. package/dist-server/service/order-tote-item/order-tote-item.js.map +1 -0
  51. package/dist-server/service/order-tote-seal/index.js +21 -0
  52. package/dist-server/service/order-tote-seal/index.js.map +1 -0
  53. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js +56 -0
  54. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js.map +1 -0
  55. package/dist-server/service/order-tote-seal/order-tote-seal-query.js +97 -0
  56. package/dist-server/service/order-tote-seal/order-tote-seal-query.js.map +1 -0
  57. package/dist-server/service/order-tote-seal/order-tote-seal-types.js +71 -0
  58. package/dist-server/service/order-tote-seal/order-tote-seal-types.js.map +1 -0
  59. package/dist-server/service/order-tote-seal/order-tote-seal.js +71 -0
  60. package/dist-server/service/order-tote-seal/order-tote-seal.js.map +1 -0
  61. package/dist-server/service/others/other-query.js +37 -2
  62. package/dist-server/service/others/other-query.js.map +1 -1
  63. package/dist-server/service/release-good/release-good-mutation.js +23 -1
  64. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  65. package/dist-server/service/release-good/release-good-query.js +28 -2
  66. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  67. package/dist-server/service/release-good/release-good.js +32 -12
  68. package/dist-server/service/release-good/release-good.js.map +1 -1
  69. package/dist-server/utils/inventory-util.js +258 -99
  70. package/dist-server/utils/inventory-util.js.map +1 -1
  71. package/dist-server/utils/order-no-generator.js +7 -0
  72. package/dist-server/utils/order-no-generator.js.map +1 -1
  73. package/package.json +13 -13
  74. package/server/constants/attachment-type.ts +2 -1
  75. package/server/constants/index.ts +1 -0
  76. package/server/constants/order.ts +12 -2
  77. package/server/constants/release-good.ts +6 -0
  78. package/server/service/draft-release-good/draft-release-good-mutation.ts +671 -0
  79. package/server/service/draft-release-good/draft-release-good-query.ts +314 -0
  80. package/server/service/draft-release-good/draft-release-good-type.ts +261 -0
  81. package/server/service/draft-release-good/draft-release-good.ts +270 -0
  82. package/server/service/draft-release-good/index.ts +9 -0
  83. package/server/service/index.ts +51 -21
  84. package/server/service/order-inventory/order-inventory-query.ts +40 -2
  85. package/server/service/order-inventory/order-inventory-types.ts +6 -0
  86. package/server/service/order-inventory/order-inventory.ts +5 -5
  87. package/server/service/order-product/order-product-types.ts +5 -3
  88. package/server/service/order-product/order-product.ts +30 -3
  89. package/server/service/order-tote/index.ts +9 -0
  90. package/server/service/order-tote/order-tote-mutation.ts +30 -0
  91. package/server/service/order-tote/order-tote-query.ts +114 -0
  92. package/server/service/order-tote/order-tote-types.ts +47 -0
  93. package/server/service/order-tote/order-tote.ts +62 -0
  94. package/server/service/order-tote-item/index.ts +9 -0
  95. package/server/service/order-tote-item/order-tote-item-mutation.ts +30 -0
  96. package/server/service/order-tote-item/order-tote-item-query.ts +88 -0
  97. package/server/service/order-tote-item/order-tote-item-types.ts +56 -0
  98. package/server/service/order-tote-item/order-tote-item.ts +72 -0
  99. package/server/service/order-tote-seal/index.ts +9 -0
  100. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +30 -0
  101. package/server/service/order-tote-seal/order-tote-seal-query.ts +60 -0
  102. package/server/service/order-tote-seal/order-tote-seal-types.ts +41 -0
  103. package/server/service/order-tote-seal/order-tote-seal.ts +46 -0
  104. package/server/service/others/other-query.ts +43 -8
  105. package/server/service/release-good/release-good-mutation.ts +24 -2
  106. package/server/service/release-good/release-good-query.ts +57 -30
  107. package/server/service/release-good/release-good.ts +28 -9
  108. package/server/utils/inventory-util.ts +287 -106
  109. package/server/utils/order-no-generator.ts +42 -48
@@ -0,0 +1,9 @@
1
+ import { OrderTote } from './order-tote'
2
+ import { OrderToteMutation } from './order-tote-mutation'
3
+ import { OrderToteQuery } from './order-tote-query'
4
+
5
+ export const entities = [OrderTote]
6
+ export const resolvers = [OrderToteQuery, OrderToteMutation]
7
+
8
+ export * from './order-tote-mutation'
9
+ export * from './order-tote-query'
@@ -0,0 +1,30 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { EntityManager, In } from 'typeorm'
3
+
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { OrderTote } from './order-tote'
7
+
8
+ @Resolver(OrderTote)
9
+ export class OrderToteMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => Boolean)
12
+ async deleteOrderTote(@Arg('name') id: string, @Ctx() context: any): Promise<Boolean> {
13
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
14
+
15
+ await tx.getRepository(OrderTote).delete({ domain, id })
16
+ return true
17
+ }
18
+
19
+ @Directive('@transaction')
20
+ @Mutation(returns => Boolean)
21
+ async deleteOrderTotes(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<Boolean> {
22
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
23
+
24
+ await tx.getRepository(OrderTote).delete({
25
+ domain,
26
+ id: In(ids)
27
+ })
28
+ return true
29
+ }
30
+ }
@@ -0,0 +1,114 @@
1
+ import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository, In, IsNull } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { ReleaseGood } from '../release-good/release-good'
6
+ import { Tote } from '@things-factory/warehouse-base'
7
+ import { buildQuery, Domain, Filter, Pagination, Sorting } from '@things-factory/shell'
8
+ import { Bizplace } from '@things-factory/biz-base'
9
+
10
+ import { OrderTote } from './order-tote'
11
+ import { OrderToteList } from './order-tote-types'
12
+ import { OrderToteSeal } from '../order-tote-seal/order-tote-seal'
13
+
14
+ @Resolver(OrderTote)
15
+ export class OrderToteQuery {
16
+ @Query(returns => OrderToteList)
17
+ async orderTotes(
18
+ @Ctx() context: any,
19
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
20
+ @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
21
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
22
+ ): Promise<OrderToteList> {
23
+ try {
24
+ const { domain }: { domain: Domain } = context.state
25
+
26
+ const releaseGoodNoParam = filters.find(item => item.name === 'releaseGoodNo')
27
+
28
+ const queryBuilder = await getRepository(OrderTote).createQueryBuilder()
29
+ buildQuery(queryBuilder, { filters, pagination, sortings }, context)
30
+
31
+ queryBuilder
32
+ .leftJoinAndSelect('OrderTote.domain', 'Domain')
33
+ .leftJoinAndSelect('OrderTote.releaseGood', 'ReleaseGood')
34
+ .leftJoinAndSelect('OrderTote.tote', 'Tote')
35
+ .leftJoinAndSelect('OrderTote.updater', 'Updater')
36
+ .where('Domain.id = :domainId', { domainId: domain.id })
37
+
38
+ if (releaseGoodNoParam) {
39
+ filters.splice(
40
+ filters.findIndex(item => item.name == 'releaseGoodNo'),
41
+ 1
42
+ )
43
+ queryBuilder.andWhere('ReleaseGood.name = :rgName', { rgName: releaseGoodNoParam.value })
44
+ }
45
+
46
+ let [items, total] = await queryBuilder.getManyAndCount()
47
+
48
+ let orderToteIds: string[] = items.map(itm => itm.id)
49
+
50
+ let orderToteSeals: OrderToteSeal[] = await getRepository(OrderToteSeal).find({
51
+ where: { orderTote: In(orderToteIds) }
52
+ })
53
+
54
+ items = items.map((itm: OrderTote) => {
55
+ return {
56
+ ...itm,
57
+ orderToteSeals: orderToteSeals.filter(seal => seal.orderToteId == itm.id)
58
+ }
59
+ })
60
+
61
+ return { items, total }
62
+ } catch (e) {
63
+ throw new Error(e)
64
+ }
65
+ }
66
+
67
+ @Query(returns => OrderTote)
68
+ async orderTote(@Arg('id') id: string, @Ctx() context: any): Promise<OrderTote> {
69
+ const { domain }: { domain: Domain } = context.state
70
+
71
+ return await getRepository(OrderTote).findOne({
72
+ where: { domain, id },
73
+ relations: ['domain', 'releaseGood', 'tote', 'updater']
74
+ })
75
+ }
76
+
77
+ @Query(returns => Boolean)
78
+ async checkOrderTote(
79
+ @Arg('name') name: string,
80
+ @Arg('orderNo') orderNo: string,
81
+ @Ctx() context: any
82
+ ): Promise<Boolean> {
83
+ const { domain }: { domain: Domain } = context.state
84
+ let foundOrder = await getRepository(ReleaseGood).findOne({
85
+ where: { name: orderNo, domain },
86
+ relations: ['bizplace']
87
+ })
88
+ let scannedTote = await getRepository(Tote).findOne({ where: { name, bizplace: foundOrder.bizplace } })
89
+
90
+ let foundOrderTote = await getRepository(OrderTote).findOne({
91
+ where: { domain, releaseGood: foundOrder, name },
92
+ relations: ['domain', 'releaseGood', 'tote', 'updater']
93
+ })
94
+
95
+ if (!foundOrderTote && scannedTote) {
96
+ let executingOrderTote = await getRepository(OrderTote).find({
97
+ where: { tote: scannedTote },
98
+ relations: ['releaseGood']
99
+ })
100
+
101
+ executingOrderTote = executingOrderTote.filter(itm => itm.releaseGood.status !== 'DONE')
102
+
103
+ if (executingOrderTote && executingOrderTote.length > 0) {
104
+ throw new Error(`Current tote is used in another RO (${executingOrderTote[0].releaseGood.name})`)
105
+ }
106
+ }
107
+
108
+ if (foundOrderTote?.closedDate) {
109
+ return true
110
+ } else {
111
+ return false
112
+ }
113
+ }
114
+ }
@@ -0,0 +1,47 @@
1
+ import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ObjectRef } from '@things-factory/shell'
4
+
5
+ import { OrderTote } from './order-tote'
6
+
7
+ @ObjectType()
8
+ export class OrderToteList {
9
+ @Field(type => [OrderTote], { nullable: true })
10
+ items: OrderTote[]
11
+
12
+ @Field(type => Int, { nullable: true })
13
+ total: number
14
+ }
15
+
16
+ @InputType()
17
+ export class NewOrderTote {
18
+ @Field({ nullable: true })
19
+ name: string
20
+
21
+ @Field({ nullable: true })
22
+ description: string
23
+
24
+ @Field(type => ObjectRef, { nullable: true })
25
+ releaseGood: ObjectRef
26
+
27
+ @Field(type => ObjectRef, { nullable: true })
28
+ tote: ObjectRef
29
+ }
30
+
31
+ @InputType()
32
+ export class OrderTotePatch {
33
+ @Field({ nullable: true })
34
+ id: string
35
+
36
+ @Field({ nullable: true })
37
+ name: string
38
+
39
+ @Field({ nullable: true })
40
+ description: string
41
+
42
+ @Field(type => ObjectRef, { nullable: true })
43
+ releaseGood: ObjectRef
44
+
45
+ @Field(type => ObjectRef, { nullable: true })
46
+ tote: ObjectRef
47
+ }
@@ -0,0 +1,62 @@
1
+ import { Field, ObjectType } from 'type-graphql'
2
+ import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { Domain } from '@things-factory/shell'
6
+ import { Tote } from '@things-factory/warehouse-base'
7
+ import { ReleaseGood } from '../release-good/release-good'
8
+ import { OrderToteSeal } from '../order-tote-seal/order-tote-seal'
9
+
10
+ @Entity()
11
+ @Index('ix_order_tote_0', (orderTote: OrderTote) => [orderTote.id], { unique: true })
12
+ @ObjectType()
13
+ export class OrderTote {
14
+ @PrimaryGeneratedColumn('uuid')
15
+ @Field()
16
+ id: string
17
+
18
+ @ManyToOne(type => Domain)
19
+ @Field()
20
+ domain: Domain
21
+
22
+ @RelationId((orderTote: OrderTote) => orderTote.domain)
23
+ domainId: string
24
+
25
+ @Column()
26
+ @Field()
27
+ name: string
28
+
29
+ @ManyToOne(type => ReleaseGood)
30
+ @Field(type => ReleaseGood)
31
+ releaseGood?: ReleaseGood
32
+
33
+ @RelationId((orderTote: OrderTote) => orderTote.releaseGood)
34
+ releaseGoodId: string
35
+
36
+ @ManyToOne(type => Tote)
37
+ @Field(type => Tote, { nullable: true })
38
+ tote?: Tote
39
+
40
+ @RelationId((orderTote: OrderTote) => orderTote.tote)
41
+ toteId: string
42
+
43
+ @Column({ nullable: true })
44
+ @Field({ nullable: true })
45
+ closedDate?: Date
46
+
47
+ @UpdateDateColumn()
48
+ @Field({ nullable: true })
49
+ updatedAt: Date
50
+
51
+ @ManyToOne(type => User, {
52
+ nullable: true
53
+ })
54
+ @Field({ nullable: true })
55
+ updater?: User
56
+
57
+ @RelationId((orderTote: OrderTote) => orderTote.updater)
58
+ updaterId: string
59
+
60
+ @Field(type => [OrderToteSeal], { nullable: true })
61
+ orderToteSeals?: OrderToteSeal[]
62
+ }
@@ -0,0 +1,9 @@
1
+ import { OrderToteItem } from './order-tote-item'
2
+ import { OrderToteItemMutation } from './order-tote-item-mutation'
3
+ import { OrderToteItemQuery } from './order-tote-item-query'
4
+
5
+ export const entities = [OrderToteItem]
6
+ export const resolvers = [OrderToteItemQuery, OrderToteItemMutation]
7
+
8
+ export * from './order-tote-item-mutation'
9
+ export * from './order-tote-item-query'
@@ -0,0 +1,30 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { EntityManager, In } from 'typeorm'
3
+
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { OrderToteItem } from './order-tote-item'
7
+
8
+ @Resolver(OrderToteItem)
9
+ export class OrderToteItemMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => Boolean)
12
+ async deleteOrderToteItem(@Arg('name') id: string, @Ctx() context: any): Promise<Boolean> {
13
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
14
+
15
+ await tx.getRepository(OrderToteItem).delete({ domain, id })
16
+ return true
17
+ }
18
+
19
+ @Directive('@transaction')
20
+ @Mutation(returns => Boolean)
21
+ async deleteOrderToteItems(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<Boolean> {
22
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
23
+
24
+ await tx.getRepository(OrderToteItem).delete({
25
+ domain,
26
+ id: In(ids)
27
+ })
28
+ return true
29
+ }
30
+ }
@@ -0,0 +1,88 @@
1
+ import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { OrderProduct } from '../order-product/order-product'
6
+ import { OrderTote } from '../order-tote/order-tote'
7
+ import { buildQuery, Domain, Filter, Pagination, Sorting } from '@things-factory/shell'
8
+ import { OrderToteItem } from './order-tote-item'
9
+ import { OrderToteItemList } from './order-tote-item-types'
10
+ import { Tote } from '@things-factory/warehouse-base'
11
+ import { Bizplace } from '@things-factory/biz-base'
12
+ import { ReleaseGood } from '../release-good/release-good'
13
+ import { ProductInput } from '../invoice-product/invoice-product-types'
14
+
15
+ @Resolver(OrderToteItem)
16
+ export class OrderToteItemQuery {
17
+ @Query(returns => OrderToteItemList)
18
+ async orderToteItems(
19
+ @Ctx() context: any,
20
+ @Arg('toteNo', type => String) toteNo: String,
21
+ @Arg('orderNo', type => String) orderNo: String,
22
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
23
+ ): Promise<OrderToteItemList> {
24
+ try {
25
+ const { domain }: { domain: Domain } = context.state
26
+
27
+ const foundOrder: ReleaseGood = await getRepository(ReleaseGood).findOne({
28
+ where: { name: orderNo, domain }
29
+ })
30
+
31
+ const queryBuilder = getRepository(OrderToteItem).createQueryBuilder()
32
+ buildQuery(queryBuilder, { sortings }, context)
33
+
34
+ queryBuilder
35
+ .select('OrderToteItem.id', 'id')
36
+ .addSelect('OrderToteItem.name', 'name')
37
+ .addSelect('OrderProduct.id', 'orderProductId')
38
+ .addSelect('OrderProduct.name', 'orderProductName')
39
+ .addSelect('Domain.id', 'domainId')
40
+ .addSelect('Domain.name', 'domainName')
41
+ .addSelect('SUM(OrderToteItem.qty)', 'pickedQty')
42
+ .addSelect('Product.id', 'productId')
43
+ .addSelect('Product.sku', 'productSku')
44
+ .addSelect('Product.packingType', 'packingType')
45
+ .leftJoin('OrderToteItem.domain', 'Domain')
46
+ .leftJoin('OrderToteItem.orderProduct', 'OrderProduct')
47
+ .leftJoin('OrderProduct.product', 'Product')
48
+ .leftJoin('OrderToteItem.orderTote', 'OrderTote')
49
+ .where('"OrderTote"."release_good_id" = :foundOrderId', { foundOrderId: foundOrder.id })
50
+ .andWhere('Domain.id = :domainId', { domainId: domain.id })
51
+ .andWhere('"OrderTote"."name" = :toteName', { toteName: toteNo })
52
+ .groupBy('Product.id')
53
+ .addGroupBy('OrderToteItem.id')
54
+ .addGroupBy('Domain.id')
55
+ .addGroupBy('OrderProduct.id')
56
+
57
+ const items = await queryBuilder.getRawMany()
58
+
59
+ return {
60
+ items: items.map(itm => {
61
+ return {
62
+ ...itm,
63
+ orderProduct: {
64
+ id: itm.orderProductId,
65
+ name: itm.orderProductName,
66
+ product: { id: itm.productId, sku: itm.productSku, packingType: itm.packingType }
67
+ },
68
+ domain: { id: itm.domainId, name: itm.domainName },
69
+ qty: itm.pickedQty
70
+ }
71
+ }),
72
+ total: items.length
73
+ }
74
+ } catch (e) {
75
+ throw new Error(e)
76
+ }
77
+ }
78
+
79
+ @Query(returns => OrderToteItem)
80
+ async orderToteItem(@Arg('id') id: string, @Ctx() context: any): Promise<OrderToteItem> {
81
+ const { domain }: { domain: Domain } = context.state
82
+
83
+ return await getRepository(OrderToteItem).findOne({
84
+ where: { domain, id },
85
+ relations: ['domain', 'orderProduct', 'orderInventory', 'orderTote', 'updater']
86
+ })
87
+ }
88
+ }
@@ -0,0 +1,56 @@
1
+ import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ObjectRef } from '@things-factory/shell'
4
+
5
+ import { OrderToteItem } from './order-tote-item'
6
+
7
+ @ObjectType()
8
+ export class OrderToteItemList {
9
+ @Field(type => [OrderToteItem], { nullable: true })
10
+ items: OrderToteItem[]
11
+
12
+ @Field(type => Int, { nullable: true })
13
+ total: number
14
+ }
15
+
16
+ @InputType()
17
+ export class NewOrderToteItem {
18
+ @Field({ nullable: true })
19
+ name: string
20
+
21
+ @Field({ nullable: true })
22
+ description: string
23
+
24
+ @Field(type => ObjectRef, { nullable: true })
25
+ orderProduct: ObjectRef
26
+
27
+ @Field(type => ObjectRef, { nullable: true })
28
+ orderInventory: ObjectRef
29
+
30
+ @Field(type => ObjectRef, { nullable: true })
31
+ orderTote: ObjectRef
32
+
33
+ @Field(type => Int)
34
+ qty: number
35
+ }
36
+
37
+ @InputType()
38
+ export class OrderToteItemPatch {
39
+ @Field({ nullable: true })
40
+ id: string
41
+
42
+ @Field({ nullable: true })
43
+ name: string
44
+
45
+ @Field({ nullable: true })
46
+ description: string
47
+
48
+ @Field(type => ObjectRef, { nullable: true })
49
+ orderProduct: ObjectRef
50
+
51
+ @Field(type => ObjectRef, { nullable: true })
52
+ orderTote: ObjectRef
53
+
54
+ @Field(type => Int)
55
+ qty: number
56
+ }
@@ -0,0 +1,72 @@
1
+ import { Field, Int, ObjectType } from 'type-graphql'
2
+ import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { Domain } from '@things-factory/shell'
6
+ import { OrderTote } from '../order-tote/order-tote'
7
+ import { OrderProduct } from '../order-product/order-product'
8
+ import { OrderInventory } from '../order-inventory/order-inventory'
9
+
10
+ @Entity()
11
+ @Index('ix_order_tote_item_0', (orderToteItem: OrderToteItem) => [orderToteItem.name], { unique: true })
12
+ @ObjectType()
13
+ export class OrderToteItem {
14
+ @PrimaryGeneratedColumn('uuid')
15
+ @Field()
16
+ id: string
17
+
18
+ @ManyToOne(type => Domain)
19
+ @Field()
20
+ domain: Domain
21
+
22
+ @RelationId((orderToteItem: OrderToteItem) => orderToteItem.domain)
23
+ domainId: string
24
+
25
+ @Column()
26
+ @Field()
27
+ name: string
28
+
29
+ @ManyToOne(type => OrderInventory)
30
+ @Field(type => OrderInventory)
31
+ orderInventory?: OrderInventory
32
+
33
+ @RelationId((orderToteItem: OrderToteItem) => orderToteItem.orderInventory)
34
+ orderInventoryId: string
35
+
36
+ @ManyToOne(type => OrderProduct)
37
+ @Field(type => OrderProduct)
38
+ orderProduct?: OrderProduct
39
+
40
+ @RelationId((orderToteItem: OrderToteItem) => orderToteItem.orderProduct)
41
+ orderProductId: string
42
+
43
+ @ManyToOne(type => OrderTote)
44
+ @Field(type => OrderTote, { nullable: true })
45
+ orderTote?: OrderTote
46
+
47
+ @RelationId((orderToteItem: OrderToteItem) => orderToteItem.orderTote)
48
+ orderToteId: string
49
+
50
+ @Column('int')
51
+ @Field({ nullable: true })
52
+ qty?: number
53
+
54
+ @Field({ nullable: true })
55
+ sku?: string
56
+
57
+ @Field({ nullable: true })
58
+ packingType?: string
59
+
60
+ @UpdateDateColumn()
61
+ @Field({ nullable: true })
62
+ updatedAt: Date
63
+
64
+ @ManyToOne(type => User, {
65
+ nullable: true
66
+ })
67
+ @Field({ nullable: true })
68
+ updater: User
69
+
70
+ @RelationId((orderToteItem: OrderTote) => orderToteItem.updater)
71
+ updaterId: string
72
+ }
@@ -0,0 +1,9 @@
1
+ import { OrderToteSeal } from './order-tote-seal'
2
+ import { OrderToteSealMutation } from './order-tote-seal-mutation'
3
+ import { OrderToteSealQuery } from './order-tote-seal-query'
4
+
5
+ export const entities = [OrderToteSeal]
6
+ export const resolvers = [OrderToteSealQuery, OrderToteSealMutation]
7
+
8
+ export * from './order-tote-seal-mutation'
9
+ export * from './order-tote-seal-query'
@@ -0,0 +1,30 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { EntityManager, In } from 'typeorm'
3
+
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { OrderToteSeal } from './order-tote-seal'
7
+
8
+ @Resolver(OrderToteSeal)
9
+ export class OrderToteSealMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => Boolean)
12
+ async deleteOrderToteSeal(@Arg('name') id: string, @Ctx() context: any): Promise<Boolean> {
13
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
14
+
15
+ await tx.getRepository(OrderToteSeal).delete({ domain, id })
16
+ return true
17
+ }
18
+
19
+ @Directive('@transaction')
20
+ @Mutation(returns => Boolean)
21
+ async deleteOrderToteSeals(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<Boolean> {
22
+ const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
23
+
24
+ await tx.getRepository(OrderToteSeal).delete({
25
+ domain,
26
+ id: In(ids)
27
+ })
28
+ return true
29
+ }
30
+ }
@@ -0,0 +1,60 @@
1
+ import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { getRepository } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { OrderTote } from '../order-tote/order-tote'
6
+ import { buildQuery, Domain, Filter, Pagination, Sorting } from '@things-factory/shell'
7
+
8
+ import { OrderToteSeal } from './order-tote-seal'
9
+ import { OrderToteSealList } from './order-tote-seal-types'
10
+
11
+ @Resolver(OrderToteSeal)
12
+ export class OrderToteSealQuery {
13
+ @Query(returns => OrderToteSealList)
14
+ async orderToteSeals(
15
+ @Ctx() context: any,
16
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
17
+ @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
18
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
19
+ ): Promise<OrderToteSealList> {
20
+ const { domain }: { domain: Domain } = context.state
21
+
22
+ const queryBuilder = getRepository(OrderToteSeal).createQueryBuilder()
23
+ buildQuery(queryBuilder, { filters, pagination, sortings }, context)
24
+
25
+ queryBuilder
26
+ .leftJoinAndSelect('OrderToteSeal.domain', 'Domain')
27
+ .leftJoinAndSelect('OrderToteSeal.orderTote', 'OrderTote')
28
+ .leftJoinAndSelect('OrderToteSeal.updater', 'Updater')
29
+ .where('Domain.id = :domainId', { domainId: domain.id })
30
+
31
+ const [items, total] = await queryBuilder.getManyAndCount()
32
+
33
+ return { items, total }
34
+ }
35
+
36
+ @Query(returns => OrderToteSeal)
37
+ async orderToteSeal(@Arg('name') name: string, @Ctx() context: any): Promise<OrderToteSeal> {
38
+ const { domain }: { domain: Domain } = context.state
39
+
40
+ return await getRepository(OrderToteSeal).findOne({
41
+ where: { domain, name },
42
+ relations: ['domain', 'orderTote', 'updater']
43
+ })
44
+ }
45
+
46
+ @FieldResolver()
47
+ async domain(@Root() orderToteSeal: OrderToteSeal) {
48
+ return await getRepository(Domain).findOne(orderToteSeal.domainId)
49
+ }
50
+
51
+ @FieldResolver()
52
+ async updater(@Root() orderToteSeal: OrderToteSeal) {
53
+ return await getRepository(User).findOne(orderToteSeal.updaterId)
54
+ }
55
+
56
+ @FieldResolver()
57
+ async orderTote(@Root() orderToteSeal: OrderToteSeal) {
58
+ return await getRepository(OrderTote).findOne(orderToteSeal.orderToteId)
59
+ }
60
+ }
@@ -0,0 +1,41 @@
1
+ import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ObjectRef } from '@things-factory/shell'
4
+
5
+ import { OrderToteSeal } from './order-tote-seal'
6
+
7
+ @ObjectType()
8
+ export class OrderToteSealList {
9
+ @Field(type => [OrderToteSeal], { nullable: true })
10
+ items: OrderToteSeal[]
11
+
12
+ @Field(type => Int, { nullable: true })
13
+ total: number
14
+ }
15
+
16
+ @InputType()
17
+ export class NewOrderToteSeal {
18
+ @Field({ nullable: true })
19
+ name: string
20
+
21
+ @Field({ nullable: true })
22
+ description: string
23
+
24
+ @Field(type => ObjectRef, { nullable: true })
25
+ orderTote: ObjectRef
26
+ }
27
+
28
+ @InputType()
29
+ export class OrderToteSealPatch {
30
+ @Field({ nullable: true })
31
+ id: string
32
+
33
+ @Field({ nullable: true })
34
+ name: string
35
+
36
+ @Field({ nullable: true })
37
+ description: string
38
+
39
+ @Field(type => ObjectRef, { nullable: true })
40
+ orderTote: ObjectRef
41
+ }