Files
studiobeve.no/application/views/pages/includes/beauty-form-no.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

320 lines
17 KiB
PHP
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;?>no/booking/beauty">BESTILL 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>Om oss</h2>
</header>
<div class="bemutatkozas">
<div class="bem-bal">
<p>
Mitt navn er Evelin Bence, lederen og skaperen av Studio Beve. Jeg anser det som
viktig at våre gjester under oppholdet hos oss – mens de stenger ute litt av støyen
fra omverdenen – kan lade sine batterier og kan vende tilbake til hverdagen
forskjønnet både innvendig og utvendig.
</p>
<p>
Kvalitetstid, maksimal oppmerksomhet, de mest profesjonelle verktøyene, hånd
i hånd med profesjonalitet og kompetanse, utgjør grunnlaget for vår filosofi og våre
tjenester.
</p>
<p>
Jeg mener at skjønnhet, mote og trend ikke er kjønnsspesifikke, og hos oss har
derfor alle mulighet til å bli vakrere på ett sted, uavhengig av kjønn. Hos Studio
Beve Barber, Studio Beve Beauty og Studio Beve Massasje kan dere finne de tjenestene som er riktige
for dere.
</p>
<p>
Med nesten 10 års erfaring fra skjønnhetsindustrien, inkludert mange års
internasjonal erfaring, tenkte jeg det var på tide å åpne mitt eget studio her i
Trondheim i Innheredsveien 92, hvor gjestene har mulighet til å parkere gratis
under behandlingene.
</p>
<p>
Det er en ekstra glede for meg at jeg klarte å finne et tradisjonelt sted hvor det
allerede var en skjønnhetssalong på 50-tallet. Derfor har jeg nå muligheten til å
videreføre denne tradisjonen i et moderne miljø.
Bli vakker hos oss. Vi ser frem til å ønske deg velkommen.
</p>
</div>
<div class="bem-jobb">
<img src="<?php echo base_url();?>assets/img/evelin_beauty.JPG">
<h4>Evelin Bence <br> <span>Eieren, 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>- vippestylist, make up artist, PMU-artist</span></h4>
</div>
<div class="bemutatkozas-dolgozo">
<div class="bem-dolgozo-bal">
<p>
"Min tiltrekning og kjærlighet til yrket var tydelig allerede som barn. Først
tilegnet jeg meg det grunnleggende om sminke på meg selv, og senere på
venninnene mine. Og som voksen var det ingen tvil om hvilken vei jeg skulle
gå. Jeg avsluttet studiene mine i skjønnhetspleie i 2016 og fikk også min
kvalifikasjon i vippeextension samme år.
</p>
<p>
Jeg har alltid forsøkt, og streber fortsatt etter å gi mine gjester en så fullstendig
service som mulig. Derfor legger jeg særlig vekt på videreutdanning. Blant
instruktørene mine er det makeupartister og sminketatovører som har vunnet
flere ungarske mesterskap.
</p>
<p>
Min nyeste lidenskap er å lage sminketatoveringer. I dag tillater bruk av
toppmoderne teknologi og profesjonelle materialer meg å gi gjestene mine et
naturlig, individualisert utseende. Tjenestene i porteføljen min er uttrykk for den
naturlige retningen jeg representerer, det være seg sminke, sminketatoveringer
eller endog vippeextension.
</p>
<p>
Jeg er stolt over at jeg gjennom årene har kunnet ta de glade smilene til fornøyde
gjester i mitt hjerte, i mitt hjemland Ukraina, og deretter i Ungarn. Jeg er også
glad for at selv om jeg bare har bodd i Norge siden april 2023, klarer jeg likevel
å etablere et godt forhold til gjestene mine og tilbringe tiden sammen med dem i
godt humør. Jeg legger også stor vekt på å lære det magiske norske språket slik
at jeg kan snakke med gjestene mine på morsmålet deres.
</p>
<p>
Jeg tror at kontinuerlig utvikling, kvalitetsarbeid og engasjement hjelper meg til
å bli en bedre profesjonell dag for dag."
</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>- Negletekniker</span></h4>
</div>
<div class="bemutatkozas-dolgozo">
<div class="bem-dolgozo-bal">
<p>
Jeg heter Kateryna Kravchenko, jeg er 22 år gammel, kommer fra Ukraina, og har bodd i Norge i ett år. Nå jobber jeg som negletekniker ved Studio Beve AS.
</p>
<p>
Interessen min for negler startet allerede i barndommen – jeg elsket å lakke neglene mine, og da mamma la merke til det, meldte hun meg på kurs for negleteknikere. Siden da har dette blitt min store lidenskap og mitt yrke.
</p>
<p>
Jeg har jobbet med negler siden 2019, og jeg spesialiserer meg på manikyr, forsterkning og negledesign. Jeg elsker minimalisme, og verdsetter rene, presise og kvalitetsmessige resultater – det er detaljene som skaper perfeksjon.
</p>
<p>
Jeg er utrolig glad i jobben min og elsker å gjøre kvinners hender enda vakrere. For meg er komfort og kvalitet veldig viktig, og jeg prøver alltid å skape en behagelig og avslappet atmosfære, der kundene mine føler seg vel og tatt godt vare på.
</p>
<p>
Jeg følger med på trender, lærer stadig nye teknikker og elsker å utvikle meg, slik at hver behandling jeg gjør, holder høyeste standard.
</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">Behandlinger</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">Voksing</div>
<div class="sub-title-serv">arm, hele benet, nese, intim bikinilinje​ voksing</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Sminke</div>
<div class="sub-title-serv">naturlig, spesielle, bryllupssminke</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Vippeextensions</div>
<div class="sub-title-serv">klassisk singel, dobbel, volum</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">Pudderbryn PMU-tatovering</div>
<div class="sub-title-serv">inkl. én påfyll etter <br /> 4-8 uker</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Manikyr</div>
<div class="sub-title-serv">kommer snart..</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Øyenbryn- og vippestyling</div>
<div class="sub-title-serv">laminering, henna farging, vippeløft, forming og farging</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>Priser</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">Åpningstider</h2>
<h4>Gratis kunderparking under behandlingen</h4>
</header>
</div>
<div class="nyitvatartas">
<div class="about-content">
<div class="about-text-left">
<div class="title">Ukedager</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">Lørdag</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">Søndag</div>
</div>
<div class="about-text-right">
<div class="closed">Stengt</div>
</div>
</div>
</div>
</div>
</section>