Sindbad~EG File Manager
<?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