from django.shortcuts import render, get_object_or_404, redirect from osinacore.models import * from billing.models import * from django.http import JsonResponse, HttpResponse from django.template.loader import get_template from django.conf import settings import os from django.core.files.base import ContentFile from weasyprint import HTML, CSS def add_product(request, *args, **kwargs): item_types = ProjectType.objects.all().order_by('name') if request.method == 'POST': title = request.POST.get('title') description = request.POST.get('description') item_type_id = request.POST.get('item_type') item_type = get_object_or_404(ProjectType, id=item_type_id) amount = request.POST.get('amount') recurring = request.POST.get('recurring') Item.objects.create( type='Product', title=title, description = description, item_type = item_type, amount = amount, recurring = recurring, ) return redirect('items') context = { 'item_types' : item_types, } return render(request, 'add_templates/add-product.html', context) def add_service (request, *args, **kwargs): item_types = ProjectType.objects.all().order_by('name') customers = CustomerProfile.objects.all().order_by('user__first_name') if request.method == 'POST': title = request.POST.get('title') description = request.POST.get('description') customer_id = request.POST.get('customer') customer = get_object_or_404(CustomerProfile, id=customer_id) item_type_id = request.POST.get('item_type') item_type = get_object_or_404(ProjectType, id=item_type_id) amount = request.POST.get('amount') recurring = request.POST.get('recurring') Item.objects.create( type='Service', title=title, description = description, customer = customer, item_type = item_type, amount = amount, recurring = recurring, ) return redirect('items') context = { 'item_types' : item_types, 'customers' : customers } return render(request, 'add_templates/add-service.html', context) def add_order (request, customer_id): customer= get_object_or_404(CustomerProfile, id=customer_id) businesses = Business.objects.filter(customer=customer) if request.method == 'POST': customer_id = request.POST.get('customer') customer = get_object_or_404(CustomerProfile, id=customer_id) status = request.POST.get('status') customer_id = request.POST.get('customer') customer = get_object_or_404(CustomerProfile, id=customer_id) business_id = request.POST.get('business') if business_id: business = get_object_or_404(Business, id=business_id) else: business = None selected_items = request.POST.getlist('items') order = Order.objects.create( customer=customer, status=status, business=business, ) for item_id in selected_items: item = Item.objects.get(id=item_id) OrderItem.objects.create(order=order, item=item, purchased_at=datetime.now()) return redirect('orders') context = { 'customer' : customer, 'businesses' : businesses, } return render(request, 'add_templates/add-order.html', context) 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