@things-factory/operato-wms 4.3.789 → 4.3.790

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.
@@ -1304,56 +1304,107 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1304
1304
  try {
1305
1305
  patches = patches.map(patch => normalizeInventoryPatch(patch))
1306
1306
 
1307
- patches.map(itm => {
1307
+ const validAdjustmentCodes = new Set(
1308
+ Object.values(ADJUSTMENT_CODE).map(ac => ac.value)
1309
+ )
1310
+
1311
+ // Fetch fresh locations for client-side validation (avoid stale cache)
1312
+ await this.fetchLocation()
1313
+ const locationNameSet = new Set((this._locations || []).map(l => l.name))
1314
+
1315
+ patches.forEach(itm => {
1316
+ const errors = []
1317
+ delete itm.errMsg
1318
+
1308
1319
  if (toFloatOrUndefined(itm?.uomValue) < 0) {
1309
- throw new Error(i18next.t('text.invalid_uom_value'))
1320
+ errors.push(i18next.t('text.invalid_uom_value'))
1310
1321
  }
1311
1322
  if (toFloatOrUndefined(itm?.qty) < 0) {
1312
- throw new Error(i18next.t('text.invalid_qty'))
1323
+ errors.push(i18next.t('text.invalid_qty'))
1313
1324
  }
1314
1325
  if (itm?.packingType?.trim() == '') {
1315
- throw new Error(i18next.t('text.invalid_packing_type'))
1326
+ errors.push(i18next.t('text.invalid_packing_type'))
1316
1327
  }
1317
1328
  if (toFloatOrUndefined(itm?.unitCost) < 0) {
1318
- throw new Error(i18next.t('text.invalid_unit_cost'))
1329
+ errors.push(i18next.t('text.invalid_unit_cost'))
1319
1330
  }
1320
1331
  if (new Date(itm?.manufactureDate) > new Date()) {
1321
- throw new Error(i18next.t('text.invalid_manufacture_date'))
1332
+ errors.push(i18next.t('text.invalid_manufacture_date'))
1322
1333
  }
1323
- if (
1324
- itm?.adjustmentCode?.trim() == '' ||
1325
- (itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC01.value &&
1326
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC02.value &&
1327
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC03.value &&
1328
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC04.value &&
1329
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC05.value &&
1330
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC06.value &&
1331
- itm?.adjustmentCode?.trim() != ADJUSTMENT_CODE.AC07.value)
1332
- ) {
1333
- throw new Error(i18next.t('text.adjustment_code_is_required_kindly_fill_in_the_adjustment_code_to_continue'))
1334
+ if (!itm?.adjustmentCode?.trim() || !validAdjustmentCodes.has(itm.adjustmentCode.trim())) {
1335
+ errors.push(i18next.t('text.adjustment_code_is_required_kindly_fill_in_the_adjustment_code_to_continue'))
1334
1336
  }
1335
1337
  if (itm?.adjustmentNote?.trim() == '') {
1336
- throw new Error(i18next.t('text.invalid_adjustment_note'))
1338
+ errors.push(i18next.t('text.invalid_adjustment_note'))
1339
+ }
1340
+
1341
+ // Validate location for all rows
1342
+ if (!itm?.location || !itm?.location?.name) {
1343
+ errors.push(i18next.t('text.location_is_required_kindly_fill_in_the_location_to_continue'))
1344
+ } else if (!locationNameSet.has(itm.location.name)) {
1345
+ errors.push(`${i18next.t('text.location_not_found')}: ${itm.location.name}`)
1337
1346
  }
1338
1347
 
1339
1348
  if (itm.cuFlag == '+') {
1340
- this.validation(itm)
1349
+ if (!itm?.batchId) {
1350
+ errors.push(i18next.t('text.batch_no_is_required_kindly_fill_in_the_batch_no_to_continue'))
1351
+ }
1352
+ if (!itm?.bizplace || !itm?.bizplace?.id) {
1353
+ errors.push(i18next.t('text.company_is_required_kindly_fill_in_the_company_to_continue'))
1354
+ }
1355
+ if (!itm?.qty) {
1356
+ errors.push(i18next.t('text.qty_is_required_kindly_fill_in_the_qty_to_continue'))
1357
+ }
1358
+ if (!itm?.uomValue) {
1359
+ errors.push(i18next.t('text.total_uom_value_is_required_kindly_fill_in_the_total_uom_value_to_continue'))
1360
+ }
1361
+ if (!itm?.adjustmentCode) {
1362
+ // already checked above, but keep for cuFlag '+' specific check
1363
+ }
1364
+ if (!itm?.adjustmentNote) {
1365
+ errors.push(i18next.t('text.adjustment_note_is_required_kindly_fill_in_the_adjustment_note_to_continue'))
1366
+ }
1341
1367
 
1342
1368
  if (!itm.sku) {
1343
- throw new Error(i18next.t('text.sku_is_required_kindly_fill_in_the_sku_to_continue'))
1369
+ errors.push(i18next.t('text.sku_is_required_kindly_fill_in_the_sku_to_continue'))
1344
1370
  }
1345
1371
 
1346
1372
  if (itm.qty < 0 || itm.unitCost < 0 || itm.uomValue < 0) {
1347
- throw new Error(i18next.t('text.invalid_value_in_list'))
1373
+ errors.push(i18next.t('text.invalid_value_in_list'))
1348
1374
  }
1349
1375
 
1350
1376
  if (
1351
1377
  itm.manufactureDate &&
1352
1378
  (itm.manufactureDate.getFullYear < 1000 || itm.manufactureDate.getTime > new Date().getTime)
1353
1379
  ) {
1354
- throw new Error(i18next.t('text.invalid_value_in_list'))
1380
+ errors.push(i18next.t('text.invalid_value_in_list'))
1381
+ }
1382
+ }
1383
+
1384
+ if (itm.serialNumbers) {
1385
+ let serialNumbers = itm.serialNumbers
1386
+ itm.serialNumbers = serialNumbers.replace(' ', '')
1387
+
1388
+ if (itm.serialNumbers.split(',').length != itm.qty) {
1389
+ errors.push(i18next.t('text.serial_number_not_tally_with_qty'))
1355
1390
  }
1356
1391
  }
1392
+
1393
+ if (errors.length) {
1394
+ itm.errMsg = errors.join('; ')
1395
+ }
1396
+ })
1397
+
1398
+ const hasErrors = patches.some(p => p.errMsg)
1399
+ if (hasErrors) {
1400
+ return patches
1401
+ }
1402
+
1403
+ // Save original patches for error display if the server mutation fails
1404
+ const originalPatches = patches.map(p => ({ ...p }))
1405
+
1406
+ // All validations passed — apply transformations and submit
1407
+ patches.forEach(itm => {
1357
1408
  itm.qty = toFloatOrUndefined(itm.qty)
1358
1409
  itm.packingSize = toFloatOrUndefined(itm.packingSize)
1359
1410
  itm.uomValue = toFloatOrUndefined(itm.uomValue)
@@ -1365,19 +1416,14 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1365
1416
  }
1366
1417
  if (itm.unitCost != null) {
1367
1418
  itm.unitCost = toFloatOrUndefined(itm.unitCost)
1368
- if (isNaN(itm.unitCost)) {
1369
- throw new Error(i18next.t('text.invalid_unit_cost'))
1370
- }
1371
1419
  }
1372
1420
 
1373
- if (itm.location.zone || itm.location.row || itm.location.column) {
1374
- //if user repic location after import
1421
+ if (itm.location && (itm.location.zone || itm.location.row || itm.location.column)) {
1375
1422
  delete itm.location.zone
1376
1423
  delete itm.location.row
1377
1424
  delete itm.location.column
1378
1425
  }
1379
1426
 
1380
- //if user repick product after import
1381
1427
  if (itm?.product?.productId) {
1382
1428
  itm.product.id = itm.product.productId
1383
1429
  delete itm.product.productId
@@ -1399,14 +1445,7 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1399
1445
  itm.manufactureDate = `${mdt.getFullYear()}-${mdt.getMonth() + 1}-${mdt.getDate()}`
1400
1446
  }
1401
1447
 
1402
- if (itm.serialNumbers) {
1403
- let serialNumbers = itm.serialNumbers
1404
- itm.serialNumbers = serialNumbers.replace(' ', '')
1405
-
1406
- if (itm.serialNumbers.split(',').length != itm.qty) {
1407
- throw new Error(i18next.t('text.serial_number_not_tally_with_qty'))
1408
- }
1409
- }
1448
+ delete itm.errMsg
1410
1449
  })
1411
1450
 
1412
1451
  const response = await client.mutate({
@@ -1419,9 +1458,15 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1419
1458
  })
1420
1459
 
1421
1460
  if (!response.errors) {
1422
- history.back()
1423
1461
  this.dataGrist.fetch()
1424
1462
  this.showToast({ message: i18next.t('text.data_inventory_adjustment_has_been_submitted_for_approval') })
1463
+ } else {
1464
+ // Server returned errors — show in the error column on original patches
1465
+ const errMsg = response.errors.map(e => e.message).join('; ')
1466
+ originalPatches.forEach(p => {
1467
+ p.errMsg = errMsg
1468
+ })
1469
+ return originalPatches
1425
1470
  }
1426
1471
  } catch (e) {
1427
1472
  this.showToast(e)
@@ -1450,6 +1495,14 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1450
1495
  return { ...column }
1451
1496
  })
1452
1497
 
1498
+ columns.push({
1499
+ type: 'string',
1500
+ name: 'errMsg',
1501
+ header: i18next.t('field.error_message'),
1502
+ width: 300,
1503
+ record: { editable: false }
1504
+ })
1505
+
1453
1506
  setTimeout(() => {
1454
1507
  openPopup(
1455
1508
  html`
@@ -1459,6 +1512,7 @@ class InventoryAdjustment extends connect(store)(localize(i18next)(PageView)) {
1459
1512
  rows: this.config.rows,
1460
1513
  columns: columns
1461
1514
  }}
1515
+ .enableRowErrors=${true}
1462
1516
  .importHandler="${this.importHandler.bind(this)}"
1463
1517
  @field-change="${this.fieldChange.bind(this)}"
1464
1518
  ></import-pop-up>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/operato-wms",
3
- "version": "4.3.789",
3
+ "version": "4.3.790",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -66,7 +66,7 @@
66
66
  "@things-factory/attachment-ui": "^4.3.767",
67
67
  "@things-factory/auth-ui": "^4.3.767",
68
68
  "@things-factory/barcode-ui": "^4.3.767",
69
- "@things-factory/biz-ui": "^4.3.770",
69
+ "@things-factory/biz-ui": "^4.3.790",
70
70
  "@things-factory/board-service": "^4.3.767",
71
71
  "@things-factory/board-ui": "^4.3.770",
72
72
  "@things-factory/code-ui": "^4.3.770",
@@ -81,8 +81,8 @@
81
81
  "@things-factory/help": "^4.3.767",
82
82
  "@things-factory/i18n-base": "^4.3.767",
83
83
  "@things-factory/id-rule-base": "^4.3.770",
84
- "@things-factory/import-ui": "^4.3.770",
85
- "@things-factory/import-ui-excel": "^4.3.776",
84
+ "@things-factory/import-ui": "^4.3.790",
85
+ "@things-factory/import-ui-excel": "^4.3.790",
86
86
  "@things-factory/menu-ui": "^4.3.770",
87
87
  "@things-factory/more-ui": "^4.3.767",
88
88
  "@things-factory/notification": "^4.3.767",
@@ -90,8 +90,8 @@
90
90
  "@things-factory/print-proxy-service": "^4.3.767",
91
91
  "@things-factory/print-ui": "^4.3.767",
92
92
  "@things-factory/product-base": "^4.3.788",
93
- "@things-factory/resource-ui": "^4.3.770",
94
- "@things-factory/sales-ui": "^4.3.789",
93
+ "@things-factory/resource-ui": "^4.3.790",
94
+ "@things-factory/sales-ui": "^4.3.790",
95
95
  "@things-factory/scene-data-transform": "^4.3.767",
96
96
  "@things-factory/scene-excel": "^4.3.767",
97
97
  "@things-factory/scene-firebase": "^4.3.767",
@@ -107,8 +107,8 @@
107
107
  "@things-factory/system-ui": "^4.3.767",
108
108
  "@things-factory/transport-base": "^4.3.767",
109
109
  "@things-factory/tutorial-ui": "^4.3.767",
110
- "@things-factory/warehouse-base": "^4.3.789",
111
- "@things-factory/worksheet-base": "^4.3.789"
110
+ "@things-factory/warehouse-base": "^4.3.790",
111
+ "@things-factory/worksheet-base": "^4.3.790"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@things-factory/builder": "^4.3.767",
@@ -117,5 +117,5 @@
117
117
  "cypress-localstorage-commands": "^1.6.1",
118
118
  "eslint-plugin-cypress": "^2.12.1"
119
119
  },
120
- "gitHead": "f2c0983c5b5bae151d242f2d0267e800d6be318e"
120
+ "gitHead": "aac8be0c440911f309204b31d37d0b9fabd0c451"
121
121
  }