Files
studiobeve.no/application/views/pages/includes/barber-form-no.php
T
UbuntuandClaude Opus 5 13e1b1a672 Add Amarildo to the barber page and gate workers by service
New barber Amarildo Champimpi is introduced on the barber page in all three
languages, and workers can now be restricted to a subset of the services in
their category.

Amarildo cannot perform beard colouring, any waxing, or the all-in package, and
he is a barber only - but category 1 "Kozmetika" holds 19 barber AND 27 beauty
services, so the category-derived vertical wrongly made him beauty-capable.
Because the worker picker is only ever fetched AFTER services are ticked, one
per-service capability filter solves both problems: excluding him from every
beauty service removes him from that vertical entirely.

worker_services(worker_id, service_id) is an allow-list where an EMPTY set means
UNRESTRICTED. That default is deliberate: a missing migration degrades to the
previous behaviour instead of hiding every worker from the booking flow, and
existing workers keep working untouched. Ticking every box in the admin grid
stores nothing at all, so an unrestricted worker also picks up services added
later; unticking even one makes the worker restricted, and new services must
then be granted explicitly.

Enforcement is in three places. The picker offers only workers who can perform
EVERY selected service, and both booking paths re-check server-side, since the
picker is only a UI affordance - a crafted POST now gets service_not_offered/403
rather than a booking the worker cannot honour.

Fixed alongside, all found while building the above:

- getWorkersByCategorySlug() never filtered is_active, so marking a worker
  inactive had NO effect on the public booking flow. Both of its callers are
  guest-facing. The sibling fallback getActiveWorkers() had always filtered it.
- Worker profile picture uploads failed SILENTLY above PHP's upload_max_filesize.
  Both upload blocks gated on tmp_name alone, which cannot distinguish a rejected
  upload from "no file chosen" - PHP empties tmp_name in both cases - so the
  worker was saved with an empty worker_profile_img and no error shown. The
  upload error code is now read and reported, and a separate guard catches
  post_max_size overflow, where $_POST and $_FILES both arrive empty and the form
  silently did nothing at all.
- createWorker() omitted is_active from its INSERT, so the column default (1)
  always won and a worker created as inactive silently came back active.

Migration - the table MUST be created before this code is deployed, because the
picker query subselects it whenever service ids are passed:

    CREATE TABLE worker_services (
      worker_id  INT NOT NULL,
      service_id INT NOT NULL,
      PRIMARY KEY (worker_id, service_id),
      KEY idx_worker_services_worker (worker_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Already applied on test, dev and prod. Server-side, upload_max_filesize/
post_max_size were raised to 8M/12M on all three environments (php.ini on test,
.user.ini on the shared-host dev and prod docroots) - not carried by this commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TYGSbK1erKv7VG1pvdPEjG
2026-08-24 12:07:07 +00:00

284 lines
15 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 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;?>no/booking/barber">BESTILL TIME</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>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. Vi har to private parkeringsplasser som våre gjester kan benytte gratis under behandlingen, dersom det er ledig kapasitet.
</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 SITEURL;?>assets/img/evelin.JPG">
<h4>Evelin Bence <br> <span>Eieren, 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>
"Jeg lærte å kjenne det grunnleggende om det å være barber allerede i svært ung alder, siden min mor også er barber. Fra henne klarte jeg i svært ung alder å mestre knepene i dette fantastiske yrket. Man kan si at jeg ble født inn i yrket, og jeg har offisielt vært andregenerasjons barber i noen år nå.
</p>
<p>
Jeg er stolt over å ha lært av de beste. Min mesterbarber og venn Ruben Tenkely, eier av «Peaky Barbers – Tenkely Limited Company», europacupvinner og ungarsk mester, har også skaffet seg mye erfaring internasjonalt. Han har blant annet arbeidet i en av Norges mest kjente tradisjonelle salonger, Brødrene Fevangs Barberstue. Slik lærte jeg om trender i Norge.
</p>
<p>
Jeg har bodd i Norge siden april 2023 og er ivrig etter å lære norsk. Jeg føler meg heldig som har fått muligheten til å jobbe sammen med Felipe Romero i Trondheim, som også er en utrolig kunnskapsrik barber. Hos ham kan flere av dere ha møtt og blitt kjent med meg.
</p>
<p>
Jeg deltar stadig på videreutdanninger fordi jeg tror at kontinuerlig utvikling, kvalitetsarbeid og engasjement hjelper meg til å bli en bedre fagperson dag for dag."
</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 class="dolgozo-nev">
<hr>
<img src="<?php echo SITEURL;?>assets/img/barber/amarildo/amarildo.jpg" class="dolgozo-kep">
<h4>AMARILDO Champimpi <span>- Barber</span></h4>
</div>
<div class="bemutatkozas-dolgozo no-gallery">
<div class="bem-dolgozo-bal">
<p>Jeg heter Amarildo og kommer opprinnelig fra Albania. Jeg har mer enn seks års erfaring som barber, og gjennom karrieren min har jeg jobbet både i Hellas og England. Jeg har bodd i Norge de siste tre årene, og nå er jeg glad for å bli en del av teamet hos Studio Beve.</p>
<p>Jeg spesialiserer meg på både moderne og klassiske hårklipper, samt skin fade og taper fade. Presisjon og sans for detaljer er svært viktig for meg, og jeg streber alltid etter å oppnå best mulig resultat for hver enkelt kunde.</p>
<p>Siden jeg begynte å jobbe som barber, har yrket blitt en ekte lidenskap for meg. Jeg utvikler meg kontinuerlig, lærer nye teknikker og holder meg oppdatert på de nyeste trendene og stilene.</p>
<p>For meg handler barberfaget ikke bare om å klippe håret. Det er viktig å skape en stil som virkelig passer den enkelte, og sørge for at hver kunde forlater stolen med en følelse av selvtillit og tilfredshet.</p>
<p>Jeg gleder meg til å ta med meg erfaringen jeg har opparbeidet gjennom årene, engasjementet mitt for faget og kreativiteten min til Studio Beve, og jeg ser frem til å ønske deg velkommen i stolen min.</p>
</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">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">Skjeggtrimming</div>
<div class="sub-title-serv">knivbarbering med varmt håndkle</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Barneklipp</div>
<div class="sub-title-serv">0-12 år</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Skjeggfarging</div>
<div class="sub-title-serv">skjeggfarging</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">Tradisjonell knivbarbering med varmt håndkle</div>
<div class="sub-title-serv">hele ansiktet</div>
</div>
</div>
<div class="service-text service-text2">
<div class="service-icon icon2"></div>
<div class="service-content">
<div class="main-title">Herreklipp eller Skinfade herreklipp</div>
<div class="sub-title-serv">overgang fra hodebunnen f.eks taper, low, mid eller high</div>
</div>
</div>
<div class="service-text service-text3">
<div class="service-icon icon3"></div>
<div class="service-content">
<div class="main-title">Voks</div>
<div class="sub-title-serv">nese, øre og<br> øyenbrynvoksing</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>Priser</h2>
<h4>Prisen på alle hårbehandling inkluderer hårvask og styling.<br>10% studentrabatt ved framvising av ID, kan benyttes fra mandag til torsdag.</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">Åpningstider</h2>
<h4>2 gratis kundeparkeringsplasser – ved ledig kapasitet</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>