Changes to bill detail and po detail ui #117

Merged
ismail merged 2 commits from frontend into main 2025-07-08 17:57:51 +03:00
9 changed files with 137 additions and 214 deletions

View File

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

View File

@ -43,8 +43,7 @@
<div class="card shadow-sm" >
<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' %}
<hr class="my-4">
{% include 'bill/includes/card_vendor.html' with vendor=bill.vendor %}
<div class="d-grid mt-4">
<a href="{% url 'bill_list' request.dealer.slug %}"
class="btn btn-phoenix-primary">

View File

@ -7,30 +7,18 @@
{% block content %}
<div class="container py-4">
<div class="row g-4">
<!-- Vendor Card -->
<div class="col-12">
{% include 'bill/includes/card_vendor.html' with vendor=bill_model.vendor %}
</div>
<div class="row g-2">
<!-- Bill Form -->
<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 %}
<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 %}"
<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">
<i class="fas fa-arrow-left me-2"></i>{% trans 'Back to Bill Detail' %}
</a>
@ -39,12 +27,21 @@
class="btn btn-phoenix-info w-100 mb-2">
<i class="fas fa-list me-2"></i>{% trans 'Bill List' %}
</a>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Bill Item Formset -->
<div class="col-12">
{% bill_item_formset_table itemtxs_formset %}

View File

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

View File

@ -140,7 +140,7 @@
<!-- Action Buttons -->
<div class="row mt-4">
<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 %}
<a href="{% url 'django_ledger:product-create' entity_slug=entity_slug %}"
class="btn btn-phoenix-primary">

View File

@ -11,7 +11,7 @@
<div class="row mt-4">
<div class="d-flex justify-content-between mb-2">
<h3 class=""><i class="fa-solid fa-book"></i> {% trans "Accounts" %}</h3>
{% if perms.django_ledger.create_chartofaccountmodel %}
{% if perms.django_ledger.add_chartofaccountmodel %}
<a href="{% url 'account_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'New Account' %}</a>
{% endif %}
</div>

View File

