@things-factory/worksheet-base 5.0.0-alpha.4 → 5.0.0-alpha.40

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 (160) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +9 -3
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
  6. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +2 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  10. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  12. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  14. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  16. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  18. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/render-fm-grn.js +229 -0
  20. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  21. package/dist-server/controllers/render-grn.js +45 -21
  22. package/dist-server/controllers/render-grn.js.map +1 -1
  23. package/dist-server/controllers/render-invoices.js +103 -65
  24. package/dist-server/controllers/render-invoices.js.map +1 -1
  25. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  26. package/dist-server/controllers/render-orientage-grn.js +1 -0
  27. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  28. package/dist-server/controllers/render-po.js +147 -0
  29. package/dist-server/controllers/render-po.js.map +1 -0
  30. package/dist-server/controllers/render-ro-do.js +65 -1
  31. package/dist-server/controllers/render-ro-do.js.map +1 -1
  32. package/dist-server/controllers/worksheet-controller.js +15 -0
  33. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +10 -3
  35. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  37. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  39. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  41. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +26 -2
  43. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  45. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  47. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  49. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  53. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  55. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +6 -19
  57. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  59. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
  61. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  65. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  67. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  69. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  71. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  73. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  75. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  76. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  77. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  78. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  80. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  81. package/dist-server/graphql/resolvers/worksheet/worksheets.js +18 -0
  82. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  83. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  84. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  85. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  86. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  87. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  88. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  89. package/dist-server/graphql/types/worksheet/index.js +33 -6
  90. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  91. package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
  92. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  93. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  94. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  95. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  96. package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
  97. package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
  98. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  99. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  100. package/dist-server/index.js +5 -0
  101. package/dist-server/index.js.map +1 -1
  102. package/dist-server/routes.js +12 -0
  103. package/dist-server/routes.js.map +1 -1
  104. package/dist-server/utils/inventory-util.js +14 -25
  105. package/dist-server/utils/inventory-util.js.map +1 -1
  106. package/package.json +17 -17
  107. package/server/constants/template.ts +1 -0
  108. package/server/controllers/ecommerce/sellercraft-controller.ts +10 -3
  109. package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
  110. package/server/controllers/index.ts +3 -0
  111. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  112. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  113. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  114. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  115. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  116. package/server/controllers/render-fm-grn.ts +266 -0
  117. package/server/controllers/render-grn.ts +57 -23
  118. package/server/controllers/render-invoices.ts +119 -72
  119. package/server/controllers/render-orientage-do.ts +11 -11
  120. package/server/controllers/render-orientage-grn.ts +12 -11
  121. package/server/controllers/render-po.ts +170 -0
  122. package/server/controllers/render-ro-do.ts +93 -8
  123. package/server/controllers/worksheet-controller.ts +18 -2
  124. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +13 -4
  125. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  126. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  127. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  128. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +41 -8
  129. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  130. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  131. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  132. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  133. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  134. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  135. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +5 -20
  136. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  137. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
  138. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  139. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  140. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  141. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  142. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  143. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  144. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  145. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  146. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  147. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  148. package/server/graphql/resolvers/worksheet/worksheets.ts +26 -0
  149. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  150. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  151. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  152. package/server/graphql/types/worksheet/index.ts +33 -6
  153. package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
  154. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  155. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  156. package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
  157. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  158. package/server/index.ts +5 -0
  159. package/server/routes.ts +17 -0
  160. package/server/utils/inventory-util.ts +15 -23
@@ -11,6 +11,7 @@ import {
11
11
  import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, ReleaseGood } from '@things-factory/sales-base'
12
12
  import { Domain } from '@things-factory/shell'
13
13
  import { Inventory, Location } from '@things-factory/warehouse-base'
14
+ import { ProductDetail } from '@things-factory/product-base'
14
15
 
15
16
  import { WORKSHEET_TYPE } from '../../../constants'
16
17
  import { SellercraftController } from '../../../controllers'
@@ -19,165 +20,186 @@ import { fetchExecutingWorksheet } from '../../../utils'
19
20
 
