348 lines
18 KiB
PHP
348 lines
18 KiB
PHP
<?php
|
|
/**
|
|
* Settings Page - Manage System Datasets
|
|
*/
|
|
declare(strict_types=1);
|
|
require_once __DIR__ . '/db/config.php';
|
|
|
|
$tenant_id = 1;
|
|
|
|
// Handle Form Submissions
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$action = $_POST['action'] ?? '';
|
|
$id = (int)($_POST['id'] ?? 0);
|
|
$name = $_POST['name'] ?? '';
|
|
$error = '';
|
|
|
|
if ($action === 'add_labour_type' && $name) {
|
|
$stmt = db()->prepare("INSERT INTO labour_types (tenant_id, name) VALUES (?, ?)");
|
|
$stmt->execute([$tenant_id, $name]);
|
|
} elseif ($action === 'edit_labour_type' && $id && $name) {
|
|
$stmt = db()->prepare("UPDATE labour_types SET name = ? WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$name, $id, $tenant_id]);
|
|
} elseif ($action === 'delete_labour_type' && $id) {
|
|
$check = db()->prepare("SELECT COUNT(*) FROM labour_entries WHERE labour_type_id = ? AND tenant_id = ?");
|
|
$check->execute([$id, $tenant_id]);
|
|
if ($check->fetchColumn() > 0) {
|
|
$error = "Cannot delete: Labour type is used in labour entries.";
|
|
} else {
|
|
$stmt = db()->prepare("DELETE FROM labour_types WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$id, $tenant_id]);
|
|
}
|
|
}
|
|
|
|
elseif ($action === 'add_evidence_type' && $name) {
|
|
$stmt = db()->prepare("INSERT INTO evidence_types (tenant_id, name) VALUES (?, ?)");
|
|
$stmt->execute([$tenant_id, $name]);
|
|
} elseif ($action === 'edit_evidence_type' && $id && $name) {
|
|
$stmt = db()->prepare("UPDATE evidence_types SET name = ? WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$name, $id, $tenant_id]);
|
|
} elseif ($action === 'delete_evidence_type' && $id) {
|
|
$check = db()->prepare("SELECT COUNT(*) FROM labour_entries WHERE evidence_type_id = ? AND tenant_id = ?");
|
|
$check->execute([$id, $tenant_id]);
|
|
if ($check->fetchColumn() > 0) {
|
|
$error = "Cannot delete: Evidence type is used in labour entries.";
|
|
} else {
|
|
$stmt = db()->prepare("DELETE FROM evidence_types WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$id, $tenant_id]);
|
|
}
|
|
}
|
|
|
|
elseif ($action === 'add_expense_type' && $name) {
|
|
$stmt = db()->prepare("INSERT INTO expense_types (tenant_id, name) VALUES (?, ?)");
|
|
$stmt->execute([$tenant_id, $name]);
|
|
} elseif ($action === 'edit_expense_type' && $id && $name) {
|
|
$stmt = db()->prepare("UPDATE expense_types SET name = ? WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$name, $id, $tenant_id]);
|
|
} elseif ($action === 'delete_expense_type' && $id) {
|
|
$check = db()->prepare("SELECT COUNT(*) FROM expenses WHERE expense_type_id = ? AND tenant_id = ?");
|
|
$check->execute([$id, $tenant_id]);
|
|
if ($check->fetchColumn() > 0) {
|
|
$error = "Cannot delete: Expense type is used in expense logs.";
|
|
} else {
|
|
$stmt = db()->prepare("DELETE FROM expense_types WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$id, $tenant_id]);
|
|
}
|
|
}
|
|
|
|
elseif ($action === 'add_team' && $name) {
|
|
$stmt = db()->prepare("INSERT INTO teams (tenant_id, name) VALUES (?, ?)");
|
|
$stmt->execute([$tenant_id, $name]);
|
|
} elseif ($action === 'edit_team' && $id && $name) {
|
|
$stmt = db()->prepare("UPDATE teams SET name = ? WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$name, $id, $tenant_id]);
|
|
} elseif ($action === 'delete_team' && $id) {
|
|
$check = db()->prepare("SELECT COUNT(*) FROM employee_teams WHERE team_id = ? AND tenant_id = ?");
|
|
$check->execute([$id, $tenant_id]);
|
|
if ($check->fetchColumn() > 0) {
|
|
$error = "Cannot delete: Team has assigned employees.";
|
|
} else {
|
|
$stmt = db()->prepare("DELETE FROM teams WHERE id = ? AND tenant_id = ?");
|
|
$stmt->execute([$id, $tenant_id]);
|
|
}
|
|
}
|
|
|
|
if ($error) {
|
|
header("Location: settings.php?error=" . urlencode($error));
|
|
} else {
|
|
header("Location: settings.php?success=1");
|
|
}
|
|
exit;
|
|
}
|
|
|
|
// Fetch all datasets
|
|
$labourTypes = db()->prepare("SELECT * FROM labour_types WHERE tenant_id = ? ORDER BY name");
|
|
$labourTypes->execute([$tenant_id]);
|
|
$labourTypeList = $labourTypes->fetchAll();
|
|
|
|
$evidenceTypes = db()->prepare("SELECT * FROM evidence_types WHERE tenant_id = ? ORDER BY name");
|
|
$evidenceTypes->execute([$tenant_id]);
|
|
$evidenceTypeList = $evidenceTypes->fetchAll();
|
|
|
|
$expenseTypes = db()->prepare("SELECT * FROM expense_types WHERE tenant_id = ? ORDER BY name");
|
|
$expenseTypes->execute([$tenant_id]);
|
|
$expenseTypeList = $expenseTypes->fetchAll();
|
|
|
|
$teams = db()->prepare("SELECT * FROM teams WHERE tenant_id = ? ORDER BY name");
|
|
$teams->execute([$tenant_id]);
|
|
$teamList = $teams->fetchAll();
|
|
|
|
$pageTitle = "SR&ED Manager - Settings";
|
|
include __DIR__ . '/includes/header.php';
|
|
?>
|
|
|
|
<div class="container-fluid py-4">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h4 class="fw-bold mb-0">System Settings & Datasets</h4>
|
|
<div class="d-flex gap-2">
|
|
<?php if (isset($_GET['success'])): ?>
|
|
<span class="badge bg-success py-2 px-3">Dataset updated successfully</span>
|
|
<?php endif; ?>
|
|
<?php if (isset($_GET['error'])): ?>
|
|
<span class="badge bg-danger py-2 px-3"><?= htmlspecialchars($_GET['error']) ?></span>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<!-- Labour Types -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm">
|
|
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
|
<span class="fw-bold">Labour Types</span>
|
|
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#addLabourTypeModal">+ Add</button>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead><tr><th>Name</th><th class="text-end">Actions</th></tr></thead>
|
|
<tbody>
|
|
<?php foreach ($labourTypeList as $item): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($item['name']) ?></td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-link text-primary p-0 me-2" onclick="editItem('edit_labour_type', <?= $item['id'] ?>, '<?= addslashes($item['name']) ?>')">Edit</button>
|
|
<button class="btn btn-sm btn-link text-danger p-0" onclick="deleteItem('delete_labour_type', <?= $item['id'] ?>)">Delete</button>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Evidence Types -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm">
|
|
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
|
<span class="fw-bold">Evidence Types</span>
|
|
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#addEvidenceTypeModal">+ Add</button>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead><tr><th>Name</th><th class="text-end">Actions</th></tr></thead>
|
|
<tbody>
|
|
<?php foreach ($evidenceTypeList as $item): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($item['name']) ?></td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-link text-primary p-0 me-2" onclick="editItem('edit_evidence_type', <?= $item['id'] ?>, '<?= addslashes($item['name']) ?>')">Edit</button>
|
|
<button class="btn btn-sm btn-link text-danger p-0" onclick="deleteItem('delete_evidence_type', <?= $item['id'] ?>)">Delete</button>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Expense Types -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm">
|
|
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
|
<span class="fw-bold">Expense Types</span>
|
|
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#addExpenseTypeModal">+ Add</button>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead><tr><th>Name</th><th class="text-end">Actions</th></tr></thead>
|
|
<tbody>
|
|
<?php foreach ($expenseTypeList as $item): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($item['name']) ?></td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-link text-primary p-0 me-2" onclick="editItem('edit_expense_type', <?= $item['id'] ?>, '<?= addslashes($item['name']) ?>')">Edit</button>
|
|
<button class="btn btn-sm btn-link text-danger p-0" onclick="deleteItem('delete_expense_type', <?= $item['id'] ?>)">Delete</button>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Teams -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm">
|
|
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
|
<span class="fw-bold">Teams</span>
|
|
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#addTeamModal">+ Add</button>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle mb-0">
|
|
<thead><tr><th>Name</th><th class="text-end">Actions</th></tr></thead>
|
|
<tbody>
|
|
<?php foreach ($teamList as $item): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($item['name']) ?></td>
|
|
<td class="text-end">
|
|
<button class="btn btn-sm btn-link text-primary p-0 me-2" onclick="editItem('edit_team', <?= $item['id'] ?>, '<?= addslashes($item['name']) ?>')">Edit</button>
|
|
<button class="btn btn-sm btn-link text-danger p-0" onclick="deleteItem('delete_team', <?= $item['id'] ?>)">Delete</button>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Data Management -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm">
|
|
<div class="card-header bg-white">
|
|
<span class="fw-bold">Data Management & Imports</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="small text-muted mb-4">Import legacy data or bulk records from other systems using CSV templates.</p>
|
|
<div class="d-grid gap-3">
|
|
<a href="import_suppliers.php" class="btn btn-outline-secondary d-flex justify-content-between align-items-center py-2">
|
|
<span><i class="bi bi-truck me-2"></i>Import Suppliers</span>
|
|
<i class="bi bi-chevron-right"></i>
|
|
</a>
|
|
<a href="import_expenses.php" class="btn btn-outline-secondary d-flex justify-content-between align-items-center py-2">
|
|
<span><i class="bi bi-receipt me-2"></i>Import Expenses</span>
|
|
<i class="bi bi-chevron-right"></i>
|
|
</a>
|
|
<a href="import_labour.php" class="btn btn-outline-secondary d-flex justify-content-between align-items-center py-2">
|
|
<span><i class="bi bi-clock-history me-2"></i>Import Labour Activities</span>
|
|
<i class="bi bi-chevron-right"></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Company Configuration -->
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 border-0 shadow-sm text-white" style="background: linear-gradient(135deg, #0d6efd 0%, #0a58ca 100%);">
|
|
<div class="card-body d-flex flex-column justify-content-center align-items-center text-center py-5">
|
|
<i class="bi bi-building fs-1 mb-3"></i>
|
|
<h5 class="fw-bold">Company Preferences</h5>
|
|
<p class="small mb-4 opacity-75">Configure your company identity, logo, fiscal year end, and notification settings.</p>
|
|
<a href="company_settings.php" class="btn btn-light px-4 rounded-pill fw-bold">Manage Company Info</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal fade" id="editItemModal" tabindex="-1">
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content border-0 shadow">
|
|
<div class="modal-header"><h5 class="modal-title fw-bold" id="editItemTitle">Edit Item</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
|
|
<form method="POST">
|
|
<div class="modal-body">
|
|
<input type="hidden" name="action" id="editItemAction">
|
|
<input type="hidden" name="id" id="editItemId">
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-bold">Name</label>
|
|
<input type="text" name="name" id="editItemName" class="form-control" required>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer border-0"><button type="submit" class="btn btn-primary px-4">Save Changes</button></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<form id="deleteForm" method="POST" style="display:none;">
|
|
<input type="hidden" name="action" id="deleteAction">
|
|
<input type="hidden" name="id" id="deleteId">
|
|
</form>
|
|
|
|
<script>
|
|
function editItem(action, id, name) {
|
|
document.getElementById('editItemAction').value = action;
|
|
document.getElementById('editItemId').value = id;
|
|
document.getElementById('editItemName').value = name;
|
|
document.getElementById('editItemTitle').innerText = 'Edit ' + action.replace('edit_', '').replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase());
|
|
new bootstrap.Modal(document.getElementById('editItemModal')).show();
|
|
}
|
|
|
|
function deleteItem(action, id) {
|
|
if (confirm('Are you sure you want to delete this item? This action cannot be undone.')) {
|
|
document.getElementById('deleteAction').value = action;
|
|
document.getElementById('deleteId').value = id;
|
|
document.getElementById('deleteForm').submit();
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<!-- Modals -->
|
|
<?php
|
|
$modals = [
|
|
['id' => 'addLabourTypeModal', 'title' => 'Add Labour Type', 'action' => 'add_labour_type'],
|
|
['id' => 'addEvidenceTypeModal', 'title' => 'Add Evidence Type', 'action' => 'add_evidence_type'],
|
|
['id' => 'addExpenseTypeModal', 'title' => 'Add Expense Type', 'action' => 'add_expense_type'],
|
|
['id' => 'addTeamModal', 'title' => 'Add Team', 'action' => 'add_team'],
|
|
];
|
|
foreach ($modals as $m):
|
|
?>
|
|
<div class="modal fade" id="<?= $m['id'] ?>" tabindex="-1">
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content border-0 shadow">
|
|
<div class="modal-header"><h5 class="modal-title fw-bold"><?= $m['title'] ?></h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
|
|
<form method="POST">
|
|
<div class="modal-body">
|
|
<input type="hidden" name="action" value="<?= $m['action'] ?>">
|
|
<div class="mb-3">
|
|
<label class="form-label small fw-bold">Name</label>
|
|
<input type="text" name="name" class="form-control" placeholder="Enter name..." required>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer border-0"><button type="submit" class="btn btn-primary px-4">Add Item</button></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
|
|
<?php include __DIR__ . '/includes/footer.php'; ?>
|