476 lines
20 KiB
HTML
476 lines
20 KiB
HTML
{% extends "base.html" %}
|
|
{% load static %}
|
|
|
|
{% block title %}Patient Profile - {{ object.get_full_name }}{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="d-flex align-items-center mb-3">
|
|
<div>
|
|
<ol class="breadcrumb">
|
|
<li class="breadcrumb-item"><a href="{% url 'patients:patient_list' %}">Patients</a></li>
|
|
<li class="breadcrumb-item"><a href="{% url 'patients:patient_detail' object.pk %}">{{ object.get_full_name }}</a></li>
|
|
<li class="breadcrumb-item active">Profile</li>
|
|
</ol>
|
|
<h1 class="page-header mb-0">Patient Profile - {{ object.get_full_name }}</h1>
|
|
</div>
|
|
<div class="ms-auto">
|
|
<div class="btn-group">
|
|
<a href="{% url 'patients:patient_form' object.pk %}" class="btn btn-primary">
|
|
<i class="fas fa-edit me-2"></i>Edit Profile
|
|
</a>
|
|
<button type="button" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown">
|
|
<span class="visually-hidden">Toggle Dropdown</span>
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item" href="#" onclick="printProfile()">
|
|
<i class="fas fa-print text-primary me-2"></i>Print Profile
|
|
</a></li>
|
|
<li><a class="dropdown-item" href="#" onclick="exportProfile()">
|
|
<i class="fas fa-download text-info me-2"></i>Export Profile
|
|
</a></li>
|
|
<li><a class="dropdown-item" href="#" onclick="generateQR()">
|
|
<i class="fas fa-qrcode text-secondary me-2"></i>Generate QR Code
|
|
</a></li>
|
|
<li><hr class="dropdown-divider"></li>
|
|
<li><a class="dropdown-item" href="{% url 'patients:patient_registration' %}">
|
|
<i class="fas fa-plus text-success me-2"></i>Register New Patient
|
|
</a></li>
|
|
<li><a class="dropdown-item text-danger" href="{% url 'patients:patient_confirm_delete' object.pk %}">
|
|
<i class="fas fa-trash me-2"></i>Delete Profile
|
|
</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-xl-8">
|
|
<!-- Personal Information -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h4 class="card-title">
|
|
<i class="fas fa-user me-2"></i>
|
|
Personal Information
|
|
</h4>
|
|
<div class="card-toolbar">
|
|
<span class="badge bg-{% if object.is_active %}success{% else %}secondary{% endif %} fs-6">
|
|
{% if object.is_active %}Active{% else %}Inactive{% endif %}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold">Full Name:</td>
|
|
<td>{{ object.get_full_name }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Medical Record Number:</td>
|
|
<td>
|
|
<span class="badge bg-primary">{{ object.medical_record_number }}</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Date of Birth:</td>
|
|
<td>{{ object.date_of_birth|date:"F d, Y" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Age:</td>
|
|
<td>{{ object.age }} years old</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Gender:</td>
|
|
<td>{{ object.get_gender_display }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<table class="table table-borderless">
|
|
<tr>
|
|
<td class="fw-bold">Phone Number:</td>
|
|
<td>{{ object.phone_number|default:"Not provided" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Email:</td>
|
|
<td>{{ object.email|default:"Not provided" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Blood Type:</td>
|
|
<td>
|
|
{% if object.blood_type %}
|
|
<span class="badge bg-danger">{{ object.blood_type }}</span>
|
|
{% else %}
|
|
<span class="text-muted">Unknown</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Marital Status:</td>
|
|
<td>{{ object.get_marital_status_display|default:"Not specified" }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="fw-bold">Registration Date:</td>
|
|
<td>{{ object.created_at|date:"F d, Y" }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Address Information -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h4 class="card-title">
|
|
<i class="fas fa-map-marker-alt me-2"></i>
|
|
Address Information
|
|
</h4>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if object.address %}
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<div class="mb-3">
|
|
<strong>Street Address:</strong><br>
|
|
{{ object.address }}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<strong>City:</strong><br>
|
|
{{ object.city|default:"Not provided" }}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<strong>State/Province:</strong><br>
|
|
{{ object.state|default:"Not provided" }}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<strong>ZIP/Postal Code:</strong><br>
|
|
{{ object.zip_code|default:"Not provided" }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-3">
|
|
<i class="fas fa-map-marker-alt fa-2x mb-2"></i>
|
|
<p>No address information provided</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Medical Information -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h4 class="card-title">
|
|
<i class="fas fa-heartbeat me-2"></i>
|
|
Medical Information
|
|
</h4>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<strong>Primary Care Physician:</strong><br>
|
|
{{ object.primary_care_physician.get_full_name|default:"Not assigned" }}
|
|
</div>
|
|
<div class="mb-3">
|
|
<strong>Allergies:</strong><br>
|
|
{% if object.allergies %}
|
|
<div class="alert alert-warning">
|
|
{{ object.allergies }}
|
|
</div>
|
|
{% else %}
|
|
<span class="text-muted">No known allergies</span>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<strong>Medical History:</strong><br>
|
|
{% if object.medical_history %}
|
|
<div class="alert alert-info">
|
|
{{ object.medical_history|truncatewords:50 }}
|
|
</div>
|
|
{% else %}
|
|
<span class="text-muted">No medical history recorded</span>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if object.current_medications %}
|
|
<div class="mb-3">
|
|
<strong>Current Medications:</strong><br>
|
|
<div class="alert alert-info">
|
|
{{ object.current_medications }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recent Activity -->
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h4 class="card-title">
|
|
<i class="fas fa-clock me-2"></i>
|
|
Recent Activity
|
|
</h4>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if recent_activities %}
|
|
<div class="timeline">
|
|
{% for activity in recent_activities %}
|
|
<div class="timeline-item">
|
|
<div class="timeline-marker bg-{% if activity.type == 'appointment' %}primary{% elif activity.type == 'admission' %}success{% elif activity.type == 'discharge' %}info{% else %}secondary{% endif %}">
|
|
<i class="fas fa-{% if activity.type == 'appointment' %}calendar{% elif activity.type == 'admission' %}sign-in-alt{% elif activity.type == 'discharge' %}sign-out-alt{% else %}circle{% endif %}"></i>
|
|
</div>
|
|
<div class="timeline-content">
|
|
<div class="d-flex justify-content-between">
|
|
<h6 class="mb-1">{{ activity.title }}</h6>
|
|
<small class="text-muted">{{ activity.date|date:"M d, Y g:i A" }}</small>
|
|
</div>
|
|
<p class="mb-1">{{ activity.description }}</p>
|
|
<small class="text-muted">{{ activity.department|default:"General" }}</small>
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-4">
|
|
<i class="fas fa-clock fa-3x mb-3"></i>
|
|
<h5>No Recent Activity</h5>
|
|
<p>No recent activities recorded for this patient.</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-xl-4">
|
|
<!-- Quick Actions -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-bolt me-2"></i>
|
|
Quick Actions
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="d-grid gap-2">
|
|
<a href="{% url 'appointments:appointment_form' %}?patient={{ object.pk }}" class="btn btn-primary">
|
|
<i class="fas fa-calendar-plus me-2"></i>Schedule Appointment
|
|
</a>
|
|
<a href="{% url 'emr:encounter_form' %}?patient={{ object.pk }}" class="btn btn-success">
|
|
<i class="fas fa-stethoscope me-2"></i>New Encounter
|
|
</a>
|
|
<a href="{% url 'laboratory:lab_order_form' %}?patient={{ object.pk }}" class="btn btn-info">
|
|
<i class="fas fa-flask me-2"></i>Order Lab Test
|
|
</a>
|
|
<a href="{% url 'pharmacy:prescription_form' %}?patient={{ object.pk }}" class="btn btn-warning">
|
|
<i class="fas fa-pills me-2"></i>New Prescription
|
|
</a>
|
|
<button type="button" class="btn btn-outline-secondary" onclick="addNote()">
|
|
<i class="fas fa-sticky-note me-2"></i>Add Note
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Emergency Contacts -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-phone me-2"></i>
|
|
Emergency Contacts
|
|
</h5>
|
|
<div class="card-toolbar">
|
|
<a href="{% url 'patients:emergency_contact_form' %}?patient={{ object.pk }}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-plus"></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if emergency_contacts %}
|
|
{% for contact in emergency_contacts %}
|
|
<div class="mb-3 {% if not forloop.last %}border-bottom pb-3{% endif %}">
|
|
<div class="fw-bold">{{ contact.name }}</div>
|
|
<div class="small text-muted">{{ contact.relationship }}</div>
|
|
<div class="small">{{ contact.phone_number }}</div>
|
|
{% if contact.is_primary %}
|
|
<span class="badge bg-primary">Primary</span>
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
<div class="mt-3">
|
|
<a href="{% url 'patients:emergency_contact_list' %}?patient={{ object.pk }}" class="btn btn-sm btn-outline-secondary">
|
|
View All Contacts
|
|
</a>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-3">
|
|
<i class="fas fa-phone fa-2x mb-2"></i>
|
|
<p class="small">No emergency contacts</p>
|
|
<a href="{% url 'patients:emergency_contact_form' %}?patient={{ object.pk }}" class="btn btn-sm btn-primary">
|
|
Add Contact
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Insurance Information -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-shield-alt me-2"></i>
|
|
Insurance Information
|
|
</h5>
|
|
<div class="card-toolbar">
|
|
<a href="{% url 'patients:insurance_form' %}?patient={{ object.pk }}" class="btn btn-sm btn-outline-primary">
|
|
<i class="fas fa-plus"></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if insurance_info %}
|
|
{% for insurance in insurance_info %}
|
|
<div class="mb-3 {% if not forloop.last %}border-bottom pb-3{% endif %}">
|
|
<div class="fw-bold">{{ insurance.insurance_company }}</div>
|
|
<div class="small text-muted">{{ insurance.policy_type }}</div>
|
|
<div class="small">Policy: {{ insurance.policy_number }}</div>
|
|
{% if insurance.is_primary %}
|
|
<span class="badge bg-primary">Primary</span>
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
<div class="mt-3">
|
|
<a href="{% url 'patients:insurance_list' %}?patient={{ object.pk }}" class="btn btn-sm btn-outline-secondary">
|
|
View All Insurance
|
|
</a>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-3">
|
|
<i class="fas fa-shield-alt fa-2x mb-2"></i>
|
|
<p class="small">No insurance information</p>
|
|
<a href="{% url 'patients:insurance_form' %}?patient={{ object.pk }}" class="btn btn-sm btn-primary">
|
|
Add Insurance
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- System Information -->
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title">
|
|
<i class="fas fa-info-circle me-2"></i>
|
|
System Information
|
|
</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="mb-2">
|
|
<strong>Patient ID:</strong> {{ object.pk }}
|
|
</div>
|
|
<div class="mb-2">
|
|
<strong>Created:</strong> {{ object.created_at|date:"M d, Y g:i A" }}
|
|
</div>
|
|
<div class="mb-2">
|
|
<strong>Last Updated:</strong> {{ object.updated_at|date:"M d, Y g:i A" }}
|
|
</div>
|
|
<div class="mb-2">
|
|
<strong>Status:</strong>
|
|
<span class="badge bg-{% if object.is_active %}success{% else %}secondary{% endif %}">
|
|
{% if object.is_active %}Active{% else %}Inactive{% endif %}
|
|
</span>
|
|
</div>
|
|
{% if object.ssn %}
|
|
<div>
|
|
<strong>SSN:</strong> ***-**-{{ object.ssn|slice:"-4:" }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function addNote() {
|
|
// In a real implementation, this would open a note modal
|
|
const note = prompt('Enter patient note:');
|
|
if (note) {
|
|
console.log('Adding note:', note);
|
|
// Redirect to add note page or submit via AJAX
|
|
window.location.href = "{% url 'patients:patient_note_form' %}?patient={{ object.pk }}¬e=" + encodeURIComponent(note);
|
|
}
|
|
}
|
|
|
|
function printProfile() {
|
|
// In a real implementation, this would print the patient profile
|
|
window.print();
|
|
}
|
|
|
|
function exportProfile() {
|
|
// In a real implementation, this would export patient data
|
|
alert('Export profile functionality would be implemented here.');
|
|
}
|
|
|
|
function generateQR() {
|
|
// In a real implementation, this would generate a QR code for the patient
|
|
alert('QR code generation functionality would be implemented here.');
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.timeline {
|
|
position: relative;
|
|
padding-left: 30px;
|
|
}
|
|
|
|
.timeline-item {
|
|
position: relative;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.timeline-item:not(:last-child)::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: -19px;
|
|
top: 30px;
|
|
height: calc(100% + 10px);
|
|
width: 2px;
|
|
background-color: #dee2e6;
|
|
}
|
|
|
|
.timeline-marker {
|
|
position: absolute;
|
|
left: -30px;
|
|
top: 0;
|
|
width: 24px;
|
|
height: 24px;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: white;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.timeline-content {
|
|
background: #f8f9fa;
|
|
padding: 15px;
|
|
border-radius: 8px;
|
|
border-left: 3px solid #dee2e6;
|
|
}
|
|
</style>
|
|
{% endblock %}
|
|
|