@things-factory/sales-base 8.0.2 → 8.0.5

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,765 +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, getConnection, In, IsNull, 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, getPermittedBizplaces } from '@things-factory/biz-base'
9
- import { generateId } from '@things-factory/id-rule-base'
10
- import { Product, ProductBundle, ProductDetail } from '@things-factory/product-base'
11
- import { Setting } from '@things-factory/setting-base'
12
- import { Domain, getRepository } from '@things-factory/shell'
13
-
14
- // import { Location } from '@things-factory/warehouse-base'
15
- import { DraftReleaseGood, DraftReleaseGoodPatch, NewDraftReleaseGood, OrderProduct } from '../'
16
- import {
17
- ATTACHMENT_TYPE,
18
- DRAFT_RELEASE_ORDER_STATUS,
19
- ORDER_NUMBER_RULE_TYPE,
20
- ORDER_NUMBER_SETTING_KEY,
21
- ORDER_STATUS
22
- } from '../../constants'
23
- import { ValidationError } from '../../errors'
24
- import { InventoryUtil, OrderNoGenerator } from '../../utils'
25
- import { OrderProductPatch } from '../order-product/order-product-types'
26
- import { ReleaseGood } from '../release-good/release-good'
27
- import { bulkGenerateReleaseGood, confirmReleaseGood } from '../release-good/release-good-mutation'
28
- import { bulkReleaseGoodsAvailableItemsFunction } from '../release-good/release-good-query'
29
- import { ShippingOrder } from '../shipping-order/shipping-order'
30
- import { ShippingOrderPatch } from '../shipping-order/shipping-order-types'
31
- // import {
32
- // checkArrivedNoticeFunction,
33
- // confirmArrivalNoticeFunction,
34
- // generateArrivalNoticeFunction,
35
- // receiveArrivalNoticeFunction
36
- // } from '../arrival-notice/arrival-notice-mutation'
37
- import { getDraftReleaseGoodFunction } from './draft-release-good-query'
38
-
39
- @Resolver(DraftReleaseGood)
40
- export class DraftReleaseGoodMutation {
41
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
42
- @Directive('@transaction')
43
- @Mutation(returns => DraftReleaseGood)
44
- async upsertDraftReleaseGood(
45
- @Ctx() context: ResolverContext,
46
- @Arg('draftReleaseGood', type => DraftReleaseGoodPatch) draftReleaseGood: DraftReleaseGoodPatch,
47
- @Arg('orderProducts', type => [OrderProductPatch]) orderProducts: [OrderProductPatch],
48
- @Arg('files', type => [GraphQLUpload], { nullable: true }) files?: FileUpload[],
49
- @Arg('shippingOrder', type => ShippingOrderPatch, { nullable: true }) shippingOrder?: ShippingOrderPatch
50
- ): Promise<DraftReleaseGood> {
51
- try {
52
- const { tx } = context.state
53
- const createdDraftReleaseGood: DraftReleaseGood = await upsertDraftReleaseGoodFunction(
54
- null,
55
- draftReleaseGood,
56
- orderProducts,
57
- shippingOrder,
58
- files,
59
- context,
60
- tx
61
- )
62
-
63
- return createdDraftReleaseGood
64
- } catch (error) {
65
- throw error
66
- }
67
- }
68
-
69
- @Directive('@transaction')
70
- @Mutation(returns => DraftReleaseGood, { description: 'To create new DraftReleaseGood' })
71
- async createDraftReleaseGood(
72
- @Arg('draftReleaseGood', type => NewDraftReleaseGood, { nullable: true }) draftReleaseGood: NewDraftReleaseGood,
73
- @Ctx() context: ResolverContext
74
- ): Promise<DraftReleaseGood> {
75
- const { domain, user, tx } = context.state
76
-
77
- let drg = await tx.getRepository(DraftReleaseGood).save({
78
- ...(draftReleaseGood as any),
79
- domain,
80
- status: 'INSUFFICIENT',
81
- creator: user,
82
- updater: user
83
- })
84
-
85
- // add order products
86
-
87
- return drg
88
- }
89
-
90
- @Directive('@transaction')
91
- @Mutation(returns => DraftReleaseGood, { description: 'To modify DraftReleaseGood information' })
92
- async updateDraftReleaseGood(
93
- @Arg('id') id: string,
94
- @Arg('patch', type => DraftReleaseGoodPatch) patch: DraftReleaseGoodPatch,
95
- @Ctx() context: ResolverContext
96
- ): Promise<DraftReleaseGood> {
97
- const { domain, user, tx } = context.state
98
-
99
- const repository = tx.getRepository(DraftReleaseGood)
100
- const draftReleaseGood = await repository.findOne({
101
- where: { domain: { id: domain.id }, id }
102
- })
103
-
104
- return await repository.save({
105
- ...draftReleaseGood,
106
- ...(patch as any),
107
- updater: user
108
- })
109
- }
110
-
111
- @Directive('@transaction')
112
- @Mutation(returns => [DraftReleaseGood], { description: "To modify multiple DraftReleaseGoods' information" })
113
- async updateMultipleDraftReleaseGood(
114
- @Arg('patches', type => [DraftReleaseGoodPatch]) patches: DraftReleaseGoodPatch[],
115
- @Ctx() context: ResolverContext
116
- ): Promise<DraftReleaseGood[]> {
117
- const { domain, user, tx } = context.state
118
-
119
- let results = []
120
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
121
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
122
- const draftReleaseGoodRepo = tx.getRepository(DraftReleaseGood)
123
-
124
- if (_createRecords.length > 0) {
125
- for (let i = 0; i < _createRecords.length; i++) {
126
- const newRecord = _createRecords[i]
127
-
128
- const result = await draftReleaseGoodRepo.save({
129
- ...(newRecord as any),
130
- domain,
131
- creator: user,
132
- updater: user
133
- })
134
-
135
- results.push({ ...result, cuFlag: '+' })
136
- }
137
- }
138
-
139
- if (_updateRecords.length > 0) {
140
- for (let i = 0; i < _updateRecords.length; i++) {
141
- const newRecord = _updateRecords[i]
142
- const draftReleaseGood = await draftReleaseGoodRepo.findOneBy({ id: newRecord.id })
143
-
144
- const result = await draftReleaseGoodRepo.save({
145
- ...draftReleaseGood,
146
- ...(newRecord as any),
147
- updater: user
148
- })
149
-
150
- results.push({ ...result, cuFlag: 'M' })
151
- }
152
- }
153
-
154
- return results
155
- }
156
-
157
- @Directive('@transaction')
158
- @Mutation(returns => Boolean, { description: 'To delete DraftReleaseGood' })
159
- async deleteDraftReleaseGood(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
160
- const { domain, tx } = context.state
161
-
162
- await tx.getRepository(DraftReleaseGood).delete({ domain: { id: domain.id }, id })
163
- return true
164
- }
165
-
166
- @Directive('@transaction')
167
- @Mutation(returns => Boolean, { description: 'To delete multiple draftReleaseGoods' })
168
- async deleteDraftReleaseGoods(
169
- @Arg('ids', type => [String]) ids: string[],
170
- @Ctx() context: ResolverContext
171
- ): Promise<boolean> {
172
- const { domain, tx } = context.state
173
-
174
- await tx.getRepository(DraftReleaseGood).delete({
175
- domain: { id: domain.id },
176
- id: In(ids)
177
- })
178
-
179
- return true
180
- }
181
-
182
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
183
- @Directive('@transaction')
184
- @Mutation(returns => Boolean, { description: 'To generate Release Goods from Draft' })
185
- async generateReleaseGoodsFromDraft(
186
- @Ctx() context: ResolverContext,
187
- @Arg('ids', type => [String]) ids: string[]
188
- // @Arg('rawReleaseGoods', type => [NewReleaseGood], { nullable: true }) rawReleaseGoods: NewReleaseGood[],
189
- // @Arg('bizplaceId', type => String) bizplaceId: string
190
- ): Promise<boolean> {
191
- const { domain, user, tx } = context.state
192
-
193
- const updatableDraftOrders = await tx.getRepository(DraftReleaseGood).find({
194
- where: {
195
- domain: { id: domain.id },
196
- id: In(ids),
197
- status: DRAFT_RELEASE_ORDER_STATUS.DRAFT
198
- },
199
- relations: [
200
- 'orderProducts',
201
- 'orderProducts.product',
202
- 'orderProducts.productBundle',
203
- 'shippingOrder',
204
- 'bizplace',
205
- 'domain',
206
- 'creator',
207
- 'updater'
208
- ]
209
- })
210
- if (updatableDraftOrders.length > 0) {
211
- let createdReleaseGoods: ReleaseGood[] = []
212
- const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
213
-
214
- const roNoSetting: Setting = await settingRepo.findOne({
215
- where: {
216
- domain: { id: domain.id },
217
- name: ORDER_NUMBER_SETTING_KEY.RO_NUMBER_RULE
218
- }
219
- })
220
-
221
- for (let index = 0; index < updatableDraftOrders.length; index++) {
222
- await getConnection().transaction(async (parentTx: EntityManager) => {
223
- const draftOrder = updatableDraftOrders[index]
224
-
225
- let foundPermittedBizplace: Bizplace
226
- let companyBizplace: Bizplace
227
-
228
- if (draftOrder?.bizplace?.id) {
229
- foundPermittedBizplace = await parentTx.getRepository(Bizplace).findOne({
230
- where: { id: draftOrder.bizplace.id },
231
- relations: ['company', 'company.domain']
232
- })
233
- const companyDomain: Domain = foundPermittedBizplace.company.domain
234
- companyBizplace = await parentTx
235
- .getRepository(Bizplace)
236
- .findOne({ where: { domain: { id: companyDomain.id } } })
237
- } else {
238
- return false
239
- }
240
-
241
- const bizplaces: Bizplace[] = [foundPermittedBizplace, companyBizplace]
242
-
243
- let productInventory = await InventoryUtil.bizplaceProductInventory(
244
- bizplaces,
245
- {
246
- filters: [
247
- {
248
- name: 'productId',
249
- operator: 'in',
250
- value: [
251
- ...draftOrder.orderProducts
252
- .filter(itm => itm?.product)
253
- .map(itm => {
254
- return itm.product.id
255
- }),
256
- ...draftOrder.orderProducts
257
- .filter(itm => itm?.productBundle)
258
- .map(itm => {
259
- return itm.productBundle.id
260
- })
261
- ]
262
- }
263
- ]
264
- },
265
- context,
266
- parentTx
267
- )
268
-
269
- draftOrder.orderProducts = draftOrder.orderProducts.map(itm => {
270
- let foundProductInv = productInventory.items.find(
271
- i =>
272
- (i.productId == itm?.product?.id || i.productId == itm?.productBundle?.id) &&
273
- i.packingType == itm.packingType &&
274
- i.packingSize == itm.packingSize &&
275
- i.uom == itm.uom &&
276
- itm.releaseQty <= i.remainQty
277
- )
278
- return {
279
- ...itm,
280
- releaseUomValue: (foundProductInv.remainUomValue / foundProductInv.remainQty) * itm.releaseQty,
281
- status: foundProductInv ? 'suffice' : 'insufficient'
282
- }
283
- })
284
-
285
- let insufficient = draftOrder.orderProducts.find(op => op.status == 'insufficient')
286
- if (!insufficient) {
287
- //create RO
288
- let releaseGood = { ...draftOrder }
289
- delete releaseGood.id
290
- delete releaseGood.name
291
- delete releaseGood.createdAt
292
- delete (releaseGood as any).createdBy
293
- delete releaseGood.updatedAt
294
- delete (releaseGood as any).updatedBy
295
-
296
- let orderInventories = []
297
-
298
- for (let index = 0; index < draftOrder.orderProducts.length; index++) {
299
- const itm: Partial<OrderProduct> = draftOrder.orderProducts[index]
300
- let data = []
301
- if (itm.productBundle) {
302
- let bundle: ProductBundle = await parentTx.getRepository(ProductBundle).findOne({
303
- where: { id: itm.productBundle.id },
304
- relations: [
305
- 'productBundleSettings',
306
- 'productBundleSettings.productDetail',
307
- 'productBundleSettings.product'
308
- ]
309
- })
310
-
311
- for (let index2 = 0; index2 < bundle.productBundleSettings.length; index2++) {
312
- const objProductBundleSetting = bundle.productBundleSettings[index2]
313
- data.push({
314
- sku: objProductBundleSetting.product.sku,
315
- packingType: objProductBundleSetting.productDetail.packingType,
316
- packingSize: objProductBundleSetting.productDetail.packingSize,
317
- uom: objProductBundleSetting.productDetail.uom,
318
- releaseQty: objProductBundleSetting.bundleQty * itm.releaseQty,
319
- assignedQty: undefined,
320
- assignedUomValue: undefined,
321
- releaseUomValue: objProductBundleSetting.bundleQty * itm.releaseQty * itm.releaseUomValue
322
- })
323
- }
324
- } else {
325
- data = [
326
- {
327
- sku: itm.product.sku,
328
- packingType: itm.packingType,
329
- packingSize: itm.packingSize,
330
- uom: itm.uom,
331
- releaseQty: itm.releaseQty,
332
- assignedQty: undefined,
333
- assignedUomValue: undefined,
334
- releaseUomValue: itm.releaseUomValue
335
- }
336
- ]
337
- }
338
-
339
- data.forEach(data => {
340
- let existingOI = orderInventories.find(
341
- itm =>
342
- itm.sku == data.sku &&
343
- itm.packingType == data.packingType &&
344
- itm.packingSize == data.packingSize &&
345
- itm.uom == data.uom
346
- )
347
-
348
- if (existingOI) {
349
- existingOI.releaseQty = existingOI.releaseQty + data.releaseQty
350
- existingOI.releaseUomValue = existingOI.releaseUomValue + data.uomValue
351
- existingOI.uomValue = existingOI.uomValue + data.uomValue
352
- } else {
353
- orderInventories.push({ ...data, orderProduct: itm })
354
- }
355
- })
356
- }
357
- try {
358
- await getConnection().transaction(async (childTx: EntityManager) => {
359
- let availableItems: any[] = await bulkReleaseGoodsAvailableItemsFunction(
360
- orderInventories,
361
- draftOrder.bizplace.id,
362
- context,
363
- childTx
364
- )
365
- if (availableItems.some(item => !item.releaseQty || item.releaseQty > item.assignedQty)) {
366
- throw new ValidationError({
367
- ...ValidationError.ERROR_CODES.INSUFFICIENT_STOCK,
368
- detail: { data: JSON.stringify(availableItems) }
369
- })
370
- }
371
-
372
- // update orderInventories if availableItems are valid
373
- ;(releaseGood as any).orderInventories = availableItems.map(itm => {
374
- return {
375
- ...itm,
376
- releaseQty: itm.releaseQty,
377
- releaseUomValue: itm.releaseUomValue,
378
- uomValue: itm.uomValue
379
- }
380
- })
381
- let createdReleaseGood: ReleaseGood = await bulkGenerateReleaseGood(
382
- releaseGood,
383
- releaseGood.bizplace.id,
384
- roNoSetting,
385
- domain,
386
- user,
387
- childTx
388
- )
389
- await childTx
390
- .getRepository(DraftReleaseGood)
391
- .update(
392
- { id: draftOrder.id },
393
- { releaseGood: createdReleaseGood, status: DRAFT_RELEASE_ORDER_STATUS.SUBMITTED }
394
- )
395
- createdReleaseGood = await confirmReleaseGood(createdReleaseGood.name, context, childTx)
396
- })
397
- } catch (error) {
398
- console.error(error)
399
- }
400
- }
401
- })
402
- }
403
- }
404
-
405
- return true
406
- }
407
- }
408
-
409
- export async function upsertDraftReleaseGoodFunction(
410
- _: any,
411
- draftReleaseGood: any,
412
- orderProducts: OrderProductPatch[],
413
- shippingOrder: any,
414
- files: FileUpload[],
415
- context: any,
416
- tx?: EntityManager
417
- ): Promise<DraftReleaseGood> {
418
- if (!draftReleaseGood.id) {
419
- draftReleaseGood = await createDraftReleaseGoodFunction(
420
- _,
421
- draftReleaseGood,
422
- orderProducts,
423
- shippingOrder,
424
- files,
425
- context,
426
- tx
427
- )
428
- } else {
429
- draftReleaseGood = await updateDraftReleaseGoodFunction(
430
- _,
431
- draftReleaseGood,
432
- orderProducts,
433
- shippingOrder,
434
- files,
435
- context,
436
- tx
437
- )
438
- }
439
-
440
- return draftReleaseGood
441
- }
442
-
443
- export async function createDraftReleaseGoodFunction(
444
- _: any,
445
- draftReleaseGood: any,
446
- orderProducts: OrderProductPatch[],
447
- shippingOrder: any,
448
- files: FileUpload[],
449
- context: any,
450
- tx?: EntityManager
451
- ): Promise<DraftReleaseGood> {
452
- const { domain, user } = context.state
453
-
454
- let myBizplace: Bizplace
455
- let orderNo: string = ''
456
- let arrError: string[] = []
457
-
458
- const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
459
-
460
- if (draftReleaseGood?.bizplace?.id) {
461
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
462
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == draftReleaseGood.bizplace.id)
463
-
464
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
465
-
466
- draftReleaseGood.bizplace = foundPermittedBizplace
467
- } else {
468
- arrError.push(`No bizplace was selected`)
469
- }
470
-
471
- if (arrError.length > 0) {
472
- throw new Error(arrError.join(', '))
473
- }
474
-
475
- // // find DRO number rule setting
476
- const droNoSetting: Setting = await settingRepo.findOne({
477
- where: {
478
- domain: { id: domain.id },
479
- name: ORDER_NUMBER_SETTING_KEY.DO_NUMBER_RULE
480
- }
481
- })
482
-
483
- if (droNoSetting) {
484
- orderNo = await generateId({ domain, type: ORDER_NUMBER_RULE_TYPE.DRO_NUMBER, seed: {} })
485
- } else {
486
- orderNo = OrderNoGenerator.draftReleaseGood()
487
- }
488
-
489
- // // 1. Create shipping order if found
490
- if (shippingOrder) {
491
- let newShippingOrder: ShippingOrder = await tx.getRepository(ShippingOrder).save({
492
- ...shippingOrder,
493
- name: OrderNoGenerator.shippingOrder(),
494
- domain,
495
- bizplace: draftReleaseGood.bizplace,
496
- status: ORDER_STATUS.PENDING,
497
- creator: user,
498
- updater: user
499
- })
500
- draftReleaseGood.shippingOrder = newShippingOrder
501
- }
502
-
503
- // // 2. Create draft release good
504
- const createdDraftReleaseGood: DraftReleaseGood = await tx.getRepository(DraftReleaseGood).save({
505
- ...draftReleaseGood,
506
- name: orderNo,
507
- status: DRAFT_RELEASE_ORDER_STATUS.DRAFT,
508
- domain,
509
- creator: user,
510
- updater: user
511
- })
512
-
513
- // // 3. Create draft release good product
514
- await upsertDraftReleaseGoodProducts(
515
- domain,
516
- draftReleaseGood.bizplace,
517
- createdDraftReleaseGood,
518
- orderProducts,
519
- user,
520
- tx
521
- )
522
-
523
- // // 4. Create Attachments
524
- if (files?.length) {
525
- const attachments: Partial<Attachment>[] = files.map(attachment => {
526
- return {
527
- file: attachment,
528
- refType: ATTACHMENT_TYPE.DGRN,
529
- refBy: createdDraftReleaseGood.id,
530
- category: ATTACHMENT_TYPE.DGRN /* TODO use refType */
531
- }
532
- })
533
- await createAttachments(_, { attachments }, context)
534
- }
535
-
536
- return createdDraftReleaseGood
537
- }
538
-
539
- export async function updateDraftReleaseGoodFunction(
540
- _: any,
541
- draftReleaseGood: any,
542
- orderProducts: OrderProductPatch[],
543
- shippingOrder: any,
544
- files: FileUpload[],
545
- context: any,
546
- tx?: EntityManager
547
- ): Promise<DraftReleaseGood> {
548
- const { domain, user } = context.state
549
-
550
- let existingDraftReleaseGood: any = await getDraftReleaseGoodFunction(_, draftReleaseGood.name, context, tx)
551
-
552
- if (draftReleaseGood?.bizplace?.id) {
553
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
554
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == draftReleaseGood.bizplace.id)
555
-
556
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
557
-
558
- draftReleaseGood.bizplace = foundPermittedBizplace
559
- }
560
-
561
- if (shippingOrder) {
562
- // case to update existing shippingOrder
563
- if (existingDraftReleaseGood.shippingOrder) {
564
- await tx.getRepository(ShippingOrder).update(existingDraftReleaseGood.shippingOrder.id, shippingOrder)
565
- } else {
566
- let newShippingOrder: ShippingOrder = await tx.getRepository(ShippingOrder).save({
567
- ...shippingOrder,
568
- name: OrderNoGenerator.shippingOrder(),
569
- domain,
570
- bizplace: draftReleaseGood.bizplace,
571
- status: ORDER_STATUS.PENDING,
572
- creator: user,
573
- updater: user
574
- })
575
- draftReleaseGood.shippingOrder = newShippingOrder
576
- }
577
- } else {
578
- // case to delete existing shippingOrder
579
- if (existingDraftReleaseGood.shippingOrder) {
580
- await tx.getRepository(ShippingOrder).delete(existingDraftReleaseGood.shippingOrder)
581
- }
582
- }
583
-
584
- // // 1. Update draft release good
585
- const updateDraftReleaseGood: DraftReleaseGood = await tx.getRepository(DraftReleaseGood).save({
586
- ...existingDraftReleaseGood,
587
- ...draftReleaseGood,
588
- domain,
589
- creator: existingDraftReleaseGood.creator,
590
- updater: user
591
- })
592
-
593
- // // 2. Update draft release good product
594
- await upsertDraftReleaseGoodProducts(domain, draftReleaseGood.bizplace, draftReleaseGood, orderProducts, user, tx)
595
-
596
- // // 3. Remove Purchase Order Attachment
597
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
598
- where: {
599
- domain: { id: domain.id },
600
- refBy: draftReleaseGood.id,
601
- category: ATTACHMENT_TYPE.DGRN
602
- }
603
- })
604
-
605
- // // 4. Remove All Attachment
606
- if (foundAttachments?.length) {
607
- await deleteAttachmentsByRef(_, { refBys: foundAttachments.map(file => file.refBy) }, context)
608
- }
609
-
610
- // // 5. Add New Attachment
611
- if (files?.length > 0) {
612
- const attachments: Partial<Attachment>[] = files.map(attachment => {
613
- return {
614
- file: attachment,
615
- refType: ATTACHMENT_TYPE.DGRN,
616
- refBy: updateDraftReleaseGood.id,
617
- category: ATTACHMENT_TYPE.DGRN /* TODO use refType */
618
- }
619
- })
620
- await createAttachments(_, { attachments }, context)
621
- }
622
-
623
- return existingDraftReleaseGood
624
- }
625
-
626
- export async function upsertDraftReleaseGoodProducts(
627
- domain: Domain,
628
- bizplace: Bizplace,
629
- draftReleaseGood: DraftReleaseGood,
630
- orderProductsPatch: OrderProductPatch[],
631
- user: User,
632
- tx?: EntityManager
633
- ): Promise<void> {
634
- try {
635
- let orderProducts: OrderProduct[] = []
636
-
637
- const draftReleaseGoodRepo: Repository<DraftReleaseGood> =
638
- tx?.getRepository(DraftReleaseGood) || getRepository(DraftReleaseGood)
639
- const bizplaceRepo: Repository<Bizplace> = tx?.getRepository(Bizplace) || getRepository(Bizplace)
640
- const orderProductRepo: Repository<OrderProduct> = tx?.getRepository(OrderProduct) || getRepository(OrderProduct)
641
- const productRepo: Repository<Product> = tx?.getRepository(Product) || getRepository(Product)
642
- const productBundleRepo: Repository<ProductBundle> =
643
- tx?.getRepository(ProductBundle) || getRepository(ProductBundle)
644
-
645
- draftReleaseGood = (await draftReleaseGoodRepo.findOne({
646
- where: { id: draftReleaseGood.id },
647
- relations: [
648
- 'orderProducts',
649
- 'orderProducts.product',
650
- 'orderProducts.productBundle',
651
- 'orderProducts.creator',
652
- 'orderProducts.updater'
653
- ]
654
- })) as any
655
-
656
- // Remove all existing order products that do not exist in current input
657
- let removeOP = draftReleaseGood.orderProducts.filter(
658
- existingOP => orderProductsPatch.filter(inOP => inOP.id == existingOP.id).length == 0
659
- )
660
- // removeOP.forEach(async op => {
661
- // await orderProductRepo.delete(op)
662
- // })
663
-
664
- if (removeOP.length > 0) await orderProductRepo.delete(removeOP.map(itm => itm.id))
665
-
666
- bizplace = await bizplaceRepo.findOne({
667
- where: { id: bizplace.id },
668
- relations: ['domain', 'company', 'company.domain']
669
- })
670
-
671
- orderProducts = await Promise.all(
672
- orderProductsPatch.map(async (op: any) => {
673
- if (!op?.id) delete op.id
674
-
675
- const customerCompanyDomain: Domain = bizplace.company.domain
676
- let product: Product = null
677
- let productBundle: ProductBundle = null
678
- let existingOP = draftReleaseGood.orderProducts.find(existOP => existOP.id == op.id)
679
-
680
- let updatePatch = {
681
- ...existingOP,
682
- ...op,
683
- domain,
684
- batchId: '',
685
- packQty: 0,
686
- actualPackQty: 0,
687
- palletQty: 0,
688
- actualPalletQty: 0,
689
- bizplace: bizplace,
690
- name: op?.id ? op.name : OrderNoGenerator.orderProduct(),
691
- draftReleaseGood: draftReleaseGood,
692
- status: draftReleaseGood.status,
693
- creator: op?.id ? op.creator : user,
694
- updater: user
695
- }
696
-
697
- if (op?.product?.id) {
698
- product = await productRepo.findOne({
699
- where: { domain: { id: customerCompanyDomain.id }, id: op.product.id }
700
- })
701
- updatePatch['product'] = product || undefined
702
-
703
- if (!product) {
704
- productBundle = await productBundleRepo.findOne({
705
- where: { domain: { id: customerCompanyDomain.id }, id: op.product.id }
706
- })
707
- updatePatch['productBundle'] = productBundle || undefined
708
- }
709
-
710
- if (!product && !productBundle) throw new Error(`product not found`)
711
- } else {
712
- if (existingOP) {
713
- product = existingOP.product
714
- productBundle = existingOP.productBundle
715
- updatePatch['product'] = existingOP.product || undefined
716
- updatePatch['productBundle'] = existingOP.productBundle || undefined
717
- } else {
718
- product = await productRepo.findOne({
719
- where: { domain: { id: customerCompanyDomain.id }, sku: op.product.sku, deletedAt: IsNull() },
720
- relations: ['productDetails']
721
- })
722
- if (product) {
723
- const productDetails: ProductDetail[] = product.productDetails
724
- let selectedProductDetail: ProductDetail[]
725
- if (op?.product?.packingType) {
726
- selectedProductDetail = productDetails.filter(pd => pd.packingType == op.product.packingType)
727
- } else {
728
- selectedProductDetail = productDetails.filter(pd => pd.isDefault)
729
- }
730
-
731
- product.packingType = selectedProductDetail[0].packingType
732
- product.primaryUnit = selectedProductDetail[0].uom
733
- product.primaryValue = selectedProductDetail[0].uomValue
734
- }
735
-
736
- updatePatch['product'] = product || undefined
737
-
738
- if (!product) {
739
- productBundle = await productBundleRepo.findOne({
740
- where: { domain: { id: customerCompanyDomain.id }, sku: op.product.sku }
741
- })
742
- updatePatch['productBundle'] = productBundle || undefined
743
- }
744
-
745
- if (!product && !productBundle) throw new Error(`product not found`)
746
- }
747
- }
748
-
749
- updatePatch['packingType'] = op?.packingType
750
- ? op.packingType
751
- : product?.packingType
752
- ? product.packingType
753
- : productBundle.packingType
754
- updatePatch['uom'] = op?.uom ? op.uom : product?.primaryUnit ? product.primaryUnit : 'UNIT'
755
- updatePatch['uomValue'] = op?.uomValue ? op.uomValue : product?.primaryValue ? product.primaryValue : 0
756
-
757
- return updatePatch
758
- })
759
- )
760
-
761
- await orderProductRepo.save(orderProducts)
762
- } catch (error) {
763
- throw error
764
- }
765
- }