Compare commits

..
10 Commits
Author SHA1 Message Date
UbuntuandClaude Opus 4.8 0fd7f7a7a5 Fix "Conflict. Timeslot is taken" raw-JSON error on booking
Customers intermittently hit a full-screen raw JSON error when booking:
{"error":"Conflict. Timeslot is taken or does not fit the service."}

booking_process() re-validates the chosen slot at submit time and returned
409/403 raw JSON. Because the public booking form is a full-page POST, that
JSON filled the whole screen.

The trigger is a double submit. After inserting the booking, booking_process()
synchronously runs two Google Calendar createEvent calls, a lunch sync, an ntfy
push and an SMTP confirmation e-mail before redirecting - several seconds - and
the submit button was never disabled. On mobile the guest taps "Send" again; the
second request arrives after the first has committed, so the slot reads as taken.

Evidence: 168 duplicate booking pairs exist in prod (same guest, slot and worker,
consecutive booking ids, including runs of four). All are from 2025, none from
2026 - the 409 guard added around May 2025 converted those silent duplicates
into today's visible error.

Prevent the double submit:
- disable the submit button and relabel it on first submit, ignore later ones
- add a hidden sendBooking field, since disabling a submit button can drop its
  name/value from the POST and booking_process() bails to the homepage without it

Handle it gracefully when it still happens:
- new _booking_error() renders a localised page in the right skin instead of raw
  JSON, replacing all six JSON responses in booking_process()
- new booking-error views for barber/beauty in no/en/hu, each with a message per
  error case and a link back to booking
- new Service_model::getBookingBySlotAndGuest(); if the guest's own booking for
  that exact slot already exists the submit is a duplicate rather than a real
  conflict, so finish normally instead of erroring. Guarded on a non-empty
  e-mail, as admin block bookings are stored with an empty guest_email.

No schema change. Verified on test, dev and prod: friendly page in all three
languages and both skins, double submit redirects to booking-finished without
creating a duplicate row, and no raw JSON in any response.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJso3iGT7TkW5tm4RSBohs
2026-07-21 16:21:53 +00:00
UbuntuandClaude Fable 5 06966a898a Add job postings section with vacancies listing and footer links
- New /ledigestilling/ index listing all open positions (split
  barber/beauty card styling)
- Three ads: negletekniker + massør (beauty design), barber (gold
  barber design with recolored CSS + assets)
- Rename ledigestilling.html -> negletekniker.html with 301 redirect
- "Ledige stillinger" footer link on barber/beauty pages (NO/EN/HU)
- Back-to-list link on each ad page

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 18:32:17 +00:00
Astral04 f45c50ae45 Upload files to "/" 2026-06-30 10:51:39 +00:00
Astral04 2c4635a1e7 Delete bloodhound_ce-1.9.1.tar.gz 2026-06-30 10:48:12 +00:00
Astral04 dbdb5d5fbe Upload files to "/" 2026-06-30 10:43:08 +00:00
UbuntuandClaude Opus 4.7 29467211c5 Redirect direct GETs of booking-process to home
Hitting /booking-process via GET (or any POST without sendBooking) fell
through past the form-submit guard and tripped three undefined-variable
warnings on the final sendEmail() call. Bail out to the site root
early, matching the pattern in manage_booking_process.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-16 08:06:43 +00:00
UbuntuandClaude Opus 4.7 f86952dc95 Filter manage-booking workers by service category
Guests modifying a booking saw every worker for the subpage, so an
eyelash booking exposed nail-only workers as switchable. Now the worker
list is scoped to the booking's service category, other-category
services are disabled in step 1, and the process handler rejects any
worker/service category mismatch to defend against crafted POSTs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-16 07:43:15 +00:00
Ubuntu 4a93b5efa0 Fix undefined array key in header on short URLs
The language switcher in barber/beauty headers reads
$currentPageUrlArray[2] unguarded after exploding REQUEST_URI on '/'.
On routes with no language prefix (e.g. POST /manage-booking-cancel
rendering the cancelled page inline), the array has only 2 elements,
triggering "Undefined array key 2" warnings and producing malformed
language links like https://studiobeve.no/en//.

