update permissions
This commit is contained in:
parent
1e50cad90c
commit
e5a088324f
@ -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
|
||||
@ -2546,11 +2547,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",
|
||||
@ -2565,11 +2576,6 @@ class CustomGroup(models.Model):
|
||||
"interiorcolors",
|
||||
"exteriorcolors",
|
||||
"carreservation",
|
||||
],
|
||||
)
|
||||
self.set_permissions(
|
||||
app="inventory",
|
||||
allowed_models=[
|
||||
"lead",
|
||||
"customgroup",
|
||||
"saleorder",
|
||||
@ -2578,6 +2584,11 @@ class CustomGroup(models.Model):
|
||||
"schedule",
|
||||
"activity",
|
||||
"opportunity",
|
||||
"vendor",
|
||||
"customer"
|
||||
"notes",
|
||||
"tasks",
|
||||
"activity",
|
||||
],
|
||||
)
|
||||
self.set_permissions(
|
||||
@ -2589,10 +2600,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",
|
||||
@ -2605,14 +2626,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=[
|
||||
@ -2624,23 +2660,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",
|
||||
@ -2648,6 +2695,7 @@ class CustomGroup(models.Model):
|
||||
"view_carcolors",
|
||||
"view_cartransfer",
|
||||
"view_saleorder",
|
||||
|
||||
],
|
||||
)
|
||||
self.set_permissions(
|
||||
@ -2656,19 +2704,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:
|
||||
@ -2875,7 +2924,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)
|
||||
@ -2886,7 +2935,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
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
@ -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">
|
||||
|
||||
@ -12,7 +12,6 @@
|
||||
{{ page_description }}
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<h3 class="page-title">
|
||||
|
||||
@ -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">
|
||||
@ -57,8 +58,9 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if perms.inventory.view_lead or perms.django_ledger.view_invoicemodel %}
|
||||
{% 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">
|
||||
@ -120,7 +122,7 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if perms.inventory.view_lead %}
|
||||
{% 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">
|
||||
@ -154,7 +156,7 @@
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if perms.django_ledger.view_customermodel %}
|
||||
{% if perms.inventory.view_customer %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'customer_list' request.dealer.slug %}">
|
||||
<div class="d-flex align-items-center">
|
||||
@ -190,7 +192,7 @@
|
||||
</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">
|
||||
@ -263,17 +265,20 @@
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% 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>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</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">
|
||||
@ -287,7 +292,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 %}
|
||||
@ -328,12 +333,12 @@
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="navbar-vertical-footer">
|
||||
<button class="btn navbar-vertical-toggle border-0 fw-semibold w-100 white-space-nowrap d-flex align-items-center">
|
||||
@ -424,7 +429,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">
|
||||
@ -441,7 +446,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">
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -19,8 +19,10 @@
|
||||
{{ _("Purchase Orders") |capfirst }}
|
||||
</h2>
|
||||
<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>
|
||||
</div>
|
||||
{% include "partials/search_box.html" %}
|
||||
@ -65,7 +67,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' %}
|
||||
<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>
|
||||
{% else %}
|
||||
|
||||
@ -75,21 +75,20 @@
|
||||
</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' %}
|
||||
<a href="{% url 'send_email' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary me-2"><span class="fa-regular fa-paper-plane me-sm-2"></span><span class="d-none d-sm-inline-block">{% trans 'Send Quotation' %}</span></a>
|
||||
|
||||
{% 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 %}
|
||||
<a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a>
|
||||
|
||||
@ -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 %}
|
||||
|
||||
@ -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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user