diff --git a/osinaweb/billing/add/urls.py b/osinaweb/billing/add/urls.py index 97ff5827..304ba24f 100644 --- a/osinaweb/billing/add/urls.py +++ b/osinaweb/billing/add/urls.py @@ -6,7 +6,5 @@ urlpatterns = [ path('product', views.add_product, name='addproduct'), path('service', views.add_service, name='addservice'), path('order', views.add_order, name='addorder'), - - - + path('invoice//', views.add_invoice_pdf, name='addinvoice'), ] diff --git a/osinaweb/billing/add/views.py b/osinaweb/billing/add/views.py index ba9b8b33..d2350d71 100644 --- a/osinaweb/billing/add/views.py +++ b/osinaweb/billing/add/views.py @@ -5,7 +5,7 @@ from django.http import JsonResponse, HttpResponse from django.template.loader import get_template from django.conf import settings import os - +from weasyprint import HTML, CSS def add_product (request, *args, **kwargs): @@ -109,6 +109,72 @@ def add_order (request, *args, **kwargs): +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.filter(invoice_number__startswith=current_year).order_by('-invoice_number').first() + if last_invoice: + last_invoice_number = int(last_invoice.invoice_number.split('-')[1].split('+')[0]) + new_invoice_number = f"${current_year}-{last_invoice_number + 1}" + else: + new_invoice_number = f"${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 + ) + + + # Save PDF to a file + pdf_file_path = os.path.join(settings.MEDIA_ROOT, f'invoice_{invoice.id}.pdf') + with open(pdf_file_path, 'wb') as pdf_file: + pdf_file.write(pdf) + + # Associate PDF file path with the Invoice object + invoice.pdf = pdf_file_path + invoice.save() + + # Return PDF + response = HttpResponse(pdf, content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' + + return response + + + diff --git a/osinaweb/billing/templates/listing_pages/orders.html b/osinaweb/billing/templates/listing_pages/orders.html index 0d886564..5f26d295 100644 --- a/osinaweb/billing/templates/listing_pages/orders.html +++ b/osinaweb/billing/templates/listing_pages/orders.html @@ -86,7 +86,7 @@ {% if order.status == 'Pending' and not order.invoice %} - +