2025-08-12 13:33:25 +03:00

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 }}&note=" + 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 %}