@things-factory/sales-base 4.3.3 → 4.4.0-alpha.1

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