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>
270 lines
14 KiB
PHP
Executable File
270 lines
14 KiB
PHP
Executable File
<!-- Banner -->
|
||
<section id="banner">
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/banner.jpg" />
|
||
<!--div class="inner">
|
||
<h2>Ipsum dolore</h2>
|
||
<p>Amet lorem ipsum consequat feugiat</p>
|
||
</div-->
|
||
</section>
|
||
|
||
<section id="mobil-menu">
|
||
<div class="mobil-menucont">
|
||
<ul>
|
||
<li class="mobil-menu-book"><a href="<?php echo SITEURL;?>hu/booking/barber">IDŐPONTFOGLALÁS</a></li>
|
||
<li class=""><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
|
||
<li class=""><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- About Us -->
|
||
<section id="aboutus" class="wrapper style1">
|
||
<div class="container">
|
||
<div class="inner">
|
||
<header class="major">
|
||
<img src="<?php echo SITEURL;?>assets/img/ollo.png">
|
||
<h2>Rólunk</h2>
|
||
</header>
|
||
<div class="bemutatkozas">
|
||
<div class="bem-bal">
|
||
<p>
|
||
Bence Evelin vagyok a Studio Beve vezetője és megálmodója. Fontosnak tartom, hogy a vendégek a nálunk töltött idő alatt – egy kicsit megpihenve a világ zajától – feltöltődjenek, és kívül-belül megszépülve térjenek vissza a mindennapokhoz.
|
||
</p>
|
||
<p>
|
||
A minőségi idő, a maximális figyelem, a legprofesszionálisabb eszközök, a hivatástudattal és szakértelemmel karöltve jelentik a filozófiánk és szolgáltatásaink alapjait.
|
||
</p>
|
||
<p>
|
||
Hiszem, hogy a szépség, a divat és a trend nem nemhez kötött, így nálunk lehetőség van arra, hogy mindenki egy helyen szépülhessen nemtől függetlenül. A Barber, Beauty és Masszázs részlegeink között pedig megtalálhatjátok a számotokra megfelelő szolgáltatásokat.
|
||
</p>
|
||
<p>
|
||
Közel 10 éves szépségipari, és közte több éves nemzetközi tapasztalattal elérkezettnek láttam az időt, hogy megnyissam saját stúdiómat itt Trondheimben, az Innheredsveien 92 szám alatt, ahol a vendégeknek lehetősége van ingyenes parkolásra is a kezelések időtartama alatt.
|
||
</p>
|
||
<p>
|
||
Extra öröm számomra, hogy egy olyan tradicionális helyet sikerült találnom, ahol az 50-es években már szépségszalon működött, ennek köszönhetően a hagyományt, modern környezetben lehetőségem van tovább vinni.
|
||
Szépülj velünk, szeretettel várunk.
|
||
</p>
|
||
</div>
|
||
<div class="bem-jobb">
|
||
<img src="<?php echo SITEURL;?>assets/img/evelin.JPG">
|
||
<h4>Bence Evelin <br> <span>Tulajdonos, Studio Beve</span></h4>
|
||
</div>
|
||
</div>
|
||
<div class="dolgozo-nev">
|
||
<hr>
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/evelin/evelin.jpg" class="dolgozo-kep">
|
||
<h4>EVELIN Bence <span>- Barber</span></h4>
|
||
</div>
|
||
<div class="bemutatkozas-dolgozo">
|
||
<div class="bem-dolgozo-bal">
|
||
<p>
|
||
"Már egészen kiskoromban megismerkedtem a borbély lét alapjaival, hiszen édesanyám is borbély. Tőle, egészen fiatalon sikerült elsajátítanom ennek a csodálatos szakmának a fortélyait. Mondhatni beleszülettem a szakmába, és már néhány éve, hivatalosan is második generációs borbély vagyok.
|
||
</p>
|
||
<p>
|
||
Büszke vagyok arra, hogy a legjobbaktól tanulhattam. A fodrászmesterem és barátom Tenkely Ruben, a „Peaky Barbers - Tenkely Limited Company” tulajdonosa, európa kupagyőztes és magyar bajnok, aki nemzetközi szinten is rengeteg tapasztalatot szerzett. Többek között dolgozott norvégia egyik leghíresebb tradicionális szalonjában a Brødrene Fevangs Barberstue-ben. Így általa is megismerhettem a norvégiai trendeket.
|
||
</p>
|
||
<p>
|
||
2023 áprilisától élek Norvégiában, a norvég nyelvet lelkesen tanulom. Szerencsésnek érzem magam, hogy ez idő alatt lehetőségem volt Felipe Romero mellett dolgozni Trondheimben, aki szintén elképesztően nagy tudással rendelkező borbély. Nála már többen is találkozhattatok velem és megismerhettetek.
|
||
</p>
|
||
<p>
|
||
Folyamatosan veszek részt továbbképzéseken, mert hiszem, hogy a folyamatos fejlődés, a minőségi munka és az odaadás segít, hogy napról-napra jobb szakember lehessek."
|
||
</p>
|
||
</div>
|
||
<div class="bem-dolgozo-jobb">
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/evelin/1.jpg">
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/evelin/2.jpg">
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/evelin/3.jpg">
|
||
<img src="<?php echo SITEURL;?>assets/img/barber/evelin/4.jpg">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Treatments -->
|
||
<section id="treatments" class="wrapper style2">
|
||
<div class="container">
|
||
<div class="inner">
|
||
<header class="major">
|
||
<img src="<?php echo SITEURL;?>assets/img/ollo.png">
|
||
<h2 class="nyitva">Szolgáltatások</h2>
|
||
</header>
|
||
</div>
|
||
|
||
<div class="service-block">
|
||
<div class="service-area">
|
||
<div class="one-third service-part1">
|
||
<div class="service-inner">
|
||
<div class="service service1">
|
||
<div class="service-text service-text1">
|
||
<div class="service-icon icon1"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Szakálligazítás</div>
|
||
<div class="sub-title-serv">ollóval, géppel és forró törölközős késes borotválással</div>
|
||
</div>
|
||
</div>
|
||
<div class="service-text service-text2">
|
||
<div class="service-icon icon2"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Gyermek hajvágás</div>
|
||
<div class="sub-title-serv">0-12 éves korig</div>
|
||
</div>
|
||
</div>
|
||
<div class="service-text service-text3">
|
||
<div class="service-icon icon3"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Szakállfestés</div>
|
||
<div class="sub-title-serv">szakállfestés</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="one-third service-part2">
|
||
<div class="service-inner">
|
||
<div class="service service2">
|
||
<a href="#" class="banner-anchor"><img src="<?php echo SITEURL;?>assets/img/service-banner.png" alt="service-banner1" class="banner-image1"></a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="one-third service-part3">
|
||
<div class="service-inner">
|
||
<div class="service service3">
|
||
<div class="service-text service-text1">
|
||
<div class="service-icon icon1"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Hagyományos borotválás</div>
|
||
<div class="sub-title-serv">forrótörölközős késesborotválás</div>
|
||
</div>
|
||
</div>
|
||
<div class="service-text service-text2">
|
||
<div class="service-icon icon2"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Hajvágás vagy skinfade hajvágás</div>
|
||
<div class="sub-title-serv">bőrből indított átmenet mint pl taper, low, mid vagy high</div>
|
||
</div>
|
||
</div>
|
||
<div class="service-text service-text3">
|
||
<div class="service-icon icon3"></div>
|
||
<div class="service-content">
|
||
<div class="main-title">Gyanta</div>
|
||
<div class="sub-title-serv">orr, fül és<br> szemöldök gyanta</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
<!-- One -->
|
||
|
||
<section id="one" class="wrapper style1">
|
||
<div class="container">
|
||
<div class="inner">
|
||
<header class="major">
|
||
<img src="<?php echo SITEURL;?>/assets/img/barber/ollo.png">
|
||
<h2>Árlista</h2>
|
||
<h4>Minden hajkezelés ára tartalmazza a hajmosást és a formázást<br>10%-os diákkedvezmény, igazolvány felmutatásával, ami hétfőtől csütörtökig vehető igénybe.</h4>
|
||
</header>
|
||
<?php
|
||
$prevousCategory = '';
|
||
|
||
if(is_array($services)){
|
||
foreach($services as $serviceItem){
|
||
if($serviceItem->service_category != $prevousCategory){
|
||
?>
|
||
<div class="prices-category" style="width: 100%;">
|
||
<h4 style="color: #9e8462;"><?php echo $serviceItem->service_category;?></h4>
|
||
</div>
|
||
<?php
|
||
}
|
||
?>
|
||
<div class="one-half">
|
||
<div class="category-content">
|
||
<div class="category-text-left">
|
||
<div class="main-title"><a><?php echo $serviceItem->service_name;?></a></div>
|
||
<div class="sub-title"><?php echo $serviceItem->service_description;?></div>
|
||
</div>
|
||
<div class="category-text-right">
|
||
<div class="price">kr <?php echo $serviceItem->service_price;?></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
$prevousCategory = $serviceItem->service_category;
|
||
}
|
||
}
|
||
?>
|
||
|
||
|
||
<?php
|
||
/*
|
||
if(is_array($services)){
|
||
foreach($services as $serviceItem){
|
||
?>
|
||
<div class="one-half">
|
||
<div class="category-content">
|
||
<div class="category-text-left">
|
||
<div class="main-title"><a><?php echo $serviceItem->service_name;?></a></div>
|
||
<div class="sub-title"><?php echo $serviceItem->service_description;?></div>
|
||
</div>
|
||
<div class="category-text-right">
|
||
<div class="price">kr <?php echo $serviceItem->service_price;?></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
}
|
||
}
|
||
*/
|
||
?>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
<!-- Two -->
|
||
<section id="two" class="wrapper style2">
|
||
<div class="container">
|
||
<div class="inner">
|
||
<header class="major">
|
||
<img src="<?php echo SITEURL;?>assets/img/ollo.png">
|
||
<h2 class="nyitva">Nyitvatartási idő</h2>
|
||
<h4>Ingyenes parkolás a szolgáltatások ideje alatt</h4>
|
||
</header>
|
||
</div>
|
||
<div class="nyitvatartas">
|
||
<div class="about-content">
|
||
<div class="about-text-left">
|
||
<div class="title">Hétköznap</div>
|
||
</div>
|
||
<div class="about-text-right">
|
||
<div class="time">10:00 - 18:00</div>
|
||
</div>
|
||
</div>
|
||
<div class="about-content">
|
||
<div class="about-text-left">
|
||
<div class="title">Szombat</div>
|
||
</div>
|
||
<div class="about-text-right">
|
||
<div class="time">10:00 - 16:00</div>
|
||
</div>
|
||
</div>
|
||
<div class="about-content">
|
||
<div class="about-text-left">
|
||
<div class="title">Vasárnap</div>
|
||
</div>
|
||
<div class="about-text-right">
|
||
<div class="closed">Zárva</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|