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.
183 lines
5.2 KiB
Python
183 lines
5.2 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 osinacore.decorators import *
|
|
from django.core.files.base import ContentFile
|
|
from weasyprint import HTML, CSS
|
|
|
|
|
|
@staff_login_required
|
|
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)
|
|
|
|
|
|
@staff_login_required
|
|
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)
|
|
|
|
|
|
@staff_login_required
|
|
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':
|
|
status = request.POST.get('status')
|
|
business_id = request.POST.get('business')
|
|
if business_id:
|
|
business = get_object_or_404(Business, id=business_id)
|
|
else:
|
|
business = None
|
|
|
|
|
|
order = Order.objects.create(
|
|
customer=customer,
|
|
status=status,
|
|
business=business,
|
|
)
|
|
return redirect('orderdetails', order_id=order.id)
|
|
|
|
context = {
|
|
'customer' : customer,
|
|
'businesses' : businesses,
|
|
}
|
|
|
|
return render(request, 'add_templates/add-order.html', context)
|
|
|
|
|
|
|
|
@staff_login_required
|
|
def add_service_in_order(request, service_id, order_id):
|
|
service =get_object_or_404(Item, id=service_id)
|
|
order= get_object_or_404(Order, id=order_id)
|
|
|
|
order_item = OrderItem.objects.create(
|
|
order = order,
|
|
item = service,
|
|
purchased_at = datetime.now()
|
|
)
|
|
order_item.save()
|
|
return redirect('orderdetails', order_id=order.id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|