Marwan Alwali 84c1fb798e update
2025-09-08 19:52:52 +03:00

639 lines
33 KiB
HTML

{% extends "base.html" %}
{% load static %}
{% block title %}Bill {{ object.bill_number }} - {{ block.super }}{% endblock %}
{% block content %}
<div class="container-fluid">
<!-- Page Header -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h1 class="h3 mb-1">Medical Bill {{ object.bill_number }}</h1>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a href="{% url 'billing:dashboard' %}">Billing</a></li>
<li class="breadcrumb-item"><a href="{% url 'billing:bill_list' %}">Medical Bills</a></li>
<li class="breadcrumb-item active">{{ object.bill_number }}</li>
</ol>
</nav>
</div>
<div class="btn-group">
<a href="{% url 'billing:bill_list' %}" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left me-2"></i>Back to List
</a>
{% if object.status == 'DRAFT' %}
<a href="{% url 'billing:bill_update' object.bill_id %}" class="btn btn-primary">
<i class="fas fa-edit me-2"></i>Edit Bill
</a>
{% endif %}
<div class="btn-group" role="group">
<button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
<i class="fas fa-cog me-2"></i>Actions
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="{% url 'billing:print_bill_detail' object.bill_id %}">
<i class="fas fa-print me-2"></i>Print Bill
</a></li>
<li><a class="dropdown-item" href="">
<i class="fas fa-envelope me-2"></i>Email Bill
</a></li>
<li><a class="dropdown-item" href="">
<i class="fas fa-download me-2"></i>Download PDF
</a></li>
<li><hr class="dropdown-divider"></li>
{% if object.status == 'DRAFT' %}
<li><a class="dropdown-item text-warning" href="{% url 'billing:submit_bill' object.bill_id %}">
<i class="fas fa-paper-plane me-2"></i>Submit Bill
</a></li>
{% endif %}
{% if object.status in 'SUBMITTED,PENDING' %}
<li><a class="dropdown-item text-info" href="{% url 'billing:payment_create' %}?bill={{ object.bill_id }}">
<i class="fas fa-credit-card me-2"></i>Record Payment
</a></li>
{% endif %}
{% if object.status in 'DRAFT,PENDING' %}
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item text-danger" href="{% url 'billing:bill_delete' object.bill_id %}">
<i class="fas fa-trash me-2"></i>Delete Bill
</a></li>
{% endif %}
</ul>
</div>
</div>
</div>
<div class="row">
<!-- Main Content -->
<div class="col-lg-8">
<!-- Bill Status Alert -->
{% if object.status == 'OVERDUE' %}
<div class="alert alert-danger mb-4">
<h6 class="alert-heading"><i class="fas fa-exclamation-triangle me-2"></i>Overdue Bill</h6>
This bill is {{ object.days_outstanding }} days overdue. Please follow up with the patient or consider collections.
</div>
{% elif object.status == 'DRAFT' %}
<div class="alert alert-warning mb-4">
<h6 class="alert-heading"><i class="fas fa-edit me-2"></i>Draft Bill</h6>
This bill is still in draft status. Review and submit when ready.
</div>
{% elif object.status == 'PAID' %}
<div class="alert alert-success mb-4">
<h6 class="alert-heading"><i class="fas fa-check-circle me-2"></i>Paid in Full</h6>
This bill has been paid in full on {{ object.paid_date|date:"M d, Y" }}.
</div>
{% endif %}
<!-- Patient Information -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-user me-2"></i>Patient Information
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-borderless table-sm">
<tr>
<td class="fw-bold">Patient Name:</td>
<td>{{ object.patient.get_full_name }}</td>
</tr>
<tr>
<td class="fw-bold">MRN:</td>
<td>{{ object.patient.mrn }}</td>
</tr>
<tr>
<td class="fw-bold">Date of Birth:</td>
<td>{{ object.patient.date_of_birth|date:"M d, Y" }}</td>
</tr>
<tr>
<td class="fw-bold">Phone:</td>
<td>{{ object.patient.phone_number|default:"-" }}</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-borderless table-sm">
<tr>
<td class="fw-bold">Address:</td>
<td>
{% if object.patient.address_line_1 %}
{{ object.patient.address_line_1 }}<br>
{{ object.patient.city }}, {{ object.patient.state }} {{ object.patient.zip_code }}
{% else %}
-
{% endif %}
</td>
</tr>
<tr>
<td class="fw-bold">Email:</td>
<td>{{ object.patient.email|default:"-" }}</td>
</tr>
<tr>
<td class="fw-bold">Insurance:</td>
<td>
{% if object.patient.insurance_info %}
{{ object.patient.insurance_info.insurance_company }}
{% else %}
No insurance on file
{% endif %}
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<!-- Bill Details -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-file-invoice me-2"></i>Bill Details
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<table class="table table-borderless table-sm">
<tr>
<td class="fw-bold">Bill Number:</td>
<td>{{ object.bill_number }}</td>
</tr>
<tr>
<td class="fw-bold">Bill Date:</td>
<td>{{ object.bill_date|date:"M d, Y" }}</td>
</tr>
<tr>
<td class="fw-bold">Due Date:</td>
<td>
{% if object.due_date %}
{{ object.due_date|date:"M d, Y" }}
{% if object.is_overdue %}
<span class="badge bg-danger ms-2">Overdue</span>
{% endif %}
{% else %}
-
{% endif %}
</td>
</tr>
<tr>
<td class="fw-bold">Status:</td>
<td>
{% if object.status == 'DRAFT' %}
<span class="badge bg-secondary">Draft</span>
{% elif object.status == 'PENDING' %}
<span class="badge bg-warning">Pending</span>
{% elif object.status == 'SUBMITTED' %}
<span class="badge bg-info">Submitted</span>
{% elif object.status == 'PARTIAL_PAID' %}
<span class="badge bg-primary">Partially Paid</span>
{% elif object.status == 'PAID' %}
<span class="badge bg-success">Paid</span>
{% elif object.status == 'OVERDUE' %}
<span class="badge bg-danger">Overdue</span>
{% elif object.status == 'COLLECTIONS' %}
<span class="badge bg-dark">Collections</span>
{% elif object.status == 'WRITTEN_OFF' %}
<span class="badge bg-secondary">Written Off</span>
{% elif object.status == 'CANCELLED' %}
<span class="badge bg-secondary">Cancelled</span>
{% endif %}
</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-borderless table-sm">
<tr>
<td class="fw-bold">Billing Provider:</td>
<td>{{ object.billing_provider|default:"-" }}</td>
</tr>
<tr>
<td class="fw-bold">Related Encounter:</td>
<td>
{% if object.encounter %}
<a href="{% url 'emr:encounter_detail' object.encounter.encounter_id %}" class="text-decoration-none">
{{ object.encounter.encounter_number }}
</a>
{% else %}
-
{% endif %}
</td>
</tr>
<tr>
<td class="fw-bold">Created:</td>
<td>{{ object.created_at|date:"M d, Y g:i A" }}</td>
</tr>
<tr>
<td class="fw-bold">Last Updated:</td>
<td>{{ object.updated_at|date:"M d, Y g:i A" }}</td>
</tr>
</table>
</div>
</div>
{% if object.notes %}
<div class="mt-3">
<h6 class="fw-bold">Notes:</h6>
<p class="text-muted">{{ object.notes }}</p>
</div>
{% endif %}
</div>
</div>
<!-- Line Items -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-list me-2"></i>Line Items
</h5>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Service Code</th>
<th>Description</th>
<th class="text-center">Quantity</th>
<th class="text-end">Unit Price</th>
<th class="text-end">Total</th>
</tr>
</thead>
<tbody>
{% for line_item in object.line_items.all %}
<tr>
<td>
<code>{{ line_item.service_code }}</code>
</td>
<td>{{ line_item.service_description }}</td>
<td class="text-center">{{ line_item.quantity }}</td>
<td class="text-end"><span class="symbol">&#xea;</span>{{ line_item.unit_price|floatformat:'2g' }}</td>
<td class="text-end fw-bold"><span class="symbol">&#xea;</span>{{ line_item.total_price|floatformat:'2g' }}</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-center text-muted py-4">
No line items found for this bill.
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<!-- Payment History -->
<div class="card mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">
<i class="fas fa-credit-card me-2"></i>Payment History
</h5>
{% if object.status not in 'PAID,CANCELLED,WRITTEN_OFF' %}
<a href="{% url 'billing:payment_create' %}?bill={{ object.bill_id }}" class="btn btn-sm btn-success">
<i class="fas fa-plus me-1"></i>Record Payment
</a>
{% endif %}
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Payment Number</th>
<th>Date</th>
<th>Method</th>
<th class="text-end">Amount</th>
<th>Status</th>
<th>Reference</th>
<th width="80">Actions</th>
</tr>
</thead>
<tbody>
{% for payment in object.payments.all %}
<tr>
<td>
<a href="{% url 'billing:payment_detail' payment.payment_id %}" class="text-decoration-none">
{{ payment.payment_number }}
</a>
</td>
<td>{{ payment.payment_date|date:"M d, Y" }}</td>
<td>{{ payment.get_payment_method_display }}</td>
<td class="text-end fw-bold text-success"><span class="symbol">&#xea;</span>{{ payment.payment_amount|floatformat:'2g' }}</td>
<td>
{% if payment.status == 'PENDING' %}
<span class="badge bg-warning">Pending</span>
{% elif payment.status == 'PROCESSING' %}
<span class="badge bg-info">Processing</span>
{% elif payment.status == 'COMPLETED' %}
<span class="badge bg-success">Completed</span>
{% elif payment.status == 'FAILED' %}
<span class="badge bg-danger">Failed</span>
{% elif payment.status == 'REFUNDED' %}
<span class="badge bg-secondary">Refunded</span>
{% endif %}
</td>
<td>
<small class="text-muted">{{ payment.reference_number|default:"-" }}</small>
</td>
<td>
<div class="btn-group btn-group-sm">
<a href="{% url 'billing:payment_detail' payment.payment_id %}" class="btn btn-outline-primary btn-sm" title="View">
<i class="fas fa-eye"></i>
</a>
<a href="{% url 'billing:payment_receipt' payment.payment_id %}" class="btn btn-outline-secondary btn-sm" title="Receipt">
<i class="fas fa-receipt"></i>
</a>
</div>
</td>
</tr>
{% empty %}
<tr>
<td colspan="7" class="text-center text-muted py-4">
No payments recorded for this bill.
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<!-- Insurance Claims -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">
<i class="fas fa-file-medical me-2"></i>Insurance Claims
</h5>
{% if object.patient.primary_insurance and object.status not in 'CANCELLED,WRITTEN_OFF' %}
<a href="{% url 'billing:claim_create' %}?bill={{ object.bill_id }}" class="btn btn-sm btn-info">
<i class="fas fa-plus me-1"></i>Submit Claim
</a>
{% endif %}
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Claim Number</th>
<th>Insurance Company</th>
<th>Submit Date</th>
<th class="text-end">Billed Amount</th>
<th class="text-end">Approved Amount</th>
<th>Status</th>
<th width="80">Actions</th>
</tr>
</thead>
<tbody>
{% for claim in object.insurance_claims.all %}
<tr>
<td>
<a href="{% url 'billing:claim_detail' claim.claim_id %}" class="text-decoration-none">
{{ claim.claim_number }}
</a>
</td>
<td>{{ claim.insurance_info.insurance_company }}</td>
<td>
{% if claim.submission_date %}
{{ claim.submission_date|date:"M d, Y" }}
{% else %}
<span class="text-muted">Not submitted</span>
{% endif %}
</td>
<td class="text-end"><span class="symbol">&#xea;</span>{{ claim.billed_amount|floatformat:'2g' }}</td>
<td class="text-end">
{% if claim.approved_amount %}
<span class="text-success fw-bold"><span class="symbol">&#xea;</span>{{ claim.approved_amount|floatformat:'2g' }}</span>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>
{% if claim.status == 'DRAFT' %}
<span class="badge bg-secondary">Draft</span>
{% elif claim.status == 'SUBMITTED' %}
<span class="badge bg-info">Submitted</span>
{% elif claim.status == 'PENDING' %}
<span class="badge bg-warning">Pending</span>
{% elif claim.status == 'APPROVED' %}
<span class="badge bg-success">Approved</span>
{% elif claim.status == 'PARTIALLY_APPROVED' %}
<span class="badge bg-primary">Partially Approved</span>
{% elif claim.status == 'DENIED' %}
<span class="badge bg-danger">Denied</span>
{% elif claim.status == 'PAID' %}
<span class="badge bg-success">Paid</span>
{% elif claim.status == 'APPEALED' %}
<span class="badge bg-dark">Appealed</span>
{% endif %}
</td>
<td>
<div class="btn-group btn-group-sm">
<a href="{% url 'billing:claim_detail' claim.claim_id %}" class="btn btn-outline-primary btn-sm" title="View">
<i class="fas fa-eye"></i>
</a>
<a href="" class="btn btn-outline-secondary btn-sm" title="Print">
<i class="fas fa-print"></i>
</a>
</div>
</td>
</tr>
{% empty %}
<tr>
<td colspan="7" class="text-center text-muted py-4">
No insurance claims submitted for this bill.
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="col-lg-4">
<!-- Bill Summary -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-calculator me-2"></i>Bill Summary
</h5>
</div>
<div class="card-body">
<div class="d-flex justify-content-between mb-2">
<span>Subtotal:</span>
<span class="fw-bold"><span class="symbol">&#xea;</span>{{ object.subtotal|floatformat:'2g' }}</span>
</div>
<div class="d-flex justify-content-between mb-2">
<span>Vat:</span>
<span><span class="symbol">&#xea;</span>{{ object.tax_amount|floatformat:'2g' }}</span>
</div>
<div class="d-flex justify-content-between mb-2">
<span>Discount:</span>
<span><span class="symbol">&#xea;</span>{{ object.discount_amount|floatformat:'2g' }}</span>
</div>
<hr>
<div class="d-flex justify-content-between mb-2">
<span class="fw-bold">Total Amount:</span>
<span class="fw-bold text-primary"><span class="symbol">&#xea;</span>{{ object.total_amount|floatformat:'2g' }}</span>
</div>
<div class="d-flex justify-content-between mb-2">
<span>Paid Amount:</span>
<span class="text-success"><span class="symbol">&#xea;</span>{{ object.paid_amount|floatformat:2 }}</span>
</div>
<hr>
<div class="d-flex justify-content-between">
<span class="fw-bold">Balance Due:</span>
<span class="fw-bold {% if object.balance_amount > 0 %}text-danger{% else %}text-success{% endif %}">
<span class="symbol">&#xea;</span>{{ object.balance_amount|floatformat:'2g' }}
</span>
</div>
</div>
</div>
<!-- Quick Actions -->
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-bolt me-2"></i>Quick Actions
</h5>
</div>
<div class="card-body">
<div class="d-grid gap-2">
{% if object.status not in 'PAID,CANCELLED,WRITTEN_OFF' %}
<a href="{% url 'billing:payment_create' %}?bill={{ object.bill_id }}" class="btn btn-success">
<i class="fas fa-credit-card me-2"></i>Record Payment
</a>
{% endif %}
{% if object.patient.primary_insurance and object.status not in 'CANCELLED,WRITTEN_OFF' %}
<a href="{% url 'billing:claim_create' %}?bill={{ object.bill_id }}" class="btn btn-info">
<i class="fas fa-file-medical me-2"></i>Submit Claim
</a>
{% endif %}
<a href="{% url 'billing:print_bill_detail' object.bill_id %}" class="btn btn-outline-primary">
<i class="fas fa-print me-2"></i>Print Bill
</a>
<a href="" class="btn btn-outline-secondary">
<i class="fas fa-envelope me-2"></i>Email Bill
</a>
{% if object.status == 'DRAFT' %}
<a href="{% url 'billing:bill_update' object.bill_id %}" class="btn btn-outline-warning">
<i class="fas fa-edit me-2"></i>Edit Bill
</a>
{% endif %}
</div>
</div>
</div>
<!-- Activity Timeline -->
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-history me-2"></i>Activity Timeline
</h5>
</div>
<div class="card-body">
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker bg-primary"></div>
<div class="timeline-content">
<h6 class="timeline-title">Bill Created</h6>
<p class="timeline-text">{{ object.created_at|date:"M d, Y g:i A" }}</p>
</div>
</div>
{% if object.status != 'DRAFT' %}
<div class="timeline-item">
<div class="timeline-marker bg-info"></div>
<div class="timeline-content">
<h6 class="timeline-title">Bill Submitted</h6>
<p class="timeline-text">{{ object.submitted_at|date:"M d, Y g:i A"|default:"Unknown" }}</p>
</div>
</div>
{% endif %}
{% for payment in object.payment_set.all %}
<div class="timeline-item">
<div class="timeline-marker bg-success"></div>
<div class="timeline-content">
<h6 class="timeline-title">Payment Received</h6>
<p class="timeline-text">
<span class="symbol">&#xea;</span>{{ payment.payment_amount|floatformat:'2g' }} via {{ payment.get_payment_method_display }}
<br><small class="text-muted">{{ payment.payment_date|date:"M d, Y g:i A" }}</small>
</p>
</div>
</div>
{% endfor %}
{% if object.status == 'PAID' %}
<div class="timeline-item">
<div class="timeline-marker bg-success"></div>
<div class="timeline-content">
<h6 class="timeline-title">Paid in Full</h6>
<p class="timeline-text">{{ object.paid_date|date:"M d, Y g:i A"|default:"Unknown" }}</p>
</div>
</div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.timeline {
position: relative;
padding-left: 30px;
}
.timeline::before {
content: '';
position: absolute;
left: 15px;
top: 0;
bottom: 0;
width: 2px;
background: #dee2e6;
}
.timeline-item {
position: relative;
margin-bottom: 20px;
}
.timeline-marker {
position: absolute;
left: -22px;
top: 0;
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid #fff;
box-shadow: 0 0 0 2px #dee2e6;
}
.timeline-content {
background: #f8f9fa;
padding: 10px 15px;
border-radius: 8px;
border-left: 3px solid #dee2e6;
}
.timeline-title {
margin: 0 0 5px 0;
font-size: 0.9rem;
font-weight: 600;
}
.timeline-text {
margin: 0;
font-size: 0.85rem;
color: #6c757d;
}
</style>
{% endblock %}