This commit is contained in:
Faheedkhan 2025-07-03 14:55:21 +03:00
commit 4f2e4d8bb1
14 changed files with 379 additions and 570 deletions

View File

@ -18,6 +18,7 @@ from django_ledger.models import (
ItemModel,
CustomerModel,
JournalEntryModel,
LedgerModel
)
from django_ledger.io.io_core import get_localdate
from django.core.exceptions import ValidationError
@ -2549,11 +2550,21 @@ class CustomGroup(models.Model):
pass
def set_default_permissions(self):
est = ContentType.objects.get_for_model(EstimateModel)
bill = ContentType.objects.get_for_model(BillModel)
Permission.objects.get_or_create(name="Can approve estimate",codename="can_approve_estimate",content_type=est)
Permission.objects.get_or_create(name="Can approve bill",codename="can_approve_bill",content_type=bill)
Permission.objects.get_or_create(name="Can approve estimate",codename="can_approve_estimatemodel",content_type=ContentType.objects.get_for_model(EstimateModel))
Permission.objects.get_or_create(name="Can approve bill",codename="can_approve_billmodel",content_type=ContentType.objects.get_for_model(BillModel))
Permission.objects.get_or_create(name="Can view inventory",codename="can_view_inventory",content_type=ContentType.objects.get_for_model(Car))
Permission.objects.get_or_create(name="Can view sales",codename="can_view_sales",content_type=ContentType.objects.get_for_model(EstimateModel))
Permission.objects.get_or_create(name="Can view crm",codename="can_view_crm",content_type=ContentType.objects.get_for_model(Lead))
Permission.objects.get_or_create(name="Can view financials",codename="can_view_financials",content_type=ContentType.objects.get_for_model(AccountModel))
Permission.objects.get_or_create(name="Can view reports",codename="can_view_reports",content_type=ContentType.objects.get_for_model(LedgerModel))
self.clear_permissions()
######################################
######################################
#MANAGER
######################################
######################################
if self.name == "Manager":
self.set_permissions(
app="inventory",
@ -2568,11 +2579,6 @@ class CustomGroup(models.Model):
"interiorcolors",
"exteriorcolors",
"carreservation",
],
)
self.set_permissions(
app="inventory",
allowed_models=[
"lead",
"customgroup",
"saleorder",
@ -2581,6 +2587,11 @@ class CustomGroup(models.Model):
"schedule",
"activity",
"opportunity",
"vendor",
"customer"
"notes",
"tasks",
"activity",
],
)
self.set_permissions(
@ -2592,10 +2603,20 @@ class CustomGroup(models.Model):
"chartofaccountmodel",
"customermodel",
"billmodel",
"can_approve_estimate"
"can_approve_bill",
"bankaccountmodel",
"itemmodel",
"vendormodel",
"journalentrymodel",
"purchaseordermodel",
],
other_perms=["can_approve_estimatemodel","can_approve_billmodel","can_view_inventory","can_view_sales","can_view_crm","can_view_financials","can_view_reports"],
)
######################################
######################################
#Inventory
######################################
######################################
elif self.name == "Inventory":
self.set_permissions(
app="inventory",
@ -2608,14 +2629,29 @@ class CustomGroup(models.Model):
"carlocation",
"customcard",
"carreservation",
"notes",
"tasks",
"activity",
],
)
self.set_permissions(
app="django_ledger",
allowed_models=[],
other_perms=[
"view_purchaseordermodel",
"can_view_financials",
]
)
######################################
######################################
#Sales
######################################
######################################
elif self.name == "Sales":
self.set_permissions(
app="django_ledger",
allowed_models=["estimatemodel", "invoicemodel", "customermodel"],
)
self.set_permissions(
app="inventory",
allowed_models=[
@ -2627,23 +2663,34 @@ class CustomGroup(models.Model):
"opportunity",
"customer",
"organization",
"notes",
"taska",
"activity",
],
)
self.set_permissions(
app="inventory",
allowed_models=["lead", "salequotation", "salequotationcar"],
other_perms=[
"view_car",
"view_carlocation",
"view_customcard",
"view_carcolors",
"view_cartransfer",
"can_view_inventory",
"can_view_sales",
"can_view_crm",
],
)
######################################
######################################
#Accountant
######################################
######################################
elif self.name == "Accountant":
self.set_permissions(
app="inventory",
allowed_models=["carfinance"],
allowed_models=[
"carfinance",
"notes",
"tasks",
"activity",],
other_perms=[
"view_car",
"view_carlocation",
@ -2651,6 +2698,7 @@ class CustomGroup(models.Model):
"view_carcolors",
"view_cartransfer",
"view_saleorder",
],
)
self.set_permissions(
@ -2659,19 +2707,20 @@ class CustomGroup(models.Model):
"bankaccountmodel",
"accountmodel",
"chartofaccountmodel",
"customcard",
"billmodel",
"itemmodel",
"invoicemodel",
"vendormodel",
"journalentrymodel",
"purchaseordermodel",
"estimatemodel",
"customermodel",
"vendormodel",
"TransactionModel"
],
other_perms=["view_customermodel", "view_estimatemodel","can_approve_estimatemodel","can_approve_billmodel"],
other_perms=["view_customermodel", "view_estimatemodel","can_view_inventory","can_view_sales","can_view_crm","can_view_financials","can_view_reports"],
)
elif self.name == "Agent":
# Todo : set permissions for agent
pass
def set_permissions(self, app="inventory", allowed_models=[], other_perms=[]):
try:
@ -2878,7 +2927,7 @@ class ExtraInfo(models.Model):
on_delete=models.CASCADE,
related_name="extra_info_primary"
)
object_id = models.PositiveIntegerField()
object_id = models.CharField(max_length=255, null=True, blank=True)
content_object = GenericForeignKey('content_type', 'object_id')
# Secondary GenericForeignKey (optional additional link)
@ -2889,7 +2938,7 @@ class ExtraInfo(models.Model):
blank=True,
related_name="extra_info_secondary"
)
related_object_id = models.PositiveIntegerField(null=True, blank=True)
related_object_id = models.CharField(max_length=255, null=True, blank=True)
related_object = GenericForeignKey('related_content_type', 'related_object_id')
# JSON Data Storage

