177 lines
8.2 KiB
Twig
177 lines
8.2 KiB
Twig
{% extends 'layout_admin.html.twig' %}
|
||
|
||
{% block content %}
|
||
{% set back_params = { 'id': booking.id } %}
|
||
{% if app.request.query.get('r') %}
|
||
{% set back_params = back_params | merge({ 'r': app.request.query.get('r') }) %}
|
||
{% endif %}
|
||
|
||
<twig:page:heading>{{ booking.recordLabel }} {{ booking.groupName }}</twig:page:heading>
|
||
<p class="flex items-center gap-3 text-sm text-gray-500 mb-6">
|
||
{{ booking.accommodation.name }}
|
||
{# Only an Entwurf may still move house — see ChangeAccommodationController. #}
|
||
{% if booking.draft %}
|
||
<button type="button"
|
||
hx-get="{{ path('app_admin_accommodationbooking_change_accommodation', back_params) }}"
|
||
hx-target="body"
|
||
hx-swap="beforeend"
|
||
class="button button--secondary button--small">ändern</button>
|
||
{% endif %}
|
||
</p>
|
||
|
||
{% form_theme form 'forms_admin.html.twig' %}
|
||
|
||
{{ form_start(form) }}
|
||
<div class="grid lg:grid-cols-2 gap-y-4 lg:gap-x-8">
|
||
<h2 class="lg:col-span-2 text-base font-bold">Kontaktdaten</h2>
|
||
{{ form_row(form.groupName) }}
|
||
{{ form_row(form.salutation) }}
|
||
{{ form_row(form.firstName) }}
|
||
{{ form_row(form.lastName) }}
|
||
{{ form_row(form.email) }}
|
||
{{ form_row(form.phone) }}
|
||
{{ form_row(form.street) }}
|
||
{{ form_row(form.zip) }}
|
||
{{ form_row(form.city) }}
|
||
|
||
<h2 class="lg:col-span-2 text-base font-bold pt-2">Reisedaten</h2>
|
||
{{ form_row(form.dateFrom) }}
|
||
{{ form_row(form.dateTo) }}
|
||
{{ form_row(form.paxCount) }}
|
||
{{ form_row(form.minorsCount) }}
|
||
{{ form_row(form.childrenCount) }}
|
||
|
||
{# Saved by their own modals, which reprice the booking on the spot — see SplitPeriodController. #}
|
||
<div class="lg:col-span-2">
|
||
<h3 class="font-bold pb-1">Zeiträume</h3>
|
||
<p class="text-xs text-gray-500 pb-2">
|
||
Anreise und Abreise umfassen den ganzen Aufenthalt. Abgeteilte Zeiträume, etwa für ein
|
||
Vorausteam, werden mit eigenen Positionen berechnet; Personen und Leistungen oben gelten
|
||
nur für den Zeitraum der Gruppe.
|
||
</p>
|
||
<table class="w-full text-sm">
|
||
{% if booking.leadingPeriod %}
|
||
{% set p = booking.leadingPeriod %}
|
||
{{ block('period_row') }}
|
||
{% endif %}
|
||
<tr class="border-t border-gray-200">
|
||
<td class="py-1 whitespace-nowrap">{{ booking.mainDateFrom | date('d.m.Y') }} – {{ booking.mainDateTo | date('d.m.Y') }}</td>
|
||
<td class="py-1 whitespace-nowrap">{{ booking.mainNights }} {{ booking.mainNights != 1 ? 'Nächte' : 'Nacht' }}</td>
|
||
<td class="py-1" colspan="2">Gruppe</td>
|
||
<td class="py-1 text-right">
|
||
{# One period per side, so only the free sides are offered. #}
|
||
{% if booking.leadingPeriod is null or booking.trailingPeriod is null %}
|
||
<twig:dropdown>
|
||
{% if booking.leadingPeriod is null %}
|
||
<twig:dropdown:hxbutton url="{{ path('app_admin_accommodationbooking_period_split', back_params | merge({ position: 'leading' })) }}">
|
||
am Anfang abteilen
|
||
</twig:dropdown:hxbutton>
|
||
{% endif %}
|
||
{% if booking.trailingPeriod is null %}
|
||
<twig:dropdown:hxbutton url="{{ path('app_admin_accommodationbooking_period_split', back_params | merge({ position: 'trailing' })) }}">
|
||
am Ende abteilen
|
||
</twig:dropdown:hxbutton>
|
||
{% endif %}
|
||
</twig:dropdown>
|
||
{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% if booking.trailingPeriod %}
|
||
{% set p = booking.trailingPeriod %}
|
||
{{ block('period_row') }}
|
||
{% endif %}
|
||
</table>
|
||
</div>
|
||
|
||
{% if form.boardService is defined or form.selectedAdditionalServices is defined %}
|
||
<h2 class="lg:col-span-2 text-base font-bold pt-2">Leistungen</h2>
|
||
{% if form.boardService is defined %}
|
||
{{ form_row(form.boardService) }}
|
||
{% endif %}
|
||
{% if form.selectedAdditionalServices is defined %}
|
||
{{ form_row(form.selectedAdditionalServices) }}
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
<h2 class="lg:col-span-2 text-base font-bold pt-2">Status & Rabatt</h2>
|
||
{# Read-only: the status only ever moves through a named action on the detail page,
|
||
so that it cannot be set without the email and timestamp that belong to it. #}
|
||
<p class="lg:col-span-2 text-sm">
|
||
<span class="font-medium">Status:</span>
|
||
{% include 'admin/accommodation_booking/_status_label.html.twig' %}
|
||
<span class="text-gray-500">· Herkunft: {{ booking.origin.label }}</span>
|
||
</p>
|
||
{% if booking.acceptedAt is not null %}
|
||
<p class="lg:col-span-2 text-xs text-gray-500">
|
||
Angenommen am {{ booking.acceptedAt | date('d.m.Y, H:i') }}
|
||
</p>
|
||
{% endif %}
|
||
{% if booking.confirmedAt is not null %}
|
||
<p class="lg:col-span-2 text-xs text-gray-500">
|
||
Bestätigt am {{ booking.confirmedAt | date('d.m.Y, H:i') }}
|
||
</p>
|
||
{% endif %}
|
||
{% if form.managedBy is defined %}
|
||
<div class="lg:col-span-2">
|
||
{{ form_row(form.managedBy) }}
|
||
</div>
|
||
{% endif %}
|
||
<div class="lg:col-span-2 grid lg:grid-cols-3 gap-y-4 lg:gap-x-8">
|
||
{{ form_row(form.accommodationDiscount) }}
|
||
{{ form_row(form.boardServiceDiscount) }}
|
||
{{ form_row(form.additionalServicesDiscount) }}
|
||
</div>
|
||
<div class="lg:col-span-2 grid lg:grid-cols-2 gap-y-4 lg:gap-x-8">
|
||
{{ form_row(form.totalDiscountLabel) }}
|
||
{{ form_row(form.totalDiscountAmount) }}
|
||
</div>
|
||
<div class="lg:col-span-2">
|
||
{{ form_row(form.remarks) }}
|
||
</div>
|
||
</div>
|
||
<div class="flex justify-between pt-8">
|
||
<a href="{{ path('app_admin_accommodationbooking_show', back_params) }}" class="button button--secondary button--small">
|
||
zurück
|
||
</a>
|
||
<button type="submit" class="button button--primary button--small">
|
||
speichern
|
||
</button>
|
||
</div>
|
||
{{ form_rest(form) }}
|
||
{{ form_end(form) }}
|
||
{% endblock %}
|
||
|
||
{% block period_row %}
|
||
{% set period_params = { id: p.id } %}
|
||
{% if app.request.query.get('r') %}
|
||
{% set period_params = period_params | merge({ r: app.request.query.get('r') }) %}
|
||
{% endif %}
|
||
<tr class="border-t border-gray-200 align-top">
|
||
<td class="py-1 whitespace-nowrap">{{ p.dateFrom | date('d.m.Y') }} – {{ p.dateTo | date('d.m.Y') }}</td>
|
||
<td class="py-1 whitespace-nowrap">{{ p.nights }} {{ p.nights != 1 ? 'Nächte' : 'Nacht' }}</td>
|
||
<td class="py-1">
|
||
{% if p.label %}
|
||
<div class="font-medium">{{ p.label }}</div>
|
||
{% endif %}
|
||
{% for line in p.lines %}
|
||
<div>{{ line.label }}</div>
|
||
{% else %}
|
||
<div class="text-gray-500">keine Positionen</div>
|
||
{% endfor %}
|
||
</td>
|
||
<td class="py-1 text-right whitespace-nowrap">
|
||
{{ (p.total / 100) | format_currency(booking.pricingCurrency ?? booking.accommodation.currency) }}
|
||
</td>
|
||
<td class="py-1 text-right">
|
||
<twig:dropdown>
|
||
<twig:dropdown:hxbutton url="{{ path('app_admin_accommodationbooking_period_edit', period_params) }}">
|
||
bearbeiten
|
||
</twig:dropdown:hxbutton>
|
||
<twig:dropdown:hxbutton url="{{ path('app_admin_accommodationbooking_period_remove', period_params) }}" warning>
|
||
entfernen
|
||
</twig:dropdown:hxbutton>
|
||
</twig:dropdown>
|
||
</td>
|
||
</tr>
|
||
{% endblock %}
|