« Back to History
employee_bank_data.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('employee_bank_data'); $COMPANY_ID = (int)($ctx['company_id'] ?? 0); $pdo = $ctx['pdo'] ?? null; if (!($pdo instanceof PDO)) require_once __DIR__ . '/core/db.php'; function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function pv($k,$d=''){ return isset($_POST[$k]) ? trim($_POST[$k]) : $d; } function archive_deleted_bank_ac(PDO $pdo, int $companyId, string $acno, string $refTable, int $refId, int $employeeId = 0, int $departmentId = 0): void { $acno = trim($acno); if ($acno === '') return; $st = $pdo->prepare("INSERT INTO deleted_bank_ac (company_id, bank_ac_no, ref_table, ref_id, employee_id, department_id, deleted_at) VALUES (?, ?, ?, ?, ?, ?, NOW())"); $st->execute([$companyId, $acno, $refTable, $refId, $employeeId, $departmentId]); } /* ================= SAVE / UPDATE ================= */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $op = $_GET['op'] ?? 'save'; $edit_id = (int) pv('edit_id', 0); $employee_id = $edit_id > 0 ? $edit_id : (int) pv('employee_id', 0); if (!$employee_id) { $_SESSION['flash_err'] = 'Employee is required'; header("Location: employee_bank_data.php"); exit; } $oldSt = $pdo->prepare("SELECT account_number, beneficiary_name, ifsc FROM company_employee_master WHERE id = :eid AND company_id = :cid LIMIT 1"); $oldSt->execute([':eid' => $employee_id, ':cid' => $COMPANY_ID]); $old = $oldSt->fetch(PDO::FETCH_ASSOC); if (!$old) { $_SESSION['flash_err'] = 'Employee not found'; header("Location: employee_bank_data.php"); exit; } if ($op === 'delete') { $oldAc = trim((string)($old['account_number'] ?? '')); if ($oldAc !== '') { archive_deleted_bank_ac($pdo, $COMPANY_ID, $oldAc, 'company_employee_master', $employee_id, $employee_id, 0); } $st = $pdo->prepare(" UPDATE company_employee_master SET account_number = '', beneficiary_name = '', ifsc = '', updated_at = NOW() WHERE id = :eid AND company_id = :cid LIMIT 1 "); $st->execute([':eid' => $employee_id, ':cid' => $COMPANY_ID]); require_once __DIR__ . '/helpers/activity_helper.php'; log_activity([ 'activity_type' => 'entry', 'module_name' => 'employee_bank_data', 'action_name' => 'delete', 'activity_note' => "Bank data deleted for Employee ID: $employee_id", 'reference_id' => $employee_id, ]); $_SESSION['flash_ok'] = 'Bank data deleted and moved to deleted account history'; header("Location: employee_bank_data.php"); exit; } $acno = pv('account_number'); $bname = pv('beneficiary_name'); $ifsc = strtoupper(pv('ifsc')); if ($acno==='' || $bname==='' || $ifsc==='') { $_SESSION['flash_err'] = 'All fields are required'; header("Location: employee_bank_data.php"); exit; } if (!preg_match('/^[0-9]+$/', $acno)) { $_SESSION['flash_err'] = 'Account number should contain digits only'; header("Location: employee_bank_data.php"); exit; } if (preg_match('/[0-9]/', $bname)) { $_SESSION['flash_err'] = 'Beneficiary name cannot contain numbers'; header("Location: employee_bank_data.php"); exit; } $oldAc = trim((string)($old['account_number'] ?? '')); if ($oldAc !== '' && $oldAc !== $acno) { archive_deleted_bank_ac($pdo, $COMPANY_ID, $oldAc, 'company_employee_master', $employee_id, $employee_id, 0); } $st = $pdo->prepare(" UPDATE company_employee_master SET account_number = :acno, beneficiary_name = :bname, ifsc = :ifsc, updated_at = NOW() WHERE id = :eid AND company_id = :cid LIMIT 1 "); $st->execute([ ':acno' => $acno, ':bname'=> $bname, ':ifsc' => $ifsc, ':eid' => $employee_id, ':cid' => $COMPANY_ID ]); $_SESSION['flash_ok'] = $edit_id ? 'Bank data updated' : 'Bank data saved'; require_once __DIR__ . '/helpers/activity_helper.php'; log_activity([ 'activity_type' => 'entry', 'module_name' => 'employee_bank_data', 'action_name' => $edit_id ? 'update_save' : 'add_save', 'activity_note' => "Bank data saved for Employee ID: $employee_id, AC: $acno, Name: $bname, IFSC: $ifsc", 'reference_id' => $employee_id, ]); header("Location: employee_bank_data.php"); exit; } /* ================= DATA ================= */ $departments = $pdo->query(" SELECT DISTINCT department_name FROM company_employee_master WHERE company_id = $COMPANY_ID AND department_name <> '' ORDER BY department_name ")->fetchAll(PDO::FETCH_COLUMN); $employees = $pdo->query(" SELECT id, name, department_name FROM company_employee_master WHERE company_id = $COMPANY_ID ORDER BY name ")->fetchAll(PDO::FETCH_ASSOC); $rows = $pdo->query(" SELECT id, name, department_name, account_number, beneficiary_name, ifsc FROM company_employee_master WHERE company_id = $COMPANY_ID AND account_number <> '' ORDER BY id DESC LIMIT 500 ")->fetchAll(PDO::FETCH_ASSOC); require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid py-4"> <h4 class="fw-bold mb-4">Employee Bank Data</h4> <?php if(!empty($_SESSION['flash_ok'])): ?> <div class="alert alert-success"> <?=h($_SESSION['flash_ok']); unset($_SESSION['flash_ok']);?> </div> <?php endif; ?> <?php if(!empty($_SESSION['flash_err'])): ?> <div class="alert alert-danger"> <?=h($_SESSION['flash_err']); unset($_SESSION['flash_err']);?> </div> <?php endif; ?> <!-- FORM --> <div class="card shadow-sm border-0 mb-4"> <div class="card-body"> <form method="post"> <input type="hidden" name="edit_id" id="edit_id"> <div class="row g-3"> <div class="col-md-3"> <label class="form-label">Department</label> <select id="dept_filter" class="form-select"> <option value="">All</option> <?php foreach($departments as $d): ?> <option value="<?=h($d)?>"><?=h($d)?></option> <?php endforeach; ?> </select> </div> <div class="col-md-3"> <label class="form-label">Employee</label> <select name="employee_id" id="emp_select" class="form-select" required> <option value="">Select…</option> <?php foreach($employees as $e): ?> <option value="<?=$e['id']?>" data-dept="<?=h($e['department_name'])?>"> <?=h($e['name'])?> </option> <?php endforeach; ?> </select> </div> <div class="col-md-3"> <label class="form-label">Account Number</label> <input name="account_number" class="form-control" inputmode="numeric" pattern="^[0-9]+$" title="Account number should contain digits only" required> </div> <div class="col-md-3"> <label class="form-label">Beneficiary Name</label> <input name="beneficiary_name" class="form-control" pattern="^[A-Za-z .]+$" title="Beneficiary name should contain letters only" required> </div> <div class="col-md-3"> <label class="form-label">IFSC Code</label> <input name="ifsc" class="form-control" required> </div> <div class="col-12 text-end mt-2"> <button class="btn btn-primary px-4 fw-semibold"> Save / Update </button> </div> </div> </form> </div> </div> <!-- TABLE --> <div class="card shadow-sm border-0"> <div class="card-body"> <div class="table-responsive"> <table class="table table-hover align-middle"> <thead class="table-light"> <tr> <th>ID</th> <th>Name</th> <th>Department</th> <th>Account No</th> <th>Beneficiary</th> <th>IFSC</th> <th>Action</th> </tr> </thead> <tbody> <?php if(!$rows): ?> <tr> <td colspan="7" class="text-center text-muted"> No bank data saved </td> </tr> <?php else: foreach($rows as $r): ?> <tr> <td><?=$r['id']?></td> <td><?=h($r['name'])?></td> <td><?=h($r['department_name'])?></td> <td><?=h($r['account_number'])?></td> <td><?=h($r['beneficiary_name'])?></td> <td><?=h($r['ifsc'])?></td> <td> <div class="d-inline-flex gap-2"> <button class="btn btn-sm btn-warning editBtn" data-id="<?=$r['id']?>" data-ac="<?=h($r['account_number'])?>" data-name="<?=h($r['beneficiary_name'])?>" data-ifsc="<?=h($r['ifsc'])?>"> Edit </button> <form method="post" action="employee_bank_data.php?op=delete" onsubmit="return confirm('Delete bank details? Old account will be moved to deleted_bank_ac history.');" class="d-inline"> <input type="hidden" name="edit_id" value="<?=$r['id']?>"> <button type="submit" class="btn btn-sm btn-outline-danger">Delete</button> </form> </div> </td> </tr> <?php endforeach; endif; ?> </tbody> </table> </div> </div> </div> </div> <script> const dept = document.getElementById('dept_filter'); const emp = document.getElementById('emp_select'); dept.onchange = () => { [...emp.options].forEach(o=>{ if(!o.value) return; o.hidden = dept.value && o.dataset.dept !== dept.value; }); emp.value = ''; }; // EDIT FUNCTION document.querySelectorAll('.editBtn').forEach(btn => { btn.addEventListener('click', () => { document.getElementById('emp_select').value = btn.dataset.id; document.querySelector('[name="account_number"]').value = btn.dataset.ac; document.querySelector('[name="beneficiary_name"]').value = btn.dataset.name; document.querySelector('[name="ifsc"]').value = btn.dataset.ifsc; document.getElementById('edit_id').value = btn.dataset.id; window.scrollTo({ top: 0, behavior: 'smooth' }); }); }); const acInput = document.querySelector('[name="account_number"]'); if (acInput) { acInput.addEventListener('input', () => { acInput.value = acInput.value.replace(/\D/g, ''); }); } const beneInput = document.querySelector('[name="beneficiary_name"]'); if (beneInput) { beneInput.addEventListener('input', () => { beneInput.value = beneInput.value.replace(/[0-9]/g, ''); }); } </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>