Merge pull request 'title and notification history update' (#226) from frontend into main
Reviewed-on: #226
This commit is contained in:
commit
df069d882d
@ -829,6 +829,7 @@ class Car(Base):
|
|||||||
def mark_as_sold(self):
|
def mark_as_sold(self):
|
||||||
self.cancel_reservation()
|
self.cancel_reservation()
|
||||||
self.status = CarStatusChoices.SOLD
|
self.status = CarStatusChoices.SOLD
|
||||||
|
self.sold_date=timezone.now()
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def cancel_reservation(self):
|
def cancel_reservation(self):
|
||||||
|
|||||||
@ -985,7 +985,9 @@ def send_schedule_reminder_email(schedule_id):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
schedule = Schedule.objects.get(pk=schedule_id)
|
schedule = Schedule.objects.get(pk=schedule_id)
|
||||||
|
if schedule.completed:
|
||||||
|
logger.info("Schedule is already completed, existing.")
|
||||||
|
return
|
||||||
# Ensure the user has an email and the schedule is not completed/canceled
|
# Ensure the user has an email and the schedule is not completed/canceled
|
||||||
if not schedule.scheduled_by.email or schedule.status in [
|
if not schedule.scheduled_by.email or schedule.status in [
|
||||||
"completed",
|
"completed",
|
||||||
|
|||||||
@ -11,9 +11,11 @@ urlpatterns = [
|
|||||||
path("", views.WelcomeView, name="welcome"),
|
path("", views.WelcomeView, name="welcome"),
|
||||||
path("signup/", views.dealer_signup, name="account_signup"),
|
path("signup/", views.dealer_signup, name="account_signup"),
|
||||||
path("", views.HomeView, name="home"),
|
path("", views.HomeView, name="home"),
|
||||||
|
path('refund-policy/',views.refund_policy,name='refund_policy'),
|
||||||
path("<slug:dealer_slug>/", views.HomeView, name="home"),
|
path("<slug:dealer_slug>/", views.HomeView, name="home"),
|
||||||
# Tasks
|
# Tasks
|
||||||
path("legal/", views.terms_and_privacy, name="terms_and_privacy"),
|
path("legal/", views.terms_and_privacy, name="terms_and_privacy"),
|
||||||
|
|
||||||
# path('tasks/<int:task_id>/detail/', views.task_detail, name='task_detail'),
|
# path('tasks/<int:task_id>/detail/', views.task_detail, name='task_detail'),
|
||||||
# Dashboards
|
# Dashboards
|
||||||
# path("user/<int:pk>/settings/", views.UserSettingsView.as_view(), name="user_settings"),
|
# path("user/<int:pk>/settings/", views.UserSettingsView.as_view(), name="user_settings"),
|
||||||
|
|||||||
@ -359,7 +359,7 @@ def dealer_signup(request):
|
|||||||
return JsonResponse({"error": str(e)}, status=400)
|
return JsonResponse({"error": str(e)}, status=400)
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"account/signup-wizard.html",
|
"account/signup-wizar.html",
|
||||||
)
|
)
|
||||||
|
|
||||||
# class HomeView(LoginRequiredMixin, TemplateView):
|
# class HomeView(LoginRequiredMixin, TemplateView):
|
||||||
@ -1402,7 +1402,7 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
|||||||
template_name = "inventory/car_list_view.html"
|
template_name = "inventory/car_list_view.html"
|
||||||
context_object_name = "cars"
|
context_object_name = "cars"
|
||||||
paginate_by = 10
|
paginate_by = 10
|
||||||
permission_required = "inventory.view_carcolors"
|
permission_required = "inventory.view_car"
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
@ -1422,7 +1422,6 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
|||||||
context["year"] = models.Car.objects.none()
|
context["year"] = models.Car.objects.none()
|
||||||
make = self.request.GET.get("make")
|
make = self.request.GET.get("make")
|
||||||
model = self.request.GET.get("model")
|
model = self.request.GET.get("model")
|
||||||
|
|
||||||
if make:
|
if make:
|
||||||
make_ = models.CarMake.objects.get(id_car_make=int(make))
|
make_ = models.CarMake.objects.get(id_car_make=int(make))
|
||||||
context["model"] = make_.carmodel_set.filter(car__in=cars).distinct()
|
context["model"] = make_.carmodel_set.filter(car__in=cars).distinct()
|
||||||
@ -1440,15 +1439,16 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
|||||||
dealer = get_user_type(self.request)
|
dealer = get_user_type(self.request)
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
qs = qs.filter(dealer=dealer)
|
qs = qs.filter(dealer=dealer)
|
||||||
status = self.request.GET.get("status")
|
# status = self.request.GET.get("status")
|
||||||
search = self.request.GET.get("search")
|
search = self.request.GET.get("search")
|
||||||
make = self.request.GET.get("make", None)
|
make = self.request.GET.get("make", None)
|
||||||
model = self.request.GET.get("model", None)
|
model = self.request.GET.get("model", None)
|
||||||
year = self.request.GET.get("year", None)
|
year = self.request.GET.get("year", None)
|
||||||
car_status = self.request.GET.get("car_status", None)
|
car_status = self.request.GET.get("car_status", None)
|
||||||
|
print("ALLLLLLLLL:::",make,model)
|
||||||
|
|
||||||
if status:
|
if car_status:
|
||||||
qs = qs.filter(status=status)
|
qs = qs.filter(status=car_status)
|
||||||
if search:
|
if search:
|
||||||
query = (
|
query = (
|
||||||
Q(vin__icontains=search)
|
Q(vin__icontains=search)
|
||||||
@ -4990,6 +4990,7 @@ def create_estimate(request, dealer_slug, slug=None):
|
|||||||
.annotate(hash_count=Count("hash"))
|
.annotate(hash_count=Count("hash"))
|
||||||
.distinct()
|
.distinct()
|
||||||
)
|
)
|
||||||
|
print(car_list)
|
||||||
context = {
|
context = {
|
||||||
"form": form,
|
"form": form,
|
||||||
"items": [
|
"items": [
|
||||||
@ -5124,8 +5125,7 @@ def create_sale_order(request, dealer_slug, pk):
|
|||||||
f"KeyError: 'car_info' or 'status' key missing when attempting to update status to 'sold' for item.item_model PK: {getattr(item.item_model, 'pk', 'N/A')}."
|
f"KeyError: 'car_info' or 'status' key missing when attempting to update status to 'sold' for item.item_model PK: {getattr(item.item_model, 'pk', 'N/A')}."
|
||||||
)
|
)
|
||||||
pass
|
pass
|
||||||
item.item_model.car.sold_date=timezone.now() # to be checked added by faheed
|
|
||||||
item.item_model.car.save()# to be checked added byfaheed
|
|
||||||
item.item_model.car.mark_as_sold()
|
item.item_model.car.mark_as_sold()
|
||||||
messages.success(request, "Sale Order created successfully")
|
messages.success(request, "Sale Order created successfully")
|
||||||
|
|
||||||
@ -7539,6 +7539,18 @@ class NotificationListView(LoginRequiredMixin, ListView):
|
|||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return models.Notification.objects.filter(user=self.request.user)
|
return models.Notification.objects.filter(user=self.request.user)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
user_notifications = self.get_queryset()
|
||||||
|
|
||||||
|
# Calculate the number of total, read and unread notifications
|
||||||
|
context['total_count'] = user_notifications.count()
|
||||||
|
context['read_count'] = user_notifications.filter(is_read=True).count()
|
||||||
|
context['unread_count'] = user_notifications.filter(is_read=False).count()
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ItemServiceCreateView(
|
class ItemServiceCreateView(
|
||||||
@ -8198,7 +8210,7 @@ def send_email_view(request, dealer_slug, pk):
|
|||||||
|
|
||||||
تحياتي،
|
تحياتي،
|
||||||
|
|
||||||
{dealer.get_local_name}
|
{dealer.get_local_name()}
|
||||||
{dealer.phone_number}
|
{dealer.phone_number}
|
||||||
Haikal | هيكل
|
Haikal | هيكل
|
||||||
-----
|
-----
|
||||||
@ -11654,3 +11666,9 @@ class ChartOfAccountModelUpdateView(ChartOfAccountModelUpdateViewBase):
|
|||||||
permission_required = 'django_ledger.change_chartofaccountmodel'
|
permission_required = 'django_ledger.change_chartofaccountmodel'
|
||||||
class CharOfAccountModelActionView(CharOfAccountModelActionViewBase):
|
class CharOfAccountModelActionView(CharOfAccountModelActionViewBase):
|
||||||
permission_required = 'django_ledger.change_chartofaccountmodel'
|
permission_required = 'django_ledger.change_chartofaccountmodel'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#for refund policy
|
||||||
|
def refund_policy(request):
|
||||||
|
return render(request,'haikal_policy/refund_policy.html')
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>403 - Access Forbidden</title>
|
<title>403 - {% trans "Access Forbidden" %}</title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<title>Access Forbidden</title>
|
<title>{% trans "Access Forbidden" %}</title>
|
||||||
<meta name="description" content="" />
|
<meta name="description" content="" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<link rel="apple-touch-icon"
|
<link rel="apple-touch-icon"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<title>Access Forbidden</title>
|
<title>{% trans "Access Forbidden" %}</title>
|
||||||
<meta name="description" content="" />
|
<meta name="description" content="" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<link rel="apple-touch-icon"
|
<link rel="apple-touch-icon"
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% load allauth i18n static %}
|
{% load allauth i18n static %}
|
||||||
{% block head_title %}
|
{% block title %}
|
||||||
{% trans "Change Password" %}
|
{% trans "Change Password" %}
|
||||||
{% endblock head_title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="row flex-center min-vh-50">
|
<div class="row flex-center min-vh-50">
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% load i18n allauth account static %}
|
{% load i18n allauth account static %}
|
||||||
{% block head_title %}
|
{% block title %}
|
||||||
{% trans "Password Reset" %}
|
{% trans "Password Reset" %}
|
||||||
{% endblock head_title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="row flex-center min-vh-50">
|
<div class="row flex-center min-vh-50">
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% load allauth %}
|
{% load allauth %}
|
||||||
{% load account %}
|
{% load account %}
|
||||||
{% block head_title %}
|
{% block title %}
|
||||||
{% trans "Password Reset" %}
|
{% trans "Password Reset" %}
|
||||||
{% endblock head_title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="row flex-center min-vh-50">
|
<div class="row flex-center min-vh-50">
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% load allauth %}
|
{% load allauth %}
|
||||||
{% block head_title %}
|
{% block title %}
|
||||||
{% trans "Change Password" %}
|
{% trans "Change Password" %}
|
||||||
{% endblock head_title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="row flex-center min-vh-50">
|
<div class="row flex-center min-vh-50">
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% load allauth %}
|
{% load allauth %}
|
||||||
{% block head_title %}
|
{% block title %}
|
||||||
{% trans "Change Password" %}
|
{% trans "Change Password" %}
|
||||||
{% endblock head_title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row ">
|
<div class="row ">
|
||||||
<div class="row flex-center min-vh-50">
|
<div class="row flex-center min-vh-50">
|
||||||
|
|||||||
@ -280,8 +280,28 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mx-auto mt-4 text-center">
|
||||||
|
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#contentModal" data-url="{% url 'refund_policy' %}">
|
||||||
|
Our Refund Policy
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<div class="modal fade" id="contentModal" tabindex="-1" aria-labelledby="contentModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="contentModalLabel">Refund Policy</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p>Loading...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% include 'footer.html' %}
|
{% include 'footer.html' %}
|
||||||
<script src="{% static 'js/phoenix.js' %}"></script>
|
<script src="{% static 'js/phoenix.js' %}"></script>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
@ -291,6 +311,7 @@
|
|||||||
<script type="module"
|
<script type="module"
|
||||||
src="https://cdn.jsdelivr.net/gh/starfederation/datastar@v1.0.0-beta.11/bundles/datastar.js"></script>
|
src="https://cdn.jsdelivr.net/gh/starfederation/datastar@v1.0.0-beta.11/bundles/datastar.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
function validatePassword(password, confirmPassword) {
|
function validatePassword(password, confirmPassword) {
|
||||||
return password === confirmPassword && password.length > 7 && password !== '';
|
return password === confirmPassword && password.length > 7 && password !== '';
|
||||||
}
|
}
|
||||||
@ -383,5 +404,39 @@
|
|||||||
notify("error",error);
|
notify("error",error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//modal for policy
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const contentModal = document.getElementById('contentModal');
|
||||||
|
if (contentModal) {
|
||||||
|
contentModal.addEventListener('show.bs.modal', function(event) {
|
||||||
|
// Get the button that triggered the modal
|
||||||
|
const button = event.relatedTarget;
|
||||||
|
// Extract the URL from the button's data-url attribute
|
||||||
|
const url = button.getAttribute('data-url');
|
||||||
|
|
||||||
|
// Select the modal body element
|
||||||
|
const modalBody = contentModal.querySelector('.modal-body');
|
||||||
|
|
||||||
|
// Use the Fetch API to load content
|
||||||
|
fetch(url)
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Network response was not ok');
|
||||||
|
}
|
||||||
|
return response.text();
|
||||||
|
})
|
||||||
|
.then(html => {
|
||||||
|
// Insert the HTML content into the modal body
|
||||||
|
modalBody.innerHTML = html;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
modalBody.innerHTML = `<p class="text-danger">Failed to load content: ${error.message}</p>`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock customJS %}
|
{% endblock customJS %}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n custom_filters %}
|
{% load i18n custom_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Accounts" %}
|
{% trans "Audit Log Dashboard" %}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block accounts %}
|
{% block accounts %}
|
||||||
<a class="nav-link active fw-bold">
|
<a class="nav-link active fw-bold">
|
||||||
|
|||||||
@ -1,21 +1,11 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Activate Account" %}
|
||||||
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% comment %} <div class="d-flex justify-content-center align-items-center mt-10">
|
|
||||||
<div class="text-center">
|
|
||||||
<h1>Activate Account</h1>
|
|
||||||
<p>Are you sure you want to activate this account "{{ obj.email }}"?</p>
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<button class="btn btn-phoenix-primary mx-2" type="submit">Activate</button>
|
|
||||||
<a class="btn btn-phoenix-danger mx-2" href="{% url 'user_management' request.dealer.slug %}">Cancel</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div> {% endcomment %}
|
|
||||||
<!---->
|
|
||||||
<div class="row justify-content-center mt-5 mb-3">
|
<div class="row justify-content-center mt-5 mb-3">
|
||||||
<div class="col-lg-8 col-md-10">
|
<div class="col-lg-8 col-md-10">
|
||||||
<div class="card shadow-sm border-0 rounded-3">
|
<div class="card shadow-sm border-0 rounded-3">
|
||||||
|
|||||||
@ -1,33 +1,44 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans 'Admin Management' %}
|
{% trans 'Admin Dashboard' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h3 class="my-4">
|
<div class="container py-5">
|
||||||
{% trans "Admin Management" %}
|
<header class="mb-5">
|
||||||
<li class="fa fa-user-cog ms-2 text-primary"></li>
|
<h1 class="display-4 fw-bold">
|
||||||
</h3>
|
<i class="fas fa-user-cog text-primary me-3"></i>
|
||||||
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-4 g-4 mt-10">
|
{% trans "Admin Dashboard" %}
|
||||||
<div class="col">
|
</h1>
|
||||||
<a href="{% url 'user_management' request.dealer.slug %}">
|
<p class="lead mt-3">
|
||||||
<div class="card h-100">
|
{% trans "Manage user accounts, review system logs, and control access permissions." %}
|
||||||
<div class="card-header text-center">
|
</p>
|
||||||
<h5 class="card-title">{{ _("User Management") }}</h5>
|
</header>
|
||||||
<span class="me-2"><i class="fas fa-user fa-2x"></i></span>
|
|
||||||
|
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
|
||||||
|
<div class="col">
|
||||||
|
<a href="{% url 'user_management' request.dealer.slug %}" class="text-decoration-none">
|
||||||
|
<div class="card h-100 shadow-sm border-0 rounded-3">
|
||||||
|
<div class="card-body text-center p-4">
|
||||||
|
<i class="fas fa-users fa-3x text-primary mb-3"></i>
|
||||||
|
<h5 class="card-title fw-bold ">{{ _("User Management") }}</h5>
|
||||||
|
<p class="card-text text-muted">{% trans "View, edit, and manage all user accounts within the system." %}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</a>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
<div class="col">
|
||||||
<div class="col">
|
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}" class="text-decoration-none">
|
||||||
<a href="{% url 'audit_log_dashboard' request.dealer.slug %}">
|
<div class="card h-100 shadow-sm border-0 rounded-3">
|
||||||
<div class="card h-100">
|
<div class="card-body text-center p-4">
|
||||||
<div class="card-header text-center">
|
<i class="fas fa-history fa-3x text-primary mb-3"></i>
|
||||||
<h5 class="card-title">{{ _("Audit Log Dashboard") }}</h5>
|
<h5 class="card-title fw-bold ">{{ _("Audit Log") }}</h5>
|
||||||
<span class="me-2"><i class="fas fa-user fa-2x"></i></span>
|
<p class="card-text text-muted">{% trans "Review a detailed history of all critical system activities and changes." %}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</a>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n custom_filters %}
|
{% load i18n custom_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Accounts" %}
|
{% trans "Audit Log Dashboard" %}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block accounts %}
|
{% block accounts %}
|
||||||
<a class="nav-link active fw-bold">
|
<a class="nav-link active fw-bold">
|
||||||
|
|||||||
@ -1,20 +1,10 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Permanent Delete instance" %}
|
||||||
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% comment %} <div class="d-flex justify-content-center align-items-center mt-10">
|
|
||||||
<div class="text-center">
|
|
||||||
<h1 class="display-4">Delete Account</h1>
|
|
||||||
<p class="lead">Are you sure you want to delete this account "{{ obj.email }}"? This will delete all associated information for this user.</p>
|
|
||||||
<form method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<button class="btn btn-phoenix-danger mx-2" type="submit"><i class="fas fa-trash me-2"></i> Delete Permenantly</button>
|
|
||||||
<a class="btn btn-phoenix-secondary mx-2" href="{% url 'user_management' request.dealer.slug %}"><i class="fas fa-ban me-2"></i>Cancel</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div> {% endcomment %}
|
|
||||||
<!---->
|
|
||||||
<div class="row justify-content-center mt-5 mb-3">
|
<div class="row justify-content-center mt-5 mb-3">
|
||||||
<div class="col-lg-8 col-md-10">
|
<div class="col-lg-8 col-md-10">
|
||||||
<div class="card shadow-sm border-0 rounded-3">
|
<div class="card shadow-sm border-0 rounded-3">
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n custom_filters %}
|
{% load i18n custom_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Accounts" %}
|
{% trans "Audit Log Dashboard" %}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block accounts %}
|
{% block accounts %}
|
||||||
<a class="nav-link active fw-bold">
|
<a class="nav-link active fw-bold">
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Create Chart of Accounts" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load icon from django_ledger %}
|
{% load icon from django_ledger %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Chart of Accounts" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="card mb-4">
|
<div class="card mb-4">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Update chart of Account"%}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-lg-6 col-md-8">
|
<div class="col-lg-6 col-md-8">
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Calender Events" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="table-responsive border-translucent">
|
<div class="table-responsive border-translucent">
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n static humanize %}
|
{% load i18n static humanize %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Lead Detail" %}
|
||||||
|
{% endblock %}
|
||||||
{% block customCSS %}
|
{% block customCSS %}
|
||||||
<style>
|
<style>
|
||||||
.main-tab li:last-child {
|
.main-tab li:last-child {
|
||||||
|
|||||||
@ -1,43 +1,125 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% load i18n %}
|
||||||
<div class="content">
|
|
||||||
<h2 class="mb-5">{{ _("Notifications") }}</h2>
|
{% block title %}
|
||||||
<div class="d-flex justify-content-end mb-3">
|
{% trans "Notifications" %}
|
||||||
<a href="{% url 'mark_all_notifications_as_read' %}"
|
{% endblock title %}
|
||||||
hx-select-oob="#toast-container:outerHTML"
|
|
||||||
class="btn btn-phoenix-primary"><i class="far fa-envelope fs-8 me-2"></i>{{ _("Mark all as read") }}</a>
|
{% block customeCSS %}
|
||||||
</div>
|
|
||||||
{% if notifications %}
|
/* General Layout */
|
||||||
<div class="mx-n4 mx-lg-n6 mb-5 border-bottom">
|
body {
|
||||||
{% for notification in notifications %}
|
background-color: #f8f9fa; /* Light gray background for contrast */
|
||||||
<div class="d-flex align-items-center justify-content-between py-3 px-lg-6 px-4 notification-card border-top">
|
}
|
||||||
<div class="d-flex">
|
|
||||||
<div class="me-3 flex-1 mt-2">
|
/* List Item Styling */
|
||||||
<h4 class="fs-9 text-body-emphasis">{{ _("System") }}:</h4>
|
.list-item {
|
||||||
{% if notification.is_read %}
|
transition: background-color 0.2s ease-in-out, transform 0.2s ease-in-out;
|
||||||
<p class="fs-9 text-body-highlight">
|
cursor: pointer;
|
||||||
<span class="far fa-envelope text-success-dark fs-8 me-1"></span><span class="me-1">{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span>
|
}
|
||||||
</p>
|
|
||||||
{% else %}
|
.list-item:hover {
|
||||||
<p class="fs-9 text-body-highlight">
|
background-color: #f1f3f5;
|
||||||
<span class="far fa-envelope-open text-danger-dark fs-8 me-1"></span><span>{{ notification.message|safe }}</span> <span class="ms-2 text-body-tertiary text-opacity-85 fw-bold fs-10 text-end">{{ notification.created|timesince }}</span>
|
transform: translateY(-2px); /* Subtle lift on hover */
|
||||||
</p>
|
}
|
||||||
{% endif %}
|
|
||||||
<p class="text-body-secondary fs-9 mb-0">
|
/* Unread Notification Dot */
|
||||||
<span class="me-1 far fa-clock"></span>{{ notification.created }}
|
.unread-dot {
|
||||||
</p>
|
position: absolute;
|
||||||
</div>
|
left: 0;
|
||||||
</div>
|
top: 50%;
|
||||||
</div>
|
transform: translateY(-50%);
|
||||||
{% endfor %}
|
width: 8px;
|
||||||
</div>
|
height: 8px;
|
||||||
</div>
|
border-radius: 50%;
|
||||||
{% if page_obj.paginator.num_pages > 1 %}
|
}
|
||||||
<div class="d-flex justify-content-end mt-3">
|
|
||||||
<div class="d-flex">{% include 'partials/pagination.html' %}</div>
|
/* HTMX Loading Indicator */
|
||||||
</div>
|
.htmx-request #loading-indicator {
|
||||||
{% endif %}
|
display: block;
|
||||||
{% else %}
|
}
|
||||||
<p>{% trans "No notifications found." %}</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<main class="container-fluid p-5">
|
||||||
|
<div class="row gx-5">
|
||||||
|
<div class="col-lg-8">
|
||||||
|
<header class="d-flex justify-content-between align-items-center mb-5 border-bottom pb-4">
|
||||||
|
<h1 class="display-5 fw-bolder">{% trans "Inbox" %}</h1>
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
<span class="text-muted d-none d-md-block me-3">
|
||||||
|
<span id="unread-count-text" class="fw-bold me-1">{{ total_count}}</span> {% trans "notifications" %}
|
||||||
|
</span>
|
||||||
|
<a href="{% url 'mark_all_notifications_as_read' %}"
|
||||||
|
hx-get="{% url 'mark_all_notifications_as_read' %}"
|
||||||
|
hx-swap="none"
|
||||||
|
class="btn btn-sm btn-outline-secondary rounded-pill fw-bold">
|
||||||
|
<i class="fas fa-check-double me-2"></i>{% trans "Mark all read" %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{% if notifications %}
|
||||||
|
<div class="list-container" hx-indicator="#loading-indicator">
|
||||||
|
{% for notification in notifications %}
|
||||||
|
<div class="list-item d-flex align-items-start py-4 border-bottom position-relative">
|
||||||
|
{% if not notification.is_read %}
|
||||||
|
|
||||||
|
<div class="me-4 mt-1">
|
||||||
|
<i class="fas fa-info-circle fa-2x text-primary"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
<div class="me-4 mt-1">
|
||||||
|
<i class="fas fa-info-circle fa-2x text-secondary"></i>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="flex-grow-1">
|
||||||
|
<h5 class="mb-1 text-dark fw-normal">
|
||||||
|
{{ notification.message|safe }}
|
||||||
|
</h5>
|
||||||
|
<p class="text-muted fs-6 mb-0 mt-2">
|
||||||
|
<i class="far fa-clock me-1"></i>
|
||||||
|
<span class="text-nowrap">{{ notification.created|timesince }} ago</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="text-center py-5 mt-5">
|
||||||
|
<i class="fas fa-bell-slash fa-4x text-muted mb-4"></i>
|
||||||
|
<h4 class="text-secondary fw-bold">{% trans "No new notifications" %}</h4>
|
||||||
|
<p class="text-muted">{% trans "You're all caught up. Check back later for updates." %}</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page_obj.paginator.num_pages > 1 %}
|
||||||
|
<div class="d-flex justify-content-center mt-5">
|
||||||
|
{% include 'partials/pagination.html' %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-4 d-none d-lg-block">
|
||||||
|
<div class="card bg-light border-0 rounded-4 p-4 sticky-top mt-3">
|
||||||
|
<h4 class="fw-bold mb-3 text-dark">{% trans "Status" %}</h4>
|
||||||
|
<ul class="list-unstyled mb-0">
|
||||||
|
<li class="d-flex align-items-center mb-2">
|
||||||
|
<i class="fas fa-circle-check text-secondary me-2"></i>
|
||||||
|
<span>{% trans "Read:" %}<span class="fw-bold ms-1">{{read_count}}</span></span>
|
||||||
|
</li>
|
||||||
|
<li class="d-flex align-items-center">
|
||||||
|
<i class="fas fa-bell text-primary me-2"></i>
|
||||||
|
<span>{% trans "Unread:" %} <span class="fw-bold ms-1">{{unread_count}}</span></span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div id="loading-indicator" class="spinner-border text-primary d-none position-fixed bottom-0 end-0 m-3" role="status">
|
||||||
|
<span class="visually-hidden">Loading...</span>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@ -1,6 +1,9 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load tenhal_tag %}
|
{% load tenhal_tag %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Aging Inventory" %}
|
||||||
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="main-content flex-grow-1 container-fluid mt-4 mb-3">
|
<div class="main-content flex-grow-1 container-fluid mt-4 mb-3">
|
||||||
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-5 pb-3 border-bottom">
|
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-5 pb-3 border-bottom">
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Sales Dashboard" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="main-content flex-grow-1 container-fluid mt-4 mb-3">
|
<div class="main-content flex-grow-1 container-fluid mt-4 mb-3">
|
||||||
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-5 pb-3 border-bottom">
|
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-5 pb-3 border-bottom">
|
||||||
|
|||||||
86
templates/haikal_policy/refund_policy.html
Normal file
86
templates/haikal_policy/refund_policy.html
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{% trans "Haikal Refund Policy" %}</title>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="policy-container m-4">
|
||||||
|
<div class="policy-header">
|
||||||
|
<h1>{% trans "Haikal Refund Policy" %}</h1>
|
||||||
|
<p class="lead">
|
||||||
|
{% trans "This policy for Haikal DMS by Tenhal outlines refund conditions." %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section id="initial-guarantee" class="policy-section">
|
||||||
|
<h2>{% trans "1. 14-Day Guarantee" %}</h2>
|
||||||
|
<p>
|
||||||
|
{% trans "Get a full refund of your <strong>initial subscription fee</strong> within <strong>14 days</strong> of purchase if you're not satisfied. This is for new customers only and excludes non-refundable fees." %}
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="eligibility" class="policy-section">
|
||||||
|
<h2>{% trans "2. Refund Eligibility" %}</h2>
|
||||||
|
<p>{% trans "Refunds are given for:" %}</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "Service Failure:" %}</strong> {% trans "If the service consistently fails and our support team can't fix it." %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "Billing Errors:" %}</strong> {% trans "For incorrect or duplicate charges." %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="non-refundable" class="policy-section">
|
||||||
|
<h2>{% trans "3. Non-Refundable Situations" %}</h2>
|
||||||
|
<p>{% trans "We don't offer refunds for:" %}</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "Change of Mind:" %}</strong> {% trans "If you simply decide not to use the service." %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "Recurring Payments:" %}</strong> {% trans "Payments after the initial 14-day period." %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "Partial Use:" %}</strong> {% trans "We don't provide prorated refunds for partial months or years." %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>{% trans "One-Time Fees:" %}</strong> {% trans "Setup and professional services fees are non-refundable." %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="how-to-request" class="policy-section">
|
||||||
|
<h2>{% trans "4. How to Request" %}</h2>
|
||||||
|
<p>
|
||||||
|
{% trans "Email our Billing and Support team at" %} <a href="mailto:haikal@support.sa">haikal@support.sa</a> {% trans "with your company name, account ID, invoice number, and a detailed reason for the refund." %}
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="processing" class="policy-section">
|
||||||
|
<h2>{% trans "5. Processing" %}</h2>
|
||||||
|
<p>
|
||||||
|
{% trans "Approved refunds are processed in <strong>10-14 business days</strong> to your original payment method." %}
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="data-termination" class="policy-section">
|
||||||
|
<h2>{% trans "6. Account Termination" %}</h2>
|
||||||
|
<p>
|
||||||
|
{% trans "Once a refund is issued, your access is revoked. You are responsible for exporting your data before termination." %}
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -1,6 +1,6 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% block title %}Haikal Bot{% endblock %}
|
{% block title %}{% trans "Haikal Bot" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.2/papaparse.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.2/papaparse.min.js"></script>
|
||||||
|
|||||||
@ -495,8 +495,23 @@
|
|||||||
title="{% trans 'Logged in as ' %}{{ request.user.username }}">
|
title="{% trans 'Logged in as ' %}{{ request.user.username }}">
|
||||||
{% trans 'Hello, ' %}{{ name_to_display }}
|
{% trans 'Hello, ' %}{{ name_to_display }}
|
||||||
</h6>
|
</h6>
|
||||||
|
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="navbar-logo ">
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
|
||||||
|
<small class="text-gray-600 ms-2 d-none d-sm-block fs-9"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="bottom"
|
||||||
|
>
|
||||||
|
{% now "l, F j, Y g:i A" %}
|
||||||
|
</small>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<ul class="navbar-nav navbar-nav-icons flex-row gap-2" hx-boost="false">
|
<ul class="navbar-nav navbar-nav-icons flex-row gap-2" hx-boost="false">
|
||||||
@ -650,19 +665,19 @@
|
|||||||
</hr>
|
</hr>
|
||||||
<div class="px-3">
|
<div class="px-3">
|
||||||
<a class="btn btn-sm btn-phoenix-danger d-flex flex-center w-100"
|
<a class="btn btn-sm btn-phoenix-danger d-flex flex-center w-100"
|
||||||
href="{% url 'account_logout' %}"> <span class="fas fa-power-off me-2"></span>{% trans 'Sign Out' %}</a>
|
href="{% url 'account_logout' %}"> <i class="fa-solid fa-right-from-bracket me-2"></i></span>{% trans 'Sign Out' %}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="my-2 text-center fw-bold fs-10 text-body-quaternary">
|
<div class="my-2 text-center fw-bold fs-10 text-body-quaternary">
|
||||||
<a class="text-body-quaternary me-1" href="">{% trans 'Privacy policy' %}</a>•<a class="text-body-quaternary mx-1" href="">{% trans 'Terms' %}</a>•<a class="text-body-quaternary ms-1" href="">Cookies</a>
|
<a class="text-body-quaternary me-1" href="">{% trans 'Privacy policy' %}</a>•<a class="text-body-quaternary mx-1" href="">{% trans 'Terms' %}</a>•<a class="text-body-quaternary ms-1" href="">{% trans "Cookies" %}</a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="px-3">
|
<div class="px-3">
|
||||||
<a class="btn btn-phoenix-succes d-flex flex-center w-100"
|
<a class="btn btn-phoenix-succes d-flex flex-center w-100"
|
||||||
href="{% url 'account_login' %}"> <span class="me-2" data-feather="log-in"></span>{% trans 'Sign In' %}</a>
|
href="{% url 'account_login' %}"> <i class="fa-solid fa-right-to-bracket me-2"></i>{% trans 'Sign In' %}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="px-3">
|
<div class="px-3">
|
||||||
<a class="btn btn-phoenix-primary d-flex flex-center w-100"
|
<a class="btn btn-phoenix-primary d-flex flex-center w-100"
|
||||||
href="{% url 'account_signup' %}"> <span class="me-2" data-feather="user-plus"></span>{% trans 'Sign Up' %}</a>
|
href="{% url 'account_signup' %}"> <i class="fa-solid fa-user-plus"></i>{% trans 'Sign Up' %}</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Car list" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row-fluid p-2">
|
<div class="row-fluid p-2">
|
||||||
<!-- Display Validation Errors -->
|
<!-- Display Validation Errors -->
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Track Inventory" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-fluid px-4 py-4">
|
<div class="container-fluid px-4 py-4">
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>transfer</title>
|
<title>{% trans "transfer" %}</title>
|
||||||
<!-- Bootstrap CSS -->
|
<!-- Bootstrap CSS -->
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
|
|||||||
@ -25,7 +25,6 @@
|
|||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Name" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Name" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Unit of Measure" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Unit of Measure" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Taxable" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Taxable" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Account" %}</th>
|
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Action" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Action" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -36,7 +35,6 @@
|
|||||||
<td class="align-middle product white-space-nowrap">{{ service.get_local_name|default:service.name }}</td>
|
<td class="align-middle product white-space-nowrap">{{ service.get_local_name|default:service.name }}</td>
|
||||||
<td class="align-middle product white-space-nowrap">{{ service.get_uom_display }}</td>
|
<td class="align-middle product white-space-nowrap">{{ service.get_uom_display }}</td>
|
||||||
<td class="align-middle product white-space-nowrap">{{ service.taxable|yesno }}</td>
|
<td class="align-middle product white-space-nowrap">{{ service.taxable|yesno }}</td>
|
||||||
<td class="align-middle product white-space-nowrap">{{ service.item.co }}</td>
|
|
||||||
<td class="align-middle white-space-nowrap text-start">
|
<td class="align-middle white-space-nowrap text-start">
|
||||||
{% if perms.inventory.add_additionalservices %}
|
{% if perms.inventory.add_additionalservices %}
|
||||||
<div class="btn-reveal-trigger position-static">
|
<div class="btn-reveal-trigger position-static">
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Bill" %}
|
{% trans "Bill Update" %}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row my-4">
|
<div class="row my-4">
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{# Check if an 'object' exists in the context #}
|
|
||||||
{% if object %}
|
{% if object %}
|
||||||
{% trans 'Update Account' %}
|
{% trans 'Update Account' %}
|
||||||
{% else %}
|
{% else %}
|
||||||
@ -10,35 +9,39 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center mt-5 mb-3">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
<div class="col-lg-8 col-md-10">
|
<div class="col-lg-8 col-md-10">
|
||||||
<div class="card shadow-sm border-0 rounded-3">
|
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
|
||||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
|
||||||
<h3 class="mb-0 fs-4 text-center ">
|
<h3 class="mb-0 fs-4 fw-bold text-center">
|
||||||
{% if account.created %}
|
{% if object %}
|
||||||
{{ _("Edit Account") }}
|
{% trans "Update Account" %}
|
||||||
|
<i class="fa-solid fa-edit ms-2"></i>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ _("Add Account") }}
|
{% trans "Add New Account" %}
|
||||||
|
<i class="fa-solid fa-book ms-2"></i>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<i class="fa-solid fa-book ms-2 text-primary"></i>
|
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body bg-light-subtle">
|
<div class="card-body p-4 p-md-5">
|
||||||
<form method="post" class="form" novalidate>
|
<form method="post" class="form" novalidate>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form|crispy }}
|
{{ form|crispy }}
|
||||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
<hr class="my-4">
|
||||||
<hr class="my-2">
|
|
||||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||||
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit">
|
<button class="btn btn-phoenix-primary btn-lg me-md-2" type="submit">
|
||||||
<i class="saveBtnIcon fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
<i class="fa-solid fa-floppy-disk me-1"></i>
|
||||||
|
{% trans "Save" %}
|
||||||
</button>
|
</button>
|
||||||
<a href="{% url 'account_list' request.dealer.slug url_kwargs.coa_pk %}"
|
<a href="{% url 'account_list' request.dealer.slug url_kwargs.coa_pk %}"
|
||||||
class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
class="btn btn-phoenix-secondary btn-lg">
|
||||||
|
<i class="fa-solid fa-ban me-1"></i>
|
||||||
|
{% trans "Cancel" %}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!---->
|
</main>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -2,23 +2,40 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Delete Journal Entry" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<main class="container py-5">
|
||||||
<div class="col-md-6">
|
<div class="row justify-content-center">
|
||||||
<form action="{% url 'journalentry_delete' request.dealer.slug journal_entry.pk %}"
|
<div class="col-lg-6 col-md-8">
|
||||||
method="post">
|
<div class="card shadow-lg border-0 rounded-4">
|
||||||
{% csrf_token %}
|
<div class="card-body p-5 text-center">
|
||||||
<div class="card">
|
<div class="mb-4">
|
||||||
<div class="card-body text-center">
|
<i class="fas fa-exclamation-triangle fa-4x text-danger"></i>
|
||||||
<h5 class="card-title fw-light">{% trans "Are you sure you want to delete?" %}</h5>
|
</div>
|
||||||
</div>
|
<h2 class="h3 fw-bold mb-3">{% trans "Confirm Deletion" %}</h2>
|
||||||
<div class="card-body text-center">
|
<p class="lead text-muted mb-4">
|
||||||
<a href="{% url 'journalentry_list' request.dealer.slug journal_entry.ledger.pk %}"
|
{% blocktrans %}Are you sure you want to delete the journal entry? This action cannot be undone.{% endblocktrans %}
|
||||||
class="btn btn-phoenix-primary me-2">{% trans 'Go Back' %}</a>
|
</p>
|
||||||
<button type="submit" class="btn btn-phoenix-danger">{% trans 'Delete' %}</button>
|
|
||||||
|
<div class="d-flex justify-content-center gap-3">
|
||||||
|
<a href="{% url 'journalentry_list' request.dealer.slug journal_entry.ledger.pk %}"
|
||||||
|
class="btn btn-outline-secondary btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans 'Go Back' %}
|
||||||
|
</a>
|
||||||
|
<form action="{% url 'journalentry_delete' request.dealer.slug journal_entry.pk %}" method="post" class="d-inline">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" class="btn btn-danger btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans 'Delete' %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -5,7 +5,7 @@
|
|||||||
{{ _("Create Journal Entry") }}
|
{{ _("Create Journal Entry") }}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-100 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
||||||
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
|
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
|
||||||
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
|
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
|
||||||
|
|||||||
@ -104,13 +104,13 @@
|
|||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
<div class="dropdown-menu dropdown-menu-end py-2">
|
||||||
{% if perms.django_ledger.view_transactionmodel %}
|
{% if perms.django_ledger.view_transactionmodel %}
|
||||||
<a class="dropdown-item"
|
<a class="dropdown-item text-success"
|
||||||
href="{% url 'journalentry_transactions' request.dealer.slug je.pk %}">{% trans "View" %}</a>
|
href="{% url 'journalentry_transactions' request.dealer.slug je.pk %}">{% trans "View" %}</a>
|
||||||
<a class="dropdown-item"
|
<a class="dropdown-item text-info"
|
||||||
href="{% url 'journalentry_txs' request.dealer.slug je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
|
href="{% url 'journalentry_txs' request.dealer.slug je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if je.can_delete and perms.django_ledger.delete_journalentrymodel %}
|
{% if je.can_delete and perms.django_ledger.delete_journalentrymodel %}
|
||||||
<a class="dropdown-item"
|
<a class="dropdown-item text-danger"
|
||||||
href="{% url 'journalentry_delete' request.dealer.slug je.pk %}">{% trans "Delete" %}</a>
|
href="{% url 'journalentry_delete' request.dealer.slug je.pk %}">{% trans "Delete" %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ _("Transactions") }}
|
{{ _("Journal Entry Detail") }}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row mt-4">
|
<div class="row mt-4">
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Jorunal Entry Transactions" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|||||||
@ -2,23 +2,38 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Delete Ledger Entry" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<main class="container py-5">
|
||||||
<div class="col-md-6">
|
<div class="row justify-content-center">
|
||||||
<form action="{% url 'ledger-delete' dealer_slug=request.dealer.slug entity_slug=request.dealer.entity.slug ledger_pk=ledger_model.uuid %}"
|
<div class="col-lg-6 col-md-8">
|
||||||
method="post">
|
<div class="card shadow-lg border-0 rounded-4">
|
||||||
{% csrf_token %}
|
<div class="card-body p-5 text-center">
|
||||||
<div class="card">
|
<div class="mb-4">
|
||||||
<div class="card-body text-center">
|
<i class="fas fa-exclamation-triangle fa-4x text-danger"></i>
|
||||||
<h5 class="card-title fw-light">{{ ledger_model.get_delete_message }}</h5>
|
</div>
|
||||||
</div>
|
<h2 class="h3 fw-bold mb-3">{% trans "Confirm Deletion" %}</h2>
|
||||||
<div class="card-body text-center">
|
<p class="lead text-muted mb-4">
|
||||||
<a href="{% url 'ledger_list' request.dealer.slug request.dealer.entity.slug %}"
|
{{ ledger_model.get_delete_message }}
|
||||||
class="btn btn-phoenix-primary me-2">{% trans 'Go Back' %}</a>
|
</p>
|
||||||
<button type="submit" class="btn btn-phoenix-danger">{% trans 'Delete' %}</button>
|
<div class="d-flex justify-content-center gap-3">
|
||||||
|
<a href="{% url 'ledger_list' request.dealer.slug request.dealer.entity.slug %}"
|
||||||
|
class="btn btn-outline-secondary btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans 'Go Back' %}
|
||||||
|
</a>
|
||||||
|
<form action="{% url 'ledger-delete' dealer_slug=request.dealer.slug entity_slug=request.dealer.entity.slug ledger_pk=ledger_model.uuid %}"
|
||||||
|
method="post" class="d-inline">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" class="btn btn-danger btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans 'Delete' %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans 'ledger Detail' %}
|
||||||
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
|
|||||||
@ -255,7 +255,7 @@
|
|||||||
<td class="fs-9">{{ car.mileage }}</td>
|
<td class="fs-9">{{ car.mileage }}</td>
|
||||||
<td class="fs-9">{{ car.stock_type|capfirst }}</td>
|
<td class="fs-9">{{ car.stock_type|capfirst }}</td>
|
||||||
<td class="fs-9">{{ car.created_at|date }}</td>
|
<td class="fs-9">{{ car.created_at|date }}</td>
|
||||||
<td class="fs-9">{{ car.invoice.date_paid|date|default_if_none:"-" }}</td>
|
<td class="fs-9">{{ car.invoice.sale_orders.first.order_date|date|default_if_none:"-" }}</td>
|
||||||
<td class="fs-9 text-nowrap">
|
<td class="fs-9 text-nowrap">
|
||||||
<span>{{ car.cost_price }}<span class="icon-saudi_riyal"></span></span>
|
<span>{{ car.cost_price }}<span class="icon-saudi_riyal"></span></span>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Delete Purchase Order" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
|
|||||||
@ -3,6 +3,9 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load django_ledger %}
|
{% load django_ledger %}
|
||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Purchase Order Detail" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-fluid mt-4">
|
<div class="container-fluid mt-4">
|
||||||
<div class="row g-1">
|
<div class="row g-1">
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<!-- po_list.html -->
|
<!-- po_list.html -->
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n static %}
|
{% load i18n static %}
|
||||||
{% block title %}Purchase Orders{% endblock %}
|
{% block title %}{% trans "Purchase Orders" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if purchase_orders or request.GET.q %}
|
{% if purchase_orders or request.GET.q %}
|
||||||
<div class="row mt-4">
|
<div class="row mt-4">
|
||||||
|
|||||||
@ -5,6 +5,9 @@
|
|||||||
{% load custom_filters %}
|
{% load custom_filters %}
|
||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
|
{%block title %}
|
||||||
|
{% trans "Update Purchase Order" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-fluid py-4">
|
<div class="container-fluid py-4">
|
||||||
<div class="row g-4">
|
<div class="row g-4">
|
||||||
|
|||||||
@ -1,12 +1,15 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Upload Cars" %}
|
||||||
|
{%endblock%}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<h1>
|
<h1>
|
||||||
<i class="fa-solid fa-cart-shopping me-1"></i>{{ po.po_number }}
|
<i class="fa-solid fa-cart-shopping me-1"></i>{{ po.po_number }}
|
||||||
</h1>
|
</h1>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<h4>Status:</h4>
|
<h4>{% trans "Status:" %}</h4>
|
||||||
{% comment %} Apply appropriate text color based on po.po_status {% endcomment %}
|
{% comment %} Apply appropriate text color based on po.po_status {% endcomment %}
|
||||||
{% if po.po_status == 'draft' %}
|
{% if po.po_status == 'draft' %}
|
||||||
<h4 class="ms-2 text-warning mb-0">{{ po.po_status|capfirst }}</h4>
|
<h4 class="ms-2 text-warning mb-0">{{ po.po_status|capfirst }}</h4>
|
||||||
|
|||||||
@ -135,7 +135,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="col-md-10 ms-4 needs-validation {% if not items or not customer_count %}d-none{% endif %}">
|
<div class="col-md-10 ms-4 needs-validation {% if not items or not customer_count %}d-none{% endif %}">
|
||||||
<div class="card shadow-lg border-0 rounded-4 overflow-hidden animate__animated animate__fadeInUp">
|
<div class="card shadow-lg border-0 rounded-4 animate__animated animate__fadeInUp">
|
||||||
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
|
<div class="card-header bg-gradient py-4 border-0 rounded-top-4">
|
||||||
<h3 class="mb-0 fs-4 text-center">
|
<h3 class="mb-0 fs-4 text-center">
|
||||||
{% trans "Create Quotation" %}<i class="fa-regular fa-file-lines ms-2"></i>
|
{% trans "Create Quotation" %}<i class="fa-regular fa-file-lines ms-2"></i>
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Quotation</title>
|
<title>{% trans "Quotation" %}</title>
|
||||||
<link href="{% static 'css/theme.min.css' %}"
|
<link href="{% static 'css/theme.min.css' %}"
|
||||||
type="text/css"
|
type="text/css"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ _("Sale Order") }}
|
{{ _("Create Sale Order") }}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Sale Order</title>
|
<title>{% trans "Sale Order" %}</title>
|
||||||
<!-- Bootstrap CSS -->
|
<!-- Bootstrap CSS -->
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
|
||||||
rel="stylesheet">
|
rel="stylesheet">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ _("Invoice") }}
|
{{ _("Create Invoice") }}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Invoice</title>
|
<title>{% trans "Invoice" %}</title>
|
||||||
<link href="{% static 'css/theme.min.css' %}"
|
<link href="{% static 'css/theme.min.css' %}"
|
||||||
type="text/css"
|
type="text/css"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n static custom_filters crispy_forms_filters %}
|
{% load i18n static custom_filters crispy_forms_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans 'Profile' %}
|
{% trans 'Staff Profile' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-fluid py-4">
|
<div class="container-fluid py-4">
|
||||||
|
|||||||
@ -2,6 +2,9 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{%block title%}
|
||||||
|
{% trans "Raise Ticket" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
||||||
|
|||||||
@ -82,12 +82,36 @@
|
|||||||
<span class="text-muted small d-block">{{ ticket.created_at|time:"H:i" }}</span>
|
<span class="text-muted small d-block">{{ ticket.created_at|time:"H:i" }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-4">
|
<td class="text-end pe-4">
|
||||||
<a href="{% url 'ticket_detail' request.dealer.slug ticket.id %}"
|
{% comment %} <a href="{% url 'ticket_detail' request.dealer.slug ticket.id %}"
|
||||||
class="btn btn-phoenix-primary btn-sm">
|
class="btn btn-phoenix-primary btn-sm">
|
||||||
<i class="fa-solid fa-eye me-1"></i>
|
<i class="fa-solid fa-eye me-1"></i>
|
||||||
{% trans "View" %}
|
{% trans "View" %}
|
||||||
</a>
|
</a> {% endcomment %}
|
||||||
|
|
||||||
|
<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 class="dropdown-item"
|
||||||
|
href="{% url 'ticket_detail' request.dealer.slug ticket.id %}">
|
||||||
|
<i class="fa fa-eye me-2"></i>{% trans "View" %}
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-item"
|
||||||
|
href="{% url 'ticket_update' ticket.id%}">
|
||||||
|
<i class="fa fa-edit me-2"></i>{% trans "Update" %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
{% empty %}
|
{% empty %}
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@ -2,19 +2,41 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% block title %}
|
||||||
|
{% trans "Update Ticket" %} #{{ ticket.id }}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="card">
|
<div class="container py-5">
|
||||||
<div class="card-header bg-primary text-white">
|
<div class="row justify-content-center">
|
||||||
<h2 class="h4 mb-0">{% trans "Update Ticket" %}</h2>
|
<div class="col-lg-8 col-md-10">
|
||||||
</div>
|
<div class="card shadow-lg border-0 rounded-4">
|
||||||
<div class="card-body">
|
<div class="card-body p-5">
|
||||||
<form method="post">
|
<header class="text-center mb-5">
|
||||||
{% csrf_token %}
|
<h1 class="display-6 fw-bold">
|
||||||
{{ form|crispy }}
|
<i class="fas fa-ticket-alt text-primary me-2"></i>
|
||||||
<button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
|
{% trans "Update Ticket" %}
|
||||||
<a href="{% url 'ticket_list' request.dealer.slug %}"
|
</h1>
|
||||||
class="btn btn-secondary">{% trans "Cancel" %}</a>
|
<p class="text-muted mt-2">
|
||||||
</form>
|
{% trans "Make changes to the ticket details below and save." %}
|
||||||
|
</p>
|
||||||
|
</header>
|
||||||
|
<form method="post" class="needs-validation" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form|crispy }}
|
||||||
|
<hr class="my-4">
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<button type="submit" class="btn btn-primary btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans "Save Changes" %}
|
||||||
|
</button>
|
||||||
|
<a href="{% url 'ticket_list' request.dealer.slug %}"
|
||||||
|
class="btn btn-outline-secondary btn-lg rounded-pill px-5 fw-bold">
|
||||||
|
{% trans "Cancel" %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% block title %}{{ tour.name }} - Interactive Guide{% endblock %}
|
{% block title %}{{ tour.name }} - {% trans "Interactive Guide" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container my-4">
|
<div class="container my-4">
|
||||||
<h1>{{ tour.name }}</h1>
|
<h1>{{ tour.name }}</h1>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% block title %}Interactive Guides{% endblock %}
|
{% block title %}{% trans "Interactive Guides" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container my-4">
|
<div class="container my-4">
|
||||||
<h1>{% trans "Interactive Guides" %}</h1>
|
<h1>{% trans "Interactive Guides" %}</h1>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ user_.name }}
|
{{user_.fullname}}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container py-4">
|
<div class="container py-4">
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load crispy_forms_filters %}
|
{% load crispy_forms_filters %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans "Group" %}
|
{% trans "Groups" %}
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5 ">
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% block title%}
|
||||||
|
{% trans "Change Password" %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
<main class="d-flex align-items-center justify-content-center min-vh-80 py-5">
|
||||||
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
<div class="col-12 col-sm-10 col-md-8 col-lg-6 col-xl-5">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user