warehouse layers [switchable]

This commit is contained in:
Thanakorn S
2026-05-04 13:43:32 +07:00
parent a90975d9f1
commit 414f1cd81d
26 changed files with 2022 additions and 584 deletions
+48 -12
View File
@@ -154,7 +154,7 @@
<th>Date</th>
<th>Type</th>
<th>Warehouse</th>
<th>Location</th>
<th id="th_location">Location</th>
<th>In</th>
<th>Out</th>
<th>Serial</th>
@@ -179,9 +179,13 @@
<script>
var search_term_lot = '';
var lot_log_data = [];
var lot_log_page = 1;
var lot_log_limit = 10;
var lot_log_data = [];
var lot_log_page = 1;
var lot_log_limit = 10;
var advanced = false;
var label_rack = 'Location';
var label_zone = 'Zone';
var label_aisle = 'Aisle';
var type_badge = {
'in': '<span class="badge bg-success">Stock In</span>',
@@ -189,12 +193,43 @@
'transfer': '<span class="badge bg-primary">Transfer</span>',
};
var status_badge = {
var status_badge = {
'ok': '<span class="badge bg-success">OK</span>',
'near': '<span class="badge bg-warning text-dark">Near Expiry</span>',
'critical': '<span class="badge bg-danger">Critical</span>',
'expired': '<span class="badge bg-secondary">Expired</span>',
};
};
function apply_location_labels() {
$('#th_location').text(advanced
? label_zone + ' / ' + label_aisle + ' / ' + label_rack
: label_rack
);
}
function format_location(row) {
if (advanced) {
return [row.zone, row.aisle, row.rack].filter(Boolean).join('-') || '<span class="text-muted">—</span>';
}
return row.rack || '<span class="text-muted">—</span>';
}
function load_company_setting() {
return ajax_request({
url: server_url + 'setting/api/engine/company_setting.php',
autoPrepare: true,
checkRequired: 0,
action: 'read',
onSuccess: function(res) {
var s = res.output || {};
advanced = s.advanced_location == 1;
label_rack = s.location_label_rack || (advanced ? 'Rack' : 'Location');
label_zone = s.location_label_zone || 'Zone';
label_aisle = s.location_label_aisle || 'Aisle';
apply_location_labels();
}
});
}
// ── Fetch ─────────────────────────────────────────────────────────────
@@ -296,7 +331,7 @@
<td class="py-3">${format_date(row.date)}</td>
<td class="py-3">${type_badge[row.type] || row.type}</td>
<td class="py-3">${row.warehouse_name}</td>
<td class="py-3">${row.zone}-${row.aisle}-${row.rack}</td>
<td class="py-3">${format_location(row)}</td>
<td class="py-3 text-success">${parseFloat(row.stock_in) > 0 ? '+' + Number(row.stock_in).toLocaleString() : '<span class="text-muted">—</span>'}</td>
<td class="py-3 text-danger">${parseFloat(row.stock_out) > 0 ? '-' + Number(row.stock_out).toLocaleString() : '<span class="text-muted">—</span>'}</td>
<td class="py-3">${row.serial_number || '<span class="text-muted">—</span>'}</td>
@@ -354,10 +389,11 @@
// ── Boot ─────────────────────────────────────────────────────────────
$(async function() {
try {
await retrieve_product_lot();
} catch(e) {
$(async function() {
try {
await load_company_setting();
await retrieve_product_lot();
} catch(e) {
console.log(e);
}
});
@@ -365,4 +401,4 @@
</body>
</html>
</html>