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

97 lines
6.8 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/queue_bootstrap.php';
qh_boot();
qh_doctor_handle_request();
$doctors = qh_fetch_doctors();
$selectedDoctorId = isset($_GET['doctor_id']) ? (int) $_GET['doctor_id'] : (int) ($doctors[0]['id'] ?? 0);
$selectedDoctor = $selectedDoctorId > 0 ? qh_fetch_doctor($selectedDoctorId) : null;
$doctorQueue = $selectedDoctorId > 0 ? qh_fetch_tickets(['ready_for_doctor', 'called', 'in_progress'], $selectedDoctorId, 20) : [];
qh_page_start(
'doctor',
qh_t('Doctor room queue', 'طابور غرفة الطبيب'),
qh_t('Doctor workspace with separate English and Arabic page views.', 'مساحة عمل الطبيب مع صفحات عربية وإنجليزية منفصلة.')
);
?>
<div class="container-xxl px-3 px-lg-4">
<section class="page-header-panel mb-4">
<div>
<span class="section-kicker"><?= qh_h(qh_t('Doctor', 'الطبيب')) ?></span>
<div class="locale-chip mt-3"><?= qh_h(qh_current_language_badge()) ?></div>
<h1 class="section-title-xl mt-2"><?= qh_h(qh_t('Call the next patient and manage room flow.', 'نادِ المريض التالي وأدر حركة الغرفة.')) ?></h1>
<p class="section-copy mb-0"><?= qh_h(qh_t('Select a doctor room, then call, start, complete, or mark no-show for the assigned patients.', 'اختر غرفة الطبيب ثم قم بنداء المرضى المخصصين أو بدء الزيارة أو إنهائها أو تسجيل عدم الحضور.')) ?></p>
</div>
</section>
<div class="row g-4">
<div class="col-xl-4">
<div class="panel-card h-100">
<label class="form-label"><?= qh_h(qh_t('Doctor room', 'غرفة الطبيب')) ?></label>
<form method="get" class="vstack gap-3">
<input type="hidden" name="lang" value="<?= qh_h(qh_locale()) ?>">
<select class="form-select" name="doctor_id" onchange="this.form.submit()">
<?php foreach ($doctors as $doctor): ?>
<option value="<?= qh_h((string) $doctor['id']) ?>" <?= (int) $doctor['id'] === $selectedDoctorId ? 'selected' : '' ?>><?= qh_h(qh_name($doctor)) ?> · <?= qh_h(qh_t('Room', 'غرفة')) ?> <?= qh_h($doctor['room_number']) ?></option>
<?php endforeach; ?>
</select>
<?php if ($selectedDoctor): ?>
<div class="mini-overview-card">
<div class="fw-semibold"><?= qh_h(qh_name($selectedDoctor)) ?></div>
<div class="small text-secondary mt-1"><?= qh_h(qh_t('Room', 'الغرفة')) ?> <?= qh_h($selectedDoctor['room_number'] ?? '--') ?></div>
</div>
<?php endif; ?>
<a class="btn btn-outline-dark" href="<?= qh_h(qh_url('display.php')) ?>" target="_blank" rel="noopener"><?= qh_h(qh_t('Preview public display', 'معاينة الشاشة العامة')) ?></a>
</form>
</div>
</div>
<div class="col-xl-8">
<div class="panel-card h-100">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3">
<div>
<h2 class="section-title mb-1"><?= qh_h(qh_t('Doctor queue', 'طابور الطبيب')) ?></h2>
<p class="section-copy mb-0"><?= qh_h(qh_t('Patients currently assigned to this room.', 'المرضى المخصصون حالياً لهذه الغرفة.')) ?></p>
</div>
<?php if ($selectedDoctor): ?>
<span class="room-badge"><?= qh_h(qh_t('Room', 'غرفة')) ?> <?= qh_h($selectedDoctor['room_number'] ?? '--') ?></span>
<?php endif; ?>
</div>
<?php if ($doctorQueue): ?>
<div class="vstack gap-3">
<?php foreach ($doctorQueue as $ticket): ?>
<article class="list-row-form">
<div class="d-flex justify-content-between align-items-start flex-wrap gap-3">
<div>
<div class="ticket-code"><?= qh_h($ticket['ticket_number']) ?></div>
<div class="fw-semibold mt-1"><?= qh_h($ticket['patient_name']) ?></div>
<div class="small text-secondary mt-1"><?= qh_h(qh_name($ticket, 'clinic_name')) ?> · <?= qh_h(qh_t('Created', 'أُنشئت')) ?> <?= qh_format_datetime($ticket['created_at']) ?></div>
</div>
<div class="d-flex gap-2 flex-wrap align-items-center">
<?= qh_status_badge($ticket['status']) ?>
<a class="btn btn-sm btn-outline-dark" href="<?= qh_h(qh_url('ticket.php', ['id' => (int) $ticket['id']])) ?>"><?= qh_h(qh_t('Ticket detail', 'تفاصيل التذكرة')) ?></a>
</div>
</div>
<div class="d-flex flex-wrap gap-2 mt-3">
<form method="post"><input type="hidden" name="ticket_id" value="<?= qh_h((string) $ticket['id']) ?>"><input type="hidden" name="doctor_id" value="<?= qh_h((string) $selectedDoctorId) ?>"><input type="hidden" name="action" value="call_ticket"><button class="btn btn-dark btn-sm" type="submit"><?= qh_h(qh_t('Call patient', 'نداء المريض')) ?></button></form>
<form method="post"><input type="hidden" name="ticket_id" value="<?= qh_h((string) $ticket['id']) ?>"><input type="hidden" name="doctor_id" value="<?= qh_h((string) $selectedDoctorId) ?>"><input type="hidden" name="action" value="start_visit"><button class="btn btn-outline-dark btn-sm" type="submit"><?= qh_h(qh_t('Start visit', 'بدء الزيارة')) ?></button></form>
<form method="post"><input type="hidden" name="ticket_id" value="<?= qh_h((string) $ticket['id']) ?>"><input type="hidden" name="doctor_id" value="<?= qh_h((string) $selectedDoctorId) ?>"><input type="hidden" name="action" value="complete_ticket"><button class="btn btn-outline-success btn-sm" type="submit"><?= qh_h(qh_t('Mark done', 'إنهاء الزيارة')) ?></button></form>
<form method="post"><input type="hidden" name="ticket_id" value="<?= qh_h((string) $ticket['id']) ?>"><input type="hidden" name="doctor_id" value="<?= qh_h((string) $selectedDoctorId) ?>"><input type="hidden" name="action" value="mark_no_show"><button class="btn btn-outline-danger btn-sm" type="submit"><?= qh_h(qh_t('No-show', 'عدم حضور')) ?></button></form>
</div>
</article>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="empty-state">
<strong><?= qh_h(qh_t('No patients are in this doctor queue.', 'لا يوجد مرضى في طابور هذا الطبيب.')) ?></strong>
<span><?= qh_h(qh_t('Issue a ticket at reception or complete vitals in nursing to fill this room.', 'أصدر تذكرة من الاستقبال أو أكمل العلامات الحيوية في التمريض لإضافة مرضى لهذه الغرفة.')) ?></span>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php qh_page_end(); ?>