You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			182 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			182 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
| 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
 | |
|     )
 | |
| 
 | |
| 
 | |
|     # Associate PDF file path with the Invoice object
 | |
|     pdf_content = ContentFile(pdf)
 | |
|     filename = f'invoice_{invoice.invoice_number}.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
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |