@things-factory/operato-wms 4.3.797 → 4.3.798

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 (34) hide show
  1. package/client/pages/components/worksheet-information-popup.js +60 -8
  2. package/client/pages/constants/order.js +7 -1
  3. package/client/pages/order/release-order/b2b/b2b-order-list.js +17 -1
  4. package/client/pages/order/release-order/release-order-detail.js +19 -0
  5. package/client/pages/order/transport-order/print-delivery-note.js +19 -1
  6. package/client/pages/outbound/loading-v2/load-by-qty.js +10 -0
  7. package/client/pages/outbound/loading-v2/loading-execution-base.js +22 -8
  8. package/client/pages/outbound/loading-v2/loading-execution.js +37 -8
  9. package/client/pages/outbound/loading-v2/loading.js +6 -0
  10. package/client/pages/outbound/loading-v2/release-good-info.js +3 -0
  11. package/client/pages/outbound/picking-product.js +25 -3
  12. package/client/pages/outbound/picking-v2/picking-execution-base.js +20 -2
  13. package/client/pages/outbound/picking-v2/picking-execution.js +4 -3
  14. package/client/pages/outbound/picking-v2/picking.js +3 -0
  15. package/client/pages/outbound/single-outbound-worksheet.js +18 -1
  16. package/client/pages/outbound/sorting-product.js +24 -1
  17. package/client/pages/outbound/worksheet-zone-picking.js +1 -0
  18. package/dist-server/graphql/resolvers/outbound/find-loadable-release-good-by-bin.js +9 -4
  19. package/dist-server/graphql/resolvers/outbound/find-loadable-release-good-by-bin.js.map +1 -1
  20. package/dist-server/graphql/resolvers/outbound/load-by-qty.js +1 -1
  21. package/dist-server/graphql/resolvers/outbound/load-by-qty.js.map +1 -1
  22. package/dist-server/graphql/resolvers/outbound/loading-worksheet-v2.js +5 -1
  23. package/dist-server/graphql/resolvers/outbound/loading-worksheet-v2.js.map +1 -1
  24. package/dist-server/graphql/resolvers/zone-worksheet/zone-worksheet.js +8 -2
  25. package/dist-server/graphql/resolvers/zone-worksheet/zone-worksheet.js.map +1 -1
  26. package/package.json +8 -8
  27. package/server/graphql/resolvers/outbound/find-loadable-release-good-by-bin.ts +7 -1
  28. package/server/graphql/resolvers/outbound/load-by-qty.ts +1 -1
  29. package/server/graphql/resolvers/outbound/loading-worksheet-v2.ts +9 -2
  30. package/server/graphql/resolvers/zone-worksheet/zone-worksheet.ts +32 -23
  31. package/translations/en.json +2 -0
  32. package/translations/ko.json +2 -0
  33. package/translations/ms.json +2 -0
  34. package/translations/zh.json +2 -0
@@ -10,7 +10,8 @@ import { store } from '@things-factory/shell'
10
10
  class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElement)) {
11
11
  static get properties() {
12
12
  return {
13
- worksheetInformation: Object
13
+ worksheetInformation: Object,
14
+ _expanded: Boolean
14
15
  }
15
16
  }
16
17
 
@@ -23,8 +24,33 @@ class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElem
23
24
  display: flex;
24
25
  flex-direction: column;
25
26
  overflow-x: overlay;
27
+ overflow-y: auto;
26
28
  background-color: var(--main-section-background-color);
27
29
  }
