@things-factory/operato-wms 3.7.2 → 3.7.7

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 (84) hide show
  1. package/client/pages/components/select-product-popup.js +5 -1
  2. package/client/pages/constants/order.js +10 -0
  3. package/client/pages/inbound/putaway-product.js +162 -139
  4. package/client/pages/inventory-check/inspecting-product.js +146 -80
  5. package/client/pages/manifest/create-loading-manifest.js +314 -0
  6. package/client/pages/manifest/dispatcher-verification-popup.js +86 -0
  7. package/client/pages/manifest/loading-manifest-detail.js +345 -0
  8. package/client/pages/manifest/loading-manifest-list.js +305 -0
  9. package/client/pages/order/arrival-notice/create-arrival-notice.js +8 -1
  10. package/client/pages/order/goods-received-note/received-note-list.js +138 -6
  11. package/client/pages/order/release-order/b2b/b2b-order-list.js +45 -5
  12. package/client/pages/order/release-order/b2b/b2b-order-requests.js +45 -5
  13. package/client/pages/order/release-order/b2c/b2c-order-requests.js +181 -21
  14. package/client/pages/order/release-order/bulk-print-packing-list.js +23 -0
  15. package/client/pages/order/release-order/create-release-order.js +25 -4
  16. package/client/pages/order/release-order/receive-release-order-request.js +27 -24
  17. package/client/pages/order/release-order/release-extra-product-popup.js +189 -56
  18. package/client/pages/order/release-order/release-order-detail.js +292 -71
  19. package/client/pages/order/reverse-kitting-order/reverse-kitting-order-detail.js +115 -50
  20. package/client/pages/order/reverse-kitting-order/reverse-kitting-order-list.js +1 -6
  21. package/client/pages/order/reverse-kitting-order/reverse-kitting-pallet-label-popup.js +239 -0
  22. package/client/pages/order/transport-order/delivery-order-list.js +99 -59
  23. package/client/pages/outbound/loading-product.js +4 -1
  24. package/client/pages/outbound/merged-outbound-worksheet.js +39 -1
  25. package/client/pages/outbound/packing-product.js +4 -1
  26. package/client/pages/outbound/packing-worksheet-list.js +39 -1
  27. package/client/pages/outbound/picking-product.js +622 -290
  28. package/client/pages/outbound/serial-number-popup.js +280 -0
  29. package/client/pages/outbound/worksheet-picking.js +28 -2
  30. package/client/pages/report/product-label-report.js +401 -0
  31. package/client/pages/support/inventory-comparison.js +296 -0
  32. package/client/pages/vas/print-product-label.js +298 -132
  33. package/client/pages/vas/reverse-kitting/execute-reverse-kitting.js +30 -12
  34. package/client/pages/vas/reverse-kitting/popup-combination-sets.js +75 -5
  35. package/client/pages/vas/reverse-kitting/popup-reverse-kitting-template.js +113 -18
  36. package/client/route.js +23 -0
  37. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js +64 -54
  38. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js.map +1 -1
  39. package/dist-server/graphql/resolvers/extra/add-release-good-products.js +34 -9
  40. package/dist-server/graphql/resolvers/extra/add-release-good-products.js.map +1 -1
  41. package/dist-server/graphql/resolvers/index.js +3 -1
  42. package/dist-server/graphql/resolvers/index.js.map +1 -1
  43. package/dist-server/graphql/resolvers/inventory-comparison/index.js +6 -0
  44. package/dist-server/graphql/resolvers/inventory-comparison/index.js.map +1 -0
  45. package/dist-server/graphql/resolvers/inventory-comparison/inventory-comparison-list.js +78 -0
  46. package/dist-server/graphql/resolvers/inventory-comparison/inventory-comparison-list.js.map +1 -0
  47. package/dist-server/graphql/resolvers/reports/index.js +2 -1
  48. package/dist-server/graphql/resolvers/reports/index.js.map +1 -1
  49. package/dist-server/graphql/resolvers/reports/product-label-report.js +56 -0
  50. package/dist-server/graphql/resolvers/reports/product-label-report.js.map +1 -0
  51. package/dist-server/graphql/types/index.js +5 -2
  52. package/dist-server/graphql/types/index.js.map +1 -1
  53. package/dist-server/graphql/types/inventory-comparison/index.js +13 -0
  54. package/dist-server/graphql/types/inventory-comparison/index.js.map +1 -0
  55. package/dist-server/graphql/types/inventory-comparison/inventory-comparison-list.js +14 -0
  56. package/dist-server/graphql/types/inventory-comparison/inventory-comparison-list.js.map +1 -0
  57. package/dist-server/graphql/types/inventory-comparison/inventory-comparison.js +18 -0
  58. package/dist-server/graphql/types/inventory-comparison/inventory-comparison.js.map +1 -0
  59. package/dist-server/graphql/types/reports/index.js +6 -1
  60. package/dist-server/graphql/types/reports/index.js.map +1 -1
  61. package/dist-server/graphql/types/reports/product-label-report-list.js +14 -0
  62. package/dist-server/graphql/types/reports/product-label-report-list.js.map +1 -0
  63. package/dist-server/graphql/types/reports/product-label-report.js +16 -0
  64. package/dist-server/graphql/types/reports/product-label-report.js.map +1 -0
  65. package/package.json +65 -65
  66. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts +75 -65
  67. package/server/graphql/resolvers/extra/add-release-good-products.ts +57 -15
  68. package/server/graphql/resolvers/index.ts +3 -1
  69. package/server/graphql/resolvers/inventory-comparison/index.ts +5 -0
  70. package/server/graphql/resolvers/inventory-comparison/inventory-comparison-list.ts +99 -0
  71. package/server/graphql/resolvers/reports/index.ts +3 -1
  72. package/server/graphql/resolvers/reports/product-label-report.ts +56 -0
  73. package/server/graphql/types/index.ts +5 -2
  74. package/server/graphql/types/inventory-comparison/index.ts +11 -0
  75. package/server/graphql/types/inventory-comparison/inventory-comparison-list.ts +8 -0
  76. package/server/graphql/types/inventory-comparison/inventory-comparison.ts +12 -0
  77. package/server/graphql/types/reports/index.ts +6 -1
  78. package/server/graphql/types/reports/product-label-report-list.ts +8 -0
  79. package/server/graphql/types/reports/product-label-report.ts +10 -0
  80. package/things-factory.config.js +24 -0
  81. package/translations/en.json +64 -12
  82. package/translations/ko.json +50 -1
  83. package/translations/ms.json +51 -1
  84. package/translations/zh.json +50 -1
