167 lines
8.1 KiB
PHP
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();
|
|
?>
|