30
+
31
+ .expandable {
32
+ text-overflow: ellipsis;
33
+ overflow: hidden;
34
+ white-space: nowrap;
35
+ cursor: pointer;
36
+ }
37
+
38
+ textarea.expandable {
39
+ resize: none;
40
+ white-space: pre-wrap;
41
+ overflow: hidden;
42
+ font-family: inherit;
43
+ font-size: inherit;
44
+ padding: var(--input-padding, 4px);
45
+ border: var(--input-border, 1px solid #ccc);
46
+ border-radius: var(--input-border-radius, 2px);
47
+ background: var(--input-background-color, #fff);
48
+ color: var(--input-color, #333);
49
+ width: 100%;
50
+ box-sizing: border-box;
51
+ cursor: pointer;
52
+ }
53
+
28
54
  `
29
55
  ]
30
56
  }
@@ -33,6 +59,14 @@ class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElem
33
59
  return this.shadowRoot.querySelector('form#info-form')
34
60
  }
35
61
 
62
+ _expandableField(name) {
63
+ const value = this.worksheetInformation?.[name] || ''
64
+ if (this._expanded) {
65
+ return html`<textarea class="expandable" name="${name}" readonly @click="${this._toggleExpand}">${value.replace(/, /g, ',\n')}</textarea>`
66
+ }
67
+ return html`<input class="expandable" name="${name}" .value="${value}" readonly @click="${this._toggleExpand}" />`
68
+ }
69
+
36
70
  render() {
37
71
  return html`
38
72
  <form id="info-form" class="multi-column-form">
@@ -41,25 +75,28 @@ class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElem
41
75
  <input name="bizplaceName" readonly />
42
76
 
43
77
  <label>${i18next.t('label.container_no')}</label>
44
- <input name="containerNo" readonly />
78
+ ${this._expandableField('containerNo')}
45
79
 
46
80
  <label>${i18next.t('label.ref_no')}</label>
47
- <input name="refNo" readonly />
81
+ ${this._expandableField('refNo')}
48
82
 
49
83
  <label>${i18next.t('label.ref_no_2')}</label>
50
- <input name="refNo2" readonly />
84
+ ${this._expandableField('refNo2')}
51
85
 
52
86
  <label>${i18next.t('label.ref_no_3')}</label>
53
- <input name="refNo3" readonly />
87
+ ${this._expandableField('refNo3')}
88
+
89
+ <label>${i18next.t('field.rtm')}</label>
90
+ ${this._expandableField('rtm')}
54
91
 
55
92
  <label>${i18next.t('label.shipping_provider')}</label>
56
- <input name="shippingProvider" readonly />
93
+ ${this._expandableField('shippingProvider')}
57
94
 
58
95
  <label>${i18next.t('label.tracking_no')}</label>
59
- <input name="trackingNo" readonly />
96
+ ${this._expandableField('trackingNo')}
60
97
 
61
98
  <label>${i18next.t('label.status')}</label>
62
- <input name="marketplaceStatus" readonly />
99
+ ${this._expandableField('marketplaceStatus')}
63
100
 
64
101
  <label>${i18next.t('label.staging_area')}</label>
65
102
  <input name="bufferLocation" readonly />
@@ -69,6 +106,8 @@ class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElem
69
106
 
70
107
  <label>${i18next.t('label.reusable_pallet_id')}</label>
71
108
  <input name="plasticPallet" readonly />
109
+
110
+
72
111
  </fieldset>
73
112
  </form>
74
113
  `
@@ -78,6 +117,19 @@ class WorksheetInformationPopup extends connect(store)(localize(i18next)(LitElem
78
117
  if (this.worksheetInformation) this._fillUpForm(this.infoForm, this.worksheetInformation)
79
118
  }
80
119
 
120
+ _toggleExpand() {
121
+ this._expanded = !this._expanded
122
+ }
123
+
124
+ updated(changedProps) {
125
+ if (changedProps.has('_expanded') && this._expanded) {
126
+ this.shadowRoot.querySelectorAll('textarea.expandable').forEach(textarea => {
127
+ textarea.style.height = '100%'
128
+ textarea.style.minHeight = textarea.scrollHeight + 'px'
129
+ })
130
+ }
131
+ }
132
+
81
133
  _fillUpForm(form, data) {
82
134
  for (let key in data) {
83
135
  Array.from(form.querySelectorAll('input')).forEach(field => {
@@ -212,4 +212,10 @@ export const CONDITION_OF_GOODS = {
212
212
  DEFECT: { name: 'condition_of_goods_defect', value: 'DEFECT' },
213
213
  DAMAGED: { name: 'condition_of_goods_damaged', value: 'DAMAGED' },
214
214
  QUARANTINE: { name: 'condition_of_goods_quarantine', value: 'QUARANTINE' },
215
- }
215
+ }
216
+
217
+ export const RTM_OPTIONS = [
218
+ { label: 'FTL NORMAL', value: 'FTL_NORMAL' },
219
+ { label: 'FTL SPECIAL', value: 'FTL_SPECIAL' },
220
+ { label: 'LTL', value: 'LTL' }
221
+ ]
@@ -16,7 +16,7 @@ import { client, navigate, PageView } from '@things-factory/shell'
16
16
  import { CommonButtonStyles, ScrollbarStyles } from '@things-factory/styles'
17
17
  import { isMobileDevice, sleep } from '@things-factory/utils'
18
18
 
19
- import { ORDER_STATUS, ORDER_VAS_STATUS } from '../../../constants'
19
+ import { ORDER_STATUS, ORDER_VAS_STATUS, RTM_OPTIONS } from '../../../constants'
20
20
  import { fetchSettingRule } from '../../../../fetch-setting-value'
21
21
 
22
22
  import { applyParamsToFields } from '../../../../util'
@@ -282,6 +282,13 @@ class B2bOrderList extends localize(i18next)(PageView) {
282
282
  },
283
283
  value: new Date().toISOString().split('T')[0]
284
284
  },
285
+ {
286
+ label: i18next.t('field.rtm'),
287
+ name: 'rtm',
288
+ type: 'select',
289
+ props: { searchOper: 'eq' },
290
+ options: [{ value: '' }, ...RTM_OPTIONS.map(option => ({ name: option.label, value: option.value }))]
291
+ },
285
292
  {
286
293
  label: i18next.t('field.based_on_release_date'),
287
294
  name: 'isReleaseDateSearch',
@@ -416,6 +423,14 @@ class B2bOrderList extends localize(i18next)(PageView) {
416
423
  sortable: true,
417
424
  width: 120
418
425
  },
426
+ {
427
+ type: 'string',
428
+ name: 'rtm',
429
+ header: i18next.t('field.rtm'),
430
+ imex: { header: i18next.t('field.rtm'), key: 'rtm', width: 40, type: 'string' },
431
+ sortable: true,
432
+ width: 120
433
+ },
419
434
  {
420
435
  type: 'boolean',
421
436
  name: 'exportOption',
@@ -601,6 +616,7 @@ class B2bOrderList extends localize(i18next)(PageView) {
601
616
  refNo3
602
617
  exportOption
603
618
  routeId
619
+ rtm
604
620
  releaseDate
605
621
  recall
606
622
  status
@@ -30,6 +30,7 @@ import {
30
30
  ORDER_STATUS,
31
31
  ORDER_VAS_STATUS,
32
32
  PICKING_STANDARD,
33
+ RTM_OPTIONS,
33
34
  VAS_BATCH_AND_PRODUCT_TYPE,
34
35
  VAS_BATCH_NO_TYPE,
35
36
  VAS_PRODUCT_TYPE
@@ -100,6 +101,7 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
100
101
  _shippingInfo: Object,
101
102
  _selectedCountry: String,
102
103
  _selectedBillingCountry: String,
104
+ _rtm: String,
103
105
 
104
106
  /* Tab Toggle*/
105
107
  _showReleasedOrderInfo: Boolean,
@@ -583,6 +585,14 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
583
585
  <label>${i18next.t('label.contact')}</label>
584
586
  <input name="phone1" value="${this._releaseOrder.phone1}" />
585
587
 
588
+ <label>${i18next.t('field.rtm')}</label>
589
+ <select name="rtm" ?disabled="${!this?._editable}">
590
+ <option value=""></option>
591
+ ${RTM_OPTIONS.map(
592
+ option => html`<option value="${option.value}" ?selected="${option.value === this._rtm}">${option.label}</option>`
593
+ )}
594
+ </select>
595
+
586
596
  <!-- delivery -->
587
597
  <div class="header-with-checkbox">
588
598
  <label class="section-header">${i18next.t('label.delivery_address')}</label>
@@ -1559,6 +1569,7 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
1559
1569
  courierOption
1560
1570
  packingOption
1561
1571
  recall
1572
+ rtm
1562
1573
  releaseDate
1563
1574
  collectionOrderNo
1564
1575
  attachment {
@@ -2169,6 +2180,7 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
2169
2180
  this._selectedCountry = data.country
2170
2181
  this._selectedBillingCountry = data.billingCountry || data.country
2171
2182
  this._releaseOrder.billingPostalCode = data.billingPostalCode
2183
+ this._rtm = data.rtm || ''
2172
2184
  }
2173
2185
 
2174
2186
  _fillupForm(form, data) {
@@ -2216,6 +2228,7 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
2216
2228
  this.inventoryData = { records: [] }
2217
2229
  this.orderInventoryData = { records: [] }
2218
2230
  this.vasData = { records: [] }
2231
+ this._rtm = ''
2219
2232
  }
2220
2233
 
2221
2234
  async _deleteReleaseOrder() {
@@ -3043,6 +3056,12 @@ class ReleaseOrderDetail extends connect(store)(localize(i18next)(PageView)) {
3043
3056
  delete shippingOrderInfo['']
3044
3057
  delete shippingOrderInfo.matchDeliveryAddressInput
3045
3058
 
3059
+ // rtm belongs to ReleaseGood, not ShippingOrderInfo
3060
+ if ('rtm' in shippingOrderInfo) {
3061
+ releaseOrder.rtm = shippingOrderInfo.rtm || null
3062
+ delete shippingOrderInfo.rtm
3063
+ }
3064
+
3046
3065
  // If match delivery address is ticked, all the billing address info will be the same with delivery address info
3047
3066
  if (this._disableBillingAddress) {
3048
3067
  shippingOrderInfo.billingAddress = contactPointInfo.deliveryAddress1
@@ -157,6 +157,7 @@ class PrintDeliveryOrder extends localize(i18next)(PageView) {
157
157
  refNo2
158
158
  refNo3
159
159
  attentionTo
160
+ rtm
160
161
  }
161
162
  productList {
162
163
  batchNo
@@ -176,6 +177,7 @@ class PrintDeliveryOrder extends localize(i18next)(PageView) {
176
177
  fax
177
178
  email
178
179
  businessRestDay
180
+ customerCode
179
181
  }
180
182
  }
181
183
  }
@@ -379,13 +381,15 @@ class PrintDeliveryOrder extends localize(i18next)(PageView) {
379
381
  }
380
382
 
381
383
  _exportableData() {
382
- const { name, doNo, refNo, refNo2, refNo3, companyDomain, attentionTo, doDate } = {
384
+ const { name, doNo, refNo, refNo2, refNo3, companyDomain, attentionTo, doDate, rtm } = {
383
385
  ...this._orderInfo.releaseGood,
384
386
  bizplaceName: this._orderInfo.bizplace.name,
385
387
  doNo: this._orderInfo.name,
386
388
  doDate: this._orderInfo.createdDate
387
389
  }
388
390
 
391
+ const customerCode = this._deliveryContactPoint?.customerCode || ''
392
+
389
393
  const exportData = this._orderInfo.productList.map(res => {
390
394
  return {
391
395
  roNo: name,
@@ -396,6 +400,8 @@ class PrintDeliveryOrder extends localize(i18next)(PageView) {
396
400
  companyDomain,
397
401
  recipientBiz: attentionTo,
398
402
  doDate,
403
+ rtm,
404
+ customerCode,
399
405
  ...res
400
406
  }
401
407
  })
@@ -431,6 +437,18 @@ class PrintDeliveryOrder extends localize(i18next)(PageView) {
431
437
  width: 25,
432
438
  type: 'string'
433
439
  },
440
+ {
441
+ header: i18next.t('field.rtm'),
442
+ key: 'rtm',
443
+ width: 25,
444
+ type: 'string'
445
+ },
446
+ {
447
+ header: i18next.t('field.customer_code'),
448
+ key: 'customerCode',
449
+ width: 25,
450
+ type: 'string'
451
+ },
434
452
  {
435
453
  header: i18next.t('field.company'),
436
454
  key: 'companyDomain',
@@ -108,6 +108,16 @@ class LoadByQty extends localize(i18next)(LitElement) {
108
108
  if (isNaN(qty) || qty < 0) {
109
109
  throw new Error(`Invalid quantity for product ${data.productName}. Quantity must be a number greater than 0.`)
110
110
  }
111
+
112
+ const isInventoryDecimal = data.relatedOrderInv?.product?.isInventoryDecimal === true
113
+ if (!isInventoryDecimal && !Number.isInteger(qty)) {
114
+ const sku = data.relatedOrderInv?.product?.sku || data.productSku || data.productName
115
+ throw new Error(
116
+ i18next.t('text.decimal_not_allowed_for_product', { sku }) ||
117
+ `Decimal quantity is not allowed for product ${sku}`
118
+ )
119
+ }
120
+
111
121
  return {
112
122
  ...data,
113
123
  loadedQty: qty
@@ -15,15 +15,14 @@ import { openPopup } from '@things-factory/layout-base'
15
15
  import { client, CustomAlert, gqlContext } from '@things-factory/shell'
16
16
  import { CommonButtonStyles } from '@things-factory/styles'
17
17
  import { WORKSHEET_STATUS } from '../../constants'
18
- import { fetchSettingRule } from '../../../fetch-setting-value'
19
-
20
- import { showToast } from '../../../util'
18
+ import { fetchPageSettings, showToast } from '../../../util'
21
19
 
22
20
  // Constants
23
21
  const SETTINGS = {
24
22
  QC_SKU: 'qc-sku',
25
23
  DISABLE_QC: 'disable-QC-in-loading',
26
- ENABLE_TOTE_SCANNING: 'enable-tote-scanning'
24
+ ENABLE_TOTE_SCANNING: 'enable-tote-scanning',
25
+ DISPLAY_CONVERSION: 'display-conversion'
27
26
  }
28
27
 
29
28
  const TAB_TYPES = {
@@ -86,6 +85,7 @@ const FIND_LOADABLE_RELEASE_GOOD_BY_BIN = gql`
86
85
  refNo
87
86
  refNo2
88
87
  refNo3
88
+ rtm
89
89
  }
90
90
  }
91
91
  worksheetDetailInfos {
@@ -98,6 +98,7 @@ const FIND_LOADABLE_RELEASE_GOOD_BY_BIN = gql`
98
98
  status
99
99
  packingType
100
100
  packingSize
101
+ conversion
101
102
  expirationDate
102
103
  binLocation {
103
104
  name
@@ -168,6 +169,7 @@ const LOADING_WORKSHEET_V2 = gql`
168
169
  refNo2
169
170
  refNo3
170
171
  remark
172
+ rtm
171
173
  }
172
174
  }
