@things-factory/sales-base 8.0.3 → 8.0.6

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 +12 -12
  3. package/server/constants/attachment-type.ts +0 -9
  4. package/server/constants/index.ts +0 -7
  5. package/server/constants/load-type.ts +0 -4
  6. package/server/constants/order.ts +0 -203
  7. package/server/constants/product-group-type.ts +0 -4
  8. package/server/constants/release-good.ts +0 -9
  9. package/server/constants/transfer-order-type.ts +0 -6
  10. package/server/constants/validation-error-code.ts +0 -3
  11. package/server/constants/vas-target-type.ts +0 -25
  12. package/server/controllers/ecommerce/ecommerce-controller.ts +0 -122
  13. package/server/controllers/ecommerce/index.ts +0 -2
  14. package/server/controllers/ecommerce/sellercraft-controller.ts +0 -182
  15. package/server/controllers/index.ts +0 -2
  16. package/server/controllers/order-controller.ts +0 -296
  17. package/server/errors/index.ts +0 -1
  18. package/server/errors/validation-error.ts +0 -25
  19. package/server/index.ts +0 -5
  20. package/server/migrations/index.ts +0 -9
  21. package/server/service/arrival-notice/arrival-notice-mutation.ts +0 -1152
  22. package/server/service/arrival-notice/arrival-notice-query.ts +0 -549
  23. package/server/service/arrival-notice/arrival-notice-types.ts +0 -310
  24. package/server/service/arrival-notice/arrival-notice.ts +0 -202
  25. package/server/service/arrival-notice/index.ts +0 -9
  26. package/server/service/claim/claim-mutation.ts +0 -308
  27. package/server/service/claim/claim-query.ts +0 -122
  28. package/server/service/claim/claim-types.ts +0 -130
  29. package/server/service/claim/claim.ts +0 -140
  30. package/server/service/claim/index.ts +0 -9
  31. package/server/service/claim-detail/claim-detail-mutation.ts +0 -102
  32. package/server/service/claim-detail/claim-detail-query.ts +0 -55
  33. package/server/service/claim-detail/claim-detail-types.ts +0 -47
  34. package/server/service/claim-detail/claim-detail.ts +0 -69
  35. package/server/service/claim-detail/index.ts +0 -9
  36. package/server/service/claim-order/claim-order-mutation.ts +0 -101
  37. package/server/service/claim-order/claim-order-query.ts +0 -47
  38. package/server/service/claim-order/claim-order-types.ts +0 -35
  39. package/server/service/claim-order/claim-order.ts +0 -81
  40. package/server/service/claim-order/index.ts +0 -9
  41. package/server/service/collection-order/collection-order-mutation.ts +0 -245
  42. package/server/service/collection-order/collection-order-query.ts +0 -97
  43. package/server/service/collection-order/collection-order-types.ts +0 -165
  44. package/server/service/collection-order/collection-order.ts +0 -135
  45. package/server/service/collection-order/index.ts +0 -9
  46. package/server/service/delivery-order/delivery-order-mutation.ts +0 -967
  47. package/server/service/delivery-order/delivery-order-query.ts +0 -631
  48. package/server/service/delivery-order/delivery-order-types.ts +0 -268
  49. package/server/service/delivery-order/delivery-order.ts +0 -258
  50. package/server/service/delivery-order/index.ts +0 -9
  51. package/server/service/draft-release-good/draft-release-good-mutation.ts +0 -765
  52. package/server/service/draft-release-good/draft-release-good-query.ts +0 -354
  53. package/server/service/draft-release-good/draft-release-good-type.ts +0 -261
  54. package/server/service/draft-release-good/draft-release-good.ts +0 -284
  55. package/server/service/draft-release-good/index.ts +0 -9
  56. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +0 -129
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +0 -280
  58. package/server/service/goods-receival-note/goods-receival-note-types.ts +0 -105
  59. package/server/service/goods-receival-note/goods-receival-note.ts +0 -127
  60. package/server/service/goods-receival-note/index.ts +0 -9
  61. package/server/service/index.ts +0 -238
  62. package/server/service/inventory-check/index.ts +0 -9
  63. package/server/service/inventory-check/inventory-check-mutation.ts +0 -149
  64. package/server/service/inventory-check/inventory-check-query.ts +0 -48
  65. package/server/service/inventory-check/inventory-check-types.ts +0 -48
  66. package/server/service/inventory-check/inventory-check.ts +0 -90
  67. package/server/service/invoice/index.ts +0 -9
  68. package/server/service/invoice/invoice-mutation.ts +0 -95
  69. package/server/service/invoice/invoice-query.ts +0 -53
  70. package/server/service/invoice/invoice-types.ts +0 -279
  71. package/server/service/invoice/invoice.ts +0 -230
  72. package/server/service/invoice-product/index.ts +0 -9
  73. package/server/service/invoice-product/invoice-product-mutation.ts +0 -54
  74. package/server/service/invoice-product/invoice-product-query.ts +0 -54
  75. package/server/service/invoice-product/invoice-product-types.ts +0 -84
  76. package/server/service/invoice-product/invoice-product.ts +0 -92
  77. package/server/service/job-sheet/index.ts +0 -9
  78. package/server/service/job-sheet/job-sheet-mutation.ts +0 -92
  79. package/server/service/job-sheet/job-sheet-query.ts +0 -112
  80. package/server/service/job-sheet/job-sheet-types.ts +0 -78
  81. package/server/service/job-sheet/job-sheet.ts +0 -102
  82. package/server/service/manifest/index.ts +0 -6
  83. package/server/service/manifest/manifest-mutation.ts +0 -190
  84. package/server/service/manifest/manifest-query.ts +0 -149
  85. package/server/service/manifest/manifest-type.ts +0 -84
  86. package/server/service/manifest/manifest.ts +0 -114
  87. package/server/service/order-inventory/index.ts +0 -9
  88. package/server/service/order-inventory/order-inventory-mutation.ts +0 -54
  89. package/server/service/order-inventory/order-inventory-query.ts +0 -722
  90. package/server/service/order-inventory/order-inventory-types.ts +0 -238
  91. package/server/service/order-inventory/order-inventory.ts +0 -401
  92. package/server/service/order-product/index.ts +0 -9
  93. package/server/service/order-product/order-product-mutation.ts +0 -48
  94. package/server/service/order-product/order-product-query.ts +0 -89
  95. package/server/service/order-product/order-product-types.ts +0 -335
  96. package/server/service/order-product/order-product.ts +0 -362
  97. package/server/service/order-tote/index.ts +0 -9
  98. package/server/service/order-tote/order-tote-mutation.ts +0 -31
  99. package/server/service/order-tote/order-tote-query.ts +0 -112
  100. package/server/service/order-tote/order-tote-types.ts +0 -47
  101. package/server/service/order-tote/order-tote.ts +0 -73
  102. package/server/service/order-tote-item/index.ts +0 -9
  103. package/server/service/order-tote-item/order-tote-item-mutation.ts +0 -31
  104. package/server/service/order-tote-item/order-tote-item-query.ts +0 -82
  105. package/server/service/order-tote-item/order-tote-item-types.ts +0 -56
  106. package/server/service/order-tote-item/order-tote-item.ts +0 -72
  107. package/server/service/order-tote-seal/index.ts +0 -9
  108. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +0 -31
  109. package/server/service/order-tote-seal/order-tote-seal-query.ts +0 -59
  110. package/server/service/order-tote-seal/order-tote-seal-types.ts +0 -41
  111. package/server/service/order-tote-seal/order-tote-seal.ts +0 -46
  112. package/server/service/order-vas/index.ts +0 -9
  113. package/server/service/order-vas/order-vas-mutation.ts +0 -20
  114. package/server/service/order-vas/order-vas-query.ts +0 -72
  115. package/server/service/order-vas/order-vas-types.ts +0 -159
  116. package/server/service/order-vas/order-vas.ts +0 -207
  117. package/server/service/others/index.ts +0 -5
  118. package/server/service/others/other-query.ts +0 -563
  119. package/server/service/others/other-types.ts +0 -115
  120. package/server/service/purchase-order/index.ts +0 -9
  121. package/server/service/purchase-order/purchase-order-mutation.ts +0 -458
  122. package/server/service/purchase-order/purchase-order-query.ts +0 -90
  123. package/server/service/purchase-order/purchase-order-types.ts +0 -154
  124. package/server/service/purchase-order/purchase-order.ts +0 -172
  125. package/server/service/purchase-order-other-charge/index.ts +0 -9
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +0 -31
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +0 -52
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +0 -44
  129. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +0 -68
  130. package/server/service/release-good/index.ts +0 -9
  131. package/server/service/release-good/release-good-mutation.ts +0 -1686
  132. package/server/service/release-good/release-good-query.ts +0 -980
  133. package/server/service/release-good/release-good-types.ts +0 -662
  134. package/server/service/release-good/release-good.ts +0 -490
  135. package/server/service/retail-replenishment-order/index.ts +0 -9
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +0 -382
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +0 -54
  138. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +0 -101
  139. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +0 -115
  140. package/server/service/return-order/index.ts +0 -9
  141. package/server/service/return-order/return-order-mutation.ts +0 -516
  142. package/server/service/return-order/return-order-query.ts +0 -226
  143. package/server/service/return-order/return-order-types.ts +0 -196
  144. package/server/service/return-order/return-order.ts +0 -127
  145. package/server/service/reverse-kitting-order/index.ts +0 -9
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +0 -500
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +0 -197
  148. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +0 -173
  149. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +0 -121
  150. package/server/service/reverse-kitting-order-inventory/index.ts +0 -9
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +0 -129
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +0 -52
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +0 -95
  154. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +0 -143
  155. package/server/service/shipping-order/index.ts +0 -9
  156. package/server/service/shipping-order/shipping-order-mutation.ts +0 -61
  157. package/server/service/shipping-order/shipping-order-query.ts +0 -61
  158. package/server/service/shipping-order/shipping-order-types.ts +0 -89
  159. package/server/service/shipping-order/shipping-order.ts +0 -129
  160. package/server/service/transfer-order/index.ts +0 -9
  161. package/server/service/transfer-order/transfer-order-mutation.ts +0 -309
  162. package/server/service/transfer-order/transfer-order-query.ts +0 -66
  163. package/server/service/transfer-order/transfer-order-types.ts +0 -97
  164. package/server/service/transfer-order/transfer-order.ts +0 -117
  165. package/server/service/vas/index.ts +0 -9
  166. package/server/service/vas/vas-mutation.ts +0 -106
  167. package/server/service/vas/vas-query.ts +0 -60
  168. package/server/service/vas/vas-types.ts +0 -71
  169. package/server/service/vas/vas.ts +0 -77
  170. package/server/service/vas-order/index.ts +0 -9
  171. package/server/service/vas-order/vas-order-mutation.ts +0 -259
  172. package/server/service/vas-order/vas-order-query.ts +0 -119
  173. package/server/service/vas-order/vas-order-types.ts +0 -49
  174. package/server/service/vas-order/vas-order.ts +0 -81
  175. package/server/utils/datetime-util.ts +0 -54
  176. package/server/utils/index.ts +0 -3
  177. package/server/utils/inventory-util.ts +0 -1155
  178. package/server/utils/order-no-generator.ts +0 -146
