accounting workflows

This commit is contained in:
Thanakorn S
2026-05-20 10:17:02 +07:00
parent 04a683bd02
commit 7396db6ffc
199 changed files with 23539 additions and 5345 deletions
+60
View File
@@ -107,6 +107,18 @@
<option value="0">inactive</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label for="sales_account" class="form-label">Sales Account</label>
<input type="text" class="form-control account_search" id="sales_account"
placeholder="Search account..." autocomplete="off">
<input type="hidden" id="sales_account_code">
</div>
<div class="col-md-3 mb-3">
<label for="purchase_account" class="form-label">Purchase Account</label>
<input type="text" class="form-control account_search" id="purchase_account"
placeholder="Search account..." autocomplete="off">
<input type="hidden" id="purchase_account_code">
</div>
<div class="col-md-6 mb-3">
<!-- Remove d-none from file input so it shows by default -->
<div class="mb-3">
@@ -160,6 +172,8 @@
formData.append('barcode', $('#barcode').val() || '')
formData.append('cost_price', $('#cost_price').val() || 0)
formData.append('uom', $('#uom').val() || 'pcs')
formData.append('sales_account_code', $('#sales_account_code').val() || '')
formData.append('purchase_account_code', $('#purchase_account_code').val() || '')
return ajax_request({
url: "<?php echo $server_url?>inventory/api/engine/manage_product.php",
@@ -217,6 +231,9 @@
el.val(item);
});
set_account_field('#sales_account', '#sales_account_code', res.output.sales_account_code || '');
set_account_field('#purchase_account', '#purchase_account_code', res.output.purchase_account_code || '');
// Handle image field
if (res.output.product_image) {
$('#current_file_label').val(res.output.product_image);
@@ -243,12 +260,55 @@
$(async function() {
try {
await retrieve_category();
await load_accounts();
await retrieve_for_edit();
init_account_search_inputs(null, window.account_search_accounts || []);
} catch (e) {
console.log(e);
}
});
function load_accounts() {
return ajax_request({
url: "<?php echo $server_url?>accounting/api/engine/account.php",
autoPrepare: true,
checkRequired: 0,
noLoading: true,
action: 'read',
onSuccess: function(res) {
window.account_search_accounts = res.output || [];
}
});
}
function set_account_field(input_selector, hidden_selector, account_code) {
var account = (window.account_search_accounts || []).find(function(row) {
return String(row.account_code) === String(account_code);
});
var display = account ? account.account_code + ' - ' + account.account_name : account_code;
$(input_selector)
.val(display || '')
.attr('secondary', display || '')
.attr('data-account-code', account_code || '');
$(hidden_selector).val(account_code || '');
}
$(document).on('account:selected', '#sales_account', function(e, account) {
$('#sales_account_code').val(account.account_code || '');
});
$(document).on('account:selected', '#purchase_account', function(e, account) {
$('#purchase_account_code').val(account.account_code || '');
});
$(document).on('account:cleared', '#sales_account', function() {
$('#sales_account_code').val('');
});
$(document).on('account:cleared', '#purchase_account', function() {
$('#purchase_account_code').val('');
});
function validate_stock_thresholds() {