@things-factory/operato-hub 4.3.78 → 4.3.79-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist-server/middlewares/business-middleware.js +4 -1
  2. package/dist-server/middlewares/business-middleware.js.map +1 -1
  3. package/dist-server/middlewares/store-middleware.js.map +1 -1
  4. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js +3 -2
  5. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js.map +1 -1
  6. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js +5 -2
  7. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js.map +1 -1
  8. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +4 -2
  9. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  10. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js +94 -0
  11. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js.map +1 -0
  12. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js +208 -0
  13. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js.map +1 -0
  14. package/dist-server/routers/api/restful-apis/v1/company/add-product.js +65 -0
  15. package/dist-server/routers/api/restful-apis/v1/company/add-product.js.map +1 -0
  16. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js +97 -0
  17. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js.map +1 -0
  18. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js +50 -0
  19. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js.map +1 -0
  20. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js +63 -0
  21. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js.map +1 -0
  22. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js +110 -0
  23. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js.map +1 -0
  24. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js +52 -0
  25. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js.map +1 -0
  26. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js +90 -0
  27. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js.map +1 -0
  28. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js +99 -0
  29. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js.map +1 -0
  30. package/dist-server/routers/api/restful-apis/v1/company/index.js +14 -0
  31. package/dist-server/routers/api/restful-apis/v1/company/index.js.map +1 -0
  32. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js +65 -0
  33. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js.map +1 -0
  34. package/dist-server/routers/api/restful-apis/v1/index.js +2 -31
  35. package/dist-server/routers/api/restful-apis/v1/index.js.map +1 -1
  36. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js +29 -0
  37. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js.map +1 -0
  38. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js +40 -0
  39. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js.map +1 -0
  40. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js +23 -0
  41. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js.map +1 -0
  42. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js +32 -0
  43. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js.map +1 -0
  44. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js +53 -0
  45. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js.map +1 -0
  46. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js +31 -0
  47. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js.map +1 -0
  48. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js +71 -0
  49. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js.map +1 -0
  50. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js +201 -0
  51. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js.map +1 -0
  52. package/dist-server/routers/api/restful-apis/v1/utils/params.js +293 -0
  53. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -0
  54. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js +90 -0
  55. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js.map +1 -0
  56. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js +277 -0
  57. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js.map +1 -0
  58. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +810 -0
  59. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -0
  60. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js +116 -0
  61. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js.map +1 -0
  62. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +140 -0
  63. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -0
  64. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js +100 -0
  65. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js.map +1 -0
  66. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +78 -0
  67. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -0
  68. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js +96 -0
  69. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js.map +1 -0
  70. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js +244 -0
  71. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js.map +1 -0
  72. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js +96 -0
  73. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js.map +1 -0
  74. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +94 -0
  75. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -0
  76. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +112 -0
  77. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -0
  78. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +13 -0
  79. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -0
  80. package/package.json +54 -54
  81. package/server/middlewares/business-middleware.ts +5 -1
  82. package/server/middlewares/store-middleware.ts +1 -0
  83. package/server/routers/api/restful-apis/unstable/add-draft-release-order.ts +3 -2
  84. package/server/routers/api/restful-apis/unstable/add-inbound-order.ts +5 -2
  85. package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -2
  86. package/server/routers/api/restful-apis/v1/company/add-contact-points.ts +94 -0
  87. package/server/routers/api/restful-apis/v1/company/add-marketplace-order.ts +242 -0
  88. package/server/routers/api/restful-apis/v1/company/add-product.ts +78 -0
  89. package/server/routers/api/restful-apis/v1/company/cancel-marketplace-order.ts +102 -0
  90. package/server/routers/api/restful-apis/v1/company/get-bizplace-list.ts +56 -0
  91. package/server/routers/api/restful-apis/v1/company/get-contact-point-list.ts +69 -0
  92. package/server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.ts +118 -0
  93. package/server/routers/api/restful-apis/v1/company/get-marketplace-store-list.ts +58 -0
  94. package/server/routers/api/restful-apis/v1/company/get-partner-list.ts +97 -0
  95. package/server/routers/api/restful-apis/v1/company/get-product-list.ts +105 -0
  96. package/server/routers/api/restful-apis/v1/company/index.ts +11 -0
  97. package/server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.ts +70 -0
  98. package/server/routers/api/restful-apis/v1/index.ts +2 -31
  99. package/server/routers/api/restful-apis/v1/middlewares/business-middleware.ts +31 -0
  100. package/server/routers/api/restful-apis/v1/middlewares/index.ts +26 -0
  101. package/server/routers/api/restful-apis/v1/middlewares/logging-middleware.ts +24 -0
  102. package/server/routers/api/restful-apis/v1/middlewares/store-middleware.ts +34 -0
  103. package/server/routers/api/restful-apis/v1/middlewares/validation-middleware.ts +50 -0
  104. package/server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.ts +31 -0
  105. package/server/routers/api/restful-apis/v1/utils/error-util.ts +70 -0
  106. package/server/routers/api/restful-apis/v1/utils/expected-parameters.ts +199 -0
  107. package/server/routers/api/restful-apis/v1/utils/params.ts +291 -0
  108. package/server/routers/api/restful-apis/v1/utils/validate-util.ts +74 -0
  109. package/server/routers/api/restful-apis/v1/warehouse/add-inbound-order.ts +361 -0
  110. package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +1000 -0
  111. package/server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.ts +139 -0
  112. package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +144 -0
  113. package/server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.ts +109 -0
  114. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +74 -0
  115. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.ts +99 -0
  116. package/server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.ts +295 -0
  117. package/server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.ts +99 -0
  118. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +97 -0
  119. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +116 -0
  120. package/server/routers/api/restful-apis/v1/warehouse/index.ts +10 -0
  121. package/dist-server/routers/api/restful-apis/v1/bizplace.js +0 -45
  122. package/dist-server/routers/api/restful-apis/v1/bizplace.js.map +0 -1
  123. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js +0 -103
  124. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js.map +0 -1
  125. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js +0 -47
  126. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js.map +0 -1
  127. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js +0 -124
  128. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js.map +0 -1
  129. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js +0 -164
  130. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js.map +0 -1
  131. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js +0 -120
  132. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js.map +0 -1
  133. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js +0 -115
  134. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js.map +0 -1
  135. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js +0 -125
  136. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js.map +0 -1
  137. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js +0 -88
  138. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js.map +0 -1
  139. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js +0 -79
  140. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js.map +0 -1
  141. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js +0 -110
  142. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js.map +0 -1
  143. package/dist-server/routers/api/restful-apis/v1/get-partners.js +0 -23
  144. package/dist-server/routers/api/restful-apis/v1/get-partners.js.map +0 -1
  145. package/dist-server/routers/api/restful-apis/v1/get-products.js +0 -210
  146. package/dist-server/routers/api/restful-apis/v1/get-products.js.map +0 -1
  147. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js +0 -122
  148. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js.map +0 -1
  149. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js +0 -191
  150. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js.map +0 -1
  151. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js +0 -20
  152. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js.map +0 -1
  153. package/server/routers/api/restful-apis/v1/bizplace.ts +0 -45
  154. package/server/routers/api/restful-apis/v1/get-contact-point-list.ts +0 -110
  155. package/server/routers/api/restful-apis/v1/get-delivery-order-detail.ts +0 -46
  156. package/server/routers/api/restful-apis/v1/get-delivery-order-list.ts +0 -121
  157. package/server/routers/api/restful-apis/v1/get-delivery-orders.ts +0 -178
  158. package/server/routers/api/restful-apis/v1/get-goods-received-notes.ts +0 -134
  159. package/server/routers/api/restful-apis/v1/get-inbound-order-detail.ts +0 -128
  160. package/server/routers/api/restful-apis/v1/get-inbound-order-list.ts +0 -126
  161. package/server/routers/api/restful-apis/v1/get-inventory-overall-product-group.ts +0 -99
  162. package/server/routers/api/restful-apis/v1/get-marketplace-store-list.ts +0 -81
  163. package/server/routers/api/restful-apis/v1/get-onhand-inventories.ts +0 -125
  164. package/server/routers/api/restful-apis/v1/get-partners.ts +0 -24
  165. package/server/routers/api/restful-apis/v1/get-products.ts +0 -216
  166. package/server/routers/api/restful-apis/v1/get-release-order-detail.ts +0 -134
  167. package/server/routers/api/restful-apis/v1/get-release-order-list.ts +0 -198
  168. package/server/routers/api/restful-apis/v1/get-warehouses.ts +0 -18