20
21
  export const packingWorksheetResolver = {
21
22
  async packingWorksheet(_: any, { releaseGoodNo }, context: any) {
22
- const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
23
- let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
24
- where: {
25
- domain,
26
- name: releaseGoodNo
27
- },
28
- relations: ['bizplace', 'bizplace.domain']
29
- })
30
-
31
- // Find Release Order based on Bin
32
- if (!releaseGood) {
33
- const binLocation: Location = await tx.getRepository(Location).findOne({
34
- where: { domain, name: releaseGoodNo }
23
+ try {
24
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
25
+ let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
26
+ where: {
27
+ domain,
28
+ name: releaseGoodNo
29
+ },
30
+ relations: ['bizplace', 'bizplace.domain']
35
31
  })
36
32
 
37
- const qb: SelectQueryBuilder<OrderInventory> = tx
38
- .getRepository(OrderInventory)
39
- .createQueryBuilder('orderInventory')
40
- qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
41
- .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
42
- .innerJoinAndSelect('bizplace.domain', 'domain')
43
- .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
44
- .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
45
- orderInventoryStatus: [ORDER_INVENTORY_STATUS.PACKING, ORDER_INVENTORY_STATUS.PACKED]
33
+ // Find Release Order based on Bin
34
+ if (!releaseGood) {
35
+ const binLocation: Location = await tx.getRepository(Location).findOne({
36
+ where: { domain, name: releaseGoodNo }
46
37
  })
47
- .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
48
- .andWhere('releaseGood.status = :status', { status: ORDER_STATUS.PACKING })
49
-
50
- const orderInventoryByBin = await qb.getOne()
51
- if (orderInventoryByBin?.releaseGood) {
52
- releaseGoodNo = orderInventoryByBin.releaseGood.name
53
- releaseGood = orderInventoryByBin.releaseGood
54
- }
55
- }
56
38
 
57
- if (!releaseGood) throw new Error(`Release good dosen't exist.`)
58
-
59
- const worksheet: Worksheet = await fetchExecutingWorksheet(
60
- domain,
61
- releaseGood.bizplace,
62
- [
63
- 'bizplace',
64
- 'bizplace.domain',
65
- 'releaseGood',
66
- 'releaseGood.domain',
67
- 'worksheetDetails',
68
- 'worksheetDetails.targetInventory',
69
- 'worksheetDetails.targetInventory.binLocation',
70
- 'worksheetDetails.targetInventory.inventory',
71
- 'worksheetDetails.targetInventory.inventory.location',
72
- 'worksheetDetails.targetInventory.inventory.product',
73
- 'worksheetDetails.toLocation'
74
- ],
75
- WORKSHEET_TYPE.PACKING,
76
- releaseGood
77
- )
78
-
79
- let marketplaceOrder: MarketplaceOrder
80
- let marketplaceOrderItems: MarketplaceOrderItem[] = []
81
- let marketplaceStore
82
- let trackingNo: string
83
- let shippingProvider: string
84
- let marketplaceStatus: string
85
-
86
- if (releaseGood.type === 'b2c') {
87
- const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
88
- domain: worksheet.bizplace.domain,
89
- status: SellercraftStatus.ACTIVE
90
- })
91
-
92
- if (sellercraft) {
93
- if (!releaseGood?.airwayBill) {
94
- const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
95
- releaseGood = await sellercraftCtrl.fetchOrderDocument(sellercraft, releaseGood)
39
+ if (binLocation) {
40
+ const qb: SelectQueryBuilder<OrderInventory> = tx
41
+ .getRepository(OrderInventory)
42
+ .createQueryBuilder('orderInventory')
43
+
44
+ qb.innerJoinAndSelect('orderInventory.releaseGood', 'releaseGood')
45
+ .innerJoinAndSelect('releaseGood.bizplace', 'bizplace')
46
+ .innerJoinAndSelect('bizplace.domain', 'domain')
47
+ .innerJoinAndSelect(
48
+ 'worksheets',
49
+ 'ws',
50
+ `orderInventory.release_good_id = ws.release_good_id AND ws.type = 'PACKING' AND ws.status = 'EXECUTING'`
51
+ )
52
+ .where('orderInventory.domain_id = :domainId', { domainId: domain.id })
53
+ .andWhere('orderInventory.status IN (:...orderInventoryStatus)', {
54
+ orderInventoryStatus: [
55
+ ORDER_INVENTORY_STATUS.READY_TO_PACK,
56
+ ORDER_INVENTORY_STATUS.PACKING,
57
+ ORDER_INVENTORY_STATUS.PACKED
58
+ ]
59
+ })
60
+ .andWhere('orderInventory.bin_location_id = :locationId', { locationId: binLocation.id })
61
+ .andWhere('releaseGood.status IN (:...status)', {
62
+ status: [ORDER_STATUS.READY_TO_PACK, ORDER_STATUS.PACKING]
63
+ })
64
+
65
+ const orderInventoryByBin = await qb.getOne()
66
+ if (orderInventoryByBin?.releaseGood) {
67
+ releaseGoodNo = orderInventoryByBin.releaseGood.name
68
+ releaseGood = orderInventoryByBin.releaseGood
69
+ } else {
70
+ throw new Error(`Bin do not have any existing order.`)
71
+ }
96
72
  }
97
- trackingNo = releaseGood?.trackingNo
98
- shippingProvider = releaseGood?.transporter
99
- marketplaceStatus = releaseGood?.marketplaceOrderStatus
100
73
  }
101
74
 
102
- if (!sellercraft) {
103
- marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
104
- where: { orderNo: releaseGood.refNo },
105
- relations: [
106
- 'domain',
107
- 'marketplaceStore',
108
- 'marketplaceOrderItems',
109
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
110
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
111
- ]
112
- })
75
+ if (!releaseGood) throw new Error(`Release good do not exist.`)
113
76
 
114
- if (!marketplaceOrder) {
115
- throw new Error('Failed to retrieve ecommerce information, kindly contact our support team for this issue.')
116
- }
77
+ const worksheet: Worksheet = await fetchExecutingWorksheet(
78
+ domain,
79
+ releaseGood.bizplace,
80
+ [
81
+ 'bizplace',
82
+ 'bizplace.domain',
83
+ 'releaseGood',
84
+ 'releaseGood.domain',
85
+ 'worksheetDetails',
86
+ 'worksheetDetails.targetInventory',
87
+ 'worksheetDetails.targetInventory.binLocation',
88
+ 'worksheetDetails.targetInventory.inventory',
89
+ 'worksheetDetails.targetInventory.inventory.location',
90
+ 'worksheetDetails.targetInventory.inventory.product',
91
+ 'worksheetDetails.targetInventory.inventory.product.productDetails',
92
+ 'worksheetDetails.toLocation'
93
+ ],
94
+ WORKSHEET_TYPE.PACKING,
95
+ releaseGood
96
+ )
97
+
98
+ let marketplaceOrder: MarketplaceOrder
99
+ let marketplaceOrderItems: MarketplaceOrderItem[] = []
100
+ let marketplaceStore
101
+ let trackingNo: string
102
+ let shippingProvider: string
103
+ let marketplaceStatus: string
104
+
105
+ if (releaseGood.type === 'b2c') {
106
+ const sellercraft: Sellercraft = await tx.getRepository(Sellercraft).findOne({
107
+ domain: worksheet.bizplace.domain,
108
+ status: SellercraftStatus.ACTIVE
109
+ })
117
110
 
118
- let marketplaceOrderShipping: MarketplaceOrderShipping
119
- if (marketplaceOrder.isSplitted) {
120
- marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
121
- where: { subOrderNoRef: worksheet.releaseGood.refNo2 }
122
- })
111
+ if (sellercraft) {
112
+ if (!releaseGood?.airwayBill) {
113
+ const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
114
+ releaseGood = await sellercraftCtrl.fetchOrderDocument(sellercraft, releaseGood)
115
+ }
116
+ trackingNo = releaseGood?.trackingNo
117
+ shippingProvider = releaseGood?.transporter
118
+ marketplaceStatus = releaseGood?.marketplaceOrderStatus
123
119
  } else {
124
- marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
125
- where: { orderNoRef: worksheet.releaseGood.refNo }
120
+ marketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
121
+ where: { orderNo: releaseGood.refNo },
122
+ relations: [
123
+ 'domain',
124
+ 'marketplaceStore',
125
+ 'marketplaceOrderItems',
126
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
127
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
128
+ ]
126
129
  })
