@things-factory/operato-wms 4.3.656 → 4.3.660
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.
- package/client/pages/components/select-product-popup.js +9 -4
- package/client/pages/inbound/carton-label-popup.js +247 -13
- package/client/pages/order/arrival-notice/arrival-notice-detail.js +140 -22
- package/client/pages/order/arrival-notice/create-arrival-notice.js +272 -29
- package/client/pages/order/arrival-notice/edit-product-popup.js +513 -278
- package/client/pages/order/arrival-notice/proceed-edit-product-popup.js +193 -138
- package/client/pages/order/arrival-notice/view-product-changes-popup.js +199 -137
- package/client/pages/report/inbound-order-details-report.js +2 -2
- package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js +20 -3
- package/dist-server/graphql/resolvers/reports/inbound-order-details-report.js.map +1 -1
- package/package.json +10 -10
- package/server/graphql/resolvers/reports/inbound-order-details-report.ts +20 -3
- package/translations/en.json +4 -0
- package/translations/ko.json +5 -1
- package/translations/ms.json +5 -1
- package/translations/zh.json +5 -1
|
@@ -224,6 +224,7 @@ class SelectProductPopup extends localize(i18next)(LitElement) {
|
|
|
224
224
|
type
|
|
225
225
|
costPrice
|
|
226
226
|
isInventoryDecimal
|
|
227
|
+
isRequiredCheckExpiry
|
|
227
228
|
}
|
|
228
229
|
}
|
|
229
230
|
total
|
|
@@ -247,7 +248,8 @@ class SelectProductPopup extends localize(i18next)(LitElement) {
|
|
|
247
248
|
name: item.name,
|
|
248
249
|
description: item.product.description,
|
|
249
250
|
costPrice: (item.costPrice = (item?.costPrice || 0).toFixed(2)),
|
|
250
|
-
isInventoryDecimal: item.product.isInventoryDecimal
|
|
251
|
+
isInventoryDecimal: item.product.isInventoryDecimal,
|
|
252
|
+
isRequiredCheckExpiry: item.product.isRequiredCheckExpiry
|
|
251
253
|
}
|
|
252
254
|
}) || []
|
|
253
255
|
}
|
|
@@ -276,7 +278,8 @@ class SelectProductPopup extends localize(i18next)(LitElement) {
|
|
|
276
278
|
primaryUnit: record.uom,
|
|
277
279
|
primaryValue: record.uomValue,
|
|
278
280
|
costPrice: parseFloat(record.costPrice).toFixed(2),
|
|
279
|
-
isInventoryDecimal: record.isInventoryDecimal
|
|
281
|
+
isInventoryDecimal: record.isInventoryDecimal,
|
|
282
|
+
isRequiredCheckExpiry: record.isRequiredCheckExpiry
|
|
280
283
|
}
|
|
281
284
|
}
|
|
282
285
|
})
|
|
@@ -308,7 +311,8 @@ class SelectProductPopup extends localize(i18next)(LitElement) {
|
|
|
308
311
|
primaryUnit: selectedProduct.uom,
|
|
309
312
|
primaryValue: selectedProduct.uomValue,
|
|
310
313
|
costPrice: parseFloat(selectedProduct.costPrice).toFixed(2),
|
|
311
|
-
isInventoryDecimal: selectedProduct.isInventoryDecimal
|
|
314
|
+
isInventoryDecimal: selectedProduct.isInventoryDecimal,
|
|
315
|
+
isRequiredCheckExpiry: selectedProduct.isRequiredCheckExpiry
|
|
312
316
|
}
|
|
313
317
|
}
|
|
314
318
|
})
|
|
@@ -341,7 +345,8 @@ class SelectProductPopup extends localize(i18next)(LitElement) {
|
|
|
341
345
|
primaryUnit: itm.uom,
|
|
342
346
|
primaryValue: itm.uomValue,
|
|
343
347
|
costPrice: parseFloat(itm.costPrice).costPrice,
|
|
344
|
-
isInventoryDecimal: itm.isInventoryDecimal
|
|
348
|
+
isInventoryDecimal: itm.isInventoryDecimal,
|
|
349
|
+
isRequiredCheckExpiry: itm.isRequiredCheckExpiry
|
|
345
350
|
}
|
|
346
351
|
}
|
|
347
352
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import '@things-factory/grist-ui'
|
|
2
2
|
|
|
3
3
|
import { DirectPrinter } from '@things-factory/barcode-base'
|
|
4
|
-
import { SingleColumnFormStyles } from '@things-factory/form-ui'
|
|
4
|
+
import { MultiColumnFormStyles, SingleColumnFormStyles } from '@things-factory/form-ui'
|
|
5
5
|
import { i18next, localize } from '@things-factory/i18n-base'
|
|
6
6
|
import { client, store } from '@things-factory/shell'
|
|
7
7
|
import { css, html, LitElement } from 'lit-element'
|
|
@@ -10,7 +10,6 @@ import { sendToPrinter } from '../../util'
|
|
|
10
10
|
import { CARTON_LABEL_BY_SKU_SETTING_KEY, CARTON_LABEL_SETTING_KEY } from '../constants'
|
|
11
11
|
|
|
12
12
|
import gql from 'graphql-tag'
|
|
13
|
-
|
|
14
13
|
class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
15
14
|
static get properties() {
|
|
16
15
|
return {
|
|
@@ -20,12 +19,17 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
20
19
|
bizplaceName: String,
|
|
21
20
|
_printer: Object,
|
|
22
21
|
_filters: Array,
|
|
23
|
-
_config: Object
|
|
22
|
+
_config: Object,
|
|
23
|
+
enableDirectInbound: Boolean,
|
|
24
|
+
productGristConfig: Object,
|
|
25
|
+
productData: Object,
|
|
26
|
+
arrivalNoticeId: String
|
|
24
27
|
}
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
static get styles() {
|
|
28
31
|
return [
|
|
32
|
+
MultiColumnFormStyles,
|
|
29
33
|
SingleColumnFormStyles,
|
|
30
34
|
css`
|
|
31
35
|
:host {
|
|
@@ -55,6 +59,37 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
55
59
|
flex: 1 1 0%;
|
|
56
60
|
overflow-y: auto;
|
|
57
61
|
}
|
|
62
|
+
.form-container {
|
|
63
|
+
display: flex;
|
|
64
|
+
}
|
|
65
|
+
.form-container > form {
|
|
66
|
+
flex: 1;
|
|
67
|
+
}
|
|
68
|
+
h2 + data-grist {
|
|
69
|
+
padding=top: var(--grist-title-with-grid-padding);
|
|
70
|
+
}
|
|
71
|
+
.grist h2 mwc-icon {
|
|
72
|
+
vertical-align: middle;
|
|
73
|
+
margin: var(--grist-title-icon-margin);
|
|
74
|
+
font-size: var(--grist-title-icon-size);
|
|
75
|
+
color: var(--grist-title-icon-color);
|
|
76
|
+
}
|
|
77
|
+
.grist h2 {
|
|
78
|
+
margin: var(--grist-title-margin);
|
|
79
|
+
border: var(--grist-title-border);
|
|
80
|
+
font: var(--grist-title-font);
|
|
81
|
+
color: var(--secondary-color);
|
|
82
|
+
}
|
|
83
|
+
h2 {
|
|
84
|
+
padding: var(--subtitle-padding);
|
|
85
|
+
font: var(--subtitle-font);
|
|
86
|
+
color: var(--subtitle-text-color);
|
|
87
|
+
border-bottom: var(--subtitle-border-bottom);
|
|
88
|
+
}
|
|
89
|
+
data-grist {
|
|
90
|
+
overflow-y: hidden;
|
|
91
|
+
flex: 1;
|
|
92
|
+
}
|
|
58
93
|
`
|
|
59
94
|
]
|
|
60
95
|
}
|
|
@@ -76,9 +111,13 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
76
111
|
this.fixedType = null
|
|
77
112
|
this.type = null
|
|
78
113
|
this.bizplaceName = null
|
|
114
|
+
this.productData = { records: [] }
|
|
115
|
+
this.setProductGristConfig()
|
|
79
116
|
}
|
|
80
117
|
|
|
81
118
|
firstUpdated() {
|
|
119
|
+
this.setProductGristConfig()
|
|
120
|
+
this.fetchInventories()
|
|
82
121
|
this._config = {
|
|
83
122
|
rows: {
|
|
84
123
|
appendable: false,
|
|
@@ -129,15 +168,19 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
129
168
|
}
|
|
130
169
|
|
|
131
170
|
render() {
|
|
132
|
-
return html`
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
171
|
+
return html `
|
|
172
|
+
${this.enableDirectInbound
|
|
173
|
+
? this.renderDirectInboundPrintLayout()
|
|
174
|
+
: html`
|
|
175
|
+
<div id="input-form" class="single-column-form">
|
|
176
|
+
<label>${i18next.t('label.printing_mode')}</label>
|
|
177
|
+
${this.filterContent()}
|
|
178
|
+
</div>
|
|
179
|
+
${this.printControl()}
|
|
180
|
+
<div class="button-container">
|
|
181
|
+
<mwc-button raised @click="${this._printLabel.bind(this)}" label="${i18next.t('button.print')}"></mwc-button>
|
|
182
|
+
</div>
|
|
183
|
+
`}
|
|
141
184
|
`
|
|
142
185
|
}
|
|
143
186
|
|
|
@@ -198,11 +241,169 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
198
241
|
}
|
|
199
242
|
}
|
|
200
243
|
|
|
244
|
+
renderDirectInboundPrintLayout() {
|
|
245
|
+
return html`
|
|
246
|
+
<div class = "form-container">
|
|
247
|
+
<form name="printPopup" class="multi-column-form">
|
|
248
|
+
<fieldset>
|
|
249
|
+
<legend>${i18next.t('Print Settings')}</legend>
|
|
250
|
+
</fieldset>
|
|
251
|
+
|
|
252
|
+
<div class="form-container">
|
|
253
|
+
<label>${i18next.t('label.print_qty')}</label>
|
|
254
|
+
<input name="printQty" type="number" min="1" />
|
|
255
|
+
</div>
|
|
256
|
+
</form>
|
|
257
|
+
</div>
|
|
258
|
+
|
|
259
|
+
<div class="container">
|
|
260
|
+
<div class="grist">
|
|
261
|
+
<h2><mwc-icon>list_alt</mwc-icon>Select Product</h2>
|
|
262
|
+
<data-grist
|
|
263
|
+
id="product-grist"
|
|
264
|
+
.mode=${'GRID'}
|
|
265
|
+
.config=${this.productGristConfig}
|
|
266
|
+
.data="${this.productData}"
|
|
267
|
+
></data-grist>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
|
|
271
|
+
<div class="button-container">
|
|
272
|
+
<mwc-button raised @click="${this._printLabel.bind(this)}" label="${i18next.t('button.print')}"></mwc-button>
|
|
273
|
+
</div>
|
|
274
|
+
`
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
setProductGristConfig() {
|
|
278
|
+
let productGristColumns = [
|
|
279
|
+
{ type: 'gutter', gutterName: 'sequence' },
|
|
280
|
+
{ type: 'gutter', gutterName: 'row-selector', multiple: true},
|
|
281
|
+
{
|
|
282
|
+
type: 'string',
|
|
283
|
+
name: 'cartonId',
|
|
284
|
+
header: i18next.t('field.carton_id'),
|
|
285
|
+
width: 150
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
type: 'string',
|
|
289
|
+
name: 'batchId',
|
|
290
|
+
header: i18next.t('field.batch_id'),
|
|
291
|
+
width: 150
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
type: 'object',
|
|
295
|
+
name: 'product',
|
|
296
|
+
header: i18next.t('field.product'),
|
|
297
|
+
record: { options: { queryName: 'products' } },
|
|
298
|
+
width: 350
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
type: 'string',
|
|
302
|
+
name: 'packingType',
|
|
303
|
+
header: i18next.t('field.packing_type'),
|
|
304
|
+
width: 150
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
type: 'string',
|
|
308
|
+
name: 'uom',
|
|
309
|
+
header: i18next.t('field.uom'),
|
|
310
|
+
width: 80
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
type: 'float',
|
|
314
|
+
name: 'uomValue',
|
|
315
|
+
header: i18next.t('field.uom_value'),
|
|
316
|
+
width: 100
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
type: 'float',
|
|
320
|
+
name: 'packQty',
|
|
321
|
+
header: i18next.t('field.pack_qty'),
|
|
322
|
+
width: 80
|
|
323
|
+
}
|
|
324
|
+
]
|
|
325
|
+
|
|
326
|
+
this.productGristConfig = {
|
|
327
|
+
list: {
|
|
328
|
+
fields: [
|
|
329
|
+
'cartonId',
|
|
330
|
+
'batchId',
|
|
331
|
+
'product',
|
|
332
|
+
'packingType',
|
|
333
|
+
'uom',
|
|
334
|
+
'uomValue',
|
|
335
|
+
'packQty'
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
pagination: { infinite: true },
|
|
339
|
+
rows: {
|
|
340
|
+
appendable: false
|
|
341
|
+
},
|
|
342
|
+
columns: productGristColumns
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
async fetchInventories() {
|
|
347
|
+
if (!this.arrivalNoticeId) return
|
|
348
|
+
|
|
349
|
+
const response = await client.query({
|
|
350
|
+
query: gql`
|
|
351
|
+
query ($filters: [Filter!]) {
|
|
352
|
+
inventories(filters: $filters) {
|
|
353
|
+
items {
|
|
354
|
+
cartonId
|
|
355
|
+
batchId
|
|
356
|
+
packingType
|
|
357
|
+
uom
|
|
358
|
+
uomValue
|
|
359
|
+
qty
|
|
360
|
+
product {
|
|
361
|
+
id
|
|
362
|
+
name
|
|
363
|
+
sku
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
`,
|
|
369
|
+
variables: {
|
|
370
|
+
filters: [
|
|
371
|
+
{
|
|
372
|
+
name: 'refOrderId',
|
|
373
|
+
operator: 'eq',
|
|
374
|
+
value: this.arrivalNoticeId
|
|
375
|
+
}
|
|
376
|
+
]
|
|
377
|
+
},
|
|
378
|
+
fetchPolicy: 'no-cache'
|
|
379
|
+
})
|
|
380
|
+
|
|
381
|
+
const inventories = response?.data?.inventories?.items || []
|
|
382
|
+
|
|
383
|
+
// Optional: transform into productData format expected by the Grist
|
|
384
|
+
this.productData = {
|
|
385
|
+
records: inventories.map(item => ({
|
|
386
|
+
cartonId: item.cartonId,
|
|
387
|
+
batchId: item.batchId,
|
|
388
|
+
packingType: item.packingType,
|
|
389
|
+
uom: item.uom,
|
|
390
|
+
uomValue: item.uomValue,
|
|
391
|
+
packQty: item.qty,
|
|
392
|
+
product: item.product
|
|
393
|
+
}))
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
|
|
201
398
|
async _printLabel() {
|
|
202
399
|
if (!this._printer) {
|
|
203
400
|
this._printer = new DirectPrinter()
|
|
204
401
|
}
|
|
205
402
|
|
|
403
|
+
if (this.enableDirectInbound) {
|
|
404
|
+
this.type = 'directInboundBySku'
|
|
405
|
+
}
|
|
406
|
+
|
|
206
407
|
try {
|
|
207
408
|
const filters = this._filters
|
|
208
409
|
let labelId = filters.find(itm => itm.value == (this?.type ? this.type : 'default')).board.id
|
|
@@ -210,6 +411,38 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
210
411
|
let printData = []
|
|
211
412
|
|
|
212
413
|
switch (this.type) {
|
|
414
|
+
case 'directInboundBySku':
|
|
415
|
+
let selectedRows = this.shadowRoot.querySelector('data-grist')?.selected || []
|
|
416
|
+
const printQtyVal = parseInt(this.printQtyInput?.value) || 1
|
|
417
|
+
|
|
418
|
+
if (selectedRows.length > 0) {
|
|
419
|
+
selectedRows.forEach(obj => {
|
|
420
|
+
for (let index = 0; index < printQtyVal; index++) {
|
|
421
|
+
const manufactureDate = new Date(obj.manufactureDate)
|
|
422
|
+
const manufactureYear = manufactureDate.getFullYear()
|
|
423
|
+
|
|
424
|
+
let data = {
|
|
425
|
+
batchId: obj.batchId,
|
|
426
|
+
productSku: obj.product?.sku || obj.productSku,
|
|
427
|
+
packingType: obj.packingType,
|
|
428
|
+
packQty: obj.packQty,
|
|
429
|
+
printQty: printQtyVal,
|
|
430
|
+
manufactureDate: manufactureDate.toLocaleDateString(),
|
|
431
|
+
manufactureYear: manufactureYear.toString(),
|
|
432
|
+
cartonId: obj.cartonId,
|
|
433
|
+
customer: bizplaceName,
|
|
434
|
+
printCount: index + 1,
|
|
435
|
+
carton: obj.cartonId
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
printData.push(data)
|
|
439
|
+
}
|
|
440
|
+
})
|
|
441
|
+
|
|
442
|
+
await sendToPrinter(labelId, printData, this._printer)
|
|
443
|
+
}
|
|
444
|
+
break
|
|
445
|
+
|
|
213
446
|
case 'bySku':
|
|
214
447
|
let selected = this.dataGrist.selected
|
|
215
448
|
|
|
@@ -289,7 +522,8 @@ class CartonLabelPopup extends connect(store)(localize(i18next)(LitElement)) {
|
|
|
289
522
|
stateChanged(state) {
|
|
290
523
|
let filters = [
|
|
291
524
|
{ name: i18next.t(`label.normal`), value: 'default', labelId: CARTON_LABEL_SETTING_KEY },
|
|
292
|
-
{ name: i18next.t(`label.print_by_sku`), value: 'bySku', labelId: CARTON_LABEL_BY_SKU_SETTING_KEY }
|
|
525
|
+
{ name: i18next.t(`label.print_by_sku`), value: 'bySku', labelId: CARTON_LABEL_BY_SKU_SETTING_KEY },
|
|
526
|
+
{ name: 'Direct Inbound by SKU', value: 'directInboundBySku', labelId: CARTON_LABEL_BY_SKU_SETTING_KEY}
|
|
293
527
|
]
|
|
294
528
|
|
|
295
529
|
this._filters = filters
|
|
@@ -68,7 +68,9 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
68
68
|
vasData: Object,
|
|
69
69
|
arrivalNoticeId: String,
|
|
70
70
|
_disableTransport: Boolean,
|
|
71
|
-
userRole: Array
|
|
71
|
+
userRole: Array,
|
|
72
|
+
enableDirectInbound: Boolean,
|
|
73
|
+
_enableLotIdInput: Boolean
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
|
|
@@ -184,6 +186,8 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
184
186
|
var titleName = i18next.t('title.arrival_notice_detail')
|
|
185
187
|
this._vasExpanded = false
|
|
186
188
|
this._showAssignWarehouse = false
|
|
189
|
+
const isNotAdmin = !this.userRoles?.some(itm => itm.name.toLowerCase().includes('admin'))
|
|
190
|
+
|
|
187
191
|
var actions = [
|
|
188
192
|
{
|
|
189
193
|
title: i18next.t('button.back'),
|
|
@@ -203,6 +207,14 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
203
207
|
})
|
|
204
208
|
}
|
|
205
209
|
|
|
210
|
+
if(this.enableDirectInbound && this._status === ORDER_STATUS.PENDING.value && isNotAdmin) {
|
|
211
|
+
actions.push({
|
|
212
|
+
title: i18next.t('button.edit_product'),
|
|
213
|
+
action: this.openEditProductPopup.bind(this),
|
|
214
|
+
...CommonButtonStyles.add
|
|
215
|
+
})
|
|
216
|
+
}
|
|
217
|
+
|
|
206
218
|
if (this._status === ORDER_STATUS.PENDING.value) {
|
|
207
219
|
actions.push({
|
|
208
220
|
title: i18next.t('button.update_order_details'),
|
|
@@ -406,6 +418,13 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
406
418
|
titleName = i18next.t('title.rejected_arrival_notice_detail')
|
|
407
419
|
}
|
|
408
420
|
|
|
421
|
+
if(this.enableDirectInbound && this._status === ORDER_STATUS.DONE.value) {
|
|
422
|
+
actions.push({
|
|
423
|
+
title: i18next.t('button.carton_label_print'),
|
|
424
|
+
action: this._openCartonLabelPrintPopup.bind(this),
|
|
425
|
+
...CommonButtonStyles.label
|
|
426
|
+
})
|
|
427
|
+
}
|
|
409
428
|
return {
|
|
410
429
|
title: titleName,
|
|
411
430
|
actions,
|
|
@@ -643,6 +662,8 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
643
662
|
this._disableTransport = false
|
|
644
663
|
this._importedOrder = false
|
|
645
664
|
this._enableTransportationServiceSetting = false
|
|
665
|
+
this.enableDirectInbound = false
|
|
666
|
+
this._enableLotIdInput = false
|
|
646
667
|
}
|
|
647
668
|
|
|
648
669
|
get arrivalNoticeForm() {
|
|
@@ -674,6 +695,8 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
674
695
|
this._enableTransportationServiceSetting = await fetchSettingRule('enable-transportation-service')
|
|
675
696
|
this.isUserBelongsDomain = await this._checkUserBelongsDomain()
|
|
676
697
|
this.userRoles = await this.fetchUserRoleHandler()
|
|
698
|
+
this._enableLotIdInput = await fetchSettingRule('enable-lot-id-input')
|
|
699
|
+
this.enableDirectInbound = await fetchSettingRule('enable-direct-gan-order')
|
|
677
700
|
this.vasGristConfig = {
|
|
678
701
|
list: { fields: ['set', 'targetType', 'target', 'packingType', 'qty', 'vas', 'status', 'remark'] },
|
|
679
702
|
pagination: { infinite: true },
|
|
@@ -866,12 +889,18 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
866
889
|
header: i18next.t('field.pallet_qty'),
|
|
867
890
|
width: 80
|
|
868
891
|
},
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
892
|
+
...(this._enableLotIdInput
|
|
893
|
+
? [
|
|
894
|
+
{
|
|
895
|
+
type: 'string',
|
|
896
|
+
name: 'palletId',
|
|
897
|
+
header: i18next.t('field.lot_id'),
|
|
898
|
+
imex: { header: i18next.t('field.lot_id'), key: 'palletId', width: 25, type: 'string' },
|
|
899
|
+
record: { editable: editable },
|
|
900
|
+
width: 150
|
|
901
|
+
}
|
|
902
|
+
]
|
|
903
|
+
: []),
|
|
875
904
|
{
|
|
876
905
|
type: 'date',
|
|
877
906
|
name: 'manufactureDate',
|
|
@@ -904,6 +933,47 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
904
933
|
productGristColumns.splice(packQtyColumnIdx + 1, 0, ...crossDockingColumns)
|
|
905
934
|
}
|
|
906
935
|
|
|
936
|
+
const expDateColumn = {
|
|
937
|
+
type: 'date',
|
|
938
|
+
name: 'expDate',
|
|
939
|
+
header: i18next.t('field.exp_date'),
|
|
940
|
+
width: 120
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
const locationColumn = {
|
|
944
|
+
type: 'object',
|
|
945
|
+
name: 'location',
|
|
946
|
+
header: i18next.t('field.location'),
|
|
947
|
+
width: 150
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
const warehouseColumn = {
|
|
951
|
+
type: 'object',
|
|
952
|
+
name: 'warehouse',
|
|
953
|
+
header: i18next.t('field.warehouse'),
|
|
954
|
+
width: 150
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
function insertAfter (cols, anchorName, newCols) {
|
|
958
|
+
const idx = cols.findIndex(c => c.name === anchorName)
|
|
959
|
+
if (idx >= 0) cols.splice(idx + 1, 0, ...newCols)
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
if (this.enableDirectInbound) {
|
|
963
|
+
const anchor = this._enableLotIdInput ? 'palletId' : 'palletQty'
|
|
964
|
+
insertAfter(
|
|
965
|
+
productGristColumns,
|
|
966
|
+
anchor,
|
|
967
|
+
[expDateColumn]
|
|
968
|
+
)
|
|
969
|
+
|
|
970
|
+
insertAfter(
|
|
971
|
+
productGristColumns,
|
|
972
|
+
'batchIdRef',
|
|
973
|
+
[warehouseColumn, locationColumn]
|
|
974
|
+
)
|
|
975
|
+
}
|
|
976
|
+
|
|
907
977
|
this.productGristConfig = {
|
|
908
978
|
list: {
|
|
909
979
|
fields: [
|
|
@@ -918,8 +988,11 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
918
988
|
'totalUomValue',
|
|
919
989
|
'palletQty',
|
|
920
990
|
'palletId',
|
|
991
|
+
'expDate',
|
|
921
992
|
'manufactureDate',
|
|
922
993
|
'batchIdRef',
|
|
994
|
+
'warehouse',
|
|
995
|
+
'location',
|
|
923
996
|
'unitPrice',
|
|
924
997
|
'remark'
|
|
925
998
|
]
|
|
@@ -991,6 +1064,7 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
991
1064
|
sku
|
|
992
1065
|
brand
|
|
993
1066
|
isInventoryDecimal
|
|
1067
|
+
isRequiredCheckExpiry
|
|
994
1068
|
}
|
|
995
1069
|
productDetail {
|
|
996
1070
|
id
|
|
@@ -1013,9 +1087,27 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1013
1087
|
palletQty
|
|
1014
1088
|
palletId
|
|
1015
1089
|
adjustedPalletQty
|
|
1090
|
+
expDate
|
|
1091
|
+
adjustedExpDate
|
|
1016
1092
|
manufactureDate
|
|
1017
1093
|
releaseQty
|
|
1018
1094
|
releaseUomValue
|
|
1095
|
+
warehouse{
|
|
1096
|
+
name
|
|
1097
|
+
id
|
|
1098
|
+
}
|
|
1099
|
+
location {
|
|
1100
|
+
name
|
|
1101
|
+
id
|
|
1102
|
+
}
|
|
1103
|
+
adjustedLocation {
|
|
1104
|
+
name
|
|
1105
|
+
id
|
|
1106
|
+
}
|
|
1107
|
+
adjustedWarehouse {
|
|
1108
|
+
name
|
|
1109
|
+
id
|
|
1110
|
+
}
|
|
1019
1111
|
}
|
|
1020
1112
|
orderVass {
|
|
1021
1113
|
vas {
|
|
@@ -1084,7 +1176,7 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1084
1176
|
return {
|
|
1085
1177
|
...record,
|
|
1086
1178
|
productSku: record.product.sku,
|
|
1087
|
-
productBrand: record.product.brand
|
|
1179
|
+
productBrand: record.product.brand,
|
|
1088
1180
|
}
|
|
1089
1181
|
})
|
|
1090
1182
|
.sort((a, b) => a.product.sku.localeCompare(b.product.sku))
|
|
@@ -1523,14 +1615,23 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1523
1615
|
}
|
|
1524
1616
|
|
|
1525
1617
|
try {
|
|
1526
|
-
const
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1618
|
+
const mutation = this.enableDirectInbound
|
|
1619
|
+
? gql`
|
|
1620
|
+
mutation confirmDirectInboundArrivalNotice($name: String!) {
|
|
1621
|
+
confirmDirectInboundArrivalNotice(name: $name) {
|
|
1622
|
+
name
|
|
1623
|
+
}
|
|
1531
1624
|
}
|
|
1532
|
-
|
|
1533
|
-
|
|
1625
|
+
`
|
|
1626
|
+
: gql `
|
|
1627
|
+
mutation confirmArrivalNotice($name: String!) {
|
|
1628
|
+
confirmArrivalNotice(name: $name) {
|
|
1629
|
+
name
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
`
|
|
1633
|
+
const response = await client.mutate({
|
|
1634
|
+
mutation,
|
|
1534
1635
|
variables: { name: this._ganNo }
|
|
1535
1636
|
})
|
|
1536
1637
|
|
|
@@ -1684,10 +1785,17 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1684
1785
|
|
|
1685
1786
|
_openCartonLabelPrintPopup() {
|
|
1686
1787
|
openPopup(
|
|
1687
|
-
html`
|
|
1788
|
+
html`
|
|
1789
|
+
<carton-label-popup
|
|
1790
|
+
.fixedType="${'default'}"
|
|
1791
|
+
.bizplaceName="${this._bizplaceName}"
|
|
1792
|
+
.enableDirectInbound="${this.enableDirectInbound}"
|
|
1793
|
+
.productData="${this.productData}"
|
|
1794
|
+
.arrivalNoticeId="${this.arrivalNoticeId}"
|
|
1795
|
+
></carton-label-popup>
|
|
1796
|
+
`,
|
|
1688
1797
|
{
|
|
1689
1798
|
backdrop: true,
|
|
1690
|
-
size: 'small',
|
|
1691
1799
|
title: i18next.t('title.carton_label')
|
|
1692
1800
|
}
|
|
1693
1801
|
)
|
|
@@ -1706,6 +1814,7 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1706
1814
|
.productData="${this.productData}"
|
|
1707
1815
|
.bizplace="${this.orderBizplace}"
|
|
1708
1816
|
.strictEditable="${this._strictProductSelection}"
|
|
1817
|
+
.enableDirectInbound="${this.enableDirectInbound}"
|
|
1709
1818
|
@completed="${this._fetchGAN.bind(this)}"
|
|
1710
1819
|
></edit-product-popup>
|
|
1711
1820
|
`,
|
|
@@ -1724,6 +1833,7 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1724
1833
|
.ganNo="${this._ganNo}"
|
|
1725
1834
|
.bizplace="${this.orderBizplace}"
|
|
1726
1835
|
.data="${this.productData}"
|
|
1836
|
+
.enableDirectInbound="${this.enableDirectInbound}"
|
|
1727
1837
|
@completed="${() => {
|
|
1728
1838
|
this._fetchGAN()
|
|
1729
1839
|
this.updateContext()
|
|
@@ -1756,11 +1866,19 @@ class ArrivalNoticeDetail extends localize(i18next)(PageView) {
|
|
|
1756
1866
|
}
|
|
1757
1867
|
|
|
1758
1868
|
openProductChangesPopup() {
|
|
1759
|
-
openPopup(
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1869
|
+
openPopup(
|
|
1870
|
+
html`
|
|
1871
|
+
<view-product-changes-popup
|
|
1872
|
+
.data="${this.productData}"
|
|
1873
|
+
.enableDirectInbound="${this.enableDirectInbound}"
|
|
1874
|
+
></view-product-changes-popup>
|
|
1875
|
+
`,
|
|
1876
|
+
{
|
|
1877
|
+
backdrop: true,
|
|
1878
|
+
size: 'large',
|
|
1879
|
+
title: i18next.t('title.view_product_changes')
|
|
1880
|
+
}
|
|
1881
|
+
)
|
|
1764
1882
|
}
|
|
1765
1883
|
|
|
1766
1884
|
async fetchUserRoleHandler() {
|