@things-factory/operato-wms 3.7.14 → 3.8.2

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 (87) hide show
  1. package/client/pages/adjustment/transfer-inventory.js +390 -158
  2. package/client/pages/bulk-operation/bulk-operation.js +316 -0
  3. package/client/pages/bulk-operation/validate-ro-popup.js +445 -0
  4. package/client/pages/components/select-product-popup.js +1 -1
  5. package/client/pages/constants/inventory.js +1 -0
  6. package/client/pages/constants/location.js +33 -6
  7. package/client/pages/constants/worksheet.js +2 -2
  8. package/client/pages/inbound/inbound-worksheet.js +81 -15
  9. package/client/pages/inbound/putaway-product.js +61 -9
  10. package/client/pages/inbound/putaway-worksheet-generate-popup.js +29 -5
  11. package/client/pages/inbound/unload-product.js +80 -19
  12. package/client/pages/inbound/worksheet-putaway-return.js +14 -5
  13. package/client/pages/inbound/worksheet-putaway.js +13 -8
  14. package/client/pages/inbound/worksheet-unloading-return.js +14 -5
  15. package/client/pages/inventory/inventory-adjustment-approval.js +15 -23
  16. package/client/pages/inventory/inventory-adjustment.js +83 -79
  17. package/client/pages/inventory/inventory-by-product-detail.js +1 -1
  18. package/client/pages/inventory/inventory-by-product.js +1 -1
  19. package/client/pages/inventory/inventory-history-by-pallet.js +1 -1
  20. package/client/pages/inventory/inventory-history.js +2 -2
  21. package/client/pages/inventory/onhand-inventory.js +1 -2
  22. package/client/pages/inventory-check/create-cycle-count.js +1 -6
  23. package/client/pages/master/location-list.js +58 -17
  24. package/client/pages/order/arrival-notice/arrival-notice-detail.js +15 -8
  25. package/client/pages/order/arrival-notice/arrival-notice-list.js +87 -6
  26. package/client/pages/order/arrival-notice/arrival-notice-requests.js +83 -6
  27. package/client/pages/order/arrival-notice/create-arrival-notice.js +23 -2
  28. package/client/pages/order/arrival-notice/duplicate-arrival-notice.js +290 -25
  29. package/client/pages/order/arrival-notice/edit-product-popup.js +36 -5
  30. package/client/pages/order/release-order/b2b/b2b-order-requests.js +7 -7
  31. package/client/pages/order/release-order/b2c/b2c-order-requests.js +65 -5
  32. package/client/pages/order/release-order/release-extra-product-popup.js +12 -4
  33. package/client/pages/order/release-order/release-order-detail.js +1 -1
  34. package/client/pages/order/return-order/create-return-order.js +1 -1
  35. package/client/pages/order/return-order/return-order-detail.js +6 -5
  36. package/client/pages/order/transport-order/delivery-order-list.js +4 -1
  37. package/client/pages/outbound/inventory-assign-popup.js +1 -1
  38. package/client/pages/outbound/merged-outbound-worksheet.js +9 -5
  39. package/client/pages/outbound/picking-product.js +202 -162
  40. package/client/pages/outbound/picking-replacement-popup.js +2 -2
  41. package/client/pages/outbound/single-outbound-worksheet.js +47 -1
  42. package/client/pages/outbound/worksheet-loading.js +14 -5
  43. package/client/pages/outbound/worksheet-picking.js +10 -5
  44. package/client/pages/report/custom-elccl/elccl-inventory-report.js +31 -30
  45. package/client/pages/report/custom-elccl/elccl-inventory-summary-report.js +23 -26
  46. package/client/pages/report/inventory-pallet-storage-report.js +11 -10
  47. package/client/pages/report/inventory-report.js +41 -43
  48. package/client/pages/report/inventory-summary-report.js +25 -28
  49. package/client/pages/vas/print-product-label.js +3 -1
  50. package/client/route.js +5 -0
  51. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js +1 -1
  52. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.js.map +1 -1
  53. package/dist-server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.js +1 -1
  54. package/dist-server/graphql/resolvers/index.js +3 -1
  55. package/dist-server/graphql/resolvers/index.js.map +1 -1
  56. package/dist-server/graphql/resolvers/reports/product-label-report.js +1 -0
  57. package/dist-server/graphql/resolvers/reports/product-label-report.js.map +1 -1
  58. package/dist-server/graphql/resolvers/shipping-provider/index.js +6 -0
  59. package/dist-server/graphql/resolvers/shipping-provider/index.js.map +1 -0
  60. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js +20 -0
  61. package/dist-server/graphql/resolvers/shipping-provider/shipping-providers.js.map +1 -0
  62. package/dist-server/graphql/types/custom/elccl/elccl-inventory-report.js +1 -1
  63. package/dist-server/graphql/types/index.js +5 -2
  64. package/dist-server/graphql/types/index.js.map +1 -1
  65. package/dist-server/graphql/types/shipping-provider/index.js +10 -0
  66. package/dist-server/graphql/types/shipping-provider/index.js.map +1 -0
  67. package/dist-server/graphql/types/shipping-provider/shipping-provider-list.js +13 -0
  68. package/dist-server/graphql/types/shipping-provider/shipping-provider-list.js.map +1 -0
  69. package/dist-server/graphql/types/shipping-provider/shipping-provider.js +13 -0
  70. package/dist-server/graphql/types/shipping-provider/shipping-provider.js.map +1 -0
  71. package/package.json +37 -37
  72. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-report.ts +4 -2
  73. package/server/graphql/resolvers/custom/elccl/elccl-inventory-history-summary-report.ts +1 -1
  74. package/server/graphql/resolvers/index.ts +3 -1
  75. package/server/graphql/resolvers/reports/product-label-report.ts +1 -0
  76. package/server/graphql/resolvers/shipping-provider/index.ts +5 -0
  77. package/server/graphql/resolvers/shipping-provider/shipping-providers.ts +20 -0
  78. package/server/graphql/types/custom/elccl/elccl-inventory-report.ts +1 -1
  79. package/server/graphql/types/index.ts +5 -2
  80. package/server/graphql/types/shipping-provider/index.ts +8 -0
  81. package/server/graphql/types/shipping-provider/shipping-provider-list.ts +7 -0
  82. package/server/graphql/types/shipping-provider/shipping-provider.ts +7 -0
  83. package/things-factory.config.js +6 -0
  84. package/translations/en.json +28 -0
  85. package/translations/ko.json +85 -36
  86. package/translations/ms.json +86 -37
  87. package/translations/zh.json +99 -51