@@ -0,0 +1,295 @@
1
+ import { EntityManager, getConnection } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { Bizplace, getCompanyBizplace } from '@things-factory/biz-base'
5
+ import { Domain } from '@things-factory/shell'
6
+ import { LOCATION_TYPE } from '@things-factory/warehouse-base'
7
+
8
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
9
+ import { validateLimitOffset } from '../utils/validate-util'
10
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
11
+
12
+ router.get(
13
+ '/v1/warehouse/get-inventory-product-group-list',
14
+ businessMiddleware,
15
+ validationMiddleware,
16
+ loggingMiddleware,
17
+ async (context, next) => {
18
+ try {
19
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
20
+
21
+ // optional query parameter filter
22
+ let filter = { ...context.query }
23
+
24
+ delete filter['limit']
25
+ delete filter['offset']
26
+
27
+ let filters = []
28
+ if (filter.hasOwnProperty('sku')) {
29
+ filters.push({ name: 'productSKU', operator: 'eq', value: filter['sku'] })
30
+ }
31
+ if (filter.hasOwnProperty('batchId')) {
32
+ filters.push({ name: 'batchId', operator: 'eq', value: filter['batchId'] })
33
+ }
34
+
35
+ await getConnection().transaction(async (tx: EntityManager) => {
36
+ let customerBizplaceId = filter.bizplaceId
37
+ const customerCompanyBizplace: Bizplace = await getCompanyBizplace(null, null, customerBizplaceId, tx)
38
+ const customerBizplace: Bizplace = await tx.getRepository(Bizplace).findOne({
39
+ where: { id: customerBizplaceId },
40
+ relations: ['company', 'company.domain']
41
+ })
42
+
43
+ const bizplaces: Bizplace[] = [customerBizplace, customerCompanyBizplace]
44
+ const params: any = { filters, pagination: { page: offset, limit: limit } }
45
+
46
+ const { items, total } = await bizplaceInventoryProductGroup(bizplaces, params, context, tx)
47
+
48
+ let data = items.map(item => {
49
+ return {
50
+ product: {
51
+ sku: item.productSKU,
52
+ name: item.productName,
53
+ description: item.productDescription,
54
+ type: item.groupType
55
+ },
56
+ batchId: item.batchId,
57
+ packingType: item.packingType,
58
+ packingSize: item.packingSize,
59
+ qty: item.remainQty,
60
+ uomValue: item.remainUomValue,
61
+ uom: item.uom
62
+ }
63
+ })
64
+
65
+ context.body = {
66
+ data,
67
+ totalCount: total,
68
+ limit,
69
+ offset
70
+ }
71
+ })
72
+ } catch (e) {
73
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
74
+ else throwInternalServerError(context, e)
75
+ }
76
+ }
77
+ )
78
+
79
+ async function bizplaceInventoryProductGroup(bizplaces: Bizplace[], params, context: any, trxMgr: EntityManager) {
80
+ try {
81
+ let filters = params.filters
82
+ const { domain }: { domain: Domain } = context.state
83
+
84
+ const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(
85
+ bizplaces,
86
+ filters
87
+ )
88
+
89
+ const _groupType = filters.find(res => res.name == 'groupType')
90
+
91
+ let queryStrings = `
92
+ CREATE TEMP TABLE temp_inventory_product_group AS (
93
+ SELECT * FROM (
94
+ WITH oi as (
95
+ SELECT
96
+ SUM(oi.release_qty) AS release_qty,
97
+ SUM(oi.release_uom_value) AS release_uom_value,
98
+ oi.batch_id,
99
+ oi.batch_id_ref,
100
+ oi.product_id,
101
+ p.name AS product_name,
102
+ oi.packing_type,
103
+ oi.packing_size,
104
+ oi.uom
105
+ FROM
106
+ order_inventories oi
107
+ LEFT JOIN
108
+ products p
109
+ ON
110
+ oi.product_id = p.id
111
+ WHERE
112
+ (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')
113
+ AND oi.batch_id NOTNULL
114
+ AND oi.product_id NOTNULL
115
+ AND oi.packing_type NOTNULL
116
+ AND oi.packing_size NOTNULL
117
+ AND oi.inventory_id IS NULL
118
+ GROUP BY
119
+ oi.batch_id,
120
+ oi.batch_id_ref,
121
+ oi.product_id,
122
+ oi.packing_type,
123
+ oi.packing_size,
124
+ oi.uom,
125
+ p.name
126
+ )
127
+ SELECT
128
+ i.batch_id AS "batchId",
129
+ i.batch_id_ref AS "batchIdRef",
130
+ i.packing_type AS "packingType",
131
+ i.packing_size AS "packingSize",
132
+ i.uom AS "uom",
133
+ coalesce(p.sku, '') AS "productSKU",
134
+ coalesce(p.name, '') AS "productName",
135
+ coalesce(p.description, '') AS "productDescription",
136
+ p.id AS "productId",
137
+ SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) AS "remainQty",
138
+ SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) AS "remainUomValue",
139
+ concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS "remainUomValueWithUom",
140
+ 'SINGLE' AS "groupType"
141
+ FROM
142
+ inventories i
143
+ LEFT JOIN products p ON i.product_id = p.id
144
+ LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom
145
+ LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id
146
+ LEFT JOIN (
147
+ SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value
148
+ FROM product_bundle_settings pbs
149
+ INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id
150
+ GROUP BY pbs.product_id
151
+ ) bp on i.product_id = bp.product_id
152
+ WHERE i.domain_id = $1
153
+ AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')
154
+ ${productWhereClause}
155
+ GROUP BY
156
+ i.batch_id,
157
+ i.batch_id_ref,
158
+ p.id,
159
+ i.packing_type,
160
+ i.packing_size,
161
+ i.uom
162
+ UNION
163
+ SELECT 'BUNDLE' AS "batchId", null as "batchIdRef", packing_type, packing_size,'UNIT' AS "uom", sku AS "productSKU", name AS "productName", description AS "productDescription", id AS "productId",
164
+ MIN(FLOOR(pbs."availableQty")) AS "remainQty",
165
+ MIN(FLOOR(pbs."availableUomValue")) AS "remainUomValue",
166
+ CONCAT(MIN(FLOOR(pbs."availableUomValue")),' UNIT') AS "remainUomValueWithUom",
167
+ 'BUNDLE' AS "groupType"
168
+ FROM product_bundles pb
169
+ INNER JOIN (
170
+ SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),
171
+ (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS "availableQty",
172
+ (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS "availableUomValue"
173
+ FROM product_bundle_settings pbs
174
+ LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1
175
+ AND i2.bizplace_id IN (${bizplaceIds})
176
+ AND i2.status = 'STORED'
177
+ LEFT JOIN oi ON oi.product_id = i2.product_id
178
+ GROUP BY pbs.product_id, pbs.product_bundle_id
179
+ ) pbs ON pbs.product_bundle_id = pb.id
180
+ ${bundleWhereClause}
181
+ GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id
182
+ )
183
+ AS inv_prod_grp
184
+ ${whereClause}
185
+ )
186
+ `
187
+
188
+ let filterGroupTypeQuery
189
+
190
+ if (_groupType) {
191
+ if (_groupType.value === 'SINGLE') {
192
+ filterGroupTypeQuery = `where "groupType"= 'SINGLE' `
193
+ } else {
194
+ filterGroupTypeQuery = `where "groupType"= 'BUNDLE' `
195
+ }
196
+ }
197
+
198
+ await trxMgr.query(queryStrings, [domain.id])
199
+
200
+ const [{ total }]: any = await trxMgr.query(
201
+ `select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`
202
+ )
203
+ let items: any[] = []
204
+
205
+ if (params?.pagination) {
206
+ items = await trxMgr.query(
207
+ `select * from temp_inventory_product_group ${
208
+ filterGroupTypeQuery ? filterGroupTypeQuery : ''
209
+ } OFFSET $1 LIMIT $2`,
210
+ [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]
211
+ )
212
+ } else {
213
+ items = await trxMgr.query(
214
+ `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}
215
+ }`
216
+ )
217
+ }
218
+
219
+ await trxMgr.query(`drop table temp_inventory_product_group`)
220
+
221
+ return { items, total }
222
+ } catch (error) {
223
+ throw error
224
+ }
225
+ }
226
+
227
+ async function getConditions(
228
+ bizplaces: Bizplace[],
229
+ filters: [{ name: string; operator: string; value: any }],
230
+ hasRemainingQty: Boolean = true
231
+ ) {
232
+ let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()
233
+
234
+ let productWhereClause = `
235
+ AND i.status = 'STORED'
236
+ AND i.bizplace_id IN (${bizplaceIds})
237
+ `
238
+
239
+ let bundleWhereClause = `
240
+ WHERE pb.status = 'ACTIVATED'
241
+ `
242
+
243
+ let whereClause = hasRemainingQty ? ` WHERE "remainQty" > 0` : ` WHERE 1 = 1`
244
+
245
+ let productDetailWhereClause = ``
246
+
247
+ let batchBundle: string
248
+ if (filters?.length) {
249
+ await Promise.all(
250
+ filters.map(async (filter: { name: string; operator: string; value: any }) => {
251
+ const name = filter.name
252
+ const operator = filter.operator.toLowerCase()
253
+ let value = filter.value
254
+
255
+ switch (name) {
256
+ case 'batchId':
257
+ whereClause += `AND LOWER("batchId") LIKE '${value.toLowerCase()}'`
258
+ break
259
+
260
+ case 'productSKU':
261
+ whereClause += `AND LOWER("productSKU") LIKE '${value.toLowerCase()}'`
262
+
263
+ case 'batch_bundle':
264
+ bundleWhereClause += `
265
+ ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value
266
+ .map((v: { productId: string }) => `('${v.productId}')`)
267
+ .join()})
268
+ `
269
+ break
270
+ }
271
+ })
272
+ )
273
+
274
+ batchBundle = JSON.stringify(
275
+ filters
276
+ .find(filter => filter.name === 'batch_bundle')
277
+ ?.value.map(itm => {
278
+ return {
279
+ product_id: itm.productId,
280
+ release_qty: itm?.releaseQty || 0,
281
+ release_uom_value: itm?.releaseUomValue || 0
282
+ }
283
+ }) || []
284
+ )
285
+ }
286
+
287
+ return {
288
+ bizplaceIds,
289
+ productWhereClause,
290
+ bundleWhereClause,
291
+ whereClause,
292
+ batchBundle,
293
+ productDetailWhereClause
294
+ }
295
+ }
@@ -0,0 +1,99 @@
1
+ import { Between, getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { ArrivalNotice } from '@things-factory/sales-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import { validateFromToDate, validateLimitOffset } from '../utils/validate-util'
8
+ import _ from 'lodash'
9
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
10
+
11
+ router.get(
12
+ '/v1/warehouse/get-onhand-inventory-list',
13
+ businessMiddleware,
14
+ validationMiddleware,
15
+ loggingMiddleware,
16
+ async (context, next) => {
17
+ try {
18
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
19
+ const { fromDate, toDate } = validateFromToDate(context.query.fromDate, context.query.toDate)
20
+
21
+ // get contact points for that bizplace
22
+ // optional query parameter filter
23
+ let filter = { ...context.query }
24
+ filter['bizplace'] = filter['bizplaceId']
25
+ delete filter['bizplaceId']
26
+ if (_.has(filter, 'ganNo')) {
27
+ filter['name'] = filter['ganNo']
28
+ delete filter['ganNo']
29
+ }
30
+ filter['createdAt'] = Between(fromDate, toDate)
31
+
32
+ delete filter['fromDate']
33
+ delete filter['toDate']
34
+ delete filter['limit']
35
+ delete filter['offset']
36
+ const [arrivalNotices, totalCount]: ArrivalNotice[] = await getRepository(ArrivalNotice).findAndCount({
37
+ where: filter,
38
+ relations: ['orderProducts', 'orderProducts.product'],
39
+ skip: offset,
40
+ take: limit,
41
+ order: { createdAt: 'DESC' }
42
+ })
43
+
44
+ // create and format data response
45
+ let data = []
46
+ for (const arrivalNotice of arrivalNotices) {
47
+ let orderProducts = []
48
+ for (const orderProduct of arrivalNotice.orderProducts) {
49
+ const orderProductsDataPoint = {
50
+ product: {
51
+ sku: orderProduct.product.sku,
52
+ uom: orderProduct.product.uom,
53
+ uomValue: orderProduct.product.uomValue
54
+ },
55
+ batchId: orderProduct.batchId,
56
+ packingType: orderProduct.packingType,
57
+ packingSize: orderProduct.packingSize,
58
+ packQty: orderProduct.packQty,
59
+ palletQty: orderProduct.palletQty
60
+ }
61
+ orderProducts.push(orderProductsDataPoint)
62
+ }
63
+ const datapoint = {
64
+ id: arrivalNotice.id,
65
+ ganNo: arrivalNotice.ganNo,
66
+ refNo: arrivalNotice.refNo,
67
+ refNo2: arrivalNotice.refNo2,
68
+ refNo3: arrivalNotice.refNo3,
69
+ etaDate: arrivalNotice.etaDate,
70
+ ownTransport: arrivalNotice.ownTransport,
71
+ importCargo: arrivalNotice.importCargo,
72
+ container: arrivalNotice.container,
73
+ truckNo: arrivalNotice.truckNo,
74
+ deliveryOrderNo: arrivalNotice.deliveryOrderNo,
75
+ containerNo: arrivalNotice.containerNo,
76
+ containerSize: arrivalNotice.containerSize,
77
+ orderProducts,
78
+ supplier: {
79
+ name: arrivalNotice?.supplier?.name || null,
80
+ companyName: arrivalNotice?.supplier?.companyName || null,
81
+ email: arrivalNotice?.supplier?.email || null,
82
+ accountNo: arrivalNotice?.supplier?.accountNo || null
83
+ }
84
+ }
85
+ data.push(datapoint)
86
+ }
87
+
88
+ context.body = {
89
+ data,
90
+ totalCount,
91
+ limit,
92
+ offset
93
+ }
94
+ } catch (e) {
95
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
96
+ else throwInternalServerError(context, e)
97
+ }
98
+ }
99
+ )
@@ -0,0 +1,97 @@
1
+ import { getRepository } from 'typeorm'
2
+
3
+ import { restfulApiRouter as router } from '@things-factory/api'
4
+ import { ReleaseGood } from '@things-factory/sales-base'
5
+
6
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
7
+ import _ from 'lodash'
8
+ import { businessMiddleware, validationMiddleware, loggingMiddleware } from '../middlewares'
9
+
10
+ router.get(
11
+ '/v1/warehouse/get-release-order-details',
12
+ businessMiddleware,
13
+ validationMiddleware,
14
+ loggingMiddleware,
15
+ async (context, next) => {
16
+ try {
17
+ // get contact points for that bizplace
18
+ // optional query parameter filter
19
+ let filter = { ...context.query }
20
+ filter['bizplace'] = filter['bizplaceId']
21
+ delete filter['bizplaceId']
22
+ if (_.has(filter, 'roNo')) {
23
+ filter['name'] = filter['roNo']
24
+ delete filter['roNo']
25
+ }
26
+
27
+ const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
28
+ where: filter,
29
+ relations: ['orderInventories', 'orderInventories.product']
30
+ })
31
+
32
+ // create and format data response
33
+ let orderInventories = []
34
+ for (const orderInventory of releaseGood.orderInventories) {
35
+ const orderInventoriesDataPoint = {
36
+ product: {
37
+ sku: orderInventory.product.sku,
38
+ refCode: orderInventory.product.refCode
39
+ },
40
+ batchId: orderInventory.batchId,
41
+ packingType: orderInventory.packingType,
42
+ releaseQty: orderInventory.releaseQty,
43
+ packingSize: orderInventory.packingSize
44
+ }
45
+ orderInventories.push(orderInventoriesDataPoint)
46
+ }
47
+ const data = {
48
+ id: releaseGood.id,
49
+ roNo: releaseGood.roNo,
50
+ refNo: releaseGood.refNo,
51
+ refNo2: releaseGood.refNo2,
52
+ refNo3: releaseGood.refNo3,
53
+ type: releaseGood.type,
54
+ releaseDate: releaseGood.releaseDate,
55
+ collectionOrderNo: releaseGood.collectionOrderNo,
56
+ ownTransport: releaseGood.ownTransport,
57
+ exportOption: releaseGood.exportOption,
58
+ transporter: releaseGood.transporter,
59
+ trackingNo: releaseGood.trackingNo,
60
+ marketplaceOrderStatus: releaseGood.marketplaceOrderStatus,
61
+ airwayBill: releaseGood.airwayBill,
62
+ invoice: releaseGood.invoice,
63
+ storeName: releaseGood.storeName,
64
+ storeId: releaseGood.storeId,
65
+ routeId: releaseGood.routeId,
66
+ stopId: releaseGood.stopId,
67
+ billTo: {
68
+ billingAddress: releaseGood.billingAddress
69
+ },
70
+ deliverTo: {
71
+ deliveryAddress1: releaseGood.deliveryAddress1,
72
+ deliveryAddress2: releaseGood.deliveryAddress2,
73
+ deliveryAddress3: releaseGood.deliveryAddress3,
74
+ deliveryAddress4: releaseGood.deliveryAddress4,
75
+ deliveryAddress5: releaseGood.deliveryAddress5,
76
+ attentionTo: releaseGood.attentionTo,
77
+ attentionCompany: releaseGood.attentionCompany,
78
+ city: releaseGood.city,
79
+ state: releaseGood.state,
80
+ postalCode: releaseGood.postalCode,
81
+ country: releaseGood.country,
82
+ phone1: releaseGood.phone1,
83
+ phone2: releaseGood.phone2,
84
+ email: releaseGood.email
85
+ },
86
+ orderInventories
87
+ }
88
+
89
+ context.body = {
90
+ data
91
+ }
92
+ } catch (e) {
93
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
94
+ else throwInternalServerError(context, e)
95
+ }
96
+ }
97
+ )
@@ -0,0 +1,116 @@
1
+ import _ from 'lodash'
2
+ import { Between, getRepository } from 'typeorm'
3
+
4
+ import { restfulApiRouter as router } from '@things-factory/api'
5
+ import { ReleaseGood } from '@things-factory/sales-base'
6
+
7
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
8
+ import { validateFromToDate, validateLimitOffset } from '../utils/validate-util'
9
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
10
+
11
+ router.get(
12
+ '/v1/warehouse/get-release-order-list',
13
+ businessMiddleware,
14
+ validationMiddleware,
15
+ loggingMiddleware,
16
+ async (context, next) => {
17
+ try {
18
+ const { limit, offset } = validateLimitOffset(context.query.limit, context.query.offset)
19
+ const { fromDate, toDate } = validateFromToDate(context.query.fromDate, context.query.toDate)
20
+
21
+ // get contact points for that bizplace
22
+ // optional query parameter filter
23
+ let filter = { ...context.query }
24
+ filter['bizplace'] = filter['bizplaceId']
25
+ delete filter['bizplaceId']
26
+ if (_.has(filter, 'roNo')) {
27
+ filter['name'] = filter['roNo']
28
+ delete filter['roNo']
29
+ }
30
+ filter['createdAt'] = Between(fromDate, toDate)
31
+
32
+ delete filter['fromDate']
33
+ delete filter['toDate']
34
+ delete filter['limit']
35
+ delete filter['offset']
36
+
37
+ const [releaseGoods, totalCount]: ReleaseGood[] = await getRepository(ReleaseGood).findAndCount({
38
+ where: filter,
39
+ relations: ['orderInventories', 'orderInventories.product'],
40
+ skip: offset,
41
+ take: limit,
42
+ order: { createdAt: 'DESC' }
43
+ })
44
+
45
+ // create and format data response
46
+ let data = []
47
+ for (const releaseGood of releaseGoods) {
48
+ let orderInventories = []
49
+ for (const orderInventory of releaseGood.orderInventories) {
50
+ const orderInventoriesDataPoint = {
51
+ product: {
52
+ sku: orderInventory.product.sku,
53
+ refCode: orderInventory.product.refCode
54
+ },
55
+ batchId: orderInventory.batchId,
56
+ packingType: orderInventory.packingType,
57
+ releaseQty: orderInventory.releaseQty,
58
+ packingSize: orderInventory.packingSize
59
+ }
60
+ orderInventories.push(orderInventoriesDataPoint)
61
+ }
62
+ const datapoint = {
63
+ id: releaseGood.id,
64
+ roNo: releaseGood.roNo,
65
+ refNo: releaseGood.refNo,
66
+ refNo2: releaseGood.refNo2,
67
+ refNo3: releaseGood.refNo3,
68
+ type: releaseGood.type,
69
+ releaseDate: releaseGood.releaseDate,
70
+ collectionOrderNo: releaseGood.collectionOrderNo,
71
+ ownTransport: releaseGood.ownTransport,
72
+ exportOption: releaseGood.exportOption,
73
+ transporter: releaseGood.transporter,
74
+ trackingNo: releaseGood.trackingNo,
75
+ marketplaceOrderStatus: releaseGood.marketplaceOrderStatus,
76
+ airwayBill: releaseGood.airwayBill,
77
+ invoice: releaseGood.invoice,
78
+ storeName: releaseGood.storeName,
79
+ storeId: releaseGood.storeId,
80
+ routeId: releaseGood.routeId,
81
+ stopId: releaseGood.stopId,
82
+ billTo: {
83
+ billingAddress: releaseGood.billingAddress
84
+ },
85
+ deliverTo: {
86
+ deliveryAddress1: releaseGood.deliveryAddress1,
87
+ deliveryAddress2: releaseGood.deliveryAddress2,
88
+ deliveryAddress3: releaseGood.deliveryAddress3,
89
+ deliveryAddress4: releaseGood.deliveryAddress4,
90
+ deliveryAddress5: releaseGood.deliveryAddress5,
91
+ attentionTo: releaseGood.attentionTo,
92
+ attentionCompany: releaseGood.attentionCompany,
93
+ city: releaseGood.city,
94
+ state: releaseGood.state,
95
+ postalCode: releaseGood.postalCode,
96
+ country: releaseGood.country,
97
+ phone1: releaseGood.phone1,
98
+ phone2: releaseGood.phone2,
99
+ email: releaseGood.email
100
+ },
101
+ orderInventories
102
+ }
103
+ data.push(datapoint)
104
+ }
105
+ context.body = {
106
+ data,
107
+ totalCount,
108
+ limit,
109
+ offset
110
+ }
111
+ } catch (e) {
112
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
113
+ else throwInternalServerError(context, e)
114
+ }
115
+ }
116
+ )
@@ -0,0 +1,10 @@
1
+ import './cancel-inbound-order'
2
+ import './get-delivery-order-list'
3
+ import './get-goods-received-note-list'
4
+ import './get-inbound-order-details'
5
+ import './get-inbound-order-list'
6
+ import './get-inventory-product-group-list'
7
+ import './get-onhand-inventory-list'
8
+ import './get-release-order-details'
9
+ import './get-release-order-list'
10
+ import './add-release-order'
@@ -1,45 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const graphql_tag_1 = __importDefault(require("graphql-tag"));
7
- const api_1 = require("@things-factory/api");
8
- const debug = require('debug')('things-factory:operato-hub:restful-api:v1:bizplace');
9
- api_1.restfulApiRouter.get('/v1/bizplace/:id', async (context, next) => {
10
- const { client } = context.state;
11
- const { id } = context.params;
12
- debug('params', context.params);
13
- context.body = {
14
- result: (await client.query({
15
- query: (0, graphql_tag_1.default) `
16
- query bizplace($id: String!) {
17
- bizplace(id: $id) {
18
- id
19
- name
20
- description
21
- address
22
- postalCode
23
- latlng
24
- status
25
- creator {
26
- name
27
- email
28
- }
29
- updater {
30
- name
31
- email
32
- }
33
- createdAt
34
- updatedAt
35
- }
36
- }
37
- `,
38
- variables: {
39
- id
40
- },
41
- context
42
- })).data
43
- };
44
- });
45
- //# sourceMappingURL=bizplace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bizplace.js","sourceRoot":"","sources":["../../../../../server/routers/api/restful-apis/v1/bizplace.ts"],"names":[],"mappings":";;;;;AAAA,8DAA6B;AAC7B,6CAAgE;AAEhE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,oDAAoD,CAAC,CAAA;AAEpF,sBAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAChC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;IAE7B,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAE/B,OAAO,CAAC,IAAI,GAAG;QACb,MAAM,EAAE,CACN,MAAM,MAAM,CAAC,KAAK,CAAC;YACjB,KAAK,EAAE,IAAA,qBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;SAsBT;YACD,SAAS,EAAE;gBACT,EAAE;aACH;YACD,OAAO;SACD,CAAC,CACV,CAAC,IAAI;KACP,CAAA;AACH,CAAC,CAAC,CAAA"}