@things-factory/sales-base 4.3.0-alpha.1 → 4.3.2

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 (173) 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 +2 -5
  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/controllers/ecommerce/index.js +1 -5
  10. package/dist-server/controllers/ecommerce/index.js.map +1 -1
  11. package/dist-server/controllers/index.js +1 -5
  12. package/dist-server/controllers/index.js.map +1 -1
  13. package/dist-server/errors/index.js +1 -5
  14. package/dist-server/errors/index.js.map +1 -1
  15. package/dist-server/errors/validation-error.js +1 -5
  16. package/dist-server/errors/validation-error.js.map +1 -1
  17. package/dist-server/index.js +1 -5
  18. package/dist-server/index.js.map +1 -1
  19. package/dist-server/service/arrival-notice/index.js +1 -5
  20. package/dist-server/service/arrival-notice/index.js.map +1 -1
  21. package/dist-server/service/claim/index.js +1 -5
  22. package/dist-server/service/claim/index.js.map +1 -1
  23. package/dist-server/service/claim-detail/index.js +1 -5
  24. package/dist-server/service/claim-detail/index.js.map +1 -1
  25. package/dist-server/service/claim-order/index.js +1 -5
  26. package/dist-server/service/claim-order/index.js.map +1 -1
  27. package/dist-server/service/collection-order/index.js +1 -5
  28. package/dist-server/service/collection-order/index.js.map +1 -1
  29. package/dist-server/service/delivery-order/index.js +1 -5
  30. package/dist-server/service/delivery-order/index.js.map +1 -1
  31. package/dist-server/service/draft-release-good/draft-release-good-mutation.js +501 -0
  32. package/dist-server/service/draft-release-good/draft-release-good-mutation.js.map +1 -0
  33. package/dist-server/service/draft-release-good/draft-release-good-query.js +289 -0
  34. package/dist-server/service/draft-release-good/draft-release-good-query.js.map +1 -0
  35. package/dist-server/service/draft-release-good/draft-release-good-type.js +364 -0
  36. package/dist-server/service/draft-release-good/draft-release-good-type.js.map +1 -0
  37. package/dist-server/service/draft-release-good/draft-release-good.js +321 -0
  38. package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -0
  39. package/dist-server/service/draft-release-good/index.js +21 -0
  40. package/dist-server/service/draft-release-good/index.js.map +1 -0
  41. package/dist-server/service/goods-receival-note/index.js +1 -5
  42. package/dist-server/service/goods-receival-note/index.js.map +1 -1
  43. package/dist-server/service/index.js +48 -24
  44. package/dist-server/service/index.js.map +1 -1
  45. package/dist-server/service/inventory-check/index.js +1 -5
  46. package/dist-server/service/inventory-check/index.js.map +1 -1
  47. package/dist-server/service/invoice/index.js +1 -5
  48. package/dist-server/service/invoice/index.js.map +1 -1
  49. package/dist-server/service/invoice-product/index.js +1 -5
  50. package/dist-server/service/invoice-product/index.js.map +1 -1
  51. package/dist-server/service/job-sheet/index.js +1 -5
  52. package/dist-server/service/job-sheet/index.js.map +1 -1
  53. package/dist-server/service/order-inventory/index.js +1 -5
  54. package/dist-server/service/order-inventory/index.js.map +1 -1
  55. package/dist-server/service/order-inventory/order-inventory-query.js +38 -1
  56. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  57. package/dist-server/service/order-inventory/order-inventory-types.js +9 -1
  58. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  59. package/dist-server/service/order-inventory/order-inventory.js +5 -1
  60. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  61. package/dist-server/service/order-product/index.js +1 -5
  62. package/dist-server/service/order-product/index.js.map +1 -1
  63. package/dist-server/service/order-product/order-product-types.js +13 -13
  64. package/dist-server/service/order-product/order-product-types.js.map +1 -1
  65. package/dist-server/service/order-product/order-product.js +39 -4
  66. package/dist-server/service/order-product/order-product.js.map +1 -1
  67. package/dist-server/service/order-tote/index.js +21 -0
  68. package/dist-server/service/order-tote/index.js.map +1 -0
  69. package/dist-server/service/order-tote/order-tote-mutation.js +56 -0
  70. package/dist-server/service/order-tote/order-tote-mutation.js.map +1 -0
  71. package/dist-server/service/order-tote/order-tote-query.js +123 -0
  72. package/dist-server/service/order-tote/order-tote-query.js.map +1 -0
  73. package/dist-server/service/order-tote/order-tote-types.js +79 -0
  74. package/dist-server/service/order-tote/order-tote-types.js.map +1 -0
  75. package/dist-server/service/order-tote/order-tote.js +91 -0
  76. package/dist-server/service/order-tote/order-tote.js.map +1 -0
  77. package/dist-server/service/order-tote-item/index.js +21 -0
  78. package/dist-server/service/order-tote-item/index.js.map +1 -0
  79. package/dist-server/service/order-tote-item/order-tote-item-mutation.js +56 -0
  80. package/dist-server/service/order-tote-item/order-tote-item-mutation.js.map +1 -0
  81. package/dist-server/service/order-tote-item/order-tote-item-query.js +100 -0
  82. package/dist-server/service/order-tote-item/order-tote-item-query.js.map +1 -0
  83. package/dist-server/service/order-tote-item/order-tote-item-types.js +91 -0
  84. package/dist-server/service/order-tote-item/order-tote-item-types.js.map +1 -0
  85. package/dist-server/service/order-tote-item/order-tote-item.js +104 -0
  86. package/dist-server/service/order-tote-item/order-tote-item.js.map +1 -0
  87. package/dist-server/service/order-tote-seal/index.js +21 -0
  88. package/dist-server/service/order-tote-seal/index.js.map +1 -0
  89. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js +56 -0
  90. package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js.map +1 -0
  91. package/dist-server/service/order-tote-seal/order-tote-seal-query.js +97 -0
  92. package/dist-server/service/order-tote-seal/order-tote-seal-query.js.map +1 -0
  93. package/dist-server/service/order-tote-seal/order-tote-seal-types.js +71 -0
  94. package/dist-server/service/order-tote-seal/order-tote-seal-types.js.map +1 -0
  95. package/dist-server/service/order-tote-seal/order-tote-seal.js +71 -0
  96. package/dist-server/service/order-tote-seal/order-tote-seal.js.map +1 -0
  97. package/dist-server/service/order-vas/index.js +1 -5
  98. package/dist-server/service/order-vas/index.js.map +1 -1
  99. package/dist-server/service/others/index.js +1 -5
  100. package/dist-server/service/others/index.js.map +1 -1
  101. package/dist-server/service/others/other-query.js +37 -2
  102. package/dist-server/service/others/other-query.js.map +1 -1
  103. package/dist-server/service/purchase-order/index.js +1 -5
  104. package/dist-server/service/purchase-order/index.js.map +1 -1
  105. package/dist-server/service/purchase-order-other-charge/index.js +1 -5
  106. package/dist-server/service/purchase-order-other-charge/index.js.map +1 -1
  107. package/dist-server/service/release-good/index.js +1 -5
  108. package/dist-server/service/release-good/index.js.map +1 -1
  109. package/dist-server/service/release-good/release-good-mutation.js +23 -1
  110. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  111. package/dist-server/service/release-good/release-good-query.js +28 -2
  112. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  113. package/dist-server/service/release-good/release-good.js +32 -12
  114. package/dist-server/service/release-good/release-good.js.map +1 -1
  115. package/dist-server/service/retail-replenishment-order/index.js +1 -5
  116. package/dist-server/service/retail-replenishment-order/index.js.map +1 -1
  117. package/dist-server/service/return-order/index.js +1 -5
  118. package/dist-server/service/return-order/index.js.map +1 -1
  119. package/dist-server/service/reverse-kitting-order/index.js +1 -5
  120. package/dist-server/service/reverse-kitting-order/index.js.map +1 -1
  121. package/dist-server/service/reverse-kitting-order-inventory/index.js +1 -5
  122. package/dist-server/service/reverse-kitting-order-inventory/index.js.map +1 -1
  123. package/dist-server/service/shipping-order/index.js +1 -5
  124. package/dist-server/service/shipping-order/index.js.map +1 -1
  125. package/dist-server/service/transfer-order/index.js +1 -5
  126. package/dist-server/service/transfer-order/index.js.map +1 -1
  127. package/dist-server/service/vas/index.js +1 -5
  128. package/dist-server/service/vas/index.js.map +1 -1
  129. package/dist-server/service/vas-order/index.js +1 -5
  130. package/dist-server/service/vas-order/index.js.map +1 -1
  131. package/dist-server/utils/index.js +1 -5
  132. package/dist-server/utils/index.js.map +1 -1
  133. package/dist-server/utils/inventory-util.js +258 -99
  134. package/dist-server/utils/inventory-util.js.map +1 -1
  135. package/dist-server/utils/order-no-generator.js +7 -0
  136. package/dist-server/utils/order-no-generator.js.map +1 -1
  137. package/package.json +13 -13
  138. package/server/constants/attachment-type.ts +2 -1
  139. package/server/constants/index.ts +1 -0
  140. package/server/constants/order.ts +12 -2
  141. package/server/constants/release-good.ts +6 -0
  142. package/server/service/draft-release-good/draft-release-good-mutation.ts +671 -0
  143. package/server/service/draft-release-good/draft-release-good-query.ts +314 -0
  144. package/server/service/draft-release-good/draft-release-good-type.ts +261 -0
  145. package/server/service/draft-release-good/draft-release-good.ts +270 -0
  146. package/server/service/draft-release-good/index.ts +9 -0
  147. package/server/service/index.ts +51 -21
  148. package/server/service/order-inventory/order-inventory-query.ts +40 -2
  149. package/server/service/order-inventory/order-inventory-types.ts +6 -0
  150. package/server/service/order-inventory/order-inventory.ts +5 -5
  151. package/server/service/order-product/order-product-types.ts +5 -3
  152. package/server/service/order-product/order-product.ts +30 -3
  153. package/server/service/order-tote/index.ts +9 -0
  154. package/server/service/order-tote/order-tote-mutation.ts +30 -0
  155. package/server/service/order-tote/order-tote-query.ts +114 -0
  156. package/server/service/order-tote/order-tote-types.ts +47 -0
  157. package/server/service/order-tote/order-tote.ts +62 -0
  158. package/server/service/order-tote-item/index.ts +9 -0
  159. package/server/service/order-tote-item/order-tote-item-mutation.ts +30 -0
  160. package/server/service/order-tote-item/order-tote-item-query.ts +88 -0
  161. package/server/service/order-tote-item/order-tote-item-types.ts +56 -0
  162. package/server/service/order-tote-item/order-tote-item.ts +72 -0
  163. package/server/service/order-tote-seal/index.ts +9 -0
  164. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +30 -0
  165. package/server/service/order-tote-seal/order-tote-seal-query.ts +60 -0
  166. package/server/service/order-tote-seal/order-tote-seal-types.ts +41 -0
  167. package/server/service/order-tote-seal/order-tote-seal.ts +46 -0
  168. package/server/service/others/other-query.ts +43 -8
  169. package/server/service/release-good/release-good-mutation.ts +24 -2
  170. package/server/service/release-good/release-good-query.ts +57 -30
  171. package/server/service/release-good/release-good.ts +28 -9
  172. package/server/utils/inventory-util.ts +287 -106
  173. 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
+ }