@things-factory/sales-base 8.0.0-beta.8 → 8.0.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 (178) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +13 -13
  3. package/server/constants/attachment-type.ts +9 -0
  4. package/server/constants/index.ts +7 -0
  5. package/server/constants/load-type.ts +4 -0
  6. package/server/constants/order.ts +203 -0
  7. package/server/constants/product-group-type.ts +4 -0
  8. package/server/constants/release-good.ts +9 -0
  9. package/server/constants/transfer-order-type.ts +6 -0
  10. package/server/constants/validation-error-code.ts +3 -0
  11. package/server/constants/vas-target-type.ts +25 -0
  12. package/server/controllers/ecommerce/ecommerce-controller.ts +122 -0
  13. package/server/controllers/ecommerce/index.ts +2 -0
  14. package/server/controllers/ecommerce/sellercraft-controller.ts +182 -0
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/order-controller.ts +296 -0
  17. package/server/errors/index.ts +1 -0
  18. package/server/errors/validation-error.ts +25 -0
  19. package/server/index.ts +5 -0
  20. package/server/migrations/index.ts +9 -0
  21. package/server/service/arrival-notice/arrival-notice-mutation.ts +1152 -0
  22. package/server/service/arrival-notice/arrival-notice-query.ts +549 -0
  23. package/server/service/arrival-notice/arrival-notice-types.ts +310 -0
  24. package/server/service/arrival-notice/arrival-notice.ts +202 -0
  25. package/server/service/arrival-notice/index.ts +9 -0
  26. package/server/service/claim/claim-mutation.ts +308 -0
  27. package/server/service/claim/claim-query.ts +122 -0
  28. package/server/service/claim/claim-types.ts +130 -0
  29. package/server/service/claim/claim.ts +140 -0
  30. package/server/service/claim/index.ts +9 -0
  31. package/server/service/claim-detail/claim-detail-mutation.ts +102 -0
  32. package/server/service/claim-detail/claim-detail-query.ts +55 -0
  33. package/server/service/claim-detail/claim-detail-types.ts +47 -0
  34. package/server/service/claim-detail/claim-detail.ts +69 -0
  35. package/server/service/claim-detail/index.ts +9 -0
  36. package/server/service/claim-order/claim-order-mutation.ts +101 -0
  37. package/server/service/claim-order/claim-order-query.ts +47 -0
  38. package/server/service/claim-order/claim-order-types.ts +35 -0
  39. package/server/service/claim-order/claim-order.ts +81 -0
  40. package/server/service/claim-order/index.ts +9 -0
  41. package/server/service/collection-order/collection-order-mutation.ts +245 -0
  42. package/server/service/collection-order/collection-order-query.ts +97 -0
  43. package/server/service/collection-order/collection-order-types.ts +165 -0
  44. package/server/service/collection-order/collection-order.ts +135 -0
  45. package/server/service/collection-order/index.ts +9 -0
  46. package/server/service/delivery-order/delivery-order-mutation.ts +967 -0
  47. package/server/service/delivery-order/delivery-order-query.ts +631 -0
  48. package/server/service/delivery-order/delivery-order-types.ts +268 -0
  49. package/server/service/delivery-order/delivery-order.ts +258 -0
  50. package/server/service/delivery-order/index.ts +9 -0
  51. package/server/service/draft-release-good/draft-release-good-mutation.ts +765 -0
  52. package/server/service/draft-release-good/draft-release-good-query.ts +354 -0
  53. package/server/service/draft-release-good/draft-release-good-type.ts +261 -0
  54. package/server/service/draft-release-good/draft-release-good.ts +284 -0
  55. package/server/service/draft-release-good/index.ts +9 -0
  56. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +129 -0
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +280 -0
  58. package/server/service/goods-receival-note/goods-receival-note-types.ts +105 -0
  59. package/server/service/goods-receival-note/goods-receival-note.ts +127 -0
  60. package/server/service/goods-receival-note/index.ts +9 -0
  61. package/server/service/index.ts +238 -0
  62. package/server/service/inventory-check/index.ts +9 -0
  63. package/server/service/inventory-check/inventory-check-mutation.ts +149 -0
  64. package/server/service/inventory-check/inventory-check-query.ts +48 -0
  65. package/server/service/inventory-check/inventory-check-types.ts +48 -0
  66. package/server/service/inventory-check/inventory-check.ts +90 -0
  67. package/server/service/invoice/index.ts +9 -0
  68. package/server/service/invoice/invoice-mutation.ts +95 -0
  69. package/server/service/invoice/invoice-query.ts +53 -0
  70. package/server/service/invoice/invoice-types.ts +279 -0
  71. package/server/service/invoice/invoice.ts +230 -0
  72. package/server/service/invoice-product/index.ts +9 -0
  73. package/server/service/invoice-product/invoice-product-mutation.ts +54 -0
  74. package/server/service/invoice-product/invoice-product-query.ts +54 -0
  75. package/server/service/invoice-product/invoice-product-types.ts +84 -0
  76. package/server/service/invoice-product/invoice-product.ts +92 -0
  77. package/server/service/job-sheet/index.ts +9 -0
  78. package/server/service/job-sheet/job-sheet-mutation.ts +92 -0
  79. package/server/service/job-sheet/job-sheet-query.ts +112 -0
  80. package/server/service/job-sheet/job-sheet-types.ts +78 -0
  81. package/server/service/job-sheet/job-sheet.ts +102 -0
  82. package/server/service/manifest/index.ts +6 -0
  83. package/server/service/manifest/manifest-mutation.ts +190 -0
  84. package/server/service/manifest/manifest-query.ts +149 -0
  85. package/server/service/manifest/manifest-type.ts +84 -0
  86. package/server/service/manifest/manifest.ts +114 -0
  87. package/server/service/order-inventory/index.ts +9 -0
  88. package/server/service/order-inventory/order-inventory-mutation.ts +54 -0
  89. package/server/service/order-inventory/order-inventory-query.ts +722 -0
  90. package/server/service/order-inventory/order-inventory-types.ts +238 -0
  91. package/server/service/order-inventory/order-inventory.ts +401 -0
  92. package/server/service/order-product/index.ts +9 -0
  93. package/server/service/order-product/order-product-mutation.ts +48 -0
  94. package/server/service/order-product/order-product-query.ts +89 -0
  95. package/server/service/order-product/order-product-types.ts +335 -0
  96. package/server/service/order-product/order-product.ts +362 -0
  97. package/server/service/order-tote/index.ts +9 -0
  98. package/server/service/order-tote/order-tote-mutation.ts +31 -0
  99. package/server/service/order-tote/order-tote-query.ts +112 -0
  100. package/server/service/order-tote/order-tote-types.ts +47 -0
  101. package/server/service/order-tote/order-tote.ts +73 -0
  102. package/server/service/order-tote-item/index.ts +9 -0
  103. package/server/service/order-tote-item/order-tote-item-mutation.ts +31 -0
  104. package/server/service/order-tote-item/order-tote-item-query.ts +82 -0
  105. package/server/service/order-tote-item/order-tote-item-types.ts +56 -0
  106. package/server/service/order-tote-item/order-tote-item.ts +72 -0
  107. package/server/service/order-tote-seal/index.ts +9 -0
  108. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +31 -0
  109. package/server/service/order-tote-seal/order-tote-seal-query.ts +59 -0
  110. package/server/service/order-tote-seal/order-tote-seal-types.ts +41 -0
  111. package/server/service/order-tote-seal/order-tote-seal.ts +46 -0
  112. package/server/service/order-vas/index.ts +9 -0
  113. package/server/service/order-vas/order-vas-mutation.ts +20 -0
  114. package/server/service/order-vas/order-vas-query.ts +72 -0
  115. package/server/service/order-vas/order-vas-types.ts +159 -0
  116. package/server/service/order-vas/order-vas.ts +207 -0
  117. package/server/service/others/index.ts +5 -0
  118. package/server/service/others/other-query.ts +563 -0
  119. package/server/service/others/other-types.ts +115 -0
  120. package/server/service/purchase-order/index.ts +9 -0
  121. package/server/service/purchase-order/purchase-order-mutation.ts +458 -0
  122. package/server/service/purchase-order/purchase-order-query.ts +90 -0
  123. package/server/service/purchase-order/purchase-order-types.ts +154 -0
  124. package/server/service/purchase-order/purchase-order.ts +172 -0
  125. package/server/service/purchase-order-other-charge/index.ts +9 -0
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +31 -0
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +52 -0
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +44 -0
  129. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +68 -0
  130. package/server/service/release-good/index.ts +9 -0
  131. package/server/service/release-good/release-good-mutation.ts +1686 -0
  132. package/server/service/release-good/release-good-query.ts +980 -0
  133. package/server/service/release-good/release-good-types.ts +662 -0
  134. package/server/service/release-good/release-good.ts +490 -0
  135. package/server/service/retail-replenishment-order/index.ts +9 -0
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +382 -0
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +54 -0
  138. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +101 -0
  139. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +115 -0
  140. package/server/service/return-order/index.ts +9 -0
  141. package/server/service/return-order/return-order-mutation.ts +516 -0
  142. package/server/service/return-order/return-order-query.ts +226 -0
  143. package/server/service/return-order/return-order-types.ts +196 -0
  144. package/server/service/return-order/return-order.ts +127 -0
  145. package/server/service/reverse-kitting-order/index.ts +9 -0
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +500 -0
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +197 -0
  148. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +173 -0
  149. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +121 -0
  150. package/server/service/reverse-kitting-order-inventory/index.ts +9 -0
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +129 -0
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +52 -0
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +95 -0
  154. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +143 -0
  155. package/server/service/shipping-order/index.ts +9 -0
  156. package/server/service/shipping-order/shipping-order-mutation.ts +61 -0
  157. package/server/service/shipping-order/shipping-order-query.ts +61 -0
  158. package/server/service/shipping-order/shipping-order-types.ts +89 -0
  159. package/server/service/shipping-order/shipping-order.ts +129 -0
  160. package/server/service/transfer-order/index.ts +9 -0
  161. package/server/service/transfer-order/transfer-order-mutation.ts +309 -0
  162. package/server/service/transfer-order/transfer-order-query.ts +66 -0
  163. package/server/service/transfer-order/transfer-order-types.ts +97 -0
  164. package/server/service/transfer-order/transfer-order.ts +117 -0
  165. package/server/service/vas/index.ts +9 -0
  166. package/server/service/vas/vas-mutation.ts +106 -0
  167. package/server/service/vas/vas-query.ts +60 -0
  168. package/server/service/vas/vas-types.ts +71 -0
  169. package/server/service/vas/vas.ts +77 -0
  170. package/server/service/vas-order/index.ts +9 -0
  171. package/server/service/vas-order/vas-order-mutation.ts +259 -0
  172. package/server/service/vas-order/vas-order-query.ts +119 -0
  173. package/server/service/vas-order/vas-order-types.ts +49 -0
  174. package/server/service/vas-order/vas-order.ts +81 -0
  175. package/server/utils/datetime-util.ts +54 -0
  176. package/server/utils/index.ts +3 -0
  177. package/server/utils/inventory-util.ts +1155 -0
  178. package/server/utils/order-no-generator.ts +146 -0
