@things-factory/sales-base 8.0.0-beta.9 → 8.0.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 (178) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +13 -13
  3. package/server/constants/attachment-type.ts +9 -0
  4. package/server/constants/index.ts +7 -0
  5. package/server/constants/load-type.ts +4 -0
  6. package/server/constants/order.ts +203 -0
  7. package/server/constants/product-group-type.ts +4 -0
  8. package/server/constants/release-good.ts +9 -0
  9. package/server/constants/transfer-order-type.ts +6 -0
  10. package/server/constants/validation-error-code.ts +3 -0
  11. package/server/constants/vas-target-type.ts +25 -0
  12. package/server/controllers/ecommerce/ecommerce-controller.ts +122 -0
  13. package/server/controllers/ecommerce/index.ts +2 -0
  14. package/server/controllers/ecommerce/sellercraft-controller.ts +182 -0
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/order-controller.ts +296 -0
  17. package/server/errors/index.ts +1 -0
  18. package/server/errors/validation-error.ts +25 -0
  19. package/server/index.ts +5 -0
  20. package/server/migrations/index.ts +9 -0
  21. package/server/service/arrival-notice/arrival-notice-mutation.ts +1152 -0
  22. package/server/service/arrival-notice/arrival-notice-query.ts +549 -0
  23. package/server/service/arrival-notice/arrival-notice-types.ts +310 -0
  24. package/server/service/arrival-notice/arrival-notice.ts +202 -0
  25. package/server/service/arrival-notice/index.ts +9 -0
  26. package/server/service/claim/claim-mutation.ts +308 -0
  27. package/server/service/claim/claim-query.ts +122 -0
  28. package/server/service/claim/claim-types.ts +130 -0
  29. package/server/service/claim/claim.ts +140 -0
  30. package/server/service/claim/index.ts +9 -0
  31. package/server/service/claim-detail/claim-detail-mutation.ts +102 -0
  32. package/server/service/claim-detail/claim-detail-query.ts +55 -0
  33. package/server/service/claim-detail/claim-detail-types.ts +47 -0
  34. package/server/service/claim-detail/claim-detail.ts +69 -0
  35. package/server/service/claim-detail/index.ts +9 -0
  36. package/server/service/claim-order/claim-order-mutation.ts +101 -0
  37. package/server/service/claim-order/claim-order-query.ts +47 -0
  38. package/server/service/claim-order/claim-order-types.ts +35 -0
  39. package/server/service/claim-order/claim-order.ts +81 -0
  40. package/server/service/claim-order/index.ts +9 -0
  41. package/server/service/collection-order/collection-order-mutation.ts +245 -0
  42. package/server/service/collection-order/collection-order-query.ts +97 -0
  43. package/server/service/collection-order/collection-order-types.ts +165 -0
  44. package/server/service/collection-order/collection-order.ts +135 -0
  45. package/server/service/collection-order/index.ts +9 -0
  46. package/server/service/delivery-order/delivery-order-mutation.ts +967 -0
  47. package/server/service/delivery-order/delivery-order-query.ts +631 -0
  48. package/server/service/delivery-order/delivery-order-types.ts +268 -0
  49. package/server/service/delivery-order/delivery-order.ts +258 -0
  50. package/server/service/delivery-order/index.ts +9 -0
  51. package/server/service/draft-release-good/draft-release-good-mutation.ts +765 -0
  52. package/server/service/draft-release-good/draft-release-good-query.ts +354 -0
  53. package/server/service/draft-release-good/draft-release-good-type.ts +261 -0
  54. package/server/service/draft-release-good/draft-release-good.ts +284 -0
  55. package/server/service/draft-release-good/index.ts +9 -0
  56. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +129 -0
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +280 -0
  58. package/server/service/goods-receival-note/goods-receival-note-types.ts +105 -0
  59. package/server/service/goods-receival-note/goods-receival-note.ts +127 -0
  60. package/server/service/goods-receival-note/index.ts +9 -0
  61. package/server/service/index.ts +238 -0
  62. package/server/service/inventory-check/index.ts +9 -0
  63. package/server/service/inventory-check/inventory-check-mutation.ts +149 -0
  64. package/server/service/inventory-check/inventory-check-query.ts +48 -0
  65. package/server/service/inventory-check/inventory-check-types.ts +48 -0
  66. package/server/service/inventory-check/inventory-check.ts +90 -0
  67. package/server/service/invoice/index.ts +9 -0
  68. package/server/service/invoice/invoice-mutation.ts +95 -0
  69. package/server/service/invoice/invoice-query.ts +53 -0
  70. package/server/service/invoice/invoice-types.ts +279 -0
  71. package/server/service/invoice/invoice.ts +230 -0
  72. package/server/service/invoice-product/index.ts +9 -0
  73. package/server/service/invoice-product/invoice-product-mutation.ts +54 -0
  74. package/server/service/invoice-product/invoice-product-query.ts +54 -0
  75. package/server/service/invoice-product/invoice-product-types.ts +84 -0
  76. package/server/service/invoice-product/invoice-product.ts +92 -0
  77. package/server/service/job-sheet/index.ts +9 -0
  78. package/server/service/job-sheet/job-sheet-mutation.ts +92 -0
  79. package/server/service/job-sheet/job-sheet-query.ts +112 -0
  80. package/server/service/job-sheet/job-sheet-types.ts +78 -0
  81. package/server/service/job-sheet/job-sheet.ts +102 -0
  82. package/server/service/manifest/index.ts +6 -0
  83. package/server/service/manifest/manifest-mutation.ts +190 -0
  84. package/server/service/manifest/manifest-query.ts +149 -0
  85. package/server/service/manifest/manifest-type.ts +84 -0
  86. package/server/service/manifest/manifest.ts +114 -0
  87. package/server/service/order-inventory/index.ts +9 -0
  88. package/server/service/order-inventory/order-inventory-mutation.ts +54 -0
  89. package/server/service/order-inventory/order-inventory-query.ts +722 -0
  90. package/server/service/order-inventory/order-inventory-types.ts +238 -0
  91. package/server/service/order-inventory/order-inventory.ts +401 -0
  92. package/server/service/order-product/index.ts +9 -0
  93. package/server/service/order-product/order-product-mutation.ts +48 -0
  94. package/server/service/order-product/order-product-query.ts +89 -0
  95. package/server/service/order-product/order-product-types.ts +335 -0
  96. package/server/service/order-product/order-product.ts +362 -0
  97. package/server/service/order-tote/index.ts +9 -0
  98. package/server/service/order-tote/order-tote-mutation.ts +31 -0
  99. package/server/service/order-tote/order-tote-query.ts +112 -0
  100. package/server/service/order-tote/order-tote-types.ts +47 -0
  101. package/server/service/order-tote/order-tote.ts +73 -0
  102. package/server/service/order-tote-item/index.ts +9 -0
  103. package/server/service/order-tote-item/order-tote-item-mutation.ts +31 -0
  104. package/server/service/order-tote-item/order-tote-item-query.ts +82 -0
  105. package/server/service/order-tote-item/order-tote-item-types.ts +56 -0
  106. package/server/service/order-tote-item/order-tote-item.ts +72 -0
  107. package/server/service/order-tote-seal/index.ts +9 -0
  108. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +31 -0
  109. package/server/service/order-tote-seal/order-tote-seal-query.ts +59 -0
  110. package/server/service/order-tote-seal/order-tote-seal-types.ts +41 -0
  111. package/server/service/order-tote-seal/order-tote-seal.ts +46 -0
  112. package/server/service/order-vas/index.ts +9 -0
  113. package/server/service/order-vas/order-vas-mutation.ts +20 -0
  114. package/server/service/order-vas/order-vas-query.ts +72 -0
  115. package/server/service/order-vas/order-vas-types.ts +159 -0
  116. package/server/service/order-vas/order-vas.ts +207 -0
  117. package/server/service/others/index.ts +5 -0
  118. package/server/service/others/other-query.ts +563 -0
  119. package/server/service/others/other-types.ts +115 -0
  120. package/server/service/purchase-order/index.ts +9 -0
  121. package/server/service/purchase-order/purchase-order-mutation.ts +458 -0
  122. package/server/service/purchase-order/purchase-order-query.ts +90 -0
  123. package/server/service/purchase-order/purchase-order-types.ts +154 -0
  124. package/server/service/purchase-order/purchase-order.ts +172 -0
  125. package/server/service/purchase-order-other-charge/index.ts +9 -0
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +31 -0
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +52 -0
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +44 -0
  129. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +68 -0
  130. package/server/service/release-good/index.ts +9 -0
  131. package/server/service/release-good/release-good-mutation.ts +1686 -0
  132. package/server/service/release-good/release-good-query.ts +980 -0
  133. package/server/service/release-good/release-good-types.ts +662 -0
  134. package/server/service/release-good/release-good.ts +490 -0
  135. package/server/service/retail-replenishment-order/index.ts +9 -0
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +382 -0
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +54 -0
  138. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +101 -0
  139. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +115 -0
  140. package/server/service/return-order/index.ts +9 -0
  141. package/server/service/return-order/return-order-mutation.ts +516 -0
  142. package/server/service/return-order/return-order-query.ts +226 -0
  143. package/server/service/return-order/return-order-types.ts +196 -0
  144. package/server/service/return-order/return-order.ts +127 -0
  145. package/server/service/reverse-kitting-order/index.ts +9 -0
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +500 -0
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +197 -0
  148. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +173 -0
  149. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +121 -0
  150. package/server/service/reverse-kitting-order-inventory/index.ts +9 -0
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +129 -0
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +52 -0
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +95 -0
  154. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +143 -0
  155. package/server/service/shipping-order/index.ts +9 -0
  156. package/server/service/shipping-order/shipping-order-mutation.ts +61 -0
  157. package/server/service/shipping-order/shipping-order-query.ts +61 -0
  158. package/server/service/shipping-order/shipping-order-types.ts +89 -0
  159. package/server/service/shipping-order/shipping-order.ts +129 -0
  160. package/server/service/transfer-order/index.ts +9 -0
  161. package/server/service/transfer-order/transfer-order-mutation.ts +309 -0
  162. package/server/service/transfer-order/transfer-order-query.ts +66 -0
  163. package/server/service/transfer-order/transfer-order-types.ts +97 -0
  164. package/server/service/transfer-order/transfer-order.ts +117 -0
  165. package/server/service/vas/index.ts +9 -0
  166. package/server/service/vas/vas-mutation.ts +106 -0
  167. package/server/service/vas/vas-query.ts +60 -0
  168. package/server/service/vas/vas-types.ts +71 -0
  169. package/server/service/vas/vas.ts +77 -0
  170. package/server/service/vas-order/index.ts +9 -0
  171. package/server/service/vas-order/vas-order-mutation.ts +259 -0
  172. package/server/service/vas-order/vas-order-query.ts +119 -0
  173. package/server/service/vas-order/vas-order-types.ts +49 -0
  174. package/server/service/vas-order/vas-order.ts +81 -0
  175. package/server/utils/datetime-util.ts +54 -0
  176. package/server/utils/index.ts +3 -0
  177. package/server/utils/inventory-util.ts +1155 -0
  178. package/server/utils/order-no-generator.ts +146 -0
