app settings
This commit is contained in:
@@ -0,0 +1,418 @@
|
||||
<?php
|
||||
session_start();
|
||||
require '../config.php';
|
||||
require '../include_header.php';
|
||||
?>
|
||||
|
||||
<body>
|
||||
<?php require '../include_topbar.php'; ?>
|
||||
<?php require '../include_setting_sidebar.php'; ?>
|
||||
|
||||
<main id="content" class="content py-15">
|
||||
<div class="container-fluid">
|
||||
|
||||
<!-- Page header -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-6 gap-3">
|
||||
<div>
|
||||
<h1 class="fs-3 mb-1">Company Profile</h1>
|
||||
<p class="mb-0">Manage your company information, branding and tax details</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-5">
|
||||
|
||||
<!-- LEFT: Logo / Seal -->
|
||||
<div class="col-lg-3 col-12">
|
||||
|
||||
<!-- Logo card -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-body p-6 text-center">
|
||||
<div class="mb-3">
|
||||
<img id="logo_preview"
|
||||
src="<?php echo $server_url?>assets/images/logo.svg"
|
||||
alt="Company Logo"
|
||||
class="rounded border p-2"
|
||||
style="width:120px;height:120px;object-fit:contain;">
|
||||
</div>
|
||||
<p class="text-muted small mb-3">Company Logo</p>
|
||||
<label class="btn btn-outline-secondary btn-sm w-100 mb-2">
|
||||
<i class="ti ti-upload me-1"></i>Upload Logo
|
||||
<input type="file" id="company_logo" accept="image/*" class="d-none">
|
||||
</label>
|
||||
<button type="button" id="remove_logo_btn"
|
||||
class="btn btn-ghost-danger btn-sm w-100 d-none"
|
||||
onclick="remove_image('logo')">
|
||||
<i class="ti ti-trash me-1"></i>Remove Logo
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Seal card -->
|
||||
<div class="card">
|
||||
<div class="card-body p-6 text-center">
|
||||
<div class="mb-3">
|
||||
<img id="seal_preview"
|
||||
src="<?php echo $server_url?>assets/images/logo.svg"
|
||||
alt="Company Seal"
|
||||
class="rounded border p-2"
|
||||
style="width:120px;height:120px;object-fit:contain;">
|
||||
</div>
|
||||
<p class="text-muted small mb-3">Company Seal</p>
|
||||
<label class="btn btn-outline-secondary btn-sm w-100 mb-2">
|
||||
<i class="ti ti-upload me-1"></i>Upload Seal
|
||||
<input type="file" id="company_seal" accept="image/*" class="d-none">
|
||||
</label>
|
||||
<button type="button" id="remove_seal_btn"
|
||||
class="btn btn-ghost-danger btn-sm w-100 d-none"
|
||||
onclick="remove_image('seal')">
|
||||
<i class="ti ti-trash me-1"></i>Remove Seal
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /LEFT -->
|
||||
|
||||
<!-- RIGHT: Tabbed form -->
|
||||
<div class="col-lg-9 col-12">
|
||||
<div class="card">
|
||||
<div class="card-body p-0">
|
||||
|
||||
<ul class="nav nav-tabs px-6 pt-4" id="companyTabs">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" data-bs-toggle="tab" href="#tab_basic">
|
||||
<i class="ti ti-building me-1"></i>Basic Info
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-bs-toggle="tab" href="#tab_address">
|
||||
<i class="ti ti-map-pin me-1"></i>Address
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-bs-toggle="tab" href="#tab_tax">
|
||||
<i class="ti ti-receipt-tax me-1"></i>Tax & Finance
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-bs-toggle="tab" href="#tab_contact">
|
||||
<i class="ti ti-phone me-1"></i>Contact
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content p-6">
|
||||
|
||||
<!-- Tab 1: Basic Info -->
|
||||
<div class="tab-pane active show" id="tab_basic">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Company Name (TH)</label>
|
||||
<input type="text" class="form-control" id="company_name" placeholder="ชื่อบริษัท">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Company Name (EN)</label>
|
||||
<input type="text" class="form-control" id="company_name2" placeholder="Company Name (English)">
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Nickname / Channel Name</label>
|
||||
<input type="text" class="form-control" id="channel_name" placeholder="e.g. my-shop">
|
||||
<div class="form-text">Unique identifier. Lowercase, no spaces.</div>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label">Branch</label>
|
||||
<input type="text" class="form-control" id="branch" placeholder="สำนักงานใหญ่">
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<label class="form-label">Branch No.</label>
|
||||
<input type="text" class="form-control" id="branch_no" placeholder="00000">
|
||||
</div>
|
||||
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label">Fiscal Year End</label>
|
||||
<select class="form-select" id="fiscal_year">
|
||||
<option value="">— Select month —</option>
|
||||
<?php for ($m = 1; $m <= 12; $m++): ?>
|
||||
<option value="<?php echo str_pad($m, 2, '0', STR_PAD_LEFT); ?>">
|
||||
<?php echo date('F', mktime(0,0,0,$m,1)); ?>
|
||||
</option>
|
||||
<?php endfor; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label">Currency</label>
|
||||
<select class="form-select" id="fx">
|
||||
<option value="thb">THB — Thai Baht</option>
|
||||
<option value="usd">USD — US Dollar</option>
|
||||
<option value="eur">EUR — Euro</option>
|
||||
<option value="sgd">SGD — Singapore Dollar</option>
|
||||
<option value="myr">MYR — Malaysian Ringgit</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div><!-- /tab_basic -->
|
||||
|
||||
<!-- Tab 2: Address -->
|
||||
<div class="tab-pane" id="tab_address">
|
||||
<div class="row">
|
||||
<div class="col-12 mb-3">
|
||||
<label class="form-label">Address</label>
|
||||
<textarea class="form-control" id="address" rows="3"
|
||||
placeholder="Full address…"></textarea>
|
||||
</div>
|
||||
<div class="col-12 mb-3">
|
||||
<label class="form-label">Address 2 <span class="text-muted">(optional)</span></label>
|
||||
<textarea class="form-control" id="address2" rows="2"
|
||||
placeholder="Branch / shipping address…"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /tab_address -->
|
||||
|
||||
<!-- Tab 3: Tax & Finance -->
|
||||
<div class="tab-pane" id="tab_tax">
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Tax ID (เลขประจำตัวผู้เสียภาษี)</label>
|
||||
<input type="text" class="form-control" id="tax_id"
|
||||
placeholder="0-0000-00000-00-0" maxlength="20">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">PromptPay Number</label>
|
||||
<input type="text" class="form-control" id="prompt_pay"
|
||||
placeholder="13-digit PromptPay" maxlength="13">
|
||||
</div>
|
||||
<div class="col-12 mb-3">
|
||||
<label class="form-label">Entrepreneur / Owner Name</label>
|
||||
<input type="text" class="form-control" id="entrepreneur"
|
||||
placeholder="ชื่อผู้ประกอบการ">
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /tab_tax -->
|
||||
|
||||
<!-- Tab 4: Contact -->
|
||||
<div class="tab-pane" id="tab_contact">
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Email</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="ti ti-mail"></i></span>
|
||||
<input type="email" class="form-control" id="email"
|
||||
placeholder="company@example.com">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Phone</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="ti ti-phone"></i></span>
|
||||
<input type="text" class="form-control" id="phone"
|
||||
placeholder="02-xxx-xxxx">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Fax</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="ti ti-printer"></i></span>
|
||||
<input type="text" class="form-control" id="fax"
|
||||
placeholder="02-xxx-xxxx">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Website</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="ti ti-world"></i></span>
|
||||
<input type="url" class="form-control" id="website"
|
||||
placeholder="https://example.com">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label">Facebook Page</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="ti ti-brand-facebook"></i></span>
|
||||
<input type="url" class="form-control" id="facebook_page"
|
||||
placeholder="https://facebook.com/yourpage">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /tab_contact -->
|
||||
|
||||
</div><!-- /tab-content -->
|
||||
</div><!-- /card-body -->
|
||||
|
||||
<div class="card-footer d-flex justify-content-end gap-2">
|
||||
<button class="btn btn-primary" onclick="save_company();">
|
||||
<i class="ti ti-device-floppy me-1"></i>Save Changes
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div><!-- /card -->
|
||||
</div><!-- /RIGHT -->
|
||||
|
||||
</div><!-- /row g-5 -->
|
||||
</div>
|
||||
<?php require '../include_ending.php'; ?>
|
||||
</main>
|
||||
|
||||
|
||||
<script>
|
||||
// ═══════════════════════════════════════════════════════
|
||||
// State
|
||||
// ═══════════════════════════════════════════════════════
|
||||
const api = '<?php echo $server_url?>setting/api/engine/';
|
||||
const img_base = '<?php echo $server_url?>uploads/company/';
|
||||
let _logo_action = 'keep'; // 'keep' | 'replace' | 'remove'
|
||||
let _seal_action = 'keep';
|
||||
|
||||
|
||||
// ═══════════════════════════════════════════════════════
|
||||
// On load
|
||||
// ═══════════════════════════════════════════════════════
|
||||
$(function () {
|
||||
load_company();
|
||||
bind_image_input('#company_logo', '#logo_preview', '#remove_logo_btn', v => _logo_action = v);
|
||||
bind_image_input('#company_seal', '#seal_preview', '#remove_seal_btn', v => _seal_action = v);
|
||||
});
|
||||
|
||||
|
||||
// ═══════════════════════════════════════════════════════
|
||||
// Load
|
||||
// ═══════════════════════════════════════════════════════
|
||||
function load_company() {
|
||||
return ajax_request({
|
||||
url: api + 'retrieve_company.php',
|
||||
autoPrepare: true,
|
||||
checkRequired: 0,
|
||||
action: 'read',
|
||||
onSuccess: function (r) {
|
||||
const c = r.output;
|
||||
|
||||
// Basic info
|
||||
$('#company_name').val(c.company_name || '');
|
||||
$('#company_name2').val(c.company_name2 || '');
|
||||
$('#channel_name').val(c.channel_name || '');
|
||||
$('#branch').val(c.branch || '');
|
||||
$('#branch_no').val(c.branch_no || '');
|
||||
$('#fiscal_year').val(c.fiscal_year || '');
|
||||
$('#fx').val(c.fx || 'thb');
|
||||
|
||||
// Address
|
||||
$('#address').val(c.address || '');
|
||||
$('#address2').val(c.address2 || '');
|
||||
|
||||
// Tax & Finance
|
||||
$('#tax_id').val(c.tax_id || '');
|
||||
$('#prompt_pay').val(c.prompt_pay || '');
|
||||
$('#entrepreneur').val(c.entrepreneur || '');
|
||||
|
||||
// Contact
|
||||
$('#email').val(c.email || '');
|
||||
$('#phone').val(c.phone || '');
|
||||
$('#fax').val(c.fax || '');
|
||||
$('#website').val(c.website || '');
|
||||
$('#facebook_page').val(c.facebook_page || '');
|
||||
|
||||
// Images
|
||||
if (c.company_logo) {
|
||||
$('#logo_preview').attr('src', img_base + c.company_logo);
|
||||
$('#remove_logo_btn').removeClass('d-none');
|
||||
}
|
||||
if (c.company_seal) {
|
||||
$('#seal_preview').attr('src', img_base + c.company_seal);
|
||||
$('#remove_seal_btn').removeClass('d-none');
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// ═══════════════════════════════════════════════════════
|
||||
// Save
|
||||
// ═══════════════════════════════════════════════════════
|
||||
function save_company() {
|
||||
const fd = new FormData();
|
||||
|
||||
// Only files + action flags — all text fields (.form-control / .form-select)
|
||||
// are collected automatically by autoPrepare → prepare_form_data()
|
||||
fd.append('logo_action', _logo_action);
|
||||
fd.append('seal_action', _seal_action);
|
||||
const logo_file = $('#company_logo')[0].files[0];
|
||||
const seal_file = $('#company_seal')[0].files[0];
|
||||
if (logo_file) fd.append('company_logo', logo_file);
|
||||
if (seal_file) fd.append('company_seal', seal_file);
|
||||
|
||||
return ajax_request({
|
||||
url: api + 'manage_company.php',
|
||||
autoPrepare: true,
|
||||
checkRequired: 0,
|
||||
action: 'update',
|
||||
formData: fd,
|
||||
onSuccess: function (r) {
|
||||
if (r.company_logo !== undefined) {
|
||||
refresh_image_slot(
|
||||
'logo', r.company_logo,
|
||||
'#logo_preview', '#remove_logo_btn', '#company_logo'
|
||||
);
|
||||
_logo_action = 'keep';
|
||||
}
|
||||
if (r.company_seal !== undefined) {
|
||||
refresh_image_slot(
|
||||
'seal', r.company_seal,
|
||||
'#seal_preview', '#remove_seal_btn', '#company_seal'
|
||||
);
|
||||
_seal_action = 'keep';
|
||||
}
|
||||
bootbox.alert('Company profile saved.');
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// ═══════════════════════════════════════════════════════
|
||||
// Image helpers
|
||||
// ═══════════════════════════════════════════════════════
|
||||
function bind_image_input(input_sel, preview_sel, remove_btn_sel, set_action) {
|
||||
$(input_sel).on('change', function () {
|
||||
const file = this.files[0];
|
||||
if (!file) return;
|
||||
const reader = new FileReader();
|
||||
reader.onload = e => {
|
||||
$(preview_sel).attr('src', e.target.result);
|
||||
$(remove_btn_sel).removeClass('d-none');
|
||||
set_action('replace');
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
});
|
||||
}
|
||||
|
||||
function remove_image(slot) {
|
||||
if (slot === 'logo') {
|
||||
$('#logo_preview').attr('src', '<?php echo $server_url?>assets/images/logo.svg');
|
||||
$('#company_logo').val('');
|
||||
$('#remove_logo_btn').addClass('d-none');
|
||||
_logo_action = 'remove';
|
||||
} else {
|
||||
$('#seal_preview').attr('src', '<?php echo $server_url?>assets/images/logo.svg');
|
||||
$('#company_seal').val('');
|
||||
$('#remove_seal_btn').addClass('d-none');
|
||||
_seal_action = 'remove';
|
||||
}
|
||||
}
|
||||
|
||||
function refresh_image_slot(slot, filename, preview_sel, remove_btn_sel, input_sel) {
|
||||
const fallback = '<?php echo $server_url?>assets/images/logo.svg';
|
||||
const src = filename ? img_base + filename + '?t=' + Date.now() : fallback;
|
||||
$(preview_sel).attr('src', src);
|
||||
filename
|
||||
? $(remove_btn_sel).removeClass('d-none')
|
||||
: $(remove_btn_sel).addClass('d-none');
|
||||
$(input_sel).val('');
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user