127
- }
128
130
 
129
- trackingNo = marketplaceOrderShipping.ownTrackingNo
130
- ? marketplaceOrderShipping.ownTrackingNo
131
- : marketplaceOrderShipping.trackingNo
132
- shippingProvider = marketplaceOrderShipping.ownTransporter
133
- ? marketplaceOrderShipping.ownTransporter
134
- : marketplaceOrderShipping.transporter
135
-
136
- marketplaceStore = marketplaceOrder?.marketplaceStore
137
- marketplaceStatus = marketplaceOrder?.status
131
+ if (!marketplaceOrder) {
132
+ throw new Error('Failed to retrieve ecommerce information, kindly contact our support team for this issue.')
133
+ }
134
+
135
+ let marketplaceOrderShipping: MarketplaceOrderShipping
136
+ if (marketplaceOrder.isSplitted) {
137
+ marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
138
+ where: { subOrderNoRef: worksheet.releaseGood.refNo2 }
139
+ })
140
+ } else {
141
+ marketplaceOrderShipping = await tx.getRepository(MarketplaceOrderShipping).findOne({
142
+ where: { orderNoRef: worksheet.releaseGood.refNo }
143
+ })
144
+ }
145
+
146
+ trackingNo = marketplaceOrderShipping.ownTrackingNo
147
+ ? marketplaceOrderShipping.ownTrackingNo
148
+ : marketplaceOrderShipping.trackingNo
149
+ shippingProvider = marketplaceOrderShipping.ownTransporter
150
+ ? marketplaceOrderShipping.ownTransporter
151
+ : marketplaceOrderShipping.transporter
152
+
153
+ marketplaceStore = marketplaceOrder?.marketplaceStore
154
+ marketplaceStatus = marketplaceOrder?.status
155
+ }
138
156
  }