@@ -0,0 +1,631 @@
1
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+ import { EntityManager, In, Not, OrderByCondition, Repository } from 'typeorm'
3
+
4
+ import { Attachment } from '@things-factory/attachment-base'
5
+ import { User } from '@things-factory/auth-base'
6
+ import { getPermittedBizplaceIds } from '@things-factory/biz-base'
7
+ import { Product } from '@things-factory/product-base'
8
+ import {
9
+ buildQuery,
10
+ convertListParams,
11
+ Domain,
12
+ Filter,
13
+ getRepository,
14
+ ListParam,
15
+ Pagination,
16
+ Sorting
17
+ } from '@things-factory/shell'
18
+ import { Inventory } from '@things-factory/warehouse-base'
19
+
20
+ import { ORDER_STATUS } from '../../constants'
21
+ import { OrderInventory } from '../order-inventory/order-inventory'
22
+ import { OrderInventoryList } from '../order-inventory/order-inventory-types'
23
+ import { ReleaseGood } from '../release-good/release-good'
24
+ import { DeliveryOrder } from './delivery-order'
25
+ import { DeliveryOrderList } from './delivery-order-types'
26
+
27
+ const debug = require('debug')('things-factory:sales-base:delivery-orders')
28
+
29
+ @Resolver(DeliveryOrder)
30
+ export class DeliveryOrderQuery {
31
+ @Query(returns => DeliveryOrderList)
32
+ async deliveryOrders(
33
+ @Ctx() context: ResolverContext,
34
+ @Args(type => ListParam) params: ListParam
35
+ ): Promise<DeliveryOrderList> {
36
+ try {
37
+ const { domain, user, tx } = context.state
38
+
39
+ const bizplaceFilter = params.filters.find(param => param.name === 'bizplaceId')
40
+ if (!bizplaceFilter) {
41
+ params.filters.push({
42
+ name: 'bizplaceId',
43
+ operator: 'in',
44
+ value: await getPermittedBizplaceIds(domain, user),
45
+ relation: false
46
+ })
47
+ }
48
+
49
+ const releaseGoodParam = params.filters.find(param => param.name === 'releaseGoodNo')
50
+ if (releaseGoodParam) {
51
+ let arrFilters = []
52
+ params.filters.splice(
53
+ params.filters.findIndex(item => item.name == 'releaseGoodNo'),
54
+ 1
55
+ )
56
+ arrFilters.push({ ...releaseGoodParam, name: 'name' })
57
+
58
+ const foundReleaseGoods: ReleaseGood[] = await getRepository(ReleaseGood).find({
59
+ ...convertListParams(
60
+ { filters: arrFilters },
61
+ {
62
+ searchables: ['name', 'releaseGoodNo', 'truckNo']
63
+ }
64
+ )
65
+ })
66
+
67
+ if (foundReleaseGoods && foundReleaseGoods.length) {
68
+ params.filters.push({
69
+ name: 'releaseGoodId',
70
+ operator: 'in',
71
+ value: foundReleaseGoods.map((releaseGood: ReleaseGood) => releaseGood.id),
72
+ relation: false
73
+ })
74
+ }
75
+ }
76
+
77
+ const tzOffsetIdx = params.filters.findIndex(param => param.name === 'tzoffset')
78
+ let tzOffset = 0
79
+ if (tzOffsetIdx >= 0) {
80
+ tzOffset = params.filters[tzOffsetIdx].value
81
+ params.filters.splice(tzOffsetIdx, 1)
82
+ }
83
+
84
+ const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
85
+ if (fromDateParamIdx >= 0) {
86
+ let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
87
+ params.filters.splice(fromDateParamIdx, 1)
88
+
89
+ params.filters.push({
90
+ name: 'createdAt',
91
+ operator: 'gte',
92
+ value: fromDateVal.toISOString(),
93
+ relation: false
94
+ })
95
+ }
96
+ const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
97
+ if (toDateParamIdx >= 0) {
98
+ let toDateVal = new Date(params.filters[toDateParamIdx].value)
99
+ params.filters.splice(toDateParamIdx, 1)
100
+
101
+ params.filters.push({
102
+ name: 'createdAt',
103
+ operator: 'lt',
104
+ value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
105
+ relation: false
106
+ })
107
+ }
108
+
109
+ let refNoFilter = params.filters.find(x => x.name == 'refNo')
110
+ let refNo2Filter = params.filters.find(x => x.name == 'refNo2')
111
+ let refNo3Filter = params.filters.find(x => x.name == 'refNo3')
112
+ let orderProductsApiFilter = params.filters.find(x => x.name == 'orderProductsApi')
113
+
114
+ params.filters = params.filters.filter(
115
+ x => x.name != 'refNo' && x.name != 'refNo2' && x.name != 'refNo3' && x.name != 'orderProductsApi'
116
+ )
117
+
118
+ const qb: any = getRepository(DeliveryOrder).createQueryBuilder('do')
119
+ buildQuery(qb, params, context)
120
+ qb.addSelect('COALESCE("cc".rank, 99999)', 'rank')
121
+ qb.leftJoinAndSelect('do.bizplace', 'bizplace')
122
+ qb.leftJoinAndSelect('do.releaseGood', 'releaseGood')
123
+ qb.leftJoinAndSelect('do.transportDriver', 'td')
124
+ qb.leftJoinAndSelect('do.transportVehicle', 'th')
125
+ qb.leftJoin(
126
+ subQuery => {
127
+ return subQuery
128
+ .select(`ccd.rank`, 'rank')
129
+ .addSelect(`ccd.name`, 'status')
130
+ .from(`common_code_details`, 'ccd')
131
+ .innerJoin(`ccd.commonCode`, 'cc')
132
+ .where(`ccd.domain_id = :domainId`, { domainId: domain.id })
133
+ .andWhere(`cc.name = 'DELIVERY_STATUS'`)
134
+ },
135
+ 'cc',
136
+ 'cc.status = do.status'
137
+ )
138
+
139
+ // was add specifically for API usage, do we really need
140
+ // orderProducts over orderInventories? else we should remove this
141
+ if (orderProductsApiFilter?.value) {
142
+ qb.innerJoinAndSelect('releaseGood.orderProducts', 'orderProducts')
143
+ }
144
+
145
+ if (refNoFilter?.value) {
146
+ qb.andWhere('releaseGood.ref_no ilike :refNo', { refNo: refNoFilter.value })
147
+ }
148
+ if (refNo2Filter?.value) {
149
+ qb.andWhere('releaseGood.ref_no_2 ilike :refNo2', { refNo2: refNo2Filter.value })
150
+ }
151
+ if (refNo3Filter?.value) {
152
+ qb.andWhere('releaseGood.ref_no_3 ilike :refNo3', { refNo3: refNo3Filter.value })
153
+ }
154
+
155
+ const arrChildSortData = ['refNo', 'refNo2', 'refNo3']
156
+ const arrNameSortData = ['bizplace', 'releaseGood', 'updater']
157
+ const sort: OrderByCondition = (params.sortings || []).reduce(
158
+ (acc, sort) => ({
159
+ ...acc,
160
+ [arrChildSortData.indexOf(sort.name) >= 0
161
+ ? 'releaseGood.' + sort.name
162
+ : arrNameSortData.indexOf(sort.name) >= 0
163
+ ? sort.name + '.name'
164
+ : 'do.' + sort.name]: sort.desc ? 'DESC' : 'ASC'
165
+ }),
166
+ params.sortings.length < 1 ? { rank: 'ASC', 'do.createdAt': 'DESC' } : {}
167
+ )
168
+
169
+ qb.orderBy(sort)
170
+
171
+ let [items, total] = await qb.getManyAndCount()
172
+ if (orderProductsApiFilter?.value) {
173
+ items = await Promise.all(
174
+ items.map(async itm => {
175
+ const qb: any = getRepository(OrderInventory).createQueryBuilder('OrderInventory')
176
+
177
+ let orderInventories: any[] = await qb
178
+ .leftJoinAndSelect('OrderInventory.product', 'Product')
179
+ .leftJoinAndSelect('OrderInventory.orderToteItems', 'OrderToteItems')
180
+ .leftJoinAndSelect('OrderToteItems.orderTote', 'OrderTote')
181
+ .leftJoinAndSelect('OrderTote.orderToteSeals', 'OrderToteSeals')
182
+ .where('OrderInventory.delivery_order_id = :deliveryOrderId', { deliveryOrderId: itm.id })
183
+ .andWhere('OrderInventory.domain_id = :domainId', { domainId: domain.id })
184
+ .getMany()
185
+
186
+ return {
187
+ ...itm,
188
+ orderInventories
189
+ }
190
+ })
191
+ )
192
+ }
193
+
194
+ return { items, total }
195
+ } catch (error) {
196
+ debug('deliveryOrders', error.toString())
197
+ throw error
198
+ }
199
+ }
200
+
201
+ @Query(returns => DeliveryOrder)
202
+ async deliveryOrder(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DeliveryOrder> {
203
+ const { domain } = context.state
204
+
205
+ const foundDO = await getRepository(DeliveryOrder).findOne({
206
+ where: {
207
+ domain: { id: domain.id },
208
+ name
209
+ },
210
+ relations: ['domain', 'bizplace', 'transportDriver', 'transportVehicle', 'releaseGood', 'creator', 'updater']
211
+ })
212
+
213
+ let foundAttachments = []
214
+ if (foundDO) {
215
+ foundAttachments = await getRepository(Attachment).find({
216
+ where: {
217
+ domain: { id: domain.id },
218
+ refBy: foundDO.id
219
+ }
220
+ })
221
+ }
222
+
223
+ return { ...foundDO, attachments: foundAttachments }
224
+ }
225
+
226
+ @Query(returns => DeliveryOrderList)
227
+ async deliveryOrderRequests(
228
+ @Ctx() context: ResolverContext,
229
+ @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],
230
+ @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
231
+ @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
232
+ ): Promise<DeliveryOrderList> {
233
+ const { domain, user } = context.state
234
+
235
+ const convertedParams = convertListParams({ filters, pagination, sortings })
236
+
237
+ if (!convertedParams.where || !convertedParams.where.status) {
238
+ convertedParams.where.status = Not(In([ORDER_STATUS.PENDING, ORDER_STATUS.EDITING]))
239
+ }
240
+
241
+ ;(convertedParams as any).bizplace = In(await getPermittedBizplaceIds(domain, user))
242
+
243
+ const [items, total] = await getRepository(DeliveryOrder).findAndCount({
244
+ ...convertedParams,
245
+ relations: ['domain', 'bizplace', 'releaseGood', 'transportDriver', 'transportVehicle', 'creator', 'updater']
246
+ })
247
+
248
+ return { items, total }
249
+ }
250
+
251
+ @Query(returns => DeliveryOrderList)
252
+ async deliveryOrderByReleaseGood(
253
+ @Arg('releaseGoodNo') releaseGoodNo: string,
254
+ @Ctx() context: ResolverContext
255
+ ): Promise<DeliveryOrderList> {
256
+ const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
257
+ where: { name: releaseGoodNo }
258
+ })
259
+
260
+ return await deliveryOrderByReleaseGood(releaseGood)
261
+ }
262
+
263
+ @Query(returns => OrderInventoryList)
264
+ async deliveryOrderItems(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<OrderInventoryList> {
265
+ const { domain } = context.state
266
+ const deliveryOrder: DeliveryOrder = await getRepository(DeliveryOrder).findOne({
267
+ where: { domain: { id: domain.id }, name }
268
+ })
269
+
270
+ let [items, total] = await getRepository(OrderInventory).findAndCount({
271
+ where: { domain: { id: domain.id }, deliveryOrder: { id: deliveryOrder.id } },
272
+ relations: ['inventory', 'inventory.product', 'inventory.reusablePallet']
273
+ })
274
+
275
+ items = items
276
+ .map((oi: OrderInventory) => {
277
+ const inventory: Inventory = oi.inventory
278
+ const product: Product = inventory.product
279
+ return {
280
+ inventory: inventory,
281
+ productName: `${product.name} (${product.description})`,
282
+ packingType: inventory.packingType,
283
+ batchId: inventory.batchId,
284
+ releaseQty: oi.releaseQty,
285
+ releaseUomValue: oi.releaseUomValue,
286
+ remark: oi.remark,
287
+ crossDocking: oi.crossDocking,
288
+ pallet: inventory?.reusablePallet && inventory?.reusablePallet?.name ? inventory.reusablePallet.name : ''
289
+ }
290
+ })
291
+ .reduce((newItem, item) => {
292
+ var foundItem = newItem.find(
293
+ newItem =>
294
+ newItem.productName === item.productName &&
295
+ newItem.batchId === item.batchId &&
296
+ newItem.crossDocking === item.crossDocking &&
297
+ newItem.pallet === item.pallet
298
+ )
299
+ if (!foundItem) {
300
+ foundItem = {
301
+ inventory: item.inventory,
302
+ productName: item.productName,
303
+ packingType: item.packingType,
304
+ batchId: item.batchId,
305
+ releaseQty: item.releaseQty,
306
+ releaseUomValue: item.releaseUomValue,
307
+ palletQty: 1,
308
+ remark: item.remark,
309
+ crossDocking: item.crossDocking,
310
+ pallet: item.pallet
311
+ }
312
+
313
+ newItem.push(foundItem)
314
+ return newItem
315
+ } else {
316
+ return newItem.map(ni => {
317
+ if (
318
+ ni.productName === item.productName &&
319
+ ni.batchId === item.batchId &&
320
+ ni.crossDocking === item.crossDocking &&
321
+ ni.pallet === item.pallet
322
+ ) {
323
+ return {
324
+ ...ni,
325
+ palletQty: ni.palletQty + 1,
326
+ releaseQty: ni.releaseQty + item.releaseQty,
327
+ releaseUomValue: ni.releaseUomValue + item.releaseUomValue
328
+ }
329
+ } else {
330
+ return ni
331
+ }
332
+ })
333
+ }
334
+ }, [])
335
+
336
+ items = items.map((prod: any) => {
337
+ return {
338
+ ...prod,
339
+ systemRemark: prod?.remark
340
+ ? prod.remark
341
+ : prod.crossDocking
342
+ ? prod.pallet === ''
343
+ ? `${prod.palletQty} PALLET(S) [C/D]`
344
+ : `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
345
+ : prod.pallet === ''
346
+ ? `${prod.palletQty} PALLET(S)`
347
+ : `${prod.palletQty} PALLET(S) (${prod.pallet})`
348
+ }
349
+ })
350
+
351
+ return { items, total }
352
+ }
353
+
354
+ @Query(returns => OrderInventoryList)
355
+ async manualDeliveryOrderItems(
356
+ @Arg('name') name: string,
357
+ @Ctx() context: ResolverContext
358
+ ): Promise<OrderInventoryList> {
359
+ const { domain } = context.state
360
+ const deliveryOrder: DeliveryOrder = await getRepository(DeliveryOrder).findOne({
361
+ where: { domain: { id: domain.id }, name }
362
+ })
363
+
364
+ let [items, total] = await getRepository(OrderInventory).findAndCount({
365
+ where: { domain: { id: domain.id }, deliveryOrder: { id: deliveryOrder.id } },
366
+ relations: ['product']
367
+ })
368
+
369
+ items = items
370
+ .map((oi: OrderInventory) => {
371
+ const product: Product = oi.product
372
+ return {
373
+ inventory: oi.inventory,
374
+ productId: product.id,
375
+ productName: `${product.name} (${product.description})`,
376
+ packingType: oi.packingType,
377
+ batchId: oi.batchId,
378
+ releaseQty: oi.releaseQty,
379
+ releaseUomValue: oi.releaseUomValue,
380
+ remark: oi.remark,
381
+ crossDocking: oi.crossDocking,
382
+ pallet: ''
383
+ }
384
+ })
385
+ .reduce((newItem, item) => {
386
+ var foundItem = newItem.find(
387
+ newItem =>
388
+ newItem.productName === item.productName &&
389
+ newItem.batchId === item.batchId &&
390
+ newItem.crossDocking === item.crossDocking &&
391
+ newItem.pallet === item.pallet
392
+ )
393
+ if (!foundItem) {
394
+ foundItem = {
395
+ inventory: item.inventory,
396
+ productId: item.productId,
397
+ productName: item.productName,
398
+ packingType: item.packingType,
399
+ batchId: item.batchId,
400
+ releaseQty: item.releaseQty,
401
+ releaseUomValue: item.releaseUomValue,
402
+ palletQty: 1,
403
+ remark: item.remark,
404
+ crossDocking: item.crossDocking,
405
+ pallet: item.pallet
406
+ }
407
+
408
+ newItem.push(foundItem)
409
+ return newItem
410
+ } else {
411
+ return newItem.map(ni => {
412
+ if (
413
+ ni.productName === item.productName &&
414
+ ni.batchId === item.batchId &&
415
+ ni.crossDocking === item.crossDocking &&
416
+ ni.pallet === item.pallet
417
+ ) {
418
+ return {
419
+ ...ni,
420
+ palletQty: ni.palletQty + 1,
421
+ releaseQty: ni.releaseQty + item.releaseQty,
422
+ releaseUomValue: ni.releaseUomValue + item.releaseUomValue
423
+ }
424
+ } else {
425
+ return ni
426
+ }
427
+ })
428
+ }
429
+ }, [])
430
+
431
+ items = items.map((prod: any) => {
432
+ return {
433
+ ...prod,
434
+ systemRemark: prod?.remark
435
+ ? prod.remark
436
+ : prod.crossDocking
437
+ ? prod.pallet === ''
438
+ ? `${prod.palletQty} PALLET(S) [C/D]`
439
+ : `${prod.palletQty} PALLET(S) (${prod.pallet}) [C/D]`
440
+ : prod.pallet === ''
441
+ ? `${prod.palletQty} PALLET(S)`
442
+ : `${prod.palletQty} PALLET(S) (${prod.pallet})`
443
+ }
444
+ })
445
+
446
+ return { items, total }
447
+ }
448
+
449
+ @Query(returns => DeliveryOrderList)
450
+ async deliveryOrderReport(
451
+ @Ctx() context: ResolverContext,
452
+ @Args(type => ListParam) params: ListParam
453
+ ): Promise<DeliveryOrderList> {
454
+ try {
455
+ const { domain, user } = context.state
456
+
457
+ const bizplaceFilter = params.filters.find(param => param.name === 'bizplaceId')
458
+ if (!bizplaceFilter) {
459
+ params.filters.push({
460
+ name: 'bizplaceId',
461
+ operator: 'in',
462
+ value: await getPermittedBizplaceIds(domain, user),
463
+ relation: false
464
+ })
465
+ }
466
+
467
+ const releaseGoodParam = params.filters.find(param => param.name === 'releaseGoodNo')
468
+ if (releaseGoodParam) {
469
+ let arrFilters = []
470
+ params.filters.splice(
471
+ params.filters.findIndex(item => item.name == 'releaseGoodNo'),
472
+ 1
473
+ )
474
+ arrFilters.push({ ...releaseGoodParam, name: 'name' })
475
+
476
+ const foundReleaseGoods: ReleaseGood[] = await getRepository(ReleaseGood).find({
477
+ ...convertListParams({ filters: arrFilters })
478
+ })
479
+
480
+ if (foundReleaseGoods && foundReleaseGoods.length) {
481
+ params.filters.push({
482
+ name: 'releaseGoodId',
483
+ operator: 'in',
484
+ value: foundReleaseGoods.map((releaseGood: ReleaseGood) => releaseGood.id),
485
+ relation: false
486
+ })
487
+ }
488
+ }
489
+
490
+ const tzOffsetIdx = params.filters.findIndex(param => param.name === 'tzoffset')
491
+ let tzOffset = 0
492
+ if (tzOffsetIdx >= 0) {
493
+ tzOffset = params.filters[tzOffsetIdx].value
494
+ params.filters.splice(tzOffsetIdx, 1)
495
+ }
496
+
497
+ const fromDateParamIdx = params.filters.findIndex(param => param.name === 'fromDate')
498
+ if (fromDateParamIdx >= 0) {
499
+ let fromDateVal = new Date(params.filters[fromDateParamIdx].value)
500
+ params.filters.splice(fromDateParamIdx, 1)
501
+
502
+ params.filters.push({
503
+ name: 'createdAt',
504
+ operator: 'gte',
505
+ value: fromDateVal.toISOString(),
506
+ relation: false
507
+ })
508
+ }
509
+ const toDateParamIdx = params.filters.findIndex(param => param.name === 'toDate')
510
+ if (toDateParamIdx >= 0) {
511
+ let toDateVal = new Date(params.filters[toDateParamIdx].value)
512
+ params.filters.splice(toDateParamIdx, 1)
513
+
514
+ params.filters.push({
515
+ name: 'createdAt',
516
+ operator: 'lt',
517
+ value: new Date(toDateVal.setDate(toDateVal.getDate() + 1)).toISOString(),
518
+ relation: false
519
+ })
520
+ }
521
+
522
+ let refNoFilter = params.filters.find(x => x.name == 'refNo')
523
+ let refNo2Filter = params.filters.find(x => x.name == 'refNo2')
524
+ let refNo3Filter = params.filters.find(x => x.name == 'refNo3')
525
+
526
+ params.filters = params.filters.filter(x => x.name != 'refNo' && x.name != 'refNo2' && x.name != 'refNo3')
527
+
528
+ const qb: any = getRepository(DeliveryOrder).createQueryBuilder('do')
529
+ buildQuery(qb, params, context)
530
+ qb.addSelect('COALESCE("cc".rank, 99999)', 'rank')
531
+ qb.leftJoinAndSelect('do.domain', 'domain')
532
+ qb.leftJoinAndSelect('do.bizplace', 'bizplace')
533
+ qb.leftJoinAndSelect('do.releaseGood', 'releaseGood')
534
+ qb.leftJoinAndSelect('do.transportDriver', 'td')
535
+ qb.leftJoinAndSelect('do.transportVehicle', 'th')
536
+ qb.leftJoinAndSelect('do.orderInventories', 'oi')
537
+ qb.leftJoinAndSelect('oi.inventory', 'inv')
538
+ qb.leftJoinAndSelect('inv.product', 'prd')
539
+ qb.leftJoinAndSelect('do.creator', 'creator')
540
+ qb.leftJoinAndSelect('do.updater', 'updater')
541
+ qb.leftJoin(
542
+ subQuery => {
543
+ return subQuery
544
+ .select(`ccd.rank`, 'rank')
545
+ .addSelect(`ccd.name`, 'status')
546
+ .from(`common_code_details`, 'ccd')
547
+ .innerJoin(`ccd.commonCode`, 'cc')
548
+ .where(`ccd.domain_id = :domainId`, { domainId: domain.id })
549
+ .andWhere(`cc.name = 'DELIVERY_STATUS'`)
550
+ },
551
+ 'cc',
552
+ 'cc.status = do.status'
553
+ )
554
+
555
+ if (refNoFilter?.value) {
556
+ qb.andWhere('releaseGood.ref_no ilike :refNo', { refNo: refNoFilter.value })
557
+ }
558
+ if (refNo2Filter?.value) {
559
+ qb.andWhere('releaseGood.ref_no_2 ilike :refNo2', { refNo2: refNo2Filter.value })
560
+ }
561
+ if (refNo3Filter?.value) {
562
+ qb.andWhere('releaseGood.ref_no_3 ilike :refNo3', { refNo3: refNo3Filter.value })
563
+ }
564
+
565
+ const arrChildSortData = ['refNo', 'refNo2', 'refNo3']
566
+ const arrNameSortData = ['bizplace', 'releaseGood', 'updater']
567
+ const sort: OrderByCondition = (params.sortings || []).reduce(
568
+ (acc, sort) => ({
569
+ ...acc,
570
+ [arrChildSortData.indexOf(sort.name) >= 0
571
+ ? 'releaseGood.' + sort.name
572
+ : arrNameSortData.indexOf(sort.name) >= 0
573
+ ? sort.name + '.name'
574
+ : 'do.' + sort.name]: sort.desc ? 'DESC' : 'ASC'
575
+ }),
576
+ params.sortings.length < 1 ? { rank: 'ASC', 'do.createdAt': 'DESC' } : {}
577
+ )
578
+
579
+ qb.orderBy(sort)
580
+
581
+ const [items, total] = await qb.getManyAndCount()
582
+ return { items, total }
583
+ } catch (error) {
584
+ debug('deliveryOrders', error.toString())
585
+ throw error
586
+ }
587
+ }
588
+
589
+ @FieldResolver(type => Domain)
590
+ async domain(@Root() deliveryOrder: DeliveryOrder): Promise<Domain> {
591
+ return await getRepository(Domain).findOneBy({ id: deliveryOrder.domainId })
592
+ }
593
+
594
+ @FieldResolver(type => User)
595
+ async creator(@Root() deliveryOrder: DeliveryOrder): Promise<User> {
596
+ return await getRepository(User).findOneBy({ id: deliveryOrder.creatorId })
597
+ }
598
+
599
+ @FieldResolver(type => User)
600
+ async updater(@Root() deliveryOrder: DeliveryOrder): Promise<User> {
601
+ return await getRepository(User).findOneBy({ id: deliveryOrder.updaterId })
602
+ }
603
+ }
604
+
605
+ export async function deliveryOrderByReleaseGood(releaseGood: ReleaseGood, trxMgr?: EntityManager): Promise<any> {
606
+ const doRepo: Repository<DeliveryOrder> = trxMgr?.getRepository(DeliveryOrder) || getRepository(DeliveryOrder)
607
+ const oiRepo: Repository<OrderInventory> = trxMgr?.getRepository(OrderInventory) || getRepository(OrderInventory)
608
+
609
+ let [items, total] = await doRepo.findAndCount({
610
+ where: { releaseGood: { id: releaseGood.id } },
611
+ relations: ['domain', 'bizplace', 'releaseGood', 'transportDriver', 'transportVehicle', 'creator', 'updater']
612
+ })
613
+
614
+ items = await Promise.all(
615
+ items.map(async (deliveryOrder: DeliveryOrder) => {
616
+ return {
617
+ ...deliveryOrder,
618
+ truck: deliveryOrder?.truckNo || deliveryOrder.transportVehicle?.name || null,
619
+ targetInventories: await oiRepo.find({
620
+ where: { deliveryOrder: { id: deliveryOrder.id } },
621
+ relations: ['domain', 'bizplace', 'releaseGood', 'inventory']
622
+ })
623
+ }
624
+ })
625
+ )
626
+
627
+ return {
628
+ items,
629
+ total
630
+ }
631
+ }