@things-factory/operato-wms 5.0.13 → 6.0.0-alpha.1

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 (206) hide show
  1. package/client/pages/bulk-operation/bulk-operation.js +96 -8
  2. package/client/pages/bulk-operation/validate-gan-popup.js +37 -27
  3. package/client/pages/bulk-operation/validate-ro-popup.js +40 -0
  4. package/client/pages/components/select-inventory-popup.js +633 -0
  5. package/client/pages/constants/order.js +2 -1
  6. package/client/pages/inbound/pallet-label-popup.js +2 -0
  7. package/client/pages/inbound/select-product-batch.js +7 -1
  8. package/client/pages/inbound/undo-unload-popup.js +37 -21
  9. package/client/pages/inbound/unload-product.js +147 -59
  10. package/client/pages/inbound/worksheet-putaway.js +1 -1
  11. package/client/pages/inbound/worksheet-unloading.js +11 -7
  12. package/client/pages/inventory/inventory-adjustment.js +261 -238
  13. package/client/pages/inventory/inventory-by-product-detail.js +99 -92
  14. package/client/pages/inventory/inventory-by-product.js +170 -68
  15. package/client/pages/inventory/onhand-inventory.js +10 -12
  16. package/client/pages/inventory/serial-number-list-popup.js +36 -5
  17. package/client/pages/inventory-check/inspecting-product.js +1 -1
  18. package/client/pages/manifest/create-loading-manifest.js +47 -22
  19. package/client/pages/manifest/dispatcher-verification-popup.js +24 -13
  20. package/client/pages/manifest/loading-manifest-detail.js +311 -46
  21. package/client/pages/manifest/loading-manifest-list.js +86 -13
  22. package/client/pages/order/arrival-notice/arrival-notice-detail.js +305 -52
  23. package/client/pages/order/arrival-notice/arrival-notice-list.js +20 -1
  24. package/client/pages/order/arrival-notice/create-arrival-notice.js +2 -2
  25. package/client/pages/order/goods-received-note/received-note-detail.js +187 -15
  26. package/client/pages/order/release-order/b2b/b2b-order-list.js +76 -80
  27. package/client/pages/order/release-order/b2c/b2c-order-requests.js +148 -123
  28. package/client/pages/order/release-order/batch-picking-popup.js +11 -0
  29. package/client/pages/order/release-order/create-release-order.js +762 -250
  30. package/client/pages/order/release-order/release-extra-product-popup.js +10 -3
  31. package/client/pages/order/release-order/release-order-detail.js +897 -215
  32. package/client/pages/order/transport-order/delivery-note-popup.js +1050 -107
  33. package/client/pages/order/transport-order/print-delivery-note.js +214 -33
  34. package/client/pages/order/transport-order/upload-delivery-note.js +6 -4
  35. package/client/pages/order/transport-order/view-delivery-note.js +0 -1
  36. package/client/pages/outbound/generate-worksheet-popup.js +374 -0
  37. package/client/pages/outbound/inventory-reassign-popup.js +1097 -0
  38. package/client/pages/outbound/loading-product.js +88 -78
  39. package/client/pages/outbound/merged-outbound-worksheet.js +1 -1
  40. package/client/pages/outbound/packing-product.js +193 -82
  41. package/client/pages/outbound/packing-worksheet-list.js +10 -9
  42. package/client/pages/outbound/picking-product.js +979 -905
  43. package/client/pages/outbound/route-label-popup.js +283 -191
  44. package/client/pages/outbound/serial-number-popup.js +1 -0
  45. package/client/pages/outbound/sorting-product.js +12 -12
  46. package/client/pages/outbound/worksheet-batch-picking.js +39 -5
  47. package/client/pages/outbound/worksheet-packing.js +17 -4
  48. package/client/pages/outbound/worksheet-picking.js +45 -6
  49. package/client/pages/report/inbound-serial-number-report.js +86 -9
  50. package/client/pages/report/inventory-report.js +10 -0
  51. package/client/pages/report/inventory-summary-report.js +28 -19
  52. package/client/pages/report/outbound-order-details-report.js +204 -43
  53. package/client/pages/report/outbound-serial-number-report.js +87 -9
  54. package/client/pages/report/release-inventory-report.js +503 -0
  55. package/client/route.js +5 -0
  56. package/client/util/index.js +2 -0
  57. package/client/util/page-settings.js +43 -0
  58. package/client/util/toast.js +10 -0
  59. package/dist-server/graphql/resolvers/board-setting/board-settings.js +3 -3
  60. package/dist-server/graphql/resolvers/board-setting/board-settings.js.map +1 -1
  61. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.js +2 -2
  62. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.js.map +1 -1
  63. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.js +1 -1
  64. package/dist-server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.js.map +1 -1
  65. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.js +2 -2
  66. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.js.map +1 -1
  67. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js +9 -10
  68. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js.map +1 -1
  69. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js +2 -2
  70. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js.map +1 -1
  71. package/dist-server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.js +6 -4
  72. package/dist-server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.js.map +1 -1
  73. package/dist-server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.js +6 -4
  74. package/dist-server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.js.map +1 -1
  75. package/dist-server/graphql/resolvers/dashboard/arrival-notices-by-status.js +21 -10
  76. package/dist-server/graphql/resolvers/dashboard/arrival-notices-by-status.js.map +1 -1
  77. package/dist-server/graphql/resolvers/dashboard/collection-orders-by-status.js +1 -2
  78. package/dist-server/graphql/resolvers/dashboard/collection-orders-by-status.js.map +1 -1
  79. package/dist-server/graphql/resolvers/dashboard/delivery-orders-by-status.js +1 -2
  80. package/dist-server/graphql/resolvers/dashboard/delivery-orders-by-status.js.map +1 -1
  81. package/dist-server/graphql/resolvers/dashboard/index.js +2 -1
  82. package/dist-server/graphql/resolvers/dashboard/index.js.map +1 -1
  83. package/dist-server/graphql/resolvers/dashboard/inventory-expiry-monitor.js +17 -1
  84. package/dist-server/graphql/resolvers/dashboard/inventory-expiry-monitor.js.map +1 -1
  85. package/dist-server/graphql/resolvers/dashboard/outbound-order-by-status.js +113 -75
  86. package/dist-server/graphql/resolvers/dashboard/outbound-order-by-status.js.map +1 -1
  87. package/dist-server/graphql/resolvers/dashboard/release-goods-by-status.js +21 -10
  88. package/dist-server/graphql/resolvers/dashboard/release-goods-by-status.js.map +1 -1
  89. package/dist-server/graphql/resolvers/dashboard/unit-inbounded-outbounded.js +56 -0
  90. package/dist-server/graphql/resolvers/dashboard/unit-inbounded-outbounded.js.map +1 -0
  91. package/dist-server/graphql/resolvers/index.js +5 -4
  92. package/dist-server/graphql/resolvers/index.js.map +1 -1
  93. package/dist-server/graphql/resolvers/inventory-comparison/inventory-comparison-list.js.map +1 -1
  94. package/dist-server/graphql/resolvers/opa-menu/opa-menus.js +8 -7
  95. package/dist-server/graphql/resolvers/opa-menu/opa-menus.js.map +1 -1
  96. package/dist-server/graphql/resolvers/{extra → other}/add-release-good-products.js +59 -8
  97. package/dist-server/graphql/resolvers/other/add-release-good-products.js.map +1 -0
  98. package/dist-server/graphql/resolvers/{extra → other}/index.js +3 -1
  99. package/dist-server/graphql/resolvers/other/index.js.map +1 -0
  100. package/dist-server/graphql/resolvers/other/page-settings.js +87 -0
  101. package/dist-server/graphql/resolvers/other/page-settings.js.map +1 -0
  102. package/dist-server/graphql/resolvers/reports/costing-report.js +4 -4
  103. package/dist-server/graphql/resolvers/reports/costing-report.js.map +1 -1
  104. package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js +3 -3
  105. package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js.map +1 -1
  106. package/dist-server/graphql/resolvers/reports/inbound-serial-number-report.js +36 -7
  107. package/dist-server/graphql/resolvers/reports/inbound-serial-number-report.js.map +1 -1
  108. package/dist-server/graphql/resolvers/reports/index.js +2 -1
  109. package/dist-server/graphql/resolvers/reports/index.js.map +1 -1
  110. package/dist-server/graphql/resolvers/reports/outbound-order-details-report.js +69 -30
  111. package/dist-server/graphql/resolvers/reports/outbound-order-details-report.js.map +1 -1
  112. package/dist-server/graphql/resolvers/reports/outbound-serial-number-report.js +36 -11
  113. package/dist-server/graphql/resolvers/reports/outbound-serial-number-report.js.map +1 -1
  114. package/dist-server/graphql/resolvers/reports/product-label-report.js +3 -3
  115. package/dist-server/graphql/resolvers/reports/product-label-report.js.map +1 -1
  116. package/dist-server/graphql/resolvers/reports/release-inventory-report.js +180 -0
  117. package/dist-server/graphql/resolvers/reports/release-inventory-report.js.map +1 -0
  118. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js +2 -2
  119. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js.map +1 -1
  120. package/dist-server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.js +1 -1
  121. package/dist-server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.js.map +1 -1
  122. package/dist-server/graphql/types/dashboard/index.js +1 -0
  123. package/dist-server/graphql/types/dashboard/index.js.map +1 -1
  124. package/dist-server/graphql/types/index.js +7 -2
  125. package/dist-server/graphql/types/index.js.map +1 -1
  126. package/dist-server/graphql/types/other/index.js +19 -0
  127. package/dist-server/graphql/types/other/index.js.map +1 -0
  128. package/dist-server/graphql/types/other/page-setting.js +34 -0
  129. package/dist-server/graphql/types/other/page-setting.js.map +1 -0
  130. package/dist-server/graphql/types/reports/index.js +6 -1
  131. package/dist-server/graphql/types/reports/index.js.map +1 -1
  132. package/dist-server/graphql/types/reports/outbound-order-details-report.js +17 -1
  133. package/dist-server/graphql/types/reports/outbound-order-details-report.js.map +1 -1
  134. package/dist-server/graphql/types/reports/release-inventory-report-list.js +12 -0
  135. package/dist-server/graphql/types/reports/release-inventory-report-list.js.map +1 -0
  136. package/dist-server/graphql/types/reports/release-inventory-report.js +27 -0
  137. package/dist-server/graphql/types/reports/release-inventory-report.js.map +1 -0
  138. package/dist-server/migrations/1568858861188-SeedSetting.js +5 -6
  139. package/dist-server/migrations/1568858861188-SeedSetting.js.map +1 -1
  140. package/dist-server/migrations/1623308919899-SeedLocationRecommendSetting.js +1 -1
  141. package/dist-server/migrations/1623308919899-SeedLocationRecommendSetting.js.map +1 -1
  142. package/dist-server/migrations/1623381200659-SeedStoringRule.js +1 -1
  143. package/dist-server/migrations/1623381200659-SeedStoringRule.js.map +1 -1
  144. package/dist-server/tsconfig.tsbuildinfo +1 -1
  145. package/dist-server/utils/report-query-util.js +5 -2
  146. package/dist-server/utils/report-query-util.js.map +1 -1
  147. package/helps/release-note.ko.md +8 -20
  148. package/helps/release-note.md +8 -20
  149. package/helps/release-note.ms.md +8 -20
  150. package/helps/release-note.zh.md +8 -20
  151. package/package.json +42 -42
  152. package/server/graphql/resolvers/board-setting/board-settings.ts +4 -6
  153. package/server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.ts +4 -5
  154. package/server/graphql/resolvers/custom/elccl/elccl-daily-order-inventory-report.ts +9 -10
  155. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-pallet-detail-report.ts +4 -5
  156. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.ts +17 -19
  157. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts +10 -8
  158. package/server/graphql/resolvers/custom/elccl/elccl-onhand-inventory-counter.ts +9 -9
  159. package/server/graphql/resolvers/custom/kimeda/kimeda-onhand-inventory-counter.ts +9 -9
  160. package/server/graphql/resolvers/dashboard/arrival-notices-by-status.ts +23 -14
  161. package/server/graphql/resolvers/dashboard/collection-orders-by-status.ts +4 -5
  162. package/server/graphql/resolvers/dashboard/delivery-orders-by-status.ts +4 -5
  163. package/server/graphql/resolvers/dashboard/index.ts +3 -1
  164. package/server/graphql/resolvers/dashboard/inventory-expiry-monitor.ts +18 -6
  165. package/server/graphql/resolvers/dashboard/outbound-order-by-status.ts +114 -81
  166. package/server/graphql/resolvers/dashboard/release-goods-by-status.ts +23 -14
  167. package/server/graphql/resolvers/dashboard/unit-inbounded-outbounded.ts +61 -0
  168. package/server/graphql/resolvers/index.ts +5 -4
  169. package/server/graphql/resolvers/inventory-comparison/inventory-comparison-list.ts +11 -9
  170. package/server/graphql/resolvers/opa-menu/opa-menus.ts +7 -6
  171. package/server/graphql/resolvers/{extra → other}/add-release-good-products.ts +73 -12
  172. package/server/graphql/resolvers/other/index.ts +10 -0
  173. package/server/graphql/resolvers/other/page-settings.ts +105 -0
  174. package/server/graphql/resolvers/reports/costing-report.ts +8 -10
  175. package/server/graphql/resolvers/reports/inbound-order-details-report.ts +7 -9
  176. package/server/graphql/resolvers/reports/inbound-serial-number-report.ts +41 -13
  177. package/server/graphql/resolvers/reports/index.ts +3 -1
  178. package/server/graphql/resolvers/reports/outbound-order-details-report.ts +76 -38
  179. package/server/graphql/resolvers/reports/outbound-serial-number-report.ts +42 -18
  180. package/server/graphql/resolvers/reports/product-label-report.ts +4 -6
  181. package/server/graphql/resolvers/reports/release-inventory-report.ts +201 -0
  182. package/server/graphql/resolvers/shipping-provider/shipping-providers.ts +3 -5
  183. package/server/graphql/resolvers/warehouse-inventory-adjustment/warehouse-intentory-adjustment.ts +10 -10
  184. package/server/graphql/types/dashboard/index.ts +1 -0
  185. package/server/graphql/types/index.ts +8 -2
  186. package/server/graphql/types/other/index.ts +19 -0
  187. package/server/graphql/types/other/page-setting.ts +33 -0
  188. package/server/graphql/types/reports/index.ts +6 -1
  189. package/server/graphql/types/reports/outbound-order-details-report.ts +17 -1
  190. package/server/graphql/types/reports/release-inventory-report-list.ts +8 -0
  191. package/server/graphql/types/reports/release-inventory-report.ts +23 -0
  192. package/server/migrations/1568858861188-SeedSetting.ts +4 -4
  193. package/server/migrations/1623308919899-SeedLocationRecommendSetting.ts +3 -2
  194. package/server/migrations/1623381200659-SeedStoringRule.ts +3 -2
  195. package/server/utils/report-query-util.ts +5 -2
  196. package/things-factory.config.js +4 -0
  197. package/translations/en.json +148 -27
  198. package/translations/ko.json +185 -105
  199. package/translations/ms.json +183 -98
  200. package/translations/zh.json +197 -112
  201. package/dist-server/graphql/resolvers/extra/add-release-good-products.js.map +0 -1
  202. package/dist-server/graphql/resolvers/extra/index.js.map +0 -1
  203. package/dist-server/graphql/types/extra/index.js +0 -11
  204. package/dist-server/graphql/types/extra/index.js.map +0 -1
  205. package/server/graphql/resolvers/extra/index.ts +0 -5
  206. package/server/graphql/types/extra/index.ts +0 -7
