Merge pull request 'title and notification history update' (#226) from frontend into main

Reviewed-on: #226
This commit is contained in:
ismail 2025-09-04 19:25:15 +03:00
commit df069d882d
64 changed files with 594 additions and 212 deletions

View File

@ -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):

View File

@ -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",

View File

@ -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"),

View File

@ -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')

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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 %}

View File

@ -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">

View File

@ -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">

View File

@ -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 %}

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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 {

View File

@ -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 %}

View File

@ -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">

View File

@ -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">

View 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>

View File

@ -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>

View File

@ -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>&bull;<a class="text-body-quaternary mx-1" href="">{% trans 'Terms' %}</a>&bull;<a class="text-body-quaternary ms-1" href="">Cookies</a> <a class="text-body-quaternary me-1" href="">{% trans 'Privacy policy' %}</a>&bull;<a class="text-body-quaternary mx-1" href="">{% trans 'Terms' %}</a>&bull;<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>

View File

@ -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 -->

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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">

View File

@ -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>

View File

@ -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">

View File

@ -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">

View File

@ -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 %}

View File

@ -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">

View File

@ -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>

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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"

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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"

View File

@ -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">

View File

@ -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">

View File

@ -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>

View File

@ -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" %}&nbsp;#{{ 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 %}

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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 ">

View File

@ -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">