Files
wms-app/app/asset/manage_category.php
T
Thanakorn c957280aa5 Add Asset Management app
Assets from purchase invoice lines, straight-line depreciation/amortization with salvage value, disposals, and [Asset Mgmt] sources in Batch GL Entries. Green third workspace with an app access guard.
2026-09-15 09:50:55 +07:00

180 lines
6.9 KiB
PHP

<?php
session_start();
require '../config.php';
require '../include_header.php';
?>
<body>
<?php require '../include_topbar.php'; ?>
<?php require '../include_sidebar_asset.php'; ?>
<main id="content" class="content py-15">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="d-flex align-items-center mb-5 gap-3">
<a href="<?php echo $server_url?>asset/categories.php" class="btn btn-light btn-sm">
<i class="ti ti-arrow-left me-1"></i>Back
</a>
<h1 class="fs-3 mb-0">Manage Asset Category</h1>
</div>
</div>
</div>
<div class="row" id="categoryForm">
<div class="col-lg-8">
<div class="card">
<div class="card-body p-6">
<input type="hidden" id="id">
<div class="row g-4">
<div class="col-md-3">
<label class="form-label">Code <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="category_code" placeholder="e.g. IT" required>
</div>
<div class="col-md-5">
<label class="form-label">Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="category_name" placeholder="e.g. Computer equipment" required>
</div>
<div class="col-md-4">
<label class="form-label">Status</label>
<select class="form-select" id="status">
<option value="1">Active</option>
<option value="0">Inactive</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Asset Class <span class="text-danger">*</span></label>
<select class="form-select" id="asset_class" required>
<option value="tangible">Tangible — straight-line depreciation</option>
<option value="intangible">Intangible — straight-line amortization</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Default Useful Life (months) <span class="text-danger">*</span></label>
<input type="number" class="form-control" id="useful_life_months" min="1" max="1200" step="1" value="60" required>
</div>
<div class="col-12">
<h2 class="fs-6 mb-0 mt-2">GL Accounts</h2>
<p class="text-muted small mb-0">Used when Accounting posts this category's entries from Batch GL Entries.</p>
</div>
<div class="col-md-6">
<label class="form-label">Asset Cost Account <span class="text-danger">*</span></label>
<select class="form-select" id="cost_account_code" required></select>
</div>
<div class="col-md-6">
<label class="form-label"><span class="label-accum">Accumulated Depreciation</span> Account <span class="text-danger">*</span></label>
<select class="form-select" id="accum_account_code" required></select>
</div>
<div class="col-md-6">
<label class="form-label"><span class="label-expense">Depreciation</span> Expense Account <span class="text-danger">*</span></label>
<select class="form-select" id="expense_account_code" required></select>
</div>
<div class="col-md-6"></div>
<div class="col-md-6">
<label class="form-label">Gain on Disposal Account <span class="text-danger">*</span></label>
<select class="form-select" id="gain_account_code" required></select>
</div>
<div class="col-md-6">
<label class="form-label">Loss on Disposal Account <span class="text-danger">*</span></label>
<select class="form-select" id="loss_account_code" required></select>
</div>
<div class="col-12">
<label class="form-label">Description</label>
<textarea class="form-control" id="description" rows="2" placeholder="Optional"></textarea>
</div>
</div>
<div class="d-flex gap-2 mt-5">
<button class="btn btn-primary" onclick="manage_category();" id="btn_submit" data-min-role="admin">Create Category</button>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<?php require '../include_ending.php'; ?>
<script src="<?php echo $server_url?>assets/js/asset.js"></script>
<script>
var category_id = <?php echo (int)($_GET['id'] ?? 0); ?>;
var accounts = [];
var ACCOUNT_SELECTS = {
cost_account_code: ['asset'],
accum_account_code: ['asset'],
expense_account_code: ['expense'],
gain_account_code: ['revenue'],
loss_account_code: ['expense']
};
function fill_account_selects(values) {
Object.keys(ACCOUNT_SELECTS).forEach(function(field) {
$('#' + field).html(account_options(accounts, ACCOUNT_SELECTS[field], (values || {})[field] || ''));
});
}
function update_class_labels() {
var intangible = $('#asset_class').val() === 'intangible';
$('.label-accum').text(intangible ? 'Accumulated Amortization' : 'Accumulated Depreciation');
$('.label-expense').text(intangible ? 'Amortization' : 'Depreciation');
}
function manage_category() {
return ajax_request({
url: server_url + 'asset/api/engine/manage_category.php',
autoPrepare: true,
checkRequired: 1,
action: 'manage',
onSuccess: function() {
window.location.href = server_url + 'asset/categories.php';
}
});
}
function retrieve_for_edit() {
if (!category_id) return Promise.resolve();
return ajax_request({
url: server_url + 'asset/api/engine/retrieve_category.php',
autoPrepare: true,
checkRequired: 0,
action: 'read',
data: { id: category_id },
onSuccess: function(res) {
var c = res.output;
$('#id').val(c.id);
$('#category_code').val(c.category_code);
$('#category_name').val(c.category_name);
$('#asset_class').val(c.asset_class);
$('#useful_life_months').val(c.useful_life_months);
$('#description').val(c.description || '');
$('#status').val(c.status);
fill_account_selects(c);
update_class_labels();
$('#btn_submit').text('Update Category');
}
});
}
$('#asset_class').on('change', update_class_labels);
$(async function() {
try {
await load_posting_accounts(function(rows) { accounts = rows; fill_account_selects({}); });
await retrieve_for_edit();
} catch (e) { console.log(e); }
});
</script>
</body>
</html>