diff --git a/inventory/views.py b/inventory/views.py index 434a540b..03f16f99 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -6762,27 +6762,37 @@ def send_lead_email(request, dealer_slug, slug, email_pk=None): # return response # return redirect("lead_list", dealer_slug=dealer_slug) msg = f""" - السلام عليكم - Dear {lead.full_name}, +السلام عليكم {lead.full_name}, - أود أن أشارككم تقدير المشروع الذي ناقشناه. يرجى العثور على الوثيقة التفصيلية للمقترح المرفقة. +شكراً لزيارتك لـ {lead.dealer.name}! لقد كان من دواعي سرورنا مساعدتك اليوم. - I hope this email finds you well. I wanted to share with you the estimate for the project we discussed. Please find the detailed estimate document attached. +لقد أنشأنا ملفاً شخصياً لك في نظامنا لتتبع تفضيلاتك والسيارات التي تهتم بها. سنتواصل معك قريباً للمتابعة والإجابة على أي أسئلة أخرى قد تكون لديك. - يرجى مراجعة المقترح وإعلامي إذا كانت لديك أي أسئلة أو مخاوف. إذا كانت كل شيء يبدو جيدًا، يمكننا المضي قدمًا في المشروع. +في هذه الأثناء، لا تتردد في الاتصال بنا مباشرة على {lead.dealer.phone_number} أو زيارتنا مرة أخرى في أي وقت يناسبك. - Please review the estimate and let me know if you have any questions or concerns. If everything looks good, we can proceed with the project. +نتطلع إلى مساعدتك في العثور على سيارتك القادمة! - شكراً لاهتمامكم بهذا الأمر. - Thank you for your attention to this matter. +تحياتي، +{lead.dealer.arabic_name} +{lead.dealer.address} +{lead.dealer.phone_number} +----- +Dear {lead.full_name}, - تحياتي, - Best regards, - [Your Name] - [Your Position] - [Your Company] - [Your Contact Information] - """ +Thank you for visiting {lead.dealer.name}! It was a pleasure to assist you today. + +We've created a profile for you in our system to keep track of your preferences and the vehicles you're interested in. We'll be in touch shortly to follow up and answer any further questions you may have. + +In the meantime, feel free to contact us directly at {lead.dealer.phone_number} or visit us again at your convenience. + +We look forward to helping you find your next car! + +Best regards, +{lead.dealer.name} +{lead.dealer.address} +{lead.dealer.phone_number} + +""" subject = "" if email_pk: email = get_object_or_404(models.Email, pk=email_pk) @@ -7034,17 +7044,11 @@ class OpportunityListView(LoginRequiredMixin, PermissionRequiredMixin, ListView) staff = self.request.staff queryset = models.Opportunity.objects.filter(dealer=dealer, lead__staff=staff) - # Search filter - search = self.request.GET.get("q") - if search: - queryset = queryset.filter( - Q(customer__first_name__icontains=search) - | Q(customer__last_name__icontains=search) - | Q(customer__email__icontains=search) - ) + # Stage filter stage = self.request.GET.get("stage") + print(stage) if stage: queryset = queryset.filter(stage=stage) @@ -7055,7 +7059,16 @@ class OpportunityListView(LoginRequiredMixin, PermissionRequiredMixin, ListView) elif sort == "highest": queryset = queryset.order_by("-expected_revenue") elif sort == "closing": - queryset = queryset.order_by("closing_date") + queryset = queryset.order_by("expected_close_date") + + # Search filter + search = self.request.GET.get("q") + if search: + queryset = queryset.filter( + Q(customer__first_name__icontains=search) + | Q(customer__last_name__icontains=search) + | Q(customer__email__icontains=search) + ) return queryset @@ -7799,27 +7812,44 @@ def send_email_view(request, dealer_slug, pk): ) msg = f""" - السلام عليكم - Dear {estimate.customer.customer_name}, +السلام عليكم، - أود أن أشارككم عرض السعر. +عزيزي {estimate.customer.customer_name}، - I wanted to share with you the quotation. +يسعدني أن أشارككم عرض السعر الذي طلبتموه. يرجى الاطلاع على التفاصيل الكاملة والأسعار من خلال الرابط أدناه. - يرجى مراجعة عرض السعر وإعلامي إذا كانت لديك أي استفسارات أو ملاحظات. إذا كان كل شيء على ما يرام، يمكننا المتابعة في الإجراءات. +حرصنا على أن يكون عرضنا مناسباً وشفافاً. إذا كانت لديكم أي استفسارات أو ملاحظات، فلا تترددوا في التواصل معنا. - Please review the quotation and let me know if you have any questions or concerns. If everything looks good, we can proceed with the process. +رابط عرض السعر: +{link} - رابط عرض السعر: - {link} +نأمل أن ينال العرض إعجابكم ونتطلع إلى بدء العمل قريباً! +تحياتي، - تحياتي, - Best regards, - {dealer.get_local_name} - {dealer.phone_number} - هيكل | Haikal - """ +{dealer.get_local_name} +{dealer.phone_number} +Haikal | هيكل +----- +Dear {estimate.customer.customer_name}, + +I hope this email finds you well. + +Following up on our conversation, I'm excited to share the quotation for your review. Please find the detailed pricing and information by clicking on the link below. + +We've done our best to provide you with a fair and competitive offer. If you have any questions or would like to discuss it further, please don't hesitate to reach out. + +Quotation Link: +{link} + +We look forward to hearing from you and hopefully moving forward with your project! + +Best regards, + +{dealer.get_local_name} +{dealer.phone_number} +Haikal +""" # subject = _("Quotation") send_email( @@ -10687,13 +10717,69 @@ def purchase_report_csv_export(request,dealer_slug): ]) 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) + + @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_view(request, dealer_slug): + dealer = get_object_or_404(models.Dealer, slug=dealer_slug) + cars_sold = models.Car.objects.filter(dealer=dealer, status='sold') + + # Get filter parameters from the request + selected_make = request.GET.get('make') + selected_model = request.GET.get('model') + selected_serie = request.GET.get('serie') + selected_year = request.GET.get('year') + + # Apply filters to the queryset + if selected_make: + cars_sold = cars_sold.filter(id_car_make__name=selected_make) + if selected_model: + cars_sold = cars_sold.filter(id_car_model__name=selected_model) + if selected_serie: + cars_sold = cars_sold.filter(id_car_serie__name=selected_serie) + if selected_year: + cars_sold = cars_sold.filter(year=selected_year) + + # Get distinct values for filter dropdowns + makes = models.Car.objects.filter(dealer=dealer, status='sold').values_list('id_car_make__name', flat=True).distinct() + models_qs = models.Car.objects.filter(dealer=dealer, status='sold').values_list('id_car_model__name', flat=True).distinct() + series = models.Car.objects.filter(dealer=dealer, status='sold').values_list('id_car_serie__name', flat=True).distinct() + years = models.Car.objects.filter(dealer=dealer, status='sold').values_list('year', flat=True).distinct().order_by('-year') + + # # Calculate summary data for the filtered results + + total_revenue = cars_sold.aggregate(total_revenue=Sum('finances__marked_price'))['total_revenue'] or 0 + # total_vat = cars_sold.aggregate(total_vat=Sum('finances__vat_amount'))['total_vat'] or 0 + total_discount = cars_sold.aggregate(total_discount=Sum('finances__discount_amount'))['total_discount'] or 0 + + current_time = timezone.now().strftime("%Y-%m-%d %H:%M:%S") + + context = { + 'cars_sold': cars_sold, + 'current_time': current_time, + 'dealer': dealer, + 'total_revenue': total_revenue, + # 'total_vat': total_vat, + 'total_discount': total_discount, + 'makes': makes, + 'models': models_qs, + 'series': series, + 'years': years, + 'selected_make': selected_make, + 'selected_model': selected_model, + 'selected_serie': selected_serie, + 'selected_year': selected_year, + } + + return render(request, 'ledger/reports/car_sale_report.html', context) + def car_sale_report_csv_export(request,dealer_slug): @@ -10737,10 +10823,10 @@ def car_sale_report_csv_export(request,dealer_slug): car.year, car.id_car_serie.name, car.id_car_trim.name, - car.mileage, + car.mileage if car.mileage else '0', 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.sold_date.strftime("%Y-%m-%d %H:%M:%S") if car.sold_date else '', car.finances.cost_price, car.finances.marked_price, car.finances.discount_amount, diff --git a/templates/admin_management/management.html b/templates/admin_management/management.html index d79103e3..efd75f84 100644 --- a/templates/admin_management/management.html +++ b/templates/admin_management/management.html @@ -3,6 +3,7 @@ {% block title %} {% trans 'Admin Management' %} {% endblock %} {% block content %} +