173
175
  worksheetDetailInfos {
@@ -180,6 +182,7 @@ const LOADING_WORKSHEET_V2 = gql`
180
182
  status
181
183
  packingType
182
184
  packingSize
185
+ conversion
183
186
  expirationDate
184
187
  binLocation {
185
188
  name
@@ -310,7 +313,8 @@ export class LoadingExecutionBase extends LitElement {
310
313
  _hasRefWorksheetId: Boolean,
311
314
  toteNo: String,
312
315
  _tabCounts: Object,
313
- _needsSealing: Boolean
316
+ _needsSealing: Boolean,
317
+ _displayConversion: Boolean
314
318
  }
315
319
  }
316
320
 
@@ -936,9 +940,19 @@ export class LoadingExecutionBase extends LitElement {
936
940
  }
937
941
 
938
942
  async resetView() {
939
- this._disableQC = await fetchSettingRule(SETTINGS.DISABLE_QC)
940
- this._useQcSku = await fetchSettingRule(SETTINGS.QC_SKU)
941
- this._enableToteScanningValue = parseInt((await fetchSettingRule(SETTINGS.ENABLE_TOTE_SCANNING)) || '0', 10)
943
+ const pageSettings = await fetchPageSettings({
944
+ settings: {
945
+ name: 'name',
946
+ operator: 'in',
947
+ value: [SETTINGS.DISABLE_QC, SETTINGS.QC_SKU, SETTINGS.ENABLE_TOTE_SCANNING, SETTINGS.DISPLAY_CONVERSION]
948
+ }
949
+ })
950
+ const settingsMap = new Map(pageSettings?.settings?.map(setting => [setting.name, setting.value]) || [])
951
+
952
+ this._disableQC = settingsMap.get(SETTINGS.DISABLE_QC) === 'true'
953
+ this._useQcSku = settingsMap.get(SETTINGS.QC_SKU) === 'true'
954
+ this._enableToteScanningValue = parseInt(settingsMap.get(SETTINGS.ENABLE_TOTE_SCANNING) || '0', 10)
955
+ this._displayConversion = settingsMap.get(SETTINGS.DISPLAY_CONVERSION) === 'true'
942
956
  this._enableToteScanning = this._enableToteScanningValue >= 1
943
957
 
944
958
  let activeTab = TAB_TYPES.QC
@@ -8,7 +8,7 @@ import { i18next } from '@things-factory/i18n-base'
8
8
  import { isMobileDevice } from '@things-factory/utils'
9
9
  import { LoadingExecutionBase } from './loading-execution-base'
10
10
  import '../../components/list-view/product-list-view'
11
- import { fetchSettingRule } from '../../../fetch-setting-value'
11
+ import { fetchPageSettings } from '../../../util'
12
12
  import { CommonButtonStyles } from '@things-factory/styles'
13
13
  import { client, CustomAlert, gqlContext } from '@things-factory/shell'
14
14
  import { openPopup } from '@things-factory/layout-base'
@@ -19,7 +19,8 @@ import './loading-package-info-popup'
19
19
  const SETTINGS = {
20
20
  QC_SKU: 'qc-sku',
21
21
  DISABLE_QC: 'disable-QC-in-loading',
22
- ENABLE_TOTE_SCANNING: 'enable-tote-scanning'
22
+ ENABLE_TOTE_SCANNING: 'enable-tote-scanning',
23
+ DISPLAY_CONVERSION: 'display-conversion'
23
24
  }
24
25
 
25
26
  const TAB_TYPES = {
@@ -137,6 +138,10 @@ const QC_LIST_CONFIG = {
137
138
  type: 'row',
138
139
  content: [{ header: 'Bin No.', field: 'binLocation.name', type: 'string', style: 'font-weight: bold;' }]
139
140
  },
141
+ {
142
+ type: 'row',
143
+ content: [{ header: 'Pack Conv.', field: 'conversion', type: 'string' }]
144
+ },
140
145
  {
141
146
  type: 'valueBox',
142
147
  content: { header: 'QC Qty.', field: 'sortedQty', field2: 'pickedQty', type: 'string' }
@@ -185,6 +190,10 @@ const LOADING_LIST_CONFIG = {
185
190
  type: 'row',
186
191
  content: [{ header: 'Bin No.', field: 'binLocation.name', type: 'string', style: 'font-weight: bold;' }]
187
192
  },
193
+ {
194
+ type: 'row',
195
+ content: [{ header: 'Pack Conv.', field: 'conversion', type: 'string' }]
196
+ },
188
197
  {
189
198
  type: 'valueBox',
190
199
  content: { header: 'Ready Qty.', field: 'sortedQty', field2: 'pickedQty', type: 'string' }
@@ -590,10 +599,19 @@ export class LoadingExecution extends LoadingExecutionBase {
590
599
  }
591
600
 
592
601
  async resetView() {
593
- const disableQCSetting = await fetchSettingRule(SETTINGS.DISABLE_QC)
594
- this._disableQC = disableQCSetting === true || disableQCSetting === 'true'
595
- this._useQcSku = await fetchSettingRule(SETTINGS.QC_SKU)
596
- this._enableToteScanningValue = parseInt((await fetchSettingRule(SETTINGS.ENABLE_TOTE_SCANNING)) || '0', 10)
602
+ const pageSettings = await fetchPageSettings({
603
+ settings: {
604
+ name: 'name',
605
+ operator: 'in',
606
+ value: [SETTINGS.DISABLE_QC, SETTINGS.QC_SKU, SETTINGS.ENABLE_TOTE_SCANNING, SETTINGS.DISPLAY_CONVERSION]
607
+ }
608
+ })
609
+ const settingsMap = new Map(pageSettings?.settings?.map(setting => [setting.name, setting.value]) || [])
610
+
611
+ this._disableQC = settingsMap.get(SETTINGS.DISABLE_QC) === 'true'
612
+ this._useQcSku = settingsMap.get(SETTINGS.QC_SKU) === 'true'
613
+ this._enableToteScanningValue = parseInt(settingsMap.get(SETTINGS.ENABLE_TOTE_SCANNING) || '0', 10)
614
+ this._displayConversion = settingsMap.get(SETTINGS.DISPLAY_CONVERSION) === 'true'
597
615
  this._enableToteScanning = this._enableToteScanningValue >= 1
598
616
  this.toteNo = ''
599
617
 
@@ -641,17 +659,28 @@ export class LoadingExecution extends LoadingExecutionBase {
641
659
  }
642
660
 
643
661
  get qcListItemConfig() {
644
- return QC_LIST_CONFIG
662
+ return this._filterConversionField(QC_LIST_CONFIG)
645
663
  }
646
664
 
647
665
  get loadingListItemConfig() {
648
- return LOADING_LIST_CONFIG
666
+ return this._filterConversionField(LOADING_LIST_CONFIG)
649
667
  }
650
668
 
651
669
  get skuListItemConfig() {
652
670
  return SKU_LIST_CONFIG
653
671
  }
654
672
 
673
+ _filterConversionField(config) {
674
+ if (this._displayConversion) return config
675
+ return {
676
+ ...config,
677
+ columnRight: {
678
+ ...config.columnRight,
679
+ fields: config.columnRight.fields.filter(f => !(f.type === 'row' && f.content?.[0]?.field === 'conversion'))
680
+ }
681
+ }
682
+ }
683
+
655
684
  get deliveryOrderConfig() {
656
685
  return this._deliveryOrderConfig
657
686
  }
@@ -95,6 +95,7 @@ const FIND_LOADABLE_RELEASE_GOOD_BY_BIN = gql`
95
95
  refNo
96
96
  refNo2
97
97
  refNo3
98
+ rtm
98
99
  }
