Files
studiobeve.no/application/views/pages/includes/beauty-form-en.php
T
UbuntuandClaude Opus 5 5c30467fbd Add massage as a third vertical, driven by a config registry
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>
2026-08-13 16:34:47 +00:00

300 lines
16 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- Banner -->
<section id="banner">
<img src="<?php echo base_url();?>assets/img/beauty/banner.jpg" style="width: 100%;" />
<!--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;?>en/booking/beauty">BOOK TIME</a></li>
<li class=""><a href="https://www.facebook.com/studiobevebeauty" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li class=""><a href="https://www.instagram.com/studio.beve.beauty/" 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 base_url();?>assets/img/beauty/ollo_rose.png">
<h2>About Us</h2>
</header>
<div class="bemutatkozas">
<div class="bem-bal">
<p>
My name is Evelin Bence, leader and creator of Studio Beve. I consider it
important that our guests during their stay – resting a little from the noise of the
world – recharge their batteries and return to everyday life beautified inside as
well as outside.
</p>
<p>
Quality time, maximum attention, the most professional tools, together with
professionalism and expertise, stand for the basis of our philosophy and
services.
</p>
<p>
I believe that beauty, fashion, and trend are not gender-specific, so we have the
opportunity for everyone to become beautiful in one place, regardless of gender.
And among our Barber, Beauty and Massage departments, you can find the right services
for you.
</p>
<p>
With nearly 10 years of experience in the beauty industry, including many years
of international experience, I thought it was time to open my own studio here in
Trondheim at Innheredsveien 92, where guests can park free of charge during
the treatments.
</p>
<p>
It is an extra pleasure for me that I managed to find a traditional place where
there was already a beauty salon in the 50s. Therefore, I now have the
opportunity to carry on this tradition in a modern environment.
Become beautiful with us. We look forward to seeing you.
</p>
</div>
<div class="bem-jobb">
<img src="<?php echo base_url();?>assets/img/evelin_beauty.JPG">
<h4>Evelin Bence <br> <span>Owner, Studio Beve</span></h4>
</div>
</div>
<div class="dolgozo-nev">
<hr>
<img src="<?php echo base_url();?>assets/img/beauty/evelin/evelin.jpg" class="dolgozo-kep">
<h4>EVELIN Bence <span>- lash stylist, make up artist, PMU artist</span></h4>
</div>
<div class="bemutatkozas-dolgozo">
<div class="bem-dolgozo-bal">
<p>
My attraction and love for the profession was already evident as a child. First, I acquired the basics of makeup on myself, and then on my girlfriends. As an adult, there was no question what my path should be. I finished my studies as a beautician in 2016, and also obtained my eyelash extension qualification in the same year.
</p>
<p>
I have always strived – and still strive – to provide my guests with the fullest possible service. Therefore, I pay special attention to further training. Among my instructors you can find multiple Hungarian champion makeup artists or make-up tattooists.
</p>
<p>
My latest passion is making makeup tattoos. Today, the use of state-of-the-art technology and professional materials allows me to provide my guests with a natural, individualized look. The services in my portfolio reflect the natural direction I represent, be it makeup, makeup tattoos or even eyelashes.
</p>
<p>
I am proud that over the years I have been able to close the happy smiles of satisfied guests in my heart, in my native Ukraine, and then in Hungary. I am also pleased that although I have only been living in Norway since April 2023, I nevertheless manage to establish a good relationship with my guests and spend time with them in a good mood. I also place great emphasis on learning the magical Norwegian language so that I can talk to my guests in their native language.
</p>
<p>
I believe that continuous development, quality work and dedication help me to become a better professional day by day.
</p>
</div>
<div class="bem-dolgozo-jobb">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/1.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/2.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/3.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/4.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/5.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/evelin/6.jpg">
</div>
</div>
<!-- Ngoc-->
<div class="dolgozo-nev">
<hr>
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/kateryna.jpg" class="dolgozo-kep">
<h4>KATERYNA Kravchenko <span>- Nail artist</span></h4>
</div>
<div class="bemutatkozas-dolgozo">
<div class="bem-dolgozo-bal">
<p>
My name is Kateryna Kravchenko, I am 22 years old, originally from Ukraine, and I have been living in Norway for one year. I currently work as a nail technician at Studio Beve AS.
</p>
<p>
My interest in nails started already in childhood – I loved painting my nails, and when my mother noticed this, she signed me up for a nail technician course. Since then, this has become my passion and my profession.
</p>
<p>
I have been working with nails since 2019, and I specialize in manicure, strengthening and nail design. I love minimalism and appreciate clean, precise, and high-quality results – it’s the details that create perfection.
</p>
<p>
I truly love my job and enjoy making women’s hands even more beautiful. Comfort and quality are very important to me, and I always try to create a pleasant and relaxing atmosphere where my clients feel good and well taken care of.
</p>
<p>
I keep up with trends, constantly learn new techniques, and love to develop myself so that every treatment I perform meets the highest standards.
</p>
</div>
<div class="bem-dolgozo-jobb">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/1.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/2.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/3.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/4.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/5.jpg">
<img src="<?php echo base_url();?>assets/img/beauty/kateryna/6.jpg">
</div>
</div>
</div>
<!-- end Ngoc-->
</div>
</div>
</section>
<!-- Treatments -->
<section id="treatments" class="wrapper style2">
<div class="container">
<div class="inner">
<header class="major">
<img src="<?php echo base_url();?>assets/img/beauty/ollo_rose.png">
<h2 class="nyitva">Treatments</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">Wax</div>
<div class="sub-title-serv">arm, leg, nose, bikini line waxing</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Makeup</div>
<div class="sub-title-serv">day, special, wedding makeup</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Eyelash extension</div>
<div class="sub-title-serv">classical single, double, volume</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 base_url();?>assets/img/service-banner-beauty.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">Powder brows PMU makeup</div>
<div class="sub-title-serv">incl. one refill after 4-8 weeks</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Manicure</div>
<div class="sub-title-serv">coming soon..</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Eyebrow and eyelash styling</div>
<div class="sub-title-serv">brow lamination, Henna dying, Lash lift, forming and dying</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/beauty/ollo_rose.png">
<h2>Prices</h2>
</header>
<?php
$prevousCategory = '';
if(is_array($services)){
foreach($services as $serviceItem){
if($serviceItem->service_category != $prevousCategory){
?>
<div class="prices-category" style="width: 100%">
<h4><?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;
}
}
?>
</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/beauty/ollo_rose.png">
<h2 class="nyitva">Working Hours</h2>
<h4>Free customer parking during treatments</h4>
</header>
</div>
<div class="nyitvatartas">
<div class="about-content">
<div class="about-text-left">
<div class="title">Weekdays</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">Saturday</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">Sunday</div>
</div>
<div class="about-text-right">
<div class="closed">Closed</div>
</div>
</div>
</div>
</div>
</section>