update
This commit is contained in:
parent
0a037d3d9d
commit
73c9e2e921
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -163,7 +163,7 @@ class LabTestDetailView(LoginRequiredMixin, DetailView):
|
||||
|
||||
# Get recent orders for this test
|
||||
context['recent_orders'] = LabOrder.objects.filter(
|
||||
test=lab_test,
|
||||
tests=lab_test,
|
||||
tenant=self.request.user.tenant
|
||||
).select_related('patient').order_by('-order_datetime')[:10]
|
||||
|
||||
@ -171,7 +171,7 @@ class LabTestDetailView(LoginRequiredMixin, DetailView):
|
||||
context['qc_records'] = QualityControl.objects.filter(
|
||||
test=lab_test,
|
||||
tenant=self.request.user.tenant
|
||||
).order_by('-test_date')[:5]
|
||||
).order_by('-created_at')[:5]
|
||||
|
||||
return context
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -52,9 +52,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="row mb-4">
|
||||
<!-- Recent Activity -->
|
||||
<div class="col-lg-8 mb-4">
|
||||
<div class="col-lg-8">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-1">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-history me-2"></i> {{ _("Recent Activity")}}</h4>
|
||||
@ -104,16 +104,25 @@
|
||||
<!-- Sidebar -->
|
||||
<div class="col-lg-4">
|
||||
<!-- System Health -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<div class="panel panel-inverse mb-4" data-sortable-id="index-2">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-heartbeat me-2"></i>System Health
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div id="system-health"
|
||||
hx-get="{% url 'core:system_health' %}"
|
||||
hx-trigger="load, every 60s">
|
||||
hx-trigger="load, every 60s"
|
||||
hx-swap="innerHTML">
|
||||
<div class="text-center">
|
||||
<div class="spinner-border spinner-border-sm text-primary" role="status">
|
||||
<span class="visually-hidden">Loading system health...</span>
|
||||
@ -125,13 +134,21 @@
|
||||
|
||||
<!-- Tenant Information -->
|
||||
{% if current_tenant %}
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<div class="panel panel-inverse mb-4" data-sortable-id="index-3">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-building me-2"></i>Organization Info
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div id="tenant-info"
|
||||
hx-get="{% url 'core:tenant_info' %}"
|
||||
hx-trigger="load">
|
||||
@ -146,13 +163,21 @@
|
||||
{% endif %}
|
||||
|
||||
<!-- Quick Stats -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<div class="panel panel-inverse mb-4" data-sortable-id="index-4">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-chart-pie me-2"></i>Quick Stats
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div class="row text-center">
|
||||
<div class="col-6 mb-3">
|
||||
<div class="border-end">
|
||||
@ -181,15 +206,23 @@
|
||||
</div>
|
||||
|
||||
<!-- Quick Actions Grid -->
|
||||
<div class="row mt-4">
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<div class="panel panel-inverse mb-4" data-sortable-id="index-5">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-bolt me-2"></i>Quick Actions
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div class="row">
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3">
|
||||
<a href="{% url 'patients:patient_registration' %}" class="btn btn-outline-primary w-100 h-100 d-flex flex-column align-items-center justify-content-center py-4">
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<div class="system-health">
|
||||
<div id="system-health">
|
||||
<div class="row">
|
||||
<div class="col-12 mb-3">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
|
||||
@ -673,7 +673,7 @@
|
||||
<div class="section-card">
|
||||
<div class="section-header">
|
||||
<div>
|
||||
<i class="fas fa-list me-2"></i>Order Items ({{ order.items.count }})
|
||||
<i class="fas fa-list me-2"></i>Order Items ({{ order.line_items.count }})
|
||||
</div>
|
||||
<div class="btn-group btn-group-sm">
|
||||
<button type="button" class="btn btn-outline-secondary" onclick="expandAllItems()">
|
||||
@ -698,7 +698,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in order.items.all %}
|
||||
{% for item in order.line_items.all %}
|
||||
<tr class="item-row">
|
||||
<td>
|
||||
{% if item.product.image %}
|
||||
@ -711,34 +711,44 @@
|
||||
</td>
|
||||
<td>
|
||||
<div class="item-details">
|
||||
<div class="item-name">{{ item.product.name }}</div>
|
||||
<div class="item-description">{{ item.product.description|truncatechars:100 }}</div>
|
||||
<div class="item-name">{{ item.inventory_item.item_name }}</div>
|
||||
{# <div class="item-description">{{ item.inventory_item.description|truncatechars:50 }}</div>#}
|
||||
<div class="item-specs">
|
||||
SKU: {{ item.product.sku|default:"N/A" }} |
|
||||
Category: {{ item.product.category|default:"N/A" }}
|
||||
Category: {{ item.inventory_item.category|default:"N/A" }} |
|
||||
Subcategory: {{ item.inventory_item.subcategory|default:"N/A" }}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="quantity-info">
|
||||
<div class="quantity-number">{{ item.quantity }}</div>
|
||||
<div class="quantity-unit">{{ item.unit|default:"pcs" }}</div>
|
||||
<div class="">
|
||||
<div class="">{{ item.quantity_ordered }}</div>
|
||||
<div class="text-muted fs-9px">{{ item.inventory_item.unit_of_measure|default:"pcs" }}</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="price-info">
|
||||
<div class="unit-price"><span class="symbol">ê</span>{{ item.unit_price|floatformat:'2g' }}</div>
|
||||
<div class="">
|
||||
<div class=""><span class="symbol">ê</span>{{ item.unit_price|floatformat:'2g' }}</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="price-info">
|
||||
<div class="total-price"><span class="symbol">ê</span>{{ item.total_price|floatformat:'2g' }}</div>
|
||||
<div class="">
|
||||
<div class="text-success fw-bold"><span class="symbol">ê</span>{{ item.total_price|floatformat:'2g' }}</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-{{ item.status_color }}">
|
||||
{{ item.get_status_display|default:"Pending" }}
|
||||
</span>
|
||||
{% if item.status == 'PENDING' %}
|
||||
<span class="badge bg-warning text-dark">{{ item.get_status_display|upper }}</span>
|
||||
{% elif item.status == 'ORDERED' %}
|
||||
<span class="badge bg-info">{{ item.get_status_display|upper }}</span>
|
||||
{% elif item.status == 'PARTIAL_RECEIVED' %}
|
||||
<span class="badge bg-success">{{ item.get_status_display|upper }}</span>
|
||||
{% elif item.status == 'RECEIVED' %}
|
||||
<span class="badge bg-green">{{ item.get_status_display|upper }}</span>
|
||||
{% elif item.status == 'CANCELLED' %}
|
||||
<span class="badge bg-danger">{{ item.get_status_display|upper }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">{{ item.get_status_display|upper }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
{% if reference_range.pk %}Edit Reference Range{% else %}Add Reference Range{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
{% block css %}
|
||||
<style>
|
||||
.form-section {
|
||||
background: #f8f9fa;
|
||||
@ -533,7 +533,7 @@
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
{% block js %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Initialize form
|
||||
|
||||
@ -55,13 +55,20 @@
|
||||
<div class="row">
|
||||
<!-- Test Information -->
|
||||
<div class="col-lg-8 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>Test Information
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-1">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-info-circle me-2"></i> {{ _("Test Information")}}
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<table class="table table-borderless">
|
||||
@ -149,13 +156,20 @@
|
||||
|
||||
<!-- Quick Stats -->
|
||||
<div class="col-lg-4 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-chart-bar me-2"></i>Test Statistics
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-2">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-chart-bar me-2"></i> {{ _("Test Statistics")}}
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="row g-3">
|
||||
<div class="col-6">
|
||||
<div class="text-center p-3 bg-light rounded">
|
||||
@ -191,18 +205,23 @@
|
||||
{% if reference_ranges %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-ruler me-2"></i>Reference Ranges
|
||||
</h5>
|
||||
<a href="{% url 'laboratory:reference_range_create' %}?test={{ lab_test.pk }}" class="btn btn-outline-primary btn-sm">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-3">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-ruler me-2"></i>Reference Ranges
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
<a href="{% url 'laboratory:reference_range_create' %}?test={{ lab_test.pk }}" class="btn btn-outline-primary btn-xs">
|
||||
<i class="fas fa-plus me-1"></i>Add Range
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
<thead class="table-light">
|
||||
@ -224,16 +243,16 @@
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ range.age_min }} - {{ range.age_max|default:"∞" }} years</td>
|
||||
<td class="fw-semibold">{{ range.normal_min }} - {{ range.normal_max }}</td>
|
||||
<td class="text-danger">{{ range.critical_low|default:"N/A" }}</td>
|
||||
<td class="text-danger">{{ range.critical_high|default:"N/A" }}</td>
|
||||
<td class="fw-semibold">{{ range.range_low }} - {{ range.range_high }}</td>
|
||||
<td class="text-danger">{{ range.critical_low }}</td>
|
||||
<td class="text-danger">{{ range.critical_high }}</td>
|
||||
<td>
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="{% url 'laboratory:reference_range_detail' range.pk %}" class="btn btn-outline-primary">
|
||||
<a href="{% url 'laboratory:reference_range_detail' range.pk %}" class="btn btn-outline-primary btn-xs">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
{% if perms.laboratory.change_referencerange %}
|
||||
<a href="{% url 'laboratory:reference_range_update' range.pk %}" class="btn btn-outline-secondary">
|
||||
<a href="{% url 'laboratory:reference_range_update' range.pk %}" class="btn btn-outline-secondary btn-xs">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
@ -254,18 +273,23 @@
|
||||
<div class="row">
|
||||
<!-- Recent Orders -->
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-clipboard-list me-2"></i>Recent Orders
|
||||
</h5>
|
||||
<a href="{% url 'laboratory:lab_order_list' %}?test={{ lab_test.pk }}" class="btn btn-outline-primary btn-sm">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-4">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-clipboard-list me-2"></i>Recent Orders
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
<a href="{% url 'laboratory:lab_order_list' %}?test={{ lab_test.pk }}" class="btn btn-outline-primary btn-xs">
|
||||
<i class="fas fa-list me-1"></i>View All
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if recent_orders %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
@ -298,7 +322,7 @@
|
||||
</td>
|
||||
<td>{{ order.order_datetime|date:"M d, H:i" }}</td>
|
||||
<td>
|
||||
<a href="{% url 'laboratory:lab_order_detail' order.pk %}" class="btn btn-outline-primary btn-sm">
|
||||
<a href="{% url 'laboratory:lab_order_detail' order.pk %}" class="btn btn-outline-primary btn-xs">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</td>
|
||||
@ -320,18 +344,23 @@
|
||||
|
||||
<!-- Quality Control Records -->
|
||||
<div class="col-lg-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-check-circle me-2"></i>Quality Control
|
||||
</h5>
|
||||
<a href="{% url 'laboratory:quality_control_create' %}?test={{ lab_test.pk }}" class="btn btn-outline-success btn-sm">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-5">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<i class="fas fa-check-circle me-2"></i>Quality Control
|
||||
</h4>
|
||||
<div class="panel-heading-btn">
|
||||
<a href="{% url 'laboratory:quality_control_create' %}?test={{ lab_test.pk }}" class="btn btn-outline-success btn-xs">
|
||||
<i class="fas fa-plus me-1"></i>Add QC
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if qc_records %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
@ -347,16 +376,16 @@
|
||||
<tbody>
|
||||
{% for qc in qc_records %}
|
||||
<tr>
|
||||
<td>{{ qc.test_date|date:"M d" }}</td>
|
||||
<td>{{ qc.run_datetime|date:"M d" }}</td>
|
||||
<td>{{ qc.get_control_level_display }}</td>
|
||||
<td class="fw-semibold">{{ qc.result_value }}</td>
|
||||
<td class="fw-semibold">{{ qc.result.result_value }}</td>
|
||||
<td>
|
||||
<span class="badge bg-{% if qc.is_within_range %}success{% else %}danger{% endif %}">
|
||||
{% if qc.is_within_range %}In Range{% else %}Out of Range{% endif %}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'laboratory:quality_control_detail' qc.pk %}" class="btn btn-outline-primary btn-sm">
|
||||
<a href="{% url 'laboratory:quality_control_detail' qc.pk %}" class="btn btn-outline-primary btn-xs">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
</td>
|
||||
|
||||
@ -24,14 +24,18 @@
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-8">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">
|
||||
<i class="fas fa-vial me-2"></i>
|
||||
Lab Test Information
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-1">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-vial me-2"></i> {{ _("Lab Test Information")}}</h4>
|
||||
{# <div class="panel-heading-btn">#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
{# </div>#}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
||||
@ -375,14 +379,18 @@
|
||||
|
||||
<div class="col-xl-4">
|
||||
<!-- Test Categories -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-tags me-2"></i>
|
||||
Test Categories
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-2">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-tags me-2"></i> {{ _("Test Categories")}}</h4>
|
||||
{# <div class="panel-heading-btn">#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
{# </div>#}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="mb-3">
|
||||
<h6><i class="fas fa-heart text-danger me-2"></i>Hematology</h6>
|
||||
<p class="small text-muted">Blood cell counts, coagulation studies</p>
|
||||
@ -406,14 +414,18 @@
|
||||
</div>
|
||||
|
||||
<!-- Specimen Types -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">
|
||||
<i class="fas fa-vial me-2"></i>
|
||||
Common Specimen Types
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="panel panel-inverse" data-sortable-id="index-3">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-bolt me-2"></i> {{ _("Common Specimen Types")}}</h4>
|
||||
{# <div class="panel-heading-btn">#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
{# </div>#}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<ul class="list-unstyled small">
|
||||
@ -436,14 +448,18 @@
|
||||
</div>
|
||||
|
||||
<!-- Quick Actions -->
|
||||
<div class="card">
|
||||
<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="panel panel-inverse" data-sortable-id="index-4">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-bolt me-2"></i> {{ _("Quick Actions")}}</h4>
|
||||
{# <div class="panel-heading-btn">#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
{# </div>#}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="d-grid gap-2">
|
||||
<button type="button" class="btn btn-outline-primary" onclick="generateCode()">
|
||||
<i class="fas fa-barcode me-2"></i>Generate Test Code
|
||||
|
||||
@ -169,29 +169,29 @@
|
||||
</div>
|
||||
|
||||
<!-- Tests Table -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="d-flex align-items-center">
|
||||
<h4 class="card-title mb-0">
|
||||
<i class="fas fa-list me-2"></i>
|
||||
Lab Tests
|
||||
{% if object_list %}
|
||||
<span class="badge bg-secondary ms-2">{{ object_list|length }}</span>
|
||||
{% endif %}
|
||||
</h4>
|
||||
<div class="ms-auto">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<button type="button" class="btn btn-outline-secondary" onclick="selectAll()">
|
||||
|
||||
<div class="panel panel-inverse" data-sortable-id="index-1">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title"><i class="fas fa-list me-2"></i> {{ _("Lab Tests")}}
|
||||
{% if object_list %}
|
||||
<span class="badge bg-primary ms-2">{{ object_list|length }}</span>
|
||||
{% endif %} </h4>
|
||||
<div class="panel-heading-btn">
|
||||
|
||||
<button type="button" class="btn btn-xs btn-outline-primary me-2" onclick="selectAll()">
|
||||
<i class="fas fa-check-square me-1"></i>Select All
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary" onclick="clearSelection()">
|
||||
<button type="button" class="btn btn-xs btn-outline-danger me-2" onclick="clearSelection()">
|
||||
<i class="fas fa-square me-1"></i>Clear
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<a href="javascript:;" class="btn btn-xs btn-icon btn-default" data-toggle="panel-expand"><i class="fa fa-expand"></i></a>
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-success" data-toggle="panel-reload"><i class="fa fa-redo"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-warning" data-toggle="panel-collapse"><i class="fa fa-minus"></i></a>#}
|
||||
{# <a href="javascript:;" class="btn btn-xs btn-icon btn-danger" data-toggle="panel-remove"><i class="fa fa-times"></i></a>#}
|
||||
{##}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if object_list %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0">
|
||||
@ -222,30 +222,47 @@
|
||||
<div class="flex-grow-1">
|
||||
<div class="fw-bold">
|
||||
<a href="{% url 'laboratory:lab_test_detail' test.pk %}" class="text-decoration-none">
|
||||
{{ test.name }}
|
||||
{{ test.test_name }}
|
||||
</a>
|
||||
</div>
|
||||
{% if test.description %}
|
||||
<div class="small text-muted">{{ test.description|truncatewords:8 }}</div>
|
||||
{% if test.test_description %}
|
||||
<div class="small text-muted">{{ test.test_description|truncatewords:8 }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-light text-dark">{{ test.code }}</span>
|
||||
<span class="badge bg-light text-dark">{{ test.test_code }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-{% if test.category == 'hematology' %}danger{% elif test.category == 'chemistry' %}primary{% elif test.category == 'microbiology' %}warning{% elif test.category == 'molecular' %}success{% else %}secondary{% endif %}">
|
||||
{{ test.get_category_display }}
|
||||
|
||||
<span class="badge bg-{% if test.test_category == 'HEMATOLOGY' %}danger{% elif test.test_category == 'CHEMISTRY' %}primary{% elif test.test_category == 'MICROBIOLOGY' %}warning{% elif test.test_category == 'MOLECULAR' %}success{% else %}secondary{% endif %}">
|
||||
{{ test.get_test_category_display }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="d-flex align-items-center">
|
||||
<i class="fas fa-{% if test.specimen_type == 'blood' %}tint text-danger{% elif test.specimen_type == 'urine' %}flask text-warning{% elif test.specimen_type == 'sputum' %}lungs text-info{% else %}vial text-secondary{% endif %} me-2"></i>
|
||||
{{ test.get_specimen_type_display }}
|
||||
<div class="d-flex align-items-center">
|
||||
<i class="fas
|
||||
fa-{% if test.specimen_type == 'BLOOD' %}tint text-danger
|
||||
{% elif test.specimen_type == 'URINE' %}flask text-warning
|
||||
{% elif test.specimen_type == 'SPUTUM' %}lungs text-info
|
||||
{% elif test.specimen_type == 'PLASMA' %}tint text-yellow
|
||||
{% elif test.specimen_type == 'SERUM' %}bottle-droplet text-info
|
||||
{% elif test.specimen_type == 'STOOL' %}poop text-cyan
|
||||
{% elif test.specimen_type == 'CSF' %}eye text-primary
|
||||
{% elif test.specimen_type == 'SWAB' %}hand text-secondary
|
||||
{% elif test.specimen_type == 'TISSUE' %}microscope text-green
|
||||
{% elif test.specimen_type == 'FLUID' %}droplet text-info
|
||||
{% elif test.specimen_type == 'SALIVA' %}lungs text-info
|
||||
{% else %}vial-vertical text-secondary{% endif %} me-1"></i>
|
||||
<span class="fw-bold">{{ test.get_specimen_type_display }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="d-flex align-items-center">
|
||||
{{ test.get_department_display }}
|
||||
</div>
|
||||
</td>
|
||||
<td>{{ test.department.name }}</td>
|
||||
<td>
|
||||
{% if test.turnaround_time %}
|
||||
<span class="badge bg-{% if test.turnaround_time <= 2 %}success{% elif test.turnaround_time <= 24 %}warning{% else %}info{% endif %}">
|
||||
@ -257,7 +274,7 @@
|
||||
</td>
|
||||
<td>
|
||||
{% if test.cost %}
|
||||
${{ test.cost|floatformat:2 }}
|
||||
<span class="symbol">ê</span>{{ test.cost|floatformat:'2g' }}
|
||||
{% else %}
|
||||
<span class="text-muted">-</span>
|
||||
{% endif %}
|
||||
@ -284,16 +301,16 @@
|
||||
title="View Details">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{% url 'laboratory:lab_test_create' test.pk %}"
|
||||
<a href="{% url 'laboratory:lab_test_update' test.pk %}"
|
||||
class="btn btn-outline-secondary"
|
||||
title="Edit">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'laboratory:lab_test_confirm_delete' test.pk %}"
|
||||
class="btn btn-outline-danger"
|
||||
title="Delete">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
{# <a href="{% url 'laboratory:lab_test_confirm_delete' test.pk %}" #}
|
||||
{# class="btn btn-outline-danger" #}
|
||||
{# title="Delete">#}
|
||||
{# <i class="fas fa-trash"></i>#}
|
||||
{# </a>#}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@ -304,38 +321,7 @@
|
||||
|
||||
<!-- Pagination -->
|
||||
{% if is_paginated %}
|
||||
<div class="card-footer">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ paginator.count }} tests
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="pagination pagination-sm mb-0">
|
||||
{% if page_obj.has_previous %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page=1{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.category %}&category={{ request.GET.category }}{% endif %}">First</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ page_obj.previous_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.category %}&category={{ request.GET.category }}{% endif %}">Previous</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li class="page-item active">
|
||||
<span class="page-link">{{ page_obj.number }}</span>
|
||||
</li>
|
||||
|
||||
{% if page_obj.has_next %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ page_obj.next_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.category %}&category={{ request.GET.category }}{% endif %}">Next</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="?page={{ paginator.num_pages }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}{% if request.GET.category %}&category={{ request.GET.category }}{% endif %}">Last</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
{% include 'partial/pagination.html' %}
|
||||
{% endif %}
|
||||
|
||||
<!-- Bulk Actions -->
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user