99
100
  }
100
101
  worksheetDetailInfos {
@@ -107,6 +108,7 @@ const FIND_LOADABLE_RELEASE_GOOD_BY_BIN = gql`
107
108
  status
108
109
  packingType
109
110
  packingSize
111
+ conversion
110
112
  expirationDate
111
113
  binLocation {
112
114
  name
@@ -165,6 +167,7 @@ const LOADING_WORKSHEET_V2 = gql`
165
167
  refNo2
166
168
  refNo3
167
169
  remark
170
+ rtm
168
171
  }
169
172
  }
170
173
  worksheetDetailInfos {
@@ -177,6 +180,7 @@ const LOADING_WORKSHEET_V2 = gql`
177
180
  status
178
181
  packingType
179
182
  packingSize
183
+ conversion
180
184
  expirationDate
181
185
  binLocation {
182
186
  name
@@ -258,6 +262,7 @@ const GET_LOADING_TASK = gql`
258
262
  refNo2
259
263
  refNo3
260
264
  remark
265
+ rtm
261
266
  }
262
267
  }
263
268
  worksheetDetailInfos {
@@ -270,6 +275,7 @@ const GET_LOADING_TASK = gql`
270
275
  status
271
276
  packingType
272
277
  packingSize
278
+ conversion
273
279
  expirationDate
274
280
  binLocation {
275
281
  name
@@ -79,6 +79,9 @@ class ReleaseGoodInfo extends localize(i18next)(LitElement) {
79
79
  <label class="worksheet-info-title">Ref 3</label>
80
80
  <label class="worksheet-info-description">: ${this.data?.releaseGood?.refNo3 || ''}</label>
81
81
 
82
+ <label class="worksheet-info-title">${i18next.t('field.rtm')}</label>
83
+ <label class="worksheet-info-description">: ${this.data?.releaseGood?.rtm || ''}</label>
84
+
82
85
  <label class="worksheet-info-title">Remark</label>
83
86
  <label class="worksheet-info-description">: ${this.data?.releaseGood?.remark || ''}</label>
84
87
 
@@ -581,7 +581,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
581
581
  settings: {
582
582
  name: 'name',
583
583
  operator: 'in',
584
- value: ['enable-bin-picking', 'camera-scan-only', 'enable-picking-random-seq', 'disable-missing-button']
584
+ value: ['enable-bin-picking', 'camera-scan-only', 'enable-picking-random-seq', 'disable-missing-button', 'display-conversion']
585
585
  }
586
586
  })
587
587
 
@@ -591,6 +591,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
591
591
  let cameraScanOnly = settingsMap.get('camera-scan-only') === 'true'
592
592
  let enablePickingRandomSeq = settingsMap.get('enable-picking-random-seq') === 'true'
593
593
  let disableMissingButton = settingsMap.get('disable-missing-button') === 'true'
594
+ let displayConversion = settingsMap.get('display-conversion') === 'true'
594
595
 
595
596
  const locationSortingTask = fetchLocationSortingRule(LOCATION_SORTING_RULE.PICKING_PRODUCT.value)
596
597
 
@@ -726,6 +727,14 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
726
727
  label: true,
727
728
  width: 140
728
729
  },
730
+ {
731
+ type: 'string',
732
+ name: 'conversion',
733
+ header: i18next.t('field.pack_conversion'),
734
+ label: true,
735
+ hidden: !displayConversion,
736
+ width: 140
737
+ },
729
738
  {
730
739
  type: 'string',
731
740
  name: 'releaseProgress',
@@ -750,7 +759,8 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
750
759
  this._pageSettings = {
751
760
  ...this._pageSettings,
752
761
  enablePickingRandomSeq: (await enablePickingRandomSeq) || false,
753
- cameraScanOnly: (await cameraScanOnly) || false
762
+ cameraScanOnly: (await cameraScanOnly) || false,
763
+ displayConversion: (await displayConversion) || false
754
764
  }
755
765
  }
756
766
 
@@ -1722,6 +1732,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
1722
1732
  recall
1723
1733
  crossDocking
1724
1734
  type
1735
+ rtm
1725
1736
  }
1726
1737
  replenishment {
1727
1738
  id
@@ -1763,6 +1774,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
1763
1774
  targetName
1764
1775
  packingType
1765
1776
  packingSize
1777
+ conversion
1766
1778
  location {
1767
1779
  name
1768
1780
  description
@@ -1818,7 +1830,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
1818
1830
  this._crossDocking = worksheetInfo.releaseGood?._crossDocking
1819
1831
  this._bizplaceName = worksheetInfo?.bizplaceName
1820
1832
  this._orderNo = this.releaseGoodNo
1821
- this._worksheetInfo = worksheetInfo
1833
+ this._worksheetInfo = { ...worksheetInfo, rtm: worksheetInfo.releaseGood?.rtm }
1822
1834
  let data = { records: this.formatWorksheetDetailInfos(worksheetDetailInfos) }
1823
1835
  this.data = { ...data }
1824
1836
 
@@ -1910,6 +1922,14 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
1910
1922
  partnerDomainId
1911
1923
  customerCompanyDomainId
1912
1924
  startedAt
1925
+ rtm
1926
+ refNo
1927
+ refNo2
1928
+ refNo3
1929
+ shippingProvider
1930
+ trackingNo
1931
+ marketplaceStatus
1932
+ containerNo
1913
1933
  }
1914
1934
  worksheetDetailInfos {
1915
1935
  hasMissingInventoryChanges
@@ -1931,6 +1951,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
1931
1951
  status
1932
1952
  packingType
1933
1953
  packingSize
1954
+ conversion
1934
1955
  location {
1935
1956
  name
1936
1957
  }
@@ -2330,6 +2351,7 @@ class PickingProduct extends connect(store)(localize(i18next)(PageView)) {
2330
2351
  targetName
2331
2352
  packingType
2332
2353
  packingSize
2354
+ conversion
2333
2355
  location {
2334
2356
  name
2335
2357
  description