@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
@@ -0,0 +1,280 @@
1
+ import '@things-factory/barcode-ui'
2
+ import '@things-factory/grist-ui'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html, LitElement } from 'lit-element'
6
+
7
+ import { MultiColumnFormStyles, SingleColumnFormStyles } from '@things-factory/form-ui'
8
+ import { i18next, localize } from '@things-factory/i18n-base'
9
+ import { client } from '@things-factory/shell'
10
+ import { isMobileDevice } from '@things-factory/utils'
11
+
12
+ class SerialNumberPopup extends localize(i18next)(LitElement) {
13
+ static get styles() {
14
+ return [
15
+ MultiColumnFormStyles,
16
+ SingleColumnFormStyles,
17
+ css`
18
+ :host {
19
+ padding: 10px;
20
+ display: flex;
21
+ flex-direction: column;
22
+ overflow-x: overlay;
23
+ background-color: var(--main-section-background-color);
24
+ }
25
+ .grist {
26
+ background-color: var(--main-section-background-color);
27
+ display: flex;
28
+ flex-direction: column;
29
+ flex: 1;
30
+ overflow-y: auto;
31
+ }
32
+ data-grist {
33
+ overflow-y: hidden;
34
+ flex: 1;
35
+ }
36
+ .button-container {
37
+ padding: 10px 0 12px 0;
38
+ text-align: center;
39
+ display: flex;
40
+ flex-direction: column;
41
+ }
42
+
43
+ @media (max-width: 460px) {
44
+ .single-column-form {
45
+ max-width: 100%;
46
+ }
47
+ .mobile-full-width {
48
+ grid-column: span 12 / auto;
49
+ }
50
+ }
51
+ `
52
+ ]
53
+ }
54
+
55
+ static get properties() {
56
+ return {
57
+ orderInventory: Object,
58
+ config: Object,
59
+ data: Object,
60
+ _currentSerialNumber: String
61
+ }
62
+ }
63
+
64
+ get selectedSerialInput() {
65
+ return this.shadowRoot.querySelector('input[name=selectedSerialNumber]')
66
+ }
67
+
68
+ get serialInput() {
69
+ return this.shadowRoot.querySelector('barcode-scanable-input[name=serialNumber]').shadowRoot.querySelector('input')
70
+ }
71
+
72
+ get dataGrist() {
73
+ return this.shadowRoot.querySelector('data-grist')
74
+ }
75
+
76
+ constructor() {
77
+ super()
78
+ this.clearView()
79
+ }
80
+
81
+ render() {
82
+ return html`
83
+ <form class="multi-column-form">
84
+ <fieldset>
85
+ <legend>${i18next.t('title.serial_number_list')}</legend>
86
+ </fieldset>
87
+ </form>
88
+
89
+ <div class="grist">
90
+ <data-grist
91
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
92
+ .config=${this.config}
93
+ .data="${this.data}"
94
+ ></data-grist>
95
+ </div>
96
+
97
+ <form id="input-form" class="single-column-form">
98
+ <input
99
+ name="selectedSerialNumber"
100
+ placeholder="-- Selected Serial Number --"
101
+ disabled
102
+ readonly
103
+ class="mobile-full-width"
104
+ value="${this._currentSerialNumber}"
105
+ />
106
+ <barcode-scanable-input name="serialNumber" class="mobile-full-width" custom-input></barcode-scanable-input>
107
+
108
+ <mwc-button
109
+ name="setSerialNumber"
110
+ class="mobile-full-width"
111
+ raised
112
+ @click=${this.updateSerialNumber.bind(this)}
113
+ label="${i18next.t('button.update')}"
114
+ ></mwc-button>
115
+ </form>
116
+
117
+ <div class="button-container">
118
+ <mwc-button
119
+ danger
120
+ @click=${() => {
121
+ history.back()
122
+ }}
123
+ raised
124
+ label="${i18next.t('button.back')}"
125
+ ></mwc-button>
126
+ </div>
127
+ `
128
+ }
129
+
130
+ async firstUpdated() {
131
+ this.clearView()
132
+
133
+ this.config = {
134
+ rows: {
135
+ appendable: false,
136
+ classifier: (record, rowIndex) => {
137
+ return {
138
+ emphasized: record.completed == true
139
+ }
140
+ },
141
+ handlers: {
142
+ click: async (columns, data, column, record, rowIndex) => {
143
+ try {
144
+ this.dataGrist.showSpinner()
145
+ this._currentSerialNumber = record.serialNumber
146
+ // this.selectedSerialInput.value = record.serialNumber
147
+ } catch (ex) {
148
+ console.log(ex)
149
+ } finally {
150
+ this.dataGrist.hideSpinner()
151
+ }
152
+ }
153
+ }
154
+ },
155
+ pagination: { infinite: true },
156
+ list: {
157
+ fields: ['serialNumber']
158
+ },
159
+ columns: [
160
+ { type: 'gutter', gutterName: 'sequence' },
161
+ {
162
+ type: 'string',
163
+ name: 'serialNumber',
164
+ header: i18next.t('field.serial_number'),
165
+ width: 140
166
+ }
167
+ ]
168
+ }
169
+ await this.fetchOrderInventory()
170
+ console.log()
171
+
172
+ // await this.getPalletInfo(this.replacePalletId)
173
+ }
174
+
175
+ // async pageUpdated(changes, lifecycle) {
176
+ // if (this.active) {
177
+ // await this.fetchOrderInventory()
178
+ // console.log()
179
+ // }
180
+ // }
181
+
182
+ clearView() {
183
+ this.targetInventory = null
184
+ this.data = { records: [] }
185
+ this._currentSerialNumber = ''
186
+ if (this.serialNumber) this.serialInput.value = ''
187
+ }
188
+
189
+ async fetchOrderInventory() {
190
+ try {
191
+ this.dataGrist.showSpinner()
192
+ if (this?.orderInventory?.id) {
193
+ const response = await client.query({
194
+ query: gql`
195
+ query orderInventory($id: String!) {
196
+ orderInventory(id: $id) {
197
+ id
198
+ name
199
+ serialNumber
200
+ }
201
+ }
202
+ `,
203
+ variables: { id: this.orderInventory.id }
204
+ })
205
+
206
+ if (!response.errors) {
207
+ this.orderInventory = response.data.orderInventory
208
+ this.data = {
209
+ records: (JSON.parse(response.data.orderInventory.serialNumber) || []).map(x => {
210
+ return { serialNumber: x }
211
+ })
212
+ }
213
+ }
214
+ }
215
+ } catch (error) {
216
+ throw error
217
+ } finally {
218
+ this.dataGrist.hideSpinner()
219
+ }
220
+ }
221
+
222
+ async updateSerialNumber() {
223
+ try {
224
+ this.validate()
225
+
226
+ let orderInventory = this.orderInventory
227
+ let serialNumber = JSON.parse(orderInventory.serialNumber)
228
+ let index = serialNumber.indexOf(this.selectedSerialInput.value)
229
+
230
+ if (index >= 0) {
231
+ serialNumber.splice(index, 1, this.serialInput.value)
232
+ orderInventory.serialNumber = JSON.stringify(serialNumber)
233
+
234
+ const response = await client.mutate({
235
+ mutation: gql`
236
+ mutation updateOrderInventorySerialNumber($orderInventory: OrderInventoryPatch!) {
237
+ updateOrderInventorySerialNumber(orderInventory: $orderInventory) {
238
+ id
239
+ name
240
+ serialNumber
241
+ }
242
+ }
243
+ `,
244
+ variables: {
245
+ orderInventory
246
+ }
247
+ })
248
+
249
+ if (!response.errors) {
250
+ this._currentSerialNumber = ''
251
+ this.serialInput.value = ''
252
+
253
+ this.fetchOrderInventory()
254
+ }
255
+ }
256
+ } catch (e) {
257
+ this._showToast(e)
258
+ }
259
+ }
260
+
261
+ validate() {
262
+ // validate for previous picking execution (multiple picking scanning)
263
+ if (this.selectedSerialInput.value == '') throw new Error(i18next.t('text.no_serial_number_selected'))
264
+
265
+ if (this.serialInput.value == '') throw new Error(i18next.t('text.please_key_in_new_serial_number'))
266
+ }
267
+
268
+ _showToast({ type, message }) {
269
+ document.dispatchEvent(
270
+ new CustomEvent('notify', {
271
+ detail: {
272
+ type,
273
+ message
274
+ }
275
+ })
276
+ )
277
+ }
278
+ }
279
+
280
+ window.customElements.define('serial-number-popup', SerialNumberPopup)
@@ -337,6 +337,7 @@ class WorksheetPicking extends localize(i18next)(PageView) {
337
337
  uom: record.uom,
338
338
  releaseQty: record.releaseQty,
339
339
  releaseUomValue: record.releaseUomValue,
340
+ availableQty: record.availableQty,
340
341
  completed: record.completed
341
342
  }
