8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-23 20:03:11 +00:00

Merge branch 'fix_141_send_invoice' into 'dev'

Fix 141 send invoice

See merge request federez/re2o!198
This commit is contained in:
klafyvel 2018-08-16 00:00:53 +02:00
commit 0527206eb4
4 changed files with 123 additions and 7 deletions

View file

@ -0,0 +1,22 @@
=== 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, nhésitez pas à nous contacter par mail à {{contact_mail}}.
Cordialement,
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

View file

@ -61,18 +61,24 @@ def render_invoice(_request, ctx={}):
return r return r
def render_tex(_request, template, ctx={}): def create_pdf(template, ctx={}):
""" """Creates and returns a PDF from a LaTeX template using pdflatex.
Creates a PDF from a LaTex templates using pdflatex.
Writes it in a temporary directory and send back an HTTP response for It create a temporary file for the PDF then read it to return its content.
accessing this file.
Args:
template: Path to the LaTeX template.
ctx: Dict with the context for rendering the template.
Returns:
The content of the temporary PDF file generated.
""" """
context = Context(ctx) context = Context(ctx)
template = get_template(template) template = get_template(template)
rendered_tpl = template.render(context).encode('utf-8') rendered_tpl = template.render(context).encode('utf-8')
with tempfile.TemporaryDirectory() as tempdir: with tempfile.TemporaryDirectory() as tempdir:
for i in range(2): for _ in range(2):
process = Popen( process = Popen(
['pdflatex', '-output-directory', tempdir], ['pdflatex', '-output-directory', tempdir],
stdin=PIPE, stdin=PIPE,
@ -81,6 +87,25 @@ def render_tex(_request, template, ctx={}):
process.communicate(rendered_tpl) process.communicate(rendered_tpl)
with open(os.path.join(tempdir, 'texput.pdf'), 'rb') as f: with open(os.path.join(tempdir, 'texput.pdf'), 'rb') as f:
pdf = f.read() pdf = f.read()
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.
Args:
_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.
Returns:
An HttpResponse with type `application/pdf` containing the PDF file.
"""
pdf = create_pdf(template, ctx={})
r = HttpResponse(content_type='application/pdf') r = HttpResponse(content_type='application/pdf')
r.write(pdf) r.write(pdf)
return r return r

View file

@ -19,6 +19,16 @@
# with this program; if not, write to the Free Software Foundation, Inc., # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # 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): def find_payment_method(payment):
"""Finds the payment method associated to the payment if it exists.""" """Finds the payment method associated to the payment if it exists."""
@ -30,3 +40,56 @@ def find_payment_method(payment):
except method.PaymentMethod.DoesNotExist: except method.PaymentMethod.DoesNotExist:
pass pass
return None 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():
purchases_info.append({
'name': purchase.name,
'price': purchase.prix,
'quantity': purchase.number,
'total_price': purchase.prix_total
})
ctx = {
'paid': True,
'fid': invoice.id,
'DATE': invoice.date,
'recipient_name': "{} {}".format(
invoice.user.name,
invoice.user.surname
),
'address': invoice.user.room,
'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(
invoice.user.name,
invoice.user.surname
),
'contact_mail': AssoOption.get_cached_value('contact'),
'asso_name': AssoOption.get_cached_value('name')
}
mail = EmailMessage(
'Votre facture / Your invoice',
template.render(ctx),
GeneralOption.get_cached_value('email_from'),
[invoice.user.email],
attachments=[('invoice.pdf', pdf, 'application/pdf')]
)
mail.send()

View file

@ -74,7 +74,7 @@ from .forms import (
) )
from .tex import render_invoice from .tex import render_invoice
from .payment_methods.forms import payment_method_factory from .payment_methods.forms import payment_method_factory
from .utils import find_payment_method from .utils import find_payment_method, send_mail_invoice
@login_required @login_required
@ -147,6 +147,8 @@ def new_facture(request, user, userid):
p.facture = new_invoice_instance p.facture = new_invoice_instance
p.save() p.save()
send_mail_invoice(new_invoice_instance)
return new_invoice_instance.paiement.end_payment( return new_invoice_instance.paiement.end_payment(
new_invoice_instance, new_invoice_instance,
request request
@ -161,6 +163,7 @@ def new_facture(request, user, userid):
balance = user.solde balance = user.solde
else: else:
balance = None balance = None
return form( return form(
{ {
'factureform': invoice_form, 'factureform': invoice_form,
@ -746,6 +749,9 @@ def credit_solde(request, user, **_kwargs):
prix=refill_form.cleaned_data['value'], prix=refill_form.cleaned_data['value'],
number=1 number=1
) )
send_mail_invoice(invoice)
return invoice.paiement.end_payment(invoice, request) return invoice.paiement.end_payment(invoice, request)
p = get_object_or_404(Paiement, is_balance=True) p = get_object_or_404(Paiement, is_balance=True)
return form({ return form({