39414-vm/admin_clinics.php
2026-03-31 10:39:17 +00:00

189 lines
12 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/queue_bootstrap.php';
qh_boot();
qh_admin_handle_request();
$stats = qh_admin_stats();
$clinics = qh_fetch_clinics();
$search = trim((string) ($_GET['q'] ?? ''));
$editId = (int) ($_GET['edit'] ?? 0);
$editClinic = $editId > 0 ? qh_fetch_clinic($editId) : null;
if ($editId > 0 && $editClinic === null) {
qh_set_flash('warning', qh_t('The requested clinic record was not found.', 'لم يتم العثور على سجل العيادة المطلوب.'));
qh_redirect('admin_clinics.php');
}
$toLower = static function (string $value): string {
return function_exists('mb_strtolower') ? mb_strtolower($value, 'UTF-8') : strtolower($value);
};
if ($search !== '') {
$needle = $toLower($search);
$clinics = array_values(array_filter($clinics, static function (array $clinic) use ($needle, $toLower): bool {
$haystack = implode(' ', [
(string) ($clinic['code'] ?? ''),
(string) ($clinic['name_en'] ?? ''),
(string) ($clinic['name_ar'] ?? ''),
(int) ($clinic['requires_vitals'] ?? 0) === 1 ? 'vitals first' : 'direct doctor',
]);
return str_contains($toLower($haystack), $needle);
}));
}
qh_page_start(
'admin',
qh_t('Clinic management', 'إدارة العيادات'),
qh_t('Professional clinic directory with search, edit, and delete actions.', 'دليل احترافي للعيادات مع البحث وخيارات التعديل والحذف.')
);
?>
<div class="container-xxl px-3 px-lg-4">
<div class="admin-layout">
<aside class="admin-sidebar-column">
<?php qh_render_admin_sidebar('admin_clinics.php', $stats); ?>
</aside>
<div class="admin-content-stack">
<section class="page-header-panel admin-hero-panel mb-0">
<div>
<span class="section-kicker"><?= qh_h(qh_t('Clinic directory', 'دليل العيادات')) ?></span>
<div class="locale-chip mt-3"><?= qh_h(qh_current_language_badge()) ?></div>
<h1 class="section-title-xl mt-2 mb-2"><?= qh_h(qh_t('Dedicated clinic management with cleaner routing control.', 'إدارة مستقلة للعيادات مع تحكم أنظف في مسار العمل.')) ?></h1>
<p class="section-copy mb-0"><?= qh_h(qh_t('Search clinics, adjust codes and routing, and keep the front desk workflow organized.', 'ابحث في العيادات وعدّل الرموز ومسار العمل وحافظ على تنظيم سير العمل في الاستقبال.')) ?></p>
</div>
</section>
<section class="panel-card admin-toolbar-card">
<div class="admin-toolbar">
<form method="get" class="admin-search-form" role="search">
<input type="hidden" name="lang" value="<?= qh_h(qh_locale()) ?>">
<label class="visually-hidden" for="clinicSearch"><?= qh_h(qh_t('Search clinics', 'البحث عن العيادات')) ?></label>
<input id="clinicSearch" class="form-control" type="search" name="q" value="<?= qh_h($search) ?>" placeholder="<?= qh_h(qh_t('Search by clinic name or code', 'ابحث باسم العيادة أو الرمز')) ?>">
<button class="btn btn-dark" type="submit"><?= qh_h(qh_t('Search', 'بحث')) ?></button>
<?php if ($search !== ''): ?>
<a class="btn btn-outline-dark" href="<?= qh_h(qh_url('admin_clinics.php')) ?>"><?= qh_h(qh_t('Reset', 'إعادة ضبط')) ?></a>
<?php endif; ?>
</form>
<?php if ($editClinic !== null): ?>
<a class="btn btn-outline-dark" href="<?= qh_h(qh_url('admin_clinics.php')) ?>"><?= qh_h(qh_t('Add new clinic', 'إضافة عيادة جديدة')) ?></a>
<?php endif; ?>
</div>
</section>
<div class="admin-directory-layout">
<section class="panel-card admin-table-card">
<div class="admin-section-head">
<div>
<span class="section-kicker"><?= qh_h(qh_t('Clinic list', 'قائمة العيادات')) ?></span>
<h2 class="section-title mt-2 mb-1"><?= qh_h(qh_t('Clinics and routing rules', 'العيادات وقواعد مسار العمل')) ?></h2>
<p class="section-copy mb-0"><?= qh_h($search !== ''
? qh_t('Filtered results based on your search.', 'نتائج مفلترة بناءً على البحث.')
: qh_t('All configured clinic records.', 'جميع سجلات العيادات المهيأة.')) ?></p>
</div>
<div class="admin-count-chip"><?= qh_h((string) count($clinics)) ?> <?= qh_h(qh_t('records', 'سجلات')) ?></div>
</div>
<?php if ($clinics === []): ?>
<div class="empty-state compact mt-4"><strong><?= qh_h(qh_t('No clinic records match this view.', 'لا توجد سجلات عيادات مطابقة لهذا العرض.')) ?></strong><span><?= qh_h(qh_t('Try another search or create a new clinic.', 'جرّب بحثاً آخر أو أنشئ عيادة جديدة.')) ?></span></div>
<?php else: ?>
<div class="table-responsive mt-4">
<table class="table align-middle admin-table">
<thead>
<tr>
<th><?= qh_h(qh_t('Code', 'الرمز')) ?></th>
<th><?= qh_h(qh_t('Clinic', 'العيادة')) ?></th>
<th><?= qh_h(qh_t('Routing', 'المسار')) ?></th>
<th><?= qh_h(qh_t('Order', 'الترتيب')) ?></th>
<th><?= qh_h(qh_t('Actions', 'الإجراءات')) ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($clinics as $clinic): ?>
<?php $editUrl = qh_url('admin_clinics.php', ['edit' => (int) $clinic['id'], 'q' => $search]); ?>
<tr>
<td><span class="room-badge"><?= qh_h((string) $clinic['code']) ?></span></td>
<td>
<div class="fw-semibold"><?= qh_h(qh_name($clinic)) ?></div>
<div class="small text-secondary"><?= qh_h(qh_is_ar() ? (string) ($clinic['name_en'] ?? '') : (string) ($clinic['name_ar'] ?? '')) ?></div>
</td>
<td><span class="table-pill <?= (int) $clinic['requires_vitals'] === 1 ? 'warning' : 'info' ?>"><?= qh_h((int) $clinic['requires_vitals'] === 1 ? qh_t('Vitals first', 'العلامات أولاً') : qh_t('Direct doctor', 'الطبيب مباشرة')) ?></span></td>
<td><?= qh_h((string) $clinic['sort_order']) ?></td>
<td>
<div class="admin-table-actions">
<a class="btn btn-sm btn-outline-dark" href="<?= qh_h($editUrl) ?>"><?= qh_h(qh_t('Edit', 'تعديل')) ?></a>
<form method="post" onsubmit="return confirm('<?= qh_h(qh_t('Delete this clinic record?', 'هل تريد حذف سجل هذه العيادة؟')) ?>');">
<input type="hidden" name="action" value="delete_clinic">
<input type="hidden" name="clinic_id" value="<?= qh_h((string) $clinic['id']) ?>">
<input type="hidden" name="return_to" value="admin_clinics.php">
<button class="btn btn-sm btn-outline-danger" type="submit"><?= qh_h(qh_t('Delete', 'حذف')) ?></button>
</form>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</section>
<section class="panel-card admin-form-card">
<div class="admin-section-head">
<div>
<span class="section-kicker"><?= qh_h($editClinic ? qh_t('Edit clinic', 'تعديل العيادة') : qh_t('New clinic', 'عيادة جديدة')) ?></span>
<h2 class="section-title mt-2 mb-1"><?= qh_h($editClinic ? qh_t('Update clinic profile', 'تحديث ملف العيادة') : qh_t('Create clinic profile', 'إنشاء ملف العيادة')) ?></h2>
<p class="section-copy mb-0"><?= qh_h(qh_t('Define the code, both names, routing type, and display order in one focused form.', 'حدّد الرمز والاسمين ونوع المسار وترتيب العرض في نموذج واحد مركز.')) ?></p>
</div>
</div>
<form method="post" class="vstack gap-3 mt-4">
<input type="hidden" name="action" value="<?= qh_h($editClinic ? 'update_clinic' : 'add_clinic') ?>">
<input type="hidden" name="return_to" value="admin_clinics.php">
<?php if ($editClinic): ?>
<input type="hidden" name="clinic_id" value="<?= qh_h((string) $editClinic['id']) ?>">
<?php endif; ?>
<div class="row g-3">
<div class="col-sm-4">
<label class="form-label" for="clinicCode"><?= qh_h(qh_t('Clinic code', 'رمز العيادة')) ?></label>
<input id="clinicCode" class="form-control" type="text" maxlength="10" name="code" value="<?= qh_h((string) ($editClinic['code'] ?? '')) ?>" required>
</div>
<div class="col-sm-8">
<label class="form-label" for="clinicOrder"><?= qh_h(qh_t('Display order', 'ترتيب العرض')) ?></label>
<input id="clinicOrder" class="form-control" type="number" min="1" name="sort_order" value="<?= qh_h((string) ($editClinic['sort_order'] ?? 50)) ?>" required>
</div>
</div>
<div>
<label class="form-label" for="clinicNameEn"><?= qh_h(qh_t('Clinic name (English)', 'اسم العيادة بالإنجليزية')) ?></label>
<input id="clinicNameEn" class="form-control" type="text" name="name_en" value="<?= qh_h((string) ($editClinic['name_en'] ?? '')) ?>" required>
</div>
<div>
<label class="form-label" for="clinicNameAr"><?= qh_h(qh_t('Clinic name (Arabic)', 'اسم العيادة بالعربية')) ?></label>
<input id="clinicNameAr" class="form-control" type="text" name="name_ar" value="<?= qh_h((string) ($editClinic['name_ar'] ?? '')) ?>" required>
</div>
<div class="admin-switch-card">
<div class="form-check form-switch mb-0">
<input class="form-check-input" type="checkbox" role="switch" id="clinicVitals" name="requires_vitals" <?= (int) ($editClinic['requires_vitals'] ?? 0) === 1 ? 'checked' : '' ?>>
<label class="form-check-label" for="clinicVitals"><?= qh_h(qh_t('Require nursing vitals before doctor', 'يتطلب العلامات الحيوية في التمريض قبل الطبيب')) ?></label>
</div>
<div class="admin-form-note mt-2"><?= qh_h(qh_t('Turn this on for clinics that must stop at nursing before the doctor queue.', 'فعّل هذا الخيار للعيادات التي يجب أن تمر على التمريض قبل قائمة انتظار الطبيب.')) ?></div>
</div>
<div class="d-flex flex-wrap gap-2 pt-2">
<button class="btn btn-dark" type="submit"><?= qh_h($editClinic ? qh_t('Save changes', 'حفظ التعديلات') : qh_t('Add clinic', 'إضافة عيادة')) ?></button>
<?php if ($editClinic): ?>
<a class="btn btn-outline-dark" href="<?= qh_h(qh_url('admin_clinics.php')) ?>"><?= qh_h(qh_t('Cancel edit', 'إلغاء التعديل')) ?></a>
<?php endif; ?>
</div>
</form>
</section>
</div>
</div>
</div>
</div>
<?php qh_page_end(); ?>