@ -32,134 +32,87 @@
{% if not create_po %}
{% if style == 'po-detail' %}
<div class="card shadow-sm border-0 mb-2">
<div class="card-header bg-light">
<div class="d-flex align-items-center">
<span class="me-3 text-primary">
{% icon 'uil:bill' 36 %}
</span>
<h2 class="h3 mb-0">
{{ po_model.po_number }}
</h2>
</div>
</div>
<div class="card-header bg-light">
<div class="d-flex align-items-center">
<span class="me-3 text-primary">
{% icon 'uil:bill' 36 %}
</span>
<h2 class="h3 mb-0">
{{ po_model.po_number }}
</h2>
</div>
</div>
<div class="card-body">
<h3 class="h4 mb-4">
<div class="card-body">
<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 %}">
{{ po_model.get_po_status_display }}
</span>
</h3>
</div>
{# Display PO Contract Information #}
{% if po_model.is_contract_bound %}
<div class="alert alert-info d-flex align-items-center mb-4">
<i class="fas fa-file-contract me-3 fs-4"></i>
<div>
<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>
<div class='col-12 col-md-4 col-lg-3'>
{% if po_model.is_draft %}
<h5 class="h6 text-muted mb-1">{% trans 'Draft Date' %}</h5>
<p class="h5 mb-3">{{ po_model.date_draft|date }}</p>
{% endif %}
<div class="row g-3 mb-4">
{% if po_model.is_draft %}
<div class="col-md-6">
<div class="card border-light h-100">
<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 %}
<h5 class="h6 text-muted mb-1">{% trans 'Review Date' %}</h5>
<p class="h5 mb-3">{{ po_model.date_in_review|date }}</p>
{% endif %}
{% if po_model.is_review %}
<div class="col-md-6">
<div class="card border-light h-100">
<div class="card-body">
<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 %}
<h5 class="h6 text-muted mb-1">{% trans 'Approved Date' %}</h5>
<p class="h5 mb-3">{{ po_model.date_approved|date }}</p>
{% endif %}
{% if po_model.is_approved %}
<div class="col-md-4">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Approved Date' %}</h5>
<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 %}
<h5 class="h6 text-muted mb-1">{% trans 'Fulfilled Date' %}</h5>
<p class="h5 mb-3">{{ po_model.date_fulfilled|date }}</p>
{% endif %}
</div>
{% if po_model.is_fulfilled %}
<div class="col-md-6">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'Fulfilled Date' %}</h5>
<p class="h5">{{ po_model.date_fulfilled|date }}</p>
</div>
</div>
<div class='col-12 col-md-5 col-lg-5'>
<div class="row text-center g-0">
<div class="col-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 class="col-md-6">
<div class="card border-light h-100">
<div class="card-body">
<h5 class="h6 text-muted mb-2">{% trans 'PO Amount' %}</h5>
<div class="d-flex align-items-center">
<p class="h5 mb-0 me-2"><span class="currency">{{CURRENCY}}</span>{{ po_model.po_amount|currency_format }}</p>
<span class="badge bg-success">
<i class="fas fa-check-circle me-1"></i>{% trans 'Fulfilled' %}
</span>
</div>
</div>
</div>
</div>
<div class="col-6">
<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>
{% endif %}
</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">
{% if perms.django_ledger.change_purchaseordermodel%}
<div class="d-flex flex-wrap gap-2 justify-content-between">
@ -170,7 +123,7 @@
</a>
<div class="d-flex flex-wrap gap-2">
{# Status Action Buttons #}
{% if po_model.can_draft %}
<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')">
@ -200,25 +153,25 @@
{% endif %}
{# Danger Action Buttons #}
{% if po_model.can_delete %}
{% 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')">
<i class="fas fa-ban me-2"></i>{% trans 'Delete' %}
<i class="fas fa-trash me-2"></i>{% trans 'Delete' %}
</button>
{% endif %}
{% endif %}
{% 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')">
<i class="fas fa-times-circle me-2"></i>{% trans 'Void' %}
</button>
{% endif %}
{% 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')">
<i class="fas fa-ban me-2"></i>{% trans 'Cancel' %}
</button>

View File

@ -8,69 +8,19 @@
<div class="container-fluid mt-4">
<div class="row g-1">
<div class="col-lg-12 mb-3 ">
<div class="row">
<div class="col-9">
<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 class="col-lg-12 mb-3">
<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>
<div class="col-lg-12">
<div class="table-responsive">
{% po_item_table1 po_items %}
</div>
</div>
<div class="col-lg-12">
<div class="table-responsive">
{% po_item_table1 po_items %}
</div>
</div>
</div>
</div>

View File

@ -82,16 +82,23 @@
</div>
</div>
<div class="d-flex align-items-center gap-2">
{% if perms.django_ledger.change_invoicemodel%}
{% if invoice.invoice_status == 'in_review' %}
<button id="accept_invoice" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Accept' %}</span></button>
{% endif %}
{% if invoice.invoice_status == 'approved' %}
{% if perms.inventory.add_payment%}
<a href="{% url 'payment_create' request.dealer.slug invoice.pk %}" class="btn btn-phoenix-success"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-money-bill"></i> {% trans 'Record Payment' %}</span></a>
{% endif %}
{% endif %}
{% if not invoice.is_paid %}
{% if perms.inventory.change_payment%}
<button {% if invoice.is_review or invoice.amount_paid|to_int < invoice.amount_due|to_int %}disabled{% endif %} id="mark_invoice_as_paid" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#mark_as_paid_Modal"><span class="d-none d-sm-inline-block"><span class="icon-saudi_riyal"></span> {% trans 'Mark as Paid' %}</span></button>
{% endif %}
{% endif %}
{% endif %}
<a href="{% url 'invoice_preview' request.dealer.slug invoice.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-regular fa-eye"></i> {% trans 'Preview' %}</span></a>
</div>
</div>
{{invoice.amount_owned}}