diff --git a/charity-settings.php b/charity-settings.php index 351824f..9cb3f8b 100644 --- a/charity-settings.php +++ b/charity-settings.php @@ -13,7 +13,8 @@ $error_msg = ''; // Handle Re-enable SMTP if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['enable_smtp'])) { db()->query("UPDATE smtp_settings SET is_enabled = 1, consecutive_failures = 0 WHERE id = 1"); - $success_msg = 'تم إعادة تفعيل SMTP وتصفير عداد الأخطاء'; + $_SESSION['success'] = 'تم إعادة تفعيل SMTP وتصفير عداد الأخطاء'; + redirect('charity-settings.php'); } // Fetch charity settings @@ -54,9 +55,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_charity'])) { $stmt = db()->prepare("UPDATE charity_settings SET charity_name = ?, charity_email = ?, charity_phone = ?, charity_address = ?, charity_logo = ?, charity_favicon = ? WHERE id = 1"); $stmt->execute([$charity_name, $charity_email, $charity_phone, $charity_address, $charity_logo, $charity_favicon]); - $success_msg = 'تم تحديث إعدادات الجمعية بنجاح'; - $stmt = db()->query("SELECT * FROM charity_settings WHERE id = 1"); - $charity = $stmt->fetch(); + $_SESSION['success'] = 'تم تحديث إعدادات الجمعية بنجاح'; + redirect('charity-settings.php'); } // Handle SMTP Settings Update @@ -73,9 +73,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_smtp'])) { $_POST['reply_to'], (int)$_POST['max_failures'] ]); - $success_msg = 'تم تحديث إعدادات البريد (SMTP) بنجاح'; - $stmt = db()->query("SELECT * FROM smtp_settings WHERE id = 1"); - $smtp = $stmt->fetch(); + $_SESSION['success'] = 'تم تحديث إعدادات البريد (SMTP) بنجاح'; + redirect('charity-settings.php'); } // Handle Test Email @@ -83,10 +82,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['test_email_addr'])) { $to = $_POST['test_email_addr']; $res = MailService::sendMail($to, "رسالة تجريبية - Test Email", "
إذا كنت ترى هذه الرسالة، فإن إعدادات SMTP تعمل بشكل صحيح.
"); if ($res['success']) { - $success_msg = "تم إرسال الرسالة التجريبية بنجاح إلى $to"; + $_SESSION['success'] = "تم إرسال الرسالة التجريبية بنجاح إلى $to"; } else { - $error_msg = "فشل إرسال الرسالة التجريبية: " . $res['error']; + $_SESSION['error'] = "فشل إرسال الرسالة التجريبية: " . $res['error']; } + redirect('charity-settings.php'); } // Handle Status Operations @@ -97,7 +97,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_status'])) { if ($is_default) db()->query("UPDATE mailbox_statuses SET is_default = 0"); $stmt = db()->prepare("INSERT INTO mailbox_statuses (name, color, is_default) VALUES (?, ?, ?)"); $stmt->execute([$name, $color, $is_default]); - $success_msg = 'تم إضافة نوع الحالة بنجاح'; + $_SESSION['success'] = 'تم إضافة نوع الحالة بنجاح'; + redirect('charity-settings.php'); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) { @@ -108,7 +109,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) { if ($is_default) db()->query("UPDATE mailbox_statuses SET is_default = 0"); $stmt = db()->prepare("UPDATE mailbox_statuses SET name = ?, color = ?, is_default = ? WHERE id = ?"); $stmt->execute([$name, $color, $is_default, $id]); - $success_msg = 'تم تحديث نوع الحالة بنجاح'; + $_SESSION['success'] = 'تم تحديث نوع الحالة بنجاح'; + redirect('charity-settings.php'); } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_status'])) { @@ -116,11 +118,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_status'])) { $count = db()->prepare("SELECT COUNT(*) FROM mailbox WHERE status_id = ?"); $count->execute([$id]); if ($count->fetchColumn() > 0) { - $error_msg = 'لا يمكن حذف هذه الحالة لأنها مستخدمة في بعض السجلات'; + $_SESSION['error'] = 'لا يمكن حذف هذه الحالة لأنها مستخدمة في بعض السجلات'; } else { db()->prepare("DELETE FROM mailbox_statuses WHERE id = ?")->execute([$id]); - $success_msg = 'تم حذف نوع الحالة بنجاح'; + $_SESSION['success'] = 'تم حذف نوع الحالة بنجاح'; } + redirect('charity-settings.php'); +} + +// Get session messages +if (isset($_SESSION['success'])) { + $success_msg = $_SESSION['success']; + unset($_SESSION['success']); +} +if (isset($_SESSION['error'])) { + $error_msg = $_SESSION['error']; + unset($_SESSION['error']); } $statuses = db()->query("SELECT * FROM mailbox_statuses ORDER BY id ASC")->fetchAll(); @@ -392,6 +405,23 @@ function editStatus(id, name, color, isDefault) { document.getElementById('edit_is_default').checked = isDefault == 1; new bootstrap.Modal(document.getElementById('editStatusModal')).show(); } + +document.addEventListener('DOMContentLoaded', function() { + // Preserve active tab after redirect + var activeTab = localStorage.getItem('activeSettingsTab'); + if (activeTab) { + var tabEl = document.querySelector('button[data-bs-target="' + activeTab + '"]'); + if (tabEl) { + bootstrap.Tab.getInstance(tabEl)?.show() || new bootstrap.Tab(tabEl).show(); + } + } + + document.querySelectorAll('button[data-bs-toggle="tab"]').forEach(function(tab) { + tab.addEventListener('shown.bs.tab', function(e) { + localStorage.setItem('activeSettingsTab', e.target.getAttribute('data-bs-target')); + }); + }); +}); - \ No newline at end of file + diff --git a/db/config.php b/db/config.php index 9daa4eb..314db1e 100644 --- a/db/config.php +++ b/db/config.php @@ -15,3 +15,30 @@ function db() { } return $pdo; } + +/** + * Generates the next reference number for a given type (inbound/outbound/internal) + * Format: IN-Year-Serial or OUT-Year-Serial or INT-Year-Serial + */ +function generateRefNo($type) { + $prefix = 'IN'; + if ($type === 'outbound') $prefix = 'OUT'; + if ($type === 'internal') $prefix = 'INT'; + + $year = date('Y'); + $pattern = $prefix . '-' . $year . '-%'; + + $stmt = db()->prepare("SELECT ref_no FROM mailbox WHERE type = ? AND ref_no LIKE ? ORDER BY id DESC LIMIT 1"); + $stmt->execute([$type, $pattern]); + $last_ref = $stmt->fetchColumn(); + + $serial = 1; + if ($last_ref) { + $parts = explode('-', $last_ref); + if (count($parts) === 3) { + $serial = (int)$parts[2] + 1; + } + } + + return $prefix . '-' . $year . '-' . str_pad($serial, 3, '0', STR_PAD_LEFT); +} \ No newline at end of file diff --git a/db/migrations/012_add_internal_mail_type.sql b/db/migrations/012_add_internal_mail_type.sql new file mode 100644 index 0000000..db64e35 --- /dev/null +++ b/db/migrations/012_add_internal_mail_type.sql @@ -0,0 +1,2 @@ +-- Migration: Add internal mail type to mailbox table +ALTER TABLE mailbox MODIFY COLUMN type ENUM('inbound', 'outbound', 'internal') NOT NULL; diff --git a/inbound.php b/inbound.php index 56a389b..ca32d1d 100644 --- a/inbound.php +++ b/inbound.php @@ -79,7 +79,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { sendAssignmentNotification($assigned_to, $ref_no, $subject); } - $success = 'تمت إضافة البريد بنجاح'; + $_SESSION['success'] = 'تمت إضافة البريد بنجاح'; + redirect('inbound.php'); } elseif ($action === 'edit') { // Get previous assigned_to to check if it changed $stmt_old = db()->prepare("SELECT assigned_to FROM mailbox WHERE id = ?"); @@ -93,7 +94,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { sendAssignmentNotification($assigned_to, $ref_no, $subject); } - $success = 'تم تحديث البيانات بنجاح'; + $_SESSION['success'] = 'تم تحديث البيانات بنجاح'; + redirect('inbound.php'); } } catch (PDOException $e) { if ($e->getCode() == 23000) { @@ -116,10 +118,21 @@ if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id']) $id = $_GET['id']; $stmt = db()->prepare("DELETE FROM mailbox WHERE id = ? AND type = 'inbound'"); $stmt->execute([$id]); - $success = 'تم حذف البريد بنجاح'; + $_SESSION['success'] = 'تم حذف البريد بنجاح'; + redirect('inbound.php'); } } +// Get session messages +if (isset($_SESSION['success'])) { + $success = $_SESSION['success']; + unset($_SESSION['success']); +} +if (isset($_SESSION['error'])) { + $error = $_SESSION['error']; + unset($_SESSION['error']); +} + $search = $_GET['search'] ?? ''; $my_tasks = isset($_GET['my_tasks']) && $_GET['my_tasks'] == 1; @@ -345,7 +358,7 @@ function getStatusBadgeInList($mail) {