Commit 0527206e authored by klafyvel's avatar klafyvel

Merge branch 'fix_141_send_invoice' into 'dev'

Fix 141 send invoice

See merge request federez/re2o!198
parents a02db154 4ab0dad1
=== English version below ===
Bonjour {{name}},
Nous vous remercions pour votre achat auprès de {{asso_name}} et nous vous en joignons la facture.
En cas de question, n’hésitez pas à nous contacter par mail à {{contact_mail}}.
L’équipe de {{asso_name}}
=== English version ===
Dear {{name}},
Thank you for your purchase. Here is your invoice.
Should you need extra information, you can email us at {{contact_mail}}.
Best regards,
{{ asso_name }}'s team
......@@ -61,18 +61,24 @@ def render_invoice(_request, ctx={}):
return r
def render_tex(_request, template, ctx={}):
Creates a PDF from a LaTex templates using pdflatex.
Writes it in a temporary directory and send back an HTTP response for
accessing this file.
def create_pdf(template, ctx={}):
"""Creates and returns a PDF from a LaTeX template using pdflatex.
It create a temporary file for the PDF then read it to return its content.
template: Path to the LaTeX template.
ctx: Dict with the context for rendering the template.
The content of the temporary PDF file generated.
context = Context(ctx)
template = get_template(template)
rendered_tpl = template.render(context).encode('utf-8')
with tempfile.TemporaryDirectory() as tempdir:
for i in range(2):
for _ in range(2):
process = Popen(
['pdflatex', '-output-directory', tempdir],
......@@ -81,6 +87,25 @@ def render_tex(_request, template, ctx={}):
with open(os.path.join(tempdir, 'texput.pdf'), 'rb') as f:
pdf =
return pdf
def render_tex(_request, template, ctx={}):
"""Creates a PDF from a LaTex templates using pdflatex.
Calls `create_pdf` and send back an HTTP response for
accessing this file.
_request: Unused, but allow using this function as a Django view.
template: Path to the LaTeX template.
ctx: Dict with the context for rendering the template.
An HttpResponse with type `application/pdf` containing the PDF file.
pdf = create_pdf(template, ctx={})
r = HttpResponse(content_type='application/pdf')
return r
......@@ -19,6 +19,16 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import os
from django.template.loader import get_template
from django.core.mail import EmailMessage
from .tex import create_pdf
from preferences.models import AssoOption, GeneralOption
from re2o.settings import LOGO_PATH
from re2o import settings
def find_payment_method(payment):
"""Finds the payment method associated to the payment if it exists."""
......@@ -30,3 +40,56 @@ def find_payment_method(payment):
except method.PaymentMethod.DoesNotExist:
return None
def send_mail_invoice(invoice):
"""Creates the pdf of the invoice and sends it by email to the client"""
purchases_info = []
for purchase in invoice.vente_set.all():
'price': purchase.prix,
'quantity': purchase.number,
'total_price': purchase.prix_total
ctx = {
'paid': True,
'recipient_name': "{} {}".format(,
'article': purchases_info,
'total': invoice.prix_total(),
'asso_name': AssoOption.get_cached_value('name'),
'line1': AssoOption.get_cached_value('adresse1'),
'line2': AssoOption.get_cached_value('adresse2'),
'siret': AssoOption.get_cached_value('siret'),
'email': AssoOption.get_cached_value('contact'),
'phone': AssoOption.get_cached_value('telephone'),
'tpl_path': os.path.join(settings.BASE_DIR, LOGO_PATH)
pdf = create_pdf('cotisations/factures.tex', ctx)
template = get_template('cotisations/email_invoice')
ctx = {
'name': "{} {}".format(,
'contact_mail': AssoOption.get_cached_value('contact'),
'asso_name': AssoOption.get_cached_value('name')
mail = EmailMessage(
'Votre facture / Your invoice',
attachments=[('invoice.pdf', pdf, 'application/pdf')]
......@@ -74,7 +74,7 @@ from .forms import (
from .tex import render_invoice
from .payment_methods.forms import payment_method_factory
from .utils import find_payment_method
from .utils import find_payment_method, send_mail_invoice
......@@ -147,6 +147,8 @@ def new_facture(request, user, userid):
p.facture = new_invoice_instance
return new_invoice_instance.paiement.end_payment(
......@@ -161,6 +163,7 @@ def new_facture(request, user, userid):
balance = user.solde
balance = None
return form(
'factureform': invoice_form,
......@@ -746,6 +749,9 @@ def credit_solde(request, user, **_kwargs):
return invoice.paiement.end_payment(invoice, request)
p = get_object_or_404(Paiement, is_balance=True)
return form({
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment