- التاريخ الوصف المرجع الحساب مدين دائن الإجراءات
+ التاريخ الوصف المرجع الحساب مدين دائن أضيف بواسطة
+ عُدل بواسطة
+ الإجراءات
- لا توجد قيود.
+ لا توجد قيود.
@@ -250,6 +252,8 @@ $ledger = get_ledger_paginated($search, $date_from, $date_to, $limit, $offset);
= htmlspecialchars($row['account_name']) ?>
= number_format($row['debit'], 2) ?>
= number_format($row['credit'], 2) ?>
+ = htmlspecialchars(getAuditUserName($row['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($row['updated_by'] ?? null)) ?>
diff --git a/accounts.php b/accounts.php
index 6d6ce95..ff8b20d 100644
--- a/accounts.php
+++ b/accounts.php
@@ -129,7 +129,9 @@ $typeMap = [
الاسم
النوع
- إجراءات
+ أضيف بواسطة
+ عُدل بواسطة
+ إجراءات
@@ -141,6 +143,8 @@ $typeMap = [
= htmlspecialchars($typeMap[$account['type']] ?? $account['type']) ?>
+ = htmlspecialchars(getAuditUserName($account['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($account['updated_by'] ?? null)) ?>
diff --git a/charity_members.php b/charity_members.php
index 5100eb8..9215c69 100644
--- a/charity_members.php
+++ b/charity_members.php
@@ -1,7 +1,7 @@
غير مصرح لك بالوصول لهذه الصفحة.";
require_once 'includes/footer.php';
exit;
@@ -10,7 +10,7 @@ if (!isAdmin() && !canView('committees')) {
$action = $_GET['action'] ?? 'list';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- if (isset($_POST['add_member']) && (isAdmin() || canAdd('committees'))) {
+ if (isset($_POST['add_member']) && (isAdmin() || canAdd('charity_members'))) {
$name = $_POST['name'] ?? '';
$role = $_POST['role'] ?? '';
$phone = $_POST['phone'] ?? '';
@@ -23,7 +23,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$_SESSION['success'] = "تمت إضافة العضو بنجاح.";
redirect('charity_members.php');
- } elseif (isset($_POST['edit_member']) && (isAdmin() || canEdit('committees'))) {
+ } elseif (isset($_POST['edit_member']) && (isAdmin() || canEdit('charity_members'))) {
$id = $_POST['id'];
$name = $_POST['name'] ?? '';
$role = $_POST['role'] ?? '';
@@ -37,7 +37,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$_SESSION['success'] = "تم تحديث العضو بنجاح.";
redirect('charity_members.php');
- } elseif (isset($_POST['delete_member']) && (isAdmin() || canDelete('committees'))) {
+ } elseif (isset($_POST['delete_member']) && (isAdmin() || canDelete('charity_members'))) {
$id = $_POST['id'];
$stmt = db()->prepare("DELETE FROM charity_members WHERE id = ?");
$stmt->execute([$id]);
@@ -58,7 +58,7 @@ $members = $stmt->fetchAll();
طباعة تقرير الجمعية
-
+
إضافة عضو جديد
@@ -86,6 +86,8 @@ $members = $stmt->fetchAll();
البريد الإلكتروني
تاريخ الانضمام
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
@@ -113,13 +115,15 @@ $members = $stmt->fetchAll();
غير نشط
-
-
+ = htmlspecialchars(getAuditUserName($member['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($member['updated_by'] ?? null)) ?>
+
+
-
+
@@ -204,7 +208,7 @@ $members = $stmt->fetchAll();
- لا يوجد أعضاء مضافين حتى الآن
+ لا يوجد أعضاء مضافين حتى الآن
diff --git a/charity_plans.php b/charity_plans.php
index 31846e3..3fef0a8 100644
--- a/charity_plans.php
+++ b/charity_plans.php
@@ -1,14 +1,14 @@
غير مصرح لك بالوصول لهذه الصفحة.";
require_once 'includes/footer.php';
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- if (isset($_POST['add_plan']) && (isAdmin() || canAdd('committees'))) {
+ if (isset($_POST['add_plan']) && (isAdmin() || canAdd('charity_plans'))) {
$title = $_POST['title'];
$description = $_POST['description'] ?? '';
$start_date = $_POST['start_date'] ?? date('Y-m-d');
@@ -21,7 +21,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmt->execute([$title, $description, $start_date, $end_date, $target_value, $achieved_value, $status]);
$_SESSION['success'] = "تمت إضافة الخطة بنجاح.";
redirect('charity_plans.php');
- } elseif (isset($_POST['edit_plan']) && (isAdmin() || canEdit('committees'))) {
+ } elseif (isset($_POST['edit_plan']) && (isAdmin() || canEdit('charity_plans'))) {
$id = $_POST['id'];
$title = $_POST['title'];
$description = $_POST['description'] ?? '';
@@ -35,7 +35,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmt->execute([$title, $description, $start_date, $end_date, $target_value, $achieved_value, $status, $id]);
$_SESSION['success'] = "تم تحديث الخطة بنجاح.";
redirect('charity_plans.php');
- } elseif (isset($_POST['delete_plan']) && (isAdmin() || canDelete('committees'))) {
+ } elseif (isset($_POST['delete_plan']) && (isAdmin() || canDelete('charity_plans'))) {
$id = $_POST['id'];
$stmt = db()->prepare("DELETE FROM charity_plans WHERE id = ?");
$stmt->execute([$id]);
@@ -84,7 +84,7 @@ $status_labels = [
طباعة تقرير الجمعية
-
+
إضافة خطة/هدف جديد
@@ -161,6 +161,8 @@ $status_labels = [
المحقق
النسبة
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
@@ -190,13 +192,15 @@ $status_labels = [
= $status_labels[$plan['status']] ?>
-
-
+ = htmlspecialchars(getAuditUserName($plan['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($plan['updated_by'] ?? null)) ?>
+
+
-
+
@@ -290,7 +294,7 @@ $status_labels = [
- لا توجد خطط مضافة حتى الآن
+ لا توجد خطط مضافة حتى الآن
diff --git a/committee_reports.php b/committee_reports.php
index 595c745..119c8fb 100644
--- a/committee_reports.php
+++ b/committee_reports.php
@@ -8,17 +8,37 @@ if (!canView('committees')) {
}
// Fetch all committees and calculate stats
-$stmt = db()->query("
- SELECT
- c.id, c.name,
- (SELECT COUNT(*) FROM committee_members WHERE committee_id = c.id) as members_count,
- (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
- (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
- (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
- FROM committees c
- ORDER BY c.name ASC
-");
-$committees = $stmt->fetchAll(PDO::FETCH_ASSOC);
+if (isAdmin()) {
+ $stmt = db()->query("
+ SELECT
+ c.id, c.name,
+ (SELECT COUNT(*) FROM committee_members WHERE committee_id = c.id) as members_count,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
+ (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
+ FROM committees c
+ ORDER BY c.name ASC
+ ");
+ $committees = $stmt->fetchAll(PDO::FETCH_ASSOC);
+} else {
+ $stmt = db()->prepare("
+ SELECT
+ c.id, c.name,
+ (SELECT COUNT(*) FROM committee_members WHERE committee_id = c.id) as members_count,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
+ (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
+ FROM committees c
+ JOIN committee_members m ON c.id = m.committee_id
+ JOIN charity_members cm ON m.charity_member_id = cm.id
+ JOIN users u ON (u.id = cm.user_id) OR (cm.email != '' AND cm.email = u.email) OR (cm.name = u.full_name) OR (cm.name = u.username)
+ WHERE u.id = ?
+ GROUP BY c.id
+ ORDER BY c.name ASC
+ ");
+ $stmt->execute([$_SESSION['user_id']]);
+ $committees = $stmt->fetchAll(PDO::FETCH_ASSOC);
+}
// Overall stats
$total_committees = count($committees);
diff --git a/committees.php b/committees.php
index a8a8db1..05657f7 100644
--- a/committees.php
+++ b/committees.php
@@ -99,6 +99,8 @@ if (isset($_SESSION['error'])) {
الرقم
اسم اللجنة
الوصف
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
@@ -109,7 +111,9 @@ if (isset($_SESSION['error'])) {
= htmlspecialchars($committee['id']) ?>
= htmlspecialchars($committee['name']) ?>
= htmlspecialchars($committee['description'] ?? '') ?>
-
+ = htmlspecialchars(getAuditUserName($committee['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($committee['updated_by'] ?? null)) ?>
+
إدارة
@@ -126,7 +130,7 @@ if (isset($_SESSION['error'])) {
- لا توجد لجان مضافة حتى الآن.
+ لا توجد لجان مضافة حتى الآن.
diff --git a/db/config.php b/db/config.php
index 300160b..fd0c258 100644
--- a/db/config.php
+++ b/db/config.php
@@ -12,6 +12,13 @@ function db() {
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
+
+ if (session_status() === PHP_SESSION_NONE) {
+ @session_start();
+ }
+ if (isset($_SESSION['user_id'])) {
+ $pdo->exec("SET @app_user_id = " . (int)$_SESSION['user_id']);
+ }
}
return $pdo;
}
@@ -48,4 +55,4 @@ function generateRefNo($type) {
}
return $prefix . '-' . $year . '-' . str_pad($serial, 3, '0', STR_PAD_LEFT);
-}
\ No newline at end of file
+}
diff --git a/db/migrations/033_add_user_id_to_charity_members.php b/db/migrations/033_add_user_id_to_charity_members.php
new file mode 100644
index 0000000..11de3af
--- /dev/null
+++ b/db/migrations/033_add_user_id_to_charity_members.php
@@ -0,0 +1,17 @@
+exec("ALTER TABLE charity_members ADD COLUMN user_id INT NULL");
+ $db->exec("ALTER TABLE charity_members ADD CONSTRAINT fk_charity_members_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL");
+ echo "Migration 033 completed successfully.\n";
+} catch (PDOException $e) {
+ if (strpos($e->getMessage(), 'Duplicate column name') !== false) {
+ echo "Column user_id already exists.\n";
+ } else {
+ echo "Error: " . $e->getMessage() . "\n";
+ }
+}
+
diff --git a/db/migrations/034_add_audit_columns.sql b/db/migrations/034_add_audit_columns.sql
new file mode 100644
index 0000000..7852383
--- /dev/null
+++ b/db/migrations/034_add_audit_columns.sql
@@ -0,0 +1,82 @@
+ALTER TABLE `committees` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `committees` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `committee_plans` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `committee_plans` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `committee_plans` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `committee_plans` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `charity_members` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `charity_members` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `charity_members` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `charity_members` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `charity_plans` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `charity_plans` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `charity_plans` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `charity_plans` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `expenses` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `expenses` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `expenses` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `expenses` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `expense_categories` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `expense_categories` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `expense_categories` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `expense_categories` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `accounting_accounts` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `accounting_accounts` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `accounting_accounts` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `accounting_accounts` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `accounting_journal` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `accounting_journal` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `accounting_journal` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `accounting_journal` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_employees` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `hr_employees` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_employees` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `hr_employees` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_attendance` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `hr_attendance` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_attendance` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `hr_attendance` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_holidays` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `hr_holidays` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_holidays` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `hr_holidays` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_leaves` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `hr_leaves` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_leaves` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `hr_leaves` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_payroll` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `hr_payroll` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `hr_payroll` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `hr_payroll` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_items` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `stock_items` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_items` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `stock_items` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_categories` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `stock_categories` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_categories` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `stock_categories` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_stores` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `stock_stores` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_stores` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `stock_stores` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_transactions` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `stock_transactions` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_transactions` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `stock_transactions` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_lending` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `stock_lending` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `stock_lending` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `stock_lending` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `users` ADD COLUMN `created_by` INT DEFAULT NULL;
+ALTER TABLE `users` ADD FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `users` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `users` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `inbound_mail` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `inbound_mail` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `outbound_mail` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `outbound_mail` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `internal_mail` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `internal_mail` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
+ALTER TABLE `meetings` ADD COLUMN `updated_by` INT DEFAULT NULL;
+ALTER TABLE `meetings` ADD FOREIGN KEY (`updated_by`) REFERENCES `users`(`id`) ON DELETE SET NULL;
\ No newline at end of file
diff --git a/expense_categories.php b/expense_categories.php
index 71a98a5..a346f1d 100644
--- a/expense_categories.php
+++ b/expense_categories.php
@@ -101,6 +101,8 @@ if (isset($_SESSION['error'])) {
اسم التصنيف
الحساب المحاسبي المرتبط
الوصف
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
@@ -116,6 +118,8 @@ if (isset($_SESSION['error'])) {
= htmlspecialchars($cat['description']) ?>
+ = htmlspecialchars(getAuditUserName($cat['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($cat['updated_by'] ?? null)) ?>
diff --git a/expenses.php b/expenses.php
index ec29723..f88caef 100644
--- a/expenses.php
+++ b/expenses.php
@@ -283,13 +283,15 @@ if (isset($_SESSION['success'])) {
المبلغ
طريقة الدفع
الإيصال
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
- لا توجد سجلات مطابقة
+ لا توجد سجلات مطابقة
@@ -305,7 +307,9 @@ if (isset($_SESSION['success'])) {
= htmlspecialchars($exp['vendor'] ?: '-') ?>
= number_format($exp['amount'], 2) ?>
= htmlspecialchars($exp['payment_method']) ?>
-
+ = htmlspecialchars(getAuditUserName($exp['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($exp['updated_by'] ?? null)) ?>
+
@@ -330,13 +334,13 @@ if (isset($_SESSION['success'])) {
- إجمالي الصفحة:
+ إجمالي الصفحة:
= number_format(array_sum(array_column($expenses, 'amount')), 2) ?>
- الإجمالي الكلي (للبحث الحالي):
+ الإجمالي الكلي (للبحث الحالي):
= number_format($grandTotalAmount, 2) ?>
diff --git a/hr_attendance.php b/hr_attendance.php
index 81302af..0fbbe05 100644
--- a/hr_attendance.php
+++ b/hr_attendance.php
@@ -99,13 +99,15 @@ $records = $stmt->fetchAll();
وقت الحضور
وقت الانصراف
ملاحظات
+ أضيف بواسطة
+ عُدل بواسطة
إجراء
- لا يوجد موظفين نشطين.
+ لا يوجد موظفين نشطين.
@@ -140,7 +142,9 @@ $records = $stmt->fetchAll();
= $row['check_in'] ? date('h:i A', strtotime($row['check_in'])) : '-' ?>
= $row['check_out'] ? date('h:i A', strtotime($row['check_out'])) : '-' ?>
= htmlspecialchars($row['notes'] ?? '') ?>
-
+ = htmlspecialchars(getAuditUserName($row['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($row['updated_by'] ?? null)) ?>
+
تاريخ التعيين
الحالة
بصمة (UID)
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
@@ -303,7 +305,9 @@ $pagination = getPagination($page, $totalEmployees, $perPage);
= htmlspecialchars($row['status']) ?>
= htmlspecialchars($row['zkteco_uid'] ?: '-') ?>
-
+ = htmlspecialchars(getAuditUserName($emp['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($emp['updated_by'] ?? null)) ?>
+
query("SELECT * FROM hr_holidays ORDER BY date_from DESC")->fe
من تاريخ
إلى تاريخ
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
إجراءات
- لا توجد عطلات مسجلة.
+ لا توجد عطلات مسجلة.
query("SELECT * FROM hr_holidays ORDER BY date_from DESC")->fe
= $row['date_from'] ?>
= $row['date_to'] ?>
= $status_txt ?>
+ = htmlspecialchars(getAuditUserName($row['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($row['updated_by'] ?? null)) ?>
fetchAll();
السبب
الحالة
المعتمد
+ أضيف بواسطة
+ عُدل بواسطة
إجراءات
- لا توجد طلبات.
+ لا توجد طلبات.
@@ -251,6 +253,8 @@ $requests = $stmt->fetchAll();
= htmlspecialchars($req['approver_name'] ?? '-') ?>
+ = htmlspecialchars(getAuditUserName($req['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($req['updated_by'] ?? null)) ?>
fetchColumn() ?: 0;
خصومات
الصافي
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
إجراءات
- لا توجد بيانات لهذا الشهر. اضغط على "توليد الرواتب" للبدء.
+ لا توجد بيانات لهذا الشهر. اضغط على "توليد الرواتب" للبدء.
@@ -229,6 +231,8 @@ $total_salaries = $sumStmt->fetchColumn() ?: 0;
+ = htmlspecialchars(getAuditUserName($row['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($row['updated_by'] ?? null)) ?>
الجهة المرسلة
الحالة
المسؤول
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
-
+
لا يوجد بريد وارد حالياً.
@@ -275,6 +277,8 @@ if (isset($_GET['id'])) {
= htmlspecialchars($mail['assigned_to_name'] ?: 'غير محدد') ?>
+ = htmlspecialchars(getAuditUserName($mail['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($mail['updated_by'] ?? null)) ?>
@@ -140,14 +142,16 @@ function getStatusBadgeInternal($mail) {
= date('Y-m-d H:i', strtotime($msg['created_at'])) ?>
= getStatusBadgeInternal($msg) ?>
-
+ = htmlspecialchars(getAuditUserName($msg['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($msg['updated_by'] ?? null)) ?>
+
عرض
-
+
لا توجد رسائل واردة حالياً
diff --git a/internal_outbox.php b/internal_outbox.php
index 28d0ca6..a4c3e97 100644
--- a/internal_outbox.php
+++ b/internal_outbox.php
@@ -206,6 +206,8 @@ function getStatusBadgeInternal($mail) {
المرفقات
التاريخ
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
الإجراء
@@ -242,14 +244,16 @@ function getStatusBadgeInternal($mail) {
= date('Y-m-d H:i', strtotime($msg['created_at'])) ?>
= getStatusBadgeInternal($msg) ?>
-
+ = htmlspecialchars(getAuditUserName($msg['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($msg['updated_by'] ?? null)) ?>
+
عرض
-
+
لم يتم إرسال أي رسائل حالياً
diff --git a/meetings.php b/meetings.php
index 9b7cdec..b4efb42 100644
--- a/meetings.php
+++ b/meetings.php
@@ -210,13 +210,15 @@ if (isset($_SESSION['success'])) {
المكان
المنظم
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
- لا توجد اجتماعات مطابقة
+ لا توجد اجتماعات مطابقة
@@ -256,7 +258,9 @@ if (isset($_SESSION['success'])) {
= htmlspecialchars($meeting['created_by_name']) ?>
= $status_text ?>
-
+ = htmlspecialchars(getAuditUserName($meeting['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($meeting['updated_by'] ?? null)) ?>
+
diff --git a/outbound.php b/outbound.php
index 068a711..a288253 100644
--- a/outbound.php
+++ b/outbound.php
@@ -226,13 +226,15 @@ if (isset($_GET['id'])) {
الموضوع
الجهة المستلمة
الحالة
+ أضيف بواسطة
+ عُدل بواسطة
الإجراءات
-
+
لا يوجد بريد صادر حالياً.
@@ -256,6 +258,8 @@ if (isset($_GET['id'])) {
= htmlspecialchars($mail['status_name']) ?>
+ = htmlspecialchars(getAuditUserName($mail['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($mail['updated_by'] ?? null)) ?>
2. أعضاء الجمعية
2. أعضاء الجمعية
لا يوجد أعضاء مسجلين.
diff --git a/print_committees_report.php b/print_committees_report.php
index 73f5231..6e2c794 100644
--- a/print_committees_report.php
+++ b/print_committees_report.php
@@ -12,16 +12,35 @@ $settings = get_settings();
$db = db();
// Fetch committees and members
-$committees_query = $db->query("
- SELECT
- c.id, c.name, c.description,
- (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
- (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
- (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
- FROM committees c
- ORDER BY c.name ASC
-");
-$committees = $committees_query->fetchAll(PDO::FETCH_ASSOC);
+if (isAdmin()) {
+ $committees_query = $db->query("
+ SELECT
+ c.id, c.name, c.description,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
+ (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
+ FROM committees c
+ ORDER BY c.name ASC
+ ");
+ $committees = $committees_query->fetchAll(PDO::FETCH_ASSOC);
+} else {
+ $committees_query = $db->prepare("
+ SELECT
+ c.id, c.name, c.description,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id) as total_plans,
+ (SELECT COUNT(*) FROM committee_plans WHERE committee_id = c.id AND status = 'completed') as completed_plans,
+ (SELECT COUNT(*) FROM committee_activities WHERE committee_id = c.id) as activities_count
+ FROM committees c
+ JOIN committee_members m ON c.id = m.committee_id
+ JOIN charity_members cm ON m.charity_member_id = cm.id
+ JOIN users u ON (u.id = cm.user_id) OR (cm.email != '' AND cm.email = u.email) OR (cm.name = u.full_name) OR (cm.name = u.username)
+ WHERE u.id = ?
+ GROUP BY c.id
+ ORDER BY c.name ASC
+ ");
+ $committees_query->execute([$_SESSION['user_id']]);
+ $committees = $committees_query->fetchAll(PDO::FETCH_ASSOC);
+}
foreach ($committees as &$c) {
// Calculate performance score
diff --git a/stock_items.php b/stock_items.php
index e872dc6..427cec5 100644
--- a/stock_items.php
+++ b/stock_items.php
@@ -157,13 +157,15 @@ $categories = db()->query("SELECT * FROM stock_categories ORDER BY name ASC")->f
- لا توجد إعارات نشطة حالياً
+ لا توجد إعارات نشطة حالياً
@@ -170,6 +172,8 @@ $items = db()->query("SELECT * FROM stock_items ORDER BY name ASC")->fetchAll();
= date('Y-m-d', $due) ?>
نشط
+ = htmlspecialchars(getAuditUserName($loan['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($loan['updated_by'] ?? null)) ?>
= $user['created_at'] ?>
+ = htmlspecialchars(getAuditUserName($user['created_by'] ?? null)) ?>
+ = htmlspecialchars(getAuditUserName($user['updated_by'] ?? null)) ?>
prepare("
+ SELECT 1
+ FROM committee_members m
+ JOIN charity_members cm ON m.charity_member_id = cm.id
+ JOIN users u ON (u.id = cm.user_id) OR (cm.email != '' AND cm.email = u.email) OR (cm.name = u.full_name) OR (cm.name = u.username)
+ WHERE m.committee_id = ? AND u.id = ?
+ ");
+ $check_stmt->execute([$id, $_SESSION['user_id']]);
+ if (!$check_stmt->fetchColumn()) {
+ $_SESSION['error'] = 'غير مصرح لك بعرض هذه اللجنة';
+ redirect('committees.php');
+ }
+}
+
$tab = $_GET['tab'] ?? 'members';
$allowed_tabs = ['members', 'plans', 'activities'];
if (!in_array($tab, $allowed_tabs)) {