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.

181 lines
5.3 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 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, *args, **kwargs):
customers = CustomerProfile.objects.all().order_by('-id')
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 = {
'customers': customers,
}
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