[test] contact to setting modules

This commit is contained in:
Thanakorn S
2026-05-06 08:58:09 +07:00
parent 414f1cd81d
commit 6501d326ca
43 changed files with 4295 additions and 581 deletions
+88 -20
View File
@@ -131,6 +131,7 @@
<!-- Submit -->
<div class="mb-3 col-lg-12">
<button type="submit" class="btn btn-primary" onclick="manage_stock_transfer();">Transfer Stock</button>
<button type="button" class="btn btn-success ms-2 d-none" id="approve_stock_btn" onclick="approve_current_stock();">Approve</button>
</div>
</form>
</div>
@@ -171,6 +172,7 @@
if (advanced) {
$('#group_zone_from, #group_zone_to').show();
$('#group_aisle_from, #group_aisle_to').show();
$('#zone_from, #zone_to, #aisle_from, #aisle_to').prop('required', true);
$('#label_zone_from').text('From ' + label_zone);
$('#label_zone_to').text('To ' + label_zone);
$('#label_aisle_from').text('From ' + label_aisle);
@@ -184,6 +186,7 @@
} else {
$('#group_zone_from, #group_zone_to').hide();
$('#group_aisle_from, #group_aisle_to').hide();
$('#zone_from, #zone_to, #aisle_from, #aisle_to').prop('required', false).removeClass('is-invalid is-valid');
$('#label_rack_from').text('From ' + label_rack);
$('#label_rack_to').text('To ' + label_rack);
$('#rack_from, #rack_to').find('option:first').text('Please select ' + label_rack.toLowerCase());
@@ -194,10 +197,12 @@
// ── Submit ────────────────────────────────────────────────────────────────
function manage_stock_transfer() {
var rack_from_val = $('#rack_from').val();
var rack_to_val = $('#rack_to').val();
var sku_val = $('#product_sku').attr('secondary') || $('#product_sku').val();
// Simple mode — mirror rack value to zone and aisle before submit
if (!advanced) {
var rack_from_val = $('#rack_from').val();
var rack_to_val = $('#rack_to').val();
$('#zone_from').val(rack_from_val);
$('#aisle_from').val(rack_from_val);
$('#zone_to').val(rack_to_val);
@@ -208,7 +213,18 @@
url: '<?php echo $server_url?>ics/api/engine/manage_stock_transfer.php',
autoPrepare: true,
checkRequired: 1,
data: { 'contact_id': $('#contact').attr('data-id') },
data: {
'contact_id': $('#contact').attr('data-id'),
'warehouse_from': $('#warehouse_from').val(),
'warehouse_to': $('#warehouse_to').val(),
'zone_from': advanced ? $('#zone_from').val() : rack_from_val,
'aisle_from': advanced ? $('#aisle_from').val() : rack_from_val,
'rack_from': rack_from_val,
'zone_to': advanced ? $('#zone_to').val() : rack_to_val,
'aisle_to': advanced ? $('#aisle_to').val() : rack_to_val,
'rack_to': rack_to_val,
'product_sku': sku_val,
},
action: 'manage',
onSuccess: function() {
window.location.href = '<?php echo $server_url?>ics/stock_transfer.php';
@@ -216,6 +232,30 @@
});
}
function approve_current_stock() {
bootbox.confirm({
message: 'Approve this stock-transfer record?',
buttons: { confirm: { label: 'Approve', className: 'btn-success' }, cancel: { label: 'Cancel', className: 'btn-secondary' } },
callback: function(result) {
if (!result) return;
ajax_request({
url: '<?php echo $server_url?>ics/api/engine/approve_stock.php',
autoPrepare: true,
checkRequired: 0,
action: 'update',
data: {
id: '<?php echo $_GET["id"] ?? "";?>',
warehouse: '<?php echo $_GET["wh"] ?? "";?>',
type: 'transfer'
},
onSuccess: function() {
window.location.reload();
}
});
}
});
}
// ── Step 1: Product selected → load active lots + from-warehouses ─────────
function retrieve_active_lot() {
@@ -273,7 +313,11 @@
autoPrepare: true,
checkRequired: 0,
noLoading: true,
data: { 'type': type, 'lot_number': type === 'from' ? $('#lot_number').val() : '' },
data: {
'type': type,
'product_sku': type === 'from' ? ($('#product_sku').attr('secondary') || $('#product_sku').val()) : '',
'lot_number': type === 'from' ? $('#lot_number').val() : ''
},
action: 'read',
onSuccess: function(res) {
var option = '<option value="">Select warehouse...</option>';
@@ -288,13 +332,16 @@
// ── Zone / Aisle / Rack loaders ───────────────────────────────────────────
function retrieve_zone(type, callback) {
var extra = {};
var extra = {
'warehouse_from': $('#warehouse_from').val(),
'warehouse_to': $('#warehouse_to').val()
};
if (type === 'from') {
extra = {
extra = Object.assign(extra, {
'product_sku': $('#product_sku').attr('secondary') || $('#product_sku').val(),
'lot_number': $('#lot_number').val(),
'serial_number': $('#serial_number').val()
};
});
}
return ajax_request({
url: '<?php echo $server_url?>ics/api/engine/retrieve_zone.php',
@@ -315,13 +362,18 @@
}
function retrieve_aisle(type, callback) {
var extra = {};
var extra = {
'warehouse_from': $('#warehouse_from').val(),
'warehouse_to': $('#warehouse_to').val(),
'zone_from': $('#zone_from').val(),
'zone_to': $('#zone_to').val()
};
if (type === 'from') {
extra = {
extra = Object.assign(extra, {
'product_sku': $('#product_sku').attr('secondary') || $('#product_sku').val(),
'lot_number': $('#lot_number').val(),
'serial_number': $('#serial_number').val()
};
});
}
return ajax_request({
url: '<?php echo $server_url?>ics/api/engine/retrieve_aisle.php',
@@ -342,13 +394,20 @@
}
function retrieve_rack(type, callback) {
var extra = {};
var extra = {
'warehouse_from': $('#warehouse_from').val(),
'warehouse_to': $('#warehouse_to').val(),
'zone_from': $('#zone_from').val(),
'zone_to': $('#zone_to').val(),
'aisle_from': $('#aisle_from').val(),
'aisle_to': $('#aisle_to').val()
};
if (type === 'from') {
extra = {
extra = Object.assign(extra, {
'product_sku': $('#product_sku').attr('secondary') || $('#product_sku').val(),
'lot_number': $('#lot_number').val(),
'serial_number': $('#serial_number').val()
};
});
}
return ajax_request({
url: '<?php echo $server_url?>ics/api/engine/retrieve_rack.php',
@@ -400,9 +459,17 @@
$('#serial_number').html('<option value="' + (data.serial_number || '') + '">' + (data.serial_number || '—') + '</option>')
.val(data.serial_number || '').prop('disabled', true);
$('#product_name').val(data.product_name);
$('#product_sku').attr('secondary', data.product_sku).prop('disabled', true);
retrieve_warehouse('from').then(function() {
return retrieve_warehouse('to');
}).then(function() {
$('select[name="warehouse"][role="from"]').val(from_wh).prop('disabled', true);
$('select[name="warehouse"][role="to"]').val(to_wh).prop('disabled', true);
if (advanced) {
// Full cascade for From
$('select[name="warehouse"][role="from"]').val(from_wh).prop('disabled', true);
retrieve_zone('from', function() {
$('select[name="zone"][role="from"]').val(data.zone).prop('disabled', true);
retrieve_aisle('from', function() {
@@ -415,7 +482,6 @@
});
} else {
// Simple mode — skip zone/aisle cascade, load rack directly
$('select[name="warehouse"][role="from"]').val(from_wh).prop('disabled', true);
retrieve_rack('from', function() {
$('select[name="rack"][role="from"]').val(data.rack).prop('disabled', true);
populate_to_side_simple(data, to_wh);
@@ -432,16 +498,17 @@
$('#contact').val(data.contact_name)
.attr('secondary', data.contact_name)
.attr('data-id', data.contact_id);
$('#product_name').val(data.product_name);
$('#product_sku').attr('secondary', data.product_sku).prop('disabled', true);
$('button[type=submit]').text('Update');
$('button[type=reset]').hide();
if (data.status == 0) {
$('#approve_stock_btn').removeClass('d-none');
}
});
}
});
}
function populate_to_side(data, to_wh) {
$('select[name="warehouse"][role="to"]').val(to_wh).prop('disabled', true);
retrieve_zone('to', function() {
$('select[name="zone"][role="to"]').val(data.ref.zone).prop('disabled', true);
retrieve_aisle('to', function() {
@@ -454,7 +521,6 @@
}
function populate_to_side_simple(data, to_wh) {
$('select[name="warehouse"][role="to"]').val(to_wh).prop('disabled', true);
retrieve_rack('to', function() {
$('select[name="rack"][role="to"]').val(data.ref.rack).prop('disabled', true);
});
@@ -465,7 +531,9 @@
$(async function() {
try {
await load_location_config(apply_location_labels);
<?php if(empty($_GET['id'])){ ?>
await retrieve_warehouse('to');
<?php } ?>
await retrieve_for_edit();
} catch(e) {
console.log(e);
@@ -526,4 +594,4 @@
</script>
</body>
</html>
</html>