Introduces /massage alongside barber and beauty: landing page, booking flow, admin support, home tile and SEO entries, in all three languages. Architecture - application/config/verticals.php + vertical_helper.php: one registry entry per vertical (branding, assets, views, behaviour flags). A fourth vertical is a config entry plus content files. - Strangler: barber and beauty keep pointing at their existing view files, so their rendered HTML is unchanged. Only massage uses the new generic pages/vertical-*.php and includes/vertical-*.php views, which collapse the four duplicated per-language nav/footer branches into one. - Pages::vertical() + one route; booking(), booking_finished(), _booking_error() and manage_booking() are now registry-driven. Worker/vertical coupling - getActiveWorkers() derives the vertical from services.service_category_id instead of the workers.is_barber / is_beauty flags, which were a hand-maintained cache of exactly that fact. Verified against production data: the derived set reproduced the stored flags for every worker, in both verticals. No schema change was needed for massage. - The legacy flags are now written through from the category so a rollback cannot strand a new worker, and the admin worker UI shows the derived verticals read-only instead of two dropdowns that controlled nothing. Bug fixes found along the way (all pre-existing) - booking_process() had no server-side category guard; cross-vertical mixing was prevented only by client-side JS. - add-service-form / add-worker-form emitted `selected` on every category option, so the newest category silently became the default. - update-service-form offered only barber/beauty, so editing a service of any other type silently rewrote it. - getWorkerScheduleByDay ignored schedule overrides while getAvailableTimes honoured them, so slots could be shown and then rejected. Added an override-aware getWorkerScheduleForDate() and used it in both guards. - Booking lists dereferenced a null service if one had been hard-deleted. - main.css: .tiles was tuned for exactly two tiles, including an absolutely-positioned .style1 at the 1280px breakpoint. Massage-specific behaviour, opt-in per vertical - strip_category_prefix: grouped service lists show "50 min" under the treatment heading rather than repeating the full name. The full name is carried in data-service-name so the totals panel stays unambiguous, and services.service_name is untouched for emails and admin. - single_service_booking: one treatment per booking, enforced in the UI and in booking_process(). Re-clicking the selection releases it. - Displayed treatment time (50/80/110 min) is in the service name; the booked slot (60/90/120 min) is service_time and covers changing and payment. service_time is never shown to the guest. DB migrations for dev/prod are in documents/ - additive only, no ALTER. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 lines
2.1 KiB
PHP
Executable File
41 lines
2.1 KiB
PHP
Executable File
<?php
|
|
// Determine subpage from the booking's service type to pick correct skeleton
|
|
$serviceIds = unserialize($booking->service_ids);
|
|
$subpage = 'barber';
|
|
if(is_array($serviceIds) && !empty($serviceIds)){
|
|
$firstService = $this->Service_model->getServiceById($serviceIds[0]);
|
|
if($firstService) $subpage = $firstService->service_type;
|
|
}
|
|
|
|
$vertical = vertical_get($subpage);
|
|
if(!$vertical){
|
|
$vertical = vertical_get('barber');
|
|
}
|
|
include(getcwd().'/application/views/includes/'.$vertical['skeleton'].'-skeleton-top.php');
|
|
|
|
$messages = array(
|
|
'no' => 'Din bestilling den <strong>'.$booking->booking_date.'</strong> kl. <strong>'.date('H:i', strtotime($booking->booking_start_time)).'</strong> med <strong>'.htmlspecialchars($worker->worker_name, ENT_QUOTES, 'UTF-8').'</strong> er avbestilt.',
|
|
'en' => 'Your booking on <strong>'.$booking->booking_date.'</strong> at <strong>'.date('H:i', strtotime($booking->booking_start_time)).'</strong> with <strong>'.htmlspecialchars($worker->worker_name, ENT_QUOTES, 'UTF-8').'</strong> has been cancelled.',
|
|
'hu' => 'A <strong>'.$booking->booking_date.'</strong> <strong>'.date('H:i', strtotime($booking->booking_start_time)).'</strong>-os foglalásod <strong>'.htmlspecialchars($worker->worker_name, ENT_QUOTES, 'UTF-8').'</strong>-nál törölve lett.',
|
|
);
|
|
|
|
$titles = array(
|
|
'no' => 'Bestilling avbestilt',
|
|
'en' => 'Booking cancelled',
|
|
'hu' => 'Foglalás törölve',
|
|
);
|
|
|
|
$lang = $selectedLang;
|
|
$msg = isset($messages[$lang]) ? $messages[$lang] : $messages['en'];
|
|
$title = isset($titles[$lang]) ? $titles[$lang] : $titles['en'];
|
|
?>
|
|
|
|
<div class="bookingContainer" style="min-height:400px; padding:20px;">
|
|
<div class="bookingThankYouTitle"><?php echo $title; ?></div>
|
|
<div class="bookingThankYouMessageTitle" style="margin-top:15px;"><?php echo $msg; ?></div>
|
|
</div>
|
|
|
|
<?php
|
|
include(getcwd().'/application/views/includes/'.$vertical['skeleton'].'-skeleton-bottom.php');
|
|
?>
|