faktury
This commit is contained in:
parent
4198bfe9da
commit
1593c4d599
0
alkatorapi/forms.py
Normal file
0
alkatorapi/forms.py
Normal file
18
alkatorapi/migrations/0017_racer_register_date.py
Normal file
18
alkatorapi/migrations/0017_racer_register_date.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.2.12 on 2024-10-11 08:17
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('alkatorapi', '0016_profile_alter_user_alkator_class_racer'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='racer',
|
||||||
|
name='register_date',
|
||||||
|
field=models.DateTimeField(auto_now=True),
|
||||||
|
),
|
||||||
|
]
|
@ -63,6 +63,7 @@ class Racer(models.Model):
|
|||||||
team = models.CharField(max_length=120, null=True, blank=True)
|
team = models.CharField(max_length=120, null=True, blank=True)
|
||||||
phone = models.CharField(max_length=120, null=True, blank=True)
|
phone = models.CharField(max_length=120, null=True, blank=True)
|
||||||
date_of_birth = models.DateField(null=True, blank=True)
|
date_of_birth = models.DateField(null=True, blank=True)
|
||||||
|
register_date = models.DateTimeField(auto_now=True)
|
||||||
duration = models.DurationField(null=True, blank=True)
|
duration = models.DurationField(null=True, blank=True)
|
||||||
starting_number = models.IntegerField(null=True, blank=True)
|
starting_number = models.IntegerField(null=True, blank=True)
|
||||||
alkator_category = models.IntegerField(choices=ALKATOR_CHOICES, default=1)
|
alkator_category = models.IntegerField(choices=ALKATOR_CHOICES, default=1)
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="tg-7zrl" colspan="6"></td>
|
<td class="tg-7zrl" colspan="6"></td>
|
||||||
<td class="tg-7zrl">Číslo faktury</td>
|
<td class="tg-7zrl">Číslo faktury</td>
|
||||||
<td class="tg-8d8j" colspan="2">{{user.invoice_id}}</td>
|
<td class="tg-8d8j" colspan="2">{{racer.invoice_id}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Dodavatel</span></td>
|
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Dodavatel</span></td>
|
||||||
@ -51,7 +51,7 @@
|
|||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Jméno</span></td>
|
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Jméno</span></td>
|
||||||
<td class="tg-71pv" colspan="3" rowspan="2">{{user.first_name}} {{user.last_name}}</td>
|
<td class="tg-71pv" colspan="3" rowspan="2">{{user.profile.first_name}} {{user.profile.last_name}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
@ -67,7 +67,7 @@
|
|||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Adresa</span></td>
|
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Adresa</span></td>
|
||||||
<td class="tg-71pv">{{user.address}}</td>
|
<td class="tg-71pv">{{user.profile.address}}</td>
|
||||||
<td class="tg-kcps"></td>
|
<td class="tg-kcps"></td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -166,7 +166,7 @@
|
|||||||
<td class="tg-7zrl" colspan="2">131-2219860207/0100</td>
|
<td class="tg-7zrl" colspan="2">131-2219860207/0100</td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Datum vystavení</span></td>
|
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Datum vystavení</span></td>
|
||||||
<td class="tg-2b7s" colspan="2">{{user.register_date|date:"d/m/Y"}}</td>
|
<td class="tg-2b7s" colspan="2">{{racer.register_date|date:"d/m/Y"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Variabilní symbol</span></td>
|
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Variabilní symbol</span></td>
|
||||||
@ -217,9 +217,9 @@
|
|||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-2b7s">1</td>
|
<td class="tg-2b7s">1</td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-2b7s">{{user.price}},00 Kč</td>
|
<td class="tg-2b7s">{{racer.price}},00 Kč</td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-2b7s">{{user.price}},00 Kč</td>
|
<td class="tg-2b7s">{{racer.price}},00 Kč</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
@ -272,7 +272,7 @@
|
|||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Celkem</span></td>
|
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Celkem</span></td>
|
||||||
<td class="tg-kbc9" colspan="2"><span style="font-weight:bold;color:#FFF;background-color:#66B3ED">{{user.price}},00 Kč</span></td>
|
<td class="tg-kbc9" colspan="2"><span style="font-weight:bold;color:#FFF;background-color:#66B3ED">{{racer.price}},00 Kč</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tg-7zrl"></td>
|
<td class="tg-7zrl"></td>
|
||||||
|
@ -7,7 +7,7 @@ from django.contrib.admin.views.decorators import staff_member_required
|
|||||||
from django.contrib.auth.models import User as DjangoUser
|
from django.contrib.auth.models import User as DjangoUser
|
||||||
from django.contrib.auth import authenticate
|
from django.contrib.auth import authenticate
|
||||||
from django.contrib.auth import login as auth_login, logout as auth_logout
|
from django.contrib.auth import login as auth_login, logout as auth_logout
|
||||||
from django.core.mail import send_mail, mail_admins
|
from django.core.mail import send_mail, mail_admins, EmailMessage
|
||||||
from django.utils.datastructures import MultiValueDictKeyError
|
from django.utils.datastructures import MultiValueDictKeyError
|
||||||
from datetime import date, datetime, timedelta
|
from datetime import date, datetime, timedelta
|
||||||
from urllib.parse import parse_qs
|
from urllib.parse import parse_qs
|
||||||
@ -317,9 +317,9 @@ def payment_result(request):
|
|||||||
if paid == 'PAID':
|
if paid == 'PAID':
|
||||||
racer.paid = True
|
racer.paid = True
|
||||||
racer.save()
|
racer.save()
|
||||||
send_mail(
|
mail = EmailMessage(
|
||||||
f"úspěšná registrace do závodu Alkátor race Dolní Čermná ({racer.first_name} {racer.last_name})",
|
subject=f"úspěšná registrace do závodu Alkátor race Dolní Čermná ({racer.first_name} {racer.last_name})",
|
||||||
f"""Zdravím tě Alkátore,
|
body=f"""Zdravím tě Alkátore,
|
||||||
toto je potvrzovací email o účasti v nezapomenutelném závodě Alkátor-race.
|
toto je potvrzovací email o účasti v nezapomenutelném závodě Alkátor-race.
|
||||||
Prosíme kontrolujete si své hromadné schránky a spamy.
|
Prosíme kontrolujete si své hromadné schránky a spamy.
|
||||||
|
|
||||||
@ -338,9 +338,30 @@ ALKÁTOR TEAM
|
|||||||
email: info@alkator.cz
|
email: info@alkator.cz
|
||||||
tel: + 420 728 018 088
|
tel: + 420 728 018 088
|
||||||
web: https://alkator.cz""",
|
web: https://alkator.cz""",
|
||||||
"info@alkator.cz",
|
from_email="info@alkator.cz",
|
||||||
[racer.profile.user.email, racer.email] if racer.email else [racer.profile.user.email],
|
to=[racer.profile.user.email, racer.email] if racer.email else [racer.profile.user.email],
|
||||||
|
bcc=[],
|
||||||
|
cc=[]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
user = request.user
|
||||||
|
|
||||||
|
template = TemplateResponse(
|
||||||
|
None,
|
||||||
|
'invoice.html',
|
||||||
|
{
|
||||||
|
'user': user,
|
||||||
|
'racer': racer,
|
||||||
|
'paid_date': racer.register_date + timedelta(days=1),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
template.render()
|
||||||
|
pdf_name = f"invoices/{user.profile.last_name}_{user.profile.first_name}.pdf"
|
||||||
|
HTML(string=template.content).write_pdf(pdf_name)
|
||||||
|
|
||||||
|
attach = open(pdf_name, 'rb')
|
||||||
|
mail.attach('faktura.pdf', attach.read(), 'application/pdf')
|
||||||
|
mail.send()
|
||||||
elif paid == 'CANCELLED' and not user.paid:
|
elif paid == 'CANCELLED' and not user.paid:
|
||||||
racer.delete()
|
racer.delete()
|
||||||
return HttpResponse(status=200)
|
return HttpResponse(status=200)
|
||||||
|
0
invoices/.gitkeep
Normal file
0
invoices/.gitkeep
Normal file
26
send_mail.py
Normal file
26
send_mail.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
from alkatorapi.models import User
|
||||||
|
from django.core.mail import send_mail
|
||||||
|
|
||||||
|
for user in User.objects.all():
|
||||||
|
if user.starting_number and user.email:
|
||||||
|
send_mail(
|
||||||
|
"Díky ALKÁTORE!",
|
||||||
|
f"""Milý Alkátore,
|
||||||
|
|
||||||
|
kdo zvládne nejen běžet, ale i přemoci pár trestných panáků a piv na trati, zaslouží naše hluboké uznání! Bylo skvělé, že jsi se k nám přidal na tento nezapomenutelný závod. Jsi skutečný šampion – nejen na nohách, ale i při zdolávání těch tekutých výzev!
|
||||||
|
|
||||||
|
Pokud jsi během závodu pořídil nějaké fotky nebo videa, budeme rádi, když nám je nahraješ přes tento odkaz: https://alkator.cz/#upload_files. Rádi se podíváme na tvoje zážitky a možná je i nasdílíme!
|
||||||
|
|
||||||
|
Tak na zdraví a na trénink nezapomínej – další běh a panáky čekají!
|
||||||
|
|
||||||
|
S pozdravem,
|
||||||
|
Tým organizátorů
|
||||||
|
|
||||||
|
ALKÁTOR TEAM
|
||||||
|
email: info@alkator.cz
|
||||||
|
tel: + 420 728 018 088
|
||||||
|
web: https://alkator.cz""",
|
||||||
|
"info@alkator.cz",
|
||||||
|
[user.email],
|
||||||
|
)
|
||||||
|
print(f"sent to: {user.email}")
|
Loading…
x
Reference in New Issue
Block a user