@@ -0,0 +1,503 @@
1
+ import '@things-factory/form-ui'
2
+ import '@things-factory/grist-ui'
3
+ import '../inventory/inventory-by-product-detail'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html } from 'lit-element'
7
+ import { connect } from 'pwa-helpers/connect-mixin'
8
+
9
+ import { getCodeByName } from '@things-factory/code-base'
10
+ import { i18next, localize } from '@things-factory/i18n-base'
11
+ import { client, gqlContext, PageView, store } from '@things-factory/shell'
12
+ import { flattenObject, isMobileDevice } from '@things-factory/utils'
13
+
14
+ class ReleaseInventoryReport extends connect(store)(localize(i18next)(PageView)) {
15
+ static get styles() {
16
+ return css`
17
+ :host {
18
+ display: flex;
19
+ flex-direction: column;
20
+ width: 100%;
21
+ }
22
+
23
+ data-grist {
24
+ overflow-y: auto;
25
+ flex: 1;
26
+ }
27
+ `
28
+ }
29
+
30
+ static get properties() {
31
+ return {
32
+ _searchFields: Object,
33
+ _config: Object,
34
+ _gristData: Object,
35
+ data: Object
36
+ }
37
+ }
38
+
39
+ get context() {
40
+ return {
41
+ title: i18next.t('title.release_inventory_report'),
42
+ exportable: {
43
+ name: i18next.t('title.release_inventory_report'),
44
+ data: this._exportableData.bind(this)
45
+ },
46
+ help: 'operato-wms/report/release-inventory-report'
47
+ }
48
+ }
49
+
50
+ get dataGrist() {
51
+ return this.shadowRoot.querySelector('data-grist')
52
+ }
53
+
54
+ get searchForm() {
55
+ return this.shadowRoot.querySelector('search-form')
56
+ }
57
+
58
+ get _bizplaceSelector() {
59
+ return this.searchForm.shadowRoot.querySelector('select[name=bizplace]')
60
+ }
61
+
62
+ get _fromDateInput() {
63
+ return this.searchForm.shadowRoot.querySelector('input[name=fromDate]')
64
+ }
65
+
66
+ get _toDateInput() {
67
+ return this.searchForm.shadowRoot.querySelector('input[name=toDate]')
68
+ }
69
+
70
+ render() {
71
+ return html`
72
+ <search-form id="search-form" .fields=${this._searchFields} @submit=${e => this.dataGrist.fetch()}></search-form>
73
+
74
+ <data-grist
75
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
76
+ .config=${this._config}
77
+ .fetchHandler="${this.fetchHandler.bind(this)}"
78
+ ></data-grist>
79
+ `
80
+ }
81
+
82
+ get searchFields() {
83
+ return [
84
+ {
85
+ label: i18next.t('field.company'),
86
+ name: 'bizplace',
87
+ type: 'select',
88
+ options: [
89
+ { value: '' },
90
+ ...this._partners
91
+ .map(partner => {
92
+ return {
93
+ name: `${partner.name} ${partner.description ? `(${partner.description})` : ''}`,
94
+ value: partner.id
95
+ }
96
+ })
97
+ .sort(this._compareValues('name', 'asc'))
98
+ ],
99
+ props: { searchOper: 'eq' }
100
+ },
101
+ {
102
+ label: i18next.t('field.product_info'),
103
+ name: 'product',
104
+ type: 'string',
105
+ props: { searchOper: 'in' }
106
+ },
107
+ {
108
+ label: i18next.t('field.order_info'),
109
+ name: 'order',
110
+ type: 'string',
111
+ props: { searchOper: 'in' }
112
+ },
113
+ {
114
+ label: i18next.t('field.order_date'),
115
+ name: 'orderDate',
116
+ type: 'date',
117
+ props: {
118
+ searchOper: 'eq'
119
+ }
120
+ },
121
+ {
122
+ label: i18next.t('field.lot_id'),
123
+ name: 'palletId',
124
+ type: 'text',
125
+ props: { searchOper: 'eq' }
126
+ },
127
+ {
128
+ label: i18next.t('field.carton_id'),
129
+ name: 'cartonId',
130
+ type: 'text',
131
+ props: { searchOper: 'eq' }
132
+ }
133
+ ]
134
+ }
135
+
136
+ get reportConfig() {
137
+ let columns = [
138
+ { type: 'gutter', gutterName: 'sequence' },
139
+ {
140
+ type: 'string',
141
+ name: 'bizplace|name',
142
+ header: i18next.t('field.company'),
143
+ width: 200
144
+ },
145
+ {
146
+ type: 'string',
147
+ name: 'product|sku',
148
+ header: i18next.t('field.sku'),
149
+ width: 150
150
+ },
151
+ {
152
+ type: 'string',
153
+ name: 'product|name',
154
+ header: i18next.t('field.product_name'),
155
+ width: 200
156
+ },
157
+ {
158
+ type: 'string',
159
+ name: 'product|description',
160
+ header: i18next.t('field.product_description'),
161
+ width: 300
162
+ },
163
+ {
164
+ type: 'string',
165
+ name: 'product|brand',
166
+ header: i18next.t('field.product_brand'),
167
+ width: 150
168
+ },
169
+ {
170
+ type: 'string',
171
+ name: 'packingType',
172
+ header: i18next.t('field.packing_type'),
173
+ width: 150
174
+ },
175
+ {
176
+ type: 'float',
177
+ name: 'assignedQty',
178
+ header: i18next.t('field.assigned_qty'),
179
+ width: 120
180
+ },
181
+ {
182
+ type: 'float',
183
+ name: 'assignedUomValue',
184
+ header: i18next.t('field.assigned_uom_value'),
185
+ width: 120
186
+ },
187
+ {
188
+ type: 'float',
189
+ name: 'assignedUom',
190
+ header: i18next.t('field.assigned_uom'),
191
+ width: 120
192
+ },
193
+ {
194
+ type: 'string',
195
+ name: 'orderNo',
196
+ header: i18next.t('field.order_no'),
197
+ width: 150
198
+ },
199
+ {
200
+ type: 'string',
201
+ name: 'type',
202
+ header: i18next.t('field.order_type'),
203
+ width: 100
204
+ },
205
+ {
206
+ type: 'datetime',
207
+ name: 'orderAt',
208
+ header: i18next.t('field.order_date'),
209
+ width: 170
210
+ },
211
+ {
212
+ type: 'string',
213
+ name: 'releaseDate',
214
+ header: i18next.t('field.execute_date'),
215
+ width: 170
216
+ },
217
+ {
218
+ type: 'string',
219
+ name: 'palletId',
220
+ header: i18next.t('field.lot_id'),
221
+ width: 150
222
+ },
223
+ {
224
+ type: 'string',
225
+ name: 'cartonId',
226
+ header: i18next.t('field.carton_id'),
227
+ width: 150
228
+ },
229
+ {
230
+ type: 'string',
231
+ name: 'batchId',
232
+ header: i18next.t('field.batch_id'),
233
+ width: 150
234
+ },
235
+ {
236
+ type: 'string',
237
+ name: 'batchIdRef',
238
+ header: i18next.t('field.batch_id_ref'),
239
+ width: 150
240
+ },
241
+ {
242
+ type: 'string',
243
+ name: 'expirationDate',
244
+ header: i18next.t('field.exp_date'),
245
+ width: 170
246
+ },
247
+ {
248
+ type: 'string',
249
+ name: 'manufactureDate',
250
+ header: i18next.t('field.manufacture_date'),
251
+ width: 170
252
+ },
253
+ {
254
+ type: 'string',
255
+ name: 'location|name',
256
+ header: i18next.t('field.location'),
257
+ width: 150
258
+ }
259
+ ]
260
+ let list = {
261
+ fields: [
262
+ 'bizplace|name',
263
+ 'product|sku',
264
+ 'product|name',
265
+ 'product|description',
266
+ 'product|brand',
267
+ 'packingType',
268
+ 'assignedQty',
269
+ 'assignedUomValue',
270
+ 'assignedUom',
271
+ 'orderNo',
272
+ 'type',
273
+ 'orderAt',
274
+ 'releaseDate',
275
+ 'palletId',
276
+ 'cartonId',
277
+ 'batchId',
278
+ 'batchIdRef',
279
+ 'expirationDate',
280
+ 'manufactureDate',
281
+ 'location|name'
282
+ ]
283
+ }
284
+
285
+ return {
286
+ columns: columns,
287
+ list,
288
+ pagination: { limit: 100, pages: [100, 200, 500, 1000] },
289
+ rows: {
290
+ selectable: false,
291
+ insertable: false,
292
+ appendable: false
293
+ }
294
+ }
295
+ }
296
+
297
+ async pageInitialized() {
298
+ this._gristData = { total: 0, records: [] }
299
+ this._products = []
300
+
301
+ const [_partnersReq] = await Promise.allSettled([this._fetchPartners()])
302
+
303
+ this._partners = _partnersReq.status == 'fulfilled' ? _partnersReq.value : []
304
+
305
+ this._searchFields = this.searchFields
306
+ this._config = this.reportConfig
307
+ }
308
+
309
+ async pageUpdated(changes, lifecycle) {
310
+ if (this.active) {
311
+ this.dataGrist.fetch()
312
+ }
313
+ }
314
+
315
+ async fetchHandler({ page, limit, sorters = [] }) {
316
+ try {
317
+ this._validate()
318
+ let filters = this.searchForm.queryFilters.map(filter => {
319
+ switch (filter.name) {
320
+ case 'orderDate':
321
+ let orderDt = new Date(filter.value)
322
+ orderDt.setHours(0)
323
+ filter.value = orderDt.toISOString()
324
+ break
325
+ default:
326
+ break
327
+ }
328
+ return filter
329
+ })
330
+
331
+ const pagination = { page, limit }
332
+ const sortings = sorters
333
+
334
+ const response = await client.query({
335
+ query: gql`
336
+ query releaseInventoryReport($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
337
+ releaseInventoryReport(filters: $filters, pagination: $pagination, sortings: $sortings) {
338
+ items {
339
+ bizplace {
340
+ name
341
+ description
342
+ }
343
+ product {
344
+ sku
345
+ name
346
+ description
347
+ brand
348
+ }
349
+ packingType
350
+ assignedQty
351
+ assignedUomValue
352
+ assignedUom
353
+ orderNo
354
+ type
355
+ orderAt
356
+ releaseDate
357
+ palletId
358
+ cartonId
359
+ batchId
360
+ batchIdRef
361
+ expirationDate
362
+ manufactureDate
363
+ location {
364
+ name
365
+ }
366
+ }
367
+ total
368
+ }
369
+ }
370
+ `,
371
+ variables: { filters, pagination, sortings },
372
+ context: gqlContext()
373
+ })
374
+
375
+ const data = {
376
+ total: response.data.releaseInventoryReport.total,
377
+ records:
378
+ response.data.releaseInventoryReport.items.map(itm => {
379
+ return flattenObject({
380
+ ...itm,
381
+ releaseDate: itm.releaseDate ? new Date(itm.releaseDate).toLocaleDateString() : '',
382
+ expirationDate: itm.expirationDate ? new Date(parseInt(itm.expirationDate)).toLocaleDateString() : '',
383
+ manufactureDate: itm.manufactureDate ? new Date(parseInt(itm.manufactureDate)).toLocaleDateString() : ''
384
+ })
385
+ }) || []
386
+ }
387
+
388
+ this._gristData = {
389
+ ...data
390
+ }
391
+
392
+ return data
393
+ } catch (e) {
394
+ this._showToast(e)
395
+ }
396
+ }
397
+
398
+ async _fetchPartners() {
399
+ const filters = []
400
+ const response = await client.query({
401
+ query: gql`
402
+ query partnersBizplaces($filters: [Filter!]) {
403
+ partnersBizplaces(filters: $filters) {
404
+ items {
405
+ id
406
+ name
407
+ description
408
+ }
409
+ }
410
+ }
411
+ `,
412
+ variables: { filters }
413
+ })
414
+
415
+ if (!response.errors) {
416
+ return response.data.partnersBizplaces.items
417
+ }
418
+ }
419
+ _validate() {
420
+ if (!this.searchForm.shadowRoot.querySelector('form').checkValidity())
421
+ throw new Error(i18next.t('text.invalid_form_value'))
422
+ if (!this._bizplaceSelector.value) throw new Error(i18next.t('text.no_company_selected'))
423
+ }
424
+
425
+ _compareValues(key, order = 'asc') {
426
+ return function innerSort(a, b) {
427
+ if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
428
+ return 0
429
+ }
430
+
431
+ const varA = typeof a[key] === 'string' ? a[key].toUpperCase() : a[key]
432
+ const varB = typeof b[key] === 'string' ? b[key].toUpperCase() : b[key]
433
+
434
+ let comparison = 0
435
+ if (varA > varB) {
436
+ comparison = 1
437
+ } else if (varA < varB) {
438
+ comparison = -1
439
+ }
440
+ return order === 'desc' ? comparison * -1 : comparison
441
+ }
442
+ }
443
+
444
+ _submit(e) {
445
+ this._config = { ...this.reportConfig }
446
+ this.searchForm.submit()
447
+ }
448
+
449
+ async _exportableData() {
450
+ try {
451
+ var headerSetting = [
452
+ { header: i18next.t('field.company'), key: 'bizplace|name', width: 60, type: 'string' },
453
+ { header: i18next.t('field.sku'), key: 'product|sku', width: 25, type: 'string' },
454
+ { header: i18next.t('field.product_name'), key: 'product|name', width: 50, type: 'string' },
455
+ { header: i18next.t('field.product_description'), key: 'product|description', width: 50, type: 'string' },
456
+ { header: i18next.t('field.product_brand'), key: 'product|brand', width: 25, type: 'string' },
457
+ { header: i18next.t('field.packing_type'), key: 'packingType', width: 30, type: 'string' },
458
+ { header: i18next.t('field.assigned_qty'), key: 'assignedQty', width: 20, type: 'string' },
459
+ { header: i18next.t('field.assigned_uom_value'), key: 'assignedUomValue', width: 20, type: 'string' },
460
+ { header: i18next.t('field.assigned_uom'), key: 'assignedUom', width: 20, type: 'string' },
461
+ { header: i18next.t('field.order_no'), key: 'orderNo', width: 30, type: 'string' },
462
+ { header: i18next.t('field.order_type'), key: 'type', width: 20, type: 'string' },
463
+ { header: i18next.t('field.order_date'), key: 'orderAt', width: 15, type: 'string' },
464
+ { header: i18next.t('field.execute_date'), key: 'releaseDate', width: 15, type: 'string' },
465
+ { header: i18next.t('field.lot_id'), key: 'palletId', width: 20, type: 'string' },
466
+ { header: i18next.t('field.carton_id'), key: 'cartonId', width: 20, type: 'string' },
467
+ { header: i18next.t('field.batch_id'), key: 'batchId', width: 20, type: 'string' },
468
+ { header: i18next.t('field.batch_id_ref'), key: 'batchIdRef', width: 20, type: 'string' },
469
+ { header: i18next.t('field.exp_date'), key: 'expirationDate', width: 15, type: 'string' },
470
+ { header: i18next.t('field.manufacture_date'), key: 'manufactureDate', width: 15, type: 'string' },
471
+ { header: i18next.t('field.location'), key: 'location|name', width: 15, type: 'string' }
472
+ ]
473
+
474
+ let data = (await this.fetchHandler({ page: 1, limit: 9999999 })).records.map(itm => {
475
+ return {
476
+ ...itm,
477
+ orderAt: itm.orderAt ? new Date(parseInt(itm.orderAt)).toLocaleString() : ''
478
+ }
479
+ })
480
+ var exportData = {
481
+ header: [...headerSetting],
482
+ data
483
+ }
484
+
485
+ return exportData
486
+ } catch (e) {
487
+ this._showToast(e)
488
+ }
489
+ }
490
+
491
+ _showToast({ type, message }) {
492
+ document.dispatchEvent(
493
+ new CustomEvent('notify', {
494
+ detail: {
495
+ type,
496
+ message
497
+ }
498
+ })
499
+ )
500
+ }
501
+ }
502
+
503
+ window.customElements.define('release-inventory-report', ReleaseInventoryReport)
package/client/route.js CHANGED
@@ -475,6 +475,11 @@ export default function route(page) {
475
475
  case 'costing_report':
476
476
  import('./pages/report/costing-report')
477
477
  return page
478
+
479
+ case 'release_inventory_report':
480
+ import('./pages/report/release-inventory-report')
481
+ return page
482
+
478
483
  /**
479
484
  * Custom ELCCL Menus Section
480
485
  */
@@ -0,0 +1,2 @@
1
+ export * from './page-settings'
2
+ export * from './toast'
@@ -0,0 +1,43 @@
1
+ import { client, gqlContext } from '@things-factory/shell'
2
+ import gql from 'graphql-tag'
3
+
4
+ export const fetchPageSettings = async function (variables = { codes, partners }) {
5
+ try {
6
+ const response = await client.query({
7
+ query: gql`
8
+ query pageSettings($codes: [Filter!], $partners: [Filter!]) {
9
+ pageSettings(codes: $codes, partners: $partners) {
10
+ type
11
+ details {
12
+ id
13
+ name
14
+ description
15
+ settingDetails {
16
+ id
17
+ name
18
+ description
19
+ rank
20
+ }
21
+ }
22
+ }
23
+ }
24
+ `,
25
+ variables,
26
+ context: gqlContext()
27
+ })
28
+
29
+ if (!response.errors && response.data.pageSettings) {
30
+ return {
31
+ codes: response.data.pageSettings.find(x => x.type == 'code')?.details || [],
32
+ partners: response.data.pageSettings.find(x => x.type == 'partner')?.details || []
33
+ }
34
+ } else {
35
+ return {
36
+ code: [],
37
+ partners: []
38
+ }
39
+ }
40
+ } catch (error) {
41
+ console.log(error)
42
+ }
43
+ }
@@ -0,0 +1,10 @@
1
+ export const showToast = function ({ type, message }) {
2
+ document.dispatchEvent(
3
+ new CustomEvent('notify', {
4
+ detail: {
5
+ type,
6
+ message
7
+ }
8
+ })
9
+ )
10
+ }
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.boardSettingsResolver = void 0;
4
- const typeorm_1 = require("typeorm");
5
4
  const auth_base_1 = require("@things-factory/auth-base");
6
5
  const board_service_1 = require("@things-factory/board-service");
7
6
  const setting_base_1 = require("@things-factory/setting-base");
7
+ const shell_1 = require("@things-factory/shell");
8
8
  const opa_app_setting_constants_1 = require("../../../opa-app-setting-constants");
9
9
  exports.boardSettingsResolver = {
10
10
  async boardSettings(_, params, context) {
@@ -12,7 +12,7 @@ exports.boardSettingsResolver = {
12
12
  /***********************************************************************************
13
13
  * Temporary solution for dashboard user type
14
14
  ***********************************************************************************/
15
- const user = await (0, typeorm_1.getRepository)(auth_base_1.User)
15
+ const user = await (0, shell_1.getRepository)(auth_base_1.User)
16
16
  .createQueryBuilder('USER')
17
17
  .leftJoinAndSelect('USER.roles', 'ROLES')
18
18
  .leftJoinAndSelect('ROLES.domain', 'ROLES_DOMAIN')
@@ -23,7 +23,7 @@ exports.boardSettingsResolver = {
23
23
  /**********************************************************************************/
24
24
  const HOME_BOARD = `${opa_app_setting_constants_1.HOME_DASHBOARD_PREFIX}:${userType}`;
25
25
  // const HOME_BOARD = `${HOME_DASHBOARD_PREFIX}:${context.state.user.userType}`
26
- const queryBuilder = (0, typeorm_1.getRepository)(setting_base_1.Setting).createQueryBuilder();
26
+ const queryBuilder = (0, shell_1.getRepository)(setting_base_1.Setting).createQueryBuilder();
27
27
  const names = [
28
28
  opa_app_setting_constants_1.LOCATION_LABEL_SETTING_KEY,
29
29
  opa_app_setting_constants_1.PRODUCT_LABEL_SETTING_KEY,
@@ -1 +1 @@
1
- {"version":3,"file":"board-settings.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/board-setting/board-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Board } from '@things-factory/board-service'\nimport { Setting } from '@things-factory/setting-base'\nimport { Domain } from '@things-factory/shell'\n\nimport {\n CARTON_LABEL_SETTING_KEY,\n HOME_DASHBOARD_PREFIX,\n LOCATION_LABEL_SETTING_KEY,\n PALLET_LABEL_SETTING_KEY,\n PRODUCT_LABEL_SETTING_KEY,\n REUSABLE_PALLET_LABEL_SETTING_KEY,\n INTENALIZED_AWB_SETTING_KEY,\n ROUTE_LABEL_SETTING_KEY,\n TOTE_LABEL_SETTING_KEY\n} from '../../../opa-app-setting-constants'\n\nexport const boardSettingsResolver = {\n async boardSettings(_: any, params: any, context: any) {\n const { domain }: { domain: Domain } = context.state\n\n /***********************************************************************************\n * Temporary solution for dashboard user type\n ***********************************************************************************/\n const user: User = await getRepository(User)\n .createQueryBuilder('USER')\n .leftJoinAndSelect('USER.roles', 'ROLES')\n .leftJoinAndSelect('ROLES.domain', 'ROLES_DOMAIN')\n .where('USER.id = :userId', { userId: context.state.user.id })\n .andWhere('ROLES_DOMAIN.id = :domainId', { domainId: domain.id })\n .getOne()\n\n const userType = user.roles.filter(role => role.description)[0].description\n /**********************************************************************************/\n\n const HOME_BOARD = `${HOME_DASHBOARD_PREFIX}:${userType}`\n // const HOME_BOARD = `${HOME_DASHBOARD_PREFIX}:${context.state.user.userType}`\n\n const queryBuilder = getRepository(Setting).createQueryBuilder()\n const names = [\n LOCATION_LABEL_SETTING_KEY,\n PRODUCT_LABEL_SETTING_KEY,\n PALLET_LABEL_SETTING_KEY,\n REUSABLE_PALLET_LABEL_SETTING_KEY,\n HOME_BOARD,\n CARTON_LABEL_SETTING_KEY,\n INTENALIZED_AWB_SETTING_KEY,\n ROUTE_LABEL_SETTING_KEY,\n TOTE_LABEL_SETTING_KEY\n ]\n\n var qb = queryBuilder\n // .innerJoin(Board, 'Board', 'Board.id = CAST(Setting.value AS uuid)')\n .innerJoin(Board, 'Board', 'Setting.value = CAST(Board.id AS char(36))')\n // .innerJoin(Board, 'Board', 'Board.id = Setting.value')\n .select([\n 'Setting.id as id',\n 'Setting.name as name',\n 'Setting.value as value',\n 'Board.id as boardId',\n 'Board.name as boardName',\n 'Board.description as boardDescription',\n 'Board.thumbnail as boardThumbnail'\n ])\n .where('Setting.domain_id = :domain', { domain: context.state.domain.id })\n\n if (names && names.length) qb.andWhere('Setting.name IN (:...names)', { names })\n\n var boardSettingList = await qb.getRawMany()\n\n return boardSettingList.map(boardSetting => {\n var setting: any = {\n board: {}\n }\n\n for (let key in boardSetting) {\n if (key.includes('board')) {\n let originKey = key\n key = key.replace('board', '').toLowerCase()\n setting.board[key] = boardSetting[originKey]\n } else {\n setting[key] = boardSetting[key]\n }\n }\n\n if (setting.name.indexOf(HOME_DASHBOARD_PREFIX) == 0) {\n setting.name = HOME_DASHBOARD_PREFIX\n }\n\n return setting\n })\n }\n}\n"]}
1
+ {"version":3,"file":"board-settings.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/board-setting/board-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { User } from '@things-factory/auth-base'\nimport { Board } from '@things-factory/board-service'\nimport { Setting } from '@things-factory/setting-base'\nimport { getRepository } from '@things-factory/shell'\n\nimport {\n CARTON_LABEL_SETTING_KEY,\n HOME_DASHBOARD_PREFIX,\n INTENALIZED_AWB_SETTING_KEY,\n LOCATION_LABEL_SETTING_KEY,\n PALLET_LABEL_SETTING_KEY,\n PRODUCT_LABEL_SETTING_KEY,\n REUSABLE_PALLET_LABEL_SETTING_KEY,\n ROUTE_LABEL_SETTING_KEY,\n TOTE_LABEL_SETTING_KEY\n} from '../../../opa-app-setting-constants'\n\nexport const boardSettingsResolver = {\n async boardSettings(_: any, params: any, context: ResolverContext) {\n const { domain } = context.state\n\n /***********************************************************************************\n * Temporary solution for dashboard user type\n ***********************************************************************************/\n const user: User = await getRepository(User)\n .createQueryBuilder('USER')\n .leftJoinAndSelect('USER.roles', 'ROLES')\n .leftJoinAndSelect('ROLES.domain', 'ROLES_DOMAIN')\n .where('USER.id = :userId', { userId: context.state.user.id })\n .andWhere('ROLES_DOMAIN.id = :domainId', { domainId: domain.id })\n .getOne()\n\n const userType = user.roles.filter(role => role.description)[0].description\n /**********************************************************************************/\n\n const HOME_BOARD = `${HOME_DASHBOARD_PREFIX}:${userType}`\n // const HOME_BOARD = `${HOME_DASHBOARD_PREFIX}:${context.state.user.userType}`\n\n const queryBuilder = getRepository(Setting).createQueryBuilder()\n const names = [\n LOCATION_LABEL_SETTING_KEY,\n PRODUCT_LABEL_SETTING_KEY,\n PALLET_LABEL_SETTING_KEY,\n REUSABLE_PALLET_LABEL_SETTING_KEY,\n HOME_BOARD,\n CARTON_LABEL_SETTING_KEY,\n INTENALIZED_AWB_SETTING_KEY,\n ROUTE_LABEL_SETTING_KEY,\n TOTE_LABEL_SETTING_KEY\n ]\n\n var qb = queryBuilder\n // .innerJoin(Board, 'Board', 'Board.id = CAST(Setting.value AS uuid)')\n .innerJoin(Board, 'Board', 'Setting.value = CAST(Board.id AS char(36))')\n // .innerJoin(Board, 'Board', 'Board.id = Setting.value')\n .select([\n 'Setting.id as id',\n 'Setting.name as name',\n 'Setting.value as value',\n 'Board.id as boardId',\n 'Board.name as boardName',\n 'Board.description as boardDescription',\n 'Board.thumbnail as boardThumbnail'\n ])\n .where('Setting.domain_id = :domain', { domain: context.state.domain.id })\n\n if (names && names.length) qb.andWhere('Setting.name IN (:...names)', { names })\n\n var boardSettingList = await qb.getRawMany()\n\n return boardSettingList.map(boardSetting => {\n var setting: any = {\n board: {}\n }\n\n for (let key in boardSetting) {\n if (key.includes('board')) {\n let originKey = key\n key = key.replace('board', '').toLowerCase()\n setting.board[key] = boardSetting[originKey]\n } else {\n setting[key] = boardSetting[key]\n }\n }\n\n if (setting.name.indexOf(HOME_DASHBOARD_PREFIX) == 0) {\n setting.name = HOME_DASHBOARD_PREFIX\n }\n\n return setting\n })\n }\n}\n"]}
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.elcclDailyCollectionReport = void 0;
4
4
  const biz_base_1 = require("@things-factory/biz-base");
5
- const typeorm_1 = require("typeorm");
5
+ const shell_1 = require("@things-factory/shell");
6
6
  exports.elcclDailyCollectionReport = {
7
7
  async elcclDailyCollectionReport(_, params, context) {
8
8
  try {
9
9
  const { tx } = context.state;
10
10
  let bizplaceQuery = '';
11
11
  if (params.filters.find((filter) => filter.name === 'bizplace')) {
12
- const bizplace = await (0, typeorm_1.getRepository)(biz_base_1.Bizplace).findOne({
12
+ const bizplace = await (0, shell_1.getRepository)(biz_base_1.Bizplace).findOneBy({
13
13
  id: params.filters.find(data => data.name === 'bizplace').value
14
14
  });
15
15
  bizplaceQuery = "AND rg.bizplace_id = '" + bizplace.id + "'";
@@ -1 +1 @@
1
- {"version":3,"file":"elccl-daily-collection-report.js","sourceRoot":"","sources":["../../../../../server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAEnD,qCAAsD;AAEzC,QAAA,0BAA0B,GAAG;IACxC,KAAK,CAAC,0BAA0B,CAAC,CAAM,EAAE,MAAiB,EAAE,OAAY;QACtE,IAAI;YACF,MAAM,EAAE,EAAE,EAAE,GAA0B,OAAO,CAAC,KAAK,CAAA;YAEnD,IAAI,aAAa,GAAG,EAAE,CAAA;YACtB,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE;gBACpE,MAAM,QAAQ,GAAa,MAAM,IAAA,uBAAa,EAAC,mBAAQ,CAAC,CAAC,OAAO,CAAC;oBAC/D,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK;iBAChE,CAAC,CAAA;gBACF,aAAa,GAAG,wBAAwB,GAAG,QAAQ,CAAC,EAAE,GAAG,GAAG,CAAA;aAC7D;YAED,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;YACpE,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;YAChE,IAAI,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;YAC9E,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK,GAAG,UAAU,CAAA;YAEvF,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;gBAAE,MAAM,eAAe,CAAA;YAE/C,IAAI,kBAAkB,GAAG,EAAE,CAAA;YAC3B,IAAI,aAAa,EAAE;gBACjB,kBAAkB;oBAChB,0CAA0C;wBAC1C,aAAa,CAAC,KAAK;6BAChB,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,EAAE,CAAC,EAAE;4BACR,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;wBACpD,CAAC,CAAC;6BACD,IAAI,CAAC,GAAG,CAAC;wBACZ,IAAI,CAAA;aACP;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;;;;;;;;;;;;;;;YAeI,aAAa;;;;;;;;;;;;;;;;;;;;;;cAsBX,kBAAkB;;;;;;SAMvB,EACD,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClE,CAAA;YAED,IAAI,KAAK,GAAG,MAAa,CAAA;YAEzB,OAAO,KAAK,CAAA;SACb;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF,CAAA","sourcesContent":["import { Bizplace } from '@things-factory/biz-base'\nimport { ListParam } from '@things-factory/shell'\nimport { EntityManager, getRepository } from 'typeorm'\n\nexport const elcclDailyCollectionReport = {\n async elcclDailyCollectionReport(_: any, params: ListParam, context: any) {\n try {\n const { tx }: { tx: EntityManager } = context.state\n\n let bizplaceQuery = ''\n if (params.filters.find((filter: any) => filter.name === 'bizplace')) {\n const bizplace: Bizplace = await getRepository(Bizplace).findOne({\n id: params.filters.find(data => data.name === 'bizplace').value\n })\n bizplaceQuery = \"AND rg.bizplace_id = '\" + bizplace.id + \"'\"\n }\n\n let fromDate = params.filters.find(data => data.name === 'fromDate')\n let toDate = params.filters.find(data => data.name === 'toDate')\n let arrivalNotice = params.filters.find(data => data.name === 'arrivalNotice')\n let tzoffset = params.filters.find(data => data.name === 'tzoffset').value + ' seconds'\n\n if (!fromDate || !toDate) throw 'Invalid input'\n\n let arrivalNoticeQuery = ''\n if (arrivalNotice) {\n arrivalNoticeQuery =\n 'AND arrival_notice_name ILIKE ANY(ARRAY[' +\n arrivalNotice.value\n .split(',')\n .map(an => {\n return \"'%\" + an.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',') +\n '])'\n }\n\n const result = await tx.query(\n `\n with src as (\n select ar.name as release_good_name, COALESCE(ar.name, 'MIGRATE') as arrival_notice_name, bz.name as bizplace_name, \n ws.ended_at::date, delord.own_collection, delord.name as delivery_order_name, inv.pallet_id, inv.batch_id\n from release_goods rg\n inner join bizplaces bz on bz.id = rg.bizplace_id\n inner join worksheets ws on ws.release_good_id = rg.id and ws.type = 'LOADING'\n inner join order_inventories oi on oi.release_good_id = rg.id\n inner join inventories inv on inv.id = oi.inventory_id\n inner join delivery_orders delord on delord.id = oi.delivery_order_id \n left join order_inventories inbound_oi on inbound_oi.inventory_id = inv.id and inbound_oi.type = 'ARRIVAL_NOTICE'\n left join arrival_notices ar on ar.id = inbound_oi.arrival_notice_id\n where rg.domain_id = $1\n and ws.ended_at >= $2::timestamp + $4::interval\n and ws.ended_at <= $3::timestamp + $4::interval\n ${bizplaceQuery}\n )\n select bizplace_name, arrival_notice_name, ended_at, batch_id, \n trim(trailing ', ' from self_collect) as self_collect, trim(trailing ', ' from delivery) as delivery,\n trim(trailing ', ' from self_collect_summary) as self_collect_summary, trim(trailing ', ' from delivery_summary) as delivery_summary,\n total_self_collect, total_delivery\n from(\n select bizplace_name, arrival_notice_name, ended_at, batch_id,\n string_agg(self_collect, '') as self_collect,\n string_agg(delivery, '') delivery,\n string_agg(self_collect_summary, '') as self_collect_summary,\n string_agg(delivery_summary, '') delivery_summary,\n COUNT(case when own_collection = true then 1 end) as total_self_collect,\n COUNT(case when own_collection = false then 1 end) as total_delivery\n from (\n select arrival_notice_name, delivery_order_name, bizplace_name, ended_at::varchar, own_collection, batch_id,\n case when own_collection = 'true' then concat(delivery_order_name, ' (', string_agg(pallet_id, ', ' ORDER BY pallet_id), '), ') else '' end as self_collect,\n case when own_collection = 'false' then concat(delivery_order_name, ' (', string_agg(pallet_id, ', ' ORDER BY pallet_id), '), ') else '' end as delivery,\n case when own_collection = 'true' then concat(delivery_order_name, ' (', count(*), '), ') else '' end as self_collect_summary,\n case when own_collection = 'false' then concat(delivery_order_name, ' (', count(*), '), ') else '' end as delivery_summary\n from src\n where 1 = 1\n ${arrivalNoticeQuery}\n group by bizplace_name, arrival_notice_name, ended_at, delivery_order_name, own_collection, batch_id\n ) src\n group by bizplace_name, arrival_notice_name, ended_at, batch_id\n order by bizplace_name, ended_at, arrival_notice_name\n ) src\n `,\n [context.state.domain.id, fromDate.value, toDate.value, tzoffset]\n )\n\n let items = result as any\n\n return items\n } catch (error) {\n throw error\n }\n }\n}\n"]}
1
+ {"version":3,"file":"elccl-daily-collection-report.js","sourceRoot":"","sources":["../../../../../server/graphql/resolvers/custom/elccl/elccl-daily-collection-report.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AACnD,iDAAgE;AAEnD,QAAA,0BAA0B,GAAG;IACxC,KAAK,CAAC,0BAA0B,CAAC,CAAM,EAAE,MAAiB,EAAE,OAAwB;QAClF,IAAI;YACF,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;YAE5B,IAAI,aAAa,GAAG,EAAE,CAAA;YACtB,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE;gBACpE,MAAM,QAAQ,GAAa,MAAM,IAAA,qBAAa,EAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;oBACjE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK;iBAChE,CAAC,CAAA;gBACF,aAAa,GAAG,wBAAwB,GAAG,QAAQ,CAAC,EAAE,GAAG,GAAG,CAAA;aAC7D;YAED,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;YACpE,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;YAChE,IAAI,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;YAC9E,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK,GAAG,UAAU,CAAA;YAEvF,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;gBAAE,MAAM,eAAe,CAAA;YAE/C,IAAI,kBAAkB,GAAG,EAAE,CAAA;YAC3B,IAAI,aAAa,EAAE;gBACjB,kBAAkB;oBAChB,0CAA0C;wBAC1C,aAAa,CAAC,KAAK;6BAChB,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,EAAE,CAAC,EAAE;4BACR,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;wBACpD,CAAC,CAAC;6BACD,IAAI,CAAC,GAAG,CAAC;wBACZ,IAAI,CAAA;aACP;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;;;;;;;;;;;;;;;YAeI,aAAa;;;;;;;;;;;;;;;;;;;;;;cAsBX,kBAAkB;;;;;;SAMvB,EACD,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClE,CAAA;YAED,IAAI,KAAK,GAAG,MAAa,CAAA;YAEzB,OAAO,KAAK,CAAA;SACb;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF,CAAA","sourcesContent":["import { Bizplace } from '@things-factory/biz-base'\nimport { getRepository, ListParam } from '@things-factory/shell'\n\nexport const elcclDailyCollectionReport = {\n async elcclDailyCollectionReport(_: any, params: ListParam, context: ResolverContext) {\n try {\n const { tx } = context.state\n\n let bizplaceQuery = ''\n if (params.filters.find((filter: any) => filter.name === 'bizplace')) {\n const bizplace: Bizplace = await getRepository(Bizplace).findOneBy({\n id: params.filters.find(data => data.name === 'bizplace').value\n })\n bizplaceQuery = \"AND rg.bizplace_id = '\" + bizplace.id + \"'\"\n }\n\n let fromDate = params.filters.find(data => data.name === 'fromDate')\n let toDate = params.filters.find(data => data.name === 'toDate')\n let arrivalNotice = params.filters.find(data => data.name === 'arrivalNotice')\n let tzoffset = params.filters.find(data => data.name === 'tzoffset').value + ' seconds'\n\n if (!fromDate || !toDate) throw 'Invalid input'\n\n let arrivalNoticeQuery = ''\n if (arrivalNotice) {\n arrivalNoticeQuery =\n 'AND arrival_notice_name ILIKE ANY(ARRAY[' +\n arrivalNotice.value\n .split(',')\n .map(an => {\n return \"'%\" + an.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',') +\n '])'\n }\n\n const result = await tx.query(\n `\n with src as (\n select ar.name as release_good_name, COALESCE(ar.name, 'MIGRATE') as arrival_notice_name, bz.name as bizplace_name, \n ws.ended_at::date, delord.own_collection, delord.name as delivery_order_name, inv.pallet_id, inv.batch_id\n from release_goods rg\n inner join bizplaces bz on bz.id = rg.bizplace_id\n inner join worksheets ws on ws.release_good_id = rg.id and ws.type = 'LOADING'\n inner join order_inventories oi on oi.release_good_id = rg.id\n inner join inventories inv on inv.id = oi.inventory_id\n inner join delivery_orders delord on delord.id = oi.delivery_order_id \n left join order_inventories inbound_oi on inbound_oi.inventory_id = inv.id and inbound_oi.type = 'ARRIVAL_NOTICE'\n left join arrival_notices ar on ar.id = inbound_oi.arrival_notice_id\n where rg.domain_id = $1\n and ws.ended_at >= $2::timestamp + $4::interval\n and ws.ended_at <= $3::timestamp + $4::interval\n ${bizplaceQuery}\n )\n select bizplace_name, arrival_notice_name, ended_at, batch_id, \n trim(trailing ', ' from self_collect) as self_collect, trim(trailing ', ' from delivery) as delivery,\n trim(trailing ', ' from self_collect_summary) as self_collect_summary, trim(trailing ', ' from delivery_summary) as delivery_summary,\n total_self_collect, total_delivery\n from(\n select bizplace_name, arrival_notice_name, ended_at, batch_id,\n string_agg(self_collect, '') as self_collect,\n string_agg(delivery, '') delivery,\n string_agg(self_collect_summary, '') as self_collect_summary,\n string_agg(delivery_summary, '') delivery_summary,\n COUNT(case when own_collection = true then 1 end) as total_self_collect,\n COUNT(case when own_collection = false then 1 end) as total_delivery\n from (\n select arrival_notice_name, delivery_order_name, bizplace_name, ended_at::varchar, own_collection, batch_id,\n case when own_collection = 'true' then concat(delivery_order_name, ' (', string_agg(pallet_id, ', ' ORDER BY pallet_id), '), ') else '' end as self_collect,\n case when own_collection = 'false' then concat(delivery_order_name, ' (', string_agg(pallet_id, ', ' ORDER BY pallet_id), '), ') else '' end as delivery,\n case when own_collection = 'true' then concat(delivery_order_name, ' (', count(*), '), ') else '' end as self_collect_summary,\n case when own_collection = 'false' then concat(delivery_order_name, ' (', count(*), '), ') else '' end as delivery_summary\n from src\n where 1 = 1\n ${arrivalNoticeQuery}\n group by bizplace_name, arrival_notice_name, ended_at, delivery_order_name, own_collection, batch_id\n ) src\n group by bizplace_name, arrival_notice_name, ended_at, batch_id\n order by bizplace_name, ended_at, arrival_notice_name\n ) src\n `,\n [context.state.domain.id, fromDate.value, toDate.value, tzoffset]\n )\n\n let items = result as any\n\n return items\n } catch (error) {\n throw error\n }\n }\n}\n"]}