mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-22 11:23:10 +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:
commit
0527206eb4
4 changed files with 123 additions and 7 deletions
22
cotisations/templates/cotisations/email_invoice
Normal file
22
cotisations/templates/cotisations/email_invoice
Normal 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, n’hé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
|
|
@ -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.
|
||||
|
||||
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)
|
||||
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],
|
||||
stdin=PIPE,
|
||||
|
@ -81,6 +87,25 @@ def render_tex(_request, template, ctx={}):
|
|||
process.communicate(rendered_tpl)
|
||||
with open(os.path.join(tempdir, 'texput.pdf'), 'rb') as f:
|
||||
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.write(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:
|
||||
pass
|
||||
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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
@login_required
|
||||
|
@ -147,6 +147,8 @@ def new_facture(request, user, userid):
|
|||
p.facture = new_invoice_instance
|
||||
p.save()
|
||||
|
||||
send_mail_invoice(new_invoice_instance)
|
||||
|
||||
return new_invoice_instance.paiement.end_payment(
|
||||
new_invoice_instance,
|
||||
request
|
||||
|
@ -161,6 +163,7 @@ def new_facture(request, user, userid):
|
|||
balance = user.solde
|
||||
else:
|
||||
balance = None
|
||||
|
||||
return form(
|
||||
{
|
||||
'factureform': invoice_form,
|
||||
|
@ -746,6 +749,9 @@ def credit_solde(request, user, **_kwargs):
|
|||
prix=refill_form.cleaned_data['value'],
|
||||
number=1
|
||||
)
|
||||
|
||||
send_mail_invoice(invoice)
|
||||
|
||||
return invoice.paiement.end_payment(invoice, request)
|
||||
p = get_object_or_404(Paiement, is_balance=True)
|
||||
return form({
|
||||
|
|
Loading…
Reference in a new issue