update
This commit is contained in:
parent
d085940fca
commit
533300b0ed
@ -1185,6 +1185,9 @@ class Staff(models.Model, LocalizedNameMixin):
|
|||||||
return self.staff_member.user
|
return self.staff_member.user
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
def groups(self):
|
||||||
|
return [x.customgroup for x in self.user.groups.all()]
|
||||||
|
@property
|
||||||
def groups(self):
|
def groups(self):
|
||||||
return [x.customgroup for x in self.user.groups.all()]
|
return [x.customgroup for x in self.user.groups.all()]
|
||||||
|
|
||||||
|
|||||||
@ -1145,6 +1145,7 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
|||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
@permission_required("inventory.view_car")
|
||||||
def inventory_stats_view(request, dealer_slug):
|
def inventory_stats_view(request, dealer_slug):
|
||||||
"""
|
"""
|
||||||
Handle the inventory stats view for a dealer, displaying detailed information
|
Handle the inventory stats view for a dealer, displaying detailed information
|
||||||
@ -1161,7 +1162,7 @@ def inventory_stats_view(request, dealer_slug):
|
|||||||
"inventory/inventory_stats.html" template.
|
"inventory/inventory_stats.html" template.
|
||||||
:rtype: HttpResponse
|
:rtype: HttpResponse
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Base queryset for cars belonging to the dealer
|
# Base queryset for cars belonging to the dealer
|
||||||
cars = models.Car.objects.filter(dealer=request.dealer)
|
cars = models.Car.objects.filter(dealer=request.dealer)
|
||||||
|
|
||||||
|
|||||||
@ -31,9 +31,10 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for group in groups %}
|
{% for group in groups %}
|
||||||
|
{{group.users}}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td>
|
<td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td>
|
||||||
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count|subtract:1}}</td>
|
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count}}</td>
|
||||||
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td>
|
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td>
|
||||||
<td class="align-middle white-space-nowrap">
|
<td class="align-middle white-space-nowrap">
|
||||||
<a class="btn btn-phoenix-success"
|
<a class="btn btn-phoenix-success"
|
||||||
|
|||||||
@ -30,8 +30,9 @@
|
|||||||
</li>
|
</li>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="nav-item">
|
|
||||||
|
|
||||||
|
{% if perms.inventory.view_car%}
|
||||||
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}">
|
<a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span>
|
<span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span>
|
||||||
@ -45,6 +46,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if perms.inventory.add_car %}
|
{% if perms.inventory.add_car %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}">
|
<a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}">
|
||||||
@ -120,7 +123,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if perms.django_ledger.view_customermodel %}
|
{% if perms.inventory.view_lead %}
|
||||||
<div class="nav-item-wrapper">
|
<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">
|
<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">
|
<div class="d-flex align-items-center">
|
||||||
@ -146,6 +149,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{%if perms.inventory.view_opportunity %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}">
|
<a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
@ -154,7 +159,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.django_ledger.view_customermodel %}
|
{% if perms.inventory.view_customer %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'customer_list' request.dealer.slug %}">
|
<a class="nav-link" href="{% url 'customer_list' request.dealer.slug %}">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
@ -163,6 +168,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if perms.inventory.view_organization %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}">
|
<a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
@ -171,6 +177,7 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% comment %} <li class="nav-item">
|
{% comment %} <li class="nav-item">
|
||||||
<a class="nav-link" href="{% url 'representative_list' %}">
|
<a class="nav-link" href="{% url 'representative_list' %}">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
|
|||||||
@ -75,6 +75,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<!-- Main row -->
|
<!-- Main row -->
|
||||||
|
{% if perms.inventory.view_car %}
|
||||||
<div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}">
|
<div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}">
|
||||||
<div class="row g-3 justify-content-between">
|
<div class="row g-3 justify-content-between">
|
||||||
<div class="col-lg-12 col-xl-6">
|
<div class="col-lg-12 col-xl-6">
|
||||||
@ -242,7 +243,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-xl-6">
|
<div class="col-lg-6 col-xl-6">
|
||||||
|
|
||||||
|
{% if perms.inventory.view_carfinance%}
|
||||||
<div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}">
|
<div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}">
|
||||||
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
|
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@ -283,27 +289,31 @@
|
|||||||
<th>{% trans "Total"|capfirst %}</th>
|
<th>{% trans "Total"|capfirst %}</th>
|
||||||
<td>{{ car.finances.total_vat|floatformat:2 }}</td>
|
<td>{{ car.finances.total_vat|floatformat:2 }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{% if perms.inventory.change_carfinance%}
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
{% if not car.get_transfer %}
|
{% if not car.get_transfer %}
|
||||||
<a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}"
|
<a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}" class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
|
||||||
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
|
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans "No finance details available." %}</p>
|
<p>{% trans "No finance details available." %}</p>
|
||||||
{% if perms.inventory.add_carfinance %}
|
{% if perms.inventory.add_carfinance %}
|
||||||
<a href="{% url 'car_finance_create' request.dealer.slug car.slug %}"
|
<a href="{% url 'car_finance_create' request.dealer.slug car.slug %}"
|
||||||
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
|
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if perms.inventory.view_carcolors %}
|
||||||
<div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}">
|
<div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}">
|
||||||
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
|
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@ -332,7 +342,8 @@
|
|||||||
style="background-color: rgb({{ car.colors.interior.rgb }})"></div>
|
style="background-color: rgb({{ car.colors.interior.rgb }})"></div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
{% if perms.inventory.change_carcolors%}
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
{% if not car.get_transfer %}
|
{% if not car.get_transfer %}
|
||||||
@ -343,8 +354,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<p>{% trans "No color details available." %}</p>
|
<p>{% trans "No color details available." %}</p>
|
||||||
@ -352,7 +364,7 @@
|
|||||||
<a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
|
<a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<!--test-->
|
<!--test-->
|
||||||
|
|
||||||
@ -360,7 +372,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% if car.status != 'transfer' %}
|
{% if car.status != 'transfer' %}
|
||||||
|
{%if perms.inventory.view_carreservation%}
|
||||||
<div class="card rounded shadow d-flex align-content-center mt-3">
|
<div class="card rounded shadow d-flex align-content-center mt-3">
|
||||||
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
|
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@ -379,6 +393,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{ reservation.reserved_by.dealer }}</td>
|
<td>{{ reservation.reserved_by.dealer }}</td>
|
||||||
<td>{{ reservation.reserved_until }}</td>
|
<td>{{ reservation.reserved_until }}</td>
|
||||||
|
{% if perms.inventory.change_carreservation %}
|
||||||
<td>
|
<td>
|
||||||
{% if reservation.is_active %}
|
{% if reservation.is_active %}
|
||||||
<form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}">
|
<form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}">
|
||||||
@ -402,27 +417,30 @@
|
|||||||
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
|
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
{% endif %}
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
{% if perms.inventory.add_carreservation %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{% if perms.inventory.change_carreservation %}
|
|
||||||
<button type="button"
|
<button type="button"
|
||||||
class="btn btn-sm btn-phoenix-success"
|
class="btn btn-sm btn-phoenix-success"
|
||||||
data-bs-toggle="modal"
|
data-bs-toggle="modal"
|
||||||
data-bs-target="#reserveModal">
|
data-bs-target="#reserveModal">
|
||||||
{% trans 'Reserve' %}
|
{% trans 'Reserve' %}
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
{% endif %}
|
||||||
{% endif %}
|
|
||||||
|
</tbody>
|
||||||
|
{% endif %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<!-- Transfer Table -->
|
<!-- Transfer Table -->
|
||||||
{% if car.status == 'transfer' and car.get_transfer %}
|
{% if car.status == 'transfer' and car.get_transfer %}
|
||||||
@ -483,6 +501,7 @@
|
|||||||
alt="">
|
alt="">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Custom Card Modal -->
|
<!-- Custom Card Modal -->
|
||||||
<div class="modal fade"
|
<div class="modal fade"
|
||||||
id="customCardModal"
|
id="customCardModal"
|
||||||
@ -583,6 +602,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
const csrftoken = getCookie("csrftoken");
|
const csrftoken = getCookie("csrftoken");
|
||||||
|
|||||||
@ -272,9 +272,13 @@
|
|||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
<div class="dropdown-menu dropdown-menu-end py-2">
|
||||||
<a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a>
|
<a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a>
|
||||||
|
{% if perms.inventory.change_car%}
|
||||||
<a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a>
|
<a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.inventory.delete_car%}
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a>
|
<a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -80,7 +80,7 @@
|
|||||||
<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>
|
<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>
|
||||||
<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 Sent' %}</span></button>
|
<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 Sent' %}</span></button>
|
||||||
{% elif estimate.status == 'in_review' %}
|
{% elif estimate.status == 'in_review' %}
|
||||||
{% if perms.django_ledger.can_approve_estimatemodel %}
|
{% if perms.django_ledger.can_approve_estimate %}
|
||||||
<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 Accept' %}</span></button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% elif estimate.status == 'approved' %}
|
{% elif estimate.status == 'approved' %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user