Merge pull request 'HTMX' (#146) from frontend into main
Reviewed-on: #146
This commit is contained in:
commit
d164e6da82
@ -650,6 +650,7 @@ class Car(Base):
|
||||
default=CarStatusChoices.AVAILABLE,
|
||||
verbose_name=_("Status"),
|
||||
)
|
||||
|
||||
stock_type = models.CharField(
|
||||
max_length=10,
|
||||
choices=CarStockTypeChoices.choices,
|
||||
@ -659,6 +660,7 @@ class Car(Base):
|
||||
remarks = models.TextField(blank=True, null=True, verbose_name=_("Remarks"))
|
||||
mileage = models.IntegerField(blank=True, null=True, verbose_name=_("Mileage"))
|
||||
receiving_date = models.DateTimeField(verbose_name=_("Receiving Date"))
|
||||
sold_date=models.DateTimeField(verbose_name=_("Sold Date"))
|
||||
hash = models.CharField(
|
||||
max_length=64, blank=True, null=True, verbose_name=_("Hash")
|
||||
)
|
||||
@ -932,7 +934,8 @@ class CarFinance(models.Model):
|
||||
verbose_name=_("Discount Amount"),
|
||||
default=Decimal("0.00"),
|
||||
)
|
||||
is_sold = models.BooleanField(default=False)
|
||||
# is_sold = models.BooleanField(default=False)
|
||||
|
||||
|
||||
@property
|
||||
def total(self):
|
||||
@ -3357,13 +3360,17 @@ class ExtraInfo(models.Model):
|
||||
related_object_id=staff.pk,
|
||||
)
|
||||
# qs = qs.select_related("customer","estimate","invoice")
|
||||
return [
|
||||
x.content_object.sale_orders.select_related(
|
||||
"customer", "estimate", "invoice"
|
||||
).first()
|
||||
for x in qs
|
||||
if x.content_object.sale_orders.first()
|
||||
]
|
||||
data = SaleOrder.objects.filter(pk__in=[x.content_object.sale_orders.select_related("customer","estimate","invoice").first().pk for x in qs if x.content_object.sale_orders.first()])
|
||||
|
||||
return data
|
||||
|
||||
# return [
|
||||
# x.content_object.sale_orders.select_related(
|
||||
# "customer", "estimate", "invoice"
|
||||
# ).first()
|
||||
# for x in qs
|
||||
# if x.content_object.sale_orders.first()
|
||||
# ]
|
||||
|
||||
@classmethod
|
||||
def get_invoices(cls, staff=None, is_dealer=False,dealer=None):
|
||||
|
||||
@ -294,7 +294,8 @@ def update_item_model_cost(sender, instance, created, **kwargs):
|
||||
:param kwargs: Additional keyword arguments passed during the signal invocation.
|
||||
:return: None
|
||||
"""
|
||||
if created and not instance.is_sold:
|
||||
# if created and not instance.is_sold:
|
||||
if created:
|
||||
entity = instance.car.dealer.entity
|
||||
coa = entity.get_default_coa()
|
||||
inventory_account = (
|
||||
|
||||
@ -1250,6 +1250,22 @@ urlpatterns = [
|
||||
views.PurchaseOrderMarkAsVoidView.as_view(),
|
||||
name="po-action-mark-as-void",
|
||||
),
|
||||
|
||||
# reports
|
||||
path(
|
||||
"<slug:dealer_slug>/purchase-report/",
|
||||
views.purchase_report_view,
|
||||
name="po-report",
|
||||
),
|
||||
path('purchase-report/<slug:dealer_slug>/csv/', views.purchase_report_csv_export, name='purchase-report-csv-export'),
|
||||
|
||||
path(
|
||||
"<slug:dealer_slug>/car-sale-report/",
|
||||
views.car_sale_report_view,
|
||||
name="car-sale-report",
|
||||
),
|
||||
path('car-sale-report/<slug:dealer_slug>/csv/', views.car_sale_report_csv_export, name='car-sale-report-csv-export'),
|
||||
|
||||
]
|
||||
|
||||
handler404 = "inventory.views.custom_page_not_found_view"
|
||||
|
||||
@ -67,12 +67,15 @@ def get_jwt_token():
|
||||
try:
|
||||
response = requests.post(url, headers=headers, json=data)
|
||||
response.raise_for_status()
|
||||
# logging for success
|
||||
#logging for success
|
||||
logger.info("Successfully fetched JWT token.")
|
||||
return response.text
|
||||
except requests.exceptions.RequestException as e:
|
||||
# logging for error
|
||||
logger.error(f"HTTP error fetching JWT token from {url}: ", exc_info=True)
|
||||
#logging for error
|
||||
logger.error(
|
||||
f"HTTP error fetching JWT token from {url}: ",
|
||||
exc_info=True
|
||||
)
|
||||
print(f"Error obtaining JWT token: {e}")
|
||||
return None
|
||||
|
||||
@ -160,7 +163,7 @@ def send_email(from_, to_, subject, message):
|
||||
message = message
|
||||
from_email = from_
|
||||
recipient_list = [to_]
|
||||
async_task(send_mail, subject, message, from_email, recipient_list)
|
||||
async_task(send_mail,subject, message, from_email, recipient_list)
|
||||
|
||||
|
||||
def get_user_type(request):
|
||||
@ -226,7 +229,7 @@ def reserve_car(car, request):
|
||||
)
|
||||
car.status = models.CarStatusChoices.RESERVED
|
||||
car.save()
|
||||
# --- Logging for Success ---
|
||||
# --- Logging for Success ---
|
||||
logger.info(
|
||||
f"Car {car.pk} ('{car.id_car_make} {car.id_car_model}') reserved successfully "
|
||||
f"by user {request.user}. "
|
||||
@ -240,7 +243,7 @@ def reserve_car(car, request):
|
||||
f"Error reserving car {car.pk} ('{car.id_car_make} {car.id_car_model}') "
|
||||
f"for user {request.user} . "
|
||||
f"Error: {e}",
|
||||
exc_info=True,
|
||||
exc_info=True
|
||||
)
|
||||
messages.error(request, f"Error reserving car: {e}")
|
||||
|
||||
@ -1024,7 +1027,7 @@ class CarFinanceCalculator:
|
||||
|
||||
|
||||
def _get_vat_rate(self):
|
||||
vat = models.VatRate.objects.filter(dealer=self.dealer, is_active=True).first()
|
||||
vat = models.VatRate.objects.filter(dealer=self.dealer,is_active=True).first()
|
||||
if not vat:
|
||||
raise ObjectDoesNotExist("No active VAT rate found")
|
||||
return vat.rate
|
||||
@ -1083,7 +1086,7 @@ class CarFinanceCalculator:
|
||||
total_additionals = sum(
|
||||
Decimal(item.price_) for item in self._get_additional_services())
|
||||
|
||||
total_discount = self.extra_info.data.get("discount", 0)
|
||||
total_discount = self.extra_info.data.get("discount",0)
|
||||
|
||||
total_price_discounted = total_price
|
||||
if total_discount:
|
||||
@ -1623,7 +1626,6 @@ def create_make_accounts(dealer):
|
||||
active=True,
|
||||
)
|
||||
|
||||
|
||||
def handle_payment(request, order):
|
||||
url = "https://api.moyasar.com/v1/payments"
|
||||
callback_url = request.build_absolute_uri(
|
||||
|
||||
@ -1494,7 +1494,7 @@ class CarFinanceCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateVi
|
||||
form_class = forms.CarFinanceForm
|
||||
template_name = "inventory/car_finance_form.html"
|
||||
permission_required = ["inventory.add_carfinance"]
|
||||
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.car = get_object_or_404(models.Car, slug=self.kwargs["slug"])
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
@ -1513,6 +1513,7 @@ class CarFinanceCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateVi
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context["car"] = self.car
|
||||
print(self.car)
|
||||
return context
|
||||
|
||||
# def get_form(self, form_class=None):
|
||||
@ -4319,8 +4320,8 @@ def sales_list_view(request, dealer_slug):
|
||||
item transactions specific to the user's entity.
|
||||
:rtype: HttpResponse
|
||||
"""
|
||||
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
||||
entity = dealer.entity
|
||||
|
||||
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
||||
staff = getattr(request.user.staffmember, "staff", None)
|
||||
qs = []
|
||||
try:
|
||||
@ -4448,16 +4449,19 @@ class EstimateListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
entity = dealer.entity
|
||||
status = self.request.GET.get("status")
|
||||
queryset = entity.get_estimates()
|
||||
|
||||
type(queryset)
|
||||
if status:
|
||||
queryset = queryset.filter(status=status)
|
||||
# search_query = self.request.GET.get('q', '').strip()
|
||||
# if search_query:
|
||||
# queryset = queryset.filter(
|
||||
# Q(quotation_number__icontains=search_query) |
|
||||
# Q(customer__name__icontains=search_query)
|
||||
for f in queryset.first()._meta.get_fields():
|
||||
print(f)
|
||||
search_query = self.request.GET.get('q', '').strip()
|
||||
print(search_query)
|
||||
if search_query:
|
||||
print("inside")
|
||||
queryset = queryset.filter(
|
||||
Q(estimate_number__icontains=search_query)
|
||||
|
||||
# ).distinct() #
|
||||
).distinct()
|
||||
|
||||
return queryset
|
||||
|
||||
@ -4570,7 +4574,7 @@ def create_estimate(request, dealer_slug, slug=None):
|
||||
for item in items_list:
|
||||
car_instance = models.Car.objects.filter(
|
||||
hash=item.get("item_id"),
|
||||
finances__is_sold=False,
|
||||
# finances__is_sold=False,
|
||||
colors__isnull=False,
|
||||
finances__isnull=False,
|
||||
finances__marked_price__gt=1,
|
||||
@ -7233,7 +7237,7 @@ class ItemServiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView)
|
||||
return qs
|
||||
|
||||
|
||||
class ItemExpenseCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
|
||||
class ItemExpenseCreateView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMixin, CreateView):
|
||||
"""
|
||||
Represents a view for creating item expense entries.
|
||||
|
||||
@ -7258,6 +7262,7 @@ class ItemExpenseCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateV
|
||||
form_class = ExpenseItemCreateForm
|
||||
template_name = "items/expenses/expense_create.html"
|
||||
success_url = reverse_lazy("item_expense_list")
|
||||
success_message = "heeeeeeeee"
|
||||
permission_required = ["django_ledger.add_itemmodel"]
|
||||
|
||||
def get_form_kwargs(self):
|
||||
@ -7398,7 +7403,7 @@ class BillListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
return context
|
||||
|
||||
|
||||
class BillModelCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
|
||||
class BillModelCreateView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMixin, CreateView):
|
||||
template_name = "bill/bill_create.html"
|
||||
PAGE_TITLE = _("Create Bill")
|
||||
permission_required = "django_ledger.add_billmodel"
|
||||
@ -7409,6 +7414,7 @@ class BillModelCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateVie
|
||||
}
|
||||
for_purchase_order = False
|
||||
for_estimate = False
|
||||
success_message = "Bill Created"
|
||||
|
||||
# Get user info for logging
|
||||
|
||||
@ -10393,7 +10399,7 @@ def upload_cars(request, dealer_slug, pk=None):
|
||||
|
||||
form = forms.CSVUploadForm()
|
||||
form.fields["vendor"].queryset = dealer.vendors.all()
|
||||
|
||||
print(request)
|
||||
return render(
|
||||
request,
|
||||
"csv_upload.html",
|
||||
@ -10439,3 +10445,155 @@ def bulk_update_car_price(request):
|
||||
class InventoryListView(InventoryListViewBase):
|
||||
template_name = "inventory/list.html"
|
||||
permission_required = ["django_ledger.view_purchaseordermodel"]
|
||||
|
||||
@login_required
|
||||
def purchase_report_view(request,dealer_slug):
|
||||
pos = request.entity.get_purchase_orders()
|
||||
data = []
|
||||
total_po_amount=0
|
||||
total_po_cars=0
|
||||
for po in pos:
|
||||
items = [{"total":x.total_amount,"q":x.quantity} for x in po.get_itemtxs_data()[0].all()]
|
||||
|
||||
po_amount=0
|
||||
po_quantity=0
|
||||
for item in items:
|
||||
po_amount+=item["total"]
|
||||
po_quantity+=item["q"]
|
||||
|
||||
total_po_amount+=po_amount
|
||||
total_po_cars+=po_quantity
|
||||
bills=po.get_po_bill_queryset()
|
||||
vendors=set([bill.vendor.vendor_name for bill in bills])
|
||||
vendors_str = ", ".join(sorted(list(vendors))) if vendors else "N/A"
|
||||
data.append({"po_number":po.po_number,"po_created":po.created,"po_status":po.po_status,"po_fulfilled_date":po.date_fulfilled,"po_amount":po_amount,
|
||||
"po_quantity":po_quantity,"vendors_str":vendors_str})
|
||||
|
||||
current_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
context={
|
||||
"dealer":request.entity.name,
|
||||
"time":current_time,
|
||||
"data":data,
|
||||
"total_po_amount":total_po_amount,
|
||||
"total_po_cars":total_po_cars,
|
||||
"current_time":current_time
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return render(request,'ledger/reports/purchase_report.html',context)
|
||||
|
||||
|
||||
def purchase_report_csv_export(request,dealer_slug):
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
|
||||
|
||||
current_time = timezone.now().strftime("%Y-%m-%d_%H%M%S")
|
||||
filename = f"purchase_report_{dealer_slug}_{current_time}.csv"
|
||||
response['Content-Disposition'] = f'attachment; filename="{filename}"'
|
||||
|
||||
writer = csv.writer(response)
|
||||
|
||||
|
||||
header = [
|
||||
'PO Number',
|
||||
'Created Date',
|
||||
'Status',
|
||||
'Fulfilled Date',
|
||||
'PO Amount',
|
||||
'PO Quantity',
|
||||
'Vendors'
|
||||
]
|
||||
writer.writerow(header)
|
||||
pos = request.entity.get_purchase_orders()
|
||||
|
||||
for po in pos:
|
||||
po_amount = 0
|
||||
po_quantity = 0
|
||||
items = [{"total":x.total_amount,"q":x.quantity} for x in po.get_itemtxs_data()[0].all()]
|
||||
|
||||
for item in items:
|
||||
po_amount += item["total"]
|
||||
po_quantity += item["q"]
|
||||
|
||||
bills = po.get_po_bill_queryset()
|
||||
vendors = set([bill.vendor.vendor_name for bill in bills ])
|
||||
vendors_str = ", ".join(sorted(list(vendors))) if vendors else "N/A"
|
||||
|
||||
|
||||
writer.writerow([
|
||||
po.po_number,
|
||||
po.created.strftime("%Y-%m-%d %H:%M:%S") if po.created else '',
|
||||
po.get_po_status_display(),
|
||||
po.date_fulfilled.strftime("%Y-%m-%d") if po.date_fulfilled else '',
|
||||
f"{po_amount:.2f}",
|
||||
po_quantity,
|
||||
vendors_str
|
||||
])
|
||||
return response
|
||||
|
||||
@login_required
|
||||
def car_sale_report_view(request,dealer_slug):
|
||||
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
|
||||
cars_sold = models.Car.objects.filter(dealer=dealer,status='sold')
|
||||
current_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
context={'cars_sold':cars_sold,'current_time':current_time }
|
||||
return render(request,'ledger/reports/car_sale_report.html',context)
|
||||
|
||||
|
||||
def car_sale_report_csv_export(request,dealer_slug):
|
||||
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
|
||||
|
||||
current_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
filename = f"sales_report_{dealer_slug}_{current_time}.csv"
|
||||
response['Content-Disposition'] = f'attachment; filename="{filename}"'
|
||||
|
||||
writer = csv.writer(response)
|
||||
|
||||
header=[
|
||||
'Make',
|
||||
'VIN',
|
||||
'Model',
|
||||
'Year',
|
||||
'Serie',
|
||||
'Trim',
|
||||
'Mileage',
|
||||
'Stock Type',
|
||||
'Created Date',
|
||||
'Sold Date',
|
||||
'Cost Price',
|
||||
'Marked Price',
|
||||
'Discount Amount',
|
||||
'Selling Price',
|
||||
'Tax Amount',
|
||||
'Invoice Number',
|
||||
]
|
||||
writer.writerow(header)
|
||||
|
||||
dealer=get_object_or_404(models.Dealer,slug=dealer_slug)
|
||||
cars_sold=models.Car.objects.filter(dealer=dealer,status='sold')
|
||||
for car in cars_sold:
|
||||
writer.writerow([
|
||||
car.vin,
|
||||
car.id_car_make.name,
|
||||
car.id_car_model.name,
|
||||
car.year,
|
||||
car.id_car_serie.name,
|
||||
car.id_car_trim.name,
|
||||
car.mileage,
|
||||
car.stock_type,
|
||||
car.created_at.strftime("%Y-%m-%d %H:%M:%S") if car.created_at else '',
|
||||
car.sold_date.strftime("%Y-%m-%d %H:%M:%S") if car.created_at else '',
|
||||
car.finances.cost_price,
|
||||
car.finances.marked_price,
|
||||
car.finances.discount_amount,
|
||||
car.finances.selling_price,
|
||||
car.finances.vat_amount,
|
||||
car.item_model.invoicemodel_set.first().invoice_number
|
||||
])
|
||||
|
||||
return response
|
||||
|
||||
@ -38,7 +38,7 @@
|
||||
<meta name="msapplication-TileImage"
|
||||
content="{% static 'images/logos/logo-d.png' %}">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
{% comment %} <script src="{% static 'vendors/simplebar/simplebar.min.js' %}"></script> {% endcomment %}
|
||||
<script src="{% static 'vendors/simplebar/simplebar.min.js' %}"></script>
|
||||
<script src="{% static 'js/config.js' %}"></script>
|
||||
<script src="{% static 'js/sweetalert2.all.min.js' %}"></script>
|
||||
{% comment %} <link href="{% static 'vendors/mapbox-gl/mapbox-gl.css' %}" rel="stylesheet"> {% endcomment %}
|
||||
@ -81,8 +81,11 @@
|
||||
{% include "plans/expiration_messages.html" %}
|
||||
{% block period_navigation %}
|
||||
{% endblock period_navigation %}
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
<div id="main_content" hx-boost="true" hx-target="#main_content" hx-select="#main_content" hx-swap="outerHTML" hx-select-oob="#toast-container" hx-history-elt>
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
<script src="{% static 'vendors/popper/popper.min.js' %}"></script>
|
||||
</div>
|
||||
{% block body %}
|
||||
{% endblock body %}
|
||||
{% include 'footer.html' %}
|
||||
|
||||
@ -3,13 +3,24 @@
|
||||
{% load static %}
|
||||
{% load django_ledger %}
|
||||
{% load crispy_forms_filters %}
|
||||
{% block title %}
|
||||
{{ _("Create Bill") |capfirst }}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
{% comment %} <div class="row justify-content-center">
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header bg-light py-3">
|
||||
<h2 class="h4 text-center mb-0">{% trans 'Create Bill' %}</h2>
|
||||
</div>
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% trans 'Create Bill' %}<span class="fas fa-money-bills ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form action="{{ form_action_url }}" method="post" id="djl-bill-model-create-form-id">
|
||||
<div class="card-body">
|
||||
|
||||
@ -33,51 +44,19 @@
|
||||
|
||||
<div class="card-footer bg-transparent">
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" id="djl-bill-create-button" class="btn btn-phoenix-primary btn-lg">{% trans 'Create' %}
|
||||
<button type="submit"
|
||||
id="djl-bill-create-button"
|
||||
class="btn btn-phoenix-primary btn-lg">{% trans 'Create' %}
|
||||
</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" id="djl-bill-create-back-button" class="btn btn-phoenix-secondary">{% trans 'Cancel' %}</a>
|
||||
<a href="{% url 'bill_list' request.dealer.slug%}"
|
||||
id="djl-bill-create-back-button"
|
||||
class="btn btn-phoenix-secondary">{% trans 'Cancel' %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{% trans 'Create Bill' %}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form action="{{ form_action_url }}"
|
||||
method="post"
|
||||
id="djl-bill-model-create-form-id">
|
||||
<div class="card-body">
|
||||
{% csrf_token %}
|
||||
{% if po_model %}
|
||||
<div class="text-center mb-4">
|
||||
<h3 class="h5">{% trans 'Bill for' %} {{ po_model.po_number }}</h3>
|
||||
<p class="text-muted mb-3">{% trans 'Bill for' %} {{ po_model.po_title }}</p>
|
||||
<div class="d-flex flex-column gap-2">
|
||||
{% for itemtxs in po_itemtxs_qs %}<span class="badge bg-secondary">{{ itemtxs }}</span>{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="mb-4">{{ form|crispy }}</div>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent">
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit"
|
||||
id="djl-bill-create-button"
|
||||
class="btn btn-phoenix-primary btn-lg">{% trans 'Create' %}</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
id="djl-bill-create-back-button"
|
||||
class="btn btn-phoenix-secondary">{% trans 'Cancel' %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -198,7 +198,7 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-footer p-0">
|
||||
<div class="d-flex flex-wrap gap-2 mt-2">
|
||||
<div class="d-flex flex-wrap gap-2 mt-2" hx-boost="false">
|
||||
<!-- Update Button -->
|
||||
{% if perms.django_ledger.change_billmodel %}
|
||||
<button class="btn btn-phoenix-primary"
|
||||
|
||||
@ -32,13 +32,14 @@
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-300 py-3 border-0 rounded-top-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% if object %}
|
||||
{{ _("Update Lead") }}
|
||||
{% else %}
|
||||
{{ _("Create New Lead") }}
|
||||
{% endif %}
|
||||
<li class="fas fa-bullhorn text-primary ms-2"></li>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
@ -51,9 +52,8 @@
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-phoenix-danger btn-lg">
|
||||
<i class="fa-solid fa-ban me-1"></i>
|
||||
<a href="{% url 'lead_list' request.dealer.slug %}" class="btn btn-phoenix-danger btn-lg">
|
||||
<i class="fa-solid fa-ban me-1"></i>
|
||||
{% trans "Cancel" %}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@ -3,8 +3,7 @@
|
||||
<div class="content">
|
||||
<h2 class="mb-5">{{ _("Notifications") }}</h2>
|
||||
<div class="d-flex justify-content-end mb-3">
|
||||
<a href="{% url 'mark_all_notifications_as_read' %}"
|
||||
class="btn btn-primary"><i class="far fa-envelope fs-8 me-2"></i>{{ _("Mark all as read") }}</a>
|
||||
<a href="{% url 'mark_all_notifications_as_read' %}" class="btn btn-phoenix-primary"><i class="far fa-envelope fs-8 me-2"></i>{{ _("Mark all as read") }}</a>
|
||||
</div>
|
||||
{% if notifications %}
|
||||
<div class="mx-n4 mx-lg-n6 mb-5 border-bottom">
|
||||
|
||||
@ -9,162 +9,201 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="container-fluid">
|
||||
<div class="row g-3 mb-4 align-items-center">
|
||||
<div class="col">
|
||||
<h2 class="mb-0">
|
||||
{% if form.instance.pk %}
|
||||
{% trans "Edit Opportunity" %}
|
||||
{% else %}
|
||||
{% trans "Create New Opportunity" %}
|
||||
{% endif %}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<a href="{% url 'opportunity_list' request.dealer.slug %}"
|
||||
class="btn btn-phoenix-secondary">
|
||||
<span class="fas fa-arrow-left me-2"></span>{% trans "Back to list" %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
<div class="card">
|
||||
<div class="card-body p-4 p-sm-5">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{% if form.non_field_errors %}<div class="alert alert-danger">{{ form.non_field_errors }}</div>{% endif %}
|
||||
<!-- Lead Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.lead.id_for_label }}">
|
||||
{{ form.lead.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.lead|add_class:"form-control" }}
|
||||
{% if form.lead.errors %}<div class="invalid-feedback d-block">{{ form.lead.errors }}</div>{% endif %}
|
||||
</div>
|
||||
<!-- Car Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.car.id_for_label }}">
|
||||
{{ form.car.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.car|add_class:"form-control" }}
|
||||
{% if form.car.errors %}<div class="invalid-feedback d-block">{{ form.car.errors }}</div>{% endif %}
|
||||
</div>
|
||||
<!-- Stage Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.stage.id_for_label }}">
|
||||
{{ form.stage.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.stage|add_class:"form-control" }}
|
||||
{% if form.stage.errors %}<div class="invalid-feedback d-block">{{ form.stage.errors }}</div>{% endif %}
|
||||
</div>
|
||||
<!-- Amount Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.amount.id_for_label }}">
|
||||
{{ form.amount.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
||||
{{ form.amount|add_class:"form-control" }}
|
||||
</div>
|
||||
{% if form.amount.errors %}<div class="invalid-feedback d-block">{{ form.amount.errors }}</div>{% endif %}
|
||||
</div>
|
||||
<!-- Probability Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.probability.id_for_label }}">
|
||||
{{ form.probability.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<input type="range"
|
||||
name="{{ form.probability.name }}"
|
||||
id="{{ form.probability.id_for_label }}"
|
||||
min="0"
|
||||
max="100"
|
||||
step="1"
|
||||
value="{{ form.probability.value|default:'50' }}"
|
||||
class="form-control form-range"
|
||||
oninput="updateProbabilityValue(this.value)">
|
||||
<span id="probability-value"
|
||||
class="badge badge-phoenix fs-6 badge-phoenix-primary">
|
||||
{{ form.probability.value|default:'50' }}%
|
||||
</span>
|
||||
</div>
|
||||
{% if form.probability.errors %}<div class="invalid-feedback d-block">{{ form.probability.errors }}</div>{% endif %}
|
||||
</div>
|
||||
<!-- Expected Revenue -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.expected_revenue.id_for_label }}">{{ form.expected_revenue.label }}</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
||||
{{ form.expected_revenue|add_class:"form-control" }}
|
||||
</div>
|
||||
{% if form.expected_revenue.errors %}
|
||||
<div class="invalid-feedback d-block">{{ form.expected_revenue.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- Closing Date -->
|
||||
<div class="mb-5">
|
||||
<label class="form-label" for="{{ form.closing_date.id_for_label }}">{{ form.closing_date.label }}</label>
|
||||
<div class="input-group">
|
||||
{{ form.expected_close_date|add_class:"form-control" }}
|
||||
<span class="input-group-text"><span class="far fa-calendar"></span></span>
|
||||
</div>
|
||||
{% if form.expected_close_date.errors %}
|
||||
<div class="invalid-feedback d-block">{{ form.expected_close_date.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- Form Actions -->
|
||||
<div class="d-flex justify-content-end gap-3">
|
||||
<button type="reset" class="btn btn-phoenix-danger px-4">
|
||||
<span class="fas fa-redo me-1"></span>{% trans "Reset" %}
|
||||
</button>
|
||||
<button type="submit" class="btn btn-phoenix-primary px-6">
|
||||
{% if form.instance.pk %}
|
||||
<span class="fas fa-save me-1"></span>{% trans "Update" %}
|
||||
{% else %}
|
||||
<span class="fas fa-plus me-1"></span>{% trans "Create" %}
|
||||
{% endif %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="card">
|
||||
<div class="card-body p-4">
|
||||
<h4 class="mb-3">{% trans "Opportunity Guidelines" %}</h4>
|
||||
<ul class="nav flex-column gap-2 nav-guide">
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-primary fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Probability indicates conversion chance" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-warning fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Update stage as deal progresses" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-success fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Set realistic closing dates" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container-fluid mt-4 mb-3">
|
||||
<div class="row g-3 mb-4 align-items-center">
|
||||
<div class="col">
|
||||
<h2 class="mb-0">
|
||||
{% if form.instance.pk %}
|
||||
{% trans "Edit Opportunity" %}
|
||||
{% else %}
|
||||
{% trans "Create New Opportunity" %}
|
||||
{% endif %}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<a href="{% url 'opportunity_list' request.dealer.slug %}" class="btn btn-phoenix-secondary">
|
||||
<span class="fas fa-arrow-left me-2"></span>{% trans "Back to list" %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
<div class="card">
|
||||
<div class="card-body p-4 p-sm-5">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
|
||||
{% if form.non_field_errors %}
|
||||
<div class="alert alert-danger">
|
||||
{{ form.non_field_errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Lead Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.lead.id_for_label }}">
|
||||
{{ form.lead.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.lead|add_class:"form-control" }}
|
||||
{% if form.lead.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.lead.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Car Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.car.id_for_label }}">
|
||||
{{ form.car.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.car|add_class:"form-control" }}
|
||||
{% if form.car.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.car.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Stage Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.stage.id_for_label }}">
|
||||
{{ form.stage.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.stage|add_class:"form-control" }}
|
||||
{% if form.stage.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.stage.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- Amount Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.amount.id_for_label }}">
|
||||
{{ form.amount.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
||||
{{ form.amount|add_class:"form-control" }}
|
||||
</div>
|
||||
{% if form.amount.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.amount.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Probability Field -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.probability.id_for_label }}">
|
||||
{{ form.probability.label }}
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<input type="range"
|
||||
name="{{ form.probability.name }}"
|
||||
id="{{ form.probability.id_for_label }}"
|
||||
min="0" max="100" step="1"
|
||||
value="{{ form.probability.value|default:'50' }}"
|
||||
class="form-control form-range"
|
||||
oninput="updateProbabilityValue(this.value)">
|
||||
<span id="probability-value" class="badge badge-phoenix fs-6 badge-phoenix-primary">
|
||||
{{ form.probability.value|default:'50' }}%
|
||||
</span>
|
||||
</div>
|
||||
{% if form.probability.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.probability.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Expected Revenue -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label" for="{{ form.expected_revenue.id_for_label }}">
|
||||
{{ form.expected_revenue.label }}
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><span class="icon-saudi_riyal"></span></span>
|
||||
{{ form.expected_revenue|add_class:"form-control" }}
|
||||
</div>
|
||||
{% if form.expected_revenue.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.expected_revenue.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Closing Date -->
|
||||
<div class="mb-5">
|
||||
<label class="form-label" for="{{ form.closing_date.id_for_label }}">
|
||||
{{ form.closing_date.label }}
|
||||
</label>
|
||||
<div class="input-group">
|
||||
{{ form.expected_close_date|add_class:"form-control" }}
|
||||
<span class="input-group-text"><span class="far fa-calendar"></span></span>
|
||||
</div>
|
||||
{% if form.expected_close_date.errors %}
|
||||
<div class="invalid-feedback d-block">
|
||||
{{ form.expected_close_date.errors }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Form Actions -->
|
||||
<div class="d-flex justify-content-end gap-3">
|
||||
<button type="reset" class="btn btn-phoenix-danger px-4">
|
||||
<span class="fas fa-redo me-1"></span>{% trans "Reset" %}
|
||||
</button>
|
||||
<button type="submit" class="btn btn-phoenix-primary px-6">
|
||||
{% if form.instance.pk %}
|
||||
<span class="fas fa-save me-1"></span>{% trans "Update" %}
|
||||
{% else %}
|
||||
<span class="fas fa-plus me-1"></span>{% trans "Create" %}
|
||||
{% endif %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="card">
|
||||
<div class="card-body p-4">
|
||||
<h4 class="mb-3">{% trans "Opportunity Guidelines" %}</h4>
|
||||
<ul class="nav flex-column gap-2 nav-guide">
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-primary fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Probability indicates conversion chance" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-warning fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Update stage as deal progresses" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="fas fa-circle text-success fs-11 me-2"></span>
|
||||
<span class="text-body-highlight">{% trans "Set realistic closing dates" %}</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function updateProbabilityValue(value) {
|
||||
const amount = document.getElementById('id_amount');
|
||||
const expectedRevenue = document.getElementById('id_expected_revenue');
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
{% extends "base.html" %}
|
||||
{% load static i18n %}
|
||||
{% block title %}
|
||||
{% trans "Car Bulk Upload"|capfirst %}
|
||||
{% endblock %}
|
||||
|
||||
{% block customCSS %}
|
||||
<style>
|
||||
.color-card {
|
||||
@ -70,13 +74,13 @@
|
||||
</style>
|
||||
{% endblock customCSS %}
|
||||
{% block content %}
|
||||
|
||||
<div class="container mt-4">
|
||||
<h2>
|
||||
Upload Cars CSV <i class="fa-solid fa-file-csv text-primary"></i>
|
||||
</h2>
|
||||
<div class="d-flex justify-content-end">
|
||||
<a href="{% static 'sample/cars_sample.csv' %}"
|
||||
class="btn btn-phoenix-success mt-4">
|
||||
<a href="{% static 'sample/cars_sample.csv' %}" class="btn btn-phoenix-primary mt-4">
|
||||
<i class="fa-solid fa-file-csv me-2"></i>Download Sample CSV
|
||||
</a>
|
||||
</div>
|
||||
@ -178,8 +182,7 @@
|
||||
<div class="form-text">{{ _("CSV should include columns: vin") }}</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-phoenix-primary mb-2">Upload</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-phoenix-secondary mb-2">Cancel</a>
|
||||
<a href="{% url 'car_list' request.dealer.slug %}" class="btn btn-phoenix-secondary mb-2">Cancel</a>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@ -16,10 +16,11 @@
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% if customer.created %}
|
||||
<i class="fa-solid fa-user"></i> {{ _("Edit Customer") }}
|
||||
{{ _("Edit Customer") }}
|
||||
{% else %}
|
||||
<i class="fa-solid fa-user"></i> {{ _("Add Customer") }}
|
||||
{{ _("Add Customer") }}
|
||||
{% endif %}
|
||||
<i class="fa-solid fa-user ms-2 text-primary"></i>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
@ -31,11 +32,8 @@
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-phoenix-success btn-lg me-md-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
<button class="btn btn-phoenix-success btn-lg me-md-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'customer_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@ -5,49 +5,30 @@
|
||||
{{ _("Update Dealer Information") }}
|
||||
{% endblock title %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="row my-5">
|
||||
<div class="col-md-8">
|
||||
<!-- Form Header -->
|
||||
<h3 class="mb-3">{{ _("Update Dealer Information") }}</h3>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<div class="gap-2 mt-3">
|
||||
<button type="submit" class="btn btn-phoenix-success btn-sm me-2">
|
||||
<i class="fa fa-save me-1"></i> {{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{{ _("Update Dealer Information") }}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post"
|
||||
enctype="multipart/form-data"
|
||||
class="needs-validation"
|
||||
novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{{ _("Update Dealer Information") }}<span class="fas fa-car ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'dealer_detail' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,17 +1,53 @@
|
||||
{% load i18n static %}
|
||||
<footer class="footer position-absolute fs-9">
|
||||
<div class="row g-0 justify-content-between align-items-center h-100">
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="text-body">© 2025 {{ _("All right reserved") }}</span>
|
||||
<span class="fw-bold">Haikal</span> | <span class="fw-bold">هيكل</span>
|
||||
</div>
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="fw-light text-body-tertiary text-opacity-85">{{ _("Powered by") }}</span>
|
||||
<a class="mx-1 text-decoration-none text-body-highlight"
|
||||
href="https://tenhal.sa">
|
||||
<span>TENHAL</span> | <span>تنحل</span>
|
||||
</a>
|
||||
<span class="uil-trademark-circle fs-10 fw-light text-body-tertiary text-opacity-85"></span>
|
||||
</div>
|
||||
{% comment %} <footer class="footer position-absolute fs-9">
|
||||
<div class="row g-0 justify-content-between align-items-center h-100">
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="text-body"> © 2025 {{ _("All right reserved")}}</span>
|
||||
<span class="fw-bold">Haikal</span> | <span class="fw-bold">هيكل</span>
|
||||
|
||||
</div>
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="fw-light text-body-tertiary text-opacity-85">{{ _("Powered by")}} </span>
|
||||
<a class="mx-1 text-decoration-none text-body-highlight" href="https://tenhal.sa">
|
||||
<span>TENHAL</span> | <span>تنحل</span>
|
||||
</a>
|
||||
<span class="uil-trademark-circle fs-10 fw-light text-body-tertiary text-opacity-85"></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer> {% endcomment %}
|
||||
|
||||
{% comment %} <footer class="footer position-absolute fs-9 bg-info-subtle">
|
||||
<div class="row g-0 justify-content-between align-items-center h-100">
|
||||
<div class="col-12 col-sm-auto text-center text-warning">
|
||||
<span class="text-body "> © 2025 {{ _("All right reserved")}}</span>
|
||||
<span class="fw-bold text-warning">Haikal</span> | <span class="fw-bold text-warning">هيكل</span>
|
||||
|
||||
</div>
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="fw-light text-body-tertiary text-opacity-85 g">{{ _("Powered by")}} </span>
|
||||
<a class="mx-1 text-warning" href="https://tenhal.sa">
|
||||
<span text-success-subtle>TENHAL</span> | <span>تنحل</span>
|
||||
</a>
|
||||
<span class="fas fa-registered fs-10 fw-light text-opacity-85 text-warning"></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer> {% endcomment %}
|
||||
|
||||
<footer class="footer position-absolute fs-9 bg-white text-secondary">
|
||||
<div class="row g-0 justify-content-between align-items-center h-100">
|
||||
<div class="col-12 col-sm-auto text-center">
|
||||
<span class="text-body"> © 2025 {{ _("All right reserved")}}</span>
|
||||
<span class="fw-bold">Haikal</span> | <span class="fw-bold">هيكل</span>
|
||||
|
||||
</div>
|
||||
<div class="col-12 col-sm-auto text-center ">
|
||||
<span>{{ _("Powered by")}} </span>
|
||||
<span>
|
||||
<a class="mx-1 text-secondary" href="https://tenhal.sa">
|
||||
<span>TENHAL</span> | <span>تنحل</span>
|
||||
</a>
|
||||
<span>
|
||||
<span class="fas fa-registered fs-10 fw-light text-opacity-85 text-secondary"></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@ -10,42 +10,7 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="row mt-4">
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<div class="d-sm-flex justify-content-between">
|
||||
|
||||
<h3 class="mb-3">
|
||||
{% if staff.created %}
|
||||
{{ _("Edit Group") }}
|
||||
{% else %}
|
||||
{{ _("Add Group") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
|
||||
<form class="row g-3 mb-9" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
<div class="d-flex mb-3">
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-phoenix-danger me-2 "><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel"|capfirst %}</a>
|
||||
<button class="btn btn-phoenix-success" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
@ -57,24 +22,26 @@
|
||||
{% else %}
|
||||
{{ _("Add Group") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 " method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form class="row g-3 " method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'group_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -20,169 +20,145 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="fas fa-search"></i></span>
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
id="permissionSearch"
|
||||
placeholder="{% trans 'Search permissions...' %}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="alert alert-info py-2 mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>
|
||||
{% trans "Checked items are currently assigned permissions" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4"
|
||||
id="permissionsGrid">
|
||||
{% for app_label, models in grouped_permissions.items %}
|
||||
<div class="col">
|
||||
{# This div opens for each app_label #}
|
||||
<div class="card h-100 border-
|
||||
{% if app_label in group_permission_apps %}
|
||||
primary
|
||||
{% else %}
|
||||
light
|
||||
{% endif %}">
|
||||
<div class="card-header bg-
|
||||
{% if app_label in group_permission_apps %}
|
||||
primary text-white
|
||||
{% else %}
|
||||
light
|
||||
{% endif %}">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-
|
||||
{% if app_label in group_permission_apps %}
|
||||
check-circle
|
||||
{% else %}
|
||||
cube
|
||||
{% endif %}
|
||||
me-2"></i>
|
||||
{{ app_label|capfirst }}
|
||||
</h5>
|
||||
<span class="badge bg-
|
||||
{% if app_label in group_permission_apps %}
|
||||
light text-primary
|
||||
{% else %}
|
||||
secondary
|
||||
{% endif %}">{{ models|length }} {% trans "categories" %}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="accordion" id="accordion-{{ app_label|slugify }}">
|
||||
{% for model, perms in models.items %}
|
||||
<div class="accordion-item border-0 mb-2">
|
||||
<h6 class="accordion-header"
|
||||
id="heading-{{ app_label|slugify }}-{{ model|slugify }}">
|
||||
<button class="accordion-button collapsed bg-white shadow-none py-2"
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
aria-expanded="false"
|
||||
aria-controls="collapse-{{ app_label|slugify }}-{{ model|slugify }}">
|
||||
<i class="fas fa-
|
||||
{% if model == 'Custom' %}
|
||||
star
|
||||
{% else %}
|
||||
table
|
||||
{% endif %}
|
||||
me-2"></i>
|
||||
{{ model|capfirst }}
|
||||
<span class="badge bg-
|
||||
{% if model in group_permission_models %}
|
||||
primary
|
||||
{% else %}
|
||||
secondary
|
||||
{% endif %}
|
||||
rounded-pill ms-2">
|
||||
{# This is where you might need the custom filter 'count_checked' #}
|
||||
{{ perms|length }} / {{ perms|count_checked:group_permission_ids }}
|
||||
</span>
|
||||
</button>
|
||||
</h6>
|
||||
<div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
class="accordion-collapse collapse"
|
||||
aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
data-bs-parent="#accordion-{{ app_label|slugify }}">
|
||||
<div class="accordion-body pt-0 px-0">
|
||||
<div class="list-group list-group-flush">
|
||||
{% for perm in perms %}
|
||||
<label class="list-group-item d-flex gap-2
|
||||
{% if perm.id in group_permission_ids %}bg-light-primary{% endif %}">
|
||||
<input class="form-check-input flex-shrink-0 mt-0"
|
||||
type="checkbox"
|
||||
name="permissions"
|
||||
value="{{ perm.id }}"
|
||||
id="perm_{{ perm.id }}"
|
||||
{% if perm.id in group_permission_ids %}checked{% endif %}>
|
||||
<span>
|
||||
<span class="d-block fw-bold">{{ perm.name|capfirst }}</span>
|
||||
<small class="d-block text-muted">{{ perm.codename }}</small>
|
||||
{% if model == 'Custom' %}
|
||||
<span class="badge bg-info mt-1">
|
||||
<i class="fas fa-star me-1"></i>{% trans "Custom" %}
|
||||
</span>
|
||||
{% elif perm.id in group_permission_ids %}
|
||||
<span class="badge bg-success mt-1">
|
||||
<i class="fas fa-check me-1"></i>{% trans "Assigned" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="row mt-4 mb-4">
|
||||
<div class="col">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<span class="badge bg-primary rounded-pill me-2">{{ group_permission_ids|length }} {% trans "selected" %}</span>
|
||||
<span class="text-muted">{% trans "Permissions will be updated immediately" %}</span>
|
||||
</div>
|
||||
<div>
|
||||
<button type="submit" class="btn btn-primary me-2">
|
||||
<i class="fas fa-save me-1"></i>{% trans "Save Changes" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<style>
|
||||
.bg-light-primary {
|
||||
background-color: rgba(13, 110, 253, 0.1);
|
||||
}
|
||||
.list-group-item:hover {
|
||||
background-color: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
.accordion-button:not(.collapsed) {
|
||||
box-shadow: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
.accordion-button:focus {
|
||||
box-shadow: none;
|
||||
border-color: rgba(0,0,0,.125);
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text"><i class="fas fa-search"></i></span>
|
||||
<input type="text" class="form-control" id="permissionSearch"
|
||||
placeholder="{% trans 'Search permissions...' %}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="alert alert-info py-2 mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>
|
||||
{% trans "Checked items are currently assigned permissions" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="permissionsGrid">
|
||||
{% for app_label, models in grouped_permissions.items %}
|
||||
<div class="col"> {# This div opens for each app_label #}
|
||||
<div class="card h-100 border-{% if app_label in group_permission_apps %}primary{% else %}light{% endif %}">
|
||||
<div class="card-header bg-{% if app_label in group_permission_apps %}primary text-white{% else %}light{% endif %}">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-{% if app_label in group_permission_apps %}check-circle{% else %}cube{% endif %} me-2"></i>
|
||||
{{ app_label|capfirst }}
|
||||
</h5>
|
||||
<span class="badge bg-{% if app_label in group_permission_apps %}light text-primary{% else %}secondary{% endif %}">
|
||||
{{ models|length }} {% trans "categories" %}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="accordion" id="accordion-{{ app_label|slugify }}">
|
||||
{% for model, perms in models.items %}
|
||||
<div class="accordion-item border-0 mb-2">
|
||||
<h6 class="accordion-header" id="heading-{{ app_label|slugify }}-{{ model|slugify }}">
|
||||
<button class="accordion-button collapsed bg-white shadow-none py-2"
|
||||
type="button"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
aria-expanded="false"
|
||||
aria-controls="collapse-{{ app_label|slugify }}-{{ model|slugify }}">
|
||||
<i class="fas fa-{% if model == 'Custom' %}star{% else %}table{% endif %} me-2"></i>
|
||||
{{ model|capfirst }}
|
||||
<span class="badge bg-{% if model in group_permission_models %}primary{% else %}secondary{% endif %} rounded-pill ms-2">
|
||||
{# This is where you might need the custom filter 'count_checked' #}
|
||||
{{ perms|length }} / {{ perms|count_checked:group_permission_ids }}
|
||||
</span>
|
||||
</button>
|
||||
</h6>
|
||||
<div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
class="accordion-collapse collapse"
|
||||
aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}"
|
||||
data-bs-parent="#accordion-{{ app_label|slugify }}">
|
||||
<div class="accordion-body pt-0 px-0">
|
||||
<div class="list-group list-group-flush">
|
||||
{% for perm in perms %}
|
||||
<label class="list-group-item d-flex gap-2 {% if perm.id in group_permission_ids %}bg-light-primary{% endif %}">
|
||||
<input class="form-check-input flex-shrink-0 mt-0"
|
||||
type="checkbox"
|
||||
name="permissions"
|
||||
value="{{ perm.id }}"
|
||||
id="perm_{{ perm.id }}"
|
||||
{% if perm.id in group_permission_ids %}checked{% endif %}>
|
||||
<span>
|
||||
<span class="d-block fw-bold">{{ perm.name|capfirst }}</span>
|
||||
<small class="d-block text-muted">{{ perm.codename }}</small>
|
||||
{% if model == 'Custom' %}
|
||||
<span class="badge bg-info mt-1">
|
||||
<i class="fas fa-star me-1"></i>{% trans "Custom" %}
|
||||
</span>
|
||||
{% elif perm.id in group_permission_ids %}
|
||||
<span class="badge bg-success mt-1">
|
||||
<i class="fas fa-check me-1"></i>{% trans "Assigned" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row mt-4 mb-4">
|
||||
<div class="col">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<span class="badge bg-primary rounded-pill me-2">
|
||||
{{ group_permission_ids|length }} {% trans "selected" %}
|
||||
</span>
|
||||
<span class="text-muted">
|
||||
{% trans "Permissions will be updated immediately" %}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
<button type="submit" class="btn btn-lg btn-primary me-2">
|
||||
<i class="fas fa-save me-1"></i>{% trans "Save Changes" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.bg-light-primary {
|
||||
background-color: rgba(13, 110, 253, 0.1);
|
||||
}
|
||||
.list-group-item:hover {
|
||||
background-color: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
.accordion-button:not(.collapsed) {
|
||||
box-shadow: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
.accordion-button:focus {
|
||||
box-shadow: none;
|
||||
border-color: rgba(0,0,0,.125);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Initialize all accordions
|
||||
document.querySelectorAll('.accordion-button').forEach(button => {
|
||||
button.addEventListener('click', function() {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,84 +1,67 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n %}
|
||||
{% block title %}
|
||||
{% trans 'Add Colors' %} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<h5 class="text-center">{% trans "Add Colors" %}</h5>
|
||||
<p class="text-center">
|
||||
{% trans "Select exterior and interior colors for" %} {{ car.id_car_make.get_local_name }} {{ car.id_car_model.get_local_name }}
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<!-- Exterior Colors -->
|
||||
<div class="row g-4">
|
||||
<p class="fs-5 mb-0">{% trans 'Exterior Colors' %}</p>
|
||||
{% for color in form.fields.exterior.queryset %}
|
||||
<div class="col-lg-4 col-xl-2">
|
||||
<div class="card rounded shadow-sm color-card">
|
||||
<label class="color-option">
|
||||
<input class="color-radio"
|
||||
type="radio"
|
||||
name="exterior"
|
||||
value="{{ color.id }}"
|
||||
{% if color.id == form.instance.exterior.id %}checked{% endif %}>
|
||||
<div class="card-body color-display"
|
||||
style="background-color: rgb({{ color.rgb }})">
|
||||
<div class="">
|
||||
<small>{{ color.get_local_name }}</small>
|
||||
</div>
|
||||
{%block title%} {%trans 'Add Colors'%} {% endblock%}
|
||||
{% block content %}
|
||||
<div class="row mt-4 mb-3">
|
||||
<h5 class="text-center">{% trans "Add Colors" %}</h5>
|
||||
<p class="text-center">
|
||||
{% trans "Select exterior and interior colors for" %} {{ car.id_car_make.get_local_name }} {{ car.id_car_model.get_local_name }}
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<!-- Exterior Colors -->
|
||||
<div class="row g-4">
|
||||
<p class="fs-5 mb-0">{% trans 'Exterior Colors' %}</p>
|
||||
{% for color in form.fields.exterior.queryset %}
|
||||
<div class="col-lg-4 col-xl-2">
|
||||
<div class="card rounded shadow-sm color-card">
|
||||
<label class="color-option">
|
||||
<input class="color-radio"
|
||||
type="radio"
|
||||
name="exterior"
|
||||
value="{{ color.id }}" {% if color.id == form.instance.exterior.id %}checked{% endif %}>
|
||||
|
||||
<div class="card-body color-display"
|
||||
style="background-color: rgb({{ color.rgb }})">
|
||||
<div class="">
|
||||
<small>{{ color.get_local_name }}</small>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<!-- Interior Colors -->
|
||||
<p class="fs-5 mt-3 mb-0">{% trans 'Interior Colors' %}</p>
|
||||
{% for color in form.fields.interior.queryset %}
|
||||
<div class="col-lg-4 col-xl-2">
|
||||
<div class="card rounded shadow-sm color-card">
|
||||
<label class="color-option">
|
||||
<input class="color-radio"
|
||||
type="radio"
|
||||
name="interior"
|
||||
value="{{ color.id }}"
|
||||
{% if color.id == form.instance.interior.id %}checked{% endif %}>
|
||||
<div class="card-body color-display"
|
||||
style="background-color: rgb({{ color.rgb }})">
|
||||
<div class="">
|
||||
<small>{{ color.get_local_name }}</small>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<!-- Interior Colors -->
|
||||
<p class="fs-5 mt-3 mb-0">{% trans 'Interior Colors' %}</p>
|
||||
{% for color in form.fields.interior.queryset %}
|
||||
<div class="col-lg-4 col-xl-2">
|
||||
<div class="card rounded shadow-sm color-card">
|
||||
<label class="color-option">
|
||||
<input class="color-radio"
|
||||
type="radio"
|
||||
name="interior"
|
||||
value="{{ color.id }}" {% if color.id == form.instance.interior.id %}checked{% endif %}>
|
||||
<div class="card-body color-display"
|
||||
style="background-color: rgb({{ color.rgb }})">
|
||||
<div class="">
|
||||
<small>{{ color.get_local_name }}</small>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<!-- Save and Cancel Buttons -->
|
||||
{% comment %} <div class="row g-1 mt-4">
|
||||
<div class="btn-group">
|
||||
<button type="submit" class="btn btn-sm btn-success me-1"><i class="fa-solid fa-floppy-disk"></i>{% trans "Save" %}</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-danger"><i class="fa-solid fa-ban"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
{% comment %} <div class="row justify-content-center g-1 mt-4">
|
||||
<div class="col-auto">
|
||||
<div class="btn-group shadow-sm">
|
||||
<button type="submit" class="btn btn-success btn-sm me-2"><i class="fa-solid fa-floppy-disk me-1"></i>{% trans "Save" %}</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-danger btn-sm"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<div class="d-flex justify-content-center mt-4">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<style>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-center mt-4">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<style>
|
||||
.color-card {
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
@ -6,42 +6,30 @@
|
||||
{% trans 'Edit Car' %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="row">
|
||||
<div class="card rounded shadow mt-3">
|
||||
<p class="card-header bg-primary text-white rounded-top fw-bold">{% trans 'Edit Car' %}</p>
|
||||
<div class="card-body">
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
{% csrf_token %} {{ form|crispy }}
|
||||
<!-- Save and Back Buttons -->
|
||||
<div class="d-flex justify-content-center mt-4 ms-2">
|
||||
<a href="{{ request.META.HTTP_REFERER }}" class="btn btn-sm btn-phoenix-danger">{% trans "Back" %}</a>
|
||||
<button type="submit" class="btn btn-sm btn-phoenix-success ms-2">{% trans 'Save' %}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{% trans 'Edit Car' %}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
{% csrf_token %} {{ form|crispy }}
|
||||
<!-- Save and Back Buttons -->
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% trans 'Edit Car' %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
{% csrf_token %} {{ form|crispy }}
|
||||
<!-- Save and Back Buttons -->
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -6,42 +6,45 @@
|
||||
{% trans "Car Finance Details" %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% trans "Finance Details for" %}{{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }}
|
||||
</h3>
|
||||
{% if form.errors %}
|
||||
<div class="alert alert-danger">
|
||||
<ul>
|
||||
{% for field in form %}
|
||||
{% for error in field.errors %}<li>{{ field.label }}: {{ error }}</li>{% endfor %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}<li>{{ error }}</li>{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
<div class="row g-1">
|
||||
<div class="col-lg-4 col-xl-12">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
</div>
|
||||
</div>
|
||||
{% trans "Finance Details for" %} {{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }}
|
||||
</h3>
|
||||
{% if form.errors %}
|
||||
<div class="alert alert-danger">
|
||||
<ul>
|
||||
{% for field in form %}
|
||||
{% for error in field.errors %}<li>{{ field.label }}: {{ error }}</li>{% endfor %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}<li>{{ error }}</li>{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" class="needs-validation" novalidate>
|
||||
<div class="row g-1">
|
||||
<div class="col-lg-4 col-xl-12">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'car_detail' request.dealer.slug car.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n static %}
|
||||
{% block title %}
|
||||
{% trans "inventory"|capfirst %}
|
||||
{% trans "Inventory Stats"|capfirst %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="row justify-content-between">
|
||||
|
||||
@ -6,26 +6,34 @@
|
||||
{{ _("Add New Expense") }}
|
||||
{% endblock title %}
|
||||
{% block content %}
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{{ _("Add Expense") }}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{{ _("Add Expense") }}
|
||||
<span class="fas fa-money-bill-wave ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'item_expense_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -24,25 +24,28 @@
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{{ _("Update Expense") }}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{{ _("Update Expense") }}
|
||||
<span class="fas fa-money-bill-wave ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'item_expense_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Expenses" %}</h3>
|
||||
<h3 class="">{% trans "Expenses" %} <span class="fas fa-money-bill-wave ms-2 text-primary"></span></h3>
|
||||
{% if perms.django_ledger.add_itemmodel %}
|
||||
<a href="{% url 'item_expense_create' request.dealer.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Expense" %}</a>
|
||||
|
||||
@ -11,59 +11,37 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card bg-body">
|
||||
<div class="card-header">
|
||||
{% if service.pk %}
|
||||
<h3>{{ _("Update Service") }}</h3>
|
||||
{% else %}
|
||||
<h3>{{ _("Add Service") }}</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<div class="d-flex justify-content-start">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i> {{ _("Save") }}</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% if service.pk %}
|
||||
{{ _("Update Service") }}
|
||||
{% else %}
|
||||
{{ _("Add Service") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<span class="fas fa-tools ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'item_service_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Services" %}</h3>
|
||||
<h3 class="">{% trans "Services" %}<span class="fas fa-tools text-primary ms-2"></span></h3>
|
||||
{% if perms.inventory.add_additionalservices %}
|
||||
<a href="{% url 'item_service_create' request.dealer.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Service" %}</a>
|
||||
|
||||
@ -10,69 +10,39 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-8">
|
||||
<div class="card shadow rounded bg-body">
|
||||
<div class="card-header">
|
||||
<p class="mb-0">
|
||||
{% if customer.created %}
|
||||
<!--<i class="bi bi-pencil-square"></i>-->
|
||||
{{ _("Edit Bank Account") }}
|
||||
{% else %}
|
||||
<!--<i class="bi bi-person-plus"></i> -->
|
||||
{{ _("Add Bank Account") }}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
<div class="d-flex justify-content-start">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
<!--<i class="bi bi-save"></i> -->
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% if customer.created %}
|
||||
{{ _("Edit Bank Account") }}
|
||||
{% else %}
|
||||
{{ _("Add Bank Account") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% if customer.created %}
|
||||
{{ _("Edit Bank Account") }}
|
||||
{% else %}
|
||||
{{ _("Add Bank Account") }}
|
||||
{% endif %}
|
||||
<span class="fas fa-bank ms-2 text-primary"></span>
|
||||
</h3>
|
||||
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'bank_account_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -6,10 +6,9 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Bank Accounts" %}</h3>
|
||||
{% if perms.django_ledger.add_bankaccountmodel %}
|
||||
<a href="{% url 'bank_account_create' request.dealer.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Bank Account" %}</a>
|
||||
<h3 class="">{% trans "Bank Accounts" %}<span class="fas fa-bank ms-2 text-primary"></span></h3>
|
||||
{% if perms.django_ledger.add_bankaccountmodel%}
|
||||
<a href="{% url 'bank_account_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Bank Account" %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% include "partials/search_box.html" %}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
{% endblock title %}
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<h3 class="text-center">{% trans "Create Bill" %}</h3>
|
||||
<h3 class="text-center">{% trans "Create Bill" %}<span class="fas fa-money-bills ms-2 text-primary"></span></h3>
|
||||
<form id="mainForm" method="post" class="needs-validation">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3">{{ form|crispy }}</div>
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Bills" %}</h3>
|
||||
<h3 class="">{% trans "Bills" %}<span class="fas fa-money-bills ms-2 text-primary"></span></h3>
|
||||
{% if perms.django_ledger.add_billmodel %}
|
||||
<a href="{% url 'bill-create' request.dealer.slug entity.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'New Bill' %}</a>
|
||||
|
||||
@ -10,70 +10,46 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% comment %}
|
||||
<div class="row my-5">
|
||||
<!-- Display Form Errors -->
|
||||
<div class="card shadow rounded bg-body">
|
||||
<div class="card-header">
|
||||
<h4 class="mb-3">
|
||||
{% if account.created %}
|
||||
<!--<i class="bi bi-pencil-square"></i>-->
|
||||
<i class="fa-solid fa-book"></i> {{ _("Edit Account") }}
|
||||
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center ">
|
||||
{% if account.created %}
|
||||
|
||||
<i class="fa-solid fa-book"></i> {{ _("Edit Account") }}
|
||||
{% else %}
|
||||
<!--<i class="bi bi-person-plus"></i> -->
|
||||
<i class="fa-solid fa-book"></i> {{ _("Add Account") }}
|
||||
|
||||
<i class="fa-solid fa-book"></i> {{ _("Add Account") }}
|
||||
{% endif %}
|
||||
</h4>
|
||||
<i class="fa-solid fa-book ms-2 text-primary"></i>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
<div class="d-flex justify-content-start">
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button
|
||||
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
<!--<i class="bi bi-save"></i> -->
|
||||
{{ _("Save") }}
|
||||
class="btn btn-lg btn-phoenix-success md-me-2"
|
||||
type="submit">
|
||||
<i class="saveBtnIcon fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
<a href="{% url 'account_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% if account.created %}
|
||||
<i class="fa-solid fa-book"></i> {{ _("Edit Account") }}
|
||||
{% else %}
|
||||
<i class="fa-solid fa-book"></i> {{ _("Add Account") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="saveBtnIcon fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -12,9 +12,7 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">
|
||||
<i class="fa-solid fa-book"></i> {% trans "Accounts" %}
|
||||
</h3>
|
||||
<h3 class=""> {% trans "Accounts" %}<i class="fa-solid fa-book ms-2 text-primary"></i></h3>
|
||||
{% if perms.django_ledger.add_chartofaccountmodel %}
|
||||
<a href="{% url 'account_create' request.dealer.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'New Account' %}</a>
|
||||
|
||||
@ -5,43 +5,36 @@
|
||||
{{ _("Create Ledger") }}
|
||||
{% endblock title %}
|
||||
{% block content %}
|
||||
{% comment %} <div class="row mt-4">
|
||||
<h3 class="text-center">{% trans "Create Ledger" %}</h3>
|
||||
<form id="mainForm" method="post" class="needs-validation">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3">
|
||||
{{ form|crispy }}
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-center">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{% trans "Create Ledger" %}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form id="mainForm" method="post" class="needs-validation">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3">{{ form|crispy }}</div>
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% trans "Create Ledger" %}
|
||||
<span class="fas fa-book-open ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
<form id="mainForm" method="post" class="needs-validation">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3">
|
||||
{{ form|crispy }}
|
||||
</div>
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'ledger_list' request.dealer.slug request.entity.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
{% block content %}
|
||||
<div class="row mt-4">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Ledger" %}</h3>
|
||||
<h3 class="">{% trans "Ledger" %} <span class="fas fa-book-open ms-2 text-primary"></span></h3>
|
||||
{% if perms.django_ledger.add_ledgermodel %}
|
||||
<a href="{% url 'ledger_create' request.dealer.slug request.dealer.entity.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'Create Ledger' %}</a>
|
||||
|
||||
111
templates/ledger/reports/car_sale_report.html
Normal file
111
templates/ledger/reports/car_sale_report.html
Normal file
@ -0,0 +1,111 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% block title %}
|
||||
{{ _("Car Sale Report") |capfirst }}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content%}
|
||||
|
||||
<div class="container-fluid report-container">
|
||||
<header class="report-header text-center">
|
||||
<h1 class="display-4">Car Sale Report <span class="fas fa-car mx-2 text-primary"></span><span class="fas fa-money-bill mx-2 text-primary"></span></h1>
|
||||
<p class="lead text-muted"><strong>{{dealer}}</strong></p>
|
||||
<p class="text-muted">Report Date: {{current_time}}</p>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section id="summary" class="mb-1">
|
||||
<h2 class="section-heading mb-2">Report Summary</h2>
|
||||
<div class="row ">
|
||||
<div class="col-md-6 col-lg-4 mb-2">
|
||||
<div class="card summary-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-primary">Total Revenue Amount<span class="fas fa-solid fa-dollar-sign mx-1"></span><span class="fas fa-car"></span></h5>
|
||||
<p class="card-text fs-4 fw-bold">120000000</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-2">
|
||||
<div class="card summary-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-primary">Total Vat Amount<span class="fas fa-solid fa-percent mx-1"></span><span class="fas fa-car"></span></h5>
|
||||
<p class="card-text fs-4 fw-bold">12000</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-2">
|
||||
<div class="card summary-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-primary">Total Discount Amount <span class="fas fa-solid fa-tag mx-1"></span><span class="fas fa-car"></span></h5>
|
||||
<p class="card-text fs-4 fw-bold">12000</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="purchase-details" class="mb-3">
|
||||
<h2 class="section-heading">Detailed Purchase List</h2>
|
||||
|
||||
<div class="d-flex justify-content-end mb-3 d-print-none">
|
||||
<a href="{% url 'car-sale-report-csv-export' request.dealer.slug %}" class="btn btn-phoenix-primary">
|
||||
<i class="bi bi-download me-2"></i> Download as CSV
|
||||
</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover table-bordered table-sm">
|
||||
<thead >
|
||||
<tr>
|
||||
<th>VIN</th>
|
||||
<th>Make</th>
|
||||
<th>Model</th>
|
||||
<th>Year</th>
|
||||
<th>Serie</th>
|
||||
<th>Trim</th>
|
||||
<th>Mileage</th>
|
||||
<th>Stock Type</th>
|
||||
<th>Created Date</th>
|
||||
<th>Sold Date</th>
|
||||
<th>Cost Price</th>
|
||||
<th>Marked Price</th>
|
||||
<th>Discount Amount</th>
|
||||
<th>Selling Price</th>
|
||||
<th>Tax Amount</th>
|
||||
<th>Invoice Number</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
{% for car in cars_sold%}
|
||||
<tr>
|
||||
<td class="ps-1">{{car.vin}}</td>
|
||||
<td>{{car.id_car_make.name}}</td>
|
||||
<td>{{car.id_car_model.name}}</td>
|
||||
<td>{{car.year}}</td>
|
||||
<td>{{car.id_car_serie.name}}</td>
|
||||
<td>{{car.id_car_trim.name}}</td>
|
||||
<td>{{car.mileage}}</td>
|
||||
<td>{{car.stock_type}}</td>
|
||||
<td>{{car.created_at}}</td>
|
||||
<td>{{car.sold_date}}</td>
|
||||
<td>{{car.finances.cost_price}}</td>
|
||||
<td>{{car.finances.marked_price}}</td>
|
||||
<td>{{car.finances.discount_amount}}</td>
|
||||
<td>{{car.finances.selling_price}}</td>
|
||||
<td>{{car.finances.vat_amount}}</td>
|
||||
<td>{{car.item_model.invoicemodel_set.first.invoice_number}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
97
templates/ledger/reports/purchase_report.html
Normal file
97
templates/ledger/reports/purchase_report.html
Normal file
@ -0,0 +1,97 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% block title %}
|
||||
{{ _("Car Purchase Report") |capfirst }}
|
||||
{% endblock title %}
|
||||
|
||||
|
||||
{% block content%}
|
||||
|
||||
<div class="container-fluid report-container">
|
||||
<header class="report-header text-center">
|
||||
<h1 class="display-4">Car Purchase Report <span class="fas fa-car mx-2 text-primary"></span><span class="fas fa-chart-bar mx-2 text-primary"></span></h1>
|
||||
<p class="lead text-muted"><strong>{{dealer}}</strong></p>
|
||||
<p class="text-muted">Report Date: {{current_time}}</p>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section id="summary" class="mb-1">
|
||||
<h2 class="section-heading mb-2">Report Summary</h2>
|
||||
<div class="row ">
|
||||
<div class="col-md-6 col-lg-4 mb-2">
|
||||
<div class="card summary-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-primary">Total Purchase Amount<span class="fas fa-money-bill ms-1"><span></h5>
|
||||
<p class="card-text fs-4 fw-bold">{{total_po_amount}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-2">
|
||||
<div class="card summary-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-primary">Total Cars Purchased<span class="fas fa-shopping-bag mx-1"></span><span class="fas fa-car"></span></h5>
|
||||
<p class="card-text fs-4 fw-bold">{{total_po_cars}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="purchase-details" class="mb-3">
|
||||
<h2 class="section-heading">Detailed Purchase List</h2>
|
||||
|
||||
<div class="d-flex justify-content-end mb-3 d-print-none">
|
||||
<a href="{% url 'purchase-report-csv-export' request.dealer.slug %}" class="btn btn-phoenix-primary">
|
||||
<i class="bi bi-download me-2"></i> Download as CSV
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover table-bordered table-sm">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Purchase ID</th>
|
||||
<th>Date Created</th>
|
||||
<th>Status</th>
|
||||
<th>PO Amount</th>
|
||||
<th>Date Fulfilled</th>
|
||||
<th>Created By</th>
|
||||
<th>Cars Purchased</th>
|
||||
<th>Vendor</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
{% for po in data %}
|
||||
<tr>
|
||||
<td class="ps-1">{{po.po_number}}</td>
|
||||
<td>{{po.po_created}}</td>
|
||||
<td>{{po.po_status}}</td>
|
||||
<td>{{po.po_amount}}</td>
|
||||
<td>{{po.date_fulfilled}}</td>
|
||||
<td>staff</td>
|
||||
<td>{{po.po_quantity}}</td>
|
||||
<td>
|
||||
{{po.vendors_str}}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="6" class="text-end fw-bold">Total Purchase:</td>
|
||||
<td class="fw-bold text-primary">{{total_po_amount}}</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -46,9 +46,9 @@
|
||||
<span data-feather="bell" style="height:20px;width:20px;"></span>
|
||||
</span>
|
||||
</a>
|
||||
<!-- Dropdown menu -->
|
||||
<div class="dropdown-menu dropdown-menu-end notification-dropdown-menu py-0 shadow border navbar-dropdown-caret"
|
||||
id="navbarDropdownNotfication">
|
||||
|
||||
<!-- Dropdown menu -->
|
||||
<div class="dropdown-menu dropdown-menu-end notification-dropdown-menu py-1 shadow border navbar-dropdown-caret" id="navbarDropdownNotfication">
|
||||
<div class="card position-relative border-0">
|
||||
<div class="card-header p-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
@ -68,8 +68,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer p-0 border-top border-translucent border-0">
|
||||
<div class="my-2 text-center fw-bold fs-10 text-body-tertiary text-opactity-85">
|
||||
<a class="fw-bolder" href="{% url 'notifications_history' %}">Notification history</a>
|
||||
<div class="my-3 text-center fw-bold fs-9 text-body-tertiary text-opactity-85">
|
||||
<a class="fw-bolder" href="{% url 'notifications_history' %}">Notification history<i class="fa-solid fa-history ms-1"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -214,7 +214,8 @@
|
||||
<span class="fas fa-ellipsis-h fs-10 text-body"></span>
|
||||
</button>
|
||||
<div class="dropdown-menu py-2">
|
||||
<a class="dropdown-item mark-as-read" href="#" data-notification-id="${data.id}">Mark as read</a>
|
||||
<a class="dropdown-item mark-as-read" href="#"
|
||||
data-notification-id="${data.id}">Mark as read<i class="fa-solid fa-check ms-1"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -15,28 +15,28 @@
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% if object %}
|
||||
{% trans 'Update Organization' %}
|
||||
{% else %}
|
||||
{% trans 'Add New Organization' %}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="form" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% if object %}
|
||||
{% trans 'Update Organization'%}
|
||||
{% else %}
|
||||
{% trans 'Add New Organization'%}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="form" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'organization_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,37 +1,35 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n static %}
|
||||
{% block content %}
|
||||
<main class="main">
|
||||
<!-- Page Title -->
|
||||
<div class="page-title light-background">
|
||||
<div class="container d-lg-flex justify-content-between align-items-center">
|
||||
<h1 class="mb-2 mb-lg-0">{% trans "Payment Successful" %}</h1>
|
||||
<nav class="breadcrumbs">
|
||||
<ol>
|
||||
<li>
|
||||
<a href="{% url 'home' %}">{{ _("Home") }}</a>
|
||||
</li>
|
||||
<li class="current">{{ _("Success") }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<!-- End Page Title -->
|
||||
<!-- Success Section -->
|
||||
<section class="section">
|
||||
<div class="container text-center" data-aos="fade-up">
|
||||
<div class="py-5">
|
||||
<i class="bi bi-check-circle-fill text-success" style="font-size: 5rem;"></i>
|
||||
<h2 class="mt-4">{{ _("Thank You") }}!</h2>
|
||||
<p class="lead">{{ _("Your payment was successful") }}. {{ _("Your order is being processed") }}.</p>
|
||||
{% if invoice %}
|
||||
<a href="{% url 'invoice_preview_html' invoice.pk %}"
|
||||
class="btn btn-phoenix-primary mt-3"><i class="fas fa-eye"></i>
|
||||
{{ _("View Invoice") }}</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'home' %}" class="btn btn-phoenix-success mt-3">
|
||||
<i class="fas fa-home"></i> {{ _("Back to Home") }}
|
||||
</a>
|
||||
<main class="main">
|
||||
|
||||
<!-- Page Title -->
|
||||
<div class="page-title light-background">
|
||||
<div class="container d-lg-flex justify-content-between align-items-center">
|
||||
<h1 class="mb-2 mb-lg-0">{% trans "Payment Successful"%}</h1>
|
||||
<nav class="breadcrumbs">
|
||||
<ol>
|
||||
<li><a href="{% url 'home' %}">{{ _("Home") }}</a></li>
|
||||
<li class="current">{{ _("Success") }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div><!-- End Page Title -->
|
||||
|
||||
<!-- Success Section -->
|
||||
<section class="section">
|
||||
<div class="container text-center" data-aos="fade-up">
|
||||
<div class="py-5">
|
||||
<i class="bi bi-check-circle-fill text-success" style="font-size: 5rem;"></i>
|
||||
<h2 class="mt-4">{{ _("Thank You")}}!</h2>
|
||||
<p class="lead">{{ _("Your payment was successful")}}. {{ _("Your order is being processed")}}.</p>
|
||||
{% if invoice %}
|
||||
<a href="{% url 'invoice_preview_html' invoice.pk %}" class="btn btn-phoenix-primary mt-3"><i class="fas fa-eye"></i>
|
||||
{{ _("View Invoice")}}</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'home' %}" class="btn btn-phoenix-primary mt-3">
|
||||
<i class="fas fa-home"></i> {{ _("Back to Home")}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@ -21,33 +21,39 @@
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{% trans "Provide billing data"|upper %}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}"
|
||||
method="post"
|
||||
class="form">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
{% if object %}
|
||||
<a class="btn btn-lg btn-phoenix-danger"
|
||||
href="{% url 'billing_info_delete' %}"><i class="fa-solid fa-trash me-1"></i> {{ _("Delete") }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% trans "Provide billing data"|upper %}<span class="fas fa-file-invoice-dollar ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
|
||||
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
{% if object %}
|
||||
<a class="btn btn-lg btn-phoenix-danger " href="{% url 'billing_info_delete' %}"><i class="fa-solid fa-trash me-1"></i> {{ _("Delete") }}</a>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!---->
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
document.getElementById('POModalBody').innerHTML = `
|
||||
<div class="d-flex justify-content-center gap-3 py-3">
|
||||
<a class="btn btn-phoenix-primary px-4" href="${actionUrl}">
|
||||
<a hx-boost="true" class="btn btn-phoenix-primary px-4" href="${actionUrl}">
|
||||
<i class="fas fa-check-circle me-2"></i>${buttonText}
|
||||
</a>
|
||||
<button class="btn btn-phoenix-secondary" data-bs-dismiss="modal">
|
||||
@ -99,7 +99,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer bg-light">
|
||||
<div class="card-footer bg-light" hx-boost="false">
|
||||
{% if perms.django_ledger.change_purchaseordermodel %}
|
||||
<div class="d-flex flex-wrap gap-2 justify-content-between">
|
||||
<a href="{% url 'purchase_order_update' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po_model.pk %}"
|
||||
|
||||
@ -10,33 +10,38 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10 ">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">{{ _("Add New Purchase Order") }}</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 mb-9"
|
||||
method="post"
|
||||
class="form"
|
||||
enctype="multipart/form-data"
|
||||
novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10 ">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-300 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center ">
|
||||
{{ _("Add New Purchase Order") }}<span class="fas fa-cart-plus ms-2 text-primary "></span>
|
||||
</h3>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 " method="post" class="form" enctype="multipart/form-data" novalidate >
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'purchase_order_list' request.dealer.slug request.entity.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -9,21 +9,22 @@
|
||||
{% for message in messages %}<div class="alert alert-success">{{ message }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
<h2 class="">
|
||||
{{ _("Purchase Orders") |capfirst }}
|
||||
<li class="fas fa-file-invoice text-primary ms-2"></li>
|
||||
</h2>
|
||||
<div class="row g-3 justify-content-between mb-4">
|
||||
<div class="col-auto">
|
||||
<div class="d-md-flex justify-content-between">
|
||||
{% if perms.django_ledger.add_purchaseordermodel %}
|
||||
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="d-flex">{% include 'partials/search_box.html' %}</div>
|
||||
</div>
|
||||
{{ _("Purchase Orders") |capfirst }} <li class="fas fa-cart-plus text-primary ms-2"></li>
|
||||
</h2>
|
||||
|
||||
<div class="row g-3 justify-content-between mb-4">
|
||||
<div class="col-auto">
|
||||
<div class="d-md-flex justify-content-between">
|
||||
{% if perms.django_ledger.add_purchaseordermodel %}
|
||||
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="d-flex">
|
||||
{% include 'partials/search_box.html' %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive px-1 scrollbar mt-3">
|
||||
<table class= "table align-items-center table-flush table-hover">
|
||||
|
||||
@ -91,11 +91,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Buttons -->
|
||||
{% comment %} <div class="mt-5 text-center">
|
||||
<button type="submit" class="btn btn-success me-2" {% if not items %}disabled{% endif %}><i class="fa-solid fa-floppy-disk me-1"></i> {% trans "Save" %}</button>
|
||||
<a href="{% url 'estimate_list' %}" class="btn btn-danger"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
|
||||
</div> {% endcomment %}
|
||||
|
||||
|
||||
<div class="d-flex justify-content-center">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
|
||||
@ -4,7 +4,9 @@
|
||||
{% block title %}
|
||||
{{ _("Create Quotation") }}
|
||||
{% endblock title %}
|
||||
{% block customCSS %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<style>
|
||||
.disabled{
|
||||
opacity: 0.5;
|
||||
@ -119,9 +121,6 @@
|
||||
width: 0;
|
||||
}
|
||||
</style>
|
||||
{% endblock customCSS %}
|
||||
<!---->
|
||||
{% block content %}
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
{% if not items %}
|
||||
<div class="alert alert-outline-warning d-flex align-items-center"
|
||||
@ -155,83 +154,16 @@
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
<i class="fa-regular fa-file-lines"></i> {% trans "Create Quotation" %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form id="mainForm"
|
||||
method="post"
|
||||
class="needs-validation
|
||||
{% if not items or not customer_count %}disabled{% endif %}">
|
||||
{% csrf_token %}
|
||||
<div class="row g-3 col-12">
|
||||
{{ form|crispy }}
|
||||
<div class="custom-select">
|
||||
<!-- Hidden native select for form submission -->
|
||||
<select class="native-select" name="item" required tabindex="-1">
|
||||
<option value="">Select a car</option>
|
||||
{% for item in items %}<option value="{{ item.hash }}"></option>{% endfor %}
|
||||
</select>
|
||||
<!-- Custom select UI -->
|
||||
<div class="select-trigger">
|
||||
<div class="selected-value">
|
||||
<span>Select a car</span>
|
||||
</div>
|
||||
<i class="fas fa-chevron-down dropdown-icon"></i>
|
||||
</div>
|
||||
<div class="options-container">
|
||||
{% for item in items %}
|
||||
<div class="option"
|
||||
data-value="{{ item.hash }}"
|
||||
data-image="{{ item.logo }}">
|
||||
<img src="{{ item.logo }}" alt="{{ item.model }}">
|
||||
<span>{{ item.make }} {{ item.model }} {{ item.serie }} {{ item.trim }} {{ item.color_name }}</span>
|
||||
<div class="color-box"
|
||||
style="background-color: rgb({{ item.exterior_color }})"></div>
|
||||
<div class="color-box"
|
||||
style="background-color: rgb({{ item.interior_color }})"></div>
|
||||
<span style="color:gray;">({{ item.hash_count }} in stock)</span>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% trans "Create Quotation" %}<i class="fa-regular fa-file-lines me-2"></i>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
<!---->
|
||||
{% comment %} {% block content %}
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
|
||||
<div class="row mt-4">
|
||||
{% if not items %}
|
||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||
<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.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'car_add' request.dealer.slug %}"> {{ _("Add Car") }} </a></p>
|
||||
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if not customer_count %}
|
||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||
<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.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'customer_create' request.dealer.slug %}"> {{ _("Add Customer") }} </a></p>
|
||||
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
{% endif %}
|
||||
<form id="mainForm" method="post" class="needs-validation {% if not items or not customer_count %}disabled{% endif %}">
|
||||
<h3 class="text-center"><i class="fa-regular fa-file-lines"></i> {% trans "Create Quotation" %}</h3>
|
||||
|
||||
{% csrf_token %}
|
||||
<div class="row g-3 col-10">
|
||||
<div class="row g-3 col-12">
|
||||
{{ form|crispy }}
|
||||
<div class="custom-select">
|
||||
<!-- Hidden native select for form submission -->
|
||||
@ -264,19 +196,20 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="d-flex justify-content-center">
|
||||
<button class="btn btn-sm btn-phoenix-success me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-sm btn-phoenix-danger">
|
||||
<i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}
|
||||
</a>
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'estimate_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock content %} {% endcomment %}
|
||||
{% block customJS %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const Toast = Swal.mixin({
|
||||
@ -429,4 +362,5 @@
|
||||
|
||||
});
|
||||
</script>
|
||||
{% endblock customJS %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@ -6,27 +6,200 @@
|
||||
<h1>{% trans 'Sale Order' %}</h1>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% trans 'Sale Order' %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
<link rel="stylesheet" href="{% static 'flags/sprite.css' %}" />
|
||||
<div class="row">
|
||||
<div class="row mb-3">
|
||||
<div class="col-sm-6 col-md-8">
|
||||
<div class="d-sm-flex justify-content-between">
|
||||
<h3 class="mb-3">
|
||||
{% if customer.created %}
|
||||
{{ _('Edit Sale Order') }}
|
||||
{% else %}
|
||||
{{ _('Add Sale Order') }}
|
||||
{% endif %}
|
||||
<span class="fas fa-shopping-cart text-primary ms-2"></span>
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="col-xl-12 col-xxl-12">
|
||||
<div class="px-xl-12">
|
||||
<div class="row mx-0 mx-sm-3 mx-lg-0 px-lg-0">
|
||||
<div class="col-sm-12 col-xxl-6 py-3">
|
||||
<table class="w-100 table-stats ">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-2">
|
||||
<div class="d-inline-flex align-items-center">
|
||||
<div class="d-flex bg-success-subtle rounded-circle flex-center me-3" style="width:24px; height:24px">
|
||||
<span class="text-success-dark" data-feather="user" style="width:16px; height:16px"></span>
|
||||
</div>
|
||||
<p class="fw-bold mb-0">{{ _("Customer Name")}}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-2 d-none d-sm-block pe-sm-2">:</td>
|
||||
<td class="py-2">
|
||||
<p class="ps-6 ps-sm-0 fw-semibold mb-0 mb-0 pb-3 pb-sm-0">{{ estimate.customer.customer_name }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-2">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="d-flex bg-success-subtle rounded-circle flex-center me-3" style="width:24px; height:24px">
|
||||
<span class="text-success-dark" data-feather="mail" style="width:16px; height:16px"></span>
|
||||
</div>
|
||||
<p class="fw-bold mb-0">{{ _("Email") }}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-2 d-none d-sm-block pe-sm-2">:</td>
|
||||
<td class="py-2">
|
||||
<p class="ps-6 ps-sm-0 fw-semibold mb-0">{{ estimate.customer.email }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-2">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="d-flex bg-success-subtle rounded-circle flex-center me-3" style="width:24px; height:24px">
|
||||
<span class="text-success-dark" data-feather="map-pin" style="width:16px; height:16px"></span>
|
||||
</div>
|
||||
<p class="fw-bold mb-0">{{ _("Address") }}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-2 d-none d-sm-block pe-sm-2">:</td>
|
||||
<td class="py-2">
|
||||
<p class="ps-6 ps-sm-0 fw-semibold mb-0">{{ estimate.customer.address_1 }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-2">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="d-flex bg-success-subtle rounded-circle flex-center me-3" style="width:24px; height:24px">
|
||||
<span class="text-success-dark" data-feather="trending-down" style="width:16px; height:16px"></span>
|
||||
</div>
|
||||
<p class="fw-bold mb-0">{{ _("Total Discount")}}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-2 d-none d-sm-block pe-sm-2">:</td>
|
||||
<td class="py-2">
|
||||
<p class="ps-6 ps-sm-0 fw-semibold mb-0">{{ data.total_discount }} <span class="icon-saudi_riyal"></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-2">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="d-flex bg-success-subtle rounded-circle flex-center me-3" style="width:24px; height:24px">
|
||||
<span class="text-success-dark" data-feather="briefcase" style="width:16px; height:16px"></span>
|
||||
</div>
|
||||
<p class="fw-bold mb-0">{{ _("Total Amount")}}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-2 d-none d-sm-block pe-sm-2">:</td>
|
||||
<td class="py-2">
|
||||
<p class="ps-6 ps-sm-0 fw-semibold mb-0">{{ data.grand_total }} <span class="icon-saudi_riyal"></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="border-top border-bottom border-translucent mt-10" id="leadDetailsTable">
|
||||
<div class="table-responsive scrollbar mx-n1 px-1">
|
||||
<table class="table fs-9 mb-0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="white-space-nowrap fs-9 align-middle ps-0" style="width:26px;">
|
||||
<div class="form-check mb-0 fs-8">
|
||||
<input class="form-check-input" type="checkbox" />
|
||||
</div>
|
||||
</form>
|
||||
</th>
|
||||
<th class="sort white-space-nowrap align-middle pe-3 ps-0 text-uppercase" scope="col" data-sort="name" style="width:20%; min-width:100px">
|
||||
{{ _("VIN") }}</th>
|
||||
<th class="sort align-middle pe-6 text-uppercase" scope="col" data-sort="description" style="width:20%; max-width:60px">
|
||||
{{ _("Make") }}</th>
|
||||
<th class="sort align-middle text-start text-uppercase" scope="col" data-sort="create_date" style="width:20%; min-width:115px">
|
||||
{{ _("Model") }}</th>
|
||||
<th class="sort align-middle text-start text-uppercase" scope="col" data-sort="create_by" style="width:20%; min-width:150px">
|
||||
{{ _("Year") }}</th>
|
||||
<th class="sort align-middle text-start text-uppercase" scope="col" data-sort="create_by" style="width:20%; min-width:150px">
|
||||
{{ _("Unit Price")}}</th>
|
||||
<th class="align-middle pe-0 text-end" scope="col" style="width:15%;"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="list" id="lead-details-table-body">
|
||||
{% for car in data.cars %}
|
||||
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
||||
<td class="fs-9 align-middle px-0 py-3">
|
||||
<div class="form-check mb-0 fs-8">
|
||||
<input class="form-check-input" type="checkbox" />
|
||||
</div>
|
||||
</td>
|
||||
<td class="name align-middle white-space-nowrap py-2 ps-0">
|
||||
<a class="d-flex align-items-center text-body-highlight" href="#!">
|
||||
{% comment %} <div class="avatar avatar-m me-3 status-online">
|
||||
<img class="rounded-circle" src="" alt="" />
|
||||
</div> {% endcomment %}
|
||||
<h6 class="mb-0 text-body-highlight fw-bold">{{ car.vin }}</h6>
|
||||
</a>
|
||||
</td>
|
||||
<td class="description align-middle white-space-nowrap text-start fw-bold text-body-tertiary py-2 pe-6">
|
||||
{{ car.make }}
|
||||
</td>
|
||||
<td class="create_by align-middle white-space-nowrap fw-semibold text-body-highlight">{{ car.model }}</td>
|
||||
<td class="create_by align-middle white-space-nowrap fw-semibold text-body-highlight">{{ car.year }}</td>
|
||||
<td class="last_activity align-middle text-center py-2">
|
||||
<div class="d-flex align-items-center flex-1">
|
||||
<span class="fw-bold fs-9 text-body">{{ car.total }} <span class="icon-saudi_riyal"></span></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mx-0">
|
||||
<form method="post" class="form row g-3 needs-validation" novalidate>
|
||||
{% csrf_token %}
|
||||
<div class="col-md-6">
|
||||
<label for="id_estimate" class="form-label">{% trans "Quotation" %}</label>
|
||||
<input type="text"
|
||||
class="form-control form-control-sm"
|
||||
id="id_estimate"
|
||||
name="estimate"
|
||||
value="{{ form.estimate.value|default_if_none:'' }}"
|
||||
readonly>
|
||||
<div class="invalid-feedback">{% trans "Please provide an estimate." %}</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label for="id_payment_method" class="form-label">{% trans "Payment Method" %}</label>
|
||||
<select class="form-select form-select-sm"
|
||||
id="id_payment_method"
|
||||
name="payment_method"
|
||||
required>
|
||||
{% for value, label in form.payment_method.field.choices %}
|
||||
<option value="{{ value }}"
|
||||
{% if form.payment_method.value == value %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="invalid-feedback">{% trans "Please select a payment method." %}</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="id_comments" class="form-label">{% trans "Comments" %}</label>
|
||||
<textarea class="form-control" id="id_comments" name="comments" rows="3">{{ form.comments.value|default_if_none:'' }}</textarea>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button class="btn btn-phoenix-primary" type="submit">{% trans 'Save' %}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -11,20 +11,20 @@
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
<i class="fa-solid fa-receipt"></i> {{ _("Add Invoice") }}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<hr class="my-2">
|
||||
{{ _("Add Invoice") }}<i class="fa-solid fa-receipt ms-2 text-primary"></i>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
|
||||
|
||||
<form method="post" action="">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'invoice_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@ -1,118 +1,115 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n %}
|
||||
{% load custom_filters %}
|
||||
{% block title %}
|
||||
{% trans 'Sales' %} {% endblock %}
|
||||
{% block content %}
|
||||
<section class="mt-2">
|
||||
<div class="row overflow-x-auto whitespace-nowrap -mx-2 sm:mx-0">
|
||||
<div class="row g-3 justify-content-between mb-4">
|
||||
<div class="col-auto">
|
||||
<div class="d-md-flex justify-content-between">
|
||||
<h2 class="mb-4">
|
||||
{% trans 'Sale Orders' %}<i class="fa-solid fa-cart-shopping ms-2 text-primary"></i>
|
||||
</h2>
|
||||
{%block title%} {%trans 'Sale Orders'%} {%endblock%}
|
||||
|
||||
{% block content %}
|
||||
<section class="mt-2">
|
||||
<div class="row overflow-x-auto whitespace-nowrap -mx-2 sm:mx-0">
|
||||
|
||||
<div class="row g-3 justify-content-between mb-4">
|
||||
<div class="col-auto">
|
||||
<div class="d-md-flex justify-content-between">
|
||||
<h2 class="mb-4">{% trans 'Sale Orders' %}<i class="fa-solid fa-cart-shopping ms-2 text-primary"></i></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="d-flex">
|
||||
{% include 'partials/search_box.html' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive scrollbar mx-n1 px-1">
|
||||
<table class="table align-items-center table-flush">
|
||||
<thead>
|
||||
<tr class="bg-body-highlight">
|
||||
<th class="sort white-space-nowrap align-middle ps-0" scope="col" data-sort="customer_name">
|
||||
{{ _("Customer Name")}}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="customer_address" >{{ _("Customer Address")}}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="customer_phone">{{ _("Customer Phone")}}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="quotation">{{ _("Quotation") }}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="invoice" >{{ _("Invoice") }}</th>
|
||||
<th class="sort align-middle text-end" scope="col" ></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="list" id="project-list-table-body">
|
||||
{% for tx in txs %}
|
||||
<tr class="position-static">
|
||||
<td class="align-middle white-space-nowrap customer_name px-1">
|
||||
<p class="mb-0 fs-9 text-body">{{tx.customer.first_name}} {{tx.customer.last_name}}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap customer_address">
|
||||
<p class="mb-0 fs-9 text-body">{{tx.customer.address}}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap customer_phone">
|
||||
<p class="mb-0 fs-9 text-body">{{tx.customer.phone_number}}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap quotation">
|
||||
{% if tx.estimate and perms.django_ledger.view_estimatemodel%}
|
||||
<p class="fw-bo text-body fs-9 mb-0">
|
||||
<a href="{% url 'estimate_detail' request.dealer.slug tx.estimate.uuid %}">
|
||||
{{ tx.estimate.estimate_number}}
|
||||
</a><br>
|
||||
{% if tx.estimate.status == "draft" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-warning">{{tx.estimate.status}}</span>
|
||||
{% elif tx.estimate.status == "in_review" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-info">{{tx.estimate.status}}</span>
|
||||
{% elif tx.estimate.status == "approved" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-primary">{{tx.estimate.status}}</span>
|
||||
{% elif tx.estimate.status == "completed" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{tx.estimate.status}}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap invoice">
|
||||
{% if tx.invoice and perms.django_ledger.view_invoicemodel%}
|
||||
<p class="fw-bo text-body fs-9 mb-0">
|
||||
<a href="{% url 'invoice_detail' request.dealer.slug request.entity.slug tx.invoice.uuid %}">
|
||||
{{tx.invoice.invoice_number}}
|
||||
</a><br>
|
||||
{% if tx.invoice.is_draft %}
|
||||
<span class="badge badge-phoenix badge-phoenix-warning">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_review %}
|
||||
<span class="badge badge-phoenix badge-phoenix-info">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_approved %}
|
||||
<span class="badge badge-phoenix badge-phoenix-primary">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_completed %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_paid %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_canceled %}
|
||||
<span class="badge badge-phoenix badge-phoenix-danger">{{tx.invoice.invoice_status}}</span>
|
||||
{% elif tx.invoice.is_past_due %}
|
||||
<span class="badge badge-phoenix badge-phoenix-danger">{{ _("Past Due")}}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle text-end white-space-nowrap pe-4 action">
|
||||
<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 text-success-dark" href="{% url 'order_detail' request.dealer.slug tx.pk %}">{{ _("View Sales Order Detail") }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="d-flex">{% include 'partials/search_box.html' %}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive scrollbar mx-n1 px-1">
|
||||
<table class="table align-items-center table-flush">
|
||||
<thead>
|
||||
<tr class="bg-body-highlight">
|
||||
<th class="sort white-space-nowrap align-middle ps-0"
|
||||
scope="col"
|
||||
data-sort="customer_name">{{ _("Customer Name") }}</th>
|
||||
<th class="sort align-middle ps-3"
|
||||
scope="col"
|
||||
data-sort="customer_address">{{ _("Customer Address") }}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="customer_phone">{{ _("Customer Phone") }}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="quotation">{{ _("Quotation") }}</th>
|
||||
<th class="sort align-middle ps-3" scope="col" data-sort="invoice">{{ _("Invoice") }}</th>
|
||||
<th class="sort align-middle text-end" scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="list" id="project-list-table-body">
|
||||
{% for tx in txs %}
|
||||
<tr class="position-static">
|
||||
<td class="align-middle white-space-nowrap customer_name px-1">
|
||||
<p class="mb-0 fs-9 text-body">{{ tx }}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap customer_address">
|
||||
<p class="mb-0 fs-9 text-body">{{ tx.customer.address }}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap customer_phone">
|
||||
<p class="mb-0 fs-9 text-body">{{ tx.customer.phone_number }}</p>
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap quotation">
|
||||
{% if tx.estimate and perms.django_ledger.view_estimatemodel %}
|
||||
<p class="fw-bo text-body fs-9 mb-0">
|
||||
<a href="{% url 'estimate_detail' request.dealer.slug tx.estimate.uuid %}">{{ tx.estimate.estimate_number }}</a>
|
||||
<br>
|
||||
{% if tx.estimate.status == "draft" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-warning">{{ tx.estimate.status }}</span>
|
||||
{% elif tx.estimate.status == "in_review" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-info">{{ tx.estimate.status }}</span>
|
||||
{% elif tx.estimate.status == "approved" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-primary">{{ tx.estimate.status }}</span>
|
||||
{% elif tx.estimate.status == "completed" %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{ tx.estimate.status }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle white-space-nowrap invoice">
|
||||
{% if tx.invoice and perms.django_ledger.view_invoicemodel %}
|
||||
<p class="fw-bo text-body fs-9 mb-0">
|
||||
<a href="{% url 'invoice_detail' request.dealer.slug request.entity.slug tx.invoice.uuid %}">{{ tx.invoice.invoice_number }}</a>
|
||||
<br>
|
||||
{% if tx.invoice.is_draft %}
|
||||
<span class="badge badge-phoenix badge-phoenix-warning">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_review %}
|
||||
<span class="badge badge-phoenix badge-phoenix-info">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_approved %}
|
||||
<span class="badge badge-phoenix badge-phoenix-primary">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_completed %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_paid %}
|
||||
<span class="badge badge-phoenix badge-phoenix-success">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_canceled %}
|
||||
<span class="badge badge-phoenix badge-phoenix-danger">{{ tx.invoice.invoice_status }}</span>
|
||||
{% elif tx.invoice.is_past_due %}
|
||||
<span class="badge badge-phoenix badge-phoenix-danger">{{ _("Past Due") }}</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle text-end white-space-nowrap pe-4 action">
|
||||
<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 text-success-dark"
|
||||
href="{% url 'order_detail' request.dealer.slug tx.pk %}">{{ _("View Sales Order Detail") }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% 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>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{% 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>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<div class="toast-container">
|
||||
<div id="toast-container" class="toast-container">
|
||||
<script>
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
|
||||
@ -10,10 +10,13 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
|
||||
<!---->
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
<i class="fa-solid fa-user-tie"></i>
|
||||
{% if staff.created %}
|
||||
@ -21,30 +24,32 @@
|
||||
{% else %}
|
||||
{{ _("Add Staff") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 mb-9" method="post" class="form" enctype="multipart/form-data" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form.name|as_crispy_field }}
|
||||
{{ form.arabic_name|as_crispy_field }}
|
||||
{{ form.email|as_crispy_field }}
|
||||
{{ form.phone_number|as_crispy_field }}
|
||||
{{ form.address|as_crispy_field }}
|
||||
{{ form.logo|as_crispy_field }}
|
||||
{{ form.group|as_crispy_field }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 mb-9" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form.name|as_crispy_field }}
|
||||
{{ form.arabic_name|as_crispy_field }}
|
||||
{{ form.email|as_crispy_field }}
|
||||
{{ form.phone_number|as_crispy_field }}
|
||||
{{ form.address|as_crispy_field }}
|
||||
{{ form.logo|as_crispy_field }}
|
||||
{{ form.group|as_crispy_field }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'user_list' request.dealer.slug %}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -5,33 +5,32 @@
|
||||
{% trans "Group" %}
|
||||
{% endblock title %}
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="row">
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<div class="d-sm-flex justify-content-between">
|
||||
<h3 class="mb-3">
|
||||
<i class="fa-solid fa-users"></i> {{ _("Manage Groups") }}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<form class="row g-3 mb-9" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<div class="d-flex mb-3">
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-phoenix-primary me-2 px-6"><i class="fa-solid fa-ban"></i> {% trans "Cancel" %}</a>
|
||||
<button class="btn btn-phoenix-primary" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk"></i>
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-sm-9">
|
||||
<div class="d-sm-flex justify-content-between">
|
||||
<h3 class="mb-3"><i class="fa-solid fa-users"></i> {{ _("Manage Groups") }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-9">
|
||||
<form class="row g-3 mb-9" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}
|
||||
<div class="text-danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
<div class="d-flex mb-3">
|
||||
<a href="{% url 'user_detail' request.dealer.slug staff.slug %}" class="btn btn-phoenix-primary me-2 px-6"><i class="fa-solid fa-ban"></i> {% trans "Cancel" %}</a>
|
||||
<button class="btn btn-phoenix-primary" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk"></i>
|
||||
{{ _("Save") }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
49
templates/vendors/vendor_form.html
vendored
49
templates/vendors/vendor_form.html
vendored
@ -10,38 +10,35 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center text-white">
|
||||
{% if vendor.created %}
|
||||
{{ _("Edit Vendor") }}
|
||||
|
||||
|
||||
<div class="row justify-content-center mt-5 mb-3">
|
||||
|
||||
<div class="col-lg-8 col-md-10">
|
||||
<div class="card shadow-sm border-0 rounded-3">
|
||||
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
|
||||
<h3 class="mb-0 fs-4 text-center">
|
||||
{% if vendor.created %}
|
||||
{{ _("Edit Vendor") }}
|
||||
{% else %}
|
||||
{{ _("Add Vendor") }}
|
||||
{% endif %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 mb-9"
|
||||
method="post"
|
||||
class="form"
|
||||
enctype="multipart/form-data"
|
||||
novalidate>
|
||||
{{ _("Add Vendor") }}
|
||||
{% endif %}
|
||||
<span class="fas fa-cube ms-2 text-primary"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="card-body bg-light-subtle">
|
||||
<form class="row g-3 mb-9" method="post" class="form" enctype="multipart/form-data" novalidate >
|
||||
{% csrf_token %}
|
||||
{{ redirect_field }}
|
||||
{{ form|crispy }}
|
||||
{% for error in form.errors %}<div class="text-danger">{{ error }}</div>{% endfor %}
|
||||
<hr class="my-2">
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit">
|
||||
<i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}
|
||||
</button>
|
||||
<a href="{{ request.META.HTTP_REFERER }}"
|
||||
class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
|
||||
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
|
||||
<a href="{% url 'vendor_list' request.dealer.slug%}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
3
templates/vendors/vendors_list.html
vendored
3
templates/vendors/vendors_list.html
vendored
@ -10,7 +10,8 @@
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">
|
||||
{{ _("Vendors") |capfirst }}
|
||||
</h2>
|
||||
<span class="fas fa-cube ms-2 text-primary"></span>
|
||||
</h3>
|
||||
{% if perms.django_ledger.add_vendormodel %}
|
||||
<a href="{% url 'vendor_create' request.dealer.slug %}"
|
||||
class="btn btn-md btn-phoenix-primary">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user