feat: enter serial range in Serial/Batch Selector (backport #41530) (#41534)

feat: enter serial range in Serial/Batch Selector (#41530)

* feat: util for generating serial nos from range string

* feat: enter serial range in Serial/Batch Selector

(cherry picked from commit 7b9fd394b0)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
This commit is contained in:
mergify[bot]
2024-05-18 10:39:21 +05:30
committed by GitHub
parent 5fd68f9fcb
commit 7225347387
2 changed files with 59 additions and 0 deletions

View File

@@ -1183,4 +1183,39 @@ $.extend(erpnext.stock.utils, {
const barcode_scanner = new erpnext.utils.BarcodeScanner({ frm: frm });
barcode_scanner.scan_api_call(child_row.barcode, callback);
},
get_serial_range(range_string, separator) {
/* Return an array of serial numbers generated from a range string.
Examples (using separator "::"):
- "1::5" => ["1", "2", "3", "4", "5"]
- "SN0009::12" => ["SN0009", "SN0010", "SN0011", "SN0012"]
- "ABC//05::8" => ["ABC//05", "ABC//06", "ABC//07", "ABC//08"]
*/
if (!range_string) {
return;
}
const [start_str, end_str] = range_string.trim().split(separator);
if (!start_str || !end_str) {
return;
}
const end_int = parseInt(end_str);
const length_difference = start_str.length - end_str.length;
const start_int = parseInt(start_str.substring(length_difference));
if (isNaN(start_int) || isNaN(end_int)) {
return;
}
const serial_numbers = Array(end_int - start_int + 1)
.fill(1)
.map((x, y) => x + y)
.map((x) => x + start_int - 1);
return serial_numbers.map((val) => {
return start_str.substring(0, length_difference) + val.toString().padStart(end_str.length, "0");
});
},
});

View File

@@ -206,6 +206,16 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
label: __("{0} {1} Manually", [primary_label, label]),
depends_on: "eval:doc.import_using_csv_file === 0",
},
{
fieldtype: "Data",
label: __("Enter Serial No Range"),
fieldname: "serial_no_range",
depends_on: "eval:doc.import_using_csv_file === 0",
description: __('Enter "ABC-001::100" for serial nos "ABC-001" to "ABC-100".'),
onchange: () => {
this.set_serial_nos_from_range();
},
},
{
fieldtype: "Small Text",
label: __("Enter Serial Nos"),
@@ -255,6 +265,20 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
return fields;
}
set_serial_nos_from_range() {
const serial_no_range = this.dialog.get_value("serial_no_range");
if (!serial_no_range) {
return;
}
const serial_nos = erpnext.stock.utils.get_serial_range(serial_no_range, "::");
if (serial_nos) {
this.dialog.set_value("upload_serial_nos", serial_nos.join("\n"));
}
}
create_serial_nos() {
let { upload_serial_nos } = this.dialog.get_values();