4 Commits

Author SHA1 Message Date
70784e8768 wip 2025-03-01 17:35:34 +01:00
c008ebd540 fix tickets getting cut in order pdf (#42)
Reviewed-on: #42
2025-02-28 22:39:45 +00:00
b98bc363d5 change some dates (#41)
Reviewed-on: #41
2025-02-28 13:59:41 +00:00
d242c9b006 feat(ticket): add email confirmation message to success page (#40)
Co-authored-by: Jan Klattenhoff <jan@kjan.email>
Reviewed-on: #40
2025-02-28 13:41:49 +00:00
6 changed files with 138 additions and 112 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
assets/styles/bg_new.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
public/bg_new.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

View File

@ -11,7 +11,6 @@ use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Part\DataPart;
use Twig\Environment;
class TicketEmailService
@ -33,14 +32,25 @@ class TicketEmailService
->to(new Address($payment->getCustomer()?->getEmail(), $payment->getCustomer()?->getFirstname() . ' ' . $payment->getCustomer()?->getLastname()))
->context([
'payment' => $payment,
])
->addPart(new DataPart($this->generateTicket($payment->getCustomer()?->getTickets()), 'tickets.pdf', 'application/pdf'));
]);
$acc = 0;
foreach ($this->generateTicket($payment->getCustomer()?->getTickets()) as $pdf) {
$mail->attach($pdf, 'tickets-'.++$acc.'.pdf', 'application/pdf');
}
$this->mailer->send($mail);
}
private function generateTicket(Collection $tickets): string
private function generateTicket(Collection $tickets): array
{
return (new DompdfWrapper(new DompdfFactory()))->getPdf($this->twig->render('email/pdf.html.twig', ['tickets' => $tickets]));
$ticketChunks = array_chunk($tickets->toArray(), 3);
$pdfs = [];
foreach ($ticketChunks as $ticket) {
$pdfs[] = (new DompdfWrapper(new DompdfFactory()))->getPdf($this->twig->render('email/pdf.html.twig', ['tickets' => $ticket]));
}
return $pdfs;
}
}

View File

