feat: itemised price breakdown on the accommodation booking edit page
This commit is contained in:
1 parent
a5f8d75caa
commit
6f6bf3695c
4 files changed
+101
-126
No files matched your search
@@ -0,0 +1,98 @@
|
||||
{#- Itemised price table, the same lines the customer sees in the offer. Context: booking, priceBreakdown, currency. -#}
|
||||
<table class="w-full text-sm">
|
||||
{% for period in priceBreakdown.periods | filter(p => p.position == 'leading') %}
|
||||
{% include 'admin/accommodation_booking/_price_period.html.twig' %}
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.periods is not empty %}
|
||||
<tr class="border-t border-gray-200 font-medium">
|
||||
<td class="pt-2 pb-1" colspan="2">
|
||||
Gruppe · {{ booking.mainDateFrom | date('d.m.Y') }} – {{ booking.mainDateTo | date('d.m.Y') }},
|
||||
{{ priceBreakdown.nights }} {{ priceBreakdown.nights != 1 ? 'Nächte' : 'Nacht' }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.basePrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">
|
||||
Basispreis
|
||||
<span class="text-xs text-gray-500">für {{ priceBreakdown.includedPax }} Pers.</span>
|
||||
</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.basePrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.additionalPersonsPrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">
|
||||
Aufpreis Personenzahl
|
||||
<span class="text-xs text-gray-500">für {{ priceBreakdown.effectivePax - priceBreakdown.includedPax }} Pers.</span>
|
||||
</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.additionalPersonsPrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.shortTermSurcharge > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Aufpreis Kurzzeit</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.shortTermSurcharge / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.boardPrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Verpflegung</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.boardPrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.undersubscriptionSurcharge > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Verpflegungs-Aufschlag für Gruppen unter {{ priceBreakdown.undersubscriptionThreshold }} Personen</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.undersubscriptionSurcharge / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% for service in priceBreakdown.serviceDetails %}
|
||||
{% if service.price > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">{{ service.label }}</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (service.price / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.runningCosts > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Strom- und Abfallgebühren</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.runningCosts / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% for period in priceBreakdown.periods | filter(p => p.position == 'trailing') %}
|
||||
{% include 'admin/accommodation_booking/_price_period.html.twig' %}
|
||||
{% endfor %}
|
||||
<tr class="border-t border-gray-200 font-semibold">
|
||||
<td class="pt-2">
|
||||
Gesamtpreis
|
||||
<span class="block text-xs font-normal text-gray-500">zzgl. ortsabhängiger Gebühren</span>
|
||||
</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.total / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% for discount in priceBreakdown.discounts %}
|
||||
<tr class="text-green-700">
|
||||
<td class="pt-1">{{ discount.label }} {{ discount.percent }} %</td>
|
||||
<td class="pt-1 text-right whitespace-nowrap">– {{ (discount.amount / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.discountSubtotal is not null %}
|
||||
<tr class="border-t border-gray-200">
|
||||
<td class="pt-2">Zwischensumme</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.discountSubtotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.totalDiscountDetails is not null %}
|
||||
<tr class="text-green-700">
|
||||
<td class="pt-1">{{ priceBreakdown.totalDiscountDetails.label }}</td>
|
||||
<td class="pt-1 text-right whitespace-nowrap">– {{ (priceBreakdown.totalDiscountDetails.amount / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.discounts is not empty or priceBreakdown.totalDiscountDetails is not null %}
|
||||
<tr class="border-t border-gray-200 font-bold text-green-700">
|
||||
<td class="pt-2">Gesamtpreis nach Rabatt</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.discountedTotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
@@ -1,4 +1,4 @@
|
||||
{#- One split-off period of the price table on the detail page. Context: period, currency. -#}
|
||||
{#- One split-off period of the admin price table. Context: period, currency. -#}
|
||||
<tr class="border-t border-gray-200 font-medium">
|
||||
<td class="pt-2 pb-1" colspan="2">
|
||||
{% if period.label ?? null %}{{ period.label }} · {% endif %}
|
||||
|
||||
@@ -172,34 +172,7 @@
|
||||
{% if priceBreakdown is not null %}
|
||||
{% set currency = booking.pricingCurrency ?? priceBreakdown.currency %}
|
||||
<twig:form:section title="Preis">
|
||||
<table class="w-full text-sm">
|
||||
{% if priceBreakdown.periods is not empty %}
|
||||
<tr>
|
||||
<td class="py-1">Gruppe</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ ((priceBreakdown.total - priceBreakdown.periodsTotal) / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="py-1">Zeiträume</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.periodsTotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.discountedTotal != priceBreakdown.total %}
|
||||
{% if priceBreakdown.periods is empty %}
|
||||
<tr>
|
||||
<td class="py-1">Preis</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.total / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr class="text-green-700">
|
||||
<td class="py-1">Rabatte</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">– {{ ((priceBreakdown.total - priceBreakdown.discountedTotal) / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr class="border-t border-gray-200 font-bold">
|
||||
<td class="pt-2">Gesamtpreis</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.discountedTotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
{% include 'admin/accommodation_booking/_price_breakdown.html.twig' %}
|
||||
<p class="text-xs text-gray-500 pt-2">
|
||||
Stand der letzten Speicherung. Änderungen oben werden erst beim Speichern neu berechnet.
|
||||
</p>
|
||||
|
||||
@@ -64,103 +64,7 @@
|
||||
{% if priceBreakdown is not null %}
|
||||
{% set currency = booking.pricingCurrency ?? priceBreakdown.currency %}
|
||||
<twig:form:section title="Preise">
|
||||
<table class="w-full text-sm">
|
||||
{% for period in priceBreakdown.periods | filter(p => p.position == 'leading') %}
|
||||
{% include 'admin/accommodation_booking/_price_period.html.twig' %}
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.periods is not empty %}
|
||||
<tr class="border-t border-gray-200 font-medium">
|
||||
<td class="pt-2 pb-1" colspan="2">
|
||||
Gruppe · {{ booking.mainDateFrom | date('d.m.Y') }} – {{ booking.mainDateTo | date('d.m.Y') }},
|
||||
{{ priceBreakdown.nights }} {{ priceBreakdown.nights != 1 ? 'Nächte' : 'Nacht' }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.basePrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">
|
||||
Basispreis
|
||||
<span class="text-xs text-gray-500">für {{ priceBreakdown.includedPax }} Pers.</span>
|
||||
</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.basePrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.additionalPersonsPrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">
|
||||
Aufpreis Personenzahl
|
||||
<span class="text-xs text-gray-500">für {{ priceBreakdown.effectivePax - priceBreakdown.includedPax }} Pers.</span>
|
||||
</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.additionalPersonsPrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.shortTermSurcharge > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Aufpreis Kurzzeit</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.shortTermSurcharge / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.boardPrice > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Verpflegung</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.boardPrice / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.undersubscriptionSurcharge > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Verpflegungs-Aufschlag für Gruppen unter {{ priceBreakdown.undersubscriptionThreshold }} Personen</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.undersubscriptionSurcharge / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% for service in priceBreakdown.serviceDetails %}
|
||||
{% if service.price > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">{{ service.label }}</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (service.price / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.runningCosts > 0 %}
|
||||
<tr>
|
||||
<td class="py-1">Strom- und Abfallgebühren</td>
|
||||
<td class="py-1 text-right whitespace-nowrap">{{ (priceBreakdown.runningCosts / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% for period in priceBreakdown.periods | filter(p => p.position == 'trailing') %}
|
||||
{% include 'admin/accommodation_booking/_price_period.html.twig' %}
|
||||
{% endfor %}
|
||||
<tr class="border-t border-gray-200 font-semibold">
|
||||
<td class="pt-2">
|
||||
Gesamtpreis
|
||||
<span class="block text-xs font-normal text-gray-500">zzgl. ortsabhängiger Gebühren</span>
|
||||
</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.total / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% for discount in priceBreakdown.discounts %}
|
||||
<tr class="text-green-700">
|
||||
<td class="pt-1">{{ discount.label }} {{ discount.percent }} %</td>
|
||||
<td class="pt-1 text-right whitespace-nowrap">– {{ (discount.amount / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% if priceBreakdown.discountSubtotal is not null %}
|
||||
<tr class="border-t border-gray-200">
|
||||
<td class="pt-2">Zwischensumme</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.discountSubtotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.totalDiscountDetails is not null %}
|
||||
<tr class="text-green-700">
|
||||
<td class="pt-1">{{ priceBreakdown.totalDiscountDetails.label }}</td>
|
||||
<td class="pt-1 text-right whitespace-nowrap">– {{ (priceBreakdown.totalDiscountDetails.amount / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if priceBreakdown.discounts is not empty or priceBreakdown.totalDiscountDetails is not null %}
|
||||
<tr class="border-t border-gray-200 font-bold text-green-700">
|
||||
<td class="pt-2">Gesamtpreis nach Rabatt</td>
|
||||
<td class="pt-2 text-right whitespace-nowrap">{{ (priceBreakdown.discountedTotal / 100) | format_currency(currency) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
{% include 'admin/accommodation_booking/_price_breakdown.html.twig' %}
|
||||
</twig:form:section>
|
||||
{% endif %}
|
||||
|
||||
|
||||
Reference in new issue
Block a user