38787-vm/members.php
Flatlogic Bot 2aceb3f714 12
2026-02-26 14:34:12 +00:00

167 lines
8.1 KiB
PHP

<?php
require_once 'layout.php';
require_once 'db/config.php';
$pdo = db();
$tenant_id = 1; // Demo SACCO
$action = $_GET['action'] ?? 'list';
$message = '';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'add') {
$first_name = $_POST['first_name'] ?? '';
$last_name = $_POST['last_name'] ?? '';
$email = $_POST['email'] ?? '';
$phone = $_POST['phone'] ?? '';
$member_number = $_POST['member_number'] ?? '';
if (empty($first_name) || empty($last_name) || empty($member_number)) {
$error = 'First name, last_name, and member number are required.';
} else {
try {
$stmt = $pdo->prepare('INSERT INTO members (tenant_id, member_number, first_name, last_name, email, phone) VALUES (?, ?, ?, ?, ?, ?)');
$stmt->execute([$tenant_id, $member_number, $first_name, $last_name, $email, $phone]);
$message = 'Member registered successfully!';
$action = 'list';
} catch (PDOException $e) {
if ($e->getCode() == 23000) {
$error = 'Member number already exists.';
} else {
$error = 'An error occurred: ' . $e->getMessage();
}
}
}
}
render_header('Members - MicroFinance Pro');
?>
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h4 font-weight-bold">Member Management</h1>
<div class="btn-toolbar mb-2 mb-md-0">
<?php if ($action === 'list'): ?>
<a href="members.php?action=add" class="btn btn-sm btn-primary"><i class="bi bi-person-plus me-1"></i> Add New Member</a>
<?php else: ?>
<a href="members.php" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left me-1"></i> Back to List</a>
<?php endif; ?>
</div>
</div>
<?php if ($message): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="bi bi-check-circle me-2"></i> <?= htmlspecialchars($message) ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if ($error): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="bi bi-exclamation-triangle me-2"></i> <?= htmlspecialchars($error) ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if ($action === 'add'): ?>
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Register New Member</div>
<div class="card-body">
<form method="POST" action="members.php?action=add">
<div class="row">
<div class="col-md-6 mb-3">
<label for="first_name" class="form-label">First Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="first_name" name="first_name" required>
</div>
<div class="col-md-6 mb-3">
<label for="last_name" class="form-label">Last Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="last_name" name="last_name" required>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="member_number" class="form-label">Member Number <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="member_number" name="member_number" placeholder="e.g. M001" required>
</div>
<div class="col-md-6 mb-3">
<label for="phone" class="form-label">Phone Number</label>
<input type="text" class="form-control" id="phone" name="phone" placeholder="+254...">
</div>
</div>
<div class="mb-3">
<label for="email" class="form-label">Email Address</label>
<input type="email" class="form-control" id="email" name="email" placeholder="john@example.com">
</div>
<div class="d-flex justify-content-end gap-2">
<a href="members.php" class="btn btn-outline-secondary">Cancel</a>
<button type="submit" class="btn btn-primary">Register Member</button>
</div>
</form>
</div>
</div>
</div>
</div>
<?php else: ?>
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>Members List</span>
<div class="input-group input-group-sm" style="max-width: 300px;">
<input type="text" class="form-control" placeholder="Search members...">
<button class="btn btn-outline-secondary" type="button"><i class="bi bi-search"></i></button>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Member No.</th>
<th>Phone</th>
<th>Email</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php
$members = $pdo->query('SELECT * FROM members WHERE tenant_id = 1 ORDER BY created_at DESC')->fetchAll();
if (empty($members)):
?>
<tr>
<td colspan="7" class="text-center py-5 text-muted">
<div class="mb-2"><i class="bi bi-people" style="font-size: 2rem;"></i></div>
<p>No members found in the database.</p>
<a href="members.php?action=add" class="btn btn-sm btn-primary">Add First Member</a>
</td>
</tr>
<?php else: foreach ($members as $m): ?>
<tr>
<td><?= htmlspecialchars($m['id']) ?></td>
<td class="fw-semibold"><?= htmlspecialchars($m['first_name'] . ' ' . $m['last_name']) ?></td>
<td><code><?= htmlspecialchars($m['member_number']) ?></code></td>
<td><?= htmlspecialchars($m['phone'] ?: '-') ?></td>
<td><?= htmlspecialchars($m['email'] ?: '-') ?></td>
<td><span class="badge badge-active rounded-pill px-2">Active</span></td>
<td>
<div class="btn-group">
<button class="btn btn-sm btn-outline-secondary border-0"><i class="bi bi-eye"></i></button>
<button class="btn btn-sm btn-outline-secondary border-0"><i class="bi bi-pencil"></i></button>
<button class="btn btn-sm btn-outline-secondary border-0 text-danger"><i class="bi bi-trash"></i></button>
</div>
</td>
</tr>
<?php endforeach; endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php endif; ?>
<?php
render_footer();
?>