139 lines
4.6 KiB
Python
139 lines
4.6 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from django.template import RequestContext
|
|
from django.http import HttpResponse
|
|
|
|
from django.template.loader import render_to_string
|
|
|
|
from weasyprint import HTML, CSS
|
|
# from weasyprint.fonts import FontConfiguration
|
|
|
|
# from PIL import Image
|
|
import os
|
|
import pendulum
|
|
from django.conf import settings
|
|
|
|
from datetime import date
|
|
|
|
from comptabilite.facture_config import loadFactureConfig
|
|
|
|
from .models import (
|
|
Client,
|
|
Contract,
|
|
Prestation,
|
|
)
|
|
|
|
|
|
def contract_listing(request, client_id=None):
|
|
"""
|
|
Renvoie la liste de tous les contrats.
|
|
"""
|
|
|
|
if client_id:
|
|
client = get_object_or_404(Client, pk=client_id)
|
|
contract_list = client.contracts.all()
|
|
else:
|
|
client = None
|
|
contract_list = Contract.objects.all()
|
|
|
|
context = {"contract_list": contract_list, "client": client}
|
|
return render(request, "contract/listing.html", context)
|
|
|
|
|
|
def contract_detail(request, contract_id):
|
|
"""
|
|
Renvoie toutes les informations relatives à un contrat, en ce y compris les prestations
|
|
relatives à celui-ci.
|
|
"""
|
|
|
|
contract = Contract.objects.get(pk=contract_id)
|
|
total_without_discount_htva = contract.get_contract_sum("total_amount_htva")
|
|
total_without_discount_tvac = contract.get_contract_sum("total_amount_tvac")
|
|
|
|
total_with_discount_htva = total_without_discount_htva
|
|
total_with_discount_tvac = total_without_discount_tvac
|
|
for discount in contract.discounts.all():
|
|
total_with_discount_htva -= discount.amount_htva()
|
|
total_with_discount_tvac -= discount.amount_tvac()
|
|
|
|
context = {
|
|
"contract": contract,
|
|
"prestations_list": contract.get_prestation.all(),
|
|
"total_without_discount_htva": total_without_discount_htva,
|
|
"total_without_discount_tvac": total_without_discount_tvac,
|
|
"total_with_discount_htva": total_with_discount_htva,
|
|
"total_with_discount_tvac": total_with_discount_tvac,
|
|
}
|
|
return render(request, "contract/detail.html", context)
|
|
|
|
|
|
def client_listing(request):
|
|
"""
|
|
Renvoie la liste de tous les clients.
|
|
"""
|
|
client_list = Client.objects.all()
|
|
context = {"client_list": client_list}
|
|
return render(request, "client/listing.html", context)
|
|
|
|
|
|
def prestation_listing(request):
|
|
"""
|
|
Renvoie la liste de toutes les prestations.
|
|
"""
|
|
prestation_list = Prestation.objects.all()
|
|
context = {"prestation_list": prestation_list}
|
|
return render(request, "prestation/listing.html", context)
|
|
|
|
|
|
def contract_export(request, contract_id):
|
|
"""Génere un fichier PDF à fournir au client."""
|
|
contract = get_object_or_404(Contract, pk=contract_id)
|
|
|
|
if not contract.invoiced_date:
|
|
today = pendulum.now().date()
|
|
contract.invoiced_date = today
|
|
contract.save()
|
|
|
|
contract = Contract.objects.get(pk=contract_id)
|
|
total_without_discount_htva = contract.get_contract_sum("total_amount_htva")
|
|
total_without_discount_tvac = contract.get_contract_sum("total_amount_tvac")
|
|
|
|
total_with_discount_htva = total_without_discount_htva
|
|
total_with_discount_tvac = total_without_discount_tvac
|
|
for discount in contract.discounts.all():
|
|
total_with_discount_htva -= discount.amount_htva()
|
|
total_with_discount_tvac -= discount.amount_tvac()
|
|
|
|
context = {
|
|
"contract": contract,
|
|
"client": contract.client,
|
|
"date": contract.invoiced_date,
|
|
"prestations_list": contract.get_prestation.all(),
|
|
# "discounts_list": discounts_list,
|
|
# "discount_result": discount_result,
|
|
# "prestations_count": prestations_count,
|
|
"total_without_discount_htva": total_without_discount_htva,
|
|
"total_without_discount_tvac": total_without_discount_tvac,
|
|
"total_with_discount_htva": total_with_discount_htva,
|
|
"total_with_discount_tvac": total_with_discount_tvac,
|
|
}
|
|
|
|
# return render(request, "to_pdf/facture.html", context)
|
|
|
|
html = render_to_string("to_pdf/facture.html", context)
|
|
response = HttpResponse(content_type="application/pdf")
|
|
response[
|
|
"Content-Disposition"
|
|
] = f"attachment; filename=facture.pdf" # pylint: disable=line-too-long
|
|
|
|
# font_config = FontConfiguration()
|
|
HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(
|
|
response,
|
|
stylesheets=[
|
|
CSS(settings.STATICFILES_DIRS[0] + "/css/a4_paper.css"),
|
|
CSS(settings.STATICFILES_DIRS[0] + "/css/black-dashboard_report.css"),
|
|
CSS(settings.STATICFILES_DIRS[0] + "/css/to_pdf.css"),
|
|
],
|
|
) # , font_config=font_config)
|
|
|
|
return response
|