139
- }
140
157
 
141
- return {
142
- worksheetInfo: {
143
- releaseGood,
144
- bizplaceName: releaseGood.bizplace.name,
145
- refNo: releaseGood.refNo,
146
- refNo2: releaseGood.refNo2,
147
- refNo3: releaseGood.refNo3,
148
- partnerDomainId: releaseGood.bizplace?.domain.id,
149
- startedAt: worksheet.startedAt,
150
- shippingProvider: shippingProvider ? shippingProvider : '',
151
- trackingNo: trackingNo ? trackingNo : '',
152
- airwayBill: releaseGood?.airwayBill,
153
- invoice: releaseGood?.invoice,
154
- platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
155
- marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
156
- marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
157
- marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
158
- },
159
- worksheetDetailInfos: worksheet.worksheetDetails.map(async (packingWSD: WorksheetDetail) => {
160
- const targetInventory: OrderInventory = packingWSD.targetInventory
161
- const inventory: Inventory = targetInventory.inventory
162
- return {
163
- name: packingWSD.name,
164
- palletId: inventory.palletId,
165
- cartonId: inventory.cartonId,
166
- batchId: inventory.batchId,
167
- batchIdRef: inventory.batchIdRef,
168
- product: inventory.product,
169
- sku: inventory.product.sku,
170
- releaseQty: targetInventory.releaseQty,
171
- packedQty: targetInventory.packedQty,
172
- status: packingWSD.status,
173
- description: packingWSD.description,
174
- targetName: targetInventory.name,
175
- packingType: inventory.packingType,
176
- packingSize: inventory.packingSize,
177
- binLocation: targetInventory?.binLocation,
178
- location: inventory.location
179
- }
180
- })
158
+ return {
159
+ worksheetInfo: {
160
+ releaseGood,
161
+ bizplaceName: releaseGood.bizplace.name,
162
+ refNo: releaseGood.refNo,
163
+ refNo2: releaseGood.refNo2,
164
+ refNo3: releaseGood.refNo3,
165
+ partnerDomainId: releaseGood.bizplace?.domain.id,
166
+ startedAt: worksheet.startedAt,
167
+ shippingProvider: shippingProvider ? shippingProvider : '',
168
+ trackingNo: trackingNo ? trackingNo : '',
169
+ airwayBill: releaseGood?.airwayBill,
170
+ invoice: releaseGood?.invoice,
171
+ platform: marketplaceOrder ? marketplaceOrder.marketplaceStore.platform : 'operato',
172
+ marketplaceStoreId: marketplaceOrder ? marketplaceOrder.marketplaceStore.id : '',
173
+ marketplaceStatus: marketplaceStatus ? marketplaceStatus : '',
174
+ marketplaceOrder: marketplaceOrder ? marketplaceOrder : ''
175
+ },
176
+ worksheetDetailInfos: worksheet.worksheetDetails.map(async (packingWSD: WorksheetDetail) => {
177
+ const targetInventory: OrderInventory = packingWSD.targetInventory
178
+ const inventory: Inventory = targetInventory.inventory
179
+ return {
180
+ name: packingWSD.name,
181
+ palletId: inventory.palletId,
182
+ cartonId: inventory.cartonId,
183
+ batchId: inventory.batchId,
184
+ batchIdRef: inventory.batchIdRef,
185
+ product: inventory.product,
186
+ sku: inventory.product.sku,
187
+ releaseQty: targetInventory.releaseQty,
188
+ packedQty: targetInventory.packedQty,
189
+ status: packingWSD.status,
190
+ description: packingWSD.description,
191
+ targetName: targetInventory.name,
192
+ packingType: inventory.packingType,
193
+ packingSize: inventory.packingSize,
194
+ binLocation: targetInventory?.binLocation,
195
+ location: inventory.location,
196
+ relatedOrderInv: targetInventory
197
+ }
198
+ })
199
+ }
200
+ } catch (error) {
201
+ console.error(error)
202
+ throw error
181
203
  }