View File

@ -6,6 +6,7 @@ from django.contrib.auth.models import Group
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import get_user_model
from django_ledger.io import roles
from django_ledger.models import (
@ -989,8 +990,8 @@ def lead_created_notification(sender, instance, created, **kwargs):
@receiver(post_save, sender=EstimateModel)
def estimate_in_review_notification(sender, instance, created, **kwargs):
if instance.is_review():
recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
dealer = models.Dealer.objects.get(entity=instance.entity)
recipients = models.CustomGroup.objects.filter(dealer=dealer,name="Manager").first().group.user_set.exclude(email=dealer.user.email)
for recipient in recipients:
models.Notification.objects.create(
user=recipient,
@ -1003,16 +1004,22 @@ def estimate_in_review_notification(sender, instance, created, **kwargs):
@receiver(post_save, sender=EstimateModel)
def estimate_in_approve_notification(sender, instance, created, **kwargs):
if instance.is_approved():
recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
dealer = models.Dealer.objects.get(entity=instance.entity)
for recipient in recipients:
models.Notification.objects.create(
user=recipient,
message=f"""
Estimate {instance.estimate_number} is in review.
Please review and approve it at your earliest convenience.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
""")
recipient = models.ExtraInfo.objects.filter(
content_type=ContentType.objects.get_for_model(EstimateModel),
related_content_type=ContentType.objects.get_for_model(models.Staff),
object_id=instance.pk,
).first()
models.Notification.objects.create(
user=recipient.related_object.user,
message=f"""
Estimate {instance.estimate_number} has been approved.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
"""
)
# @receiver(post_save, sender=models.Lead)
# def lead_created_notification(sender, instance, created, **kwargs):

View File

@ -816,6 +816,8 @@ urlpatterns = [
name="bill-update-items",
),
############################################################
############################################################
#BILL MARK AS
path(
"<slug:dealer_slug>/items/bills/<slug:entity_slug>/actions/<uuid:bill_pk>/mark-as-draft/",
views.BillModelActionMarkAsDraftView.as_view(),
@ -861,33 +863,7 @@ urlpatterns = [
views.BillModelActionForceMigrateView.as_view(),
name="bill-action-force-migrate",
),
# path("items/bills/create/", views.bill_create, name="bill_create"),
path(
"items/bills/<uuid:pk>/bill_detail/",
views.BillDetailView.as_view(),
name="bill_detail",
),
path("items/bills/<uuid:pk>/delete/", views.BillDeleteView, name="bill_delete"),
path(
"items/bills/<uuid:pk>/in_review/",
views.InReviewBillView.as_view(),
name="in_review_bill",
),
path(
"items/bills/<uuid:pk>/in_approve/",
views.ApprovedBillModelView.as_view(),
name="in_approve_bill",
),
path(
"items/bills/<uuid:pk>/mark_as_approved/",
views.bill_mark_as_approved,
name="bill_mark_as_approved",
),
path(
"items/bills/<uuid:pk>/mark_as_paid/",
views.bill_mark_as_paid,
name="bill_mark_as_paid",
),
# orders
path("orders/", views.OrderListView.as_view(), name="order_list_view"),
# BALANCE SHEET Reports...

File diff suppressed because it is too large Load Diff

View File

@ -16,8 +16,6 @@
{% block body %}
<div class="main-container">
<div class="body-container">
<form method="post"
action="{% url 'appointment:appointment_client_information' ar.id ar.get_id_request %}"
class="page-body">

View File

@ -12,7 +12,6 @@
{{ page_description }}
{% endblock %}
{% block body %}
<div class="row">
<div class="col-xl-12">
<h3 class="page-title">

View File

@ -10,6 +10,7 @@
<li class="nav-item">
<p class="navbar-vertical-label">Apps</p>
<hr class="navbar-vertical-line" />
{% if perms.inventory.can_view_inventory %}
<div class="nav-item-wrapper">
<a id="inventory-nav" class="nav-link dropdown-indicator label-1 inventory-nav" href="#nv-inventory" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-inventory">
<div class="d-flex align-items-center">
@ -60,8 +61,9 @@
</ul>
</div>
</div>
{% endif %}
{% if perms.django_ledger.view_estimatemodel %}
{% if perms.django_ledger.can_view_sales %}
<div class="nav-item-wrapper">
<a class="nav-link dropdown-indicator label-1" href="#nv-sales" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-sales">
<div class="d-flex align-items-center">
@ -124,7 +126,7 @@
</div>
{% endif %}
{% if perms.inventory.view_lead or perms.inventory.view_oportunity or perms.inventory.view_customer or perms.inventory.view_organization %}
{% if perms.inventory.can_view_crm %}
<div class="nav-item-wrapper">
<a class="nav-link dropdown-indicator label-1" href="#nv-crm" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-crm">
<div class="d-flex align-items-center">
@ -196,9 +198,9 @@
</ul>
</div>
</div>
{% endif %}
{% if perms.django_ledger.view_accountmodel %}
{% if perms.django_ledger.can_view_financials %}
<div class="nav-item-wrapper">
<a class="nav-link dropdown-indicator label-1" href="#nv-financial" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-financial">
<div class="d-flex align-items-center">
@ -276,19 +278,20 @@
</li>
{% endif %}
{% if perms.django_ledger.view_purchaseordermodel %}
{% if perms.django_ledger.view_purchaseorder %}
<li class="nav-item">
<a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "purchase Orders"|capfirst %}</span>
</div>
</a>
<a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "purchase Orders"|capfirst %}</span>
</div>
</a>
</li>
{% endif %}
</ul>
</div>
</div>
</ul>
</div>
</div>
{% endif %}
{% if perms.django_ledger.can_view_reports %}
<div class="nav-item-wrapper">
<a class="nav-link dropdown-indicator label-1" href="#nv-reports" role="button" data-bs-toggle="collapse" aria-expanded="false" aria-controls="nv-reports">
<div class="d-flex align-items-center">
@ -302,7 +305,7 @@
<ul class="nav collapse parent" data-bs-parent="#navbarVerticalCollapse" id="nv-reports">
<li class="nav-item">
{% if request.user.is_authenticated and request.is_dealer %}
<a class="nav-link" href="{% url 'entity-dashboard' request.user.dealer.entity.slug %}">
<a class="nav-link" href="{% url 'entity-dashboard' request.dealer.entity.slug %}">
{% elif request.user.is_authenticated and request.is_staff %}
<a class="nav-link" href="{% url 'entity-dashboard' request.user.staffmember.staff.dealer.entity.slug %}">
{% else %}
@ -343,12 +346,12 @@
</ul>
</div>
{% endif %}
{% endif %}
</div>
</div>
</li>
</ul>
</div>
</ul>
{% endif %}
</div>
</div>
{% endif %}
<div class="navbar-vertical-footer">
@ -440,7 +443,7 @@
<ul class="nav d-flex flex-column mb-2 pb-1">
{% if request.is_dealer %}
<li class="nav-item">
<a class="nav-link px-3 d-block" href="{% url 'dealer_detail' request.user.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="user"></span><span>{% translate 'profile'|capfirst %}</span></a>
<a class="nav-link px-3 d-block" href="{% url 'dealer_detail' request.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="user"></span><span>{% translate 'profile'|capfirst %}</span></a>
</li>
{% else %}
<li class="nav-item">
@ -457,7 +460,7 @@
{% endif %}
<li class="nav-item">
{% if request.is_dealer %}
<a class="nav-link px-3 d-block" href="{% url 'dealer_settings' request.user.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="settings"></span>{{ _("Settings") }}</a>
<a class="nav-link px-3 d-block" href="{% url 'dealer_settings' request.dealer.slug %}"> <span class="me-2 text-body align-bottom" data-feather="settings"></span>{{ _("Settings") }}</a>
{% endif %}
</li>
<li class="nav-item">

View File

@ -4,7 +4,7 @@
{% if request.user.is_authenticated %}
<div
id="dashboard-content"
hx-get="{% if request.user.dealer %}{% url 'manager_dashboard' %}{% else %}{% url 'sales_dashboard' %}{% endif %}"
hx-get="{% if request.dealer %}{% url 'manager_dashboard' %}{% else %}{% url 'sales_dashboard' %}{% endif %}"
hx-trigger="load"
hx-target="#dashboard-content"
hx-swap="innerHTML"

View File

@ -255,7 +255,7 @@
async function get_data(){
console.log('{{ request.user }}');
const response = await fetch("{% url 'entity-json-net-receivables' request.user.dealer.entity.slug %}");
const response = await fetch("{% url 'entity-json-net-receivables' request.dealer.entity.slug %}");
data = await response.json();
console.log(data);
const keys = Object.keys(data.results.net_receivable_data);
@ -269,9 +269,9 @@
const end_date = document.getElementById('endDate').value;
let url = ''
if(!start_date || !end_date){
url = "{% url 'entity-json-pnl' request.user.dealer.entity.slug %}";
url = "{% url 'entity-json-pnl' request.dealer.entity.slug %}";
}else{
url = `{% url 'entity-json-pnl' request.user.dealer.entity.slug %}?fromDate=${start_date}&toDate=${end_date}`;
url = `{% url 'entity-json-pnl' request.dealer.entity.slug %}?fromDate=${start_date}&toDate=${end_date}`;
}
try {
const response = await fetch(url);

View File

@ -114,14 +114,14 @@
<label class="form-label" for="phone">{{ _("Phone Number")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-phone"></i></span>
<input type="text" name="phone" id="phone" class="form-control form-control-sm" dir="ltr" placeholder="{{ _("Phone Number")}}" value="{{ request.user.dealer.phone_number.raw_input }}" required>
<input type="text" name="phone" id="phone" class="form-control form-control-sm" dir="ltr" placeholder="{{ _("Phone Number")}}" value="{{ request.dealer.phone_number.raw_input }}" required>
</div>
</div>
<div class="col-md-6">
<label class="form-label" for="company">{{ _("Company") }}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-building"></i></span>
<input type="text" name="company" id="company" class="form-control form-control-sm" placeholder="{{ _("Company") }}" value="{{ request.user.dealer.get_local_name }}">
<input type="text" name="company" id="company" class="form-control form-control-sm" placeholder="{{ _("Company") }}" value="{{ request.dealer.get_local_name }}">
</div>
</div>
</div>

View File

@ -20,8 +20,10 @@
</h2>
{% if perms.django_ledger.add_purchaseordermodel%}
<div>
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
{% if perms.django_ledger.add_purchaseordermodel %}
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
{% endif %}
</div>
{% endif %}
</div>
@ -67,7 +69,9 @@
<div class="btn-reveal-trigger position-static">
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a>
{% if perms.django_ledger.change_purchaseordermodel %}
<a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a>
{% endif %}
{% if po.po_status == 'fulfilled' %}
{% if perms.inventory.add_car %}
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'Add Inventory Items' %}</a>

View File

@ -75,14 +75,13 @@
</div>
</div>
<div class="d-flex align-items-center gap-2">
{% if estimate.status == 'draft' %}
{% if perms.django_ledger.change_estimatemodel %}
<button id="mark_as_sent_estimate" class="btn btn-phoenix-secondary" onclick="setFormAction('review')" 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 'Mark As Review' %}</span></button>
{% endif %}
{% elif estimate.status == 'in_review' %}
{% if perms.django_ledger.can_approve_estimatemodel %}
<button id="accept_estimate" onclick="setFormAction('approved')" 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 'Mark As Accept' %}</span></button>
<button id="accept_estimate" onclick="setFormAction('approved')" 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 'Mark As Approved' %}</span></button>
{% endif %}
{% elif estimate.status == 'approved' %}
{% if perms.django_ledger.change_estimatemodel %}
@ -90,7 +89,7 @@
{% endif %}
{% if estimate.sale_orders.first %}
<!--if sale order exist-->
{% if perms.djagno_ledger.add_invoice %}
{% if perms.django_ledger.add_invoicemodel %}
<a href="{% url 'invoice_create' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'Create Invoice' %}</span></a>
{% endif %}
{% if perms.inventory.view_saleorder%}

View File

@ -20,31 +20,31 @@
</tr>
</thead>
<tbody class="list">
{% for estimate in estimates %}
{% for extra in staff_estimates %}
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
<td class="align-middle product white-space-nowrap py-0 px-1">{{ estimate.estimate_number }}</td>
<td class="align-middle product white-space-nowrap">{{ estimate.customer.customer_name }}</td>
<td class="align-middle product white-space-nowrap py-0 px-1">{{ extra.content_object.estimate_number }}</td>
<td class="align-middle product white-space-nowrap">{{ extra.content_object.customer.customer_name }}</td>
<td class="align-middle product white-space-nowrap">
{% if estimate.status == 'draft' %}
{% if extra.content_object.status == 'draft' %}
<span class="badge badge-phoenix badge-phoenix-warning">{% trans "Draft" %}</span>
{% elif estimate.status == 'in_review' %}
{% elif extra.content_object.status == 'in_review' %}
<span class="badge badge-phoenix badge-phoenix-info">{% trans "In Review" %}</span>
{% elif estimate.status == 'approved' %}
{% elif extra.content_object.status == 'approved' %}
<span class="badge badge-phoenix badge-phoenix-success">{% trans "Approved" %}</span>
{% elif estimate.status == 'declined' %}
{% elif extra.content_object.status == 'declined' %}
<span class="badge badge-phoenix badge-phoenix-danger">{% trans "Declined" %}</span>
{% elif estimate.status == 'canceled' %}
{% elif extra.content_object.status == 'canceled' %}
<span class="badge badge-phoenix badge-phoenix-danger">{% trans "Canceled" %}</span>
{% elif estimate.status == 'completed' %}
{% elif extra.content_object.status == 'completed' %}
<span class="badge badge-phoenix badge-phoenix-success">{% trans "Completed" %}</span>
{% elif estimate.status == 'void' %}
{% elif extra.content_object.status == 'void' %}
<span class="badge badge-phoenix badge-phoenix-secondary">{% trans "Void" %}</span>
{% endif %}
</td>
<td class="align-middle product white-space-nowrap">{{ estimate.get_status_action_date }}</td>
<td class="align-middle product white-space-nowrap">{{ estimate.created }}</td>
<td class="align-middle product white-space-nowrap">{{ extra.content_object.get_status_action_date }}</td>
<td class="align-middle product white-space-nowrap">{{ extra.content_object.created }}</td>
<td class="align-middle product white-space-nowrap">
<a href="{% url 'estimate_detail' request.dealer.slug estimate.pk %}"
<a href="{% url 'estimate_detail' request.dealer.slug extra.content_object.pk %}"
class="btn btn-sm btn-phoenix-success">
<i class="fa-regular fa-eye me-1"></i>
{% trans "view"|capfirst %}

View File

@ -86,12 +86,12 @@
<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' %}
<a href="{% url 'payment_create' request.user.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>
<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 %}
{% if not invoice.is_paid %}
<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 %}
<a href="{% url 'invoice_preview' request.user.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>
<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}}