Sindbad~EG File Manager

Current Path : /home/copmadinaarea/thecopmadinaarea.org/portal/classes/
Upload File :
Current File : /home/copmadinaarea/thecopmadinaarea.org/portal/classes/Officership.php

<?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