{% trans "Admin Management" %}
  • diff --git a/templates/base.html b/templates/base.html index 5c3cf542..3e1e03c5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -84,7 +84,7 @@ {% include "plans/expiration_messages.html" %} {% block period_navigation %} {% endblock period_navigation %} -
    +
    diff --git a/templates/crm/notifications_history.html b/templates/crm/notifications_history.html index 764226ae..98649969 100644 --- a/templates/crm/notifications_history.html +++ b/templates/crm/notifications_history.html @@ -30,19 +30,11 @@ {% endfor %}
    -
    + {% if page_obj.paginator.num_pages > 1 %} +
    +
    {% include 'partials/pagination.html' %}
    +
    + {% endif %} {% else %}

    No notifications found.

    {% endif %} diff --git a/templates/crm/opportunities/opportunity_list.html b/templates/crm/opportunities/opportunity_list.html index c1f17a56..65c45ab2 100644 --- a/templates/crm/opportunities/opportunity_list.html +++ b/templates/crm/opportunities/opportunity_list.html @@ -5,13 +5,28 @@ {{ _("Opportunities") }} {% endblock title %} {% block content %} + {% if opportunities or request.GET.q%}
    -
    -

    - {{ _("Opportunities") }} -
  • -

    +
    +
    +
    +

    + {{ _("Opportunities") }} +
  • +

    +
    +
    +
    + {% if perms.inventory.add_opportunity %} + + {% endif %} +
    @@ -19,29 +34,38 @@
    -