342
343
 
@@ -595,6 +596,14 @@ class WorksheetPicking extends localize(i18next)(PageView) {
595
596
  }
596
597
 
597
598
  async fetchOrderInventories() {
599
+ // ** duplicated
600
+ // const cartonIdColumnConfig = {
601
+ // type: 'string',
602
+ // name: 'cartonId',
603
+ // header: i18next.t('field.carton_id'),
604
+ // width: 120
605
+ // }
606
+
598
607
  if (!this._worksheetNo) return
599
608
  const response = await client.query({
600
609
  query: gql`
@@ -678,6 +687,8 @@ class WorksheetPicking extends localize(i18next)(PageView) {
678
687
  releaseUomValue
679
688
  status
680
689
  inventory {
690
+ qty
691
+ lockedQty
681
692
  product {
682
693
  name
683
694
  description
@@ -725,7 +736,9 @@ class WorksheetPicking extends localize(i18next)(PageView) {
725
736
  refNo2: worksheet.releaseGood.refNo2,
726
737
  refNo3: worksheet.releaseGood.refNo3,
727
738
  ownCollection: worksheet.releaseGood.ownTransport,
728
- releaseDate: worksheet.releaseGood.releaseDate
739
+ releaseDate: worksheet.releaseGood.releaseDate,
740
+ containerNo: worksheet.containerNo,
741
+ containerLeavingDate: worksheet.containerLeavingDate
729
742
  })
730
743
 
731
744
  if (this._worksheetStatus !== WORKSHEET_STATUS.DEACTIVATED.value) this.fetchWorksheetDetails()
@@ -738,6 +751,7 @@ class WorksheetPicking extends localize(i18next)(PageView) {
738
751
  } else {
739
752
  ordInv.productSku = ordInv.product.sku
740
753
  ordInv.releaseUomValueWithUom = ordInv.releaseUomValue.toFixed(2) + ' ' + ordInv.inventory.uom
754
+ ordInv.availableQty = ordInv.inventory.qty - ordInv.inventory.lockedQty + ordInv.releaseQty
741
755
  result.completedOrderInvs.push(ordInv)
742
756
  }
743
757
 
@@ -782,8 +796,17 @@ class WorksheetPicking extends localize(i18next)(PageView) {
782
796
  Object.assign({ description: item.description }, item, item?.inventory, item?.inventory?.location)
783
797
  )
784
798
  }
799
+ } else {
800
+ this.worksheetDetailData = { records: [] }
785
801
  }
786
802
 
803
+ // this code segment is already called inside _updateGristConfig().
804
+ // if (this.worksheetDetailData.records.some(e => e.cartonId)) {
805
+ // const palletIdColumnIdx = this.preWsdGristConfig.columns.map(c => c.name).indexOf('palletId')
806
+ // this.preWsdGristConfig.columns.splice(palletIdColumnIdx, 1, cartonIdColumnConfig)
807
+ // }
808
+
809
+ this._updateGristConfig()
787
810
  this.updateContext()
788
811
  }
789
812
  }
@@ -1092,7 +1115,10 @@ class WorksheetPicking extends localize(i18next)(PageView) {
1092
1115
  width: 120
1093
1116
  }
1094
1117
 
1095
- if (this.worksheetDetailData.records.some(e => e.cartonId)) {
1118
+ if (
1119
+ this.worksheetDetailData.records.some(e => e.cartonId) &&
1120
+ !this.preWsdGristConfig.columns.find(column => column.name === 'cartonId')
1121
+ ) {
1096
1122
  const palletIdColumnIdx = this.preWsdGristConfig.columns.map(c => c.name).indexOf('palletId')
1097
1123
  this.preWsdGristConfig.columns.splice(palletIdColumnIdx, 1, cartonIdColumnConfig)
1098
1124
  }