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

285 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 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. Két privát parkolóhellyel rendelkezünk, amelyeket vendégeink a kezelés ideje alatt ingyenesen használhatnak, amennyiben van szabad hely.
</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 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>Amarildo vagyok, és Albániából érkeztem. Több mint hatéves tapasztalattal rendelkezem barberként, pályafutásom során Görögországban és Angliában is dolgoztam. Három éve élek Norvégiában, és most örömmel csatlakozom a Studio Beve csapatához.</p>
<p>Modern és klasszikus hajvágásokra, valamint skin fade és taper fade technikákra specializálódtam. A munkámban fontos számomra a precizitás és a részletekre való odafigyelés, és mindig arra törekszem, hogy minden vendégem számára a lehető legjobb eredményt érjem el.</p>
<p>Amióta barberként dolgozom, a szakmám valódi szenvedélyemmé vált. Folyamatosan fejlesztem a tudásomat, új technikákat tanulok, és igyekszem naprakész maradni a legújabb trendekkel és stílusokkal.</p>
<p>Számomra a barbering nem egyszerűen egy hajvágás elkészítéséről szól. Fontos, hogy olyan stílust alakítsak ki, amely valóban illik az adott vendéghez, és hogy mindenki magabiztosan és elégedetten távozzon a székemből.</p>
<p>Örömmel hozom a Studio Bevébe az elmúlt években megszerzett tapasztalataimat, a szakmám iránti elkötelezettségemet és a kreativitásomat, és várom, hogy hamarosan téged is üdvözölhesselek a székemben.</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">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>2 ingyenes vendégparkoló – szabad hely esetén</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>