@@ -0,0 +1,316 @@
1
+ import '@things-factory/biz-ui'
2
+ import './validate-ro-popup'
3
+
4
+ import { css, html } from 'lit-element'
5
+ import XLSX from 'xlsx'
6
+
7
+ import { MultiColumnFormStyles } from '@things-factory/form-ui'
8
+ import { i18next, localize } from '@things-factory/i18n-base'
9
+ import { openPopup } from '@things-factory/layout-base'
10
+ import { PageView } from '@things-factory/shell'
11
+
12
+ class BulkOperation extends localize(i18next)(PageView) {
13
+ static get styles() {
14
+ return [
15
+ MultiColumnFormStyles,
16
+ css`
17
+ :host {
18
+ display: block;
19
+ --menu-cards-size: 300px;
20
+ }
21
+
22
+ ul {
23
+ margin: var(--margin-wide) 0;
24
+ padding: 0;
25
+ overflow: hidden;
26
+ list-style: none;
27
+ }
28
+
29
+ li {
30
+ display: block;
31
+ float: left;
32
+ background-color: var(--main-section-background-color);
33
+ border-radius: var(--border-radius);
34
+ border: 1px solid var(--main-section-background-color);
35
+ box-shadow: var(--box-shadow);
36
+ margin: var(--margin-narrow) var(--margin-default) var(--margin-default) 0;
37
+ padding: var(--padding-default) var(--padding-default) var(--padding-narrow) var(--padding-default);
38
+ text-align: center;
39
+ }
40
+
41
+ li:hover {
42
+ border: 1px solid var(--primary-color);
43
+ }
44
+
45
+ a {
46
+ cursor: pointer;
47
+ text-decoration: none;
48
+ color: var(--secondary-color);
49
+ }
50
+
51
+ mwc-icon {
52
+ font-size: 18px;
53
+ color: var(--primary-color);
54
+ border: 1px solid rgba(0, 0, 0, 0.2);
55
+ border-radius: var(--border-radius);
56
+ background-color: var(--theme-white-color);
57
+ }
58
+
59
+ a,
60
+ span {
61
+ overflow: hidden;
62
+ white-space: nowrap;
63
+ text-overflow: ellipsis;
64
+ }
65
+
66
+ [subtitle] {
67
+ padding: var(--subtitle-padding);
68
+ font: var(--subtitle-font);
69
+ color: var(--subtitle-text-color);
70
+ text-transform: capitalize;
71
+ display: flex;
72
+ justify-content: center;
73
+ align-items: center;
74
+ }
75
+
76
+ form {
77
+ display: block;
78
+ width: var(--menu-cards-size);
79
+ }
80
+
81
+ .multi-column-form input {
82
+ min-width: 85% !important;
83
+ }
84
+
85
+ [attachment-wrap] {
86
+ display: flex;
87
+ flex-direction: row;
88
+ justify-content: center;
89
+ grid-column: span 24;
90
+ }
91
+
92
+ [attachment-wrap] file-uploader {
93
+ flex: 1;
94
+ background-color: var(--theme-white-color);
95
+ }
96
+
97
+ .button-container {
98
+ padding: var(--button-container-padding);
99
+ margin: var(--button-container-margin);
100
+ text-align: var(--button-container-align);
101
+ background-color: var(--button-container-background);
102
+ height: var(--button-container-height);
103
+ }
104
+
105
+ @media screen and (max-width: 600px) {
106
+ ul {
107
+ display: grid;
108
+ grid-template-columns: 50% 50%;
109
+ grid-gap: var(--padding-narrow);
110
+ }
111
+ [field] {
112
+ grid-column: span 2;
113
+ }
114
+ }
115
+
116
+ @media screen and (max-width: 460px) {
117
+ [attachment-wrap] {
118
+ grid-column: span 12;
119
+ }
120
+ }
121
+ @media screen and (min-width: 1201px) and (max-width: 2000px) {
122
+ [attachment-wrap] {
123
+ grid-column: span 36;
124
+ }
125
+ }
126
+ @media screen and (min-width: 2001px) {
127
+ [attachment-wrap] {
128
+ grid-column: span 48;
129
+ }
130
+ }
131
+ `
132
+ ]
133
+ }
134
+
135
+ static get properties() {
136
+ return {
137
+ _files: Array,
138
+ _releaseOrders: Array,
139
+ _bizplaceId: String,
140
+ _bizplaceName: String
141
+ }
142
+ }
143
+
144
+ constructor() {
145
+ super()
146
+ // initially act as placeholder
147
+ this._bizplaceName = i18next.t('label.company')
148
+ }
149
+
150
+ firstUpdated() {}
151
+
152
+ get context() {
153
+ return {
154
+ title: i18next.t('title.bulk_operation')
155
+ }
156
+ }
157
+
158
+ get _document() {
159
+ return this.shadowRoot.querySelector('#upload-document')
160
+ }
161
+
162
+ get _dummyData() {
163
+ return this._releaseOrders.map(x => {
164
+ x.orderInventories = x.orderInventories.map(y => {
165
+ return {
166
+ ...y,
167
+ availableQty: Math.floor(Math.random() * 50) + 30
168
+ }
169
+ })
170
+ return {
171
+ ...x,
172
+ releaseDate: new Date().toISOString().split('T')
173
+ }
174
+ })
175
+ }
176
+
177
+ render() {
178
+ let subtitle = 'Release Order'
179
+ let attachment = {
180
+ path: ''
181
+ }
182
+
183
+ return html`
184
+ <ul export-form>
185
+ <li>
186
+ <div subtitle>
187
+ ${subtitle} &nbsp;
188
+ <a href="${location.origin}/attachment/${attachment.path}" download>
189
+ <mwc-icon>file_download</mwc-icon>
190
+ </a>
191
+ </div>
192
+
193
+ <form name="input-form" class="multi-column-form" autocomplete="off">
194
+ <fieldset>
195
+ <div attachment-wrap>
196
+ <input type="hidden" name="bizplaceId" value="${this._bizplaceId}" />
197
+ <input
198
+ type="text"
199
+ name="bizplaceName"
200
+ value="${this._bizplaceName}"
201
+ @click="${this._openBizplacesSelector.bind(this)}"
202
+ />
203
+ </div>
204
+ <div attachment-wrap>
205
+ <file-uploader
206
+ name="attachments"
207
+ id="upload-document"
208
+ label="${i18next.t('label.select_file')}"
209
+ accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
210
+ custom-input
211
+ ></file-uploader>
212
+ </div>
213
+ </fieldset>
214
+ </form>
215
+
216
+ <div class="button-container">
217
+ <mwc-button raised @click="${this._extractRawDataFromExcel.bind(this)}"
218
+ >${i18next.t('button.validate')}</mwc-button
219
+ >
220
+ </div>
221
+ </li>
222
+ </ul>
223
+ `
224
+ }
225
+
226
+ updated(changeProps) {
227
+ if (changeProps.has('_rawROData')) {
228
+ if (this._releaseOrders.length) {
229
+ // this._validateReleaseOrder(this._releaseOrders)
230
+ this._validateReleaseOrder(this._rawROData)
231
+ }
232
+ }
233
+ }
234
+
235
+ _getReleaseOrderTemplate() {
236
+ /* download excel template for Create RO */
237
+ }
238
+
239
+ async _extractRawDataFromExcel() {
240
+ if (!this._bizplaceId) {
241
+ this._showToast({ level: 'error', message: `${i18next.t('text.please_select_the_company')}` })
242
+ return
243
+ }
244
+
245
+ const _docs = this._document
246
+
247
+ if (_docs && _docs.files) {
248
+ if (_docs.files.length == 1) {
249
+ const file = _docs.files[0]
250
+ const fileReader = new FileReader()
251
+
252
+ fileReader.readAsArrayBuffer(file)
253
+
254
+ fileReader.onload = e => {
255
+ /* extract rawData from .xlsx file */
256
+ const bufferArray = e.target.result
257
+ const workbook = XLSX.read(bufferArray, { type: 'buffer' })
258
+ const firstWorksheetName = workbook.SheetNames[0]
259
+ const worksheet = workbook.Sheets[firstWorksheetName]
260
+
261
+ let rawData = XLSX.utils.sheet_to_json(worksheet)
262
+ rawData = rawData.map(raw => {
263
+ if (!raw.releaseDate || raw.releaseDate.constructor !== String) raw.releaseDate = ''
264
+ else new Date(raw.releaseDate)
265
+ return raw
266
+ })
267
+ /* return rawData to validate with inventory stocks */
268
+ this._validateReleaseOrder(rawData)
269
+ }
270
+ } else if (_docs.files.length > 1)
271
+ this._showToast({ level: 'error', message: i18next.t('text.you_can_only_upload_maximum_one_file') })
272
+ else this._showToast({ level: 'error', message: i18next.t('text.please_attach_the_file') })
273
+ } else this._showToast({ level: 'error', message: i18next.t('text.please_attach_the_file') })
274
+ }
275
+
276
+ async _validateReleaseOrder(records) {
277
+ /* validate excel that user uploaded */
278
+ openPopup(html` <validate-ro-popup .records=${records} .bizplaceId=${this._bizplaceId}></validate-ro-popup> `, {
279
+ backdrop: true,
280
+ escapable: false,
281
+ size: 'large',
282
+ title: i18next.t('title.import')
283
+ })
284
+ }
285
+
286
+ _openBizplacesSelector() {
287
+ openPopup(
288
+ html`
289
+ <popup-partner-bizplaces-selector
290
+ @selected="${e => {
291
+ this._bizplaceId = e.detail.id
292
+ this._bizplaceName = e.detail.name
293
+ }}"
294
+ ></popup-partner-bizplaces-selector>
295
+ `,
296
+ {
297
+ backdrop: true,
298
+ size: 'large',
299
+ title: i18next.t('title.select_company')
300
+ }
301
+ )
302
+ }
303
+
304
+ _showToast({ level, message }) {
305
+ document.dispatchEvent(
306
+ new CustomEvent('notify', {
307
+ detail: {
308
+ level,
309
+ message
310
+ }
311
+ })
312
+ )
313
+ }
314
+ }
315
+
316
+ window.customElements.define('bulk-operation', BulkOperation)