Normalize the array with += [2 => '', 3 => ''] right after the explode
so indices 2 and 3 always exist.
2026-05-11 19:28:33 +00:00
UbuntuandClaude Opus 4.7 92a84aadb1 Remove dead strftime() call in worker calendar form
The strftime() result was immediately overwritten by a hardcoded
Hungarian month-name array. Drop the dead line so PHP 8.1+ stops
emitting an E_DEPRECATED warning when prod loads the worker calendar.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 11:41:47 +00:00
UbuntuandClaude Opus 4.7 e8aa9084c1 Include manage link + 24h notice in admin notification emails
Admin create/modify booking notifications now match the public
confirmation/modify emails. Admin-created bookings get a manage_token
generated; admin-modified bookings reuse the existing token (or
backfill one if missing).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 11:29:48 +00:00
29 changed files with 5431 additions and 99 deletions
+4
View File
@@ -1,6 +1,10 @@
<IfModule mod_rewrite.c>
RewriteEngine on
# Job ad renamed: ledigestilling.html -> negletekniker.html (2026-07-17)
RewriteRule ^ledigestilling/ledigestilling\.html$ /ledigestilling/negletekniker.html [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
BIN
View File
Binary file not shown.
+45 -18
View File
@@ -902,8 +902,8 @@ class Admin extends CI_Controller {
if($_POST['booking_date'] != $_POST['end_booking_date'] && $booking_date <= $end_booking_date){
for($index = 0; $index <= $diff->days; $index++){
$selectedDate = date('Y-m-d', strtotime($_POST['booking_date']. ' + '.$index.' days'));
$manageToken = bin2hex(random_bytes(16));
$bookingArray = array(
'guest_name' => $_POST['guest_name'],
'guest_email' => $_POST['guest_email'],
@@ -915,12 +915,14 @@ class Admin extends CI_Controller {
'service_ids' => serialize($selectedServiceArray),
'guest_confirmed' => '0',
'guest_confirm_code' => '1234',
'manage_token' => $manageToken,
);
$this->Service_model->createBooking($bookingArray);
}
}
else{
$manageToken = bin2hex(random_bytes(16));
$bookingArray = array(
'guest_name' => $_POST['guest_name'],
'guest_email' => $_POST['guest_email'],
@@ -932,6 +934,7 @@ class Admin extends CI_Controller {
'service_ids' => serialize($selectedServiceArray),
'guest_confirmed' => '0',
'guest_confirm_code' => '1234',
'manage_token' => $manageToken,
);
$this->Log_model->addLog('bookings', $data['currentUser']->username.' létrehoza a(z) '.$_POST['guest_name'].' nevű vendég foglalást ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$this->Service_model->createBooking($bookingArray);
@@ -976,8 +979,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Totalpris: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Administrer bestilling</a><br />';
$content .= '<br /> Dersom noe skulle dukke opp og du ikke kan komme til avtalen din, vennligst gi oss beskjed minst 24 timer i forveien, slik at vi kan gi timen videre til en annen kunde og våre kollegers tid ikke blir stående ubrukt; avbestillinger innen 24 timer, eller manglende oppmøte, vil bli belastet med full pris for behandlingen; avbestilling kan gjøres via e-post til <a href="mailto:info@studiobeve.no">info@studiobeve.no</a> eller ved å sende oss en melding på Instagram eller Facebook. Takk for forståelsen og samarbeidet!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
case 'en':
$content = 'Dear Guest,<br />';
@@ -999,8 +1005,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Total price: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Manage booking</a><br />';
$content .= '<br /> If something comes up and you cant make it to your booked appointment, please let us know at least 24 hours in advance so we can offer the time slot to another guest and our colleagues time wont remain unused; cancellations within 24 hours or no-shows will be charged the full service fee; you can cancel by emailing <a href="mailto:info@studiobeve.no">info@studiobeve.no</a>, or by sending us a message on Instagram or Facebook. Thank you for your understanding and cooperation!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
case 'hu':
$content = 'Kedves Vendégünk,<br />';
@@ -1022,8 +1031,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Összesen fizetendő: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Foglalás kezelése</a><br />';
$content .= '<br /> Kérünk, ha valami közbejön, és mégsem tudsz eljönni a lefoglalt időpontodra, jelezd nekünk legalább 24 órával előre, így más vendégnek is tudunk szabad időpontot biztosítani, és kollégáink ideje sem marad kihasználatlanul; 24 órán belüli lemondás, illetve meg nem jelenés esetén a szolgáltatás teljes díja felszámításra kerül; a lemondást az <a href="mailto:info@studiobeve.no">info@studiobeve.no</a> e-mail címen, vagy Instagram- és Facebook-üzenetben tudod megtenni. Köszönjük a megértést és az együttműködést!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' új foglalásról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
}
@@ -1114,11 +1126,11 @@ class Admin extends CI_Controller {
if($_POST['send_notification']){
$worker = $this->Service_model->getWorkerById($bookingArray['worker_id']);
$services = unserialize($bookingArray['service_ids']);
$serviceArray = array();
$emailArray = array();
if(is_array($services)){
foreach($services as $serviceItem){
$selectedService = $this->Service_model->getServiceById($serviceItem);
@@ -1127,11 +1139,17 @@ class Admin extends CI_Controller {
}
}
}
$manageToken = (isset($oldBooking) && !empty($oldBooking->manage_token)) ? $oldBooking->manage_token : '';
if(empty($manageToken)){
$manageToken = bin2hex(random_bytes(16));
$this->Service_model->updateBooking($_POST['booking_id'], array('manage_token' => $manageToken));
}
$content = '';
$email_subject ='';
switch($_POST['lang']){
case 'no':
$email_subject ='[studiobeve] Din reservasjon er endret';
@@ -1154,8 +1172,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Totalpris: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Administrer bestilling</a><br />';
$content .= '<br /> Dersom noe skulle dukke opp og du ikke kan komme til avtalen din, vennligst gi oss beskjed minst 24 timer i forveien, slik at vi kan gi timen videre til en annen kunde og våre kollegers tid ikke blir stående ubrukt; avbestillinger innen 24 timer, eller manglende oppmøte, vil bli belastet med full pris for behandlingen; avbestilling kan gjøres via e-post til <a href="mailto:info@studiobeve.no">info@studiobeve.no</a> eller ved å sende oss en melding på Instagram eller Facebook. Takk for forståelsen og samarbeidet!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról norvég nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
case 'en':
$email_subject ='[studiobeve] Your booking has changed';
@@ -1178,8 +1199,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Total price: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Manage booking</a><br />';
$content .= '<br /> If something comes up and you cant make it to your booked appointment, please let us know at least 24 hours in advance so we can offer the time slot to another guest and our colleagues time wont remain unused; cancellations within 24 hours or no-shows will be charged the full service fee; you can cancel by emailing <a href="mailto:info@studiobeve.no">info@studiobeve.no</a>, or by sending us a message on Instagram or Facebook. Thank you for your understanding and cooperation!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról angol nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
case 'hu':
$email_subject ='[studiobeve] A foglalása módosult';
@@ -1202,8 +1226,11 @@ class Admin extends CI_Controller {
$content .= '</table></td>';
$content .= '<tr><td>Összesen fizetendő: </td><td><strong>'.$totalServicePrice.' kr</strong></td></tr>';
$content .= '</table>';
$content .= '<br /><br /><a href="'.SITEURL.$_POST['lang'].'/manage-booking/'.$manageToken.'">Foglalás kezelése</a><br />';
$content .= '<br /> Kérünk, ha valami közbejön, és mégsem tudsz eljönni a lefoglalt időpontodra, jelezd nekünk legalább 24 órával előre, így más vendégnek is tudunk szabad időpontot biztosítani, és kollégáink ideje sem marad kihasználatlanul; 24 órán belüli lemondás, illetve meg nem jelenés esetén a szolgáltatás teljes díja felszámításra kerül; a lemondást az <a href="mailto:info@studiobeve.no">info@studiobeve.no</a> e-mail címen, vagy Instagram- és Facebook-üzenetben tudod megtenni. Köszönjük a megértést és az együttműködést!';
$content .= '<br />';
$content .= '<br /> STUDIOBEVE';
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
$this->Log_model->addLog('bookings', $data['currentUser']->username.' foglalás módosításról magyar nyelvű értesítést küldött a(z) '.$bookingArray['guest_email'].' email címre ('.implode(', ', $bookingArray).')', $data['currentUser']->username);
break;
}
+87 -31
View File
@@ -276,6 +276,34 @@ class Pages extends CI_Controller {
}
/**
* Render a guest-facing error page instead of raw JSON. The public booking
* form is a normal full-page POST, so whatever this outputs is what the
* customer actually sees in their browser.
*/
private function _booking_error($errorCode, $statusCode = 409){
$this->load->helper('url');
$lang = isset($_POST['lang']) && in_array($_POST['lang'], array('no', 'en', 'hu')) ? $_POST['lang'] : 'en';
$subpage = isset($_POST['subpage']) && $_POST['subpage'] != '' ? $_POST['subpage'] : 'barber';
$data = array(
'pageTitle' => '',
'selectedLang' => $lang,
'subpage' => $subpage,
'bookingErrorCode' => $errorCode
);
$this->output->set_status_header($statusCode);
if($subpage == 'beauty'){
$this->load->view('pages/beauty-booking-error', $data);
}
else{
$this->load->view('pages/barber-booking-error', $data);
}
}
public function booking_process(){
$this->load->helper('url');
$this->load->model('User_model');
@@ -284,6 +312,11 @@ class Pages extends CI_Controller {
$data['pageTitle'] = '';
$data['subpage'] = '';
if(!isset($_POST['sendBooking'])){
header('Location:'.SITEURL);
return;
}
if(isset($_POST['sendBooking'])){
//calculate finish time
$serviceStartTime = date("H:i:s", strtotime($_POST['booking_start_time']));
@@ -350,26 +383,17 @@ class Pages extends CI_Controller {
$schedule = $this->Service_model->getWorkerScheduleByDay($bookingArray['worker_id'], $weekday);
if (!$schedule) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Worker is not available on this day.']));
$this->_booking_error('worker_unavailable', 403);
return;
}
if ($bookingTime < $schedule->start_time || $bookingTime >= $schedule->end_time) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Booking time is outside worker schedule.']));
$this->_booking_error('outside_schedule', 403);
return;
}
if (!$this->Service_model->isWorkerAvailableThisWeek($bookingArray['worker_id'], $bookingDate)) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Worker only works every second week.']));
$this->_booking_error('alternate_week', 403);
return;
}
@@ -381,12 +405,27 @@ class Pages extends CI_Controller {
);
if (!is_array($available) || !in_array($bookingArray['booking_start_time'], $available)) {
$this->output
->set_status_header(409)
->set_content_type('application/json')
->set_output(json_encode([
'error' => 'Conflict. Timeslot is taken or does not fit the service.'
]));
// The guest may have submitted twice: the booking POST stays open for
// several seconds while Google Calendar and the confirmation e-mail
// run, so an impatient second tap arrives after the first already
// saved. If their own booking for this exact slot exists, that is a
// duplicate submit rather than a real conflict - finish normally.
// Guard on a non-empty e-mail: admin-created block bookings are stored
// with an empty guest_email, and must never be mistaken for the guest's
// own duplicate submit.
$guestEmail = trim($bookingArray['guest_email']);
$ownBooking = $guestEmail !== '' ? $this->Service_model->getBookingBySlotAndGuest(
$bookingArray['worker_id'],
$bookingArray['booking_date'],
$bookingArray['booking_start_time'],
$guestEmail
) : false;
if($ownBooking){
header('Location:'.SITEURL.$_POST['lang'].'/booking-finished/'.$_POST['subpage']);
return;
}
$this->_booking_error('slot_taken', 409);
return;
}
@@ -402,12 +441,7 @@ class Pages extends CI_Controller {
$closingTime = new DateTime('18:00');
if ($bookingEnd > $closingTime) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode([
'error' => 'Selected time exceeds business hours.'
]));
$this->_booking_error('after_hours', 403);
return;
}
@@ -416,12 +450,7 @@ class Pages extends CI_Controller {
$selectedDate = new DateTime($bookingArray['booking_date']);
if ($selectedDate > $maxDate) {
$this->output
->set_status_header(403)
->set_content_type('application/json')
->set_output(json_encode([
'error' => 'Bookings can only be made up to 3 months in advance.'
]));
$this->_booking_error('too_far', 403);
return;
}
@@ -753,8 +782,24 @@ class Pages extends CI_Controller {
}
$data['services'] = $this->Service_model->getAllServiceByServiceType($subpage, $lang);
$data['workers'] = $this->Service_model->getActiveWorkers($subpage);
// Filter workers to those qualified for the booking's service category,
// so the guest can't switch to a worker who doesn't perform these services.
$categorySlug = '';
if(isset($firstService) && $firstService){
$category = $this->Service_model->getServiceCategoryById($firstService->service_category_id);
if($category){
$categorySlug = $category->serv_cat_slug;
}
}
if($categorySlug !== ''){
$data['workers'] = $this->Service_model->getWorkersByCategorySlug($categorySlug);
} else {
$data['workers'] = $this->Service_model->getActiveWorkers($subpage);
}
$data['selectedServiceIds'] = is_array($serviceIds) ? $serviceIds : array();
$data['categorySlug'] = $categorySlug;
$data['worker'] = $this->Service_model->getWorkerById($booking->worker_id);
$this->load->view('pages/manage-booking', $data);
@@ -806,6 +851,17 @@ class Pages extends CI_Controller {
$lang = $_POST['lang'];
$subpage = $_POST['subpage'];
// Category match: worker must perform the selected services' category.
$submittedWorker = $this->Service_model->getWorkerById($newWorkerId);
if(!empty($selectedServiceArray) && $submittedWorker){
$firstSelectedService = $this->Service_model->getServiceById($selectedServiceArray[0]);
if($firstSelectedService && $firstSelectedService->service_category_id != $submittedWorker->service_category_id){
$this->output->set_status_header(403)->set_content_type('application/json')
->set_output(json_encode(['error' => 'Selected worker does not perform the chosen services.']));
return;
}
}
// Schedule check
$weekday = date('w', strtotime($newBookingDate));
$schedule = $this->Service_model->getWorkerScheduleByDay($newWorkerId, $weekday);
+6
View File
@@ -596,6 +596,12 @@ class Service_model extends CI_Model {
return $query->num_rows() > 0 ? $query->result()[0] : false;
}
public function getBookingBySlotAndGuest($worker_id, $booking_date, $booking_start_time, $guest_email){
$this->load->database();
$query = $this->db->query('SELECT * FROM bookings WHERE worker_id = ? AND booking_date = ? AND booking_start_time = ? AND guest_email = ? ORDER BY booking_id DESC LIMIT 1', array($worker_id, $booking_date, $booking_start_time, $guest_email));
return $query->num_rows() > 0 ? $query->row() : false;
}
public function updateBookingCalEvents($booking_id, $worker_event_id, $owner_event_id){
$this->load->database();
$this->db->query("UPDATE bookings SET gcal_event_id_worker = ?, gcal_event_id_owner = ? WHERE booking_id = ?", array($worker_event_id, $owner_event_id, $booking_id));
@@ -77,8 +77,6 @@
$startOffset = ($startDow + 6) % 7;
$today = date('Y-m-d');
$monthLabel = strftime('%Y %B', $firstDay); // Hungarian month names via locale
// Fallback: PHP intl not guaranteed; build own table
$monthNames = ['január','február','március','április','május','június','július','augusztus','szeptember','október','november','december'];
$monthLabel = $year . ' ' . $monthNames[$month - 1];
@@ -25,6 +25,7 @@
<li><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Open positions</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/barber/map.jpg"> </a>
@@ -55,6 +56,7 @@
<li><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/beve_barber" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Ledige stillinger</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/barber/map.jpg"> </a>
@@ -85,6 +87,7 @@
<li><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Állásajánlatok</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/barber/map.jpg"> </a>
@@ -117,6 +120,7 @@
<li><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Állásajánlatok</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/barber/map.jpg"> </a>
@@ -6,6 +6,7 @@
if(in_array($selectedLang, $langArray)){
$currentPageUrl = $_SERVER['REQUEST_URI'];
$currentPageUrlArray = explode('/',$currentPageUrl);
$currentPageUrlArray += array(2 => '', 3 => '');
$currentPageUrlArray[1] = $selectedLang;
switch($selectedLang){
@@ -25,6 +25,7 @@
<li><a href="https://www.facebook.com/studiobevebeauty" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.beauty/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Open positions</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/beauty/map.jpg"> </a>
@@ -55,6 +56,7 @@
<li><a href="https://www.facebook.com/studiobevebeauty" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.beauty/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Ledige stillinger</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/beauty/map.jpg"> </a>
@@ -85,6 +87,7 @@
<li><a href="https://www.facebook.com/studiobevebeauty" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.beauty/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Állásajánlatok</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/beauty/map.jpg"> </a>
@@ -117,6 +120,7 @@
<li><a href="https://www.facebook.com/studiobevebeauty" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.beauty/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
<a href="<?php echo SITEURL;?>ledigestilling/" class="footer-vacancies">Állásajánlatok</a>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Studio+Beve/@63.4370671,10.4348909,19z/data=!3m1!4b1!4m6!3m5!1s0x466d31f2b1166d2b:0x76228adf28216c74!8m2!3d63.4370671!4d10.4355346!16s%2Fg%2F11vlvkh6w4?entry=ttu" target="_blank"><img src="<?php echo SITEURL;?>/assets/img/beauty/map.jpg"> </a>
@@ -8,6 +8,7 @@
if(in_array($selectedLang, $langArray)){
$currentPageUrl = $_SERVER['REQUEST_URI'];
$currentPageUrlArray = explode('/',$currentPageUrl);
$currentPageUrlArray += array(2 => '', 3 => '');
$currentPageUrlArray[1] = $selectedLang;
switch($selectedLang){
+12
View File
@@ -0,0 +1,12 @@
<?php
include(getcwd().'/application/views/includes/barber-skeleton-top.php');
$langArray = array('en', 'hu', 'no');
if(in_array($selectedLang, $langArray)){
include(getcwd().'/application/views/pages/includes/booking-error-form-'.$selectedLang.'.php');
}
else{
include(getcwd().'/application/views/pages/includes/booking-error-form-en.php');
}
include(getcwd().'/application/views/includes/barber-skeleton-bottom.php');
?>
+12
View File
@@ -0,0 +1,12 @@
<?php
include(getcwd().'/application/views/includes/beauty-skeleton-top.php');
$langArray = array('en', 'hu', 'no');
if(in_array($selectedLang, $langArray)){
include(getcwd().'/application/views/pages/includes/booking-error-form-'.$selectedLang.'.php');
}
else{
include(getcwd().'/application/views/pages/includes/booking-error-form-en.php');
}
include(getcwd().'/application/views/includes/beauty-skeleton-bottom.php');
?>
+25
View File
@@ -0,0 +1,25 @@
<?php
$bookingErrorMessages = array(
'slot_taken' => 'This time slot was taken while you were filling in the form. Please choose another time.',
'worker_unavailable' => 'The selected staff member is not working on this day. Please choose another day.',
'outside_schedule' => 'The selected time is outside the staff member\'s working hours. Please choose another time.',
'alternate_week' => 'The selected staff member only works every second week. Please choose another day.',
'after_hours' => 'The treatment would not finish before closing time. Please choose an earlier time.',
'too_far' => 'Bookings can only be made up to 3 months in advance.',
'default' => 'Something went wrong with your booking. Please try again.',
);
$shownError = isset($bookingErrorCode) && isset($bookingErrorMessages[$bookingErrorCode])
? $bookingErrorMessages[$bookingErrorCode]
: $bookingErrorMessages['default'];
$backSubpage = isset($subpage) && $subpage != '' ? $subpage : 'barber';
$backUrl = SITEURL.'en/booking/'.$backSubpage;
?>
<div class="bookingContainer" style="min-height:500px;">
<div class="bookingThankYouTitle">This time is no longer available</div>
<div class="bookingThankYouMessageTitle"><?php echo $shownError;?></div>
<div style="text-align:center; margin-top:30px;">
<a href="<?php echo $backUrl;?>" style="display:inline-block; padding:12px 28px; background:#000; color:#fff; text-decoration:none; border-radius:5px; font-size:16px;">Back to booking</a>
</div>
</div>
+25
View File
@@ -0,0 +1,25 @@
<?php
$bookingErrorMessages = array(
'slot_taken' => 'Ezt az időpontot sajnos lefoglalták, amíg az űrlapot kitöltötte. Kérjük, válasszon másik időpontot.',
'worker_unavailable' => 'A kiválasztott kolléga ezen a napon nem dolgozik. Kérjük, válasszon másik napot.',
'outside_schedule' => 'A kiválasztott időpont a kolléga munkaidején kívül esik. Kérjük, válasszon másik időpontot.',
'alternate_week' => 'A kiválasztott kolléga csak kéthetente dolgozik. Kérjük, válasszon másik napot.',
'after_hours' => 'A kezelés nem érne véget zárásig. Kérjük, válasszon korábbi időpontot.',
'too_far' => 'Foglalás legfeljebb 3 hónappal előre adható le.',
'default' => 'Hiba történt a foglalás során. Kérjük, próbálja újra.',
);
$shownError = isset($bookingErrorCode) && isset($bookingErrorMessages[$bookingErrorCode])
? $bookingErrorMessages[$bookingErrorCode]
: $bookingErrorMessages['default'];
$backSubpage = isset($subpage) && $subpage != '' ? $subpage : 'barber';
$backUrl = SITEURL.'hu/booking/'.$backSubpage;
?>
<div class="bookingContainer" style="min-height:500px;">
<div class="bookingThankYouTitle">Ez az időpont már nem foglalható</div>
<div class="bookingThankYouMessageTitle"><?php echo $shownError;?></div>
<div style="text-align:center; margin-top:30px;">
<a href="<?php echo $backUrl;?>" style="display:inline-block; padding:12px 28px; background:#000; color:#fff; text-decoration:none; border-radius:5px; font-size:16px;">Vissza a foglaláshoz</a>
</div>
</div>
+25
View File
@@ -0,0 +1,25 @@
<?php
$bookingErrorMessages = array(
'slot_taken' => 'Dette tidspunktet ble dessverre opptatt mens du fylte ut skjemaet. Vennligst velg et annet tidspunkt.',
'worker_unavailable' => 'Den valgte medarbeideren jobber ikke denne dagen. Vennligst velg en annen dag.',
'outside_schedule' => 'Det valgte tidspunktet er utenfor medarbeiderens arbeidstid. Vennligst velg et annet tidspunkt.',
'alternate_week' => 'Den valgte medarbeideren jobber kun annenhver uke. Vennligst velg en annen dag.',
'after_hours' => 'Behandlingen rekker ikke å bli ferdig innen stengetid. Vennligst velg et tidligere tidspunkt.',
'too_far' => 'Du kan kun bestille time inntil 3 måneder frem i tid.',
'default' => 'Noe gikk galt med bestillingen. Vennligst prøv igjen.',
);
$shownError = isset($bookingErrorCode) && isset($bookingErrorMessages[$bookingErrorCode])
? $bookingErrorMessages[$bookingErrorCode]
: $bookingErrorMessages['default'];
$backSubpage = isset($subpage) && $subpage != '' ? $subpage : 'barber';
$backUrl = SITEURL.'no/booking/'.$backSubpage;
?>
<div class="bookingContainer" style="min-height:500px;">
<div class="bookingThankYouTitle">Tidspunktet er ikke lenger tilgjengelig</div>
<div class="bookingThankYouMessageTitle"><?php echo $shownError;?></div>
<div style="text-align:center; margin-top:30px;">
<a href="<?php echo $backUrl;?>" style="display:inline-block; padding:12px 28px; background:#000; color:#fff; text-decoration:none; border-radius:5px; font-size:16px;">Tilbake til bestilling</a>
</div>
</div>
@@ -187,6 +187,7 @@
<div class="bookingButtonContainer">
<input type="button" class="leftButton bookingButton" onclick="goToStep(3);" value="Back"/>
<input type="hidden" name="subpage" value="<?php echo $subpage;?>">
<input type="hidden" name="sendBooking" value="1">
<input type="submit" id="sendBooking" class="rightButton bookingSubmit" for="bookingStepForm" name="sendBooking" value="Send"/>
</div>
@@ -200,6 +201,19 @@
<script>
$(document).ready(function(){
// Prevent double submission. The booking POST stays open for several
// seconds (Google Calendar + confirmation e-mail), so an impatient
// second tap used to hit the server as a separate booking attempt.
var bookingSubmitInProgress = false;
$('#sendBooking').closest('form').on('submit', function(e){
if(bookingSubmitInProgress){
e.preventDefault();
return false;
}
bookingSubmitInProgress = true;
$('#sendBooking').prop('disabled', true).val('Sending...');
});
$('#booking_time').change(function(){
if($('#booking_time').val() != ''){
$('#isTimeSelectedBtn').prop('disabled', false);
@@ -188,6 +188,7 @@
<div class="bookingButtonContainer">
<input type="button" class="leftButton bookingButton" onclick="goToStep(3);" value="Vissza"/>
<input type="hidden" name="subpage" value="<?php echo $subpage;?>">
<input type="hidden" name="sendBooking" value="1">
<input type="submit" id="sendBooking" class="rightButton bookingSubmit" for="bookingStepForm" name="sendBooking" value="Elküld"/>
</div>
</div>
@@ -199,6 +200,19 @@
<script>
$(document).ready(function(){
// Prevent double submission. The booking POST stays open for several
// seconds (Google Calendar + confirmation e-mail), so an impatient
// second tap used to hit the server as a separate booking attempt.
var bookingSubmitInProgress = false;
$('#sendBooking').closest('form').on('submit', function(e){
if(bookingSubmitInProgress){
e.preventDefault();
return false;
}
bookingSubmitInProgress = true;
$('#sendBooking').prop('disabled', true).val('Küldés...');
});
$('#booking_time').change(function(){
if($('#booking_time').val() != ''){
$('#isTimeSelectedBtn').prop('disabled', false);
@@ -188,6 +188,7 @@ if (is_array($services) && count($services) > 0) {
<div class="bookingButtonContainer">
<input type="button" class="leftButton bookingButton" onclick="goToStep(3);" value="Tilbake"/>
<input type="hidden" name="subpage" value="<?php echo $subpage;?>">
<input type="hidden" name="sendBooking" value="1">
<input type="submit" id="sendBooking" class="rightButton bookingSubmit" for="bookingStepForm" name="sendBooking" value="Sende"/>
</div>
</div>
@@ -199,6 +200,19 @@ if (is_array($services) && count($services) > 0) {
<script>
$(document).ready(function(){
// Prevent double submission. The booking POST stays open for several
// seconds (Google Calendar + confirmation e-mail), so an impatient
// second tap used to hit the server as a separate booking attempt.
var bookingSubmitInProgress = false;
$('#sendBooking').closest('form').on('submit', function(e){
if(bookingSubmitInProgress){
e.preventDefault();
return false;
}
bookingSubmitInProgress = true;
$('#sendBooking').prop('disabled', true).val('Sender...');
});
$('#booking_time').change(function(){
if($('#booking_time').val() != ''){
$('#isTimeSelectedBtn').prop('disabled', false);
+3 -1
View File
@@ -338,6 +338,7 @@
<?php
foreach($groups[$label] as $serviceItem){
$isChecked = in_array($serviceItem->service_id, $selectedServiceIds);
$isOtherCategory = ($categorySlug !== '' && $serviceItem->serv_cat_slug !== $categorySlug);
?>
<div class="serviceRow">
<div class="serviceCol serviceNameCol" id="serviceName_<?php echo $serviceItem->service_id; ?>">
@@ -362,7 +363,8 @@
id="<?php echo $serviceItem->service_id; ?>"
name="service_<?php echo $serviceItem->service_id; ?>"
value="1"
<?php echo $isChecked ? 'checked' : ''; ?>/>
<?php echo $isChecked ? 'checked' : ''; ?>
<?php echo $isOtherCategory ? 'disabled' : ''; ?>/>
</div>
</div>
<?php
+12
View File
@@ -623,3 +623,15 @@
.prices-category{
margin-bottom:0px;
}
/* Footer: open positions button */
.footer-vacancies {
display: inline-block;
margin-top: 0.75em;
color: #fff !important;
font-weight: bold;
text-decoration: underline;
}
.footer-vacancies:hover {
text-decoration: none;
}
File diff suppressed because it is too large Load Diff
+11 -1
View File
@@ -4167,4 +4167,14 @@ input, select, textarea {
width: 5px;
}
}
}
/* back link to vacancies index */
.back-to-list {
display: inline-block;
margin-bottom: 1.5em;
color: #a5705b !important;
font-weight: bold;
text-decoration: none;
border-bottom: none !important;
}
.back-to-list:hover { text-decoration: underline; }
+336
View File
@@ -0,0 +1,336 @@
<!DOCTYPE HTML>
<!--
Catalyst by Pixelarity
pixelarity.com | hello@pixelarity.com
License: pixelarity.com/license
-->
<html lang="no">
<head>
<title>Studio Beve - Ledig stilling: Barber</title>
<meta charset="utf-8" />
<link rel="icon" type="image/x-icon" href="images/favicon/favicon.ico" />
<link rel="icon" type="image/png" href="images/favicon/favicon.png" />
<link rel="icon" type="image/gif" href="images/favicon/favicon.gif" />
<!-- Opera Speed Dial Favicon -->
<link rel="icon" type="image/png" href="images/favicon/speeddial-160px.png" />
<!-- For iPhone 4 Retina display: -->
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="images/favicon/apple-touch-icon-114x114-precomposed.png">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main-barber.css" />
<link href="https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Open+Sans:ital,wght@0,700;0,800;1,700;1,800&display=swap" rel="stylesheet">
</head>
<body class="is-preload">
<div id="page-wrapper">
<!-- Header -->
<header id="header">
<a href="https://studiobeve.no/no/barber"><img src="images/logo_gold.png" class="logo-kep"></a> <h1>- BARBER</h1>
<nav id="nav">
<ul>
<li><a href="https://studiobeve.no/no/barber">Forside</a></li>
<li><a href="https://studiobeve.no/no/barber#aboutus">Om oss</a></li>
<li><a href="https://studiobeve.no/no/barber#treatments">Behandlinger</a></li>
<li><a href="https://studiobeve.no/no/barber#one">Priser</a></li>
<li><a href="https://studiobeve.no/no/barber#two">Åpningstider</a></li>
<li><a href="https://studiobeve.no/no/barber#footer">Kontakt</a></li>
<li class="booktime"><a href="https://studiobeve.no/no/booking/barber">BESTILL TIME</a></li>
<li class="socialmedia-menu"><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li class="socialmedia-menu"><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
<li class="language"><a href="https://studiobeve.no/en/barber/">EN</a></li>
<li class="language"><a href="https://studiobeve.no/hu/barber/">HU</a></li>
</ul>
</nav>
</header>
<!-- Banner -->
<section id="banner">
<img src="images/banner_barber.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="#">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">
<a href="./" class="back-to-list">&larr; Alle ledige stillinger</a>
<header class="major">
<img src="images/ollo.png">
<h2>Er du en dyktig barber?</h2>
</header>
<div class="bemutatkozas">
<div class="hirdetes">
<p>
<strong>Hos Studio Beve tilbyr vi flere samarbeidsformer, slik at du kan velge den løsningen som passer deg best.</strong>
</p>
<p>
Studio Beve AS er en moderne skjønnhetssalong i Trondheim, lokalisert i Innherredsveien 92, i et sentralt, lett tilgjengelig og godt besøkt område. Salongen har vært i drift i over to år og har utviklet seg jevnt siden oppstarten. Vi har en stabil og stadig voksende kundebase, et profesjonelt arbeidsmiljø, moderne lokaler, utstyr av høy kvalitet og et velfungerende online bookingsystem.
</p>
<p>
En av våre viktigste tjenester er barber. I tillegg tilbyr vi vippeextensions, PMU, styling av vipper og bryn, hudpleiebehandlinger, voksing og neglebehandlinger. På grunn av økende etterspørsel etter våre barbertjenester ønsker vi nå å videreutvikle og styrke dette området.
</p>
<p>
Derfor søker vi en erfaren og motivert barber som ønsker å bli en del av et stabilt og voksende salongmiljø på lang sikt.
</p>
<b>Samarbeidsmuligheter:</b>
<p>
Vi vet at ulike barberer har forskjellige ønsker og behov. Derfor tilbyr vi tre ulike samarbeidsformer.
</p>
<b>1. Ansettelse</b>
<ul>
<li>Bruttolønn fra 280 NOK per time.</li>
<li>Arbeidstid og lønnsberegning følger behandlingenes normtid.</li>
<li>Fleksibel arbeidstid tilpasset bookingene.</li>
</ul>
<b>2. Stolleie</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Fast månedlig leie.</li>
<li>Mulighet til å bygge opp egen kundebase.</li>
<li>Mulighet til å ta imot både egne kunder og kunder fra salongen.</li>
</ul>
<b>3. Provisjonsbasert samarbeid</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Ingen fast leiekostnad.</li>
<li>Provisjonsbasert avregning.</li>
<li>En god løsning for deg som ønsker å bygge opp kundebasen gradvis.</li>
</ul>
<p>
Samarbeidsform og økonomiske betingelser avtales individuelt ut fra erfaring, kompetanse og valgt samarbeidsmodell.
</p>
<b>Vi tilbyr:</b>
<ul>
<li>Et hyggelig og inkluderende arbeidsmiljø i en moderne salong.</li>
<li>Moderne og stilrene lokaler.</li>
<li>Profesjonelt utstyr.</li>
<li>Ved samarbeid som selvstendig næringsdrivende tilbyr vi mulighet til å bygge opp egen kundebase, med støtte fra salongens aktive markedsføring ved behov.</li>
<li>Gode muligheter for både faglig og personlig utvikling.</li>
<li>Fleksibel arbeidstid.</li>
</ul>
<b>Personlige egenskaper:</b>
<ul>
<li>Serviceinnstilt og kundeorientert.</li>
<li>Punktlig og pålitelig.</li>
<li>Fleksibel og tilpasningsdyktig.</li>
<li>Positiv, engasjert og lidenskapelig opptatt av barberfaget.</li>
<li>Nøyaktig og kvalitetsbevisst.</li>
</ul>
<b>Kvalifikasjoner:</b>
<ul>
<li>Utdannet barber eller tilsvarende dokumentert erfaring.</li>
<li>Erfaring med herreklipp, skjeggforming og barbering.</li>
<li>Behersker både klassiske og moderne barberteknikker.</li>
<li>Gode kommunikasjonsevner på norsk eller engelsk.</li>
<li>Evne til å arbeide selvstendig og samtidig bidra positivt i et team.</li>
<li>Fokus på kvalitet og gode kundeopplevelser.</li>
<li>Ansvarsbevisst og profesjonell.</li>
</ul>
<b>Arbeidsoppgaver:</b>
<ul>
<li>Utføre profesjonelle herreklipper.</li>
<li>Klippe, forme og trimme skjegg.</li>
<li>Gi råd om hår- og skjeggpleie.</li>
<li>Sørge for god hygiene og orden på arbeidsplassen.</li>
<li>Bidra til å gi kundene en førsteklasses opplevelse.</li>
</ul>
<p>
<b>Om Studio Beve:</b><br />
Vi er en skjønnhetssalong som tilbyr behandlinger for både kvinner og menn. Det er viktig for oss at gjestene våre får muligheten til å koble av fra hverdagens stress, hente ny energi og forlate salongen med følelsen av å være både mer velstelte og ha økt velvære, både innvendig og utvendig.
</p>
<p>
Kvalitetstid, personlig oppfølging, de mest profesjonelle verktøyene, høy faglig kompetanse og profesjonalitet danner grunnlaget for vår filosofi og våre tjenester.
</p>
<p>
Vi mener at skjønnhet, stil og velvære ikke er knyttet til kjønn. Hos oss skal alle føle seg velkomne og finne behandlingene som passer akkurat deres behov.
</p>
<p>
<b>Tiltredelse:</b><br /> Etter avtale.
</p>
<p>
<b>Hvordan søke:</b><br />
Send oss:
</p>
<ul>
<li>CV</li>
<li>Bilder av arbeidet ditt</li>
<li>En kort søknad</li>
</ul>
<p>
til: <a href="mailto:evelin@studiobeve.no">evelin@studiobeve.no</a>
</p>
<p>
Vi ber deg oppgi hvilken samarbeidsform du er interessert i når du søker.
</p>
<p>
Vi ser frem til å høre fra deg!
</p>
<p>
<b>Kontaktperson:</b> <br />
Evelin Bence<br />
Daglig leder<br />
Studio Beve AS<br />
</p>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer id="footer">
<div class="container footer-div">
<div class="footer-bal">
<div class="contact-block">
<!--img src="../images/logo_white.png" class="footer-logo"-->
<ul>
<li class="companyname"><span>Studio Beve</span></li>
<li><span>Innherredsveien 92.<br> 7043 Trondheim, Norge</span></li>
<li><span>Organisasjonsnummer: 931 872 338</span></li>
<li><span><a href="mailto:info@studiobeve.no">info@studiobeve.no</a></span></li>
</ul>
</div>
<ul class="icons">
<li><a href="https://www.facebook.com/studiobevebarber" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/studio.beve.barber/" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Innherredsveien+92,+7043+Trondheim,+Norway/@63.4369352,10.4350889,17z/data=!4m6!3m5!1s0x466d3199df480755:0xc8a07a1d27083152!8m2!3d63.4373339!4d10.4353781!16s%2Fg%2F11h26_1cnn?entry=ttu" target="_blank"><img src="images/map.jpg"> </a>
</div>
</div>
<div class="copyright">
&copy; Studio Beve - Alle Rettigheter Forbeholdt
</div>
</footer>
</div>
<!-- Scripts -->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/jquery.dropotron.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

+187
View File
@@ -0,0 +1,187 @@
<!DOCTYPE HTML>
<html lang="no">
<head>
<title>Studio Beve - Ledige stillinger</title>
<meta charset="utf-8" />
<link rel="icon" type="image/x-icon" href="images/favicon/favicon.ico" />
<link rel="icon" type="image/png" href="images/favicon/favicon.png" />
<link rel="icon" type="image/gif" href="images/favicon/favicon.gif" />
<!-- Opera Speed Dial Favicon -->
<link rel="icon" type="image/png" href="images/favicon/speeddial-160px.png" />
<!-- For iPhone 4 Retina display: -->
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="images/favicon/apple-touch-icon-114x114-precomposed.png">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<link href="https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Open+Sans:ital,wght@0,700;0,800;1,700;1,800&display=swap" rel="stylesheet">
<style>
#header h1 { color: #4a4a4a; }
.positions { display: flex; flex-wrap: wrap; gap: 2em; justify-content: center; margin-top: 2em; }
.position-card { flex: 1 1 260px; max-width: 340px; border: 1px solid; padding: 2em 1.5em 2.5em 1.5em; text-align: center; }
.position-card .badge { display: inline-block; font-size: 0.75em; letter-spacing: 0.15em; font-weight: bold; padding: 0.3em 1.2em; margin-bottom: 1.2em; color: #fff; }
.position-card h3 { margin: 0 0 0.75em 0; }
.position-card p { margin-bottom: 1.5em; }
.position-card .lesmer { display: inline-block; padding: 0.6em 1.8em; color: #fff !important; font-weight: bold; text-transform: uppercase; text-decoration: none; letter-spacing: 0.08em; border-bottom: none; }
.position-card .lesmer:hover { opacity: 0.85; }
.card-beauty { border-color: #a5705b; background-color: #fff7f5; }
.card-beauty .badge, .card-beauty .lesmer { background-color: #a5705b; }
.card-barber { border-color: #9e8462; background-color: #fff9f0; }
.card-barber .badge, .card-barber .lesmer { background-color: #9e8462; }
.ollo-pair img { margin: 0 0.5em; }
</style>
</head>
<body class="is-preload">
<div id="page-wrapper">
<!-- Header -->
<header id="header">
<a href="https://studiobeve.no/"><img src="images/logo.png" class="logo-kep"></a> <h1>- LEDIGE STILLINGER</h1>
<nav id="nav">
<ul>
<li><a href="https://studiobeve.no/">Forside</a></li>
<li><a href="https://studiobeve.no/no/barber">Barber</a></li>
<li><a href="https://studiobeve.no/no/beauty">Beauty</a></li>
<li><a href="#footer">Kontakt</a></li>
<li class="socialmedia-menu"><a href="https://www.facebook.com/bevelash/" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li class="socialmedia-menu"><a href="https://www.instagram.com/beve_barber" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
</ul>
</nav>
</header>
<!-- Open positions -->
<section id="aboutus" class="wrapper style1">
<div class="container">
<div class="inner">
<header class="major">
<div class="ollo-pair">
<img src="images/ollo.png"><img src="images/ollo_rose.png">
</div>
<h2>Ledige stillinger</h2>
</header>
<p style="text-align: center;">
Bli en del av teamet hos Studio Beve! Vi søker nå nye kollegaer til salongen vår i Innherredsveien 92 i Trondheim.
</p>
<div class="positions">
<div class="position-card card-barber">
<span class="badge">BARBER</span>
<h3>Barber</h3>
<p>Er du en dyktig barber? Ansettelse, stolleie eller provisjonsbasert samarbeid.</p>
<a href="barber.html" class="lesmer">Les mer</a>
</div>
<div class="position-card card-beauty">
<span class="badge">BEAUTY</span>
<h3>Negletekniker</h3>
<p>Er du en dyktig negletekniker? Ansettelse, stolleie eller provisjonsbasert samarbeid.</p>
<a href="negletekniker.html" class="lesmer">Les mer</a>
</div>
<div class="position-card card-beauty">
<span class="badge">BEAUTY</span>
<h3>Massør</h3>
<p>Er du en erfaren massør? Ansettelse, leie av behandlingsrom eller provisjonsbasert samarbeid.</p>
<a href="massor.html" class="lesmer">Les mer</a>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer id="footer">
<div class="container footer-div">
<div class="footer-bal">
<div class="contact-block">
<ul>
<li class="companyname"><span>Studio Beve</span></li>
<li><span>Innherredsveien 92.<br> 7043 Trondheim, Norge</span></li>
<li><span>Organisasjonsnummer: 931 872 338</span></li>
<li><span><a href="mailto:info@studiobeve.no">info@studiobeve.no</a></span></li>
</ul>
</div>
<ul class="icons">
<li><a href="https://www.facebook.com/bevelash/" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/beve_barber" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Innherredsveien+92,+7043+Trondheim,+Norway/@63.4369352,10.4350889,17z/data=!4m6!3m5!1s0x466d3199df480755:0xc8a07a1d27083152!8m2!3d63.4373339!4d10.4353781!16s%2Fg%2F11h26_1cnn?entry=ttu" target="_blank"><img src="images/map.jpg"> </a>
</div>
</div>
<div class="copyright">
&copy; Studio Beve - Alle Rettigheter Forbeholdt
</div>
</footer>
</div>
<!-- Scripts -->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/jquery.dropotron.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
+334
View File
@@ -0,0 +1,334 @@
<!DOCTYPE HTML>
<!--
Catalyst by Pixelarity
pixelarity.com | hello@pixelarity.com
License: pixelarity.com/license
-->
<html lang="no">
<head>
<title>Studio Beve - Ledig stilling: Massør</title>
<meta charset="utf-8" />
<link rel="icon" type="image/x-icon" href="images/favicon/favicon.ico" />
<link rel="icon" type="image/png" href="images/favicon/favicon.png" />
<link rel="icon" type="image/gif" href="images/favicon/favicon.gif" />
<!-- Opera Speed Dial Favicon -->
<link rel="icon" type="image/png" href="images/favicon/speeddial-160px.png" />
<!-- For iPhone 4 Retina display: -->
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="images/favicon/apple-touch-icon-114x114-precomposed.png">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<link href="https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Open+Sans:ital,wght@0,700;0,800;1,700;1,800&display=swap" rel="stylesheet">
</head>
<body class="is-preload">
<div id="page-wrapper">
<!-- Header -->
<header id="header">
<a href="https://studiobeve.no/no/beauty"><img src="images/logo.png" class="logo-kep"></a> <h1>- BEAUTY</h1>
<nav id="nav">
<ul>
<li><a href="https://studiobeve.no/no/beauty">Forside</a></li>
<li><a href="https://studiobeve.no/no/beauty#aboutus">Om oss</a></li>
<li><a href="https://studiobeve.no/no/beauty#treatments">Behandlinger</a></li>
<li><a href="https://studiobeve.no/no/beauty#one">Priser</a></li>
<li><a href="https://studiobeve.no/no/beauty#two">Åpningstider</a></li>
<li><a href="https://studiobeve.no/no/beauty#footer">Kontakt</a></li>
<li class="booktime"><a href="https://studiobeve.no/no/booking/beauty">BESTILL TIME</a></li>
<li class="socialmedia-menu"><a href="https://www.facebook.com/bevelash/" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li class="socialmedia-menu"><a href="https://www.instagram.com/beve_barber" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
<li class="language"><a href="https://studiobeve.no/en/beauty/">EN</a></li>
<li class="language"><a href="https://studiobeve.no/hu/beauty/">HU</a></li>
</ul>
</nav>
</header>
<!-- Banner -->
<section id="banner">
<img src="images/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="#">BESTILL TIME</a></li>
<li class=""><a href="https://www.facebook.com/bevelash/" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li class=""><a href="https://www.instagram.com/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">
<a href="./" class="back-to-list">&larr; Alle ledige stillinger</a>
<header class="major">
<img src="images/ollo_rose.png">
<h2>Er du en erfaren massør? Bli en del av teamet hos Studio Beve!</h2>
</header>
<div class="bemutatkozas">
<div class="hirdetes">
<p>
<strong>Hos Studio Beve tilbyr vi flere samarbeidsformer, slik at du kan velge den løsningen som passer deg best.</strong>
</p>
<p>
Studio Beve AS er en moderne skjønnhetssalong i Trondheim, lokalisert i Innherredsveien 92, i et sentralt, lett tilgjengelig og godt besøkt område. Salongen har vært i drift i over to år og har utviklet seg jevnt siden oppstarten. Vi har en stabil og stadig voksende kundebase, et profesjonelt arbeidsmiljø, moderne lokaler, utstyr av høy kvalitet og et velfungerende online bookingsystem.
</p>
<p>
Våre tjenester inkluderer blant annet barber, hudpleie, neglebehandlinger, vippeextensions, PMU, styling av vipper og bryn, samt voksing. Vi opplever en økende etterspørsel etter profesjonell massasje fra både kvinnelige og mannlige kunder, og ønsker derfor å introdusere denne tjenesten i salongen. Derfor søker vi en erfaren og motivert massør som ønsker å bli en del av et stabilt og voksende salongmiljø på lang sikt.
</p>
<b>Samarbeidsmuligheter:</b>
<p>
Vi vet at ulike massører har forskjellige ønsker og behov. Derfor tilbyr vi tre ulike samarbeidsformer.
</p>
<b>1. Ansettelse</b>
<ul>
<li>Bruttolønn på 300 NOK per time.</li>
<li>Arbeidstid og lønnsberegning følger behandlingenes normtid.</li>
<li>Fleksibel arbeidstid tilpasset bookingene.</li>
</ul>
<b>2. Leie av behandlingsrom</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Fast månedlig leie.</li>
<li>Mulighet til å bygge opp egen kundebase.</li>
<li>Mulighet til å ta imot både egne kunder og kunder fra salongen.</li>
</ul>
<b>3. Provisjonsbasert samarbeid</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Ingen fast leiekostnad.</li>
<li>Provisjonsbasert avregning.</li>
<li>En god løsning for deg som ønsker å bygge opp kundebasen gradvis.</li>
</ul>
<p>
Samarbeidsform og økonomiske betingelser avtales individuelt ut fra erfaring, kompetanse og valgt samarbeidsmodell.
</p>
<b>Vi tilbyr:</b>
<ul>
<li>Eget, separat behandlingsrom som er dedikert til massasjebehandlinger.</li>
<li>Et hyggelig og inkluderende arbeidsmiljø i en moderne salong.</li>
<li>Moderne og stilrene lokaler.</li>
<li>Profesjonelt utstyr.</li>
<li>Ved samarbeid som selvstendig næringsdrivende tilbyr vi mulighet til å bygge opp egen kundebase, med støtte fra salongens aktive markedsføring ved behov.</li>
<li>Muligheten til å bidra aktivt i utviklingen og oppbyggingen av Studio Beves nye massasjetilbud.</li>
<li>Gode muligheter for både faglig og personlig utvikling.</li>
<li>Fleksibel arbeidstid.</li>
</ul>
<b>Personlige egenskaper:</b>
<ul>
<li>Serviceinnstilt og kundeorientert.</li>
<li>Punktlig og pålitelig.</li>
<li>Fleksibel og tilpasningsdyktig.</li>
<li>Positiv, engasjert og lidenskapelig opptatt av faget.</li>
<li>Nøyaktig og kvalitetsbevisst.</li>
</ul>
<b>Kvalifikasjoner:</b>
<ul>
<li>Utdanning som massør.</li>
<li>Erfaring med ulike massasjeteknikker.</li>
<li>Høy bevissthet rundt hygiene og kvalitet.</li>
<li>Gode kommunikasjonsevner på norsk eller engelsk.</li>
<li>Evne til å arbeide selvstendig og samtidig bidra positivt i et team.</li>
<li>Fokus på kvalitet og gode kundeopplevelser.</li>
<li>Ansvarsbevisst og profesjonell.</li>
</ul>
<b>Arbeidsoppgaver:</b>
<ul>
<li>Utføre profesjonelle massasjebehandlinger.</li>
<li>Kartlegge kundenes behov og tilpasse behandlingene individuelt.</li>
<li>Veilede kunder om behandlinger og restitusjon.</li>
<li>Sørge for god hygiene og orden på behandlingsrommet.</li>
<li>Bidra til å opprettholde Studio Beves høye faglige standard.</li>
</ul>
<p>
<b>Om Studio Beve:</b><br />
Vi er en skjønnhetssalong som tilbyr behandlinger for både kvinner og menn. Det er viktig for oss at gjestene våre får muligheten til å koble av fra hverdagens stress, hente ny energi og forlate salongen med en følelse av å ha det bedre både fysisk og mentalt.
</p>
<p>
Kvalitetstid, personlig oppfølging, profesjonelt utstyr, høy faglig kompetanse og profesjonalitet danner grunnlaget for vår filosofi og våre tjenester.
</p>
<p>
Vi mener at skjønnhet, velvære og egenpleie ikke er knyttet til kjønn. Hos oss skal alle føle seg velkomne og finne behandlingene som passer akkurat deres behov.
</p>
<p>
<b>Tiltredelse:</b><br /> Etter avtale.
</p>
<p>
<b>Hvordan søke:</b><br />
Send oss:
</p>
<ul>
<li>CV</li>
<li>En kort søknad</li>
</ul>
<p>
Søknaden sendes til: <a href="mailto:evelin@studiobeve.no">evelin@studiobeve.no</a>
</p>
<p>
Vi ber deg oppgi hvilken samarbeidsform du er interessert i når du søker.
</p>
<p>
Vi ser frem til å høre fra deg!
</p>
<p>
<b>Kontaktperson:</b> <br />
Evelin Bence<br />
Daglig leder<br />
Studio Beve AS<br />
</p>
</div>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer id="footer">
<div class="container footer-div">
<div class="footer-bal">
<div class="contact-block">
<!--img src="../images/logo_white.png" class="footer-logo"-->
<ul>
<li class="companyname"><span>Studio Beve</span></li>
<li><span>Innherredsveien 92.<br> 7043 Trondheim, Norge</span></li>
<li><span>Organisasjonsnummer: 931 872 338</span></li>
<li><span><a href="mailto:info@studiobeve.no">info@studiobeve.no</a></span></li>
</ul>
</div>
<ul class="icons">
<li><a href="https://www.facebook.com/bevelash/" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="https://www.instagram.com/beve_barber" class="icon brands fa-instagram"><span class="label">LinkedIn</span></a></li>
</ul>
</div>
<div class="footer-jobb">
<a href="https://www.google.com/maps/place/Innherredsveien+92,+7043+Trondheim,+Norway/@63.4369352,10.4350889,17z/data=!4m6!3m5!1s0x466d3199df480755:0xc8a07a1d27083152!8m2!3d63.4373339!4d10.4353781!16s%2Fg%2F11h26_1cnn?entry=ttu" target="_blank"><img src="images/map.jpg"> </a>
</div>
</div>
<div class="copyright">
&copy; Studio Beve - Alle Rettigheter Forbeholdt
</div>
</footer>
</div>
<!-- Scripts -->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/jquery.dropotron.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
@@ -14,7 +14,7 @@
<head>
<title>Studio Beve - Barber</title>
<title>Studio Beve - Ledig stilling: Negletekniker</title>
<meta charset="utf-8" />
@@ -132,6 +132,8 @@
<div class="inner">
<a href="./" class="back-to-list">&larr; Alle ledige stillinger</a>
<header class="major">
<img src="images/ollo_rose.png">
@@ -144,87 +146,114 @@
<div class="hirdetes">
<p>
<strong>Hos Studio Beve tilbyr vi både ansettelse og stolutleie.</strong>
<strong>Hos Studio Beve tilbyr vi flere samarbeidsformer, slik at du kan velge den løsningen som passer deg best.</strong>
</p>
<p>
Studio Beve AS er en moderne skjønnhetssalong i Trondheim, lokalisert i Innherredsveien 92, i et godt frekventert og lett tilgjengelig område, med en stabil kundebase og et profesjonelt arbeidsmiljø. Salongen har vært i drift i snart to år, og har utviklet seg jevnt siden oppstarten. Vi tilbyr et moderne og stilrent arbeidsmiljø, profesjonelt utstyr og et velfungerende salongsystem.
Studio Beve AS er en moderne skjønnhetssalong i Trondheim, lokalisert i Innherredsveien 92, i et sentralt, lett tilgjengelig og godt besøkt område. Salongen har vært i drift i over to år og har utviklet seg jevnt siden oppstarten. Vi har en stabil og stadig voksende kundebase, et profesjonelt arbeidsmiljø, moderne lokaler, utstyr av høy kvalitet og et velfungerende online bookingsystem.
</p>
<p>
Våre nåværende tjenester inkluderer blant annet vippeextensions, PMU, styling av vipper og bryn, samt voksing. Negletjenester er allerede en del av tilbudet vårt, og vi ønsker nå å videreutvikle og styrke dette området i salongen.
Våre tjenester inkluderer blant annet vippeextensions, PMU, styling av vipper og bryn, voksing og neglebehandlinger. På grunn av økende etterspørsel ønsker vi nå å videreutvikle og styrke dette området.
</p>
<p>
Derfor søker vi en erfaren og motivert negletekniker som ønsker å bli en del av et stabilt og voksende salongmiljø på lang sikt. Samarbeidet kan skje enten i form av ansettelse eller stolutleie, avhengig av kandidatens erfaring og ønsker.
Derfor søker vi en erfaren og motivert negletekniker som ønsker å bli en del av et stabilt og voksende salongmiljø på lang sikt.
</p>
<b>Samarbeidsmuligheter:</b>
<p>
Kundebasen er i kontinuerlig vekst, og vi støtter utviklingen av tjenestene gjennom aktiv og målrettet markedsføring.
Vi vet at ulike negleteknikere har forskjellige ønsker og behov. Derfor tilbyr vi tre ulike samarbeidsformer.
</p>
<b>Personlige egenskaper:</b>
<b>1. Ansettelse</b>
<ul>
<li>Serviceinnstilt og kundeorientert</li>
<li>Punktlig og pålitelig</li>
<li>Fleksibel og tilpasningsdyktig</li>
<li>Positiv og engasjert med lidenskap for negledesign</li>
<li>Nøyaktig og opptatt av kvalitet i arbeidet</li>
<li>Bruttolønn fra 250 NOK per time.</li>
<li>Arbeidstid og lønnsberegning følger behandlingenes normtid.</li>
<li>Fleksibel arbeidstid tilpasset bookingene.</li>
</ul>
<b>2. Stolleie</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Fast månedlig leie.</li>
<li>Mulighet til å bygge opp egen kundebase.</li>
<li>Mulighet til å ta imot både egne kunder og kunder fra salongen.</li>
</ul>
<b>3. Provisjonsbasert samarbeid</b>
<ul>
<li>Samarbeid gjennom eget enkeltpersonforetak.</li>
<li>Ingen fast leiekostnad.</li>
<li>Provisjonsbasert avregning.</li>
<li>En god løsning for deg som ønsker å bygge opp kundebasen gradvis.</li>
</ul>
<p>
Samarbeidsform og økonomiske betingelser avtales individuelt ut fra erfaring, kompetanse og valgt samarbeidsmodell.
</p>
<b>Vi tilbyr:</b>
<ul>
<li>Et hyggelig og inkluderende arbeidsmiljø i en moderne salong</li>
<li>Mulighet for både ansettelse og stolutleie</li>
<li>Gode utviklingsmuligheter faglig og personlig</li>
<li>Konkurransedyktige betingelser</li>
<li>Fleksibel arbeidstid</li>
<li>Mulighet for gradvis oppbygging av egen kundebase</li>
<li>Et hyggelig og inkluderende arbeidsmiljø i en moderne salong.</li>
<li>Moderne og stilrene lokaler.</li>
<li>Profesjonelt utstyr.</li>
<li>Ved samarbeid som selvstendig næringsdrivende tilbyr vi mulighet til å bygge opp egen kundebase, med støtte fra salongens aktive markedsføring ved behov.</li>
<li>Gode muligheter for både faglig og personlig utvikling.</li>
<li>Fleksibel arbeidstid.</li>
</ul>
<b>Personlige egenskaper:</b>
<ul>
<li>Serviceinnstilt og kundeorientert.</li>
<li>Punktlig og pålitelig.</li>
<li>Fleksibel og tilpasningsdyktig.</li>
<li>Positiv, engasjert og lidenskapelig opptatt av negledesign.</li>
<li>Nøyaktig og kvalitetsbevisst.</li>
</ul>
<b>Kvalifikasjoner:</b>
<ul>
<li>Sertifisert negletekniker eller tilsvarende erfaring</li>
<li>Erfaring med manikyr, gelénegler og gellakk</li>
<li>Kreativ og oppdatert på trender innen negledesign</li>
<li>Gode kommunikasjonsevner norsk eller engelsk</li>
<li>Evne til å arbeide selvstendig og samtidig bidra positivt i et team</li>
<li>Fokus på kvalitet og gode kundeopplevelser</li>
<li>Ansvarsbevisst og profesjonell</li>
<li>Sertifisert negletekniker eller tilsvarende erfaring.</li>
<li>Erfaring med manikyr, gelénegler og gellakk.</li>
<li>Kreativ og oppdatert på de nyeste trendene innen negledesign.</li>
<li>Gode kommunikasjonsevner norsk eller engelsk.</li>
<li>Evne til å arbeide selvstendig og samtidig bidra positivt i et team.</li>
<li>Fokus på kvalitet og gode kundeopplevelser.</li>
<li>Ansvarsbevisst og profesjonell.</li>
</ul>
<b>Arbeidsoppgaver:</b>
<ul>
<li>Utføre profesjonell manikyr og neglebehandlinger</li>
<li>Arbeid med gelé, gellakk og negledesign</li>
<li>Forsterkning, reparasjon og forming av negler</li>
<li>Veilede kunder om neglepleie og behandlinger</li>
<li>Sørge for god hygiene og orden på arbeidsplassen</li>
<li>Utføre profesjonell manikyr og neglebehandlinger.</li>
<li>Arbeide med gelé, gellakk og negledesign.</li>
<li>Forsterkning, reparasjon og forming av negler.</li>
<li>Veilede kunder om neglepleie og behandlinger.</li>
<li>Sørge for god hygiene og orden på arbeidsplassen.</li>
</ul>
<p>
Lønn eller leiepris avtales etter erfaring.<br />
Vi ber kandidater oppgi lønnsforventning eller ønsket leiepris i søknaden.
<b>Om Studio Beve:</b><br />
Vi er en skjønnhetssalong som tilbyr behandlinger for både kvinner og menn. Det er viktig for oss at gjestene våre får muligheten til å koble av fra hverdagens stress, hente ny energi og forlate salongen med følelsen av å være både vakrere og mer velvære, både innvendig og utvendig.
</p>
<p>
<b>Om arbeidsgiveren:</b><br />
Vi er en skjønnhetssalong som tilbyr tjenester til både menn og kvinner. Vi 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. 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. Vi 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. Vi ønsker at gjestene
våre skal finne de tjenestene som er riktige for dem.
Kvalitetstid, personlig oppfølging, de mest profesjonelle verktøyene, høy faglig kompetanse og profesjonalitet danner grunnlaget for vår filosofi og våre tjenester.
</p>
<p>
<b>Tiltredelse:</b><br /> Mai eller etter avtale
Vi mener at skjønnhet, mote og velvære ikke er knyttet til kjønn. Hos oss skal alle føle seg velkomne og finne behandlingene som passer akkurat deres behov.
</p>
<p>
<b>Tiltredelse:</b><br /> Etter avtale.
</p>
<p>
<b>Hvordan søke:</b><br />
Send din CV, bilder av arbeidet ditt og en kort søknad til: evelin@studiobeve.no
Send oss:
</p>
<ul>
<li>CV</li>
<li>Bilder av arbeidet ditt</li>
<li>En kort søknad</li>
</ul>
<p>
til: <a href="mailto:evelin@studiobeve.no">evelin@studiobeve.no</a>
</p>
<p>
Vennligst oppgi også lønnsforventning eller ønsket leiepris i søknaden.
Vi ber deg oppgi hvilken samarbeidsform du er interessert i når du søker.
</p>
<p>
Vi ser frem til å høre fra deg!
</p>
<p>
<b>Kontaktperson:</b> <br />
Evelin Bence,<br />
daglig leder<br />
Evelin Bence<br />
Daglig leder<br />
Studio Beve AS<br />
</p>
</div>