38808-vm/charity-settings.php
2026-02-27 18:20:25 +00:00

397 lines
22 KiB
PHP

<?php
require_once __DIR__ . '/includes/header.php';
require_once __DIR__ . '/mail/MailService.php';
// Only admins can access this page
if (!isAdmin()) {
redirect("index.php");
}
$success_msg = '';
$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 وتصفير عداد الأخطاء';
}
// Fetch charity settings
$stmt = db()->query("SELECT * FROM charity_settings WHERE id = 1");
$charity = $stmt->fetch();
// Fetch SMTP settings
$stmt = db()->query("SELECT * FROM smtp_settings WHERE id = 1");
$smtp = $stmt->fetch();
// Handle Charity Settings Update
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_charity'])) {
$charity_name = $_POST['charity_name'];
$charity_email = $_POST['charity_email'];
$charity_phone = $_POST['charity_phone'];
$charity_address = $_POST['charity_address'];
$charity_logo = $charity['charity_logo'];
$charity_favicon = $charity['charity_favicon'];
$upload_dir = 'uploads/charity/';
if (!is_dir($upload_dir)) mkdir($upload_dir, 0775, true);
if (isset($_FILES['charity_logo']) && $_FILES['charity_logo']['error'] === UPLOAD_ERR_OK) {
$file_ext = pathinfo($_FILES['charity_logo']['name'], PATHINFO_EXTENSION);
$new_logo = 'logo_' . time() . '.' . $file_ext;
if (move_uploaded_file($_FILES['charity_logo']['tmp_name'], $upload_dir . $new_logo)) {
$charity_logo = $upload_dir . $new_logo;
}
}
if (isset($_FILES['charity_favicon']) && $_FILES['charity_favicon']['error'] === UPLOAD_ERR_OK) {
$file_ext = pathinfo($_FILES['charity_favicon']['name'], PATHINFO_EXTENSION);
$new_favicon = 'favicon_' . time() . '.' . $file_ext;
if (move_uploaded_file($_FILES['charity_favicon']['tmp_name'], $upload_dir . $new_favicon)) {
$charity_favicon = $upload_dir . $new_favicon;
}
}
$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();
}
// Handle SMTP Settings Update
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_smtp'])) {
$stmt = db()->prepare("UPDATE smtp_settings SET smtp_host = ?, smtp_port = ?, smtp_secure = ?, smtp_user = ?, smtp_pass = ?, from_email = ?, from_name = ?, reply_to = ?, max_failures = ? WHERE id = 1");
$stmt->execute([
$_POST['smtp_host'],
(int)$_POST['smtp_port'],
$_POST['smtp_secure'],
$_POST['smtp_user'],
$_POST['smtp_pass'],
$_POST['from_email'],
$_POST['from_name'],
$_POST['reply_to'],
(int)$_POST['max_failures']
]);
$success_msg = 'تم تحديث إعدادات البريد (SMTP) بنجاح';
$stmt = db()->query("SELECT * FROM smtp_settings WHERE id = 1");
$smtp = $stmt->fetch();
}
// Handle Test Email
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['test_email_addr'])) {
$to = $_POST['test_email_addr'];
$res = MailService::sendMail($to, "رسالة تجريبية - Test Email", "<p>إذا كنت ترى هذه الرسالة، فإن إعدادات SMTP تعمل بشكل صحيح.</p>");
if ($res['success']) {
$success_msg = "تم إرسال الرسالة التجريبية بنجاح إلى $to";
} else {
$error_msg = "فشل إرسال الرسالة التجريبية: " . $res['error'];
}
}
// Handle Status Operations
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_status'])) {
$name = $_POST['status_name'];
$color = $_POST['status_color'];
$is_default = isset($_POST['is_default']) ? 1 : 0;
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 = 'تم إضافة نوع الحالة بنجاح';
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_status'])) {
$id = $_POST['status_id'];
$name = $_POST['status_name'];
$color = $_POST['status_color'];
$is_default = isset($_POST['is_default']) ? 1 : 0;
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 = 'تم تحديث نوع الحالة بنجاح';
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_status'])) {
$id = $_POST['status_id'];
$count = db()->prepare("SELECT COUNT(*) FROM mailbox WHERE status_id = ?");
$count->execute([$id]);
if ($count->fetchColumn() > 0) {
$error_msg = 'لا يمكن حذف هذه الحالة لأنها مستخدمة في بعض السجلات';
} else {
db()->prepare("DELETE FROM mailbox_statuses WHERE id = ?")->execute([$id]);
$success_msg = 'تم حذف نوع الحالة بنجاح';
}
}
$statuses = db()->query("SELECT * FROM mailbox_statuses ORDER BY id ASC")->fetchAll();
$email_logs = db()->query("SELECT * FROM email_logs ORDER BY id DESC LIMIT 50")->fetchAll();
?>
<div class="row">
<div class="col-md-12 mb-4">
<h2 class="fw-bold"><i class="fas fa-cog me-2"></i> الإعدادات</h2>
</div>
<?php if ($success_msg): ?>
<div class="alert alert-success"><?= $success_msg ?></div>
<?php endif; ?>
<?php if ($error_msg): ?>
<div class="alert alert-danger"><?= $error_msg ?></div>
<?php endif; ?>
<div class="col-md-12">
<ul class="nav nav-tabs mb-4" id="settingsTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="general-tab" data-bs-toggle="tab" data-bs-target="#general" type="button" role="tab">بيانات الجمعية</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="smtp-tab" data-bs-toggle="tab" data-bs-target="#smtp" type="button" role="tab">إعدادات SMTP</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="statuses-tab" data-bs-toggle="tab" data-bs-target="#statuses" type="button" role="tab">حالات البريد</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="logs-tab" data-bs-toggle="tab" data-bs-target="#logs" type="button" role="tab">سجلات البريد</button>
</li>
</ul>
<div class="tab-content bg-white p-4 shadow-sm rounded border" id="settingsTabsContent">
<!-- General Settings -->
<div class="tab-pane show active" id="general" role="tabpanel">
<h4 class="mb-4">بيانات الجمعية</h4>
<form method="POST" enctype="multipart/form-data">
<input type="hidden" name="update_charity" value="1">
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">اسم الجمعية</label>
<input type="text" name="charity_name" class="form-control" value="<?= htmlspecialchars($charity['charity_name'] ?? '') ?>" required>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">البريد الإلكتروني للجمعية</label>
<input type="email" name="charity_email" class="form-control" value="<?= htmlspecialchars($charity['charity_email'] ?? '') ?>">
</div>
</div>
<div class="mb-3">
<label class="form-label">رقم الهاتف</label>
<input type="text" name="charity_phone" class="form-control" value="<?= htmlspecialchars($charity['charity_phone'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">العنوان</label>
<textarea name="charity_address" class="form-control" rows="3"><?= htmlspecialchars($charity['charity_address'] ?? '') ?></textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">شعار الجمعية</label>
<input type="file" name="charity_logo" class="form-control" accept="image/*">
<?php if ($charity['charity_logo']): ?>
<div class="mt-2"><img src="<?= $charity['charity_logo'] ?>" alt="Logo" style="max-height: 80px;"></div>
<?php endif; ?>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">أيقونة الموقع (Favicon)</label>
<input type="file" name="charity_favicon" class="form-control" accept="image/x-icon,image/png">
<?php if ($charity['charity_favicon']): ?>
<div class="mt-2"><img src="<?= $charity['charity_favicon'] ?>" alt="Favicon" style="max-height: 32px;"></div>
<?php endif; ?>
</div>
</div>
<button type="submit" class="btn btn-dark">تحديث إعدادات الجمعية</button>
</form>
</div>
<!-- SMTP Settings -->
<div class="tab-pane" id="smtp" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-4">
<h4>إعدادات البريد (SMTP)</h4>
<?php if (!$smtp['is_enabled']): ?>
<div class="badge bg-danger p-2">
<i class="fas fa-exclamation-triangle me-1"></i> SMTP معطل بسبب كثرة الأخطاء
<form method="POST" style="display:inline;" class="ms-2">
<button type="submit" name="enable_smtp" class="btn btn-sm btn-light">إعادة تفعيل</button>
</form>
</div>
<?php else: ?>
<div class="badge bg-success p-2">
<i class="fas fa-check-circle me-1"></i> SMTP مفعل (أخطاء: <?= $smtp['consecutive_failures'] ?>/<?= $smtp['max_failures'] ?>)
</div>
<?php endif; ?>
</div>
<form method="POST">
<input type="hidden" name="update_smtp" value="1">
<div class="row">
<div class="col-md-8 mb-3">
<label class="form-label">SMTP Host</label>
<input type="text" name="smtp_host" class="form-control" value="<?= htmlspecialchars($smtp['smtp_host'] ?? '') ?>">
</div>
<div class="col-md-4 mb-3">
<label class="form-label">SMTP Port</label>
<input type="number" name="smtp_port" class="form-control" value="<?= htmlspecialchars($smtp['smtp_port'] ?? 587) ?>">
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">SMTP Security</label>
<select name="smtp_secure" class="form-select">
<option value="tls" <?= ($smtp['smtp_secure'] ?? '') === 'tls' ? 'selected' : '' ?>>TLS (Recommended)</option>
<option value="ssl" <?= ($smtp['smtp_secure'] ?? '') === 'ssl' ? 'selected' : '' ?>>SSL</option>
<option value="none" <?= ($smtp['smtp_secure'] ?? '') === 'none' ? 'selected' : '' ?>>None</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Sender Name</label>
<input type="text" name="from_name" class="form-control" value="<?= htmlspecialchars($smtp['from_name'] ?? '') ?>">
</div>
</div>
<div class="mb-3">
<label class="form-label">SMTP Username</label>
<input type="text" name="smtp_user" class="form-control" value="<?= htmlspecialchars($smtp['smtp_user'] ?? '') ?>">
</div>
<div class="mb-3">
<label class="form-label">SMTP Password</label>
<input type="password" name="smtp_pass" class="form-control" value="<?= htmlspecialchars($smtp['smtp_pass'] ?? '') ?>">
</div>
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">From Email</label>
<input type="email" name="from_email" class="form-control" value="<?= htmlspecialchars($smtp['from_email'] ?? '') ?>">
</div>
<div class="col-md-4 mb-3">
<label class="form-label">Reply-To Email</label>
<input type="email" name="reply_to" class="form-control" value="<?= htmlspecialchars($smtp['reply_to'] ?? '') ?>">
</div>
<div class="col-md-4 mb-3">
<label class="form-label">حد الأخطاء قبل التعطيل</label>
<input type="number" name="max_failures" class="form-control" value="<?= htmlspecialchars($smtp['max_failures'] ?? 5) ?>">
</div>
</div>
<button type="submit" class="btn btn-primary">حفظ إعدادات SMTP</button>
</form>
<hr class="my-4">
<h5>اختبار الإرسال</h5>
<form method="POST">
<div class="input-group" style="max-width: 400px;">
<input type="email" name="test_email_addr" class="form-control" placeholder="بريد الوجهة" required>
<button class="btn btn-outline-secondary" type="submit">إرسال تجريبي</button>
</div>
</form>
</div>
<!-- Statuses Settings -->
<div class="tab-pane" id="statuses" role="tabpanel">
<h4 class="mb-4">أنواع حالات البريد</h4>
<form method="POST" class="mb-4 bg-light p-3 rounded">
<input type="hidden" name="add_status" value="1">
<div class="row g-2 align-items-end">
<div class="col-md-5">
<label class="form-label">اسم الحالة</label>
<input type="text" name="status_name" class="form-control" required>
</div>
<div class="col-md-2">
<label class="form-label">اللون</label>
<input type="color" name="status_color" class="form-control form-control-color w-100" value="#0d6efd">
</div>
<div class="col-md-3 text-center">
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" name="is_default" id="is_default">
<label class="form-check-label" for="is_default">افتراضية</label>
</div>
</div>
<div class="col-md-2">
<button type="submit" class="btn btn-primary w-100">إضافة</button>
</div>
</div>
</form>
<div class="table-responsive">
<table class="table align-middle">
<thead>
<tr><th>الاسم</th><th>اللون</th><th>افتراضية</th><th class="text-end">الإجراء</th></tr>
</thead>
<tbody>
<?php foreach ($statuses as $status): ?>
<tr>
<td><span class="badge" style="background-color: <?= $status['color'] ?>;"><?= htmlspecialchars($status['name']) ?></span></td>
<td><code><?= $status['color'] ?></code></td>
<td><?= $status['is_default'] ? '<i class="fas fa-check text-success"></i>' : '' ?></td>
<td class="text-end">
<button type="button" class="btn btn-sm btn-outline-primary" onclick="editStatus(<?= $status['id'] ?>, '<?= htmlspecialchars($status['name'], ENT_QUOTES) ?>', '<?= $status['color'] ?>', <?= $status['is_default'] ?>)"><i class="fas fa-edit"></i></button>
<form method="POST" onsubmit="return confirm('حذف؟');" style="display:inline;"><input type="hidden" name="status_id" value="<?= $status['id'] ?>"><input type="hidden" name="delete_status" value="1"><button type="submit" class="btn btn-sm btn-outline-danger"><i class="fas fa-trash"></i></button></form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<!-- Email Logs -->
<div class="tab-pane" id="logs" role="tabpanel">
<h4 class="mb-4">سجلات البريد المرسل (آخر 50 عملية)</h4>
<div class="table-responsive">
<table class="table table-sm table-hover">
<thead>
<tr>
<th>الوقت</th>
<th>المستلم</th>
<th>الموضوع</th>
<th>الحالة</th>
<th>الخطأ</th>
</tr>
</thead>
<tbody>
<?php foreach ($email_logs as $log): ?>
<tr>
<td class="small"><?= date('Y-m-d H:i', strtotime($log['created_at'])) ?></td>
<td><?= htmlspecialchars($log['recipient']) ?></td>
<td class="small"><?= htmlspecialchars($log['subject']) ?></td>
<td>
<span class="badge bg-<?= $log['status'] === 'success' ? 'success' : 'danger' ?>">
<?= $log['status'] === 'success' ? 'نجاح' : 'فشل' ?>
</span>
</td>
<td class="small text-danger"><?= htmlspecialchars($log['error_message'] ?? '') ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="editStatusModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<form method="POST">
<div class="modal-header">
<h5 class="modal-title">تعديل نوع الحالة</h5>
<button type="button" class="btn-close ms-0 me-auto" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<input type="hidden" name="update_status" value="1"><input type="hidden" name="status_id" id="edit_status_id">
<div class="mb-3"><label class="form-label">اسم الحالة</label><input type="text" name="status_name" id="edit_status_name" class="form-control" required></div>
<div class="mb-3"><label class="form-label">اللون</label><input type="color" name="status_color" id="edit_status_color" class="form-control form-control-color w-100"></div>
<div class="form-check"><input class="form-check-input" type="checkbox" name="is_default" id="edit_is_default"><label class="form-check-label" for="edit_is_default">افتراضية</label></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">إلغاء</button>
<button type="submit" class="btn btn-primary">حفظ</button>
</div>
</form>
</div>
</div>
</div>
<script>
function editStatus(id, name, color, isDefault) {
document.getElementById('edit_status_id').value = id;
document.getElementById('edit_status_name').value = name;
document.getElementById('edit_status_color').value = color;
document.getElementById('edit_is_default').checked = isDefault == 1;
new bootstrap.Modal(document.getElementById('editStatusModal')).show();
}
</script>
<?php require_once __DIR__ . '/includes/footer.php'; ?>