mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +01:00 
			
		
		
		
	Render billings
This commit is contained in:
		| @@ -9,6 +9,11 @@ RUN apt update && \ | ||||
|     apt install -y gettext nginx uwsgi uwsgi-plugin-python3 && \ | ||||
|     rm -rf /var/lib/apt/lists/* | ||||
|  | ||||
| # Install LaTeX requirements | ||||
| RUN apt update && \ | ||||
|     apt install -y texlive-latex-extra textlive-fonts-extra && \ | ||||
|     rm -rf /var/lib/apt/lists/* | ||||
|  | ||||
| COPY . /code/ | ||||
|  | ||||
| # Comment what is not needed | ||||
|   | ||||
| @@ -1,10 +1,18 @@ | ||||
| # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| import os | ||||
| import shutil | ||||
| import subprocess | ||||
| from tempfile import mkdtemp | ||||
|  | ||||
| from django.contrib.auth.mixins import LoginRequiredMixin | ||||
| from django.http import HttpResponse | ||||
| from django.template.loader import render_to_string | ||||
| from django.views.generic import CreateView, UpdateView | ||||
| from django.views.generic.base import View | ||||
| from django_tables2 import SingleTableView | ||||
| from note_kfet.settings.base import BASE_DIR | ||||
|  | ||||
| from .models import Billing | ||||
| from .tables import BillingTable | ||||
| @@ -36,7 +44,48 @@ class BillingUpdateView(LoginRequiredMixin, UpdateView): | ||||
|     # form_class = BillingForm | ||||
|  | ||||
|  | ||||
| class BillingRenderView(View): | ||||
| class BillingRenderView(LoginRequiredMixin, View): | ||||
|     """ | ||||
|     Render Billing | ||||
|     Render Billing as generated PDF | ||||
|     """ | ||||
|  | ||||
|     def get(self, request, **kwargs): | ||||
|         pk = kwargs["pk"] | ||||
|         billing = Billing.objects.get(pk=pk) | ||||
|  | ||||
|         billing.description = billing.description.replace("\n", "\\newline\n") | ||||
|         billing.address = billing.address.replace("\n", "\\newline\n") | ||||
|         tex = render_to_string("treasury/billing_sample.tex", dict(obj=billing)) | ||||
|         try: | ||||
|             os.mkdir(BASE_DIR + "/tmp") | ||||
|         except FileExistsError: | ||||
|             pass | ||||
|         tmp_dir = mkdtemp(prefix=BASE_DIR + "/tmp/") | ||||
|  | ||||
|         with open("{}/billing-{:d}.tex".format(tmp_dir, pk), "wb") as f: | ||||
|             f.write(tex.encode("UTF-8")) | ||||
|         del tex | ||||
|  | ||||
|         error = subprocess.Popen( | ||||
|             ["pdflatex", "billing-{}.tex".format(pk)], | ||||
|             cwd=tmp_dir, | ||||
|             stdin=open(os.devnull, "r"), | ||||
|             stderr=open(os.devnull, "wb"), | ||||
|             stdout=open(os.devnull, "wb") | ||||
|         ).wait() | ||||
|  | ||||
|         error = subprocess.Popen( | ||||
|             ["pdflatex", "billing-{}.tex".format(pk)], | ||||
|             cwd=tmp_dir, | ||||
|             stdin=open(os.devnull, "r"), | ||||
|             stderr=open(os.devnull, "wb"), | ||||
|             stdout=open(os.devnull, "wb") | ||||
|         ).wait() | ||||
|  | ||||
|         pdf = open("{}/billing-{}.pdf".format(tmp_dir, pk), 'rb').read() | ||||
|         shutil.rmtree(tmp_dir) | ||||
|  | ||||
|         response = HttpResponse(pdf, content_type="application/pdf") | ||||
|         response['Content-Disposition'] = "inline;filename=billing-{:d}.pdf".format(pk) | ||||
|  | ||||
|         return response | ||||
|   | ||||
							
								
								
									
										186
									
								
								templates/treasury/billing_sample.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								templates/treasury/billing_sample.tex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| \nonstopmode | ||||
| \documentclass[11pt]{article} | ||||
|  | ||||
| \usepackage[french]{babel} | ||||
| \usepackage[T1]{fontenc} | ||||
| \usepackage[utf8]{inputenc} | ||||
| \usepackage[a4paper]{geometry} | ||||
| \usepackage{units} | ||||
| \usepackage{bera} | ||||
| \usepackage{graphicx} | ||||
| \usepackage{fancyhdr} | ||||
| \usepackage{fp} | ||||
| \usepackage{transparent} | ||||
| \usepackage{eso-pic} | ||||
|  | ||||
| \def\TVA{0}    % Taux de la TVA | ||||
|  | ||||
| \def\TotalHT{0} | ||||
| \def\TotalTVA{0} | ||||
|  | ||||
| \newcommand{\AjouterProduit}[4]{%    Arguments : Désignation, quantité, prix unitaire HT, prix total HT | ||||
|     \FPround{\prix}{#3}{2} | ||||
|     \FPround{\montant}{#4}{2} | ||||
|     \FPadd{\TotalHT}{\TotalHT}{\montant} | ||||
|  | ||||
|     \eaddto\ListeProduits{#1    &    \prix    &    #2    &    \montant    \cr} | ||||
| } | ||||
|  | ||||
| \newcommand{\AfficheResultat}{% | ||||
|     \ListeProduits | ||||
|  | ||||
|     \FPeval{\TotalTVA}{\TotalHT * \TVA / 100} | ||||
|     \FPadd{\TotalTTC}{\TotalHT}{\TotalTVA} | ||||
|     \FPround{\TotalHT}{\TotalHT}{2} | ||||
|     \FPround{\TotalTVA}{\TotalTVA}{2} | ||||
|     \FPround{\TotalTTC}{\TotalTTC}{2} | ||||
|     \global\let\TotalHT\TotalHT | ||||
|     \global\let\TotalTVA\TotalTVA | ||||
|     \global\let\TotalTTC\TotalTTC | ||||
|  | ||||
|     \cr \hline | ||||
|     Total HT            & & &    \TotalHT    \cr | ||||
|     TVA \TVA~\%         & & &    \TotalTVA    \cr | ||||
|     \hline \hline | ||||
|     \textbf{Total TTC}    & & &    \TotalTTC | ||||
| } | ||||
|  | ||||
| \newcommand*\eaddto[2]{% version développée de \addto | ||||
|    \edef\tmp{#2}% | ||||
|    \expandafter\addto | ||||
|    \expandafter#1% | ||||
|    \expandafter{\tmp}% | ||||
| } | ||||
|  | ||||
| \newcommand	{\ListeProduits}{} | ||||
|  | ||||
| % Logo du BDE | ||||
| \AddToShipoutPicture*{ | ||||
|     \put(0,0){ | ||||
|         \parbox[b][\paperheight]{\paperwidth}{% | ||||
|             \vfill | ||||
|             \centering | ||||
|             {\transparent{0.1}\includegraphics[width=\textwidth]{../../static/img/{{ obj.bde }}}}% | ||||
|             \vfill | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| %%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%% | ||||
| % Infos Association | ||||
| \def\MonNom{{"{"}}{{ obj.my_name }}} % Nom de l'association | ||||
| \def\MonAdresseRue{{"{"}}{{ obj.my_address_street }}} % Adresse de l'association | ||||
| \def\MonAdresseVille{{"{"}}{{ obj.my_city }}} | ||||
|  | ||||
| % Informations bancaires de l'association | ||||
| \def\CodeBanque{{"{"}}{{ obj.bank_code|stringformat:".05d" }}} | ||||
| \def\CodeGuichet{{"{"}}{{ obj.desk_code|stringformat:".05d" }}} | ||||
| \def\NCompte{{"{"}}{{ obj.account_number|stringformat:".011d" }}} | ||||
| \def\CleRib{{"{"}}{{ obj.rib_key|stringformat:".02d" }}} | ||||
| \def\IBAN{FR76\CodeBanque\CodeGuichet\NCompte\CleRib} | ||||
| \def\CodeBic{{"{"}}{{ obj.bic }}} | ||||
|  | ||||
| \def\FactureNum            {{"{"}}{{obj.id}}}    % Numéro de facture | ||||
| \def\FactureAcquittee    {% if obj.acquitted %} {oui} {% else %} {non} {% endif %}     % Facture acquittée : oui/non | ||||
| \def\FactureLieu    {{"{"}}{{ obj.place }}}    % Lieu de l'édition de la facture | ||||
| \def\FactureDate    {{"{"}}{{ obj.date }}}    % Date de l'édition de la facture | ||||
| \def\FactureObjet   {{"{"}}{{ obj.subject|safe }} }    % Objet du document | ||||
| % Description de la facture | ||||
| \def\FactureDescr   {{"{"}}{{ obj.description|safe }}} | ||||
|  | ||||
| % Infos Client | ||||
| \def\ClientNom{{"{"}}{{obj.name|safe}}}    % Nom du client | ||||
| \def\ClientAdresse{{"{"}}{{ obj.address|safe }}} % Adresse du client | ||||
|  | ||||
| % Liste des produits facturés : Désignation, quantité, prix unitaire HT | ||||
|  | ||||
| {% for product in obj.products %} | ||||
| \AjouterProduit{ {{product.designation|safe}} } { {{product.quantity|safe}} } { {{product.amount|safe}}} { {{product.total|safe}}} | ||||
| {% endfor %} | ||||
|  | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
|  | ||||
|  | ||||
| \geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em} | ||||
| \setlength{\parindent}{1pt} | ||||
| \setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} | ||||
|  | ||||
| \thispagestyle{fancy} | ||||
| \pagestyle{fancy} | ||||
| \setlength{\parindent}{0pt} | ||||
|  | ||||
| \renewcommand{\headrulewidth}{0pt} | ||||
| \cfoot{ | ||||
|     \small{\MonNom  ~--~ \MonAdresseRue \MonAdresseVille ~--~ Telephone : +33(0)6 89 88 56 50\newline | ||||
|      Site web : bde.ens-cachan.fr ~--~ E-mail : tresorerie.bde@lists.crans.org \newline Numéro SIRET : 399 485 838 00011 | ||||
|     } | ||||
| } | ||||
|  | ||||
| \begin{document} | ||||
|  | ||||
| % Logo de la société | ||||
| % \includegraphics{logo.jpg} | ||||
|  | ||||
| % Nom et adresse de la société | ||||
| \MonNom \\ | ||||
| \MonAdresseRue \\ | ||||
| \MonAdresseVille | ||||
|  | ||||
| Facture n°\FactureNum | ||||
|  | ||||
|  | ||||
| {\addtolength{\leftskip}{10.5cm} %in ERT | ||||
|    \ClientNom    \\ | ||||
|     \ClientAdresse        \\ | ||||
|  | ||||
| } %in ERT | ||||
|  | ||||
|  | ||||
| \hspace*{10.5cm} | ||||
| \FactureLieu, le \FactureDate | ||||
|  | ||||
| ~\\~\\ | ||||
|  | ||||
| \textbf{Objet : \FactureObjet \\} | ||||
|  | ||||
| \textnormal{\FactureDescr} | ||||
|  | ||||
| ~\\ | ||||
|  | ||||
| \begin{center} | ||||
|     \begin{tabular}{lrrr} | ||||
|         \textbf{Désignation ~~~~~~}    & \textbf{Prix unitaire}    & \textbf{Quantité}    & \textbf{Montant (EUR)}    \\ | ||||
|         \hline | ||||
|         \AfficheResultat{} | ||||
|     \end{tabular} | ||||
| \end{center} | ||||
|  | ||||
| ~\\ | ||||
|  | ||||
| \ifthenelse{\equal{\FactureAcquittee}{oui}}{ | ||||
|     Facture acquittée. | ||||
| }{ | ||||
|  | ||||
|     À régler par chèque ou par virement bancaire : | ||||
|  | ||||
|     \begin{center} | ||||
|         \begin{tabular}{|c c c c|} | ||||
|             \hline | ||||
|             \textbf{Code banque} & \textbf{Code guichet} & \textbf{N° de Compte} & \textbf{Clé RIB}\\ | ||||
|                     \CodeBanque          & \CodeGuichet        & \NCompte               & \CleRib   \\ | ||||
|             \hline | ||||
|             \textbf{IBAN N°}        & \multicolumn{3}{|l|} \IBAN         \\ | ||||
|             \hline | ||||
|             \textbf{Code BIC}        & \multicolumn{3}{|l|}\CodeBic         \\ | ||||
|             \hline | ||||
|         \end{tabular} | ||||
|     \end{center} | ||||
|  | ||||
| } | ||||
|  | ||||
| \begin{center} | ||||
| TVA non applicable, article 293 B du CGI. | ||||
| \end{center} | ||||
|  | ||||
| \end{document} | ||||
		Reference in New Issue
	
	Block a user