@ -3,126 +3,136 @@
{% block title %}Home{% endblock %}
{% block body %}
<div class="min-h-screen relative overflow-hidden" style="background-image: url('{{ asset('images/backgrounds/abiball_bg.jpeg') }}'); background-size: cover; background-position: center; background-attachment: fixed;">
<div class="min-h-screen bg-black/30 backdrop-blur-[2px] relative overflow-hidden">
<header class="w-full bg-white/90 backdrop-blur-md shadow-lg fixed top-0 z-50 border-b border-gray-100">
<div class="container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-3 sm:py-4 flex justify-between items-center">
<a href="{{ path('app_home') }}" class="flex items-center space-x-4">
<img src="{{ asset('images/logos/new_logo.png') }}" alt="Waldorfschule Bremen Osterholz"
class="w-32 sm:w-36 md:w-40 h-auto hover:opacity-90 transition-opacity"/>
<img src="{{ asset('images/logos/second_logo.png') }}" alt="Secondary Logo"
class="w-32 sm:w-36 md:w-40 h-auto hover:opacity-90 transition-opacity sm:block hidden"/>
</a>
<a href="{{ path('app_contact') }}"
class="bg-gradient-to-r from-red-500 to-orange-500 hover:from-red-600 hover:to-orange-600 text-white px-4 sm:px-6 md:px-8 py-2 sm:py-2.5 rounded-full text-xs sm:text-sm font-medium shadow-md hover:shadow-lg transition-all duration-300">
Kontaktaufnahme
</a>
</div>
</header>
<div class="min-h-screen relative overflow-hidden bg-[url(bg_new.jpeg)] bg-container bg-no-repeat bg-center bg-fixed"
style="background-size: contain; background-repeat: no-repeat; background-position: center; background-attachment: fixed;"
>
<div class="min-h-screen bg-black/30 relative overflow-hidden">
<main class="container mx-auto max-w-7xl px-4 sm:px-6 pb-16 sm:pb-20 flex flex-col items-center justify-center relative z-10">
<h1 class="font-bold text-white text-center mb-6 sm:mb-8 tracking-tight leading-tight">
<span class=" md:text-[180px]">
Willkommen
</span>
<span class="md:text-6xl">
zum Abiball 2025
</span>
</h1>
<div class="w-full max-w-6xl">
{# <div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-6 sm:p-8 md:p-10 mb-6 sm:mb-8 transform transition-all duration-300 border border-gray-100"> #}
{# <h1 class="text-3xl">Willkommen zum Abiball 2025! 🎉🎓</h1> #}
{# <p class="text-base sm:text-lg text-gray-700 leading-relaxed whitespace-pre-line text-wrap"> #}
{# Nach einer unvergesslichen Schulzeit feiern wir gemeinsam unseren Abschluss. #}
{# Und ihr seid herzlich eingeladen! #}
{# Lasst uns gemeinsam diesen besonderen Abend genießen! 🥂✨ #}
<main class="container mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 pt-24 sm:pt-28 md:pt-32 pb-16 sm:pb-20 flex flex-col items-center justify-center relative z-10">
<h1 class="text-3xl sm:text-4xl md:text-5xl font-bold text-white text-center mb-6 sm:mb-8 tracking-tight leading-tight">
Willkommen zum <span class="bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">Abiball 2025</span>
</h1>
<div class="w-full max-w-6xl">
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-6 sm:p-8 md:p-10 mb-6 sm:mb-8 transform transition-all duration-300 border border-gray-100">
<h1 class="text-3xl">Willkommen zum Abiball 2025! 🎉🎓</h1>
<p class="text-base sm:text-lg text-gray-700 leading-relaxed whitespace-pre-line text-wrap">
Nach einer unvergesslichen Schulzeit feiern wir gemeinsam unseren Abschluss.
Und ihr seid herzlich eingeladen!
Lasst uns gemeinsam diesen besonderen Abend genießen! 🥂✨
{# Euer Abijahrgang 2025 🚀 #}
{# </p> #}
{# </div> #}
Euer Abijahrgang 2025 🚀
</p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-3 w-full gap-3 mb-5">
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">Datum & Uhrzeit</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:calendar" class="w-5 h-5 text-orange-600" />
<span class="text-gray-700">28. Juni 2025</span>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:clock" class="w-5 h-5 text-orange-600" />
<span class="text-gray-700">17:30 - 03:00</span>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:map-pin" class="w-5 h-5 text-orange-600" />
<span class="text-gray-700">Graubündener Str. 4, 28325 Bremen</span>
<div class="grid grid-cols-1 sm:grid-cols-3 w-full gap-3 mb-5">
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">
Datum & Uhrzeit</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:calendar" class="w-5 h-5 text-orange-600"/>
<span class="text-gray-700">28. Juni 2025</span>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:clock" class="w-5 h-5 text-orange-600"/>
<span class="text-gray-700">17:30 - 03:00</span>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:map-pin" class="w-5 h-5 text-orange-600"/>
<span class="text-gray-700">Graubündener Str. 4, 28325 Bremen</span>
</div>
</div>
</div>
</div>
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">Ablauf</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:ticket" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">17:30-19:30</span>
<span class="ml-2">Einlass & Platznehmen</span>
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">
Ablauf</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:ticket" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">17:30-19:30</span>
<span class="ml-2">Einlass & Platznehmen</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:cake" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">19:30-22:00</span>
<span class="ml-2">Dinner & Beisammensein</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">22:00-03:00</span>
<span class="ml-2">Feier & Tanz im Saal</span>
</div>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:cake" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">19:30-22:00</span>
<span class="ml-2">Dinner & Beisammensein</span>
</div>
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">
Ticket Preise</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:ticket" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">All-Inclusive Ticket</span>
<span class="ml-2">50€</span>
</div>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">ab 22:00</span>
<span class="ml-2">Feier & Tanz im Saal</span>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:cake" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">After-Show Ticket</span>
<span class="ml-2">20€</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">Kind (6-12 Jahre)</span>
<span class="ml-2">15€</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600"/>
<div class="text-gray-700">
<span class="font-medium">Kind (0-6 Jahre)</span>
<span class="ml-2">0€</span>
</div>
</div>
</div>
</div>
</div>
<div class="bg-white/80 backdrop-blur-md shadow-xl rounded-2xl sm:rounded-3xl p-5 mb-3 sm:mb-12 transform transition-all duration-300 border border-gray-100">
<h2 class="text-xl text-center font-semibold mb-4 bg-clip-text text-transparent bg-gradient-to-r from-red-500 to-orange-500">Ticket Preise</h2>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:ticket" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">All-Inclusive Ticket</span>
<span class="ml-2">50€</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:cake" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">After-Show Ticket</span>
<span class="ml-2">20€</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">Kind (6-12 Jahre)</span>
<span class="ml-2">15€</span>
</div>
</div>
<div class="flex items-center space-x-3">
<twig:ux:icon name="heroicons:musical-note" class="w-5 h-5 text-orange-600" />
<div class="text-gray-700">
<span class="font-medium">Kind (0-6 Jahre)</span>
<span class="ml-2">0€</span>
</div>
</div>
<div class="flex inline-flex justify-center w-full gap-4">
<div class="text-center space-y-6">
<a href="{{ path('app_ticket') }}"
class="inline-block bg-gradient-to-r from-red-500 to-orange-500 hover:from-red-600 hover:to-orange-600 text-white px-8 sm:px-10 md:px-12 py-4 sm:py-5 rounded-full text-base sm:text-lg font-semibold shadow-xl hover:shadow-2xl transition-all duration-300">
Tickets kaufen
</a>
</div>
<div class="text-center space-y-6">
<a href="{{ path('app_contact') }}"
class="inline-block bg-gradient-to-r from-red-500 to-orange-500 hover:from-red-600 hover:to-orange-600 text-white px-8 sm:px-10 md:px-12 py-4 sm:py-5 rounded-full text-base sm:text-lg font-semibold shadow-xl hover:shadow-2xl transition-all duration-300">
Kontakt aufnehmen
</a>
</div>
</div>
</div>
<div class="text-center space-y-6">
<a href="{{ path('app_ticket') }}"
class="inline-block bg-gradient-to-r from-red-500 to-orange-500 hover:from-red-600 hover:to-orange-600 text-white px-8 sm:px-10 md:px-12 py-4 sm:py-5 rounded-full text-base sm:text-lg font-semibold shadow-xl hover:shadow-2xl transition-all duration-300">
Tickets kaufen
</a>
<footer class="absolute bottom-0 right-0 w-full flex justify-end items-end p-4">
<div class="flex items-end gap-4">
<img src="{{ asset('images/logos/new_logo.png') }}" alt="Waldorfschule Bremen Osterholz" class="h-20">
<img src="{{ asset('images/logos/second_logo.png') }}" alt="Waldorfschule Bremen Touler Straße" class="h-20">
</div>
</footer>
</div>
</div>
</main>
</div>
</main>
</div>
</div>
{% endblock %}

View File

@ -42,7 +42,7 @@ Danke
</div>
<div class="flex justify-start space-x-3">
<twig:ux:icon name="heroicons:clock" class="w-6 h-6 text-orange-600" />
<p class="text-gray-700">17:30 - Open End</p>
<p class="text-gray-700">17:30 - 03:00</p>
</div>
<div class="flex justify-start space-x-3">
<twig:ux:icon name="heroicons:map-pin" class="w-6 h-6 text-orange-600" />
@ -80,6 +80,12 @@ Danke
</div>
</div>
<div class="mt-8 bg-white rounded-2xl shadow-lg p-8 border border-gray-100">
<twig:ux:icon name="heroicons:envelope" class="w-8 h-8 text-orange-600 mx-auto mb-4" />
<h3 class="text-xl font-semibold mb-3 text-center">E-Mail Bestätigung</h3>
<p class="text-gray-700 mb-4 text-center">Bitte überprüfe auch deinen Spam-Ordner nach der Bestellbestätigung. Falls du keine E-Mail erhalten hast, kannst du am Eingang einfach deinen vollständigen Namen nennen.</p>
</div>
<div class="mt-8 pt-6 border-t border-gray-200 text-center">
<div class="flex items-center justify-center">
<a href="{{ path('app_calendar') }}"