diff --git a/inventory/utils.py b/inventory/utils.py index 4c8caf36..4cd9aa08 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -1329,7 +1329,9 @@ 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_amount=additional_services.get("total") total_services_vat = sum([x[1] for x in additional_services.get("services")]) + total_services_amount_=additional_services.get("total_") total_vat = vat_amount + total_services_vat return { "car": car, @@ -1340,9 +1342,16 @@ def get_finance_data(estimate, dealer): "discount_amount": discount, "additional_services": additional_services, "final_price": discounted_price + vat_amount, + + + "total_services_vat": total_services_vat, + "total_services_amount":total_services_amount, + "total_services_amount_":total_services_amount_, + "total_vat": total_vat, "grand_total": discounted_price + total_vat + additional_services.get("total"), + } # totals = self.calculate_totals() diff --git a/inventory/views.py b/inventory/views.py index aecbc742..99532ed3 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -4656,7 +4656,7 @@ def sales_list_view(request, dealer_slug): search_query = request.GET.get('q', None) if search_query: qs = qs.filter( - Q(order_number__icontains=search_query)| + Q(customer__phone_number__icontains=search_query)| Q(customer__customer_name__icontains=search_query) ).distinct() @@ -5092,6 +5092,7 @@ class EstimateDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView def get_context_data(self, **kwargs): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) estimate = kwargs.get("object") + if estimate.get_itemtxs_data(): # calculator = CarFinanceCalculator(estimate) # finance_data = calculator.get_finance_data() @@ -5099,6 +5100,8 @@ class EstimateDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView invoice_obj = InvoiceModel.objects.all().filter(ce_model=estimate).first() kwargs["data"] = finance_data + kwargs["customer_obj"]=estimate.customer.customer_set.first() + kwargs['dealer_info']=dealer kwargs["invoice"] = invoice_obj try: @@ -5119,8 +5122,9 @@ class EstimatePrintView(EstimateDetailView): It reuses the data-fetching logic from EstimateDetailView but uses a dedicated, stripped-down print template. """ - template_name = "sales/estimates/estimate_preview.html" + + def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -5128,17 +5132,20 @@ class EstimatePrintView(EstimateDetailView): # lang = request.GET.get('lang', 'ar') - - - template_path = "sales/estimates/estimate_preview.html" - - + + + if request.GET.get('lang')=='en': + template_path = "sales/estimates/estimate_preview_en.html" + else: + template_path = "sales/estimates/estimate_preview_ar.html" + + html_string = render_to_string(template_path, context) - - - pdf_file = HTML(string=html_string).write_pdf() - - + + base_url = request.build_absolute_uri('/') + pdf_file = HTML(string=html_string, base_url=base_url).write_pdf() + + response = HttpResponse(pdf_file, content_type='application/pdf') response['Content-Disposition'] = f'attachment; filename="estimate_{self.object.estimate_number}.pdf"' @@ -5522,7 +5529,7 @@ class InvoiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) entity = dealer.entity staff = getattr(self.request.user, "staff", None) - qs = [] + qs=None try: if any( [ @@ -5871,7 +5878,6 @@ class InvoicePreviewView(LoginRequiredMixin, PermissionRequiredMixin, DetailView model = InvoiceModel context_object_name = "invoice" - template_name = "sales/invoices/invoice_preview.html" permission_required = ["django_ledger.view_invoicemodel"] def get_context_data(self, **kwargs): @@ -5881,8 +5887,37 @@ class InvoicePreviewView(LoginRequiredMixin, PermissionRequiredMixin, DetailView # calculator = CarFinanceCalculator(invoice) finance_data = get_finance_data(invoice,dealer) kwargs["data"] = finance_data - kwargs["dealer"] = dealer + kwargs["dealer_info"] = dealer + kwargs["customer_obj"]=invoice.customer.customer_set.first() return super().get_context_data(**kwargs) + def get(self, request, *args, **kwargs): + + self.object = self.get_object() + context = self.get_context_data(object=self.object) + + + # lang = request.GET.get('lang', 'ar') + + + if request.GET.get('lang')=='en': + template_path = "sales/invoices/invoice_preview_en.html" + elif request.GET.get('lang')=='ar': + template_path = "sales/invoices/invoice_preview_ar.html" + else: + # just for preview not for download + return render(request,'sales/invoices/invoice_preview.html',context) + + + html_string = render_to_string(template_path, context) + + base_url = request.build_absolute_uri('/') + pdf_file = HTML(string=html_string, base_url=base_url).write_pdf() + + + response = HttpResponse(pdf_file, content_type='application/pdf') + response['Content-Disposition'] = f'attachment; filename="invoice_{self.object.invoice_number}.pdf"' + + return response # payments @@ -6221,10 +6256,10 @@ class LeadListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): | Q(last_name__icontains=query) | Q(id_car_make__name__icontains=query) | Q(id_car_model__name__icontains=query) - | Q(email__icontains=query) | Q(phone_number__icontains=query) | Q(next_action__icontains=query) - | Q(staff__name__icontains=query) + | Q(staff__first_name__icontains=query) + | Q(staff__last_name__icontains=query) ) if self.request.is_dealer: # or self.request.is_manager: @@ -11020,6 +11055,9 @@ class PurchaseOrderDetailView(LoginRequiredMixin, PermissionRequiredMixin, Detai for i in po_items_qs.values("po_total_amount", "po_item_status") if i["po_item_status"] != "cancelled" ) + items = [{"total": x.total_amount, "q": x.quantity} for x in po_model.get_itemtxs_data()[0].all()] + po_quantity = sum(item["q"] for item in items) + context['po_quantity']=po_quantity return context def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -11048,12 +11086,11 @@ class PurchaseOrderDetailView(LoginRequiredMixin, PermissionRequiredMixin, Detai "purchase_orders/po_detail_ar_pdf.html", context ) - - - - # Use WeasyPrint to generate the PDF - pdf = HTML(string=html_string).write_pdf() - + + + base_url = request.build_absolute_uri('/') + pdf = HTML(string=html_string, base_url=base_url).write_pdf() + response = HttpResponse(pdf, content_type="application/pdf") response["Content-Disposition"] = f'attachment; filename="PO_{self.object.po_number}.pdf"' return response diff --git a/templates/groups/group_detail.html b/templates/groups/group_detail.html index b70abb6b..d4f269c8 100644 --- a/templates/groups/group_detail.html +++ b/templates/groups/group_detail.html @@ -35,7 +35,8 @@
رقم أمر الشراء: {{ po_model.po_number }}
-تاريخ الإصدار: {{ po_model.date_fulfilled|date:"Y/m/d" }}
+رقم أمر الشراء : {{ po_model.po_number }}
+تاريخ الإصدار : {{ po_model.date_fulfilled|date:"Y/m/d" }}
المورد: {{ vendor.vendor_name }}
-البريد الإلكتروني: {{ vendor.email }}
-الهاتف: {{ vendor.phone }}
-العنوان: {{ vendor.address_1 }}
+المورد : {{ vendor.vendor_name }}
+البريد الإلكتروني : {{ vendor.email }}
+الهاتف : {{ vendor.phone }}
+العنوان : {{ vendor.address_1 }}
المبلغ الإجمالي: {{ po_total_amount|floatformat:'2g' }}
+المبلغ الإجمالي : {{ po_total_amount|currency_format }}
+Vendor: {{vendor.vendor_name}}
-Email: {{vendor.email}}
-Phone: {{vendor.phone}}
-Address: {{vendor.address_1}}
+Vendor : {{vendor.vendor_name}}
+Email : {{vendor.email}}
+Phone : {{vendor.phone}}
+Address : {{vendor.address_1}}
PO Number: {{ po_model.po_number }}
-Issue Date: {{ po_model.date_fulfilled|date:"F j, Y" }}
+PO Number : {{ po_model.po_number }}
+Issue Date : {{ po_model.date_fulfilled|date:"F j, Y" }}
Total Amount: {{ po_total_amount|floatformat:'2g' }}
+Total Amount : {{ po_total_amount|currency_format }}