Marwan Alwali be70e47e22 update
2025-08-30 09:45:26 +03:00

524 lines
24 KiB
HTML

{% extends "base.html" %}
{% load static %}
{% block title %}{{ object.name }} - Medications - Pharmacy{% 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 'pharmacy:dashboard' %}">Pharmacy</a></li>
<li class="breadcrumb-item"><a href="{% url 'pharmacy:medication_list' %}">Medications</a></li>
<li class="breadcrumb-item active">{{ object.name }}</li>
</ol>
<!-- END breadcrumb -->
<!-- BEGIN page-header -->
<h1 class="page-header">
{{ object.name }}
<small>{{ object.generic_name }}</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">Medication Information</h4>
<div class="panel-heading-btn">
<a href="{% url 'pharmacy:medication_update' object.pk %}" class="btn btn-xs btn-primary me-2">
<i class="fa fa-edit"></i> Edit
</a>
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label class="form-label fw-bold">Generic Name</label>
<div>{{ object.generic_name }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Brand Name</label>
<div>{{ object.brand_name|default:"Not specified" }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Manufacturer</label>
<div>{{ object.manufacturer|default:"Not specified" }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">NDC Number</label>
<div>{{ object.ndc_number|default:"Not specified" }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Category</label>
<div>
<span class="badge bg-info">{{ object.get_category_display }}</span>
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label class="form-label fw-bold">Dosage Form</label>
<div>{{ object.get_dosage_form_display }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Strength</label>
<div>{{ object.strength }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Route of Administration</label>
<div>{{ object.get_route_display }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Unit of Measure</label>
<div>{{ object.unit_of_measure }}</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Status</label>
<div>
{% if object.is_active %}
<span class="badge bg-success">Active</span>
{% else %}
<span class="badge bg-secondary">Inactive</span>
{% endif %}
</div>
</div>
</div>
</div>
<!-- Special Indicators -->
<div class="row mb-3">
<div class="col-12">
<div class="d-flex flex-wrap gap-2">
{% if object.is_controlled %}
<span class="badge bg-warning text-dark">
<i class="fa fa-shield me-1"></i>Controlled Substance - Schedule {{ object.controlled_schedule }}
</span>
{% endif %}
{% if object.requires_refrigeration %}
<span class="badge bg-info">
<i class="fa fa-snowflake me-1"></i>Requires Refrigeration
</span>
{% endif %}
{% if object.is_high_alert %}
<span class="badge bg-danger">
<i class="fa fa-exclamation-triangle me-1"></i>High Alert Medication
</span>
{% endif %}
{% if object.is_generic %}
<span class="badge bg-secondary">
<i class="fa fa-check me-1"></i>Generic Available
</span>
{% endif %}
</div>
</div>
</div>
<!-- Clinical Information -->
{% if object.indications or object.contraindications or object.side_effects %}
<div class="card border-primary mb-3">
<div class="card-header bg-primary text-white">
<h6 class="card-title mb-0">
<i class="fa fa-stethoscope me-2"></i>Clinical Information
</h6>
</div>
<div class="card-body">
{% if object.indications %}
<div class="mb-3">
<label class="form-label fw-bold">Indications</label>
<div>{{ object.indications|linebreaks }}</div>
</div>
{% endif %}
{% if object.contraindications %}
<div class="mb-3">
<label class="form-label fw-bold">Contraindications</label>
<div class="text-danger">{{ object.contraindications|linebreaks }}</div>
</div>
{% endif %}
{% if object.side_effects %}
<div class="mb-3">
<label class="form-label fw-bold">Side Effects</label>
<div class="text-warning">{{ object.side_effects|linebreaks }}</div>
</div>
{% endif %}
</div>
</div>
{% endif %}
<!-- Dosage Information -->
{% if object.usual_adult_dose or object.usual_pediatric_dose or object.maximum_dose %}
<div class="card border-success mb-3">
<div class="card-header bg-success text-white">
<h6 class="card-title mb-0">
<i class="fa fa-calculator me-2"></i>Dosage Information
</h6>
</div>
<div class="card-body">
<div class="row">
{% if object.usual_adult_dose %}
<div class="col-md-4">
<label class="form-label fw-bold">Usual Adult Dose</label>
<div>{{ object.usual_adult_dose }}</div>
</div>
{% endif %}
{% if object.usual_pediatric_dose %}
<div class="col-md-4">
<label class="form-label fw-bold">Usual Pediatric Dose</label>
<div>{{ object.usual_pediatric_dose }}</div>
</div>
{% endif %}
{% if object.maximum_dose %}
<div class="col-md-4">
<label class="form-label fw-bold">Maximum Dose</label>
<div class="text-danger">{{ object.maximum_dose }}</div>
</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
<!-- Storage and Handling -->
<div class="card border-warning mb-3">
<div class="card-header bg-warning text-dark">
<h6 class="card-title mb-0">
<i class="fa fa-warehouse me-2"></i>Storage and Handling
</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="mb-2">
<label class="form-label fw-bold">Storage Temperature</label>
<div>{{ object.storage_temperature|default:"Room temperature" }}</div>
</div>
<div class="mb-2">
<label class="form-label fw-bold">Storage Conditions</label>
<div>{{ object.storage_conditions|default:"Store in a cool, dry place" }}</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-2">
<label class="form-label fw-bold">Shelf Life</label>
<div>{{ object.shelf_life|default:"Not specified" }}</div>
</div>
<div class="mb-2">
<label class="form-label fw-bold">Special Handling</label>
<div>{{ object.special_handling|default:"Standard handling" }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- Notes -->
{% if object.notes %}
<div class="mb-3">
<label class="form-label fw-bold">Notes</label>
<div class="border rounded p-3 bg-light">{{ object.notes|linebreaks }}</div>
</div>
{% endif %}
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Drug Interactions</h4>
<div class="panel-heading-btn">
<button type="button" class="btn btn-xs btn-warning me-2" onclick="checkInteractions()">
<i class="fa fa-exclamation-triangle"></i> Check Interactions
</button>
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
</div>
</div>
<div class="panel-body">
<div id="interactions-content">
<div class="text-center text-muted">
<i class="fa fa-info-circle fa-2x mb-2"></i>
<div>Click "Check Interactions" to view known drug interactions</div>
</div>
</div>
</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">Quick Actions</h4>
</div>
<div class="panel-body">
<div class="d-grid gap-2">
<a href="{% url 'pharmacy:medication_update' object.pk %}" class="btn btn-primary">
<i class="fa fa-edit me-2"></i>Edit Medication
</a>
<a href="{% url 'pharmacy:prescription_create' %}?medication={{ object.pk }}" class="btn btn-success">
<i class="fa fa-plus me-2"></i>Create Prescription
</a>
<button type="button" class="btn btn-info" onclick="viewInventory()">
<i class="fa fa-boxes me-2"></i>View Inventory
</button>
<button type="button" class="btn btn-warning" onclick="checkInteractions()">
<i class="fa fa-exclamation-triangle me-2"></i>Check Interactions
</button>
{# <a href="{% url 'pharmacy:medication_print' object.pk %}" class="btn btn-secondary" target="_blank">#}
{# <i class="fa fa-print me-2"></i>Print Information#}
{# </a>#}
{% if perms.pharmacy.delete_medication %}
<a href="{% url 'pharmacy:medication_delete' object.pk %}" class="btn btn-danger">
<i class="fa fa-trash me-2"></i>Delete Medication
</a>
{% endif %}
</div>
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Inventory Status</h4>
</div>
<div class="panel-body">
<div id="inventory-status">
<div class="text-center">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="mt-2">Loading inventory status...</div>
</div>
</div>
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Prescription Statistics</h4>
</div>
<div class="panel-body">
<div id="prescription-stats">
<div class="text-center">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="mt-2">Loading statistics...</div>
</div>
</div>
</div>
</div>
<!-- END panel -->
<!-- BEGIN panel -->
<div class="panel panel-inverse">
<div class="panel-heading">
<h4 class="panel-title">Medication Details</h4>
</div>
<div class="panel-body">
<div class="list-group list-group-flush">
<div class="list-group-item d-flex justify-content-between align-items-center">
Created
<span class="text-muted">{{ object.created_at|date:"M d, Y" }}</span>
</div>
<div class="list-group-item d-flex justify-content-between align-items-center">
Last Updated
<span class="text-muted">{{ object.updated_at|date:"M d, Y" }}</span>
</div>
<div class="list-group-item d-flex justify-content-between align-items-center">
Created By
<span class="text-muted">{{ object.created_by.get_full_name|default:"System" }}</span>
</div>
{% if object.barcode %}
<div class="list-group-item">
<div class="fw-bold">Barcode</div>
<div class="font-monospace">{{ object.barcode }}</div>
</div>
{% endif %}
</div>
</div>
</div>
<!-- END panel -->
</div>
</div>
{% endblock %}
{% block js %}
<script>
$(document).ready(function() {
// Load inventory status
loadInventoryStatus();
// Load prescription statistics
loadPrescriptionStats();
// Auto-refresh every 30 seconds
setInterval(function() {
loadInventoryStatus();
loadPrescriptionStats();
}, 30000);
});
{#function loadInventoryStatus() {#}
{# $.ajax({#}
{# url: '{% url "pharmacy:medication_inventory_status" object.pk %}',#}
{# method: 'GET',#}
{# success: function(response) {#}
{# var html = '';#}
{# #}
{# if (response.inventory_items && response.inventory_items.length > 0) {#}
{# response.inventory_items.forEach(function(item) {#}
{# var statusClass = 'success';#}
{# var statusIcon = 'check';#}
{# #}
{# if (item.quantity <= item.reorder_level) {#}
{# statusClass = 'warning';#}
{# statusIcon = 'exclamation-triangle';#}
{# }#}
{# if (item.quantity <= 0) {#}
{# statusClass = 'danger';#}
{# statusIcon = 'times';#}
{# }#}
{# #}
{# html += '<div class="d-flex justify-content-between align-items-center mb-2">';#}
{# html += '<div>';#}
{# html += '<div class="fw-bold">' + item.location_name + '</div>';#}
{# html += '<div class="small text-muted">Lot: ' + (item.lot_number || 'N/A') + '</div>';#}
{# html += '</div>';#}
{# html += '<div class="text-end">';#}
{# html += '<div class="badge bg-' + statusClass + '">';#}
{# html += '<i class="fa fa-' + statusIcon + ' me-1"></i>' + item.quantity + ' ' + item.unit;#}
{# html += '</div>';#}
{# if (item.expiry_date) {#}
{# html += '<div class="small text-muted">Exp: ' + item.expiry_date + '</div>';#}
{# }#}
{# html += '</div>';#}
{# html += '</div>';#}
{# });#}
{# #}
{# // Total quantity#}
{# html += '<hr>';#}
{# html += '<div class="d-flex justify-content-between align-items-center">';#}
{# html += '<div class="fw-bold">Total Quantity</div>';#}
{# html += '<div class="fw-bold">' + response.total_quantity + ' units</div>';#}
{# html += '</div>';#}
{# } else {#}
{# html = '<div class="text-center text-muted">';#}
{# html += '<i class="fa fa-box-open fa-2x mb-2"></i>';#}
{# html += '<div>No inventory records found</div>';#}
{# html += '</div>';#}
{# }#}
{# #}
{# $('#inventory-status').html(html);#}
{# },#}
{# error: function() {#}
{# $('#inventory-status').html('<div class="text-danger text-center">Failed to load inventory status</div>');#}
{# }#}
{# });#}
{# }#}
{#function loadPrescriptionStats() {#}
{# $.ajax({#}
{# url: '{% url "pharmacy:medication_prescription_stats" object.pk %}',#}
{# method: 'GET',#}
{# success: function(response) {#}
{# var html = '';#}
{# #}
{# html += '<div class="row text-center">';#}
{# html += '<div class="col-6">';#}
{# html += '<div class="h4 mb-0">' + response.total_prescriptions + '</div>';#}
{# html += '<div class="small text-muted">Total Prescriptions</div>';#}
{# html += '</div>';#}
{# html += '<div class="col-6">';#}
{# html += '<div class="h4 mb-0">' + response.active_prescriptions + '</div>';#}
{# html += '<div class="small text-muted">Active</div>';#}
{# html += '</div>';#}
{# html += '</div>';#}
{# #}
{# html += '<hr>';#}
{# #}
{# html += '<div class="row text-center">';#}
{# html += '<div class="col-6">';#}
{# html += '<div class="h5 mb-0">' + response.this_month + '</div>';#}
{# html += '<div class="small text-muted">This Month</div>';#}
{# html += '</div>';#}
{# html += '<div class="col-6">';#}
{# html += '<div class="h5 mb-0">' + response.last_30_days + '</div>';#}
{# html += '<div class="small text-muted">Last 30 Days</div>';#}
{# html += '</div>';#}
{# html += '</div>';#}
{# #}
{# if (response.recent_prescriptions && response.recent_prescriptions.length > 0) {#}
{# html += '<hr>';#}
{# html += '<div class="fw-bold mb-2">Recent Prescriptions</div>';#}
{# response.recent_prescriptions.forEach(function(prescription) {#}
{# html += '<div class="d-flex justify-content-between align-items-center mb-1">';#}
{# html += '<div class="small">' + prescription.patient_name + '</div>';#}
{# html += '<div class="small text-muted">' + prescription.date + '</div>';#}
{# html += '</div>';#}
{# });#}
{# }#}
{# #}
{# $('#prescription-stats').html(html);#}
{# },#}
{# error: function() {#}
{# $('#prescription-stats').html('<div class="text-danger text-center">Failed to load statistics</div>');#}
{# }#}
{# });#}
{# }#}
{#function checkInteractions() {#}
{# $.ajax({#}
{# url: '{% url "pharmacy:medication_interactions" object.pk %}',#}
{# method: 'GET',#}
{# success: function(response) {#}
{# var html = '';#}
{# #}
{# if (response.interactions && response.interactions.length > 0) {#}
{# html += '<div class="alert alert-warning">';#}
{# html += '<h6 class="alert-heading">Known Drug Interactions</h6>';#}
{# html += '<ul class="mb-0">';#}
{# response.interactions.forEach(function(interaction) {#}
{# html += '<li><strong>' + interaction.drug_name + '</strong>: ' + interaction.description + '</li>';#}
{# });#}
{# html += '</ul>';#}
{# html += '</div>';#}
{# } else {#}
{# html += '<div class="alert alert-success">';#}
{# html += '<i class="fa fa-check me-2"></i>No known drug interactions found in the database.';#}
{# html += '</div>';#}
{# }#}
{# #}
{# if (response.contraindications && response.contraindications.length > 0) {#}
{# html += '<div class="alert alert-danger">';#}
{# html += '<h6 class="alert-heading">Contraindications</h6>';#}
{# html += '<ul class="mb-0">';#}
{# response.contraindications.forEach(function(contraindication) {#}
{# html += '<li>' + contraindication + '</li>';#}
{# });#}
{# html += '</ul>';#}
{# html += '</div>';#}
{# }#}
{# #}
{# $('#interactions-content').html(html);#}
{# },#}
{# error: function() {#}
{# $('#interactions-content').html('<div class="text-danger text-center">Failed to load interaction data</div>');#}
{# }#}
{# });#}
{# }#}
function viewInventory() {
window.location.href = '{% url "pharmacy:inventory_list" %}?medication=' + {{ object.pk }};
}
</script>
{% endblock %}