@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,549 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { EntityManager, In, OrderByCondition, SelectQueryBuilder } from 'typeorm'
3
-
4
- import { Attachment } from '@things-factory/attachment-base'
5
- import { checkUserBelongsDomain, User } from '@things-factory/auth-base'
6
- import { Bizplace, getCompanyBizplace, getPermittedBizplaceIds } from '@things-factory/biz-base'
7
- import { ProductDetail } from '@things-factory/product-base'
8
- import { buildQuery, Domain, getRepository, ListParam } from '@things-factory/shell'
9
-
10
- import { ArrivalNoticeList, NewArrivalNotice, RawArrivalNotice } from '../'
11
- import { ATTACHMENT_TYPE, ORDER_STATUS } from '../../constants'
12
- import { OrderInventory, OrderProduct } from '../../service'
13
- import { ArrivalNotice } from './arrival-notice'
14
-
15
- @Resolver(ArrivalNotice)
16
- export class ArrivalNoticeQuery {
17
- @Directive('@privilege(category: "order", privilege: "query", domainOwnerGranted: true)')
18
- @Query(returns => ArrivalNotice)
19
- async arrivalNotice(
20
- @Ctx() context: ResolverContext,
21
- @Arg('name', { nullable: true }) name?: string,
22
- @Arg('refNo', { nullable: true }) refNo?: string
23
- ): Promise<ArrivalNotice> {
24
- const { domain, user, bizplace }: { domain: Domain; user: User; bizplace?: Bizplace } = context.state
25
-
26
- let param: any = { domain, bizplace: bizplace ? bizplace : In(await getPermittedBizplaceIds(domain, user)) }
27
-
28
- if (name) param = { ...param, name }
29
- else if (refNo) param = { ...param, refNo }
30
- else return
31
-
32
- let foundGAN: ArrivalNotice = await getRepository(ArrivalNotice).findOne({
33
- where: { ...param },
34
- relations: [
35
- 'domain',
36
- 'bizplace',
37
- 'bizplace.domain',
38
- 'releaseGood',
39
- 'purchaseOrder',
40
- 'purchaseOrder.bufferLocation',
41
- 'orderProducts',
42
- 'orderProducts.product',
43
- 'orderInventories',
44
- 'orderInventories.inventory',
45
- 'orderInventories.inventory.product',
46
- 'orderInventories.inventory.location',
47
- 'orderVass',
48
- 'orderVass.vas',
49
- 'orderVass.targetProduct',
50
- 'supplier',
51
- 'creator',
52
- 'updater'
53
- ]
54
- })
55
-
56
- if (name && !foundGAN) throw new Error(`Failed to find arrival notice with ${name}`)
57
-
58
- if (foundGAN) {
59
- const foundAttachments: Attachment[] = await getRepository(Attachment).find({
60
- where: {
61
- domain: { id: domain.id },
62
- refBy: foundGAN?.id,
63
- category: ATTACHMENT_TYPE.GAN
64
- }
65
- })
66
-
67
- const foundPOAttachments: Attachment[] = foundGAN?.purchaseOrder?.id
68
- ? await getRepository(Attachment).find({
69
- where: {
70
- domain: { id: domain.id },
71
- refBy: foundGAN.purchaseOrder?.id,
72
- category: ATTACHMENT_TYPE.PO
73
- }
74
- })
75
- : []
76
-
77
- // add productDetails data to orderProduct.product
78
- foundGAN.orderProducts = await Promise.all(
79
- foundGAN.orderProducts.map(async (orderProduct: OrderProduct) => {
80
- orderProduct.product['productDetails'] = await getRepository(ProductDetail).find({
81
- where: {
82
- product: { id: orderProduct.product.id },
83
- packingType: orderProduct.packingType,
84
- packingSize: orderProduct.packingSize
85
- }
86
- })
87
- return orderProduct
88
- })
89
- )
90
-
91
- // add productDetails data to orderInventory.inventory.product if orderInventory is exist
92
- if (foundGAN.orderInventories && foundGAN.orderInventories.length) {
93
- foundGAN.orderInventories = await Promise.all(
94
- foundGAN.orderInventories.map(async (orderInventory: OrderInventory) => {
95
- orderInventory.inventory.product['productDetails'] = await getRepository(ProductDetail).find({
96
- where: {
97
- product: { id: orderInventory.inventory.product.id },
98
- packingType: orderInventory.inventory.packingType,
99
- packingSize: orderInventory.inventory.packingSize
100
- }
101
- })
102
- return orderInventory
103
- })
104
- )
105
- }
106
-
107
- return {
108
- ...foundGAN,
109
- attachment: [...foundPOAttachments, ...foundAttachments]
110
- }
111
- } else {
112
- return
113
- }
114
- }
115
-
116
- @Directive('@privilege(category: "order_customer", privilege: "query", domainOwnerGranted: true)')
117
- @Query(returns => ArrivalNoticeList)
118
- async arrivalNotices(
119
- @Ctx() context: ResolverContext,
120
- @Args(type => ListParam) params: ListParam
121
- ): Promise<ArrivalNoticeList> {
122
- const { domain, user } = context.state
123
-
124
- if (await checkUserBelongsDomain(domain, user)) {
125
- if (!params.filters.some(e => e.name === 'status') && !params.filters.some(e => e.name === 'name')) {
126
- params.filters.push({
127
- name: 'status',
128
- operator: 'notin',
129
- value: [ORDER_STATUS.PENDING, ORDER_STATUS.EDITING],
130
- relation: false
131
- })
132
- }
133
- }
134
-
135
- if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {
136
- params.filters.push({
137
- name: 'bizplaceId',
138
- operator: 'in',
139
- value: await getPermittedBizplaceIds(domain, user),
140
- relation: false
141
- })
142
- }
143
-
144
- const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
145
- if (fromDateParamIdx >= 0) {
146
- let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
147
- params.filters.splice(fromDateParamIdx, 1)
148
-
149
- params.filters.push({
150
- name: 'createdAt',
151
- operator: 'gte',
152
- value: fromDateVal.toISOString(),
153
- relation: false
154
- })
155
- }
156
-
157
- const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
158
- if (toDateParamIdx >= 0) {
159
- let toDateVal = new Date(params.filters[toDateParamIdx].value)
160
- params.filters.splice(toDateParamIdx, 1)
161
-
162
- params.filters.push({
163
- name: 'createdAt',
164
- operator: 'lt',
165
- value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
166
- relation: false
167
- })
168
- }
169
-
170
- const qb: SelectQueryBuilder<ArrivalNotice> = getRepository(ArrivalNotice).createQueryBuilder('an')
171
- buildQuery(qb, params, context)
172
- qb.addSelect('COALESCE("cc".rank, 9999)', 'rank')
173
- qb.leftJoinAndSelect('an.domain', 'domain')
174
- qb.leftJoinAndSelect('an.bizplace', 'bizplace')
175
- qb.leftJoinAndSelect('an.releaseGood', 'ro')
176
- qb.leftJoinAndSelect('an.creator', 'creator')
177
- qb.leftJoinAndSelect('an.updater', 'updater')
178
- qb.leftJoinAndSelect('an.acceptedBy', 'accepter')
179
- qb.leftJoin(
180
- subQuery => {
181
- return subQuery
182
- .select(`ccd.rank`, 'rank')
183
- .addSelect(`ccd.name`, 'status')
184
- .from(`common_code_details`, 'ccd')
185
- .innerJoin(`ccd.commonCode`, 'cc')
186
- .where(`ccd.domain_id = :domainId`, { domainId: domain.id })
187
- .andWhere(`cc.name = 'ORDER_STATUS'`)
188
- },
189
- 'cc',
190
- 'cc.status = an.status'
191
- )
192
-
193
- const arrChildSortData = ['bizplace']
194
- const sort: OrderByCondition = (params.sortings || []).reduce(
195
- (acc, sort) => ({
196
- ...acc,
197
- [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'an.' + sort.name]: sort.desc ? 'DESC' : 'ASC'
198
- }),
199
- !params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
200
- )
201
-
202
- qb.orderBy(sort)
203
-
204
- const [items, total] = await qb.getManyAndCount()
205
-
206
- return { items, total }
207
- }
208
-
209
- @Directive('@privilege(category: "order_warehouse", privilege: "query", domainOwnerGranted: true)')
210
- @Query(returns => ArrivalNoticeList)
211
- async arrivalNoticeRequests(
212
- @Args(type => ListParam) params: ListParam,
213
- @Ctx() context: ResolverContext
214
- ): Promise<ArrivalNoticeList> {
215
- try {
216
- const { domain, user } = context.state
217
- const statusFilter = params.filters.some(e => e.name === 'status')
218
- const bizplaceFilter = params.filters.find(param => param.name === 'bizplaceId')
219
-
220
- if (!statusFilter) {
221
- params.filters.push({
222
- name: 'status',
223
- operator: 'notin',
224
- value: [ORDER_STATUS.PENDING, ORDER_STATUS.EDITING],
225
- relation: false
226
- })
227
- }
228
-
229
- if (!bizplaceFilter) {
230
- params.filters.push({
231
- name: 'bizplaceId',
232
- operator: 'in',
233
- value: await getPermittedBizplaceIds(domain, user),
234
- relation: false
235
- })
236
- }
237
-
238
- const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
239
- if (fromDateParamIdx >= 0) {
240
- let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
241
- params.filters.splice(fromDateParamIdx, 1)
242
-
243
- params.filters.push({
244
- name: 'createdAt',
245
- operator: 'gte',
246
- value: fromDateVal.toISOString(),
247
- relation: false
248
- })
249
- }
250
-
251
- const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
252
- if (toDateParamIdx >= 0) {
253
- let toDateVal = new Date(params.filters[toDateParamIdx].value)
254
- params.filters.splice(toDateParamIdx, 1)
255
-
256
- params.filters.push({
257
- name: 'createdAt',
258
- operator: 'lt',
259
- value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
260
- relation: false
261
- })
262
- }
263
-
264
- const qb: SelectQueryBuilder<ArrivalNotice> = getRepository(ArrivalNotice).createQueryBuilder('an')
265
- buildQuery(qb, params, context)
266
- qb.addSelect('COALESCE("cc".rank, 9999)', 'rank')
267
- qb.leftJoinAndSelect('an.domain', 'domain')
268
- qb.leftJoinAndSelect('an.bizplace', 'bizplace')
269
- qb.leftJoinAndSelect('an.releaseGood', 'ro')
270
- qb.leftJoinAndSelect('an.creator', 'creator')
271
- qb.leftJoinAndSelect('an.updater', 'updater')
272
- qb.leftJoinAndSelect('an.acceptedBy', 'accepter')
273
- qb.leftJoin(
274
- subQuery => {
275
- return subQuery
276
- .select(`ccd.rank`, 'rank')
277
- .addSelect(`ccd.name`, 'status')
278
- .from(`common_code_details`, 'ccd')
279
- .innerJoin(`ccd.commonCode`, 'cc')
280
- .where(`ccd.domain_id = :domainId`, { domainId: domain.id })
281
- .andWhere(`cc.name = 'ORDER_STATUS'`)
282
- },
283
- 'cc',
284
- 'cc.status = an.status'
285
- )
286
-
287
- const arrChildSortData = ['bizplace']
288
- const sort: OrderByCondition = (params.sortings || []).reduce(
289
- (acc, sort) => ({
290
- ...acc,
291
- [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'an.' + sort.name]: sort.desc
292
- ? 'DESC'
293
- : 'ASC'
294
- }),
295
- !params.sortings.some(e => e.name === 'status') ? { rank: 'ASC' } : {}
296
- )
297
-
298
- qb.orderBy(sort)
299
-
300
- const [items, total] = await qb.getManyAndCount()
301
-
302
- return { items, total }
303
- } catch (error) {
304
- throw error
305
- }
306
- }
307
-
308
- @Directive('@transaction')
309
- @Query(returns => [RawArrivalNotice])
310
- async validateBulkArrivalNotices(
311
- @Ctx() context: ResolverContext,
312
- @Arg('rawArrivalNotices', type => [NewArrivalNotice], { nullable: true }) rawArrivalNotices: NewArrivalNotice[],
313
- @Arg('bizplaceId', type => String) bizplaceId: string
314
- ): Promise<RawArrivalNotice[]> {
315
- const tx: EntityManager = context.state.tx
316
- return await validateBulkArrivalNoticesFunction(rawArrivalNotices, bizplaceId, tx)
317
- }
318
-
319
- @FieldResolver(type => Domain)
320
- async domain(@Root() arrivalNotice: ArrivalNotice): Promise<Domain> {
321
- return await getRepository(Domain).findOneBy({ id: arrivalNotice.domainId })
322
- }
323
-
324
- @FieldResolver(type => User)
325
- async creator(@Root() arrivalNotice: ArrivalNotice): Promise<User> {
326
- return await getRepository(User).findOneBy({ id: arrivalNotice.creatorId })
327
- }
328
-
329
- @FieldResolver(type => User)
330
- async updater(@Root() arrivalNotice: ArrivalNotice): Promise<User> {
331
- return await getRepository(User).findOneBy({ id: arrivalNotice.updaterId })
332
- }
333
- }
334
-
335
- export async function validateBulkArrivalNoticesFunction(
336
- rawArrivalNotices: NewArrivalNotice[],
337
- bizplaceId: string,
338
- trxMgr: EntityManager
339
- ): Promise<RawArrivalNotice[]> {
340
- const companyBizplace: Bizplace = await getCompanyBizplace(null, null, bizplaceId)
341
-
342
- const json_oi = JSON.stringify(
343
- rawArrivalNotices.map(raw => {
344
- return {
345
- ref_no: raw.refNo || null,
346
- ref_no_2: raw.refNo2 || null,
347
- ref_no_3: raw.refNo3 || null,
348
- eta_date: raw.etaDate || null,
349
- truck_no: raw.truckNo || null,
350
- own_transport: !!raw.truckNo || false,
351
- loose_item: raw.looseItem || false,
352
- import_cargo: raw.importCargo || false,
353
- container: (!!raw.containerNo && !!raw.containerSize) || false,
354
- container_no: raw.containerNo || null,
355
- container_size: raw.containerSize || null,
356
- sku: raw.sku || null,
357
- batch_id: raw.batchId || null,
358
- batch_id_ref: raw.batchIdRef || null,
359
- packing_type: raw.packingType || null,
360
- packing_size: raw.packingSize || null,
361
- uom: raw.uom || null,
362
- pack_qty: raw.packQty || null,
363
- pallet_qty: raw.palletQty || null,
364
- unit_price: raw.unitPrice || null,
365
- manufacture_date: raw.manufactureDate || null
366
- }
367
- })
368
- )
369
-
370
- await trxMgr.query(
371
- `
372
- CREATE TEMP TABLE raw_arrival_notices(
373
- ref_no VARCHAR(150),
374
- ref_no_2 VARCHAR(150),
375
- ref_no_3 VARCHAR(150),
376
- eta_date VARCHAR(24),
377
- truck_no VARCHAR(10),
378
- own_transport BOOLEAN,
379
- container BOOLEAN,
380
- container_no VARCHAR(50),
381
- container_size VARCHAR(24),
382
- import_cargo BOOLEAN,
383
- loose_item BOOLEAN,
384
- sku VARCHAR(150),
385
- batch_id VARCHAR(100),
386
- batch_id_ref VARCHAR(100),
387
- packing_type VARCHAR(50),
388
- packing_size INT,
389
- uom VARCHAR(10),
390
- pack_qty INT,
391
- pallet_qty INT,
392
- unit_price FLOAT8,
393
- manufacture_date DATE
394
- );
395
- `
396
- )
397
-
398
- await trxMgr.query(
399
- `
400
- CREATE TEMP TABLE temp_gan AS (
401
- SELECT an.name, an.ref_no, an.ref_no_2, an.ref_no_3, an.eta_date, an.truck_no, an.own_transport, an.container, an.container_no, an.container_size, an.import_cargo, an.loose_item
402
- FROM arrival_notices an
403
- WHERE EXISTS (
404
- SELECT raw.* FROM
405
- JSON_POPULATE_RECORDSET(NULL:: arrival_notices, $1) raw
406
- WHERE raw.ref_no = an.ref_no
407
- AND raw.ref_no_2 = an.ref_no_2
408
- AND raw.ref_no_3 = an.ref_no_3
409
- AND raw.eta_date::date = an.eta_date::date
410
- AND raw.truck_no = an.truck_no
411
- AND raw.own_transport = an.own_transport
412
- AND raw.container = an.container
413
- AND raw.container_no = an.container_no
414
- AND raw.container_size = an.container_size
415
- AND raw.loose_item = an.loose_item
416
- AND raw.import_cargo = an.import_cargo
417
- )
418
- )
419
- `,
420
- [json_oi]
421
- )
422
-
423
- await trxMgr.query(
424
- `
425
- INSERT INTO raw_arrival_notices
426
- SELECT
427
- js.ref_no, js.ref_no_2, js.ref_no_3, js.eta_date, js.truck_no, js.own_transport, js.container,
428
- js.container_no, js.container_size, js.import_cargo, js.loose_item, js.sku, js.batch_id,
429
- js.batch_id_ref, js.packing_type, js.packing_size, js.uom, js.pack_qty, js.pallet_qty,
430
- js.unit_price, js.manufacture_date
431
- FROM
432
- JSON_POPULATE_RECORDSET(NULL:: raw_arrival_notices, $1) js;
433
- `,
434
- [json_oi]
435
- )
436
-
437
- const insertResult: any[] = await trxMgr.query(`
438
- SELECT * from raw_arrival_notices
439
- `)
440
-
441
- let validatedItems = await trxMgr.query(
442
- `
443
- WITH foo AS (
444
- SELECT
445
- an.name AS gan_name,
446
- an.ref_no AS gan_ref_no,
447
- raw.ref_no,
448
- raw.ref_no_2,
449
- raw.ref_no_3,
450
- raw.eta_date,
451
- raw.truck_no,
452
- raw.own_transport,
453
- raw.container,
454
- raw.container_no,
455
- raw.container_size,
456
- raw.import_cargo,
457
- raw.loose_item,
458
- pr.id AS product_id,
459
- pd.id AS product_detail_id,
460
- raw.sku AS sku,
461
- CASE WHEN pr.description NOT IN (NULL, '', '-') THEN CONCAT(pr.name, '(', pr.description, ')') ELSE pr.name END AS product_info,
462
- raw.batch_id,
463
- raw.batch_id_ref,
464
- pd.packing_type,
465
- pd.packing_size,
466
- sum(raw.pack_qty) AS pack_qty,
467
- sum(pd.uom_value) AS uom_value,
468
- pd.uom,
469
- sum(raw.pallet_qty) AS pallet_qty,
470
- raw.unit_price,
471
- raw.manufacture_date
472
- FROM
473
- raw_arrival_notices raw
474
- LEFT JOIN temp_gan an ON raw.ref_no = an.ref_no
475
- AND raw.ref_no_2 = an.ref_no_2
476
- AND raw.ref_no_3 = an.ref_no_3
477
- AND raw.eta_date::date = an.eta_date::date
478
- AND raw.truck_no = an.truck_no
479
- AND raw.own_transport = an.own_transport
480
- AND raw.container = an.container
481
- AND raw.container_no = an.container_no
482
- AND raw.container_size = an.container_size
483
- AND raw.loose_item = an.loose_item
484
- AND raw.import_cargo = an.import_cargo
485
- LEFT JOIN products pr ON LOWER(pr.sku) = LOWER(raw.sku)
486
- LEFT JOIN product_details pd ON pr.id = pd.product_id
487
- AND CASE WHEN raw.packing_type NOTNULL AND raw.packing_size NOTNULL AND raw.uom NOTNULL
488
- THEN pd.packing_type = raw.packing_type AND pd.packing_size = raw.packing_size AND pd.uom = raw.uom
489
- WHEN raw.packing_type NOTNULL AND raw.packing_size NOTNULL AND raw.uom ISNULL
490
- THEN pd.packing_type = raw.packing_type AND pd.packing_size = raw.packing_size AND pd.is_default IS TRUE
491
- WHEN raw.packing_type ISNULL AND raw.packing_size ISNULL AND raw.uom NOTNULL
492
- THEN pd.uom = raw.uom AND pd.is_default IS TRUE ELSE pd.is_default IS TRUE
493
- END
494
- WHERE pr.bizplace_id = $1
495
- GROUP BY raw.ref_no, raw.ref_no_2, raw.ref_no_3, raw.eta_date, raw.truck_no, raw.own_transport, raw.container, raw.container_no, raw.container_size, raw.import_cargo, raw.loose_item,
496
- pr.id, pd.id, raw.sku, pr.name, pr.description, raw.batch_id, raw.batch_id_ref, raw.packing_type, raw.packing_size, raw.uom, raw.unit_price, raw.manufacture_date, an.ref_no, an.name
497
- ) SELECT foo.*,
498
- CONCAT(COALESCE(ROUND(foo.uom_value:: numeric, 2), 0) * COALESCE(foo.pack_qty, 0), ' ', foo.uom) AS total_uom_value,
499
- CASE WHEN foo.gan_ref_no NOTNULL THEN concat('order duplicated with ', foo.gan_name)
500
- WHEN foo.manufacture_date > current_date THEN 'invalid manufacture date'
501
- WHEN foo.product_id ISNULL OR foo.product_detail_id ISNULL OR foo.sku ISNULL THEN 'product not found'
502
- WHEN foo.pack_qty ISNULL OR foo.pack_qty <= 0 THEN 'invalid pack qty'
503
- WHEN foo.batch_id ISNULL THEN 'batch no. is required'
504
- WHEN foo.ref_no ISNULL OR foo.ref_no = '' THEN 'ref no. is required'
505
- WHEN foo.eta_date ISNULL THEN 'eta date is required'
506
- WHEN foo.container_no NOTNULL AND foo.container_size ISNULL OR foo.container_no ISNULL AND foo.container_size NOTNULL THEN 'incomplete container information'
507
- WHEN foo.unit_price < 0 THEN 'invalid unit price'
508
- WHEN foo.pallet_qty < 0 THEN 'invalid pallet qty'
509
- ELSE '' END AS error_msg
510
- FROM foo
511
- ORDER BY foo.ref_no, foo.ref_no_2, foo.ref_no_3, foo.sku
512
- `,
513
- [companyBizplace.id]
514
- )
515
-
516
- await trxMgr.query('DROP TABLE raw_arrival_notices, temp_gan')
517
-
518
- return validatedItems.map(item => {
519
- return {
520
- refNo: item.ref_no,
521
- refNo2: item.ref_no_2,
522
- refNo3: item.ref_no_3,
523
- etaDate: item.eta_date,
524
- truckNo: item.truck_no,
525
- ownTransport: !!item.own_transport,
526
- container: item.container,
527
- containerNo: item.container_no,
528
- containerSize: item.container_size,
529
- importCargo: !!item.import_cargo,
530
- looseItem: !!item.loose_item,
531
- productId: item.product_id,
532
- productDetailId: item.product_detail_id,
533
- sku: item.sku,
534
- productInfo: item.product_info,
535
- batchId: item.batch_id,
536
- batchIdRef: item.batch_id_ref,
537
- packingType: item.packing_type,
538
- packingSize: item.packing_size,
539
- uom: item.uom,
540
- packQty: item.pack_qty,
541
- uomValue: item.uom_value,
542
- totalUomValue: item.total_uom_value,
543
- palletQty: item.pallet_qty,
544
- unitPrice: item.unit_price,
545
- manufactureDate: item.manufacture_date,
546
- errorMsg: item.error_msg
547
- }
548
- })
549
- }