This commit is contained in:
Faheedkhan 2025-07-08 17:53:53 +03:00
parent 93a320716a
commit 00eec4d325
7 changed files with 129 additions and 213 deletions

View File

@ -2703,7 +2703,8 @@ class CustomGroup(models.Model):
"carfinance", "carfinance",
"notes", "notes",
"tasks", "tasks",
"activity",], "activity",
"payment"],
other_perms=[ other_perms=[
"view_car", "view_car",
"view_carlocation", "view_carlocation",

View File

@ -43,8 +43,7 @@
<div class="card shadow-sm" > <div class="card shadow-sm" >
<div class="card-body"> <div class="card-body">
{% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill entity_slug=view.kwargs.entity_slug style='bill-detail' %} {% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill entity_slug=view.kwargs.entity_slug style='bill-detail' %}
<hr class="my-4">
{% include 'bill/includes/card_vendor.html' with vendor=bill.vendor %}
<div class="d-grid mt-4"> <div class="d-grid mt-4">
<a href="{% url 'bill_list' request.dealer.slug %}" <a href="{% url 'bill_list' request.dealer.slug %}"
class="btn btn-phoenix-primary"> class="btn btn-phoenix-primary">

View File

@ -7,30 +7,18 @@
{% block content %} {% block content %}
<div class="container py-4"> <div class="container py-4">
<div class="row g-4"> <div class="row g-2">
<!-- Vendor Card -->
<div class="col-12">
{% include 'bill/includes/card_vendor.html' with vendor=bill_model.vendor %}
</div>
<!-- Bill Form --> <!-- Bill Form -->
<div class="col-12"> <div class="col-12">
<div class="card mb-4">
<div class="card-body"> <div class="row">
<div class="col">
<div class="card mb-2">
<div class="card-body">
{% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill_model style='bill-detail' entity_slug=view.kwargs.entity_slug %} {% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill_model style='bill-detail' entity_slug=view.kwargs.entity_slug %}
<a href="{% url 'bill-detail' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}"
<form action="{% url 'bill-update' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}" method="post">
{% csrf_token %}
<div class="mb-3">
{{ form|crispy }}
</div>
<button type="submit" class="btn btn-phoenix-primary w-100 mb-2">
<i class="fas fa-save me-2"></i>{% trans 'Save Bill' %}
</button>
<a href="{% url 'bill-detail' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}"
class="btn btn-phoenix-secondary w-100 mb-2"> class="btn btn-phoenix-secondary w-100 mb-2">
<i class="fas fa-arrow-left me-2"></i>{% trans 'Back to Bill Detail' %} <i class="fas fa-arrow-left me-2"></i>{% trans 'Back to Bill Detail' %}
</a> </a>
@ -39,12 +27,21 @@
class="btn btn-phoenix-info w-100 mb-2"> class="btn btn-phoenix-info w-100 mb-2">
<i class="fas fa-list me-2"></i>{% trans 'Bill List' %} <i class="fas fa-list me-2"></i>{% trans 'Bill List' %}
</a> </a>
</form> </div>
</div>
</div> </div>
</div>
</div>
</div>
</div>
<!-- Bill Item Formset --> <!-- Bill Item Formset -->
<div class="col-12"> <div class="col-12">
{% bill_item_formset_table itemtxs_formset %} {% bill_item_formset_table itemtxs_formset %}

View File

@ -90,7 +90,7 @@
{% elif style == 'bill-detail' %} {% elif style == 'bill-detail' %}
<!-- Detail Style Card --> <!-- Detail Style Card -->
<div class=""> <div class="">
<div class="card-header p-4 bg-{{ bill.get_status_badge_color }}"> <div class="card-header p-2 bg-{{ bill.get_status_badge_color }}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<i class="fas fa-file-invoice me-3 text-white"></i> <i class="fas fa-file-invoice me-3 text-white"></i>
<h2 class="mb-0 text-white"> <h2 class="mb-0 text-white">
@ -98,10 +98,14 @@
</h2> </h2>
</div> </div>
</div> </div>
<div class="card-body p-4 text-center"> <div class="card-body p-2 text-center">
{% if bill.is_draft %} {% if bill.is_draft %}
<h3 class="text-warning fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3> <h3 class="text-warning fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3>
<div class="border-bottom pb-4 mb-4"> <p class="mb-2">
<span class="fw-bold">{% trans 'Vendor Name' %}:</span>
{{ bill.vendor.vendor_name }}
</p>
<div class="border-bottom pb-2 mb-4">
<p class="mb-2"> <p class="mb-2">
<span class="fw-bold">{% trans 'Amount Due' %}:</span> <span class="fw-bold">{% trans 'Amount Due' %}:</span>
{% currency_symbol %}{{ bill.amount_due | currency_format }} {% currency_symbol %}{{ bill.amount_due | currency_format }}
@ -121,7 +125,11 @@
</div> </div>
{% elif bill.is_review %} {% elif bill.is_review %}
<h3 class="text-warning fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3> <h3 class="text-warning fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3>
<div class="border-bottom pb-4 mb-4"> <p class="mb-2">
<span class="fw-bold">{% trans 'Vendor Name' %}:</span>
{{ bill.vendor.vendor_name }}
</p>
<div class="border-bottom pb-2 mb-4">
<p class="mb-2"> <p class="mb-2">
<span class="fw-bold">{% trans 'Amount Due' %}:</span> <span class="fw-bold">{% trans 'Amount Due' %}:</span>
{% currency_symbol %}{{ bill.amount_due | currency_format }} {% currency_symbol %}{{ bill.amount_due | currency_format }}
@ -144,7 +152,11 @@
{% endif %} {% endif %}
{% elif bill.is_approved %} {% elif bill.is_approved %}
<h3 class="text-info fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3> <h3 class="text-info fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3>
<div class="border-bottom pb-4 mb-4"> <p class="mb-2">
<span class="fw-bold">{% trans 'Vendor Name' %}:</span>
{{ bill.vendor.vendor_name }}
</p>
<div class="border-bottom pb-2 mb-4">
<p class="mb-2"> <p class="mb-2">
<span class="fw-bold">{% trans 'Amount Due' %}:</span> <span class="fw-bold">{% trans 'Amount Due' %}:</span>
{% currency_symbol %}{{ bill.amount_due | currency_format }} {% currency_symbol %}{{ bill.amount_due | currency_format }}
@ -176,7 +188,11 @@
{% endif %} {% endif %}
{% elif bill.is_paid %} {% elif bill.is_paid %}
<h3 class="text-success fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3> <h3 class="text-success fw-bold mb-4">{% trans 'This bill is' %} {{ bill.get_bill_status_display }}</h3>
<div class="border-bottom pb-4 mb-4"> <p class="mb-2">
<span class="fw-bold">{% trans 'Vendor Name' %}:</span>
{{ bill.vendor.vendor_name }}
</p>
<div class="border-bottom pb-2 mb-4">
<p class="mb-2"> <p class="mb-2">
<span class="fw-bold">{% trans 'Amount Paid' %}:</span> <span class="fw-bold">{% trans 'Amount Paid' %}:</span>
{% currency_symbol %}{{ bill.amount_paid | currency_format }} {% currency_symbol %}{{ bill.amount_paid | currency_format }}
@ -190,7 +206,7 @@
<p class="text-muted fst-italic">{% trans 'External Ref' %}: {{ bill.xref }}</p> <p class="text-muted fst-italic">{% trans 'External Ref' %}: {{ bill.xref }}</p>
{% endif %} {% endif %}
{% else %} {% else %}
<div class="border-bottom pb-4 mb-4"> <div class="border-bottom pb-2 mb-4">
<p class="mb-2"> <p class="mb-2">
<span class="fw-bold">{% trans 'Bill Amount' %}:</span> <span class="fw-bold">{% trans 'Bill Amount' %}:</span>
{% currency_symbol %}{{ bill.amount_due | currency_format }} {% currency_symbol %}{{ bill.amount_due | currency_format }}

View File

@ -140,7 +140,7 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="row mt-4"> <div class="row mt-4">
<div class="col-12"> <div class="col-12">
<div class="d-flex justify-content-end gap-2"> <div class="d-flex justify-content-start gap-2">
{% if not item_formset.has_po %} {% if not item_formset.has_po %}
<a href="{% url 'django_ledger:product-create' entity_slug=entity_slug %}" <a href="{% url 'django_ledger:product-create' entity_slug=entity_slug %}"
class="btn btn-phoenix-primary"> class="btn btn-phoenix-primary">

View File

@ -32,134 +32,87 @@
{% if not create_po %} {% if not create_po %}
{% if style == 'po-detail' %} {% if style == 'po-detail' %}
<div class="card shadow-sm border-0 mb-2"> <div class="card shadow-sm border-0 mb-2">
<div class="card-header bg-light"> <div class="card-header bg-light">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="me-3 text-primary"> <span class="me-3 text-primary">
{% icon 'uil:bill' 36 %} {% icon 'uil:bill' 36 %}
</span> </span>
<h2 class="h3 mb-0"> <h2 class="h3 mb-0">
{{ po_model.po_number }} {{ po_model.po_number }}
</h2> </h2>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<h3 class="h4 mb-4"> <div class='row g-3'>
<div class='col-12 col-md-3 col-lg-2'>
<h3 class="h4 mb-0 mb-md-4">
<span class="badge bg-{% if po_model.is_draft %}success{% elif po_model.is_approved %}success{% elif po_model.is_fulfilled %}primary{% else %}warning{% endif %}"> <span class="badge bg-{% if po_model.is_draft %}success{% elif po_model.is_approved %}success{% elif po_model.is_fulfilled %}primary{% else %}warning{% endif %}">
{{ po_model.get_po_status_display }} {{ po_model.get_po_status_display }}
</span> </span>
</h3> </h3>
</div>
{# Display PO Contract Information #}
{% if po_model.is_contract_bound %} <div class='col-12 col-md-4 col-lg-3'>
<div class="alert alert-info d-flex align-items-center mb-4"> {% if po_model.is_draft %}
<i class="fas fa-file-contract me-3 fs-4"></i> <h5 class="h6 text-muted mb-1">{% trans 'Draft Date' %}</h5>
<div> <p class="h5 mb-3">{{ po_model.date_draft|date }}</p>
<h4 class="h6 mb-1">{% trans 'Contract' %}</h4>
<p class="mb-0">{{ po_model.ce_model.estimate_number }}</p>
</div>
<a href="{% url 'estimate_detail' po_model.ce_model_id %}"
class="btn btn-sm btn-outline-info ms-auto">
{% trans 'View Contract' %}
</a>
</div>
{% endif %} {% endif %}
<div class="row g-3 mb-4"> {% if po_model.is_review %}
{% if po_model.is_draft %} <h5 class="h6 text-muted mb-1">{% trans 'Review Date' %}</h5>
<div class="col-md-6"> <p class="h5 mb-3">{{ po_model.date_in_review|date }}</p>
<div class="card border-light h-100"> {% endif %}
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Draft Date' %}</h5>
<p class="h5">{{ po_model.date_draft|date }}</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Purchase Order Amount' %}</h5>
<p class="h5"><span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount|currency_format }}</p>
</div>
</div>
</div>
{% endif %}
{% if po_model.is_review %} {% if po_model.is_approved %}
<div class="col-md-6"> <h5 class="h6 text-muted mb-1">{% trans 'Approved Date' %}</h5>
<div class="card border-light h-100"> <p class="h5 mb-3">{{ po_model.date_approved|date }}</p>
<div class="card-body"> {% endif %}
<h5 class="h6 text-muted mb-2">{% trans 'Review Date' %}</h5>
<p class="h5">{{ po_model.date_in_review|date }}</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Purchase Order Amount' %}</h5>
<p class="h5"><span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount|currency_format }}</p>
</div>
</div>
</div>
{% endif %}
{% if po_model.is_approved %} {% if po_model.is_fulfilled %}
<div class="col-md-4"> <h5 class="h6 text-muted mb-1">{% trans 'Fulfilled Date' %}</h5>
<div class="card border-light h-100"> <p class="h5 mb-3">{{ po_model.date_fulfilled|date }}</p>
<div class="card-body"> {% endif %}
<h5 class="h6 text-muted mb-2">{% trans 'Approved Date' %}</h5> </div>
<p class="h5">{{ po_model.date_approved|date }}</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'PO Amount' %}</h5>
<p class="h5">{{ po_model.po_amount|currency_format }}<span class="currency">{{CURRENCY}}</span></p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Received Amount' %}</h5>
<p class="h5 text-success">{{ po_model.po_amount_received|currency_format }}<span class="currency">{{CURRENCY}}</span></p>
</div>
</div>
</div>
{% endif %}
{% if po_model.is_fulfilled %}
<div class="col-md-6"> <div class='col-12 col-md-5 col-lg-5'>
<div class="card border-light h-100"> <div class="row text-center g-0">
<div class="card-body"> <div class="col-6 border-end">
<h5 class="h6 text-muted mb-2">{% trans 'Fulfilled Date' %}</h5> <div class="p-2">
<p class="h5">{{ po_model.date_fulfilled|date }}</p> <h6 class="text-muted mb-2">{% trans 'PO Amount' %}</h6>
</div> <h3 class="fw-light mb-0">
</div> <span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount | absolute | currency_format }}
</h3>
</div> </div>
<div class="col-md-6"> </div>
<div class="card border-light h-100"> <div class="col-6">
<div class="card-body"> <h6 class="text-muted mb-2">{% trans 'Amount Received' %}</h6>
<h5 class="h6 text-muted mb-2">{% trans 'PO Amount' %}</h5> <h3 class="fw-light mb-0 text-success">
<div class="d-flex align-items-center"> <span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount_received | currency_format }}
<p class="h5 mb-0 me-2"><span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount|currency_format }}</p> </h3>
<span class="badge bg-success">
<i class="fas fa-check-circle me-1"></i>{% trans 'Fulfilled' %}
</span>
</div>
</div>
</div>
</div> </div>
{% endif %} </div>
</div> </div>
</div> </div>
<div class='col-12 col-md-12 col-lg-2 d-grid align-content-end'>
<a class="btn btn-phoenix-primary py-2"
href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"
title="Click to view the complete list of Purchase Orders"
role="button"
>
<i class="fas fa-list me-2"></i>{% trans 'PO List' %}
</a>
</div>
</div>
</div>
<div class="card-footer bg-light"> <div class="card-footer bg-light">
{% if perms.django_ledger.change_purchaseordermodel%} {% if perms.django_ledger.change_purchaseordermodel%}
<div class="d-flex flex-wrap gap-2 justify-content-between"> <div class="d-flex flex-wrap gap-2 justify-content-between">
@ -170,7 +123,7 @@
</a> </a>
<div class="d-flex flex-wrap gap-2"> <div class="d-flex flex-wrap gap-2">
{# Status Action Buttons #}
{% if po_model.can_draft %} {% if po_model.can_draft %}
<button class="btn btn-phoenix-secondary" <button class="btn btn-phoenix-secondary"
onclick="showPOModal('Draft PO', '{% url 'po-action-mark-as-draft' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Draft')"> onclick="showPOModal('Draft PO', '{% url 'po-action-mark-as-draft' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Draft')">
@ -200,25 +153,25 @@
{% endif %} {% endif %}
{# Danger Action Buttons #}
{% if po_model.can_delete %} {% if po_model.can_delete %}
{% if perms.django_ledger.delete_purchaseordermodel%} {% if perms.django_ledger.delete_purchaseordermodel%}
<button class="btn btn-outline-danger" <button class="btn btn-phoenix-danger"
onclick="showPOModal('Delete PO', '{% url 'po-delete' request.dealer.slug entity_slug po_model.pk %}', 'Delete')"> onclick="showPOModal('Delete PO', '{% url 'po-delete' request.dealer.slug entity_slug po_model.pk %}', 'Delete')">
<i class="fas fa-ban me-2"></i>{% trans 'Delete' %} <i class="fas fa-trash me-2"></i>{% trans 'Delete' %}
</button> </button>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if po_model.can_void %} {% if po_model.can_void %}
<button class="btn btn-outline-danger" <button class="btn btn-phoenix-danger"
onclick="showPOModal('Void PO', '{% url 'po-action-mark-as-void' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Void')"> onclick="showPOModal('Void PO', '{% url 'po-action-mark-as-void' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Void')">
<i class="fas fa-times-circle me-2"></i>{% trans 'Void' %} <i class="fas fa-times-circle me-2"></i>{% trans 'Void' %}
</button> </button>
{% endif %} {% endif %}
{% if po_model.can_cancel %} {% if po_model.can_cancel %}
<button class="btn btn-outline-danger" <button class="btn btn-phoenix-secondary"
onclick="showPOModal('Cancel PO', '{% url 'po-action-mark-as-canceled' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Cancelled')"> onclick="showPOModal('Cancel PO', '{% url 'po-action-mark-as-canceled' request.dealer.slug entity_slug po_model.pk %}', 'Mark As Cancelled')">
<i class="fas fa-ban me-2"></i>{% trans 'Cancel' %} <i class="fas fa-ban me-2"></i>{% trans 'Cancel' %}
</button> </button>

View File

@ -8,69 +8,19 @@
<div class="container-fluid mt-4"> <div class="container-fluid mt-4">
<div class="row g-1"> <div class="row g-1">
<div class="col-lg-12 mb-3">
<div class="col-lg-12 mb-3 "> <div class="card">
<div class="row"> <div class="card-body">
{% include 'purchase_orders/includes/card_po.html' with dealer_slug=request.dealer.slug po_model=po_model entity_slug=entity_slug style='po-detail' %}
<div class="col-9"> </div>
<div class="card">
<div class="card-body">
{% include 'purchase_orders/includes/card_po.html' with dealer_slug=request.dealer.slug po_model=po_model entity_slug=entity_slug style='po-detail' %}
</div>
</div>
</div>
<div class='col-3'>
<div class="row">
<div class="col-12">
<div class="card mb-4">
<div class="card-body">
<div class="row text-center">
<div class="col-md-6 border-end">
<div class="p-2">
<h6 class="text-muted mb-2">{% trans 'PO Amount' %}</h6>
<h3 class="fw-light mb-0">
<span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount | absolute | currency_format }}
</h3>
</div>
</div>
<div class="col-md-6">
<div class="p-2">
<h6 class="text-muted mb-2">{% trans 'Amount Received' %}</h6>
<h3 class="fw-light mb-0 text-success">
<span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount_received | currency_format }}
</h3>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<a class="btn btn-phoenix-primary w-100 py-2"
href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<i class="fas fa-list me-2"></i>{% trans 'PO List' %}
</a>
</div>
</div>
</div> </div>
</div>
</div>
<div class="col-lg-12">
<div class="table-responsive">
{% po_item_table1 po_items %}
</div> </div>
</div>
<div class="col-lg-12">
<div class="table-responsive">
{% po_item_table1 po_items %}
</div>
</div>
</div> </div>
</div> </div>