@@ -72,9 +72,6 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
72
72
  ? html`<form class="multi-column-form" id="info-form">
73
73
  <fieldset>
74
74
  <legend>${`${i18next.t('title.order_no')}: ${this._orderNo}`}</legend>
75
-
76
- <!-- <label>${i18next.t('label.company')}</label>
77
- <input name="bizplaceName" readonly /> -->
78
75
  </fieldset>
79
76
  </form>
80
77
 
@@ -109,8 +106,11 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
109
106
 
110
107
  get completable() {
111
108
  let completable = false
112
- if (this.orderData.records.length > 0) {
113
- completable = this.orderData.records.every(item => item.completed)
109
+ const orderDataWithIssues = this.orderData.records.filter(orderReverseKitting => !orderReverseKitting.completed)
110
+ if (!orderDataWithIssues?.length) {
111
+ completable = this.orderData.records.every(record => record.completed)
112
+ } else {
113
+ completable = orderDataWithIssues.every(record => record.issue)
114
114
  }
115
115
 
116
116
  return completable
@@ -131,7 +131,7 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
131
131
  pageInitialized() {
132
132
  this.orderGristConfig = {
133
133
  pagination: { infinite: true },
134
- list: { fields: ['completed', 'batchId', 'palletId', 'product', 'qty'] },
134
+ list: { fields: ['completed', 'batchId', 'palletId', 'product', 'qty', 'issue'] },
135
135
  rows: {
136
136
  appendable: false,
137
137
  handlers: {
@@ -179,6 +179,13 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
179
179
  header: i18next.t('field.uom_value'),
180
180
  label: true,
181
181
  width: 60
182
+ },
183
+ {
184
+ type: 'string',
185
+ name: 'issue',
186
+ header: i18next.t('field.issue'),
187
+ label: true,
188
+ width: 200
182
189
  }
183
190
  ]
184
191
  }
@@ -236,6 +243,7 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
236
243
  otherTarget
237
244
  operationGuide
238
245
  status
246
+ issue
239
247
  description
240
248
  remark
241
249
  }
@@ -336,7 +344,6 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
336
344
 
337
345
  _clearView() {
338
346
  this.orderData = { records: [] }
339
- this.inputForm.reset()
340
347
  this._selectedParentInventory = null
341
348
  this.updateContext()
342
349
  }
@@ -346,11 +353,22 @@ class ExecuteReverseKitting extends connect(store)(localize(i18next)(PageView))
346
353
  }
347
354
 
348
355
  _openPopupCombinationSets(record) {
349
- openPopup(html` <popup-combination-sets .orderNo="${this._orderNo}" .data="${record}"></popup-combination-sets> `, {
350
- backdrop: true,
351
- size: 'large',
352
- title: record.palletId
353
- })
356
+ openPopup(
357
+ html`
358
+ <popup-combination-sets
359
+ .orderNo="${this._orderNo}"
360
+ .data="${record}"
361
+ @order-reverse-kitting-data="${e => {
362
+ this.fetchReverseKittingOrder(this._orderNo)
363
+ }}"
364
+ ></popup-combination-sets>
365
+ `,
366
+ {
367
+ backdrop: true,
368
+ size: 'large',
369
+ title: record.palletId
370
+ }
371
+ )
354
372
  }
355
373
 
356
374
  _showToast({ type, message }) {
@@ -1,10 +1,13 @@
1
1
  import '../../vas/reverse-kitting/popup-reverse-kitting-template'
2
+ import '../../components/popup-note'
2
3
 
4
+ import gql from 'graphql-tag'
3
5
  import { css, html, LitElement } from 'lit-element'
4
6
 
5
7
  import { MultiColumnFormStyles } from '@things-factory/form-ui'
6
8
  import { i18next, localize } from '@things-factory/i18n-base'
7
9
  import { openPopup } from '@things-factory/layout-base'
10
+ import { client } from '@things-factory/shell'
8
11
  import { isMobileDevice } from '@things-factory/utils'
9
12
 
10
13
  class PopupCombinationSets extends localize(i18next)(LitElement) {
@@ -53,12 +56,15 @@ class PopupCombinationSets extends localize(i18next)(LitElement) {
53
56
  font-size: var(--grist-title-icon-size);
54
57
  color: var(--grist-title-icon-color);
55
58
  }
59
+ .grist {
60
+ display: flex;
61
+ flex-direction: column;
62
+ flex: 1;
63
+ overflow-y: auto;
64
+ }
56
65
  .button-container {
57
- padding: var(--button-container-padding);
58
- margin: var(--button-container-margin);
59
- text-align: var(--button-container-align);
60
- background-color: var(--button-container-background);
61
- height: var(--button-container-height);
66
+ padding: 10px 0 12px 0;
67
+ text-align: center;
62
68
  }
63
69
  `
