Compare commits
8 Commits
933cdf6101
...
76ecf45a88
| Author | SHA1 | Date | |
|---|---|---|---|
| 76ecf45a88 | |||
| e2499f1725 | |||
|
|
7d8ea79cc9 | ||
| 6acbf4d6dd | |||
| 89fd86a7d6 | |||
|
|
de3f6cf558 | ||
| 808a00edd4 | |||
| fa89373030 |
@ -186,6 +186,17 @@ class CustomerForm(forms.ModelForm):
|
|||||||
"address",
|
"address",
|
||||||
'image',
|
'image',
|
||||||
]
|
]
|
||||||
|
widgets = {
|
||||||
|
'title': forms.Select(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'first_name': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'last_name': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'email': forms.EmailInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'phone_number': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'national_id': forms.TextInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'dob': DateInput(attrs={'class': 'form-control form-control-sm', 'type': 'date'}),
|
||||||
|
'address': forms.Textarea(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
'image': forms.FileInput(attrs={'class': 'form-control form-control-sm'}),
|
||||||
|
}
|
||||||
# class CustomerForm(forms.Form):
|
# class CustomerForm(forms.Form):
|
||||||
# """
|
# """
|
||||||
# Represents a form for collecting customer information.
|
# Represents a form for collecting customer information.
|
||||||
@ -1025,6 +1036,7 @@ class LeadForm(forms.ModelForm):
|
|||||||
"hx-swap": "outerHTML",
|
"hx-swap": "outerHTML",
|
||||||
"hx-on::before-request": "document.querySelector('#id_id_car_model').setAttribute('disabled', true)",
|
"hx-on::before-request": "document.querySelector('#id_id_car_model').setAttribute('disabled', true)",
|
||||||
"hx-on::after-request": "document.querySelector('#id_id_car_model').removeAttribute('disabled')",
|
"hx-on::after-request": "document.querySelector('#id_id_car_model').removeAttribute('disabled')",
|
||||||
|
"hx-indicator": "#spinner",
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
required=True,
|
required=True,
|
||||||
|
|||||||
@ -53,6 +53,11 @@ urlpatterns = [
|
|||||||
path("submit_plan/", views.submit_plan, name="submit_plan"),
|
path("submit_plan/", views.submit_plan, name="submit_plan"),
|
||||||
path('payment-callback/', views.payment_callback, name='payment_callback'),
|
path('payment-callback/', views.payment_callback, name='payment_callback'),
|
||||||
#
|
#
|
||||||
|
path(
|
||||||
|
"dealers/activity/",
|
||||||
|
views.UserActivityLogListView.as_view(),
|
||||||
|
name="dealer_activity",
|
||||||
|
),
|
||||||
path("dealers/<slug:slug>/settings/", views.DealerSettingsView, name="dealer_settings"),
|
path("dealers/<slug:slug>/settings/", views.DealerSettingsView, name="dealer_settings"),
|
||||||
path("dealers/assign-car-makes/", views.assign_car_makes, name="assign_car_makes"),
|
path("dealers/assign-car-makes/", views.assign_car_makes, name="assign_car_makes"),
|
||||||
path("dashboards/manager/", views.ManagerDashboard.as_view(), name="manager_dashboard"),
|
path("dashboards/manager/", views.ManagerDashboard.as_view(), name="manager_dashboard"),
|
||||||
@ -67,11 +72,6 @@ urlpatterns = [
|
|||||||
views.DealerUpdateView.as_view(),
|
views.DealerUpdateView.as_view(),
|
||||||
name="dealer_update",
|
name="dealer_update",
|
||||||
),
|
),
|
||||||
path(
|
|
||||||
"dealers/activity/",
|
|
||||||
views.UserActivityLogListView.as_view(),
|
|
||||||
name="dealer_activity",
|
|
||||||
),
|
|
||||||
# path('dealers/<int:pk>/delete/', views.DealerDeleteView.as_view(), name='dealer_delete'),
|
# path('dealers/<int:pk>/delete/', views.DealerDeleteView.as_view(), name='dealer_delete'),
|
||||||
# CRM URLs
|
# CRM URLs
|
||||||
path(
|
path(
|
||||||
|
|||||||
@ -28,6 +28,7 @@ from django.contrib import messages
|
|||||||
from django.http import Http404, JsonResponse, HttpResponseForbidden
|
from django.http import Http404, JsonResponse, HttpResponseForbidden
|
||||||
from django.forms import HiddenInput, ValidationError
|
from django.forms import HiddenInput, ValidationError
|
||||||
from django.shortcuts import HttpResponse
|
from django.shortcuts import HttpResponse
|
||||||
|
|
||||||
from django.db.models import Sum, F, Count
|
from django.db.models import Sum, F, Count
|
||||||
from django.core.paginator import Paginator
|
from django.core.paginator import Paginator
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
@ -2091,7 +2092,7 @@ class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView
|
|||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def delete_customer(request, pk):
|
def delete_customer(request, slug):
|
||||||
"""
|
"""
|
||||||
Deletes a customer from the system and deactivates the corresponding user account.
|
Deletes a customer from the system and deactivates the corresponding user account.
|
||||||
|
|
||||||
@ -2107,7 +2108,7 @@ def delete_customer(request, pk):
|
|||||||
:return: A redirect response to the customer list page.
|
:return: A redirect response to the customer list page.
|
||||||
:rtype: HttpResponseRedirect
|
:rtype: HttpResponseRedirect
|
||||||
"""
|
"""
|
||||||
customer = get_object_or_404(models.Customer, pk=pk)
|
customer = get_object_or_404(models.Customer, slug=slug)
|
||||||
customer.deactivate_account()
|
customer.deactivate_account()
|
||||||
messages.success(request, _("Customer deactivated successfully"))
|
messages.success(request, _("Customer deactivated successfully"))
|
||||||
return redirect("customer_list")
|
return redirect("customer_list")
|
||||||
@ -3760,7 +3761,7 @@ def create_sale_order(request, pk):
|
|||||||
models.Car.objects.get(vin=item.item_model.name).mark_as_sold(request)
|
models.Car.objects.get(vin=item.item_model.name).mark_as_sold(request)
|
||||||
|
|
||||||
messages.success(request, "Sale Order created successfully")
|
messages.success(request, "Sale Order created successfully")
|
||||||
return redirect("estimate_detail", pk=pk)
|
return redirect("estimate_detail", pk=estimate.pk)
|
||||||
|
|
||||||
form = forms.SaleOrderForm()
|
form = forms.SaleOrderForm()
|
||||||
form.fields["estimate"].queryset = EstimateModel.objects.filter(pk=pk)
|
form.fields["estimate"].queryset = EstimateModel.objects.filter(pk=pk)
|
||||||
@ -4246,7 +4247,6 @@ def invoice_create(request, pk):
|
|||||||
form = forms.InvoiceModelCreateForm(
|
form = forms.InvoiceModelCreateForm(
|
||||||
entity_slug=entity.slug, user_model=entity.admin
|
entity_slug=entity.slug, user_model=entity.admin
|
||||||
)
|
)
|
||||||
|
|
||||||
form.initial.update(
|
form.initial.update(
|
||||||
{
|
{
|
||||||
"customer": estimate.customer,
|
"customer": estimate.customer,
|
||||||
@ -4255,6 +4255,7 @@ def invoice_create(request, pk):
|
|||||||
"unearned_account": dealer.settings.invoice_unearned_account,
|
"unearned_account": dealer.settings.invoice_unearned_account,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
print(dir(form.fields["customer"]))
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"form": form,
|
"form": form,
|
||||||
@ -4675,11 +4676,15 @@ def lead_create(request):
|
|||||||
form = forms.LeadForm()
|
form = forms.LeadForm()
|
||||||
form.filter_qs(dealer=dealer)
|
form.filter_qs(dealer=dealer)
|
||||||
|
|
||||||
make = request.GET.get("id_car_make", None)
|
if make := request.GET.get("id_car_make", None):
|
||||||
if make:
|
|
||||||
form.fields["id_car_model"].queryset = models.CarModel.objects.filter(
|
form.fields["id_car_model"].queryset = models.CarModel.objects.filter(
|
||||||
id_car_make=int(make)
|
id_car_make=int(make)
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
if first_make := form.fields["id_car_make"].queryset.first():
|
||||||
|
form.fields["id_car_model"].queryset = models.CarModel.objects.filter(
|
||||||
|
id_car_make=first_make.id_car_make
|
||||||
|
)
|
||||||
return render(request, "crm/leads/lead_form.html", {"form": form})
|
return render(request, "crm/leads/lead_form.html", {"form": form})
|
||||||
|
|
||||||
def lead_tracking(request):
|
def lead_tracking(request):
|
||||||
@ -4769,7 +4774,7 @@ class LeadUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required("inventory.delete_lead", raise_exception=True)
|
@permission_required("inventory.delete_lead", raise_exception=True)
|
||||||
def LeadDeleteView(request, pk):
|
def LeadDeleteView(request, slug):
|
||||||
"""
|
"""
|
||||||
Handles the deletion of a Lead along with its associated customer and potentially
|
Handles the deletion of a Lead along with its associated customer and potentially
|
||||||
a related user account in the system. Ensures proper permissions and login
|
a related user account in the system. Ensures proper permissions and login
|
||||||
@ -4780,7 +4785,7 @@ def LeadDeleteView(request, pk):
|
|||||||
:param pk: The primary key identifier of the Lead to be deleted.
|
:param pk: The primary key identifier of the Lead to be deleted.
|
||||||
:return: An HTTP redirect response to the lead list page.
|
:return: An HTTP redirect response to the lead list page.
|
||||||
"""
|
"""
|
||||||
lead = get_object_or_404(models.Lead, pk=pk)
|
lead = get_object_or_404(models.Lead, slug=slug)
|
||||||
try:
|
try:
|
||||||
User.objects.get(email=lead.customer.email).delete()
|
User.objects.get(email=lead.customer.email).delete()
|
||||||
lead.customer.delete()
|
lead.customer.delete()
|
||||||
@ -5193,6 +5198,12 @@ class OpportunityCreateView(CreateView,SuccessMessageMixin, LoginRequiredMixin):
|
|||||||
dealer = get_user_type(self.request)
|
dealer = get_user_type(self.request)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
# def get_form_kwargs(self):
|
||||||
|
# kwargs = super().get_form_kwargs()
|
||||||
|
# dealer = get_user_type(self.request)
|
||||||
|
# kwargs["car"].queryset = models.Car.objects.filter(dealer=dealer,)
|
||||||
|
# return kwargs
|
||||||
|
|
||||||
# def get_initial(self):
|
# def get_initial(self):
|
||||||
# initial = super().get_initial()
|
# initial = super().get_initial()
|
||||||
# if self.kwargs.get("pk", None):
|
# if self.kwargs.get("pk", None):
|
||||||
|
|||||||
@ -1,11 +1,26 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load i18n static crispy_forms_filters %}
|
{% load i18n static crispy_forms_filters %}
|
||||||
|
{% block customcss %}
|
||||||
|
<style>
|
||||||
|
.htmx-indicator{
|
||||||
|
opacity:0;
|
||||||
|
transition: opacity 500ms ease-in;
|
||||||
|
}
|
||||||
|
.htmx-request .htmx-indicator{
|
||||||
|
opacity:1;
|
||||||
|
}
|
||||||
|
.htmx-request.htmx-indicator{
|
||||||
|
opacity:1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock customcss %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<h1>{% if object %}{{ _("Update") }}{% else %}{{ _("Create") }}{% endif %}</h1>
|
<h1>{% if object %}{{ _("Update") }}{% else %}{{ _("Create") }}{% endif %}</h1>
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-sm-6 col-md-8">
|
<div class="col-sm-6 col-md-8">
|
||||||
|
|
||||||
<form class="form" method="post">
|
<form class="form" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form|crispy }}
|
{{ form|crispy }}
|
||||||
@ -21,4 +36,23 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// First, create the spinner div (or use the existing one)
|
||||||
|
const spinner = document.createElement('div');
|
||||||
|
spinner.id = 'spinner';
|
||||||
|
spinner.className = 'htmx-indicator spinner-border inline-spinner';
|
||||||
|
spinner.setAttribute('role', 'status');
|
||||||
|
spinner.innerHTML = '<span class="visually-hidden">Loading...</span>';
|
||||||
|
|
||||||
|
// Find the form field you want to place it next to
|
||||||
|
// Replace 'id_your_field_name' with the actual ID of your form field
|
||||||
|
const targetField = document.getElementById('div_id_id_car_model');
|
||||||
|
|
||||||
|
if (targetField) {
|
||||||
|
// Insert the spinner right after the target field
|
||||||
|
targetField.parentNode.insertBefore(spinner, targetField.nextSibling);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -132,9 +132,7 @@
|
|||||||
{{ _("Action") }}
|
{{ _("Action") }}
|
||||||
</th>
|
</th>
|
||||||
<th class="text-end white-space-nowrap align-middle" scope="col"></th>
|
<th class="text-end white-space-nowrap align-middle" scope="col"></th>
|
||||||
</tr>
|
</tr>image
|
||||||
</thead>
|
|
||||||
<tbody class="list" id="lead-tables-body">
|
|
||||||
{% for lead in leads %}
|
{% for lead in leads %}
|
||||||
<!-- Delete Modal -->
|
<!-- Delete Modal -->
|
||||||
<div class="modal fade" id="deleteModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
|
<div class="modal fade" id="deleteModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
|
||||||
@ -159,7 +157,7 @@
|
|||||||
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
||||||
<td class="name align-middle white-space-nowrap ps-0">
|
<td class="name align-middle white-space-nowrap ps-0">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div><a class="fs-8 fw-bold" href="{% url 'lead_detail' lead.slug %}">{{lead.full_name}}</a>
|
<div><a class="fs-8 fw-bold" href="{% url 'lead_detail' lead.slug %}">{{lead.full_name|capfirst}}</a>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<p class="mb-0 text-body-highlight fw-semibold fs-9 me-2"></p>
|
<p class="mb-0 text-body-highlight fw-semibold fs-9 me-2"></p>
|
||||||
{% if lead.status == "new" %}
|
{% if lead.status == "new" %}
|
||||||
|
|||||||
@ -41,7 +41,11 @@
|
|||||||
<div class="card-body d-flex flex-column justify-content-between pb-3">
|
<div class="card-body d-flex flex-column justify-content-between pb-3">
|
||||||
<div class="row align-items-center g-5 mb-3 text-center text-sm-start">
|
<div class="row align-items-center g-5 mb-3 text-center text-sm-start">
|
||||||
<div class="col-12 col-sm-auto mb-sm-2">
|
<div class="col-12 col-sm-auto mb-sm-2">
|
||||||
<div class="avatar avatar-5xl"><img class="rounded-circle" src="{{ customer.image.url }}" alt="" /></div>
|
<div class="avatar avatar-5xl">
|
||||||
|
{% if customer.image %}
|
||||||
|
<img class="rounded-circle" src="{{ customer.image.url }}" alt="" />
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-sm-auto flex-1">
|
<div class="col-12 col-sm-auto flex-1">
|
||||||
<h3>{{ customer.full_name }}</h3>
|
<h3>{{ customer.full_name }}</h3>
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
{% if not car.ready %}
|
{% if not car.ready %}
|
||||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||||
<i class="fa-solid fa-circle-info fs-6"></i>
|
<i class="fa-solid fa-circle-info fs-6"></i>
|
||||||
<p class="mb-0 flex-1">{{ _("This car information is not complete , please add colors and finances before making it ready for sale .") }}</p>
|
<p class="mb-0 flex-1">{{ _("This car information is not complete , please add colors and finances before making it ready for sale .") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'add_color' car.slug %}"> {{ _("Add Color") }} </a></p>
|
||||||
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@ -11,23 +11,24 @@
|
|||||||
<a href="{% url 'bank_account_create' %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Bank Account" %}</a>
|
<a href="{% url 'bank_account_create' %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Bank Account" %}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-responsive px-1 scrollbar">
|
<div class="table-responsive px-1 scrollbar mt-3">
|
||||||
<table class="table fs-9 mb-0 border-top border-translucent">
|
<table class="table align-items-center table-flush">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Name" %}</th>
|
<tr class="bg-body-highlight">
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Account Number" %}</th>
|
<th class="border-top border-translucent ps-3">{% trans "Name" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Type" %}</th>
|
<th class="border-top border-translucent ps-3">{% trans "Account Number" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Action" %}</th>
|
<th class="border-top border-translucent text-end pe-3">{% trans "Type" %}</th>
|
||||||
|
<th class="border-top border-translucent text-end pe-3" scope="col">{% trans "Action" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="list">
|
<tbody class="list">
|
||||||
{% for bank in bank_accounts %}
|
{% for bank in bank_accounts %}
|
||||||
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
||||||
<td class="align-middle product white-space-nowrap">{{ bank.name }}</td>
|
<td class="align-middle ps-3">{{ bank.name }}</td>
|
||||||
<td class="align-middle product white-space-nowrap py-0">{{ bank.account_number }}</td>
|
<td class="align-middle ps-3">{{ bank.account_number }}</td>
|
||||||
<td class="align-middle product white-space-nowrap py-0">{{ bank.account_type|capfirst }}</td>
|
<td class="align-middle product text-end pe-3 ">{{ bank.account_type|capfirst }}</td>
|
||||||
<td class="">
|
<td class="align-middle product text-end pe-3 ">
|
||||||
<a href="{% url 'bank_account_update' bank.pk %}"
|
<a href="{% url 'bank_account_update' bank.pk %}"
|
||||||
class="btn btn-sm btn-phoenix-success">
|
class="btn btn-sm btn-phoenix-success">
|
||||||
{% trans "Update" %}
|
{% trans "Update" %}
|
||||||
@ -42,8 +43,14 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex justify-content-center">
|
<div class="d-flex justify-content-center">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -16,7 +16,7 @@
|
|||||||
<div class="table-responsive px-1 scrollbar mt-3">
|
<div class="table-responsive px-1 scrollbar mt-3">
|
||||||
<table class="table fs-9 mb-0 border-top border-translucent">
|
<table class="table fs-9 mb-0 border-top border-translucent">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr class="bg-body-highlight">
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Ledger Name" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Ledger Name" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Journal Entries" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Journal Entries" %}</th>
|
||||||
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Created Date" %}</th>
|
<th class="sort white-space-nowrap align-middle" scope="col">{% trans "Created Date" %}</th>
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<h1 class="mb-2 mb-lg-0">{% trans "Payment Failed" %}</h1>
|
<h1 class="mb-2 mb-lg-0">{% trans "Payment Failed" %}</h1>
|
||||||
<nav class="breadcrumbs">
|
<nav class="breadcrumbs">
|
||||||
<ol>
|
<ol>
|
||||||
<li><a href="">{% trans "Home"%}</a></li>
|
<li><a href="{% url 'home' %}">{% trans "Home"%}</a></li>
|
||||||
<li class="current">{% trans "Failed"%}</li>
|
<li class="current">{% trans "Failed"%}</li>
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
@ -28,7 +28,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<p class="lead">{% trans "We couldn't process your payment. Please try again"%}.</p>
|
<p class="lead">{% trans "We couldn't process your payment. Please try again"%}.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="" class="btn btn-primary mt-3">
|
<a href="{% url 'home' %}" class="btn btn-primary mt-3">
|
||||||
<i class="bi bi-house-door"></i> {% trans "Back to Home"%}
|
<i class="bi bi-house-door"></i> {% trans "Back to Home"%}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
<i class="bi bi-house-door"></i> View Invoice
|
<i class="bi bi-house-door"></i> View Invoice
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="" class="btn btn-primary mt-3">
|
<a href="{% url 'home' %}" class="btn btn-primary mt-3">
|
||||||
<i class="bi bi-house-door"></i> Back to Home
|
<i class="bi bi-house-door"></i> Back to Home
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -52,7 +52,6 @@
|
|||||||
<h1 class="text-center mb-5">{{ _("Choose Your Plan")}}</h1>
|
<h1 class="text-center mb-5">{{ _("Choose Your Plan")}}</h1>
|
||||||
<form method="POST" action="{% url 'submit_plan' %}" id="wizardForm">
|
<form method="POST" action="{% url 'submit_plan' %}" id="wizardForm">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<!-- Step 1: Plan Selection -->
|
<!-- Step 1: Plan Selection -->
|
||||||
<div class="step" id="step1">
|
<div class="step" id="step1">
|
||||||
<h4 class="mb-4">1. {{ _("Select a Plan")}}</h4>
|
<h4 class="mb-4">1. {{ _("Select a Plan")}}</h4>
|
||||||
@ -208,6 +207,27 @@
|
|||||||
{% block customJS %}
|
{% block customJS %}
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
const form = document.getElementById('wizardForm');
|
||||||
|
|
||||||
|
form.addEventListener('submit', function(e) {
|
||||||
|
e.preventDefault(); // Prevent default form submission
|
||||||
|
|
||||||
|
// Show loading alert
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Processing...',
|
||||||
|
html: 'Please wait while we submit your form',
|
||||||
|
allowOutsideClick: false,
|
||||||
|
didOpen: () => {
|
||||||
|
Swal.showLoading();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Submit the form after a slight delay to ensure Swal is shown
|
||||||
|
setTimeout(() => {
|
||||||
|
form.submit();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
const radios = document.querySelectorAll('.btn-check');
|
const radios = document.querySelectorAll('.btn-check');
|
||||||
radios.forEach(radio => {
|
radios.forEach(radio => {
|
||||||
radio.addEventListener('change', function () {
|
radio.addEventListener('change', function () {
|
||||||
|
|||||||
@ -17,14 +17,14 @@
|
|||||||
{% if not items %}
|
{% if not items %}
|
||||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||||
<i class="fa-solid fa-circle-info fs-6"></i>
|
<i class="fa-solid fa-circle-info fs-6"></i>
|
||||||
<p class="mb-0 flex-1">{{ _("Please add at least one car before creating a quotation.") }}</p>
|
<p class="mb-0 flex-1">{{ _("Please add at least one car before creating a quotation.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'car_add' %}"> {{ _("Add Car") }} </a></p>
|
||||||
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if not customer_count %}
|
{% if not customer_count %}
|
||||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||||
<i class="fa-solid fa-circle-info fs-6"></i>
|
<i class="fa-solid fa-circle-info fs-6"></i>
|
||||||
<p class="mb-0 flex-1"> {{ _("Please add at least one customer before creating a quotation.") }}</p>
|
<p class="mb-0 flex-1"> {{ _("Please add at least one customer before creating a quotation.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'customer_create' %}"> {{ _("Add Customer") }} </a></p>
|
||||||
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user