@@ -1,458 +0,0 @@
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, Repository } from 'typeorm'
5
-
6
- import { Attachment, createAttachments, deleteAttachmentsByRef } from '@things-factory/attachment-base'
7
- import { User } from '@things-factory/auth-base'
8
- import { Bizplace, ContactPoint, getPermittedBizplaces } from '@things-factory/biz-base'
9
- import { generateId } from '@things-factory/id-rule-base'
10
- import { Product, ProductDetail } from '@things-factory/product-base'
11
- import { Setting } from '@things-factory/setting-base'
12
- import { Domain, getRepository } from '@things-factory/shell'
13
- import { Location } from '@things-factory/warehouse-base'
14
-
15
- import {
16
- ArrivalNotice,
17
- NewPurchaseOrder,
18
- OrderProduct,
19
- PurchaseOrder,
20
- PurchaseOrderOtherCharge,
21
- PurchaseOrderPatch
22
- } from '../'
23
- import {
24
- ATTACHMENT_TYPE,
25
- ORDER_NUMBER_RULE_TYPE,
26
- ORDER_NUMBER_SETTING_KEY,
27
- ORDER_STATUS,
28
- PURCHASE_ORDER_STATUS
29
- } from '../../constants'
30
- import { OrderNoGenerator } from '../../utils'
31
- import { checkArrivedNoticeFunction, generateArrivalNoticeFunction } from '../arrival-notice/arrival-notice-mutation'
32
- import { getPurchaseOrderFunction } from './purchase-order-query'
33
-
34
- @Resolver(PurchaseOrder)
35
- export class PurchaseOrderMutation {
36
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
37
- @Directive('@transaction')
38
- @Mutation(returns => PurchaseOrder)
39
- async upsertPurchaseOrder(
40
- @Ctx() context: ResolverContext,
41
- @Arg('purchaseOrder', type => PurchaseOrderPatch) purchaseOrder: PurchaseOrderPatch,
42
- @Arg('files', type => [GraphQLUpload], { nullable: true }) files?: FileUpload
43
- ): Promise<PurchaseOrder> {
44
- try {
45
- const { tx } = context.state
46
- const createdPurchaseOrder: PurchaseOrder = await upsertPurchaseOrderFunction(
47
- null,
48
- purchaseOrder,
49
- files,
50
- context,
51
- tx
52
- )
53
-
54
- return createdPurchaseOrder
55
- } catch (error) {
56
- throw error
57
- }
58
- }
59
-
60
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
61
- @Directive('@transaction')
62
- @Mutation(returns => PurchaseOrder)
63
- async approvePurchaseOrder(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<PurchaseOrder> {
64
- const { tx, domain, user } = context.state
65
-
66
- const findPurchaseOrder: PurchaseOrder = await getRepository(PurchaseOrder).findOne({
67
- where: { domain: { id: domain.id }, id },
68
- relations: ['orderProducts', 'orderProducts.product', 'bufferLocation', 'bizplace', 'domain']
69
- })
70
-
71
- // const findPurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).findOne({where: {id}, relations:['bizplace']})
72
- // const findOrderProducts: OrderProduct[] = await tx.getRepository(OrderProduct).findBy({purchaseOrder: {id: findPurchaseOrder.id}}})
73
-
74
- // // 1. Approve purchase order
75
- const approvePurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).save({
76
- ...findPurchaseOrder,
77
- status: PURCHASE_ORDER_STATUS.APPROVED,
78
- approvedBy: user,
79
- approvedOn: new Date().toUTCString(),
80
- updater: user
81
- })
82
-
83
- await tx.getRepository(OrderProduct).save(
84
- findPurchaseOrder.orderProducts.map(itm => {
85
- return {
86
- ...itm,
87
- status: PURCHASE_ORDER_STATUS.APPROVED
88
- }
89
- })
90
- )
91
-
92
- // // 2. Create and confirm arrival notice
93
- let newGANOrder = {
94
- ...findPurchaseOrder,
95
- orderProducts: findPurchaseOrder.orderProducts.map(itm => {
96
- delete itm.id, itm.name
97
- return {
98
- ...itm
99
- }
100
- }),
101
- customerBizplaceId: findPurchaseOrder.bizplace.id,
102
- purchaseOrder: approvePurchaseOrder,
103
- orderVass: [],
104
- creator: user,
105
- updater: user
106
- }
107
-
108
- delete newGANOrder.id
109
- //change gan status to intransit and call check arrived notice function right
110
- newGANOrder.status = ORDER_STATUS.INTRANSIT
111
-
112
- const createdGAN: ArrivalNotice = await generateArrivalNoticeFunction(null, newGANOrder, true, [], context, tx)
113
-
114
- // await confirmArrivalNoticeFunction(createdGAN.name, context, tx)
115
-
116
- // await receiveArrivalNoticeFunction(null, createdGAN.name, context)
117
-
118
- await checkArrivedNoticeFunction(createdGAN.name, context, tx)
119
-
120
- return approvePurchaseOrder
121
- }
122
-
123
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
124
- @Directive('@transaction')
125
- @Mutation(returns => PurchaseOrder)
126
- async rejectPurchaseOrder(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<PurchaseOrder> {
127
- const { tx, domain, user } = context.state
128
-
129
- const findPurchaseOrder: PurchaseOrder = await getRepository(PurchaseOrder).findOne({
130
- where: { domain: { id: domain.id }, id },
131
- relations: ['orderProducts']
132
- })
133
- // // 1. Reject purchase order
134
- const rejectedPurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).save({
135
- ...findPurchaseOrder,
136
- status: PURCHASE_ORDER_STATUS.REJECTED,
137
- updater: user
138
- })
139
-
140
- await tx.getRepository(OrderProduct).save(
141
- findPurchaseOrder.orderProducts.map(itm => {
142
- return {
143
- ...itm,
144
- status: PURCHASE_ORDER_STATUS.REJECTED
145
- }
146
- })
147
- )
148
-
149
- return rejectedPurchaseOrder
150
- }
151
-
152
- @Directive('@transaction')
153
- @Mutation(returns => PurchaseOrder)
154
- async createPurchaseOrder(
155
- @Arg('purchaseOrder', type => NewPurchaseOrder) purchaseOrder: NewPurchaseOrder,
156
- @Ctx() context: ResolverContext
157
- ): Promise<PurchaseOrder> {
158
- const { tx, domain, user } = context.state
159
-
160
- return await tx.getRepository(PurchaseOrder).save({
161
- ...purchaseOrder,
162
- domain,
163
- creator: user,
164
- updater: user
165
- })
166
- }
167
-
168
- @Directive('@transaction')
169
- @Mutation(returns => PurchaseOrder)
170
- async updatePurchaseOrder(
171
- @Arg('name') name: string,
172
- @Arg('patch', type => PurchaseOrderPatch) patch: PurchaseOrderPatch,
173
- @Ctx() context: ResolverContext
174
- ): Promise<PurchaseOrder> {
175
- const { tx, domain, user } = context.state
176
-
177
- const repository = tx.getRepository(PurchaseOrder)
178
- const purchaseOrder = await repository.findOne({
179
- where: { domain: { id: domain.id }, name }
180
- })
181
-
182
- return await repository.save({
183
- ...purchaseOrder,
184
- ...patch,
185
- updater: user
186
- })
187
- }
188
-
189
- @Directive('@transaction')
190
- @Mutation(returns => Boolean)
191
- async deletePurchaseOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {
192
- const { tx, domain } = context.state
193
- await tx.getRepository(PurchaseOrder).delete({ domain: { id: domain.id }, name })
194
- return true
195
- }
196
- }
197
-
198
- export async function upsertPurchaseOrderFunction(
199
- _: any,
200
- purchaseOrder: any,
201
- files: FileUpload[],
202
- context: any,
203
- tx?: EntityManager
204
- ): Promise<PurchaseOrder> {
205
- if (!purchaseOrder.id) {
206
- purchaseOrder = await createPurchaseOrderFunction(_, purchaseOrder, files, context, tx)
207
- } else {
208
- purchaseOrder = await updatePurchaseOrderFunction(_, purchaseOrder, files, context, tx)
209
- }
210
-
211
- return purchaseOrder
212
- }
213
-
214
- export async function createPurchaseOrderFunction(
215
- _: any,
216
- purchaseOrder: any,
217
- files: FileUpload[],
218
- context: any,
219
- tx?: EntityManager
220
- ): Promise<PurchaseOrder> {
221
- const { domain, user } = context.state
222
- let orderProducts: OrderProduct[] = purchaseOrder.orderProducts
223
- let otherCharges: PurchaseOrderOtherCharge[] = purchaseOrder.otherCharges
224
-
225
- let myBizplace: Bizplace
226
- let orderNo: string = ''
227
- let arrError: string[] = []
228
-
229
- const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
230
-
231
- if (purchaseOrder?.bizplace?.id) {
232
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
233
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == purchaseOrder.bizplace.id)
234
-
235
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
236
-
237
- purchaseOrder.bizplace = foundPermittedBizplace
238
- } else {
239
- arrError.push(`No bizplace was selected`)
240
- }
241
-
242
- if (purchaseOrder?.supplier?.id) {
243
- purchaseOrder.supplier = await getRepository(ContactPoint).findOneBy({ id: purchaseOrder.supplier.id })
244
- } else {
245
- arrError.push(`No supplier was selected`)
246
- }
247
-
248
- if (purchaseOrder?.bufferLocation?.id) {
249
- purchaseOrder.bufferLocation = await getRepository(Location).findOneBy({ id: purchaseOrder.bufferLocation.id })
250
- } else {
251
- arrError.push(`No buffer location was selected`)
252
- }
253
-
254
- if (arrError.length > 0) {
255
- throw new Error(arrError.join(', '))
256
- }
257
-
258
- // // find PO number rule setting
259
- const poNoSetting: Setting = await settingRepo.findOne({
260
- where: {
261
- domain: { id: domain.id },
262
- name: ORDER_NUMBER_SETTING_KEY.PO_NUMBER_RULE
263
- }
264
- })
265
-
266
- orderNo = poNoSetting
267
- ? await generateId({ domain, type: ORDER_NUMBER_RULE_TYPE.PO_NUMBER, seed: {} })
268
- : OrderNoGenerator.purchaseOrder()
269
-
270
- // // 1. Create purchase order
271
- const createdPurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).save({
272
- ...purchaseOrder,
273
- name: orderNo,
274
- domain,
275
- looseItem: purchaseOrder?.looseItem ? purchaseOrder.looseItem : false,
276
- creator: user,
277
- updater: user
278
- })
279
-
280
- // // 2. Create purchase order product
281
- await upsertPurchaseOrderProducts(domain, purchaseOrder.bizplace, createdPurchaseOrder, orderProducts, user, tx)
282
-
283
- // // 3. Create purchase order misc charges
284
- for await (let oc of otherCharges) {
285
- delete oc.id
286
- await tx.getRepository(PurchaseOrderOtherCharge).save({
287
- ...oc,
288
- domain,
289
- purchaseOrder: createdPurchaseOrder,
290
- creator: user,
291
- updater: user
292
- })
293
- }
294
-
295
- // // 4. Create Attacments
296
- if (files?.length) {
297
- const attachments: Partial<Attachment>[] = files.map(attachment => {
298
- return {
299
- file: attachment,
300
- refType: ATTACHMENT_TYPE.PO,
301
- refBy: createdPurchaseOrder.id,
302
- category: ATTACHMENT_TYPE.PO /* TODO use refType */
303
- }
304
- })
305
- await createAttachments(_, { attachments }, context)
306
- }
307
-
308
- return createdPurchaseOrder
309
- }
310
-
311
- export async function updatePurchaseOrderFunction(
312
- _: any,
313
- purchaseOrder: any,
314
- files: FileUpload[],
315
- context: any,
316
- tx?: EntityManager
317
- ): Promise<PurchaseOrder> {
318
- const { domain, user } = context.state
319
-
320
- let existingPurchaseOrder: any = await getPurchaseOrderFunction(_, purchaseOrder.name, context, tx)
321
-
322
- let orderProducts: OrderProduct[] = purchaseOrder.orderProducts
323
- let otherCharges: PurchaseOrderOtherCharge[] = purchaseOrder.otherCharges
324
-
325
- if (purchaseOrder?.bizplace?.id) {
326
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
327
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == purchaseOrder.bizplace.id)
328
-
329
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
330
-
331
- purchaseOrder.bizplace = foundPermittedBizplace
332
- }
333
-
334
- if (purchaseOrder?.supplier?.id) {
335
- purchaseOrder.supplier = await getRepository(ContactPoint).findOneBy({ id: purchaseOrder.supplier.id })
336
- }
337
-
338
- if (purchaseOrder?.bufferLocation?.id) {
339
- purchaseOrder.bufferLocation = await getRepository(Location).findOneBy({ id: purchaseOrder.bufferLocation.id })
340
- }
341
-
342
- // // 1. Update purchase order
343
- const updatePurchaseOrder: PurchaseOrder = await tx.getRepository(PurchaseOrder).save({
344
- ...existingPurchaseOrder,
345
- ...purchaseOrder,
346
- domain,
347
- creator: user,
348
- updater: user
349
- })
350
-
351
- // // 2. Update purchase order product
352
- await upsertPurchaseOrderProducts(domain, purchaseOrder.bizplace, purchaseOrder, orderProducts, user, tx)
353
-
354
- // // 3. Delete Removed Other Charges
355
- const otherChargesRepo: Repository<PurchaseOrderOtherCharge> =
356
- tx?.getRepository(PurchaseOrderOtherCharge) || getRepository(PurchaseOrderOtherCharge)
357
- let removeOC = existingPurchaseOrder.otherCharges.filter(
358
- existingOC => (otherCharges.filter(inOC => inOC.id == existingOC.id).length = 0)
359
- )
360
- removeOC.forEach(async oc => {
361
- await otherChargesRepo.delete(oc)
362
- })
363
-
364
- // // 4. Process Purchase Other Other Charges Data and Insert/ Update data
365
- for await (let oc of otherCharges) {
366
- if (!oc?.id) delete oc.id
367
- await otherChargesRepo.save({
368
- ...oc,
369
- domain,
370
- purchaseOrder: existingPurchaseOrder,
371
- creator: oc?.id ? oc.creator : user,
372
- updater: user
373
- })
374
- }
375
-
376
- // // 5. Remove Purchase Order Products
377
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
378
- where: {
379
- domain: { id: domain.id },
380
- refBy: purchaseOrder.id,
381
- category: ATTACHMENT_TYPE.PO
382
- }
383
- })
384
-
385
- // // 6. Remove All Attachment
386
- if (foundAttachments?.length) {
387
- await deleteAttachmentsByRef(_, { refBys: foundAttachments.map(file => file.refBy) }, context)
388
- }
389
-
390
- // // 7. Add New Attachment
391
- if (files?.length > 0) {
392
- const attachments: Partial<Attachment>[] = files.map(attachment => {
393
- return {
394
- file: attachment,
395
- refType: ATTACHMENT_TYPE.PO,
396
- refBy: updatePurchaseOrder.id,
397
- category: ATTACHMENT_TYPE.PO /* TODO use refType */
398
- }
399
- })
400
- await createAttachments(_, { attachments }, context)
401
- }
402
-
403
- return existingPurchaseOrder
404
- }
405
-
406
- export async function upsertPurchaseOrderProducts(
407
- domain: Domain,
408
- bizplace: Bizplace,
409
- purchaseOrder: PurchaseOrder,
410
- orderProducts: OrderProduct[],
411
- user: User,
412
- tx?: EntityManager
413
- ): Promise<void> {
414
- try {
415
- const purchaseOrderRepo: Repository<PurchaseOrder> =
416
- tx?.getRepository(PurchaseOrder) || getRepository(PurchaseOrder)
417
- const bizplaceRepo: Repository<Bizplace> = tx?.getRepository(Bizplace) || getRepository(Bizplace)
418
- const orderProductRepo: Repository<OrderProduct> = tx?.getRepository(OrderProduct) || getRepository(OrderProduct)
419
- const productRepo: Repository<Product> = tx?.getRepository(Product) || getRepository(Product)
420
-
421
- // // Remove all existing order products that do not exist in current input
422
- let removeOP = purchaseOrder.orderProducts.filter(
423
- existingOP => (orderProducts.filter(inOP => inOP.id == existingOP.id).length = 0)
424
- )
425
- removeOP.forEach(async op => {
426
- await orderProductRepo.delete(op.id)
427
- })
428
-
429
- purchaseOrder = await purchaseOrderRepo.findOneBy({ id: purchaseOrder.id })
430
-
431
- bizplace = await bizplaceRepo.findOneBy({ id: bizplace.id })
432
-
433
- orderProducts = await Promise.all(
434
- orderProducts.map(async (op: OrderProduct) => {
435
- if (!op?.id) delete op.id
436
- let foundProductDetail: ProductDetail = await tx
437
- .getRepository(ProductDetail)
438
- .findOne({ where: { product: { id: op.product.id }, packingType: op.packingType } })
439
- return {
440
- ...op,
441
- domain,
442
- bizplace: bizplace,
443
- name: op?.id ? op.name : OrderNoGenerator.orderProduct(),
444
- product: await productRepo.findOneBy({ id: op.product.id }),
445
- packingSize: foundProductDetail?.packingSize || 1,
446
- purchaseOrder: purchaseOrder,
447
- status: purchaseOrder.status,
448
- creator: op?.id ? op.creator : user,
449
- updater: user
450
- }
451
- })
452
- )
453
-
454
- await orderProductRepo.save(orderProducts)
455
- } catch (error) {
456
- throw error
457
- }
458
- }
@@ -1,90 +0,0 @@
1
- import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { EntityManager, In } from 'typeorm'
3
-
4
- import { Attachment } from '@things-factory/attachment-base'
5
- import { User } from '@things-factory/auth-base'
6
- import { Bizplace, getPermittedBizplaceIds } from '@things-factory/biz-base'
7
- import { buildQuery, Domain, Filter, getRepository, Pagination, Sorting } from '@things-factory/shell'
8
-
9
- import { PurchaseOrderList } from '../'
10
- import { ATTACHMENT_TYPE } from '../../constants'
11
- import { PurchaseOrder } from './purchase-order'
12
-
13
- @Resolver(PurchaseOrder)
14
- export class PurchaseOrderQuery {
15
- @Query(returns => PurchaseOrderList)
16
- async purchaseOrders(
17
- @Ctx() context: ResolverContext,
18
- @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
19
- @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
20
- @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
21
- ): Promise<PurchaseOrderList> {
22
- const queryBuilder = getRepository(PurchaseOrder).createQueryBuilder()
23
- buildQuery(queryBuilder, { filters, pagination, sortings }, context)
24
- const [items, total] = await queryBuilder
25
- .leftJoinAndSelect('PurchaseOrder.supplier', 'Supplier')
26
- .leftJoinAndSelect('PurchaseOrder.domain', 'Domain')
27
- .leftJoinAndSelect('PurchaseOrder.creator', 'Creator')
28
- .leftJoinAndSelect('PurchaseOrder.updater', 'Updater')
29
- .leftJoinAndSelect('PurchaseOrder.arrivalNotice', 'ArrivalNotice')
30
- .getManyAndCount()
31
-
32
- return { items, total }
33
- }
34
-
35
- @Query(returns => PurchaseOrder)
36
- async purchaseOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<PurchaseOrder> {
37
- const { tx } = context.state
38
- return getPurchaseOrderFunction(null, name, context, tx)
39
- }
40
-
41
- @FieldResolver(type => Domain)
42
- async domain(@Root() purchaseOrder: PurchaseOrder): Promise<Domain> {
43
- return await getRepository(Domain).findOneBy({ id: purchaseOrder.domainId })
44
- }
45
-
46
- @FieldResolver(type => User)
47
- async creator(@Root() purchaseOrder: PurchaseOrder): Promise<User> {
48
- return await getRepository(User).findOneBy({ id: purchaseOrder.creatorId })
49
- }
50
-
51
- @FieldResolver(type => User)
52
- async updater(@Root() purchaseOrder: PurchaseOrder): Promise<User> {
53
- return await getRepository(User).findOneBy({ id: purchaseOrder.updaterId })
54
- }
55
- }
56
-
57
- export async function getPurchaseOrderFunction(_: any, name: any, context: any, tx?: EntityManager) {
58
- const { domain, user, bizplace }: { domain: Domain; user: User; bizplace: Bizplace } = context.state
59
-
60
- let result = await getRepository(PurchaseOrder).findOne({
61
- where: { domain: { id: domain.id }, name, bizplace: { id: In(await getPermittedBizplaceIds(domain, user)) } },
62
- relations: [
63
- 'arrivalNotice',
64
- 'supplier',
65
- 'orderProducts',
66
- 'orderProducts.product',
67
- 'otherCharges',
68
- 'bufferLocation',
69
- 'bizplace',
70
- 'domain',
71
- 'creator',
72
- 'updater'
73
- ]
74
- })
75
-
76
- if (!result?.id) throw new Error(`Failed to find arrival notice with ${name}`)
77
-
78
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
79
- where: {
80
- domain: { id: domain.id },
81
- refBy: result.id,
82
- category: ATTACHMENT_TYPE.PO
83
- }
84
- })
85
-
86
- return {
87
- ...result,
88
- attachment: foundAttachments
89
- }
90
- }
@@ -1,154 +0,0 @@
1
- import { ObjectRef } from '@things-factory/shell'
2
- import { Field, InputType, Int, ObjectType } from 'type-graphql'
3
- import { OrderProductPatch } from '../order-product/order-product-types'
4
- import { PurchaseOrder, PurchaseOrderOtherChargePatch, PurchaseOrderOtherCharge } from '../'
5
-
6
- @ObjectType()
7
- export class PurchaseOrderList {
8
- @Field(type => [PurchaseOrder], { nullable: true })
9
- items: PurchaseOrder[]
10
-
11
- @Field(type => Int, { nullable: true })
12
- total: number
13
- }
14
-
15
- @InputType()
16
- export class NewPurchaseOrder {
17
- @Field(type => ObjectRef, { nullable: true })
18
- bizplace: ObjectRef
19
-
20
- @Field(type => ObjectRef, { nullable: true })
21
- bufferLocation: ObjectRef
22
-
23
- @Field({ nullable: true })
24
- container: boolean
25
-
26
- @Field({ nullable: true })
27
- containerNo: string
28
-
29
- @Field({ nullable: true })
30
- containerSize: string
31
-
32
- @Field({ nullable: true })
33
- currency: string
34
-
35
- @Field({ nullable: true })
36
- deliveryOrderNo: string
37
-
38
- @Field({ nullable: true })
39
- description: string
40
-
41
- @Field({ nullable: true })
42
- etaDate: string
43
-
44
- @Field({ nullable: true })
45
- importCargo: boolean
46
-
47
- @Field({ nullable: true })
48
- issuedOn: string
49
-
50
- @Field({ nullable: true })
51
- looseItem: boolean
52
-
53
- @Field({ nullable: true })
54
- name: string
55
-
56
- @Field(type => [OrderProductPatch], { nullable: true })
57
- orderProducts: OrderProductPatch[]
58
-
59
- @Field(type => [PurchaseOrderOtherChargePatch], { nullable: true })
60
- otherCharges: (PurchaseOrderOtherCharge | PurchaseOrderOtherChargePatch)[]
61
-
62
- @Field({ nullable: true })
63
- ownTransport: boolean
64
-
65
- @Field({ nullable: true })
66
- refNo: string
67
-
68
- @Field({ nullable: true })
69
- remark: string
70
-
71
- @Field({ nullable: true })
72
- status: string
73
-
74
- @Field(type => ObjectRef, { nullable: true })
75
- warehouse: ObjectRef
76
-
77
- @Field(type => ObjectRef, { nullable: true })
78
- supplier: ObjectRef
79
-
80
- @Field({ nullable: true })
81
- truckNo: string
82
- }
83
-
84
- @InputType()
85
- export class PurchaseOrderPatch {
86
- @Field({ nullable: true })
87
- id: string
88
-
89
- @Field({ nullable: true })
90
- name: string
91
-
92
- @Field({ nullable: true })
93
- description: string
94
-
95
- @Field(type => ObjectRef, { nullable: true })
96
- bizplace: ObjectRef
97
-
98
- @Field(type => ObjectRef, { nullable: true })
99
- bufferLocation: ObjectRef
100
-
101
- @Field({ nullable: true })
102
- container: boolean
103
-
104
- @Field({ nullable: true })
105
- containerNo: string
106
-
107
- @Field({ nullable: true })
108
- containerSize: string
109
-
110
- @Field({ nullable: true })
111
- currency: string
112
-
113
- @Field({ nullable: true })
114
- deliveryOrderNo: string
115
-
116
- @Field({ nullable: true })
117
- etaDate: string
118
-
119
- @Field({ nullable: true })
120
- importCargo: boolean
121
-
122
- @Field({ nullable: true })
123
- issuedOn: string
124
-
125
- @Field({ nullable: true })
126
- looseItem: boolean
127
-
128
- @Field(type => [OrderProductPatch], { nullable: true })
129
- orderProducts: OrderProductPatch[]
130
-
131
- @Field(type => [PurchaseOrderOtherChargePatch], { nullable: true })
132
- otherCharges: PurchaseOrderOtherChargePatch[]
133
-
134
- @Field({ nullable: true })
135
- ownTransport: boolean
136
-
137
- @Field({ nullable: true })
138
- refNo: string
139
-
140
- @Field({ nullable: true })
141
- remark: string
142
-
143
- @Field({ nullable: true })
144
- status: string
145
-
146
- @Field(type => ObjectRef, { nullable: true })
147
- warehouse: ObjectRef
148
-
149
- @Field(type => ObjectRef, { nullable: true })
150
- supplier: ObjectRef
151
-
152
- @Field({ nullable: true })
153
- truckNo: string
154
- }