@things-factory/sales-base 4.3.2 → 4.4.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 -501
  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 -671
  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,671 +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, Repository } from 'typeorm'
4
-
5
- import { Attachment, createAttachments, deleteAttachmentsByRef } from '@things-factory/attachment-base'
6
- import { User } from '@things-factory/auth-base'
7
- import { InventoryUtil } from '../../utils'
8
- import { Bizplace, ContactPoint, getPermittedBizplaces, getPermittedBizplaceIds } from '@things-factory/biz-base'
9
- import { generateId } from '@things-factory/id-rule-base'
10
- import { Product, ProductBundle } from '@things-factory/product-base'
11
- import { Setting } from '@things-factory/setting-base'
12
- import { Domain } 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 { OrderNoGenerator } from '../../utils'
24
- import { OrderProductPatch } from '../order-product/order-product-types'
25
- import { ShippingOrder } from '../shipping-order/shipping-order'
26
- import { ShippingOrderPatch } from '../shipping-order/shipping-order-types'
27
- // import {
28
- // checkArrivedNoticeFunction,
29
- // confirmArrivalNoticeFunction,
30
- // generateArrivalNoticeFunction,
31
- // receiveArrivalNoticeFunction
32
- // } from '../arrival-notice/arrival-notice-mutation'
33
- import { getDraftReleaseGoodFunction } from './draft-release-good-query'
34
- import { ReleaseGood } from '../release-good/release-good'
35
- import { bulkReleaseGoodsAvailableItemsFunction } from '../release-good/release-good-query'
36
- import { confirmReleaseGood, bulkGenerateReleaseGood } from '../release-good/release-good-mutation'
37
- import { ValidationError } from '../../errors'
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: any,
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 }: { tx: EntityManager } = 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: any
74
- ): Promise<DraftReleaseGood> {
75
- const { domain, user, tx } = context.state
76
-
77
- let drg = await tx.getRepository(DraftReleaseGood).save({
78
- ...draftReleaseGood,
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: any
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 }
102
- })
103
-
104
- return await repository.save({
105
- ...draftReleaseGood,
106
- ...patch,
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: any
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,
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.findOne(newRecord.id)
143
-
144
- const result = await draftReleaseGoodRepo.save({
145
- ...draftReleaseGood,
146
- ...newRecord,
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: any): Promise<boolean> {
160
- const { domain, tx } = context.state
161
-
162
- await tx.getRepository(DraftReleaseGood).delete({ domain, id })
163
- return true
164
- }
165
-
166
- @Directive('@transaction')
167
- @Mutation(returns => Boolean, { description: 'To delete multiple draftReleaseGoods' })
168
- async deleteDraftReleaseGoods(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
169
- const { domain, tx } = context.state
170
-
171
- await tx.getRepository(DraftReleaseGood).delete({
172
- domain,
173
- id: In(ids)
174
- })
175
-
176
- return true
177
- }
178
-
179
- @Directive('@privilege(category: "order_customer", privilege: "mutation")')
180
- @Directive('@transaction')
181
- @Mutation(returns => Boolean, { description: 'To generate Release Goods from Draft' })
182
- async generateReleaseGoodsFromDraft(
183
- @Ctx() context: any,
184
- @Arg('ids', type => [String]) ids: string[],
185
- // @Arg('rawReleaseGoods', type => [NewReleaseGood], { nullable: true }) rawReleaseGoods: NewReleaseGood[],
186
- // @Arg('bizplaceId', type => String) bizplaceId: string
187
- ): Promise<boolean> {
188
- const { domain, user, tx } = context.state
189
-
190
- const updatableDraftOrders = await tx.getRepository(DraftReleaseGood).find({
191
- where: {
192
- domain,
193
- id: In(ids),
194
- status: DRAFT_RELEASE_ORDER_STATUS.DRAFT
195
- },
196
- relations: [
197
- 'orderProducts',
198
- 'orderProducts.product',
199
- 'orderProducts.productBundle',
200
- 'shippingOrder',
201
- 'bizplace',
202
- 'domain',
203
- 'creator',
204
- 'updater'
205
- ]
206
- })
207
- if (updatableDraftOrders.length > 0) {
208
-
209
- let createdReleaseGoods: ReleaseGood[] = []
210
- const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
211
-
212
- const roNoSetting: Setting = await settingRepo.findOne({
213
- where: {
214
- domain,
215
- name: ORDER_NUMBER_SETTING_KEY.RO_NUMBER_RULE
216
- }
217
- })
218
-
219
- for (let index = 0; index < updatableDraftOrders.length; index++) {
220
- const draftOrder = updatableDraftOrders[index];
221
-
222
- let foundPermittedBizplace: Bizplace
223
- let companyBizplace: Bizplace
224
-
225
- if (draftOrder?.bizplace?.id) {
226
- foundPermittedBizplace = await tx.getRepository(Bizplace).findOne(draftOrder.bizplace.id, {
227
- relations: ['company', 'company.domain']
228
- })
229
- const companyDomain: Domain = foundPermittedBizplace.company.domain
230
- companyBizplace = await tx.getRepository(Bizplace).findOne({ where: { domain: companyDomain } })
231
- } else {
232
- return false
233
- }
234
-
235
- const bizplaces: Bizplace[] = [foundPermittedBizplace, companyBizplace]
236
-
237
- let productInventory = await InventoryUtil.bizplaceProductInventory(bizplaces, {
238
- filters: [{
239
- name: 'productId',
240
- operator: 'in',
241
- value: [
242
- ...draftOrder.orderProducts.filter(itm => itm?.product).map(itm => { return itm.product.id }),
243
- ...draftOrder.orderProducts.filter(itm => itm?.productBundle).map(itm => { return itm.productBundle.id })
244
- ]
245
- }]
246
- }, context, tx)
247
-
248
-
249
- draftOrder.orderProducts = draftOrder.orderProducts.map(itm => {
250
- let foundProductInv = productInventory.items.find(i => (i.productId == itm?.product?.id || i.productId == itm?.productBundle?.id) && i.packingType == itm.packingType && i.packingSize == itm.packingSize && i.uom == itm.uom && itm.releaseQty <= i.remainQty)
251
- return { ...itm, status: foundProductInv ? 'suffice' : 'insufficient' }
252
- })
253
-
254
- let insufficient = draftOrder.orderProducts.find(op => op.status == 'insufficient')
255
-
256
- if (!insufficient) {
257
- //create RO
258
- let releaseGood = { ...draftOrder }
259
- delete releaseGood.id
260
- delete releaseGood.name
261
- delete releaseGood.createdAt
262
- delete releaseGood.createdBy
263
- delete releaseGood.updatedAt
264
- delete releaseGood.updatedBy
265
-
266
- let orderInventories = []
267
-
268
- for (let index = 0; index < draftOrder.orderProducts.length; index++) {
269
- const itm = draftOrder.orderProducts[index];
270
- let data = []
271
- if (itm.productBundle) {
272
- let bundle = await tx.getRepository(ProductBundle).findOne({ where: { id: itm.productBundle.id }, relations: ['productBundleSettings', 'productBundleSettings.productDetail', 'productBundleSettings.product',] })
273
-
274
- for (let index2 = 0; index2 < bundle.productBundleSettings.length; index2++) {
275
- const objProductBundleSetting = bundle.productBundleSettings[index2];
276
- data.push({
277
- sku: objProductBundleSetting.product.sku,
278
- packing_type: objProductBundleSetting.productDetail.packingType,
279
- packing_size: objProductBundleSetting.productDetail.packingSize,
280
- uom: objProductBundleSetting.productDetail.uom,
281
- release_qty: objProductBundleSetting.bundleQty * itm.releaseQty,
282
- assignedQty: undefined,
283
- assignedUomValue: undefined,
284
- releaseUomValue: undefined
285
- })
286
- }
287
- } else {
288
- data = [{
289
- sku: itm.product.sku,
290
- packing_type: itm.packingType,
291
- packing_size: itm.packingSize,
292
- uom: itm.uom,
293
- release_qty: itm.releaseQty,
294
- assignedQty: undefined,
295
- assignedUomValue: undefined,
296
- releaseUomValue: undefined
297
- }]
298
- }
299
-
300
- data.forEach(data => {
301
- let existingOI = orderInventories.find(itm =>
302
- itm.sku == data.sku &&
303
- itm.packing_type == data.packing_type &&
304
- itm.packing_size == data.packing_size &&
305
- itm.uom == data.uom
306
- )
307
-
308
- if (existingOI) {
309
- existingOI.release_qty = existingOI.release_qty + data.release_qty
310
- } else {
311
- orderInventories.push(data)
312
- }
313
- });
314
- }
315
- try {
316
- await getConnection().transaction(async (childTx: EntityManager) => {
317
-
318
- let availableItems: any[] = await bulkReleaseGoodsAvailableItemsFunction(
319
- orderInventories,
320
- draftOrder.bizplace.id,
321
- context,
322
- childTx
323
- )
324
-
325
- if (availableItems.some(item => !item.release_qty || item.release_qty > item.assignedQty))
326
- throw new ValidationError({
327
- ...ValidationError.ERROR_CODES.INSUFFICIENT_STOCK,
328
- detail: { data: JSON.stringify(availableItems) }
329
- })
330
-
331
- // update orderInventories if availableItems are valid
332
- releaseGood.orderInventories = availableItems.map(itm => {
333
- return {
334
- ...itm,
335
- releaseQty: itm.release_qty
336
- }
337
- })
338
-
339
- let createdReleaseGood: ReleaseGood = await bulkGenerateReleaseGood(
340
- releaseGood,
341
- releaseGood.bizplace.id,
342
- roNoSetting,
343
- domain,
344
- user,
345
- childTx
346
- )
347
-
348
- await childTx
349
- .getRepository(DraftReleaseGood)
350
- .update({ id: draftOrder.id }, { releaseGood: createdReleaseGood, status: DRAFT_RELEASE_ORDER_STATUS.SUBMITTED })
351
-
352
- createdReleaseGood = await confirmReleaseGood(createdReleaseGood.name, context, childTx)
353
-
354
- })
355
- } catch (error) {
356
- console.error(error)
357
- }
358
- }
359
-
360
- }
361
- }
362
-
363
- return true
364
- }
365
- }
366
-
367
- export async function upsertDraftReleaseGoodFunction(
368
- _: any,
369
- draftReleaseGood: any,
370
- orderProducts: OrderProductPatch[],
371
- shippingOrder: any,
372
- files: FileUpload[],
373
- context: any,
374
- tx?: EntityManager
375
- ): Promise<DraftReleaseGood> {
376
- if (!draftReleaseGood.id) {
377
- draftReleaseGood = await createDraftReleaseGoodFunction(
378
- _,
379
- draftReleaseGood,
380
- orderProducts,
381
- shippingOrder,
382
- files,
383
- context,
384
- tx
385
- )
386
- } else {
387
- draftReleaseGood = await updateDraftReleaseGoodFunction(
388
- _,
389
- draftReleaseGood,
390
- orderProducts,
391
- shippingOrder,
392
- files,
393
- context,
394
- tx
395
- )
396
- }
397
-
398
- return draftReleaseGood
399
- }
400
-
401
- export async function createDraftReleaseGoodFunction(
402
- _: any,
403
- draftReleaseGood: any,
404
- orderProducts: OrderProductPatch[],
405
- shippingOrder: any,
406
- files: FileUpload[],
407
- context: any,
408
- tx?: EntityManager
409
- ): Promise<DraftReleaseGood> {
410
- const { domain, user }: { domain: Domain; user: User } = context.state
411
-
412
- let myBizplace: Bizplace
413
- let orderNo: string = ''
414
- let arrError: string[] = []
415
-
416
- const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
417
-
418
- if (draftReleaseGood?.bizplace?.id) {
419
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
420
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == draftReleaseGood.bizplace.id)
421
-
422
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
423
-
424
- draftReleaseGood.bizplace = foundPermittedBizplace
425
- } else {
426
- arrError.push(`No bizplace was selected`)
427
- }
428
-
429
- if (arrError.length > 0) {
430
- throw new Error(arrError.join(', '))
431
- }
432
-
433
- // // find DRO number rule setting
434
- const droNoSetting: Setting = await settingRepo.findOne({
435
- where: {
436
- domain,
437
- name: ORDER_NUMBER_SETTING_KEY.PO_NUMBER_RULE
438
- }
439
- })
440
-
441
- if (droNoSetting) {
442
- orderNo = await generateId({ domain, type: ORDER_NUMBER_RULE_TYPE.DRO_NUMBER, seed: {} })
443
- } else {
444
- orderNo = OrderNoGenerator.draftReleaseGood()
445
- }
446
-
447
- // // 1. Create draft release good
448
- const createdDraftReleaseGood: DraftReleaseGood = await tx.getRepository(DraftReleaseGood).save({
449
- ...draftReleaseGood,
450
- name: orderNo,
451
- status: DRAFT_RELEASE_ORDER_STATUS.DRAFT,
452
- domain,
453
- creator: user,
454
- updater: user
455
- })
456
-
457
- // // 2. Create draft release good product
458
- await upsertDraftReleaseGoodProducts(
459
- domain,
460
- draftReleaseGood.bizplace,
461
- createdDraftReleaseGood,
462
- orderProducts,
463
- user,
464
- tx
465
- )
466
-
467
- // // 3. Create Attachments
468
- if (files?.length) {
469
- const attachments: Attachment[] = files.map(attachment => {
470
- return {
471
- file: attachment,
472
- refBy: createdDraftReleaseGood.id,
473
- category: ATTACHMENT_TYPE.DGRN
474
- }
475
- })
476
- await createAttachments(_, { attachments }, context)
477
- }
478
-
479
- return createdDraftReleaseGood
480
- }
481
-
482
- export async function updateDraftReleaseGoodFunction(
483
- _: any,
484
- draftReleaseGood: any,
485
- orderProducts: OrderProductPatch[],
486
- shippingOrder: any,
487
- files: FileUpload[],
488
- context: any,
489
- tx?: EntityManager
490
- ): Promise<DraftReleaseGood> {
491
- const { domain, user }: { domain: Domain; user: User } = context.state
492
-
493
- let existingDraftReleaseGood: any = await getDraftReleaseGoodFunction(_, draftReleaseGood.name, context, tx)
494
-
495
- if (draftReleaseGood?.bizplace?.id) {
496
- const permittedBizplaces: Bizplace[] = await getPermittedBizplaces(domain, user)
497
- let foundPermittedBizplace: Bizplace = permittedBizplaces.find(biz => biz.id == draftReleaseGood.bizplace.id)
498
-
499
- if (!foundPermittedBizplace) throw new Error(`This user does not permitted for this company`)
500
-
501
- draftReleaseGood.bizplace = foundPermittedBizplace
502
- }
503
-
504
- if (shippingOrder) {
505
- // case to update existing shippingOrder
506
- if (existingDraftReleaseGood.shippingOrder) {
507
- await tx.getRepository(ShippingOrder).update(existingDraftReleaseGood.shippingOrder.id, shippingOrder)
508
- } else {
509
- let newShippingOrder: ShippingOrder = await tx.getRepository(ShippingOrder).save({
510
- ...shippingOrder,
511
- name: OrderNoGenerator.shippingOrder(),
512
- domain,
513
- bizplace: draftReleaseGood.bizplace,
514
- status: ORDER_STATUS.PENDING,
515
- creator: user,
516
- updater: user
517
- })
518
- draftReleaseGood.shippingOrder = newShippingOrder
519
- }
520
- } else {
521
- // case to delete existing shippingOrder
522
- if (existingDraftReleaseGood.shippingOrder) {
523
- await tx.getRepository(ShippingOrder).delete(existingDraftReleaseGood.shippingOrder)
524
- }
525
- }
526
-
527
- // // 1. Update draft release good
528
- const updateDraftReleaseGood: DraftReleaseGood = await tx.getRepository(DraftReleaseGood).save({
529
- ...existingDraftReleaseGood,
530
- ...draftReleaseGood,
531
- domain,
532
- creator: user,
533
- updater: user
534
- })
535
-
536
- // // 2. Update draft release good product
537
- await upsertDraftReleaseGoodProducts(domain, draftReleaseGood.bizplace, draftReleaseGood, orderProducts, user, tx)
538
-
539
- // // 3. Remove Purchase Order Attachment
540
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
541
- where: {
542
- domain,
543
- refBy: draftReleaseGood.id,
544
- category: ATTACHMENT_TYPE.DGRN
545
- }
546
- })
547
-
548
- // // 4. Remove All Attachment
549
- if (foundAttachments?.length) {
550
- await deleteAttachmentsByRef(_, { refBys: foundAttachments.map(file => file.refBy) }, context)
551
- }
552
-
553
- // // 5. Add New Attachment
554
- if (files?.length > 0) {
555
- const attachments: Attachment[] = files.map(attachment => {
556
- return {
557
- file: attachment,
558
- refBy: updateDraftReleaseGood.id,
559
- category: ATTACHMENT_TYPE.DGRN
560
- }
561
- })
562
- await createAttachments(_, { attachments }, context)
563
- }
564
-
565
- return existingDraftReleaseGood
566
- }
567
-
568
- export async function upsertDraftReleaseGoodProducts(
569
- domain: Domain,
570
- bizplace: Bizplace,
571
- draftReleaseGood: DraftReleaseGood,
572
- orderProductsPatch: OrderProductPatch[],
573
- user: User,
574
- tx?: EntityManager
575
- ): Promise<void> {
576
- try {
577
- let orderProducts: OrderProduct[] = []
578
-
579
- const draftReleaseGoodRepo: Repository<Product> =
580
- tx?.getRepository(DraftReleaseGood) || getRepository(DraftReleaseGood)
581
- const bizplaceRepo: Repository<Product> = tx?.getRepository(Bizplace) || getRepository(Bizplace)
582
- const orderProductRepo: Repository<OrderProduct> = tx?.getRepository(OrderProduct) || getRepository(OrderProduct)
583
- const productRepo: Repository<Product> = tx?.getRepository(Product) || getRepository(Product)
584
- const productBundleRepo: Repository<Product> = tx?.getRepository(ProductBundle) || getRepository(ProductBundle)
585
-
586
- draftReleaseGood = await draftReleaseGoodRepo.findOne({
587
- where: { id: draftReleaseGood.id },
588
- relations: ['orderProducts', 'orderProducts.product', 'orderProducts.productBundle', 'orderProducts.creator', 'orderProducts.updater']
589
- })
590
-
591
- // Remove all existing order products that do not exist in current input
592
- let removeOP = draftReleaseGood.orderProducts.filter(
593
- existingOP => orderProductsPatch.filter(inOP => inOP.id == existingOP.id).length == 0
594
- )
595
- // removeOP.forEach(async op => {
596
- // await orderProductRepo.delete(op)
597
- // })
598
-
599
- if (removeOP.length > 0) await orderProductRepo.delete(removeOP.map(itm => itm.id))
600
-
601
- bizplace = await bizplaceRepo.findOne(bizplace.id, {
602
- relations: ['domain', 'company', 'company.domain']
603
- })
604
-
605
- orderProducts = await Promise.all(
606
- orderProductsPatch.map(async (op: any) => {
607
- if (!op?.id) delete op.id
608
-
609
- const customerCompanyDomain: Domain = bizplace.company.domain
610
- let product: Product = null
611
- let productBundle: ProductBundle = null
612
- let existingOP = draftReleaseGood.orderProducts.find(existOP => existOP.id == op.id)
613
-
614
- let updatePatch = {
615
- ...existingOP,
616
- ...op,
617
- domain,
618
- batchId: '',
619
- packQty: 0,
620
- actualPackQty: 0,
621
- palletQty: 0,
622
- actualPalletQty: 0,
623
- bizplace: bizplace,
624
- name: op?.id ? op.name : OrderNoGenerator.orderProduct(),
625
- draftReleaseGood: draftReleaseGood,
626
- status: draftReleaseGood.status,
627
- creator: op?.id ? op.creator : user,
628
- updater: user
629
- }
630
-
631
- if (op?.product?.id) {
632
- product = await productRepo.findOne({
633
- where: { domain: customerCompanyDomain, id: op.product.id }
634
- })
635
- updatePatch['product'] = product || undefined
636
-
637
- if (!product) {
638
- productBundle = await productBundleRepo.findOne({
639
- where: { domain: customerCompanyDomain, id: op.product.id }
640
- })
641
- updatePatch['productBundle'] = productBundle || undefined
642
- }
643
-
644
- if (!product && !productBundle) throw new Error(`product not found`)
645
- } else {
646
- if (existingOP) {
647
- product = existingOP.product
648
- productBundle = existingOP.productBundle
649
- updatePatch['product'] = existingOP.product || undefined
650
- updatePatch['productBundle'] = existingOP.productBundle || undefined
651
- }
652
- }
653
-
654
-
655
- updatePatch['packingType'] = op?.packingType
656
- ? op.packingType
657
- : product?.packingType
658
- ? product.packingType
659
- : productBundle.packingType
660
- updatePatch['uom'] = op?.uom ? op.uom : product?.primaryUnit ? product.primaryUnit : 'UNIT'
661
- updatePatch['uomValue'] = op?.uomValue ? op.uomValue : product?.primaryValue ? product.primaryValue : 0
662
-
663
- return updatePatch
664
- })
665
- )
666
-
667
- await orderProductRepo.save(orderProducts)
668
- } catch (error) {
669
- throw error
670
- }
671
- }