Sindbad~EG File Manager
<?php
/**
* Officership Management Class
* Handles operations for church officers, ordination, retirement, and transfers
*/
class Officership {
private $pdo;
// Officer title classifications
private $pastorate_titles = ['Apostle', 'Prophet', 'Evangelist', 'Pastor', 'Overseer', 'Probational Overseer'];
private $officer_titles = ['Elder', 'Deacon', 'Deaconess'];
private $all_officer_titles = ['Apostle', 'Prophet', 'Evangelist', 'Pastor', 'Overseer', 'Probational Overseer', 'Elder', 'Deacon', 'Deaconess'];
public function __construct($pdo) {
$this->pdo = $pdo;
}
public function isPastorate($title) {
return in_array($title, $this->pastorate_titles);
}
public function isOfficer($title) {
return in_array($title, $this->officer_titles);
}
public function isOfficerTitle($title) {
return in_array($title, $this->all_officer_titles);
}
// Get Pastorate count by district
public function getPastorateCounts() {
$sql = "SELECT
m.title,
d.district_name,
d.id as district_id,
COUNT(m.id) as count
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')
AND m.is_active = 1
AND m.id NOT IN (SELECT member_id FROM retiree_details)
GROUP BY m.title, d.id
ORDER BY d.district_name, m.title";
$stmt = $this->pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// If no results, return array with all titles showing 0
if (empty($results)) {
$results = [];
foreach ($this->pastorate_titles as $title) {
$results[] = [
'title' => $title,
'district_name' => null,
'district_id' => null,
'count' => 0
];
}
}
return $results;
}
// Get Officers count by district
public function getOfficersCounts() {
$sql = "SELECT m.title, d.district_name, d.id as district_id, COUNT(m.id) as count
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')
AND m.is_active = 1
AND m.id NOT IN (SELECT member_id FROM retiree_details)
GROUP BY m.title, d.id ORDER BY d.district_name, m.title";
$stmt = $this->pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// If no results, return array with all titles showing 0
if (empty($results)) {
$results = [];
foreach ($this->officer_titles as $title) {
$results[] = [
'title' => $title,
'district_name' => null,
'district_id' => null,
'count' => 0
];
}
}
return $results;
}
// Get Retiree Pastorate count
public function getRetireePastorateCounts() {
$sql = "SELECT m.title, COUNT(DISTINCT m.id) as count
FROM members m
INNER JOIN retiree_details r ON m.id = r.member_id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')
GROUP BY m.title ORDER BY m.title";
$stmt = $this->pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// If no results, return array with all titles showing 0
if (empty($results)) {
$results = [];
foreach ($this->pastorate_titles as $title) {
$results[] = [
'title' => $title,
'count' => 0
];
}
}
return $results;
}
// Get Retiree Officers count
public function getRetireeOfficersCounts() {
$sql = "SELECT m.title, COUNT(DISTINCT m.id) as count
FROM members m
INNER JOIN retiree_details r ON m.id = r.member_id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')
GROUP BY m.title ORDER BY m.title";
$stmt = $this->pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// If no results, return array with all titles showing 0
if (empty($results)) {
$results = [];
foreach ($this->officer_titles as $title) {
$results[] = [
'title' => $title,
'count' => 0
];
}
}
return $results;
}
// Get Pastorate Transfer counts
public function getPastorateTransferCounts() {
$sql = "SELECT t.officer_title as title, t.transfer_type,
COUNT(t.id) as count
FROM officer_transfers t
WHERE t.officer_title IN ('" . implode("','", $this->pastorate_titles) . "')
AND t.status = 'completed'
GROUP BY t.officer_title, t.transfer_type";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get Officers Transfer counts
public function getOfficersTransferCounts() {
$sql = "SELECT t.officer_title as title, t.transfer_type,
COUNT(t.id) as count
FROM officer_transfers t
WHERE t.officer_title IN ('" . implode("','", $this->officer_titles) . "')
AND t.status = 'completed'
GROUP BY t.officer_title, t.transfer_type";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get recent pastorate (last 10)
public function getRecentPastorate($limit = 10) {
$sql = "SELECT m.id, m.title,
CONCAT(COALESCE(m.first_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, o.date_ordained, o.card_no
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN ordination o ON m.id = o.member_id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')
AND m.is_active = 1
AND m.id NOT IN (SELECT member_id FROM retiree_details)
ORDER BY o.date_ordained DESC, m.id DESC LIMIT ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$limit]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get recent officers (last 10)
public function getRecentOfficers($limit = 10) {
$sql = "SELECT m.id, m.title,
CONCAT(COALESCE(m.first_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, o.date_ordained, o.card_no
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN ordination o ON m.id = o.member_id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')
AND m.is_active = 1
AND m.id NOT IN (SELECT member_id FROM retiree_details)
ORDER BY o.date_ordained DESC, m.id DESC LIMIT ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$limit]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get complete officer details
public function getOfficerDetails($member_id) {
// Get member with location and full name
$sql = "SELECT
m.*,
d.district_name,
a.area_name,
asm.assembly_name,
CONCAT(
COALESCE(m.title, ''), ' ',
COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ',
COALESCE(m.last_name, '')
) AS full_name
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
WHERE m.id = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$member_id]);
$member = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$member) return null;
// Get ordination
$sql = "SELECT o.* FROM ordination o WHERE o.member_id = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$member_id]);
$ordination = $stmt->fetch(PDO::FETCH_ASSOC);
// Get retirement
$sql = "SELECT r.* FROM retiree_details r WHERE r.member_id = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$member_id]);
$retirement = $stmt->fetch(PDO::FETCH_ASSOC);
// Get transfers
$sql = "SELECT t.* FROM officer_transfers t
WHERE t.member_id = ? ORDER BY t.transfer_date DESC";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$member_id]);
$transfers = $stmt->fetchAll(PDO::FETCH_ASSOC);
return [
'member' => $member,
'ordination' => $ordination,
'retirement' => $retirement,
'transfers' => $transfers
];
}
// Alias used by view.php
public function getMemberDetails($member_id) {
return $this->getOfficerDetails($member_id);
}
// Get filtered Pastorate list
public function getPastorateList($filters = []) {
$sql = "SELECT m.id, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, a.area_name, asm.assembly_name,
o.date_ordained, o.card_no, o.ordained_by, m.phone, m.email, m.is_active
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
LEFT JOIN ordination o ON m.id = o.member_id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')
AND m.id NOT IN (SELECT member_id FROM retiree_details WHERE member_id IS NOT NULL)";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND m.district_id = " . intval($filters['district_id']);
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'title';
$order = strtoupper($filters['order'] ?? 'ASC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'district' => 'd.district_name',
'date' => 'o.date_ordained'
];
$sortCol = $sortColumns[$sort] ?? 'm.title';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get filtered Officers list
public function getOfficersList($filters = []) {
$sql = "SELECT m.id, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, a.area_name, asm.assembly_name,
o.date_ordained, o.card_no, o.ordained_by, m.phone, m.email, m.is_active
FROM members m
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
LEFT JOIN ordination o ON m.id = o.member_id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')
AND m.id NOT IN (SELECT member_id FROM retiree_details WHERE member_id IS NOT NULL)";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND m.district_id = " . intval($filters['district_id']);
}
if (!empty($filters['assembly_id'])) {
$sql .= " AND m.assembly_id = " . intval($filters['assembly_id']);
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'title';
$order = strtoupper($filters['order'] ?? 'ASC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'district' => 'd.district_name',
'date' => 'o.date_ordained'
];
$sortCol = $sortColumns[$sort] ?? 'm.title';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get filtered Retired Pastorate list
public function getRetireePastorateList($filters = []) {
$sql = "SELECT m.id, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, a.area_name, asm.assembly_name,
r.date_retired, r.years_of_service, r.retirement_reason, m.phone, m.email
FROM members m
INNER JOIN retiree_details r ON m.id = r.member_id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND m.district_id = " . intval($filters['district_id']);
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'title';
$order = strtoupper($filters['order'] ?? 'ASC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'district' => 'd.district_name',
'date' => 'r.date_retired'
];
$sortCol = $sortColumns[$sort] ?? 'm.title';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get filtered Retired Officers list
public function getRetireeOfficersList($filters = []) {
$sql = "SELECT m.id, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d.district_name, a.area_name, asm.assembly_name,
r.date_retired, r.years_of_service, r.retirement_reason, m.phone, m.email
FROM members m
INNER JOIN retiree_details r ON m.id = r.member_id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND m.district_id = " . intval($filters['district_id']);
}
if (!empty($filters['assembly_id'])) {
$sql .= " AND m.assembly_id = " . intval($filters['assembly_id']);
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'title';
$order = strtoupper($filters['order'] ?? 'ASC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'district' => 'd.district_name',
'date' => 'r.date_retired'
];
$sortCol = $sortColumns[$sort] ?? 'm.title';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get filtered Transfer list (Pastorate)
public function getPastorateTransfersList($filters = []) {
$sql = "SELECT t.*, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d_from.district_name as from_district,
d_to.district_name as to_district,
a_from.assembly_name as from_assembly,
a_to.assembly_name as to_assembly
FROM officer_transfers t
INNER JOIN members m ON t.member_id = m.id
LEFT JOIN districts d_from ON t.from_district_id = d_from.id
LEFT JOIN districts d_to ON t.to_district_id = d_to.id
LEFT JOIN assemblies a_from ON t.from_assembly_id = a_from.id
LEFT JOIN assemblies a_to ON t.to_assembly_id = a_to.id
WHERE m.title IN ('" . implode("','", $this->pastorate_titles) . "')";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND (t.from_district_id = " . intval($filters['district_id']) .
" OR t.to_district_id = " . intval($filters['district_id']) . ")";
}
if (!empty($filters['transfer_type'])) {
if ($filters['transfer_type'] === 'incoming') {
$sql .= " AND t.to_district_id IS NOT NULL";
} elseif ($filters['transfer_type'] === 'outgoing') {
$sql .= " AND t.from_district_id IS NOT NULL";
}
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'date';
$order = strtoupper($filters['order'] ?? 'DESC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'date' => 't.transfer_date',
'status' => 't.status'
];
$sortCol = $sortColumns[$sort] ?? 't.transfer_date';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get filtered Transfer list (Officers)
public function getOfficersTransfersList($filters = []) {
$sql = "SELECT t.*, m.title, m.first_name, m.middle_name, m.last_name,
CONCAT(COALESCE(m.title, ''), ' ', COALESCE(m.first_name, ''), ' ',
COALESCE(m.middle_name, ''), ' ', COALESCE(m.last_name, '')) as full_name,
d_from.district_name as from_district,
d_to.district_name as to_district,
a_from.assembly_name as from_assembly,
a_to.assembly_name as to_assembly
FROM officer_transfers t
INNER JOIN members m ON t.member_id = m.id
LEFT JOIN districts d_from ON t.from_district_id = d_from.id
LEFT JOIN districts d_to ON t.to_district_id = d_to.id
LEFT JOIN assemblies a_from ON t.from_assembly_id = a_from.id
LEFT JOIN assemblies a_to ON t.to_assembly_id = a_to.id
WHERE m.title IN ('" . implode("','", $this->officer_titles) . "')";
// Apply filters
if (!empty($filters['district_id'])) {
$sql .= " AND (t.from_district_id = " . intval($filters['district_id']) .
" OR t.to_district_id = " . intval($filters['district_id']) . ")";
}
if (!empty($filters['assembly_id'])) {
$sql .= " AND (t.from_assembly_id = " . intval($filters['assembly_id']) .
" OR t.to_assembly_id = " . intval($filters['assembly_id']) . ")";
}
if (!empty($filters['transfer_type'])) {
if ($filters['transfer_type'] === 'incoming') {
$sql .= " AND t.to_district_id IS NOT NULL";
} elseif ($filters['transfer_type'] === 'outgoing') {
$sql .= " AND t.from_district_id IS NOT NULL";
}
}
if (!empty($filters['title'])) {
$sql .= " AND m.title = '" . $this->pdo->quote($filters['title']) . "'";
}
if (!empty($filters['search'])) {
$search = $this->pdo->quote('%' . $filters['search'] . '%');
$sql .= " AND (m.first_name LIKE $search OR m.last_name LIKE $search OR m.middle_name LIKE $search)";
}
// Sorting
$sort = $filters['sort'] ?? 'date';
$order = strtoupper($filters['order'] ?? 'DESC');
$order = ($order === 'DESC') ? 'DESC' : 'ASC';
$sortColumns = [
'title' => 'm.title',
'name' => 'm.first_name',
'date' => 't.transfer_date',
'status' => 't.status'
];
$sortCol = $sortColumns[$sort] ?? 't.transfer_date';
$sql .= " ORDER BY $sortCol $order";
$stmt = $this->pdo->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Update transfer status
public function updateTransferStatus($transfer_id, $status) {
$stmt = $this->pdo->prepare("UPDATE officer_transfers SET status = ? WHERE id = ?");
return $stmt->execute([$status, $transfer_id]);
}
}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists