{#- Price breakdown for booking emails. Mirrors groups/booking/_offer_summary.html.twig, but with inline styles: the email layout ships no table styling and no Tailwind. Context: booking, priceBreakdown, currency (set in AccommodationBookingService). -#} {% if priceBreakdown is not null and currency is not null %} {% set cell = 'padding: 4px 0; text-align: left; vertical-align: top;' %} {% set amount = 'padding: 4px 0; text-align: right; vertical-align: top; white-space: nowrap;' %} {% set note = 'display: block; font-size: 12px; color: #6b7280; margin: 0;' %}

Preise

{% if booking.minorsCount > 0 %} {% endif %} {% if booking.childrenCount > 0 %} {% endif %} {% if priceBreakdown.basePrice > 0 %} {% endif %} {% if priceBreakdown.additionalPersonsPrice > 0 %} {% endif %} {% if priceBreakdown.shortTermSurcharge > 0 %} {% endif %} {% if priceBreakdown.boardPrice > 0 %} {% endif %} {% if priceBreakdown.undersubscriptionSurcharge > 0 %} {% endif %} {% for service in priceBreakdown.serviceDetails %} {% if service.price > 0 %} {% endif %} {% endfor %} {% if priceBreakdown.runningCosts > 0 %} {% endif %} {% set accommodationDiscountAmount = booking.accommodationDiscount is not null ? ((priceBreakdown.basePrice + priceBreakdown.additionalPersonsPrice) * booking.accommodationDiscount / 100) | round : 0 %} {% set boardDiscountAmount = booking.boardServiceDiscount is not null ? (priceBreakdown.boardPrice * booking.boardServiceDiscount / 100) | round : 0 %} {% set servicesDiscountAmount = booking.additionalServicesDiscount is not null ? (priceBreakdown.servicesPrice * booking.additionalServicesDiscount / 100) | round : 0 %} {% set discountSum = accommodationDiscountAmount + boardDiscountAmount + servicesDiscountAmount %} {% if booking.accommodationDiscount is not null %} {% endif %} {% if booking.boardServiceDiscount is not null %} {% endif %} {% if booking.additionalServicesDiscount is not null %} {% endif %} {% if discountSum > 0 %} {#- The frozen snapshot wins where it exists; without one the discounted total has to be derived from the very rows shown above, so the mail can never contradict itself. -#} {% endif %}
Zeitraum {{ booking.dateFrom|date('d.m.Y') }} – {{ booking.dateTo|date('d.m.Y') }}, {{ booking.nights }} {{ booking.nights != 1 ? 'Nächte' : 'Nacht' }}
Anzahl Personen {{ booking.paxCount }}
davon Kinder (0–3 J.) {{ booking.minorsCount }}
davon Kinder (4–{{ booking.accommodation.maxAdolescentAge }} J.) {{ booking.childrenCount }}
Basispreis für {{ priceBreakdown.includedPax }} Pers. {{ (priceBreakdown.basePrice / 100)|format_currency(currency) }}
Aufpreis Personenzahl für {{ priceBreakdown.effectivePax - priceBreakdown.includedPax }} Pers. {{ (priceBreakdown.additionalPersonsPrice / 100)|format_currency(currency) }}
Aufpreis Kurzzeit {{ (priceBreakdown.shortTermSurcharge / 100)|format_currency(currency) }}
Verpflegung{% if booking.boardServiceLabel %} ({{ booking.boardServiceLabel }}){% endif %} {{ (priceBreakdown.boardPrice / 100)|format_currency(currency) }}
Verpflegungs-Aufschlag für Gruppen unter {{ priceBreakdown.undersubscriptionThreshold }} Pers. {{ (priceBreakdown.undersubscriptionSurcharge / 100)|format_currency(currency) }}
{{ service.label }} {{ (service.price / 100)|format_currency(currency) }}
Strom- und Abfallgebühren {{ (priceBreakdown.runningCosts / 100)|format_currency(currency) }}
Gesamtpreis zzgl. ortsabhängiger Gebühren {{ (priceBreakdown.total / 100)|format_currency(currency) }}
Rabatt Unterkunft {{ booking.accommodationDiscount }} % – {{ (accommodationDiscountAmount / 100)|format_currency(currency) }}
Rabatt Verpflegung {{ booking.boardServiceDiscount }} % – {{ (boardDiscountAmount / 100)|format_currency(currency) }}
Rabatt Zusatzleistungen {{ booking.additionalServicesDiscount }} % – {{ (servicesDiscountAmount / 100)|format_currency(currency) }}
Gesamtpreis nach Rabatt {{ ((booking.totalPrice ?? (priceBreakdown.total - discountSum)) / 100)|format_currency(currency) }}
{% endif %}