hospital-management/templates/quality/incidents/incident_confirm_delete.html
2025-08-12 13:33:25 +03:00

592 lines
30 KiB
HTML

{% extends "base.html" %}
{% load static %}
{% block title %}Delete Incident - Quality Management{% endblock %}
{% block content %}
<!-- BEGIN breadcrumb -->
<ol class="breadcrumb float-xl-end">
<li class="breadcrumb-item"><a href="{% url 'core:dashboard' %}">Dashboard</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:dashboard' %}">Quality</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:incident_list' %}">Incidents</a></li>
<li class="breadcrumb-item"><a href="{% url 'quality:incident_detail' object.pk %}">{{ object.incident_number }}</a></li>
<li class="breadcrumb-item active">Delete</li>
</ol>
<!-- END breadcrumb -->
<!-- BEGIN page-header -->
<h1 class="page-header">
Delete Incident
<small>{{ object.incident_number }} - {{ object.title }}</small>
</h1>
<!-- END page-header -->
<div class="row">
<div class="col-xl-8">
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fa fa-exclamation-triangle text-danger me-2"></i>
Confirm Incident Deletion
</h4>
</div>
<div class="panel-body">
<!-- Critical Warning -->
<div class="alert alert-danger">
<h5 class="alert-heading">
<i class="fa fa-exclamation-triangle me-2"></i>
Critical Action - Permanent Deletion
</h5>
<p class="mb-0">
You are about to permanently delete this incident record. This action cannot be undone and will result in the loss of all associated data, including investigation findings, corrective actions, and attachments.
</p>
</div>
<!-- Status-Specific Warnings -->
{% if object.status == 'investigating' %}
<div class="alert alert-warning">
<h5 class="alert-heading">
<i class="fa fa-search me-2"></i>
Investigation in Progress
</h5>
<p class="mb-0">
This incident is currently under investigation. Deleting it will terminate the ongoing investigation and may impact compliance requirements.
</p>
</div>
{% elif object.status == 'resolved' %}
<div class="alert alert-info">
<h5 class="alert-heading">
<i class="fa fa-check-circle me-2"></i>
Resolved Incident
</h5>
<p class="mb-0">
This incident has been resolved. Deleting resolved incidents may impact quality metrics and regulatory reporting requirements.
</p>
</div>
{% elif object.status == 'closed' %}
<div class="alert alert-secondary">
<h5 class="alert-heading">
<i class="fa fa-archive me-2"></i>
Closed Incident
</h5>
<p class="mb-0">
This incident has been closed and may be required for regulatory compliance and quality reporting. Consider archiving instead of deletion.
</p>
</div>
{% endif %}
<!-- Patient Safety Warning -->
{% if object.patient_involved %}
<div class="alert alert-danger">
<h5 class="alert-heading">
<i class="fa fa-user-injured me-2"></i>
Patient Safety Incident
</h5>
<p class="mb-0">
This incident involves a patient and may be subject to regulatory reporting requirements. Deletion may violate patient safety and quality compliance standards.
</p>
</div>
{% endif %}
<!-- External Reporting Warning -->
{% if object.external_reporting_required %}
<div class="alert alert-warning">
<h5 class="alert-heading">
<i class="fa fa-file-export me-2"></i>
External Reporting Required
</h5>
<p class="mb-0">
This incident requires external reporting to regulatory agencies. Deletion may result in compliance violations and regulatory penalties.
</p>
</div>
{% endif %}
<!-- Incident Summary -->
<div class="card border-primary mb-4">
<div class="card-header bg-primary text-white">
<h6 class="card-title mb-0">
<i class="fa fa-info-circle me-2"></i>Incident Summary
</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="mb-2">
<strong>Incident Number:</strong> {{ object.incident_number }}
</div>
<div class="mb-2">
<strong>Title:</strong> {{ object.title }}
</div>
<div class="mb-2">
<strong>Category:</strong> {{ object.get_category_display }}
</div>
<div class="mb-2">
<strong>Type:</strong> {{ object.get_incident_type_display }}
</div>
<div class="mb-2">
<strong>Severity:</strong>
{% if object.severity == 'critical' %}
<span class="badge bg-danger">Critical</span>
{% elif object.severity == 'high' %}
<span class="badge bg-warning text-dark">High</span>
{% elif object.severity == 'medium' %}
<span class="badge bg-info">Medium</span>
{% elif object.severity == 'low' %}
<span class="badge bg-success">Low</span>
{% endif %}
</div>
</div>
<div class="col-md-6">
<div class="mb-2">
<strong>Status:</strong>
{% if object.status == 'open' %}
<span class="badge bg-warning text-dark">Open</span>
{% elif object.status == 'investigating' %}
<span class="badge bg-info">Investigating</span>
{% elif object.status == 'resolved' %}
<span class="badge bg-success">Resolved</span>
{% elif object.status == 'closed' %}
<span class="badge bg-secondary">Closed</span>
{% endif %}
</div>
<div class="mb-2">
<strong>Reported By:</strong> {{ object.reported_by.get_full_name }}
</div>
<div class="mb-2">
<strong>Department:</strong> {{ object.department.name|default:"Not specified" }}
</div>
<div class="mb-2">
<strong>Occurred At:</strong> {{ object.occurred_at|date:"M d, Y H:i" }}
</div>
<div class="mb-2">
<strong>Created:</strong> {{ object.created_at|date:"M d, Y H:i" }}
</div>
</div>
</div>
</div>
</div>
<!-- Impact Assessment -->
<div class="card border-warning mb-4">
<div class="card-header bg-warning text-dark">
<h6 class="card-title mb-0">
<i class="fa fa-exclamation-triangle me-2"></i>Deletion Impact Assessment
</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h6 class="text-danger">Data Loss:</h6>
<ul class="list-unstyled">
<li><i class="fa fa-times text-danger me-1"></i> Incident details and description</li>
<li><i class="fa fa-times text-danger me-1"></i> Investigation findings</li>
<li><i class="fa fa-times text-danger me-1"></i> Root cause analysis</li>
<li><i class="fa fa-times text-danger me-1"></i> Resolution documentation</li>
{% if object.attachments.exists %}
<li><i class="fa fa-times text-danger me-1"></i> {{ object.attachments.count }} attachment(s)</li>
{% endif %}
</ul>
</div>
<div class="col-md-6">
<h6 class="text-warning">Related Records:</h6>
<ul class="list-unstyled">
{% if object.corrective_actions.exists %}
<li><i class="fa fa-link text-warning me-1"></i> {{ object.corrective_actions.count }} corrective action(s)</li>
{% endif %}
{% if object.patient %}
<li><i class="fa fa-link text-warning me-1"></i> Patient record linkage</li>
{% endif %}
<li><i class="fa fa-link text-warning me-1"></i> Quality metrics impact</li>
<li><i class="fa fa-link text-warning me-1"></i> Audit trail records</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Corrective Actions Warning -->
{% if object.corrective_actions.exists %}
<div class="card border-danger mb-4">
<div class="card-header bg-danger text-white">
<h6 class="card-title mb-0">
<i class="fa fa-tasks me-2"></i>Associated Corrective Actions
</h6>
</div>
<div class="card-body">
<p class="text-danger mb-3">
<strong>Warning:</strong> This incident has {{ object.corrective_actions.count }} associated corrective action(s).
Deleting this incident will also delete all related corrective actions.
</p>
<div class="table-responsive">
<table class="table table-sm">
<thead>
<tr>
<th>Action</th>
<th>Assigned To</th>
<th>Status</th>
<th>Due Date</th>
</tr>
</thead>
<tbody>
{% for action in object.corrective_actions.all %}
<tr>
<td>
<div class="fw-bold">{{ action.title }}</div>
<div class="small text-muted">{{ action.description|truncatechars:50 }}</div>
</td>
<td>{{ action.assigned_to.get_full_name|default:"Not assigned" }}</td>
<td>
{% if action.status == 'pending' %}
<span class="badge bg-warning text-dark">Pending</span>
{% elif action.status == 'in_progress' %}
<span class="badge bg-info">In Progress</span>
{% elif action.status == 'completed' %}
<span class="badge bg-success">Completed</span>
{% elif action.status == 'cancelled' %}
<span class="badge bg-secondary">Cancelled</span>
{% endif %}
</td>
<td>
{% if action.due_date %}
{{ action.due_date|date:"M d, Y" }}
{% if action.due_date < today and action.status != 'completed' %}
<span class="badge bg-danger ms-1">Overdue</span>
{% endif %}
{% else %}
<span class="text-muted">Not set</span>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
<!-- Alternative Actions -->
<div class="card border-info mb-4">
<div class="card-header bg-info text-white">
<h6 class="card-title mb-0">
<i class="fa fa-lightbulb me-2"></i>Alternative Actions
</h6>
</div>
<div class="card-body">
<p class="mb-3">Consider these alternatives to permanent deletion:</p>
<div class="row">
<div class="col-md-6">
<div class="d-grid gap-2">
<button type="button" class="btn btn-outline-secondary" onclick="archiveIncident()">
<i class="fa fa-archive me-2"></i>Archive Incident
</button>
<button type="button" class="btn btn-outline-warning" onclick="closeIncident()">
<i class="fa fa-times-circle me-2"></i>Close Incident
</button>
</div>
</div>
<div class="col-md-6">
<div class="d-grid gap-2">
<button type="button" class="btn btn-outline-info" onclick="exportIncident()">
<i class="fa fa-download me-2"></i>Export Data
</button>
<button type="button" class="btn btn-outline-primary" onclick="transferIncident()">
<i class="fa fa-exchange-alt me-2"></i>Transfer Ownership
</button>
</div>
</div>
</div>
<div class="mt-3">
<small class="text-muted">
<strong>Recommendation:</strong> Archive the incident instead of deletion to maintain compliance and audit trails while removing it from active incident lists.
</small>
</div>
</div>
</div>
<!-- Confirmation Form -->
<form method="post" id="deleteForm">
{% csrf_token %}
<div class="card border-danger mb-4">
<div class="card-header bg-danger text-white">
<h6 class="card-title mb-0">
<i class="fa fa-shield-alt me-2"></i>Deletion Confirmation
</h6>
</div>
<div class="card-body">
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="confirmUnderstand" required>
<label class="form-check-label" for="confirmUnderstand">
I understand that this action will permanently delete the incident and all associated data
</label>
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="confirmCompliance" required>
<label class="form-check-label" for="confirmCompliance">
I confirm that this deletion does not violate any regulatory or compliance requirements
</label>
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="confirmAuthorization" required>
<label class="form-check-label" for="confirmAuthorization">
I have the necessary authorization to delete this incident record
</label>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="confirmationText" placeholder="Type incident number to confirm" required>
<label for="confirmationText">Type "{{ object.incident_number }}" to confirm deletion</label>
<div class="form-text">
This additional confirmation helps prevent accidental deletions
</div>
</div>
<div class="form-floating mb-3">
<textarea class="form-control" id="deletionReason" placeholder="Reason for deletion" style="height: 100px;" required></textarea>
<label for="deletionReason">Reason for Deletion *</label>
<div class="form-text">
Provide a detailed reason for this deletion (required for audit purposes)
</div>
</div>
</div>
</div>
<!-- Action Buttons -->
<div class="d-flex justify-content-between">
<div>
<a href="{% url 'quality:incident_detail' object.pk %}" class="btn btn-secondary">
<i class="fa fa-arrow-left me-2"></i>Cancel
</a>
</div>
<div>
<button type="button" class="btn btn-info me-2" onclick="archiveIncident()">
<i class="fa fa-archive me-2"></i>Archive Instead
</button>
<button type="submit" class="btn btn-danger" id="deleteButton" disabled>
<i class="fa fa-trash me-2"></i>Permanently Delete Incident
</button>
</div>
</div>
</form>
</div>
</div>
<!-- END panel -->
</div>
<div class="col-xl-4">
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Deletion Guidelines</h4>
</div>
<div class="panel-body">
<div class="small">
<h6 class="text-danger">When NOT to Delete:</h6>
<ul class="list-unstyled">
<li><i class="fa fa-times text-danger me-1"></i> Patient safety incidents</li>
<li><i class="fa fa-times text-danger me-1"></i> Regulatory reportable events</li>
<li><i class="fa fa-times text-danger me-1"></i> Incidents under investigation</li>
<li><i class="fa fa-times text-danger me-1"></i> Resolved incidents (archive instead)</li>
<li><i class="fa fa-times text-danger me-1"></i> Incidents with legal implications</li>
</ul>
<h6 class="text-warning mt-3">When Deletion May Be Appropriate:</h6>
<ul class="list-unstyled">
<li><i class="fa fa-check text-success me-1"></i> Duplicate entries</li>
<li><i class="fa fa-check text-success me-1"></i> Test records</li>
<li><i class="fa fa-check text-success me-1"></i> Data entry errors</li>
<li><i class="fa fa-check text-success me-1"></i> Non-incident reports</li>
</ul>
<h6 class="text-info mt-3">Best Practices:</h6>
<ul class="list-unstyled">
<li><i class="fa fa-lightbulb text-warning me-1"></i> Archive instead of delete</li>
<li><i class="fa fa-lightbulb text-warning me-1"></i> Export data before deletion</li>
<li><i class="fa fa-lightbulb text-warning me-1"></i> Document deletion reason</li>
<li><i class="fa fa-lightbulb text-warning me-1"></i> Get supervisor approval</li>
</ul>
</div>
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Contact Support</h4>
</div>
<div class="panel-body">
<div class="small">
<div class="mb-2">
<strong>Quality Manager:</strong><br>
<i class="fa fa-phone me-1"></i> (555) 123-4567<br>
<i class="fa fa-envelope me-1"></i> quality@hospital.com
</div>
<div class="mb-2">
<strong>IT Support:</strong><br>
<i class="fa fa-phone me-1"></i> (555) 123-4570<br>
<i class="fa fa-envelope me-1"></i> it@hospital.com
</div>
<div class="mb-2">
<strong>Compliance Officer:</strong><br>
<i class="fa fa-phone me-1"></i> (555) 123-4571<br>
<i class="fa fa-envelope me-1"></i> compliance@hospital.com
</div>
</div>
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Audit Information</h4>
</div>
<div class="panel-body">
<div class="small">
<div class="mb-2">
<strong>User:</strong> {{ user.get_full_name }}
</div>
<div class="mb-2">
<strong>IP Address:</strong> {{ request.META.REMOTE_ADDR }}
</div>
<div class="mb-2">
<strong>Timestamp:</strong> {{ now|date:"M d, Y H:i:s" }}
</div>
<div class="mb-2">
<strong>Session ID:</strong> {{ request.session.session_key|truncatechars:12 }}
</div>
</div>
<div class="mt-3">
<small class="text-muted">
This deletion attempt will be logged for audit purposes regardless of completion.
</small>
</div>
</div>
</div>
<!-- END panel -->
</div>
</div>
{% endblock %}
{% block js %}
<script>
$(document).ready(function() {
// Form validation
function validateForm() {
const confirmUnderstand = $('#confirmUnderstand').is(':checked');
const confirmCompliance = $('#confirmCompliance').is(':checked');
const confirmAuthorization = $('#confirmAuthorization').is(':checked');
const confirmationText = $('#confirmationText').val();
const deletionReason = $('#deletionReason').val().trim();
const isValid = confirmUnderstand &&
confirmCompliance &&
confirmAuthorization &&
confirmationText === '{{ object.incident_number }}' &&
deletionReason.length > 10;
$('#deleteButton').prop('disabled', !isValid);
if (confirmationText && confirmationText !== '{{ object.incident_number }}') {
$('#confirmationText').addClass('is-invalid');
} else {
$('#confirmationText').removeClass('is-invalid');
}
}
// Bind validation to form changes
$('#confirmUnderstand, #confirmCompliance, #confirmAuthorization').change(validateForm);
$('#confirmationText, #deletionReason').on('input', validateForm);
// Form submission
$('#deleteForm').on('submit', function(e) {
e.preventDefault();
if (!validateForm()) {
toastr.error('Please complete all required confirmations');
return false;
}
// Final confirmation dialog
if (confirm('This is your final confirmation. Are you absolutely sure you want to permanently delete this incident? This action cannot be undone.')) {
// Show loading state
$('#deleteButton').prop('disabled', true).html(
'<i class="fa fa-spinner fa-spin me-2"></i>Deleting...'
);
// Add deletion reason to form data
$('<input>').attr({
type: 'hidden',
name: 'deletion_reason',
value: $('#deletionReason').val()
}).appendTo(this);
// Submit form
this.submit();
}
});
// Initial validation
validateForm();
});
function archiveIncident() {
if (confirm('Archive this incident instead of deleting it? This will remove it from active lists while preserving the data.')) {
$.ajax({
url: '{% url "quality:archive_incident" object.pk %}',
method: 'POST',
data: {
'csrfmiddlewaretoken': '{{ csrf_token }}'
},
success: function(response) {
toastr.success('Incident archived successfully');
window.location.href = '{% url "quality:incident_list" %}';
},
error: function() {
toastr.error('Failed to archive incident');
}
});
}
}
function closeIncident() {
if (confirm('Close this incident? This will mark it as closed without deleting the data.')) {
$.ajax({
url: '{% url "quality:close_incident" object.pk %}',
method: 'POST',
data: {
'csrfmiddlewaretoken': '{{ csrf_token }}'
},
success: function(response) {
toastr.success('Incident closed successfully');
window.location.href = '{% url "quality:incident_detail" object.pk %}';
},
error: function() {
toastr.error('Failed to close incident');
}
});
}
}
function exportIncident() {
var exportUrl = '{% url "quality:export_incident" object.pk %}';
window.open(exportUrl, '_blank');
toastr.info('Incident data export started');
}
function transferIncident() {
// Implementation for transferring incident ownership
toastr.info('Incident transfer feature coming soon');
}
</script>
{% endblock %}