387 lines
18 KiB
HTML
387 lines
18 KiB
HTML
{% extends "base.html" %}
|
|
{% load static %}
|
|
|
|
{% block title %}Encounter Details - {{ block.super }}{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid">
|
|
<div class="row mb-3">
|
|
<div class="col">
|
|
<h1>Encounter Details</h1>
|
|
<p class="text-muted">{{ encounter.patient.get_full_name }} • {{ encounter.start_datetime|date:"M d, Y H:i" }}</p>
|
|
</div>
|
|
<div class="col-auto">
|
|
<div class="btn-group">
|
|
{% if encounter.status == 'IN_PROGRESS' %}
|
|
<button class="btn btn-success"
|
|
hx-post="{% url 'emr:complete_encounter' encounter.id %}"
|
|
hx-confirm="Complete this encounter?"
|
|
hx-swap="none">
|
|
<i class="fas fa-check me-1"></i>Complete
|
|
</button>
|
|
{% endif %}
|
|
<button class="btn btn-outline-primary">
|
|
<i class="fas fa-edit me-1"></i>Edit
|
|
</button>
|
|
<button class="btn btn-outline-secondary">
|
|
<i class="fas fa-print me-1"></i>Print
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<!-- Encounter Information -->
|
|
<div class="col-lg-6">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-notes-medical me-2"></i>Encounter Information</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<table class="table table-sm">
|
|
<tr><td>Start Time</td><td>{{ encounter.start_datetime|date:"M d, Y H:i" }}</td></tr>
|
|
{% if encounter.end_datetime %}
|
|
<tr><td>End Time</td><td>{{ encounter.end_datetime|date:"M d, Y H:i" }}</td></tr>
|
|
<tr><td>Duration</td><td>{{ encounter.duration_minutes }} minutes</td></tr>
|
|
{% endif %}
|
|
<tr><td>Type</td><td>{{ encounter.get_encounter_type_display }}</td></tr>
|
|
<tr><td>Status</td><td>
|
|
{% if encounter.status == 'SCHEDULED' %}
|
|
<span class="badge bg-info">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'ARRIVED' %}
|
|
<span class="badge bg-warning">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'TRIAGED' %}
|
|
<span class="badge bg-primary">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'IN_PROGRESS' %}
|
|
<span class="badge bg-success">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'ON_HOLD' %}
|
|
<span class="badge bg-secondary">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'FINISHED' %}
|
|
<span class="badge bg-success">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'CANCELLED' %}
|
|
<span class="badge bg-danger">{{ encounter.get_status_display }}</span>
|
|
{% elif encounter.status == 'NO_SHOW' %}
|
|
<span class="badge bg-secondary">{{ encounter.get_status_display }}</span>
|
|
{% endif %}
|
|
</td></tr>
|
|
<tr><td>Priority</td><td>{{ encounter.get_priority_display }}</td></tr>
|
|
<tr><td>Documentation Complete</td><td>
|
|
{% if encounter.documentation_complete %}
|
|
<span class="badge bg-success">Yes</span>
|
|
{% else %}
|
|
<span class="badge bg-warning">No</span>
|
|
{% endif %}
|
|
</td></tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
{% if encounter.chief_complaint %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-stethoscope me-2"></i>Chief Complaint</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>{{ encounter.chief_complaint }}</p>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if encounter.history_of_present_illness %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-history me-2"></i>History of Present Illness</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>{{ encounter.history_of_present_illness|linebreaks }}</p>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if encounter.assessment_and_plan %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-clipboard-list me-2"></i>Assessment & Plan</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>{{ encounter.assessment_and_plan|linebreaks }}</p>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<!-- Patient & Provider Information -->
|
|
<div class="col-lg-6">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-user me-2"></i>Patient Information</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<table class="table table-sm">
|
|
<tr><td>Name</td><td><strong>{{ encounter.patient.get_full_name }}</strong></td></tr>
|
|
<tr><td>MRN</td><td>{{ encounter.patient.mrn }}</td></tr>
|
|
<tr><td>Date of Birth</td><td>{{ encounter.patient.date_of_birth|date:"M d, Y" }}</td></tr>
|
|
<tr><td>Age</td><td>{{ encounter.patient.age }}</td></tr>
|
|
<tr><td>Gender</td><td>{{ encounter.patient.get_gender_display }}</td></tr>
|
|
<tr><td>Phone</td><td>{{ encounter.patient.phone_number|default:"Not provided" }}</td></tr>
|
|
<tr><td>Email</td><td>{{ encounter.patient.email|default:"Not provided" }}</td></tr>
|
|
</table>
|
|
<div class="mt-2">
|
|
<a href="{% url 'patients:patient_detail' encounter.patient.id %}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-eye me-1"></i>View Patient
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if encounter.provider %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-user-md me-2"></i>Provider Information</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<table class="table table-sm">
|
|
<tr><td>Name</td><td><strong>{{ encounter.provider.get_full_name }}</strong></td></tr>
|
|
<tr><td>Role</td><td>{{ encounter.provider.get_role_display }}</td></tr>
|
|
<tr><td>Department</td><td>{{ encounter.provider.department|default:"Not specified" }}</td></tr>
|
|
<tr><td>Phone</td><td>{{ encounter.provider.phone_number|default:"Not provided" }}</td></tr>
|
|
<tr><td>Email</td><td>{{ encounter.provider.email|default:"Not provided" }}</td></tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Quick Actions -->
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-bolt me-2"></i>Quick Actions</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="d-grid gap-2">
|
|
<button class="btn btn-outline-primary"
|
|
hx-get="{% url 'emr:add_vital_signs' encounter.id %}"
|
|
hx-target="#vital-signs-modal .modal-content"
|
|
data-bs-toggle="modal"
|
|
data-bs-target="#vital-signs-modal">
|
|
<i class="fas fa-heartbeat me-2"></i>Add Vital Signs
|
|
</button>
|
|
<button class="btn btn-outline-info"
|
|
hx-get="{% url 'emr:clinical_note_create' encounter.id %}"
|
|
hx-target="#note-modal .modal-content"
|
|
data-bs-toggle="modal"
|
|
data-bs-target="#note-modal">
|
|
<i class="fas fa-sticky-note me-2"></i>Add Clinical Note
|
|
</button>
|
|
<button class="btn btn-outline-success"
|
|
hx-get="{% url 'emr:add_problem' encounter.id %}"
|
|
hx-target="#problem-modal .modal-content"
|
|
data-bs-toggle="modal"
|
|
data-bs-target="#problem-modal">
|
|
<i class="fas fa-plus me-2"></i>Add Problem
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Vital Signs Section -->
|
|
{% if vital_signs %}
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-heartbeat me-2"></i>Vital Signs</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th>Time</th>
|
|
<th>Temperature</th>
|
|
<th>Blood Pressure</th>
|
|
<th>Heart Rate</th>
|
|
<th>Respiratory Rate</th>
|
|
<th>O2 Saturation</th>
|
|
<th>Measured By</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for vitals in vital_signs %}
|
|
<tr>
|
|
<td>{{ vitals.measured_datetime|date:"M d H:i" }}</td>
|
|
<td>
|
|
{% if vitals.temperature %}
|
|
{{ vitals.temperature }}°{{ vitals.temperature_unit }}
|
|
{% else %}
|
|
<span class="text-muted">-</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if vitals.systolic_bp and vitals.diastolic_bp %}
|
|
{{ vitals.systolic_bp }}/{{ vitals.diastolic_bp }}
|
|
{% else %}
|
|
<span class="text-muted">-</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if vitals.heart_rate %}
|
|
{{ vitals.heart_rate }} bpm
|
|
{% else %}
|
|
<span class="text-muted">-</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if vitals.respiratory_rate %}
|
|
{{ vitals.respiratory_rate }} /min
|
|
{% else %}
|
|
<span class="text-muted">-</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if vitals.oxygen_saturation %}
|
|
{{ vitals.oxygen_saturation }}%
|
|
{% else %}
|
|
<span class="text-muted">-</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ vitals.measured_by.get_full_name }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Clinical Notes Section -->
|
|
{% if clinical_notes %}
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-sticky-note me-2"></i>Clinical Notes</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% for note in clinical_notes %}
|
|
<div class="border-bottom pb-3 mb-3">
|
|
<div class="d-flex justify-content-between align-items-start">
|
|
<div>
|
|
<h6>{{ note.title }}</h6>
|
|
<small class="text-muted">
|
|
{{ note.get_note_type_display }} •
|
|
{{ note.note_datetime|date:"M d, Y H:i" }} •
|
|
{{ note.author.get_full_name }}
|
|
</small>
|
|
</div>
|
|
<span class="badge {% if note.status == 'COMPLETED' %}bg-success{% elif note.status == 'DRAFT' %}bg-warning{% else %}bg-info{% endif %}">
|
|
{{ note.get_status_display }}
|
|
</span>
|
|
</div>
|
|
<div class="mt-2">
|
|
<p>{{ note.content|truncatewords:50|linebreaks }}</p>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Problems Section -->
|
|
{% if problems %}
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-list me-2"></i>Problems Identified</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th>Problem</th>
|
|
<th>Type</th>
|
|
<th>Priority</th>
|
|
<th>Status</th>
|
|
<th>Diagnosed By</th>
|
|
<th>Date</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for problem in problems %}
|
|
<tr>
|
|
<td>
|
|
<strong>{{ problem.problem_name }}</strong>
|
|
{% if problem.problem_code %}
|
|
<br><small class="text-muted">{{ problem.problem_code }}</small>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ problem.get_problem_type_display }}</td>
|
|
<td>
|
|
{% if problem.priority == 'HIGH' %}
|
|
<span class="badge bg-danger">High</span>
|
|
{% elif problem.priority == 'MEDIUM' %}
|
|
<span class="badge bg-warning">Medium</span>
|
|
{% else %}
|
|
<span class="badge bg-info">Low</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if problem.status == 'ACTIVE' %}
|
|
<span class="badge bg-success">Active</span>
|
|
{% elif problem.status == 'RESOLVED' %}
|
|
<span class="badge bg-secondary">Resolved</span>
|
|
{% elif problem.status == 'INACTIVE' %}
|
|
<span class="badge bg-secondary">Inactive</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ problem.diagnosing_provider.get_full_name }}</td>
|
|
<td>{{ problem.onset_date|date:"M d, Y" }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<!-- Vital Signs Modal -->
|
|
<div class="modal fade" id="vital-signs-modal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<!-- Content loaded via HTMX -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Note Modal -->
|
|
<div class="modal fade" id="note-modal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<!-- Content loaded via HTMX -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Problem Modal -->
|
|
<div class="modal fade" id="problem-modal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<!-- Content loaded via HTMX -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|