182
204
  }
183
205
  }
@@ -7,7 +7,7 @@ import { Worksheet } from '../../../../entities'
7
7
  export const assignPickingWorkerResolver = {
8
8
  async assignPickingWorker(
9
9
  _parentObj: void,
10
- { worksheetId, userId }: { worksheetId: string; userId: string },
10
+ { worksheetId, userId }: { worksheetId: [string]; userId: string },
11
11
  context: any
12
12
  ): Promise<void> {
13
13
  const { tx, domain }: { tx: EntityManager; domain: Domain } = context.state
@@ -17,16 +17,20 @@ export const assignPickingWorkerResolver = {
17
17
 
18
18
  if (!assignee) throw new Error('failed to find target user')
19
19
 
20
- const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
21
- id: worksheetId,
22
- type: WORKSHEET_TYPE.PICKING
23
- })
20
+ await Promise.all(worksheetId.map(async (worksheetId)=>{
21
+ const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
22
+ id: worksheetId,
23
+ },{where: [{
24
+ type:WORKSHEET_TYPE.BATCH_PICKING
25
+ },{type:WORKSHEET_TYPE.PICKING}]})
26
+
27
+ if (!worksheet) throw new Error('failed to find target picking worksheet')
28
+ if (worksheet.status !== WORKSHEET_STATUS.DEACTIVATED)
29
+ throw new Error(`current status of worksheet is not able to assign worker`)
30
+
31
+ worksheet.assignee = assignee
32
+ await tx.getRepository(Worksheet).save(worksheet)
24
33
 
25
- if (!worksheet) throw new Error('failed to find target picking worksheet')
26
- if (worksheet.status !== WORKSHEET_STATUS.DEACTIVATED)
27
- throw new Error(`current status of worksheet is not able to assign worker`)
28
-
29
- worksheet.assignee = assignee
30
- await tx.getRepository(Worksheet).save(worksheet)
34
+ }))
31
35
  }
32
36
  }
@@ -5,7 +5,6 @@ import { Bizplace, ContactPoint, getMyBizplace } from '@things-factory/biz-base'
5
5
  import { LastMileAPI, LastMileDelivery } from '@things-factory/integration-lmd'
6
6
  import { MarketplaceStore, MarketplaceTransporter } from '@things-factory/integration-marketplace'
7
7
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
8
- import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
9
8
  import {
10
9
  MarketplaceOrder,
11
10
  MarketplaceOrderItem,
@@ -206,30 +205,16 @@ export async function completePicking(
206
205
  }
207
206
  }
