Sindbad~EG File Manager

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

<?php
/**
 * Membership Card Class
 * Handles membership card generation and management
 */

class MembershipCard {
    private $db;
    private $auditLog;
    
    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
        $this->auditLog = new AuditLog();
    }
    
    /**
     * Generate card number
     */
    public function generateCardNumber() {
        $year = date('Y');
        $random = str_pad(mt_rand(10000, 99999), 5, '0', STR_PAD_LEFT);
        $timestamp = substr(time(), -4);
        return "MC{$year}{$timestamp}{$random}";
    }
    
    /**
     * Create membership card (can be called before or after member creation)
     */
    public function createCard($memberId = null) {
        try {
            // If member ID provided, check if card already exists
            if ($memberId) {
                $stmt = $this->db->prepare("SELECT id FROM membership_cards WHERE member_id = :member_id AND is_active = 1");
                $stmt->execute(['member_id' => $memberId]);
                
                if ($stmt->fetch()) {
                    return ['success' => false, 'message' => 'Active card already exists for this member'];
                }
            }
            
            // Generate unique card number
            do {
                $cardNumber = $this->generateCardNumber();
                $stmt = $this->db->prepare("SELECT id FROM membership_cards WHERE card_number = :card_number");
                $stmt->execute(['card_number' => $cardNumber]);
            } while ($stmt->fetch()); // Ensure uniqueness
            
            // Create card
            $stmt = $this->db->prepare("
                INSERT INTO membership_cards (member_id, card_number, issue_date, expiry_date, is_active)
                VALUES (:member_id, :card_number, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 5 YEAR), 1)
            ");
            
            $stmt->execute([
                'member_id' => $memberId,
                'card_number' => $cardNumber
            ]);
            
            $cardId = $this->db->lastInsertId();
            
            // Log the action
            if (isset($_SESSION['user_id'])) {
                $this->auditLog->log($_SESSION['user_id'], 'create', 'membership_cards', $cardId);
            }
            
            return [
                'success' => true,
                'message' => 'Membership card generated successfully',
                'card_id' => $cardId,
                'card_number' => $cardNumber
            ];
            
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error creating card: ' . $e->getMessage()];
        }
    }
    
    /**
     * Update card with member ID after member is created
     */
    public function linkCardToMember($cardNumber, $memberId) {
        try {
            $stmt = $this->db->prepare("UPDATE membership_cards SET member_id = :member_id WHERE card_number = :card_number");
            $stmt->execute(['member_id' => $memberId, 'card_number' => $cardNumber]);
            return true;
        } catch (PDOException $e) {
            return false;
        }
    }
    
    /**
     * Get card by member ID
     */
    public function getCardByMember($memberId) {
        try {
            $stmt = $this->db->prepare("
                SELECT mc.*, m.first_name, m.last_name, m.membershipcard_id as member_number,
                       m.profile_photo, m.date_of_birth, m.phone, m.email,
                       a.area_name, d.district_name, asm.assembly_name
                FROM membership_cards mc
                JOIN members m ON mc.member_id = m.id
                JOIN areas a ON m.area_id = a.id
                JOIN districts d ON m.district_id = d.id
                JOIN assemblies asm ON m.assembly_id = asm.id
                WHERE mc.member_id = :member_id AND mc.is_active = 1
                ORDER BY mc.created_at DESC
                LIMIT 1
            ");
            
            $stmt->execute(['member_id' => $memberId]);
            return $stmt->fetch();
            
        } catch (PDOException $e) {
            return null;
        }
    }
    
    /**
     * Get card by card number
     */
    public function getCardByNumber($cardNumber) {
        try {
            $stmt = $this->db->prepare("
                SELECT mc.*, m.first_name, m.last_name, m.membershipcard_id as member_number,
                       m.profile_photo, m.date_of_birth, m.phone, m.email,
                       a.area_name, d.district_name, asm.assembly_name
                FROM membership_cards mc
                JOIN members m ON mc.member_id = m.id
                JOIN areas a ON m.area_id = a.id
                JOIN districts d ON m.district_id = d.id
                JOIN assemblies asm ON m.assembly_id = asm.id
                WHERE mc.card_number = :card_number
            ");
            
            $stmt->execute(['card_number' => $cardNumber]);
            return $stmt->fetch();
            
        } catch (PDOException $e) {
            return null;
        }
    }
    
    /**
     * Mark card as printed
     */
    public function markAsPrinted($cardId) {
        try {
            $stmt = $this->db->prepare("
                UPDATE membership_cards 
                SET printed = 1, 
                    print_count = print_count + 1,
                    last_printed = NOW()
                WHERE id = :id
            ");
            
            $stmt->execute(['id' => $cardId]);
            return true;
            
        } catch (PDOException $e) {
            return false;
        }
    }
    
    /**
     * Deactivate card
     */
    public function deactivateCard($cardId) {
        try {
            $stmt = $this->db->prepare("UPDATE membership_cards SET is_active = 0 WHERE id = :id");
            $stmt->execute(['id' => $cardId]);
            
            $this->auditLog->log($_SESSION['user_id'] ?? null, 'deactivate', 'membership_cards', $cardId);
            return true;
            
        } catch (PDOException $e) {
            return false;
        }
    }
    
    /**
     * Get all cards with filters
     */
    public function getAllCards($filters = [], $limit = 100, $offset = 0) {
        try {
            $sql = "
                SELECT mc.*, m.first_name, m.last_name, m.membershipcard_id as member_number,
                       a.area_name, d.district_name, asm.assembly_name
                FROM membership_cards mc
                JOIN members m ON mc.member_id = m.id
                JOIN areas a ON m.area_id = a.id
                JOIN districts d ON m.district_id = d.id
                JOIN assemblies asm ON m.assembly_id = asm.id
                WHERE 1=1
            ";
            
            $params = [];
            
            if (!empty($filters['is_active'])) {
                $sql .= " AND mc.is_active = :is_active";
                $params['is_active'] = $filters['is_active'];
            }
            
            if (!empty($filters['area_id'])) {
                $sql .= " AND m.area_id = :area_id";
                $params['area_id'] = $filters['area_id'];
            }
            
            $sql .= " ORDER BY mc.created_at DESC LIMIT :limit OFFSET :offset";
            
            $stmt = $this->db->prepare($sql);
            
            foreach ($params as $key => $value) {
                $stmt->bindValue(':' . $key, $value);
            }
            
            $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
            $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
            
            $stmt->execute();
            return $stmt->fetchAll();
            
        } catch (PDOException $e) {
            return [];
        }
    }
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists