@things-factory/sales-base 8.0.0-beta.0 → 8.0.0-beta.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 (177) hide show
  1. package/package.json +13 -13
  2. package/server/constants/attachment-type.ts +0 -9
  3. package/server/constants/index.ts +0 -7
  4. package/server/constants/load-type.ts +0 -4
  5. package/server/constants/order.ts +0 -203
  6. package/server/constants/product-group-type.ts +0 -4
  7. package/server/constants/release-good.ts +0 -9
  8. package/server/constants/transfer-order-type.ts +0 -6
  9. package/server/constants/validation-error-code.ts +0 -3
  10. package/server/constants/vas-target-type.ts +0 -25
  11. package/server/controllers/ecommerce/ecommerce-controller.ts +0 -122
  12. package/server/controllers/ecommerce/index.ts +0 -2
  13. package/server/controllers/ecommerce/sellercraft-controller.ts +0 -182
  14. package/server/controllers/index.ts +0 -2
  15. package/server/controllers/order-controller.ts +0 -296
  16. package/server/errors/index.ts +0 -1
  17. package/server/errors/validation-error.ts +0 -25
  18. package/server/index.ts +0 -5
  19. package/server/migrations/index.ts +0 -9
  20. package/server/service/arrival-notice/arrival-notice-mutation.ts +0 -1152
  21. package/server/service/arrival-notice/arrival-notice-query.ts +0 -549
  22. package/server/service/arrival-notice/arrival-notice-types.ts +0 -310
  23. package/server/service/arrival-notice/arrival-notice.ts +0 -202
  24. package/server/service/arrival-notice/index.ts +0 -9
  25. package/server/service/claim/claim-mutation.ts +0 -308
  26. package/server/service/claim/claim-query.ts +0 -122
  27. package/server/service/claim/claim-types.ts +0 -130
  28. package/server/service/claim/claim.ts +0 -140
  29. package/server/service/claim/index.ts +0 -9
  30. package/server/service/claim-detail/claim-detail-mutation.ts +0 -102
  31. package/server/service/claim-detail/claim-detail-query.ts +0 -55
  32. package/server/service/claim-detail/claim-detail-types.ts +0 -47
  33. package/server/service/claim-detail/claim-detail.ts +0 -69
  34. package/server/service/claim-detail/index.ts +0 -9
  35. package/server/service/claim-order/claim-order-mutation.ts +0 -101
  36. package/server/service/claim-order/claim-order-query.ts +0 -47
  37. package/server/service/claim-order/claim-order-types.ts +0 -35
  38. package/server/service/claim-order/claim-order.ts +0 -81
  39. package/server/service/claim-order/index.ts +0 -9
  40. package/server/service/collection-order/collection-order-mutation.ts +0 -245
  41. package/server/service/collection-order/collection-order-query.ts +0 -97
  42. package/server/service/collection-order/collection-order-types.ts +0 -165
  43. package/server/service/collection-order/collection-order.ts +0 -135
  44. package/server/service/collection-order/index.ts +0 -9
  45. package/server/service/delivery-order/delivery-order-mutation.ts +0 -967
  46. package/server/service/delivery-order/delivery-order-query.ts +0 -631
  47. package/server/service/delivery-order/delivery-order-types.ts +0 -268
  48. package/server/service/delivery-order/delivery-order.ts +0 -258
  49. package/server/service/delivery-order/index.ts +0 -9
  50. package/server/service/draft-release-good/draft-release-good-mutation.ts +0 -765
  51. package/server/service/draft-release-good/draft-release-good-query.ts +0 -354
  52. package/server/service/draft-release-good/draft-release-good-type.ts +0 -261
  53. package/server/service/draft-release-good/draft-release-good.ts +0 -284
  54. package/server/service/draft-release-good/index.ts +0 -9
  55. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +0 -129
  56. package/server/service/goods-receival-note/goods-receival-note-query.ts +0 -280
  57. package/server/service/goods-receival-note/goods-receival-note-types.ts +0 -105
  58. package/server/service/goods-receival-note/goods-receival-note.ts +0 -127
  59. package/server/service/goods-receival-note/index.ts +0 -9
  60. package/server/service/index.ts +0 -238
  61. package/server/service/inventory-check/index.ts +0 -9
  62. package/server/service/inventory-check/inventory-check-mutation.ts +0 -149
  63. package/server/service/inventory-check/inventory-check-query.ts +0 -48
  64. package/server/service/inventory-check/inventory-check-types.ts +0 -48
  65. package/server/service/inventory-check/inventory-check.ts +0 -90
  66. package/server/service/invoice/index.ts +0 -9
  67. package/server/service/invoice/invoice-mutation.ts +0 -95
  68. package/server/service/invoice/invoice-query.ts +0 -53
  69. package/server/service/invoice/invoice-types.ts +0 -279
  70. package/server/service/invoice/invoice.ts +0 -230
  71. package/server/service/invoice-product/index.ts +0 -9
  72. package/server/service/invoice-product/invoice-product-mutation.ts +0 -54
  73. package/server/service/invoice-product/invoice-product-query.ts +0 -54
  74. package/server/service/invoice-product/invoice-product-types.ts +0 -84
  75. package/server/service/invoice-product/invoice-product.ts +0 -92
  76. package/server/service/job-sheet/index.ts +0 -9
  77. package/server/service/job-sheet/job-sheet-mutation.ts +0 -92
  78. package/server/service/job-sheet/job-sheet-query.ts +0 -112
  79. package/server/service/job-sheet/job-sheet-types.ts +0 -78
  80. package/server/service/job-sheet/job-sheet.ts +0 -102
  81. package/server/service/manifest/index.ts +0 -6
  82. package/server/service/manifest/manifest-mutation.ts +0 -190
  83. package/server/service/manifest/manifest-query.ts +0 -149
  84. package/server/service/manifest/manifest-type.ts +0 -84
  85. package/server/service/manifest/manifest.ts +0 -114
  86. package/server/service/order-inventory/index.ts +0 -9
  87. package/server/service/order-inventory/order-inventory-mutation.ts +0 -54
  88. package/server/service/order-inventory/order-inventory-query.ts +0 -722
  89. package/server/service/order-inventory/order-inventory-types.ts +0 -238
  90. package/server/service/order-inventory/order-inventory.ts +0 -401
  91. package/server/service/order-product/index.ts +0 -9
  92. package/server/service/order-product/order-product-mutation.ts +0 -48
  93. package/server/service/order-product/order-product-query.ts +0 -89
  94. package/server/service/order-product/order-product-types.ts +0 -335
  95. package/server/service/order-product/order-product.ts +0 -362
  96. package/server/service/order-tote/index.ts +0 -9
  97. package/server/service/order-tote/order-tote-mutation.ts +0 -31
  98. package/server/service/order-tote/order-tote-query.ts +0 -112
  99. package/server/service/order-tote/order-tote-types.ts +0 -47
  100. package/server/service/order-tote/order-tote.ts +0 -73
  101. package/server/service/order-tote-item/index.ts +0 -9
  102. package/server/service/order-tote-item/order-tote-item-mutation.ts +0 -31
  103. package/server/service/order-tote-item/order-tote-item-query.ts +0 -82
  104. package/server/service/order-tote-item/order-tote-item-types.ts +0 -56
  105. package/server/service/order-tote-item/order-tote-item.ts +0 -72
  106. package/server/service/order-tote-seal/index.ts +0 -9
  107. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +0 -31
  108. package/server/service/order-tote-seal/order-tote-seal-query.ts +0 -59
  109. package/server/service/order-tote-seal/order-tote-seal-types.ts +0 -41
  110. package/server/service/order-tote-seal/order-tote-seal.ts +0 -46
  111. package/server/service/order-vas/index.ts +0 -9
  112. package/server/service/order-vas/order-vas-mutation.ts +0 -20
  113. package/server/service/order-vas/order-vas-query.ts +0 -72
  114. package/server/service/order-vas/order-vas-types.ts +0 -159
  115. package/server/service/order-vas/order-vas.ts +0 -207
  116. package/server/service/others/index.ts +0 -5
  117. package/server/service/others/other-query.ts +0 -563
  118. package/server/service/others/other-types.ts +0 -115
  119. package/server/service/purchase-order/index.ts +0 -9
  120. package/server/service/purchase-order/purchase-order-mutation.ts +0 -458
  121. package/server/service/purchase-order/purchase-order-query.ts +0 -90
  122. package/server/service/purchase-order/purchase-order-types.ts +0 -154
  123. package/server/service/purchase-order/purchase-order.ts +0 -172
  124. package/server/service/purchase-order-other-charge/index.ts +0 -9
  125. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +0 -31
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +0 -52
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +0 -44
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +0 -68
  129. package/server/service/release-good/index.ts +0 -9
  130. package/server/service/release-good/release-good-mutation.ts +0 -1686
  131. package/server/service/release-good/release-good-query.ts +0 -980
  132. package/server/service/release-good/release-good-types.ts +0 -662
  133. package/server/service/release-good/release-good.ts +0 -490
  134. package/server/service/retail-replenishment-order/index.ts +0 -9
  135. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +0 -382
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +0 -54
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +0 -101
  138. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +0 -115
  139. package/server/service/return-order/index.ts +0 -9
  140. package/server/service/return-order/return-order-mutation.ts +0 -516
  141. package/server/service/return-order/return-order-query.ts +0 -226
  142. package/server/service/return-order/return-order-types.ts +0 -196
  143. package/server/service/return-order/return-order.ts +0 -127
  144. package/server/service/reverse-kitting-order/index.ts +0 -9
  145. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +0 -500
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +0 -197
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +0 -173
  148. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +0 -121
  149. package/server/service/reverse-kitting-order-inventory/index.ts +0 -9
  150. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +0 -129
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +0 -52
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +0 -95
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +0 -143
  154. package/server/service/shipping-order/index.ts +0 -9
  155. package/server/service/shipping-order/shipping-order-mutation.ts +0 -61
  156. package/server/service/shipping-order/shipping-order-query.ts +0 -61
  157. package/server/service/shipping-order/shipping-order-types.ts +0 -89
  158. package/server/service/shipping-order/shipping-order.ts +0 -129
  159. package/server/service/transfer-order/index.ts +0 -9
  160. package/server/service/transfer-order/transfer-order-mutation.ts +0 -309
  161. package/server/service/transfer-order/transfer-order-query.ts +0 -66
  162. package/server/service/transfer-order/transfer-order-types.ts +0 -97
  163. package/server/service/transfer-order/transfer-order.ts +0 -117
  164. package/server/service/vas/index.ts +0 -9
  165. package/server/service/vas/vas-mutation.ts +0 -106
  166. package/server/service/vas/vas-query.ts +0 -60
  167. package/server/service/vas/vas-types.ts +0 -71
  168. package/server/service/vas/vas.ts +0 -77
  169. package/server/service/vas-order/index.ts +0 -9
  170. package/server/service/vas-order/vas-order-mutation.ts +0 -259
  171. package/server/service/vas-order/vas-order-query.ts +0 -119
  172. package/server/service/vas-order/vas-order-types.ts +0 -49
  173. package/server/service/vas-order/vas-order.ts +0 -81
  174. package/server/utils/datetime-util.ts +0 -54
  175. package/server/utils/index.ts +0 -3
  176. package/server/utils/inventory-util.ts +0 -1155
  177. 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
- }