@@ -0,0 +1,516 @@
1
+ import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
4
+ import { EntityManager, In } from 'typeorm'
5
+
6
+ import { Attachment, createAttachments } from '@things-factory/attachment-base'
7
+ import { Role } from '@things-factory/auth-base'
8
+ import { Bizplace, getDomainUsers } from '@things-factory/biz-base'
9
+ import { Product } from '@things-factory/product-base'
10
+ import { Inventory } from '@things-factory/warehouse-base'
11
+
12
+ import { NewOrderInventory, NewReturnOrder, OrderInventory, OrderVas, ReturnOrderPatch } from '../'
13
+ import { ATTACHMENT_TYPE, ORDER_INVENTORY_STATUS, ORDER_STATUS, ORDER_VAS_STATUS } from '../../constants'
14
+ import { OrderNoGenerator } from '../../utils'
15
+ import { ReturnOrder } from './return-order'
16
+
17
+ @Resolver(ReturnOrder)
18
+ export class ReturnOrderMutation {
19
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
20
+ @Directive('@transaction')
21
+ @Mutation(returns => Boolean)
22
+ async deleteReturnOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {
23
+ const { tx } = context.state
24
+
25
+ return await deleteReturnOrder(tx, name, context)
26
+ }
27
+
28
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
29
+ @Directive('@transaction')
30
+ @Mutation(returns => Boolean)
31
+ async deleteReturnOrders(
32
+ @Arg('names', type => [String]) names: string[],
33
+ @Ctx() context: ResolverContext
34
+ ): Promise<boolean> {
35
+ const { tx, domain } = context.state
36
+
37
+ await tx.getRepository(ReturnOrder).delete({
38
+ domain: { id: domain.id },
39
+ name: In(names)
40
+ })
41
+ return true
42
+ }
43
+
44
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
45
+ @Directive('@transaction')
46
+ @Mutation(returns => ReturnOrder)
47
+ async generateReturnOrder(
48
+ @Ctx() context: ResolverContext,
49
+ @Arg('file', type => [GraphQLUpload], { nullable: true }) file: FileUpload[],
50
+ @Arg('returnOrder', type => NewReturnOrder, { nullable: true }) returnOrder: NewReturnOrder
51
+ ): Promise<ReturnOrder> {
52
+ const { tx, domain, user } = context.state
53
+
54
+ const bizplace: Bizplace = await tx.getRepository(Bizplace).findOneBy({ id: returnOrder.customerBizplaceId })
55
+
56
+ let orderInventories: NewOrderInventory[] = returnOrder.orderInventories
57
+ let foundInv = Inventory
58
+
59
+ const mergedOrderInventories = orderInventories.reduce((acc, curr) => {
60
+ let existingItem = acc.find(
61
+ itm =>
62
+ itm.product.id === curr.product.id &&
63
+ itm.packingType === curr.packingType &&
64
+ itm.batchId === curr.batchId &&
65
+ itm.packingSize === curr.packingSize
66
+ )
67
+
68
+ if (!existingItem) {
69
+ acc.push(curr)
70
+ } else {
71
+ existingItem.returnQty = existingItem.returnQty + curr.returnQty
72
+ existingItem.returnUomValue = existingItem.returnUomValue + curr.returnUomValue
73
+ }
74
+
75
+ return acc
76
+ }, [])
77
+
78
+ returnOrder.orderInventories = mergedOrderInventories
79
+
80
+ let newReturnOrder: NewReturnOrder = {
81
+ ...returnOrder,
82
+ name: OrderNoGenerator.returnOrder(),
83
+ domain,
84
+ bizplace,
85
+ status: ORDER_STATUS.PENDING,
86
+ creator: user,
87
+ updater: user
88
+ }
89
+
90
+ if (newReturnOrder.orderInventories[0].returnQty < 0) {
91
+ throw new Error('invalid return quantity')
92
+ }
93
+
94
+ let createdReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).save(newReturnOrder as any)
95
+
96
+ for (let moi of mergedOrderInventories) {
97
+ let newOrderInv: OrderInventory = Object.assign({}, moi) as any
98
+ newOrderInv.domain = domain
99
+ newOrderInv.bizplace = bizplace
100
+ newOrderInv.status = ORDER_INVENTORY_STATUS.PENDING
101
+ newOrderInv.name = OrderNoGenerator.orderInventory()
102
+ newOrderInv.returnOrder = createdReturnOrder
103
+ newOrderInv.product = await tx.getRepository(Product).findOneBy({ id: moi.product.id })
104
+ newOrderInv.creator = user
105
+ newOrderInv.updater = user
106
+
107
+ if (newOrderInv.inventory?.id) {
108
+ foundInv = (await tx.getRepository(Inventory).findOneBy({ id: newOrderInv.inventory.id })) as any
109
+ newOrderInv.inventory = foundInv as any
110
+ }
111
+
112
+ await tx.getRepository(OrderInventory).save(newOrderInv)
113
+ }
114
+
115
+ if (file?.length > 0) {
116
+ const attachments: Partial<Attachment>[] = file.map(attachment => {
117
+ return {
118
+ file: attachment,
119
+ refType: ATTACHMENT_TYPE.RETURN_ORDER,
120
+ refBy: createdReturnOrder.id,
121
+ category: ATTACHMENT_TYPE.RETURN_ORDER /* TODO use refType */
122
+ }
123
+ })
124
+ await createAttachments(null, { attachments }, context)
125
+ }
126
+
127
+ return createdReturnOrder
128
+ }
129
+
130
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
131
+ @Directive('@transaction')
132
+ @Mutation(returns => ReturnOrder)
133
+ async confirmReturnOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<ReturnOrder> {
134
+ const { tx } = context.state
135
+
136
+ const returnOrder: ReturnOrder = await confirmReturnOrder(tx, name, context)
137
+
138
+ return returnOrder
139
+ }
140
+
141
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
142
+ @Directive('@transaction')
143
+ @Mutation(returns => ReturnOrder)
144
+ async receiveReturnOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<ReturnOrder> {
145
+ const { tx } = context.state
146
+ const returnOrder: ReturnOrder = await receiveReturnOrder(tx, name, context)
147
+
148
+ return returnOrder
149
+ }
150
+
151
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
152
+ @Directive('@transaction')
153
+ @Mutation(returns => ReturnOrder)
154
+ async rejectReturnOrder(
155
+ @Arg('name') name: string,
156
+ @Arg('patch', type => ReturnOrderPatch) patch: ReturnOrderPatch,
157
+ @Ctx() context: ResolverContext
158
+ ): Promise<ReturnOrder> {
159
+ const { tx } = context.state
160
+ const returnOrder: ReturnOrder = await rejectReturnOrder(tx, name, patch.remark, context)
161
+
162
+ return returnOrder
163
+ }
164
+
165
+ @Directive('@privilege(category: "order_customer", privilege: "mutation")')
166
+ @Directive('@transaction')
167
+ @Mutation(returns => ReturnOrder)
168
+ async checkReturnOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<ReturnOrder> {
169
+ const { tx } = context.state
170
+ const returnOrder: ReturnOrder = await checkReturnOrder(tx, name, context)
171
+
172
+ return returnOrder
173
+ }
174
+ }
175
+
176
+ export async function deleteReturnOrder(tx: EntityManager, name: string, context: ResolverContext): Promise<boolean> {
177
+ const { domain } = context.state
178
+
179
+ let foundReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).findOne({
180
+ where: { domain: { id: domain.id }, name },
181
+ relations: ['orderInventories', 'orderInventories.inventory', 'orderVass', 'creator', 'updater']
182
+ })
183
+
184
+ if (!foundReturnOrder) throw new Error(`Return Order doesn't exists.`)
185
+ const foundOIs: OrderInventory[] = foundReturnOrder.orderInventories
186
+ const foundOVs: OrderVas[] = foundReturnOrder.orderVass
187
+
188
+ let foundAttachment: Attachment
189
+ if (foundReturnOrder?.ownTransport) {
190
+ foundAttachment = await tx.getRepository(Attachment).findOne({
191
+ where: {
192
+ domain: { id: domain.id },
193
+ refBy: foundReturnOrder.id,
194
+ category: ATTACHMENT_TYPE.RETURN_ORDER
195
+ }
196
+ })
197
+ }
198
+
199
+ // Update locked qty and locked weight of inventories and return id list of order inventories
200
+ const inventoryIds: string[] = foundOIs.map((oi: OrderInventory) => oi.id)
201
+
202
+ // Delete order inventories by ids
203
+ if (inventoryIds.length) {
204
+ await tx.getRepository(OrderInventory).delete({ id: In(inventoryIds) })
205
+ }
206
+
207
+ // 2. delete order vass
208
+ const vasIds = foundOVs.map((vas: OrderVas) => vas.id)
209
+ if (vasIds.length) {
210
+ await tx.getRepository(OrderVas).delete({ id: In(vasIds) })
211
+ }
212
+
213
+ if (foundAttachment) {
214
+ await tx.getRepository(Attachment).delete({ domain: { id: domain.id }, id: foundAttachment.id })
215
+ }
216
+
217
+ await tx.getRepository(ReturnOrder).delete({ domain: { id: domain.id }, name })
218
+ return true
219
+ }
220
+
221
+ export async function confirmReturnOrder(
222
+ tx: EntityManager,
223
+ name: string,
224
+ context: ResolverContext
225
+ ): Promise<ReturnOrder> {
226
+ const { domain, user } = context.state
227
+
228
+ const foundReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).findOne({
229
+ where: { domain: { id: domain.id }, name, status: ORDER_STATUS.PENDING },
230
+ relations: ['bizplace', 'orderInventories', 'orderVass']
231
+ })
232
+
233
+ if (!foundReturnOrder) throw new Error(`Return order doesn't exists.`)
234
+ let foundOIs: OrderInventory[] = foundReturnOrder.orderInventories
235
+ let foundOVs: OrderVas[] = foundReturnOrder.orderVass
236
+ let customerBizplace: Bizplace = foundReturnOrder.bizplace
237
+
238
+ // 1. RO Status change (PENDING => PENDING_RECEIVE)
239
+ const returnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).save({
240
+ ...foundReturnOrder,
241
+ status: ORDER_STATUS.PENDING_RECEIVE,
242
+ updater: user
243
+ })
244
+
245
+ // 1. Update status of order inventories
246
+ foundOIs = foundOIs.map((orderInventory: OrderInventory) => {
247
+ return {
248
+ ...orderInventory,
249
+ status: ORDER_INVENTORY_STATUS.PENDING_RECEIVE,
250
+ updater: user
251
+ }
252
+ })
253
+ await tx.getRepository(OrderInventory).save(foundOIs)
254
+
255
+ // 2. Update status of order vass
256
+ if (foundOVs && foundOVs.length) {
257
+ foundOVs = foundOVs.map((orderVas: OrderVas) => {
258
+ return {
259
+ ...orderVas,
260
+ status: ORDER_VAS_STATUS.PENDING_RECEIVE,
261
+ updater: user
262
+ }
263
+ })
264
+ await tx.getRepository(OrderVas).save(foundOVs)
265
+ }
266
+
267
+ // notification logics
268
+ // get Office Admin Users
269
+ const users: any[] = await tx
270
+ .getRepository('users_roles')
271
+ .createQueryBuilder('ur')
272
+ .select('ur.users_id', 'id')
273
+ .where(qb => {
274
+ const subQuery = qb
275
+ .subQuery()
276
+ .select('role.id')
277
+ .from(Role, 'role')
278
+ .where("role.name = 'Office Admin'")
279
+ .andWhere('role.domain_id = :domain', { domain: domain.id })
280
+ .getQuery()
281
+ return 'ur.roles_id IN ' + subQuery
282
+ })
283
+ .getRawMany()
284
+
285
+ // send notification to Office Admin Users
286
+ if (users?.length && context.header?.referer) {
287
+ const receivers: any[] = users.map(user => user.id)
288
+ const msg = {
289
+ title: `New Return Order from ${customerBizplace.name}`,
290
+ body: `New incoming order, ${foundReturnOrder.name} is pending for receiving`,
291
+ url: context.header.referer,
292
+ data: { url: context.header.referer }
293
+ }
294
+ /**
295
+ * @notes Temporary off sendNotification due to suspect of causing wms down
296
+ */
297
+
298
+ // await sendNotification({
299
+ // receivers,
300
+ // message: { ...msg }
301
+ // })
302
+ }
303
+
304
+ return returnOrder
305
+ }
306
+
307
+ export async function receiveReturnOrder(
308
+ tx: EntityManager,
309
+ name: string,
310
+ context: ResolverContext
311
+ ): Promise<ReturnOrder> {
312
+ const { domain, user } = context.state
313
+
314
+ const foundReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).findOne({
315
+ where: { domain: { id: domain.id }, name, status: ORDER_STATUS.PENDING_RECEIVE },
316
+ relations: ['bizplace', 'orderInventories', 'orderVass']
317
+ })
318
+
319
+ if (!foundReturnOrder) throw new Error(`Return order doesn't exists.`)
320
+ let foundOIs: OrderInventory[] = foundReturnOrder.orderInventories
321
+ let foundOVs: OrderVas[] = foundReturnOrder.orderVass
322
+
323
+ // 1. RO Status change (PENDING_RECEIVE => INTRANSIT)
324
+ const returnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).save({
325
+ ...foundReturnOrder,
326
+ status: ORDER_STATUS.INTRANSIT,
327
+ updater: user,
328
+ acceptedBy: user,
329
+ acceptedAt: new Date()
330
+ })
331
+
332
+ // 1. Update status of order inventories
333
+ foundOIs = foundOIs.map((orderInventory: OrderInventory) => {
334
+ return {
335
+ ...orderInventory,
336
+ status: ORDER_INVENTORY_STATUS.INTRANSIT,
337
+ updater: user
338
+ }
339
+ })
340
+ await tx.getRepository(OrderInventory).save(foundOIs)
341
+
342
+ // 2. Update status of order vass
343
+ if (foundOVs && foundOVs.length) {
344
+ foundOVs = foundOVs.map((orderVas: OrderVas) => {
345
+ return {
346
+ ...orderVas,
347
+ status: ORDER_VAS_STATUS.INTRANSIT,
348
+ updater: user
349
+ }
350
+ })
351
+ await tx.getRepository(OrderVas).save(foundOVs)
352
+ }
353
+
354
+ // notification logics
355
+ const users: any[] = await getDomainUsers(foundReturnOrder?.bizplace, tx)
356
+
357
+ if (users?.length && context.header?.referer) {
358
+ const receivers: any[] = users.map(user => user.id)
359
+ const msg = {
360
+ title: `Latest status for ${foundReturnOrder.name}`,
361
+ body: `Your Return Order has been received and processed by ${domain.name}`,
362
+ url: context.header.referer,
363
+ data: { url: context.header.referer }
364
+ }
365
+
366
+ /**
367
+ * @notes Temporary off sendNotification due to suspect of causing wms down
368
+ */
369
+
370
+ // await sendNotification({
371
+ // receivers,
372
+ // message: { ...msg }
373
+ // })
374
+ }
375
+
376
+ return returnOrder
377
+ }
378
+
379
+ export async function rejectReturnOrder(
380
+ tx: EntityManager,
381
+ name: string,
382
+ remark: string,
383
+ context: any
384
+ ): Promise<ReturnOrder> {
385
+ const { domain, user } = context.state
386
+
387
+ const foundReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).findOne({
388
+ where: { domain: { id: domain.id }, name, status: ORDER_STATUS.PENDING_RECEIVE },
389
+ relations: ['bizplace', 'orderInventories', 'orderVass']
390
+ })
391
+
392
+ if (!foundReturnOrder) throw new Error(`Return order doesn't exists.`)
393
+ if (!remark) throw new Error('Remark is not exist.')
394
+
395
+ let foundOIs: OrderInventory[] = foundReturnOrder.orderInventories
396
+ let foundOVs: OrderVas[] = foundReturnOrder.orderVass
397
+
398
+ foundReturnOrder.remark = remark
399
+ foundReturnOrder.status = ORDER_STATUS.REJECTED
400
+ foundReturnOrder.updater = user
401
+ await tx.getRepository(ReturnOrder).save(foundReturnOrder)
402
+
403
+ // 1. Update status of order inventories
404
+ foundOIs = foundOIs.map((orderInventory: OrderInventory) => {
405
+ return {
406
+ ...orderInventory,
407
+ status: ORDER_INVENTORY_STATUS.REJECTED,
408
+ updater: user
409
+ }
410
+ })
411
+ await tx.getRepository(OrderInventory).save(foundOIs)
412
+
413
+ // 2. Update status of order vass
414
+ if (foundOVs && foundOVs.length) {
415
+ foundOVs = foundOVs.map((orderVas: OrderVas) => {
416
+ return {
417
+ ...orderVas,
418
+ status: ORDER_VAS_STATUS.REJECTED,
419
+ updater: user
420
+ }
421
+ })
422
+ await tx.getRepository(OrderVas).save(foundOVs)
423
+ }
424
+
425
+ // notification logics
426
+ const users: any[] = await getDomainUsers(foundReturnOrder?.bizplace, tx)
427
+
428
+ if (users?.length && context.header?.referer) {
429
+ const receivers: any[] = users.map(user => user.id)
430
+ const msg = {
431
+ title: `Latest status for ${foundReturnOrder.name}`,
432
+ body: `Your Return Order has been rejected.`,
433
+ url: context.header.referer,
434
+ data: { url: context.header.referer }
435
+ }
436
+
437
+ /**
438
+ * @notes Temporary off sendNotification due to suspect of causing wms down
439
+ */
440
+
441
+ // await sendNotification({
442
+ // receivers,
443
+ // message: { ...msg }
444
+ // })
445
+ }
446
+
447
+ return foundReturnOrder
448
+ }
449
+
450
+ export async function checkReturnOrder(
451
+ tx: EntityManager,
452
+ name: string,
453
+ context: ResolverContext
454
+ ): Promise<ReturnOrder> {
455
+ const { domain, user } = context.state
456
+
457
+ const foundReturnOrder: ReturnOrder = await tx.getRepository(ReturnOrder).findOne({
458
+ where: { domain: { id: domain.id }, name, status: ORDER_STATUS.INTRANSIT },
459
+ relations: ['bizplace', 'orderInventories', 'orderVass']
460
+ })
461
+
462
+ if (!foundReturnOrder) throw new Error(`Return order doesn't exists.`)
463
+
464
+ let foundOIs: OrderInventory[] = foundReturnOrder.orderInventories
465
+ let foundOVs: OrderVas[] = foundReturnOrder.orderVass
466
+
467
+ foundReturnOrder.status = ORDER_STATUS.ARRIVED
468
+ foundReturnOrder.updater = user
469
+ await tx.getRepository(ReturnOrder).save(foundReturnOrder)
470
+
471
+ // 1. Update status of order inventories
472
+ foundOIs = foundOIs.map((orderInventory: OrderInventory) => {
473
+ return {
474
+ ...orderInventory,
475
+ status: ORDER_INVENTORY_STATUS.ARRIVED,
476
+ updater: user
477
+ }
478
+ })
479
+ await tx.getRepository(OrderInventory).save(foundOIs)
480
+
481
+ // 2. Update status of order vass
482
+ if (foundOVs && foundOVs.length) {
483
+ foundOVs = foundOVs.map((orderVas: OrderVas) => {
484
+ return {
485
+ ...orderVas,
486
+ status: ORDER_VAS_STATUS.ARRIVED,
487
+ updater: user
488
+ }
489
+ })
490
+ await tx.getRepository(OrderVas).save(foundOVs)
491
+ }
492
+
493
+ // notification logics
494
+ const users: any[] = await getDomainUsers(foundReturnOrder?.bizplace, tx)
495
+
496
+ if (users?.length && context.header?.referer) {
497
+ const receivers: any[] = users.map(user => user.id)
498
+ const msg = {
499
+ title: `Latest status for ${foundReturnOrder.name}`,
500
+ body: `Your goods has safely arrived at ${domain.name}.`,
501
+ url: context.header.referer,
502
+ data: { url: context.header.referer }
503
+ }
504
+
505
+ /**
506
+ * @notes Temporary off sendNotification due to suspect of causing wms down
507
+ */
508
+
509
+ // await sendNotification({
510
+ // receivers,
511
+ // message: { ...msg }
512
+ // })
513
+ }
514
+
515
+ return foundReturnOrder
516
+ }