diff --git a/inventory/models.py b/inventory/models.py index 33c4b206..87330e1b 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -886,11 +886,11 @@ class Car(Base): @property def get_additional_services_vat(self): vat = VatRate.objects.filter(dealer=self.dealer,is_active=True).first() - return sum([Decimal((x.price)*(vat.rate)) for x in self.additional_services.all()]) + return sum([Decimal((x.price)*(vat.rate)) for x in self.additional_services.filter(taxable=True)]) def get_additional_services(self): vat = VatRate.objects.filter(dealer=self.dealer,is_active=True).first() - return {"services": [[x,(x.price)*(vat.rate)] for x in self.additional_services.all()], + return {"services": [[x,((x.price)*(vat.rate) if x.taxable else 0)] for x in self.additional_services.all()], "total_":self.get_additional_services_amount_, "total":self.get_additional_services_amount, "services_vat":self.get_additional_services_vat} diff --git a/inventory/utils.py b/inventory/utils.py index 687ffaf5..cabfb161 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -1306,7 +1306,7 @@ def get_finance_data(estimate,dealer): additional_services = car.get_additional_services() discounted_price=(Decimal(car.marked_price) - discount) vat_amount = discounted_price * vat.rate - total_services_vat=sum([ x[1] for x in additional_services.get("services")]) + total_services_vat=sum([x[1] for x in additional_services.get("services")]) total_vat=vat_amount+total_services_vat return { "car": car, @@ -1316,7 +1316,7 @@ def get_finance_data(estimate,dealer): "vat_rate": vat.rate, "discount_amount": discount, "additional_services": additional_services, - "final_price": discounted_price+ vat_amount, + "final_price": discounted_price + vat_amount, "total_services_vat":total_services_vat, "total_vat":total_vat, "grand_total": discounted_price + total_vat + additional_services.get("total") @@ -2417,9 +2417,9 @@ def force_regenerate_car_image(car): class CarImageAPIClient: """Simple client to handle authenticated requests to the car image API""" - BASE_URL = "http://127.0.0.1:8888" - USERNAME = "ismail.mosa.ibrahim@gmail.com" - PASSWORD = "Supremk4!" + BASE_URL = "http://10.10.1.111:8888" + USERNAME = "faheed" + PASSWORD = "Tenhal@123" def __init__(self): self.session = None diff --git a/inventory/views.py b/inventory/views.py index 3808cddc..294fda00 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -4979,6 +4979,7 @@ def create_estimate(request, dealer_slug, slug=None): .annotate(hash_count=Count("hash")) .distinct() ) + context = { "form": form, "items": [ @@ -6328,6 +6329,7 @@ def lead_create(request, dealer_slug): qs = form.fields["id_car_make"].queryset.filter( is_sa_import=True, pk__in=dealer_make_list ) + # print(qs) form.fields["staff"].queryset = ( form.fields["staff"] .queryset.select_related("user") @@ -6346,10 +6348,12 @@ def lead_create(request, dealer_slug): form.fields["staff"].queryset = models.Staff.objects.filter( dealer=dealer, pk=request.staff.pk ) + qs = qs.order_by("name") form.fields["id_car_make"].queryset = qs form.fields["id_car_make"].choices = [ (obj.id_car_make, obj.get_local_name()) for obj in qs - ] + ] + if first_make := qs.first(): form.fields["id_car_model"].queryset = first_make.carmodel_set.all() @@ -8435,7 +8439,7 @@ class FiscalYearIncomeStatementViewBase( """ template_name = "ledger/reports/income_statement.html" - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_ledgermodel"] def get_login_url(self): return reverse("account_login") @@ -8574,7 +8578,7 @@ class FiscalYearCashFlowStatementViewBase( """ template_name = "ledger/reports/cash_flow_statement.html" - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_ledgermodel"] def get_login_url(self): return reverse("account_login") @@ -8763,7 +8767,7 @@ class FiscalYearEntityModelDashboardView( :type permission_required: list """ - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_ledgermodel"] def get_login_url(self): return reverse("account_login") @@ -11433,6 +11437,10 @@ def create_ticket(request,dealer_slug): def ticket_list(request,dealer_slug): dealer= get_object_or_404(models.Dealer, slug=dealer_slug) tickets = models.Ticket.objects.filter(dealer=dealer).order_by('-created_at') + query=request.GET.get('q') + if query: + tickets=tickets.filter(Q(id__icontains=query)| Q(subject__icontains=query)) + return render(request, 'support/ticket_list.html', {'tickets': tickets}) @login_required diff --git a/static/images/car_images/009e22d9248cbe248ebdeec5a9eca611685a010e7231b9d8ff3eed7ef69578c1.png b/static/images/car_images/009e22d9248cbe248ebdeec5a9eca611685a010e7231b9d8ff3eed7ef69578c1.png new file mode 100644 index 00000000..91612667 Binary files /dev/null and b/static/images/car_images/009e22d9248cbe248ebdeec5a9eca611685a010e7231b9d8ff3eed7ef69578c1.png differ diff --git a/static/images/car_images/26ed2a3da637ef1d2311b7d9669ac114e6fb0e3bb6a95ca869ddfbef25d276a8.png b/static/images/car_images/26ed2a3da637ef1d2311b7d9669ac114e6fb0e3bb6a95ca869ddfbef25d276a8.png new file mode 100644 index 00000000..f2027520 Binary files /dev/null and b/static/images/car_images/26ed2a3da637ef1d2311b7d9669ac114e6fb0e3bb6a95ca869ddfbef25d276a8.png differ diff --git a/static/images/car_images/48ddd3296f1d67086048962de55ac90c1d9947366a18043174310b159a0ccdda.png b/static/images/car_images/48ddd3296f1d67086048962de55ac90c1d9947366a18043174310b159a0ccdda.png new file mode 100644 index 00000000..19f4ce00 Binary files /dev/null and b/static/images/car_images/48ddd3296f1d67086048962de55ac90c1d9947366a18043174310b159a0ccdda.png differ diff --git a/static/images/car_images/534ccd6b97e583b70543209caaf576527c919392e734930c122e85abacbd0342.png b/static/images/car_images/534ccd6b97e583b70543209caaf576527c919392e734930c122e85abacbd0342.png new file mode 100644 index 00000000..71b7ad54 Binary files /dev/null and b/static/images/car_images/534ccd6b97e583b70543209caaf576527c919392e734930c122e85abacbd0342.png differ diff --git a/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5.png b/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5.png new file mode 100644 index 00000000..775fce04 Binary files /dev/null and b/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5.png differ diff --git a/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5_8INzwoS.png b/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5_8INzwoS.png new file mode 100644 index 00000000..1dca9f3b Binary files /dev/null and b/static/images/car_images/f7c768a47ae0e98b0ade3aa5774c1cb5196f843c2f007d1f2596621fb07b9de5_8INzwoS.png differ diff --git a/static/images/logos/users/Gemini_Generated_Image_wf3w0uwf3w0uwf3w_pGlJONy.png b/static/images/logos/users/Gemini_Generated_Image_wf3w0uwf3w0uwf3w_pGlJONy.png new file mode 100644 index 00000000..0b4f99a9 Binary files /dev/null and b/static/images/logos/users/Gemini_Generated_Image_wf3w0uwf3w0uwf3w_pGlJONy.png differ diff --git a/templates/account/user_settings.html b/templates/account/user_settings.html index 2ca24266..0700d665 100644 --- a/templates/account/user_settings.html +++ b/templates/account/user_settings.html @@ -3,52 +3,45 @@ {% load i18n static %} {% load allauth account %} {% block title %} - {% trans 'User Settings' %} + {% trans 'Dealer Settings' %} {% endblock %} {% block content %} - - -
- -
-
-
-

- Dealer Settings - -

+
+
+
+
+

+ {% trans "Dealer Settings" %} + +

-
-
- {% csrf_token %} -
-
-
-
-

{% trans 'Default Invoice Accounts' %}

-
{{ form.invoice_cash_account|as_crispy_field }}
-
{{ form.invoice_prepaid_account|as_crispy_field }}
-
{{ form.invoice_unearned_account|as_crispy_field }}
-
-
-
-
-

{% trans 'Default Bill Accounts' %}

-
{{ form.bill_cash_account|as_crispy_field }}
-
{{ form.bill_prepaid_account|as_crispy_field }}
-
{{ form.bill_unearned_account|as_crispy_field }}
-
-
-
-
- -
-
-
-
-
- +
+
+ {% csrf_token %} +
+
+

{% trans 'Default Invoice Accounts' %}

+ {{ form.invoice_cash_account|as_crispy_field }} + {{ form.invoice_prepaid_account|as_crispy_field }} + {{ form.invoice_unearned_account|as_crispy_field }} +
+
+

{% trans 'Default Bill Accounts' %}

+ {{ form.bill_cash_account|as_crispy_field }} + {{ form.bill_prepaid_account|as_crispy_field }} + {{ form.bill_unearned_account|as_crispy_field }} +
+
+
+
+ +
+
-{% endblock %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/bill/bill_create.html b/templates/bill/bill_create.html index 6023dbe2..e86a5929 100644 --- a/templates/bill/bill_create.html +++ b/templates/bill/bill_create.html @@ -8,50 +8,46 @@ {% endblock title %} {% block content %} - - -
- -
-
-
-

- {% trans 'Create Bill' %} -

+
+
+
+
+

+ {% trans 'Create Bill' %} + +

-
- -
-
- - {% csrf_token %} - {% if po_model %} -
-

{% trans 'Bill for' %} {{ po_model.po_number }}

-

{% trans 'Bill for' %} {{ po_model.po_title }}

-
- {% for itemtxs in po_itemtxs_qs %} - {{ itemtxs }} - {% endfor %} -
+
+ + {% csrf_token %} + {% if po_model %} +
+

{% trans 'Bill for' %} {{ po_model.po_number }}

+

{% trans 'Bill for' %} {{ po_model.po_title }}

+
+ {% for itemtxs in po_itemtxs_qs %} + {{ itemtxs }} + {% endfor %}
- {% endif %} - -
- {{ form|crispy }}
-
-
- - {% trans "Cancel" %} -
+ {% endif %} +
+ {{ form|crispy }} +
+
+
+ + + + {% trans "Cancel" %} +
- - -
- -{% endblock %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/chart_of_accounts/coa_create.html b/templates/chart_of_accounts/coa_create.html index f5c9bd26..98dc4f2b 100644 --- a/templates/chart_of_accounts/coa_create.html +++ b/templates/chart_of_accounts/coa_create.html @@ -1,54 +1,59 @@ {% extends 'base.html' %} -{% load i18n %} -{% load static %} +{% load i18n static %} {% load django_ledger %} {% load widget_tweaks %} {% block content %} -
-
-
-

{% trans 'Create Chart of Accounts' %}

+
+
+
+
+

+ {% trans 'Create Chart of Accounts' %} + +

-
-
-
-
- {% csrf_token %} - - {# Bootstrap form rendering #} -
- {{ form.name.label_tag }} - {{ form.name|add_class:"form-control" }} - {% if form.name.help_text %} - {{ form.name.help_text }} - {% endif %} - {% for error in form.name.errors %} -
{{ error }}
- {% endfor %} -
-
- {{ form.description.label_tag }} - {{ form.description|add_class:"form-control" }} - {% if form.description.help_text %} - {{ form.description.help_text }} - {% endif %} - {% for error in form.description.errors %} -
{{ error }}
- {% endfor %} -
- - - -
+
+
+ {% csrf_token %} + + {# Bootstrap form rendering #} +
+ {{ form.name.label_tag }} + {{ form.name|add_class:"form-control" }} + {% if form.name.help_text %} + {{ form.name.help_text }} + {% endif %} + {% for error in form.name.errors %} +
{{ error }}
+ {% endfor %}
-
+
+ {{ form.description.label_tag }} + {{ form.description|add_class:"form-control" }} + {% if form.description.help_text %} + {{ form.description.help_text }} + {% endif %} + {% for error in form.description.errors %} +
{{ error }}
+ {% endfor %} +
+ +
+
+ + + + {% trans 'Cancel' %} + +
+
+
{% endblock %} \ No newline at end of file diff --git a/templates/crm/leads/lead_form.html b/templates/crm/leads/lead_form.html index 81f4c744..156527cc 100644 --- a/templates/crm/leads/lead_form.html +++ b/templates/crm/leads/lead_form.html @@ -1,5 +1,6 @@ {% extends 'base.html' %} {% load i18n static crispy_forms_filters %} + {% block title %} {% if object %} {% trans 'Update Lead' %} @@ -7,6 +8,7 @@ {% trans 'Add New Lead' %} {% endif %} {% endblock %} + {% block customcss %} {% endblock customcss %} + {% block content %} -
-
-
-
-

- {% if object %} - {{ _("Update Lead") }} - {% else %} - {{ _("Create New Lead") }} - {% endif %} -
  • -

    -
    -
    -
    - {% csrf_token %} - {{ form|crispy }} -
    -
    - - - - {% trans "Cancel" %} - -
    -
    -
    +
    +
    +
    +
    +

    + {% if object %} + {% trans "Update Lead" %} + + {% else %} + {% trans "Create New Lead" %} + + {% endif %} +

    +
    +
    +
    + {% csrf_token %} + {{ form|crispy }} + +
    +
    + + + + {% trans "Cancel" %} + +
    +
    - -{% endblock %} +
    +{% endblock %} \ No newline at end of file diff --git a/templates/customers/customer_form.html b/templates/customers/customer_form.html index a39d3a8d..1ac13742 100644 --- a/templates/customers/customer_form.html +++ b/templates/customers/customer_form.html @@ -1,42 +1,60 @@ {% extends "base.html" %} {% load i18n static %} {% load crispy_forms_filters %} + {% block title %} - {# Check if an 'object' exists in the context #} {% if object %} {% trans 'Update Customer' %} {% else %} {% trans 'Add New Customer' %} {% endif %} {% endblock %} + {% block content %} -
    -
    -
    -
    -

    - {% if customer.created %} - {{ _("Edit Customer") }} - {% else %} - {{ _("Add Customer") }} - {% endif %} - -

    -
    -
    -
    - {% csrf_token %} - {{ form|crispy }} -
    -
    - - {% trans "Cancel" %} +
    +
    +
    +
    +

    + {% if object %} + {% trans "Update Customer" %} + + {% else %} + {% trans "Add New Customer" %} + + {% endif %} +

    +
    +
    + + {% csrf_token %} + {{ form|crispy }} + + {% if form.errors %} + - -
    + {% endif %} + +
    +
    + + + + {% trans "Cancel" %} + +
    +
    - {% endblock %} +
    + +{% endblock %} \ No newline at end of file diff --git a/templates/dealers/dealer_form.html b/templates/dealers/dealer_form.html index ee103d98..9c2f36d5 100644 --- a/templates/dealers/dealer_form.html +++ b/templates/dealers/dealer_form.html @@ -5,32 +5,34 @@ {{ _("Update Dealer Information") }} {% endblock title %} {% block content %} - - -
    - -
    -
    -
    -

    - {{ _("Update Dealer Information") }} -

    +
    +
    +
    +
    +

    + {{ _("Update Dealer Information") }} + +

    -
    - +
    - {% csrf_token %} - {{ form|crispy }} -
    + {% csrf_token %} + {{ form|crispy }} +
    - - {% trans "Cancel" %} + + + + {% trans "Cancel" %} +
    - -
    - -{% endblock %} +
    +{% endblock %} \ No newline at end of file diff --git a/templates/groups/group_form.html b/templates/groups/group_form.html index c6b5574d..973268c3 100644 --- a/templates/groups/group_form.html +++ b/templates/groups/group_form.html @@ -2,7 +2,7 @@ {% load i18n %} {% load crispy_forms_filters %} {% block title %} - {# Check if an 'object' exists in the context #} + {# Check if an 'object' exists in the context #} {% if object %} {% trans 'Update Group' %} {% else %} @@ -10,41 +10,49 @@ {% endif %} {% endblock %} {% block content %} - - -
    -
    -
    -
    -

    - {% if staff.created %} - {{ _("Edit Group") }} - {% else %} - {{ _("Create Group") }} - {% endif %} - -

    +
    +
    +
    +
    +

    + {% if object %} + {% trans "Update Group" %} + + {% else %} + {% trans "Create Group" %} + + {% endif %} +

    -
    - -
    +
    + {% csrf_token %} {{ redirect_field }} {{ form|crispy }} - {% for error in form.errors %} -
    {{ error }}
    - {% endfor %} -
    -
    - - {% trans "Cancel" %} + {% if form.errors %} + + {% endif %} + +
    +
    + + + {% trans "Cancel" %} +
    - -
    - -{% endblock %} +
    +{% endblock %} \ No newline at end of file diff --git a/templates/groups/group_list.html b/templates/groups/group_list.html index 85110d8a..519f6d2c 100644 --- a/templates/groups/group_list.html +++ b/templates/groups/group_list.html @@ -6,62 +6,70 @@ {% trans "Groups" %} {% endblock title %} {% block content %} - -{% if groups or request.GET.q%} -
    -
    -
    -
    -
    +
    +
    + {% if groups or request.GET.q %} +
    +
    +
    {% trans "Groups" %}
    +
    {% trans "Add Group" %} + class="btn btn-phoenix-primary"> + + {% trans "Add Group" %} + {% trans "Back to Staffs" %} + class="btn btn-phoenix-secondary"> + {% trans "Back to Staffs" %} +
    -
    -
    - - - - - - - - - - - {% for group in groups %} - - - - - - - {% endfor %} - -
    {% trans 'name'|capfirst %}{% trans 'total Users'|capfirst %}{% trans 'total permission'|capfirst %}{% trans 'actions'|capfirst %}
    {{ group.name }} - {{ group.users.count }} - - {{ group.permissions.count }} - - - - {% trans 'view'|capfirst %} - -
    -
    - {% if page_obj.paginator.num_pages > 1 %} -
    -
    {% include 'partials/pagination.html' %}
    +
    +
    + + + + + + + + + + + {% for group in groups %} + + + + + + + {% endfor %} + +
    {% trans 'name'|capfirst %}{% trans 'total Users'|capfirst %}{% trans 'total permission'|capfirst %}{% trans 'actions'|capfirst %}
    {{ group.name }} + {{ group.users.count }} + + {{ group.permissions.count }} + + + + {% trans 'view'|capfirst %} + +
    +
    - {% endif %} -
    -
    - - {% else %} - {% url "group_create" request.dealer.slug as create_group_url %} - {% include "empty-illustration-page.html" with value="group" url=create_group_url %} - {% endif %} -{% endblock %} + {% if page_obj.paginator.num_pages > 1 %} + + {% endif %} +
    + {% else %} + {% url "group_create" request.dealer.slug as create_group_url %} + {% include "empty-illustration-page.html" with value="group" url=create_group_url %} + {% endif %} +
    + +{% endblock %} \ No newline at end of file diff --git a/templates/header.html b/templates/header.html index 5564f93f..ac2e446b 100644 --- a/templates/header.html +++ b/templates/header.html @@ -3,10 +3,10 @@