208
207
  } else {
209
- throw resp
210
- //Failed
208
+ if (resp?.AWBurl && resp?.TrackingNo)
209
+ await tx
210
+ .getRepository(MarketplaceOrderShipping)
211
+ .update({ id: marketplaceOrderShipping.id }, { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo })
212
+ else throw resp
211
213
  }
212
214
  }
213
215
  }
214
216
  }
215
217
 
216
- const customerDomain: Domain = releaseGood.bizplace.domain
217
- let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
218
- where: { domain: customerDomain }
219
- })
220
- if (customerAvailableSftp) {
221
- const orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({
222
- where: { releaseGood },
223
- relations: ['product']
224
- })
225
- let result: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
226
- releaseGood,
227
- orderInventories,
228
- sftp: customerAvailableSftp
229
- })
230
- customerAvailableSftp = await tx.getRepository(Sftp).save(result)
231
- }
232
-
233
218
  if (releaseGood.packingOption) {
234
219
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
235
220
 
@@ -10,6 +10,7 @@ import { pickingResolver } from './picking'
10
10
  import { scanProductPickingResolver } from './scan-product-picking'
11
11
  import { scanProductBatchPickingResolver } from './scan-product-batch-picking'
12
12
  import { undoPickingAssigmentResolver } from './undo-picking-assignment'
13
+ import { undoSerialNumberPickingResolver } from './undo-serial-number-picking'
13
14
 
14
15
  export const Mutations = {
15
16
  ...assignPickingInventoriesResolver,
@@ -23,5 +24,6 @@ export const Mutations = {
23
24
  ...completePickingResolver,
24
25
  ...completeBatchPickingResolver,
25
26
  ...assignPickingWorkerResolver,
26
- ...fetchAndAssignPickingTaskResolver
27
+ ...fetchAndAssignPickingTaskResolver,
28
+ ...undoSerialNumberPickingResolver
27
29
  }
@@ -1,81 +1,82 @@
1
- import { getDomainUsers, User } from '@things-factory/auth-base'
2
- import { Bizplace } from '@things-factory/biz-base'
3
- import { Domain } from '@things-factory/shell'
4
- import { FindManyOptions, getRepository, ILike, In } from 'typeorm'
1
+ import { getDomainUsers, User, Role } from '@things-factory/auth-base'
2
+ import { Domain, ListParam, buildQuery, Sorting} from '@things-factory/shell'
3
+ import { FindManyOptions, getRepository, ILike, In, EntityManager, getManager, SelectQueryBuilder } from 'typeorm'
5
4
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
6
5
  import { Worksheet } from '../../../../entities'
7
6
 
8
- type AssignmentStatusByUserType = { user: User; pending?: Worksheet[]; picking?: Worksheet[] }
7
+ type AssignmentStatusByUserType = { user: User; pending?: String; picking?: String }
9
8
 
10
9
  export const pickingAssignmentStatusByUsersResolver = {
11
10
  async pickingAssignmentStatusByUsers(
12
11
  _: void,
13
- { bizplaceId, name, email }: { bizplaceId: string; name?: string; email?: string },
12
+ params: ListParam,
14
13
  context: any
15
14
  ): Promise<AssignmentStatusByUserType[]> {
15
+
16
16
  const { domain }: { domain: Domain } = context.state
17
- const domainUsers: User[] = await getDomainUsers(domain)
18
17
 
19
- const domainUserIds: string[] = domainUsers
20
- .filter((user: User) => user.userType === 'user')
21
- .map((user: User) => user.id)
22
- const findOneOption: FindManyOptions<User> = { where: { id: In(domainUserIds) } }
23
- if (name) findOneOption.where.name = ILike(`%${name}%`)
24
- if (email) findOneOption.where.email = ILike(`%${email}%`)
18
+ const nameFilter = params.filters.find(p=>{return p.name == "name"});
19
+ const emailFilter = params.filters.find(p=>{return p.name == "email"});
20
+ const roleFilter = params.filters.find(p=>{return p.name == 'roles'});
25
21
 
26
- const users: User[] = await getRepository(User).find(findOneOption)
22
+ const pendingSorter = params.sortings.find(p=>{return p.name == 'pending'});
23
+ const pickingSorter = params.sortings.find(p=>{return p.name == 'picking'});
27
24
 
28
- const bizplace: Bizplace = await getRepository(Bizplace).findOne(bizplaceId)
29
- const assignedPickingWorksheets: Worksheet[] = await getRepository(Worksheet).find({
30
- where: {
31
- domain,
32
- bizplace,
33
- type: WORKSHEET_TYPE.PICKING,
34
- status: In([WORKSHEET_STATUS.DEACTIVATED, WORKSHEET_STATUS.EXECUTING]),
35
- assignee: In(users.map((u: User) => u.id))
36
- },
37
- relations: ['assignee']
38
- })
39
25
 
40
- const assignmentMap: Map<string, AssignmentStatusByUserType> = assignedPickingWorksheets.reduce(
41
- (assignmentMap: Map<string, AssignmentStatusByUserType>, worksheet: Worksheet) => {
42
- const assignee: User = worksheet.assignee
43
- const status: string = worksheet.status
44
26
 
45
- if (assignmentMap.has(assignee.id)) {
46
- const assignment: AssignmentStatusByUserType = assignmentMap.get(assignee.id)
47
- if (status === WORKSHEET_STATUS.DEACTIVATED) {
48
- assignment.pending.push(worksheet)
49
- } else if (status === WORKSHEET_STATUS.EXECUTING) {
50
- assignment.picking.push(worksheet)
51
- }
52
- } else {
53
- if (status === WORKSHEET_STATUS.DEACTIVATED) {
54
- assignmentMap.set(assignee.id, {
55
- user: assignee,
56
- pending: [worksheet],
57
- picking: []
58
- })
59
- } else if (status === WORKSHEET_STATUS.EXECUTING) {
60
- assignmentMap.set(assignee.id, {
61
- user: assignee,
62
- pending: [],
63
- picking: [worksheet]
64
- })
65
- }
66
- }
27
+ const getUserInfoQb:SelectQueryBuilder<User> = await getRepository(User).createQueryBuilder('u')
67
28
 
68
- return assignmentMap
69
- },
70
- new Map()
71
- )
29
+ getUserInfoQb.select('u.id')
30
+ getUserInfoQb.addSelect('u.name')
31
+ getUserInfoQb.addSelect('u.email')
32
+ getUserInfoQb.addSelect("string_agg(r.name,', ') as roles")
33
+ getUserInfoQb.innerJoin('u.roles','r')
34
+ getUserInfoQb.where('r.domain_id = :domainId',{domainId:domain.id})
35
+ roleFilter? getUserInfoQb.andWhere('r.name ilike :userRole', { userRole: `%${roleFilter.value}%` }) :""
36
+ nameFilter? getUserInfoQb.andWhere('u.name ilike :userName', { userName: `%${nameFilter.value}%` }) :""
37
+ emailFilter? getUserInfoQb.andWhere('u.email ilike :userEmail', { userEmail: `%${emailFilter.value}%` }) :""
38
+ getUserInfoQb.andWhere('r.name not ilike :userR',{userR:`%CLIENT%`})
39
+ getUserInfoQb.andWhere('u.user_type = :userType',{userType:"user"})
40
+ getUserInfoQb.groupBy('u.id')
41
+ getUserInfoQb.addGroupBy('u.name')
42
+ getUserInfoQb.addGroupBy('u.email')
43
+
44
+ const getAssignedWSQb = await getRepository(Worksheet).createQueryBuilder('ws')
45
+
46
+ getAssignedWSQb.select('ws.assignee_id')
47
+ getAssignedWSQb.addSelect('u.name')
48
+ getAssignedWSQb.addSelect("sum(case when ws.status='EXECUTING' then 1 else 0 end) as picking")
49
+ getAssignedWSQb.addSelect("sum(case when ws.status='DEACTIVATED' then 1 else 0 end) as pending")
50
+ getAssignedWSQb.innerJoin('ws.assignee','u')
51
+ getAssignedWSQb.where('ws.domain_id = :id',{id:domain.id})
52
+ getAssignedWSQb.andWhere('ws.type IN (:...type)', {type: [WORKSHEET_TYPE.PICKING, WORKSHEET_TYPE.BATCH_PICKING]})
53
+ getAssignedWSQb.andWhere('ws.status IN (:...status)', {status: [WORKSHEET_STATUS.DEACTIVATED, WORKSHEET_STATUS.EXECUTING]})
54
+ getAssignedWSQb.groupBy('ws.assignee_id')
55
+ getAssignedWSQb.addGroupBy('u.name')
56
+ pendingSorter?.desc ? getAssignedWSQb.orderBy('pending','DESC') : ''
57
+ pickingSorter?.desc ? getAssignedWSQb.orderBy('picking','DESC') : ''
58
+ pickingSorter && Object.keys(pickingSorter).length == 1 ?getAssignedWSQb.orderBy('picking','ASC') : ''
59
+ pendingSorter && Object.keys(pendingSorter).length == 1 ? getAssignedWSQb.orderBy('pending','ASC') : ''
72
60
 
73
- users.forEach((user: User) => {
74
- if (!assignmentMap.has(user.id)) {
75
- assignmentMap.set(user.id, { user, pending: [], picking: [] })
76
- }
77
- })
78
61
 
79
- return Array.from(assignmentMap.values())
62
+ const parameter1= getUserInfoQb.getParameters()
63
+ const parameter2 = getAssignedWSQb.getParameters()
64
+
65
+ const combineParams = Object.assign(parameter1, parameter2)
66
+
67
+ const combineQb = getManager().createQueryBuilder()
68
+
69
+ combineQb.select('u.*')
70
+ combineQb.addSelect('coalesce(ws.picking, 0) as picking')
71
+ combineQb.addSelect('coalesce(ws.pending, 0) as pending')
72
+ combineQb.from("(" + getUserInfoQb.getQuery() + ")","u")
73
+ combineQb.leftJoin("(" + getAssignedWSQb.getQuery() + ")","ws",' ws.assignee_id = u.u_id')
74
+ combineQb.setParameters(combineParams)
75
+
76
+ const combineInfo = await combineQb.getRawMany()
77
+
78
+ return combineInfo.map(itm => {
79
+ return { user: { id:itm.u_id,email:itm.u_email,name:itm.u_name, description: itm.roles },pending:itm.pending,picking:itm.picking }
80
+ })
80
81
  }
81
82
  }
@@ -0,0 +1,24 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { PickingWorksheetController } from '../../../../controllers'
7
+
8
+ export const undoSerialNumberPickingResolver = {
9
+ async undoSerialNumberPicking(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await undoSerialNumberPicking(tx, domain, user, worksheetDetailName, inventoryItemId)
12
+ }
13
+ }
14
+
15
+ async function undoSerialNumberPicking(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ worksheetDetailName: string,
20
+ inventoryItemId: string
21
+ ): Promise<void> {
22
+ const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
23
+ await worksheetController.undoSerialNumberPicking(worksheetDetailName, inventoryItemId)
24
+ }
@@ -4,9 +4,9 @@ import { EntityManager } from 'typeorm'
4
4
  import { SortingWorksheetController } from '../../../../controllers'
5
5
 
6
6
  export const scanProductSortingResolver = {
7
- async scanProductSorting(_: any, { taskNo, releaseGoodNo, productBarcode }, context: any) {
7
+ async scanProductSorting(_: any, { taskNo, releaseGoodNo, productBarcode, serialNumber }, context: any) {
8
8
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
9
- await scanProductSorting(tx, domain, user, taskNo, releaseGoodNo, productBarcode)
9
+ await scanProductSorting(tx, domain, user, taskNo, releaseGoodNo, productBarcode, serialNumber)
10
10
  }
11
11
  }
12
12
 
@@ -16,8 +16,9 @@ export async function scanProductSorting(
16
16
  user: User,
17
17
  taskNo: string,
18
18
  releaseGoodNo: string,
19
- productBarcode?: string
19
+ productBarcode?: string,
20
+ serialNumber?: string
20
21
  ) {
21
22
  const worksheetController: SortingWorksheetController = new SortingWorksheetController(tx, domain, user)
22
- await worksheetController.scanProductSorting(taskNo, releaseGoodNo, productBarcode)
23
+ await worksheetController.scanProductSorting(taskNo, releaseGoodNo, productBarcode, serialNumber)
23
24
  }