From 0385763e74a87ca08728fa5ee1653ede4a49f56d Mon Sep 17 00:00:00 2001 From: nataly Date: Mon, 20 May 2024 14:07:13 +0300 Subject: [PATCH] New changes. --- .../add/__pycache__/views.cpython-311.pyc | Bin 9026 -> 13274 bytes osinaweb/billing/add/urls.py | 3 +- osinaweb/billing/add/views.py | 110 ++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/osinaweb/billing/add/__pycache__/views.cpython-311.pyc b/osinaweb/billing/add/__pycache__/views.cpython-311.pyc index 733b30e4fd090bcdd8a340c417d3d898bc48bc90..77d4ef22a0be15563e2869a433c5b46e07b30281 100644 GIT binary patch delta 5319 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 diff --git a/osinaweb/billing/add/urls.py b/osinaweb/billing/add/urls.py index 5b2bd54d..860eb6fe 100644 --- a/osinaweb/billing/add/urls.py +++ b/osinaweb/billing/add/urls.py @@ -7,7 +7,8 @@ urlpatterns = [ path('service', views.add_service, name='addservice'), path('order//', views.add_order, name='addorder'), - + path('invoice-pdf//', views.add_invoice_pdf, name='addinvoice'), + path('payment-pdf//', views.add_payment_pdf, name='addpayment'), path('service///', views.add_service_in_order, name='addserviceinorder'), diff --git a/osinaweb/billing/add/views.py b/osinaweb/billing/add/views.py index e0882a59..c1b41a70 100644 --- a/osinaweb/billing/add/views.py +++ b/osinaweb/billing/add/views.py @@ -8,6 +8,7 @@ import os from osinacore.decorators import * from django.core.files.base import ContentFile from django.db.models import Q +from weasyprint import HTML, CSS @staff_login_required @@ -210,7 +211,116 @@ def add_payment_comment_modal(request): +def add_invoice_pdf(request, order_id): + order = get_object_or_404(Order, id=order_id) + + current_year = str(timezone.now().year)[-2:] + last_invoice = Invoice.objects.all().last() + if last_invoice: + last_invoice_number = int(last_invoice.invoice_number.split('-')[1].split('+')[0]) + new_invoice_number = f"$0{current_year}-{last_invoice_number + 1}" + else: + new_invoice_number = f"$0{current_year}-1425" + + + + invoice = Invoice.objects.create( + invoice_number = new_invoice_number, + order=order, + date_created=datetime.now(), + ) + + template = get_template('details_templates/invoice-details.html') + context = {'order': order} + html_string = template.render(context) + + # Define the CSS string with Poppins font + css_string = ''' + @font-face { + font-family: 'Poppins'; + src: url('path_to_poppins_font_file.ttf') format('truetype'); /* Update the path to the font file */ + } + + body { + font-family: 'Poppins', sans-serif; /* Use Poppins font for the entire document */ + } + + /* Your existing CSS styles */ + /* Add or modify styles as needed */ + ''' + + # Generate PDF + pdf = HTML(string=html_string).write_pdf( + stylesheets=[ + CSS(string=css_string), + CSS(string='@page { margin: 30px; }') + ], + presentational_hints=True + ) + + filename = f'invoice_{invoice.invoice_number}.pdf' + pdf_content = ContentFile(pdf) + invoice.pdf.save(filename, pdf_content, save=True) + + + # Return PDF + response = HttpResponse(pdf, content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' + return response + + + + + + + +def add_payment_pdf(request, order_id): + order = get_object_or_404(Order, id=order_id) + payments = OrderPayment.objects.filter(order = order) + paid_amount = OrderPayment.objects.filter(order=order, date_paid__isnull=False).aggregate(total_paid=Sum('amount'))['total_paid'] or 0 + cart_total = order.get_cart_total + remaining_amount = cart_total - paid_amount + + + invoice = order.invoice + + # Render both invoice and payment details templates to HTML + invoice_template = get_template('details_templates/invoice-details.html') + payment_template = get_template('details_templates/payment-details.html') + invoice_html = invoice_template.render({'order': order}) + payment_html = payment_template.render({'order': order, 'payments':payments, 'remaining_amount':remaining_amount,}) + + # Combine the HTML content of both templates + combined_html = f"{invoice_html}
{payment_html}" + + # Define CSS + css_string = ''' + @font-face { + font-family: 'Poppins'; + src: url('path_to_poppins_font_file.ttf') format('truetype'); /* Update the path to the font file */ + } + + body { + font-family: 'Poppins', sans-serif; /* Use Poppins font for the entire document */ + } + + /* Your existing CSS styles */ + /* Add or modify styles as needed */ + ''' + + # Generate PDF + pdf = HTML(string=combined_html).write_pdf( + stylesheets=[ + CSS(string=css_string), + CSS(string='@page { margin: 30px; }') + ], + presentational_hints=True + ) + # Return PDF + response = HttpResponse(pdf, content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' + return response