64
70
  ]
@@ -129,6 +135,15 @@ class PopupCombinationSets extends localize(i18next)(LitElement) {
129
135
  ></data-grist>
130
136
  </div>`
131
137
  : ''}
138
+ ${this.data
139
+ ? html`<div class="button-container">
140
+ <mwc-button
141
+ raised
142
+ @click=${this._openIssueNote.bind(this)}
143
+ label="${i18next.t('button.issue')}"
144
+ ></mwc-button>
145
+ </div>`
146
+ : ''}
132
147
  `
133
148
  }
134
149
 
@@ -214,6 +229,31 @@ class PopupCombinationSets extends localize(i18next)(LitElement) {
214
229
  }
215
230
  }
216
231
 
232
+ async updateReverseKittingIssue(orderReverseKitting, issue) {
233
+ try {
234
+ if (!issue) return
235
+ const response = await client.mutate({
236
+ mutation: gql`
237
+ mutation updateOrderReverseKitting($id: String!, $patch: OrderReverseKittingPatch!) {
238
+ updateOrderReverseKitting(id: $id, patch: $patch) {
239
+ id
240
+ name
241
+ }
242
+ }
243
+ `,
244
+ variables: { id: orderReverseKitting.id, patch: { issue } }
245
+ })
246
+
247
+ if (!response.errors) {
248
+ this._showToast({ message: i18next.t('text.issue_updated') })
249
+ this.dispatchEvent(new CustomEvent('order-reverse-kitting-data', { detail: this.data }))
250
+ history.back()
251
+ }
252
+ } catch (e) {
253
+ this._showToast(e)
254
+ }
255
+ }
256
+
217
257
  getProductCombination() {
218
258
  let operationGuide = JSON.parse(this.data.operationGuide)
219
259
  this.productCombinationSets = {
@@ -229,6 +269,25 @@ class PopupCombinationSets extends localize(i18next)(LitElement) {
229
269
  }
230
270
  }
231
271
 
272
+ _openIssueNote() {
273
+ openPopup(
274
+ html`
275
+ <popup-note
276
+ .title="${i18next.t('title.issue')}"
277
+ .value="${this.data.issue}"
278
+ @submit="${async e => {
279
+ await this.updateReverseKittingIssue(this.data, e.detail.value)
280
+ }}"
281
+ ></popup-note>
282
+ `,
283
+ {
284
+ backdrop: true,
285
+ size: 'medium',
286
+ title: i18next.t('title.issue')
287
+ }
288
+ )
289
+ }
290
+
232
291
  _openPopupReverseKittingTemplate(record) {
233
292
  openPopup(
234
293
  html`
@@ -247,6 +306,17 @@ class PopupCombinationSets extends localize(i18next)(LitElement) {
247
306
  }
248
307
  )
249
308
  }
309
+
310
+ _showToast({ type, message }) {
311
+ document.dispatchEvent(
312
+ new CustomEvent('notify', {
313
+ detail: {
314
+ type,
315
+ message
316
+ }
317
+ })
318
+ )
319
+ }
250
320
  }
251
321
 
252
322
  window.customElements.define('popup-combination-sets', PopupCombinationSets)
@@ -7,7 +7,7 @@ import { css, html, LitElement } from 'lit-element'
7
7
  import { MultiColumnFormStyles } from '@things-factory/form-ui'
8
8
  import { i18next, localize } from '@things-factory/i18n-base'
9
9
  import { openPopup } from '@things-factory/layout-base'
10
- import { client } from '@things-factory/shell'
10
+ import { client, CustomAlert } from '@things-factory/shell'
11
11
  import { isMobileDevice } from '@things-factory/utils'
12
12
 
13
13
  class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
@@ -20,8 +20,11 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
20
20
  actualQty: Number,
21
21
  incompleteLocationName: Boolean,
22
22
  locations: Array,
23
+ _selectedInventory: Object,
23
24
  reverseKittingInventoriesConfig: Object,
24
- _reverseKittingInventories: Array
25
+ _reverseKittingInventories: Array,
26
+ _palletId: String,
27
+ _locationCode: String
25
28
  }
26
29
  }
27
30
 
@@ -62,11 +65,8 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
62
65
  color: var(--grist-title-icon-color);
63
66
  }
64
67
  .button-container {
65
- padding: var(--button-container-padding);
66
- margin: var(--button-container-margin);
67
- text-align: var(--button-container-align);
68
- background-color: var(--button-container-background);
69
- height: var(--button-container-height);
68
+ padding: 10px 0 12px 0;
69
+ text-align: center;
70
70
  }
71
71
  `
72
72
  ]
@@ -99,13 +99,23 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
99
99
  <legend>${this.productSku} [ ${this.actualQty} / ${this.qty} ]</legend>
100
100
 
101
101
  <label>${i18next.t('label.lot_id')}</label>
102
- <barcode-scanable-input name="palletId" without-enter custom-input></barcode-scanable-input>
102
+ <barcode-scanable-input
103
+ name="palletId"
104
+ value="${this._palletId}"
105
+ without-enter
106
+ custom-input
107
+ ></barcode-scanable-input>
103
108
 
104
109
  <label>${i18next.t('label.qty')}</label>
105
- <input name="qty" type="number" min="1" />
110
+ <input name="qty" type="number" value="" min="1" />
106
111
 
107
112
  <label>${i18next.t('label.location')}</label>
108
- <barcode-scanable-input name="locationCode" without-enter custom-input></barcode-scanable-input>
113
+ <barcode-scanable-input
114
+ name="locationCode"
115
+ value="${this._locationCode}"
116
+ without-enter
117
+ custom-input
118
+ ></barcode-scanable-input>
109
119
  </fieldset>
110
120
  </form>
111
121
 
@@ -118,12 +128,21 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
118
128
  .config=${this.reverseKittingInventoriesConfig}
119
129
  .data=${this._reverseKittingInventories}
120
130
  ></data-grist>
121
- </div>`
131
+ </div>
132
+ <div class="button-container">
133
+ <mwc-button
134
+ raised
135
+ @click=${this._undoInventory.bind(this)}
136
+ label="${i18next.t('button.undo')}"
137
+ ></mwc-button>
138
+ </div> `
122
139
  : ''}
123
140
  `
124
141
  }
125
142
 
126
143
  async firstUpdated() {
144
+ this._palletId = ''
145
+ this._locationCode = ''
127
146
  this.productSku = this.data.productSku
128
147
  this.qty = this.data.qty
129
148
  this.actualQty = this.data.actualQty
@@ -133,7 +152,10 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
133
152
  appendable: false,
134
153
  handlers: {
135
154
  click: (columns, data, column, record, rowIndex) => {
136
- return
155
+ this._selectedInventory = record
156
+ this._palletId = record.palletId
157
+ this._locationCode = record.locationCode
158
+ this._fillUpForm(this.inputForm, record)
137
159
  }
138
160
  }
139
161
  },
@@ -202,8 +224,11 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
202
224
  async _fetchInventories() {
203
225
  const response = await client.query({
204
226
  query: gql`
205
- query reverseKittingInventories($orderReverseKittingName: String!) {
206
- reverseKittingInventories(orderReverseKittingName: $orderReverseKittingName) {
227
+ query reverseKittingInventories($orderReverseKittingName: String!, $productDetailId: String) {
228
+ reverseKittingInventories(
229
+ orderReverseKittingName: $orderReverseKittingName
230
+ productDetailId: $productDetailId
231
+ ) {
207
232
  batchId
208
233
  packingType
209
234
  bizplace {
@@ -218,6 +243,11 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
218
243
  qty
219
244
  expirationDate
220
245
  status
246
+ location {
247
+ id
248
+ name
249
+ description
250
+ }
221
251
  product {
222
252
  id
223
253
  name
@@ -227,7 +257,7 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
227
257
  }
228
258
  }
229
259
  `,
230
- variables: { orderReverseKittingName: this.orderReverseKittingName }
260
+ variables: { orderReverseKittingName: this.orderReverseKittingName, productDetailId: this.data.productDetailId }
231
261
  })
232
262
 
233
263
  if (!response.errors) {
@@ -237,15 +267,24 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
237
267
  return {
238
268
  ...reverseKittingInventory,
239
269
  sku: reverseKittingInventory.product.sku,
240
- packingTypeSize: `${reverseKittingInventory.packingType}(${reverseKittingInventory.packingSize})`
270
+ packingTypeSize: `${reverseKittingInventory.packingType}(${reverseKittingInventory.packingSize})`,
271
+ locationCode: reverseKittingInventory.location.name
241
272
  }
242
273
  }) || []
243
274
  }
275
+
276
+ let totalActualQty = 0
277
+ response.data.reverseKittingInventories.forEach(inventory => {
278
+ totalActualQty += inventory.qty
279
+ })
280
+
281
+ this.actualQty = totalActualQty
244
282
  }
245
283
  }
246
284
 
247
285
  async _executeReverseKitting(e) {
248
286
  if (e.keyCode === 13) {
287
+ e.preventDefault()
249
288
  try {
250
289
  await this._validateReverseKitting()
251
290
  if (!this.incompleteLocationName) {
@@ -266,8 +305,8 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
266
305
  }
267
306
  })
268
307
  if (!response.errors) {
269
- this.dispatchEvent(new CustomEvent('updated'))
270
- history.back()
308
+ this._clearView()
309
+ await this._fetchInventories()
271
310
  }
272
311
  } else {
273
312
  this._openSelectLocationPopup()
@@ -278,6 +317,41 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
278
317
  }
279
318
  }
280
319
 
320
+ async _undoInventory() {
321
+ try {
322
+ this._validateSelectedInventory()
323
+ const result = await CustomAlert({
324
+ title: i18next.t('title.are_you_sure'),
325
+ text: i18next.t('text.undo_x', { state: { x: this._palletId } }),
326
+ confirmButton: { text: i18next.t('button.confirm') },
327
+ cancelButton: { text: i18next.t('button.cancel') }
328
+ })
329
+
330
+ if (!result.value) {
331
+ return
332
+ }
333
+
334
+ let response = await client.mutate({
335
+ mutation: gql`
336
+ mutation undoReverseKittingInventory($orderReverseKittingName: String!, $palletId: String!) {
337
+ undoReverseKittingInventory(orderReverseKittingName: $orderReverseKittingName, palletId: $palletId)
338
+ }
339
+ `,
340
+ variables: {
341
+ orderReverseKittingName: this.orderReverseKittingName,
342
+ palletId: this._palletId.trim()
343
+ }
344
+ })
345
+
346
+ if (!response.errors) {
347
+ this._clearView()
348
+ await this._fetchInventories()
349
+ }
350
+ } catch (e) {
351
+ this._showToast(e)
352
+ }
353
+ }
354
+
281
355
  _fillUpForm(form, data) {
282
356
  for (let key in data) {
283
357
  Array.from(form.querySelectorAll('input')).forEach(field => {
@@ -299,12 +373,25 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
299
373
  }
300
374
  }
301
375
 
376
+ _clearView() {
377
+ this.inputForm.reset()
378
+ this._palletId = ''
379
+ this._locationCode = ''
380
+ }
381
+
302
382
  async _validateReverseKitting() {
303
383
  if (!this.palletInput.value) {
304
384
  this._focusOnPalletInput()
305
385
  throw new Error(i18next.t('text.lot_id_is_empty'))
306
386
  }
307
387
 
388
+ if (!this.qtyInput.value) {
389
+ this._focusOnQtyInput()
390
+ throw new Error(i18next.t('text.qty_is_empty'))
391
+ } else {
392
+ if (!this.qtyInput.checkValidity()) throw new Error(i18next.t('text.qty_invalid'))
393
+ }
394
+
308
395
  // 4. location code existing
309
396
  if (!this.locationInput.value) {
310
397
  this._focusOnLocationInput()
@@ -327,6 +414,10 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
327
414
  }
328
415
  }
329
416
 
417
+ _validateSelectedInventory() {
418
+ if (!this._selectedInventory) throw new Error(i18next.t('text.target_does_not_selected'))
419
+ }
420
+
330
421
  async _fetchLocations(zone, row, column) {
331
422
  const filters = [
332
423
  {
@@ -420,6 +511,10 @@ class PopupReverseKittingTemplate extends localize(i18next)(LitElement) {
420
511
  setTimeout(() => this.palletInput.focus(), 100)
421
512
  }
422
513
 
514
+ _focusOnQtyInput() {
515
+ setTimeout(() => this.qtyInput.focus(), 100)
516
+ }
517
+
423
518
  _focusOnLocationInput() {
424
519
  setTimeout(() => this.locationInput.focus(), 100)
425
520
  }
package/client/route.js CHANGED
@@ -212,6 +212,18 @@ export default function route(page) {
212
212
  import('./pages/order/release-order/bulk-print-packing-list')
213
213
  return page
214
214
 
215
+ case 'create_loading_manifest':
216
+ import('./pages/manifest/create-loading-manifest')
217
+ return page
218
+
219
+ case 'loading_manifest_list':
220
+ import('./pages/manifest/loading-manifest-list')
221
+ return page
222
+
223
+ case 'loading_manifest_detail':
224
+ import('./pages/manifest/loading-manifest-detail')
225
+ return page
226
+
215
227
  /**
216
228
  * GRN Menus Section
217
229
  */
@@ -452,6 +464,10 @@ export default function route(page) {
452
464
  import('./pages/report/outbound-order-details-report')
453
465
  return page
454
466
 
467
+ case 'product_label_report':
468
+ import('./pages/report/product-label-report')
469
+ return page
470
+
455
471
  /**
456
472
  * Custom ELCCL Menus Section
457
473
  */
@@ -479,6 +495,13 @@ export default function route(page) {
479
495
  import('./pages/report/custom-elccl/elccl-delivery-order-summary')
480
496
  return page
481
497
 
498
+ /**
499
+ * Support
500
+ */
501
+ case 'inventory_comparison':
502
+ import('./pages/support/inventory-comparison')
503
+ return page
504
+
482
505
  /** Custom VAS */
483
506
  case 'reverse_kitting_orders':
484
507
  import('./pages/order/reverse-kitting-order/reverse-kitting-order-list')
@@ -1,66 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.elcclInventoryHistorySummaryReport = void 0;
3
+ exports.inventoryHistorySummaryReportQuery = exports.elcclInventoryHistorySummaryReport = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const biz_base_1 = require("@things-factory/biz-base");
6
6
  exports.elcclInventoryHistorySummaryReport = {
7
7
  async elcclInventoryHistorySummaryReport(_, params, context) {
8
8
  try {
9
9
  const { tx } = context.state;
10
- let balanceOnlyFilter = params.filters.find(data => data.name === 'balanceOnly');
11
- let bizplaceFilter = params.filters.find(data => data.name === 'bizplace');
12
- let fromDate = params.filters.find(data => data.name === 'fromDate');
13
- let toDate = params.filters.find(data => data.name === 'toDate');
14
- if (!bizplaceFilter || !fromDate || !toDate)
15
- throw 'Invalid input';
16
- const bizplace = await (0, typeorm_1.getRepository)(biz_base_1.Bizplace).findOne({
17
- id: bizplaceFilter.value
18
- });
19
- let balanceOnlyQuery = '';
20
- if (balanceOnlyFilter && balanceOnlyFilter.value) {
21
- balanceOnlyQuery = 'and (opening_qty + adjustment_qty + total_in_qty + total_out_qty + total_return_qty) > 0 ';
22
- }
23
- await tx.query(`
24
- create temp table temp_inv_history on commit drop as (
25
- select i2.pallet_id, ih.product_id::uuid, ih.packing_type, ih.batch_id,
26
- ih.id as inventory_history_id, ih.seq, ih.status, ih.transaction_type, ih.qty, ih.opening_qty, ih.weight, ih.opening_weight, ih.created_at,
27
- ih.ref_order_id::uuid as ref_order_id
28
- from inventories i2
29
- inner join reduced_inventory_histories ih on ih.pallet_id = i2.pallet_id and ih.domain_id = i2.domain_id
30
- where
31
- i2.domain_id = $1
32
- and i2.bizplace_id = $2
33
- and ih.created_at <= $3
34
- )
35
- `, [context.state.domain.id, bizplace.id, toDate.value]);
36
- await tx.query(`
37
- create temp table temp_elccl_inventory_summary on commit drop as (
38
- select src.*,
39
- opening_qty + adjustment_qty + total_in_qty + total_out_qty + total_return_qty as closing_qty,
40
- prd.name as product_name, prd.sku as product_sku, prd.description as product_description
41
- from (
42
- select ih.batch_id, ih.packing_type,
43
- min(ih.created_at) as initial_date,
44
- sum(case when (ih.transaction_type = 'UNLOADING' or ih.transaction_type = 'NEW') and rtn.id is null then qty else 0 end) as initial_qty,
45
- sum(case when ih.created_at > $1 and ih.transaction_type = 'ADJUSTMENT' then ih.qty else 0 end) as adjustment_qty,
46
- sum(case when ih.created_at < $1 then ih.qty else 0 end) as opening_qty,
47
- sum(case when ih.created_at > $1 then case when ih.qty > 0 and ih.transaction_type <> 'ADJUSTMENT' and ih.transaction_type <> 'RETURN' and rtn.id is null then ih.qty else 0 end else 0 end) as total_in_qty,
48
- sum(case when ih.created_at > $1 then case when (ih.qty < 0 and ih.transaction_type <> 'ADJUSTMENT') or ih.transaction_type = 'RETURN' then ih.qty else 0 end else 0 end) as total_out_qty,
49
- ih.product_id,
50
- sum(case when rtn.id is not null and ih.transaction_type <> 'ADJUSTMENT' and ih.created_at > $1 then qty else 0 end) as total_return_qty
51
- from temp_inv_history ih
52
- left join return_orders rtn on rtn.id = ih.ref_order_id
53
- group by ih.batch_id, ih.product_id, ih.packing_type
54
- order by batch_id
55
- ) src
56
- inner join products prd on prd.id = src.product_id
57
- where (opening_qty > 0 or total_in_qty > 0 or adjustment_qty > 0)
58
- ${balanceOnlyQuery}
59
- )
60
- `, [fromDate.value]);
61
- const total = await tx.query(`select count(*) from temp_elccl_inventory_summary`);
10
+ await inventoryHistorySummaryReportQuery(_, params, context);
11
+ const total = await tx.query(`select count(*) from temp_inventory_summary`);
62
12
  const result = await tx.query(`
63
- select * from temp_elccl_inventory_summary ORDER BY initial_date OFFSET $1 LIMIT $2
13
+ select * from temp_inventory_summary ORDER BY initial_date OFFSET $1 LIMIT $2
64
14
  `, [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]);
65
15
  let items = result.map(itm => {
66
16
  return Object.assign(Object.assign({}, itm), { batchId: itm.batch_id, packingType: itm.packing_type, openingQty: itm.opening_qty, adjustmentQty: itm.adjustment_qty, closingQty: itm.closing_qty, totalInQty: itm.total_in_qty, totalOutQty: itm.total_out_qty, totalReturnQty: itm.total_return_qty, initialQty: itm.initial_qty, initialDate: itm.initial_date, product: {
@@ -77,4 +27,64 @@ exports.elcclInventoryHistorySummaryReport = {
77
27
  }
78
28
  }
79
29
  };
30
+ async function inventoryHistorySummaryReportQuery(_, params, context) {
31
+ try {
32
+ const { tx } = context.state;
33
+ let balanceOnlyFilter = params.filters.find(data => data.name === 'balanceOnly');
34
+ let bizplaceFilter = params.filters.find(data => data.name === 'bizplace');
35
+ let fromDate = params.filters.find(data => data.name === 'fromDate');
36
+ let toDate = params.filters.find(data => data.name === 'toDate');
37
+ if (!bizplaceFilter || !fromDate || !toDate)
38
+ throw 'Invalid input';
39
+ const bizplace = await (0, typeorm_1.getRepository)(biz_base_1.Bizplace).findOne({
40
+ id: bizplaceFilter.value
41
+ });
42
+ let balanceOnlyQuery = '';
43
+ if (balanceOnlyFilter && balanceOnlyFilter.value) {
44
+ balanceOnlyQuery = 'and (opening_qty + adjustment_qty + total_in_qty + total_out_qty + total_return_qty) > 0 ';
45
+ }
46
+ await tx.query(`
47
+ create temp table temp_inv_history on commit drop as (
48
+ select i2.pallet_id, ih.product_id::uuid, ih.packing_type, ih.batch_id,
49
+ ih.id as inventory_history_id, ih.seq, ih.status, ih.transaction_type, ih.qty, ih.opening_qty, ih.weight, ih.opening_weight, ih.created_at,
50
+ ih.ref_order_id::uuid as ref_order_id
51
+ from inventories i2
52
+ inner join reduced_inventory_histories ih on ih.pallet_id = i2.pallet_id and ih.domain_id = i2.domain_id
53
+ where
54
+ i2.domain_id = $1
55
+ and i2.bizplace_id = $2
56
+ and ih.created_at <= $3
57
+ )
58
+ `, [context.state.domain.id, bizplace.id, toDate.value]);
59
+ await tx.query(`
60
+ create temp table temp_inventory_summary on commit drop as (
61
+ select src.*,
62
+ opening_qty + adjustment_qty + total_in_qty + total_out_qty + total_return_qty as closing_qty,
63
+ prd.name as product_name, prd.sku as product_sku, prd.description as product_description
64
+ from (
65
+ select ih.batch_id, ih.packing_type,
66
+ min(ih.created_at) as initial_date,
67
+ sum(case when (ih.transaction_type = 'UNLOADING' or ih.transaction_type = 'NEW') and rtn.id is null then qty else 0 end) as initial_qty,
68
+ sum(case when ih.created_at > $1 and ih.transaction_type = 'ADJUSTMENT' then ih.qty else 0 end) as adjustment_qty,
69
+ sum(case when ih.created_at < $1 then ih.qty else 0 end) as opening_qty,
70
+ sum(case when ih.created_at > $1 then case when ih.qty > 0 and ih.transaction_type <> 'ADJUSTMENT' and ih.transaction_type <> 'RETURN' and rtn.id is null then ih.qty else 0 end else 0 end) as total_in_qty,
71
+ sum(case when ih.created_at > $1 then case when (ih.qty < 0 and ih.transaction_type <> 'ADJUSTMENT') or ih.transaction_type = 'RETURN' then ih.qty else 0 end else 0 end) as total_out_qty,
72
+ ih.product_id,
73
+ sum(case when rtn.id is not null and ih.transaction_type <> 'ADJUSTMENT' and ih.created_at > $1 then qty else 0 end) as total_return_qty
74
+ from temp_inv_history ih
75
+ left join return_orders rtn on rtn.id = ih.ref_order_id
76
+ group by ih.batch_id, ih.product_id, ih.packing_type
77
+ order by batch_id
78
+ ) src
79
+ inner join products prd on prd.id = src.product_id
80
+ where (opening_qty > 0 or total_in_qty > 0 or adjustment_qty > 0)
81
+ ${balanceOnlyQuery}
82
+ )
83
+ `, [fromDate.value]);
84
+ }
85
+ catch (error) {
86
+ throw error;
87
+ }
88
+ }
89
+ exports.inventoryHistorySummaryReportQuery = inventoryHistorySummaryReportQuery;
80
90
  //# sourceMappingURL=elccl-inventory-history-summary-report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"elccl-inventory-history-summary-report.js","sourceRoot":"","sources":["../../../../../server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts"],"names":[],"mappings":";;;AAAA,qCAAsD;AAEtD,uDAAmD;AAGtC,QAAA,kCAAkC,GAAG;IAChD,KAAK,CAAC,kCAAkC,CAAC,CAAM,EAAE,MAAiB,EAAE,OAAY;QAC9E,IAAI;YACF,MAAM,EAAE,EAAE,EAAE,GAA0B,OAAO,CAAC,KAAK,CAAA;YAEnD,IAAI,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAA;YAEhF,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;YAE1E,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;YAEhE,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;gBAAE,MAAM,eAAe,CAAA;YAElE,MAAM,QAAQ,GAAa,MAAM,IAAA,uBAAa,EAAC,mBAAQ,CAAC,CAAC,OAAO,CAAC;gBAC/D,EAAE,EAAE,cAAc,CAAC,KAAK;aACzB,CAAC,CAAA;YAEF,IAAI,gBAAgB,GAAG,EAAE,CAAA;YACzB,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,EAAE;gBAChD,gBAAgB,GAAG,2FAA2F,CAAA;aAC/G;YAED,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;;;;;;;;OAYD,EACC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CACrD,CAAA;YAED,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;;;;;;;;;;;;;;;;;;YAsBI,gBAAgB;;OAErB,EACC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjB,CAAA;YAED,MAAM,KAAK,GAAQ,MAAM,EAAE,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;YAEtF,MAAM,MAAM,GAAQ,MAAM,EAAE,CAAC,KAAK,CAChC;;OAED,EACC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAClF,CAAA;YAED,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC3B,uCACK,GAAG,KACN,OAAO,EAAE,GAAG,CAAC,QAAQ,EACrB,WAAW,EAAE,GAAG,CAAC,YAAY,EAC7B,UAAU,EAAE,GAAG,CAAC,WAAW,EAC3B,aAAa,EAAE,GAAG,CAAC,cAAc,EACjC,UAAU,EAAE,GAAG,CAAC,WAAW,EAC3B,UAAU,EAAE,GAAG,CAAC,YAAY,EAC5B,WAAW,EAAE,GAAG,CAAC,aAAa,EAC9B,cAAc,EAAE,GAAG,CAAC,gBAAgB,EACpC,UAAU,EAAE,GAAG,CAAC,WAAW,EAC3B,WAAW,EAAE,GAAG,CAAC,YAAY,EAC7B,OAAO,EAAE;wBACP,EAAE,EAAE,GAAG,CAAC,UAAU;wBAClB,GAAG,EAAE,GAAG,CAAC,WAAW;wBACpB,IAAI,EAAE,GAAG,CAAC,YAAY;wBACtB,WAAW,EAAE,GAAG,CAAC,mBAAmB;qBACrC,IACF;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;SACxC;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"elccl-inventory-history-summary-report.js","sourceRoot":"","sources":["../../../../../server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts"],"names":[],"mappings":"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"}