Change 'Rack' to 'Bin'

This commit is contained in:
Thanakorn S
2026-05-27 17:14:53 +07:00
parent b8798bc02d
commit 8f57ab5570
41 changed files with 931 additions and 933 deletions
+2 -2
View File
@@ -382,7 +382,7 @@
warehouse_id: wh,
zone: '',
aisle: '',
rack: '',
bin: '',
lot_number: '',
serial_number: '',
quantity: qty,
@@ -566,7 +566,7 @@
// ── Confirm order ─────────────────────────────────────────────────────────
function confirm_order() {
bootbox.confirm({
message: 'Confirm this order? Stock-out rows will be created for all items using FIFO rack selection.',
message: 'Confirm this order? Stock-out rows will be created for all items using FIFO bin selection.',
buttons: {
confirm: { label: 'Confirm Order', className: 'btn-success' },
cancel: { label: 'Back', className: 'btn-secondary' }
+40 -40
View File
@@ -102,7 +102,7 @@
<th class="th_return_wh" style="width:150px;">Warehouse</th>
<th class="th_return_zone" style="width:120px;">Zone</th>
<th class="th_return_aisle" style="width:120px;">Aisle</th>
<th class="th_return_rack" style="width:120px;">Location</th>
<th class="th_return_bin" style="width:120px;">Location</th>
<th class="text-end" style="width:110px;">Return Qty</th>
<th class="text-end" style="width:100px;">Unit Price</th>
<th style="width:70px;">Tax%</th>
@@ -215,7 +215,7 @@
var returnable = []; // returnable_items from order
var warehouses = [];
var advanced = false;
var label_rack = 'Location';
var label_bin = 'Location';
var label_zone = 'Zone';
var label_aisle = 'Aisle';
@@ -276,16 +276,16 @@
$('.th_return_wh').text('Warehouse');
$('.th_return_zone').text(label_zone).toggleClass('d-none', !advanced);
$('.th_return_aisle').text(label_aisle).toggleClass('d-none', !advanced);
$('.th_return_rack').text(label_rack);
$('.th_return_bin').text(label_bin);
$('#loading_row td').attr('colspan', 12);
}
function retrieve_return_zones(item_id, selected_zone, selected_aisle, selected_rack) {
function retrieve_return_zones(item_id, selected_zone, selected_aisle, selected_bin) {
var $row = $(`#ret_item_${item_id}`);
var wh = $row.find('.item_return_warehouse').val();
$row.find('.item_return_zone').html(`<option value="">Select ${label_zone.toLowerCase()}...</option>`);
$row.find('.item_return_aisle').html(`<option value="">Select ${label_aisle.toLowerCase()}...</option>`);
$row.find('.item_return_rack').html(`<option value="">Select ${label_rack.toLowerCase()}...</option>`);
$row.find('.item_return_bin').html(`<option value="">Select ${label_bin.toLowerCase()}...</option>`);
if (!wh) return Promise.resolve();
return ajax_request({
@@ -307,7 +307,7 @@
opts += `<option value="${escape_html(selected_zone)}">${escape_html(selected_zone)}</option>`;
}
$row.find('.item_return_zone').html(opts).val(selected_zone || '');
if (selected_zone) retrieve_return_aisles(item_id, selected_aisle, selected_rack);
if (selected_zone) retrieve_return_aisles(item_id, selected_aisle, selected_bin);
}
});
}
@@ -316,35 +316,35 @@
var $row = $(`#ret_item_${item_id}`);
$row.find('.item_return_zone').val('');
$row.find('.item_return_aisle').val('');
$row.find('.item_return_rack').val('');
$row.find('.item_return_bin').val('');
if (!$row.find('.item_check').is(':checked')) return;
if (advanced) {
retrieve_return_zones(item_id);
} else {
retrieve_return_racks(item_id);
retrieve_return_bins(item_id);
}
}
function change_return_zone(item_id) {
var $row = $(`#ret_item_${item_id}`);
$row.find('.item_return_aisle').val('');
$row.find('.item_return_rack').val('');
$row.find('.item_return_bin').val('');
if ($row.find('.item_check').is(':checked')) retrieve_return_aisles(item_id);
}
function change_return_aisle(item_id) {
var $row = $(`#ret_item_${item_id}`);
$row.find('.item_return_rack').val('');
if ($row.find('.item_check').is(':checked')) retrieve_return_racks(item_id);
$row.find('.item_return_bin').val('');
if ($row.find('.item_check').is(':checked')) retrieve_return_bins(item_id);
}
function retrieve_return_aisles(item_id, selected_aisle, selected_rack) {
function retrieve_return_aisles(item_id, selected_aisle, selected_bin) {
var $row = $(`#ret_item_${item_id}`);
var wh = $row.find('.item_return_warehouse').val();
var zone = $row.find('.item_return_zone').val();
$row.find('.item_return_aisle').html(`<option value="">Select ${label_aisle.toLowerCase()}...</option>`);
$row.find('.item_return_rack').html(`<option value="">Select ${label_rack.toLowerCase()}...</option>`);
$row.find('.item_return_bin').html(`<option value="">Select ${label_bin.toLowerCase()}...</option>`);
if (!wh || !zone) return Promise.resolve();
return ajax_request({
@@ -366,21 +366,21 @@
opts += `<option value="${escape_html(selected_aisle)}">${escape_html(selected_aisle)}</option>`;
}
$row.find('.item_return_aisle').html(opts).val(selected_aisle || '');
if (selected_aisle) retrieve_return_racks(item_id, selected_rack);
if (selected_aisle) retrieve_return_bins(item_id, selected_bin);
}
});
}
function retrieve_return_racks(item_id, selected_rack) {
function retrieve_return_bins(item_id, selected_bin) {
var $row = $(`#ret_item_${item_id}`);
var wh = $row.find('.item_return_warehouse').val();
var zone = advanced ? $row.find('.item_return_zone').val() : '';
var aisle = advanced ? $row.find('.item_return_aisle').val() : '';
$row.find('.item_return_rack').html(`<option value="">Select ${label_rack.toLowerCase()}...</option>`);
$row.find('.item_return_bin').html(`<option value="">Select ${label_bin.toLowerCase()}...</option>`);
if (!wh || (advanced && (!zone || !aisle))) return Promise.resolve();
return ajax_request({
url: '<?php echo $server_url?>ics/api/engine/retrieve_rack.php',
url: '<?php echo $server_url?>ics/api/engine/retrieve_bin.php',
autoPrepare: true,
checkRequired: 0,
noLoading: true,
@@ -388,16 +388,16 @@
action: 'read',
data: { type: 'to', warehouse: wh, zone: zone, aisle: aisle, id: 0 },
onSuccess: function(res) {
var opts = `<option value="">Select ${label_rack.toLowerCase()}...</option>`;
var has_selected = !selected_rack;
var opts = `<option value="">Select ${label_bin.toLowerCase()}...</option>`;
var has_selected = !selected_bin;
$.each(res.output || [], function(_, value) {
if (String(value) === String(selected_rack)) has_selected = true;
if (String(value) === String(selected_bin)) has_selected = true;
opts += `<option value="${escape_html(value)}">${escape_html(value)}</option>`;
});
if (!has_selected) {
opts += `<option value="${escape_html(selected_rack)}">${escape_html(selected_rack)}</option>`;
opts += `<option value="${escape_html(selected_bin)}">${escape_html(selected_bin)}</option>`;
}
$row.find('.item_return_rack').html(opts).val(selected_rack || '');
$row.find('.item_return_bin').html(opts).val(selected_bin || '');
}
});
}
@@ -406,19 +406,19 @@
var wh = selected.warehouse_id || '';
var zone = selected.zone || '';
var aisle = selected.aisle || '';
var rack = selected.rack || '';
var bin = selected.bin || '';
if (advanced) {
return `<td><select class="form-select form-select-sm item_return_warehouse" onchange="change_return_warehouse(${item_id})">${warehouse_options(wh)}</select></td>
<td><select class="form-select form-select-sm item_return_zone" onchange="change_return_zone(${item_id})"><option value="">Select ${label_zone.toLowerCase()}...</option></select></td>
<td><select class="form-select form-select-sm item_return_aisle" onchange="change_return_aisle(${item_id})"><option value="">Select ${label_aisle.toLowerCase()}...</option></select></td>
<td><select class="form-select form-select-sm item_return_rack"><option value="">Select ${label_rack.toLowerCase()}...</option></select></td>`;
<td><select class="form-select form-select-sm item_return_bin"><option value="">Select ${label_bin.toLowerCase()}...</option></select></td>`;
}
return `<td><select class="form-select form-select-sm item_return_warehouse" onchange="change_return_warehouse(${item_id})">${warehouse_options(wh)}</select></td>
<td class="d-none"><select class="form-select form-select-sm item_return_zone"><option value=""></option></select></td>
<td class="d-none"><select class="form-select form-select-sm item_return_aisle"><option value=""></option></select></td>
<td><select class="form-select form-select-sm item_return_rack"><option value="">Select ${label_rack.toLowerCase()}...</option></select></td>`;
<td><select class="form-select form-select-sm item_return_bin"><option value="">Select ${label_bin.toLowerCase()}...</option></select></td>`;
}
function hydrate_location_selectors(items, selected_map) {
@@ -427,15 +427,15 @@
var $row = $(`#ret_item_${item.item_id}`);
if (!$row.find('.item_check').is(':checked')) return;
if (!selected.warehouse_id && !selected.zone && !selected.aisle && !selected.rack) {
if (!selected.warehouse_id && !selected.zone && !selected.aisle && !selected.bin) {
change_return_warehouse(item.item_id);
return;
}
if (advanced) {
retrieve_return_zones(item.item_id, selected.zone || '', selected.aisle || '', selected.rack || '');
} else if (selected.rack) {
retrieve_return_racks(item.item_id, selected.rack || '');
retrieve_return_zones(item.item_id, selected.zone || '', selected.aisle || '', selected.bin || '');
} else if (selected.bin) {
retrieve_return_bins(item.item_id, selected.bin || '');
}
});
}
@@ -498,7 +498,7 @@
warehouse_id: si ? (si.warehouse_id || item.warehouse_id || '') : (item.warehouse_id || ''),
zone: si ? (si.zone || '') : (item.zone || ''),
aisle: si ? (si.aisle || '') : (item.aisle || ''),
rack: si ? (si.rack || '') : (item.rack || ''),
bin: si ? (si.bin || '') : (item.bin || ''),
};
rows += `<tr class="return-item-row" id="ret_item_${item.item_id}">
@@ -514,7 +514,7 @@
<input type="hidden" class="item_warehouse_id" value="${item.warehouse_id || 0}">
<input type="hidden" class="item_zone" value="${item.zone || ''}">
<input type="hidden" class="item_aisle" value="${item.aisle || ''}">
<input type="hidden" class="item_rack" value="${item.rack || ''}">
<input type="hidden" class="item_bin" value="${item.bin || ''}">
<input type="hidden" class="item_lot" value="${item.lot_number || ''}">
<input type="hidden" class="item_serial" value="${item.serial_number || ''}">
<input type="hidden" class="item_stock_out_id" value="${item.stock_out_id || 0}">
@@ -561,7 +561,7 @@
function toggle_item_row(item_id) {
var $row = $(`#ret_item_${item_id}`);
var checked = $row.find('.item_check').is(':checked');
$row.find('.item_qty, .item_price, .item_tax_rate, .item_return_warehouse, .item_return_zone, .item_return_aisle, .item_return_rack').prop('disabled', !checked);
$row.find('.item_qty, .item_price, .item_tax_rate, .item_return_warehouse, .item_return_zone, .item_return_aisle, .item_return_bin').prop('disabled', !checked);
if (!checked) {
$row.find('.item_total').text('—');
return;
@@ -631,7 +631,7 @@
onSuccess: function(res) {
var s = res.output || {};
advanced = s.advanced_location == 1;
label_rack = s.location_label_rack || (advanced ? 'Rack' : 'Location');
label_bin = s.location_label_bin || (advanced ? 'Bin' : 'Location');
label_zone = s.location_label_zone || 'Zone';
label_aisle = s.location_label_aisle || 'Aisle';
apply_location_headers();
@@ -664,12 +664,12 @@
var tax_rate = parseFloat($row.find('.item_tax_rate').val()) || 0;
if (qty <= 0) return;
var return_wh = parseInt($row.find('.item_return_warehouse').val()) || 0;
var return_rack = $row.find('.item_return_rack').val() || '';
var return_zone = advanced ? ($row.find('.item_return_zone').val() || '') : return_rack;
var return_aisle = advanced ? ($row.find('.item_return_aisle').val() || '') : return_rack;
var return_bin = $row.find('.item_return_bin').val() || '';
var return_zone = advanced ? ($row.find('.item_return_zone').val() || '') : return_bin;
var return_aisle = advanced ? ($row.find('.item_return_aisle').val() || '') : return_bin;
if (!return_wh || !return_rack || (advanced && (!return_zone || !return_aisle))) {
throw new Error('Please select return warehouse and ' + label_rack.toLowerCase() + ' for every checked item.');
if (!return_wh || !return_bin || (advanced && (!return_zone || !return_aisle))) {
throw new Error('Please select return warehouse and ' + label_bin.toLowerCase() + ' for every checked item.');
}
items.push({
@@ -679,7 +679,7 @@
warehouse_id: return_wh,
zone: return_zone,
aisle: return_aisle,
rack: return_rack,
bin: return_bin,
lot_number: $row.find('.item_lot').val(),
serial_number: $row.find('.item_serial').val(),
stock_out_id: parseInt($row.find('.item_stock_out_id').val()) || 0,
@@ -750,7 +750,7 @@
$('.item_check').prop('disabled', !is_draft);
$('#item_tbody tr.return-item-row').each(function() {
var checked = $(this).find('.item_check').is(':checked');
$(this).find('.item_qty, .item_price, .item_tax_rate, .item_return_warehouse, .item_return_zone, .item_return_aisle, .item_return_rack')
$(this).find('.item_qty, .item_price, .item_tax_rate, .item_return_warehouse, .item_return_zone, .item_return_aisle, .item_return_bin')
.prop('disabled', !is_draft || !checked);
});