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