From 307f17faa61d4c758fabac40d423ae2e6dd9480a Mon Sep 17 00:00:00 2001 From: Zoli Date: Sat, 7 Mar 2026 11:52:30 +0100 Subject: [PATCH] Fix timezone bug causing slots past closing time; remove lunch fallback outside window - Add Europe/Oslo timezone to all DateTime constructors in getAvailableTimes() and computeLunchBreak() to prevent UTC vs local time mismatch that allowed booking slots 1 hour past the worker's end time on same-day bookings - Remove fallback loop in computeLunchBreak() that pushed the lunch break outside the configured window; lunch break is now strictly enforced within the interval Co-Authored-By: Claude Sonnet 4.6 --- application/controllers/Admin.php | 35 ------------------- application/models/Service_model.php | 32 ++++++++--------- application/views/includes/barber-head.php | 1 - application/views/includes/beauty-head.php | 1 - .../views/pages/includes/booking-form-en.php | 16 ++++----- .../views/pages/includes/booking-form-hu.php | 16 ++++----- .../views/pages/includes/booking-form-no.php | 16 ++++----- load_services.json | 2 +- 8 files changed, 36 insertions(+), 83 deletions(-) diff --git a/application/controllers/Admin.php b/application/controllers/Admin.php index 15a7e1a..396d4d9 100755 --- a/application/controllers/Admin.php +++ b/application/controllers/Admin.php @@ -209,41 +209,6 @@ class Admin extends CI_Controller { - public function admin_worker_override() { - $this->load->helper('url'); - $this->load->model('User_model'); - $this->load->model('Service_model'); - - $data['pageTitle'] = 'Egyedi napok kezelése'; - $data['workers'] = $this->Service_model->getAllWorkers(); - - if ($this->input->post('storeOverride')) { - $this->load->database(); - $insert = [ - 'worker_id' => $_POST['worker_id'], - 'date' => $_POST['date'], - 'is_day_off' => isset($_POST['is_day_off']) ? 1 : 0, - 'start_time' => $_POST['start_time'], - 'end_time' => $_POST['end_time'] - ]; - - $existing = $this->db->query("SELECT * FROM worker_schedule_overrides WHERE worker_id = '{$insert['worker_id']}' AND date = '{$insert['date']}'")->row(); - if ($existing) { - $this->db->where('id', $existing->id)->update('worker_schedule_overrides', $insert); - } else { - $this->db->insert('worker_schedule_overrides', $insert); - } - } - - if (!empty($_GET['worker_id'])) { - $this->load->database(); - $worker_id = $_GET['worker_id']; - $data['selectedWorkerId'] = $worker_id; - $data['overrides'] = $this->db->query("SELECT * FROM worker_schedule_overrides WHERE worker_id = '$worker_id' ORDER BY date ASC")->result(); - } - - $this->load->view('admin/worker_override', $data); - } public function manage_worker_schedule($worker_id = null) { diff --git a/application/models/Service_model.php b/application/models/Service_model.php index 9c37b3e..8b91f2a 100755 --- a/application/models/Service_model.php +++ b/application/models/Service_model.php @@ -439,17 +439,17 @@ class Service_model extends CI_Model { if ($override->is_day_off) return []; - $dayStartTime = new DateTime($selectedDate.' '.$override->start_time); - $finishTime = new DateTime($selectedDate.' '.$override->end_time); + $dayStartTime = new DateTime($selectedDate.' '.$override->start_time, new DateTimeZone('Europe/Oslo')); + $finishTime = new DateTime($selectedDate.' '.$override->end_time, new DateTimeZone('Europe/Oslo')); } else { $weekday = date('w', strtotime($selectedDate)); // 0 = Sunday, 6 = Saturday $weekNumber = date('W', strtotime($selectedDate)); $isOddWeek = $weekNumber % 2 !== 0; $scheduleQuery = $this->db->query(" - SELECT * FROM worker_schedule - WHERE worker_id = '{$worker_id}' - AND weekday = '{$weekday}' + SELECT * FROM worker_schedule + WHERE worker_id = '{$worker_id}' + AND weekday = '{$weekday}' AND ( is_alternate_week = 0 OR (is_alternate_week = 1 AND " . ($isOddWeek ? "1" : "0") . ") @@ -461,8 +461,8 @@ class Service_model extends CI_Model { } $schedule = $scheduleQuery->row(); - $dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_time); - $finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time); + $dayStartTime = new DateTime($selectedDate . ' ' . $schedule->start_time, new DateTimeZone('Europe/Oslo')); + $finishTime = new DateTime($selectedDate . ' ' . $schedule->end_time, new DateTimeZone('Europe/Oslo')); } // --- ÚJ: ma foglalva csak (következő 15 perces blokk + 1 óra) UTÁN legyen időpont --- @@ -685,8 +685,9 @@ class Service_model extends CI_Model { $lunchDuration = new DateInterval('PT30M'); $lunchStep = new DateInterval('PT15M'); - $winStartDt = new DateTime($date . ' ' . $winStart); - $winEndDt = new DateTime($date . ' ' . $winEnd); + $tz = new DateTimeZone('Europe/Oslo'); + $winStartDt = new DateTime($date . ' ' . $winStart, $tz); + $winEndDt = new DateTime($date . ' ' . $winEnd, $tz); // Clamp window to actual shift hours if ($shiftStart && $winStartDt < $shiftStart) $winStartDt = clone $shiftStart; @@ -695,10 +696,11 @@ class Service_model extends CI_Model { $scanEnd = (clone $winEndDt)->sub($lunchDuration); $isFree = function($candidate) use ($lunchDuration, $dayBookings, $date) { + $tz = new DateTimeZone('Europe/Oslo'); $candEnd = (clone $candidate)->add($lunchDuration); foreach ($dayBookings as $bk) { - $bkS = new DateTime($date . ' ' . $bk->booking_start_time); - $bkE = new DateTime($date . ' ' . $bk->booking_finish_time); + $bkS = new DateTime($date . ' ' . $bk->booking_start_time, $tz); + $bkE = new DateTime($date . ' ' . $bk->booking_finish_time, $tz); if ($bkS < $candEnd && $bkE > $candidate) return false; } return true; @@ -713,7 +715,7 @@ class Service_model extends CI_Model { if (!empty($freeSlots)) { // Pick the slot closest to preferred time (or start of window if no preference) $prefDt = $preferredTime - ? new DateTime($date . ' ' . $preferredTime) + ? new DateTime($date . ' ' . $preferredTime, new DateTimeZone('Europe/Oslo')) : clone $winStartDt; $best = null; $bestDiff = PHP_INT_MAX; @@ -725,12 +727,6 @@ class Service_model extends CI_Model { return ['start' => $best->format('H:i'), 'end' => $bestEnd->format('H:i')]; } - // Fallback: search after the window - for ($c = clone $winEndDt; ; $c->add($lunchStep)) { - $candEnd = (clone $c)->add($lunchDuration); - if ($candEnd > $shiftEnd) break; - if ($isFree($c)) return ['start' => $c->format('H:i'), 'end' => $candEnd->format('H:i')]; - } return null; } diff --git a/application/views/includes/barber-head.php b/application/views/includes/barber-head.php index 44fc6b6..2ed6678 100755 --- a/application/views/includes/barber-head.php +++ b/application/views/includes/barber-head.php @@ -41,7 +41,6 @@ $this->load->helper('url'); - diff --git a/application/views/includes/beauty-head.php b/application/views/includes/beauty-head.php index 8704c04..4a1920e 100755 --- a/application/views/includes/beauty-head.php +++ b/application/views/includes/beauty-head.php @@ -41,7 +41,6 @@ $this->load->helper('url'); - diff --git a/application/views/pages/includes/booking-form-en.php b/application/views/pages/includes/booking-form-en.php index b7ea7c4..e496261 100755 --- a/application/views/pages/includes/booking-form-en.php +++ b/application/views/pages/includes/booking-form-en.php @@ -187,8 +187,7 @@
-
- +
@@ -425,7 +424,8 @@ $('#bookingStep'+stepNumber).show(); - if(stepNumber == 4){ + if(stepNumber == 4){ + recaptcha_callback(); $('#stepCircle1').addClass('activeStep'); $('#stepCircle2').addClass('activeStep'); $('#stepCircle3').addClass('activeStep'); @@ -472,7 +472,8 @@ else if(stepNumber == 1){ $RequiredFieldSelected = 1; } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); $RequiredFieldSelected = 1; } else if(stepNumber == 3){ @@ -483,7 +484,8 @@ }); } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); if($('#booking_date').val() != '' && $('#booking_time').val() != ''){ $RequiredFieldSelected = 1; } @@ -503,7 +505,3 @@ - - \ No newline at end of file diff --git a/application/views/pages/includes/booking-form-hu.php b/application/views/pages/includes/booking-form-hu.php index d15feb6..9db655b 100755 --- a/application/views/pages/includes/booking-form-hu.php +++ b/application/views/pages/includes/booking-form-hu.php @@ -188,8 +188,7 @@
-
- +
@@ -424,7 +423,8 @@ $('#bookingStep'+stepNumber).show(); - if(stepNumber == 4){ + if(stepNumber == 4){ + recaptcha_callback(); $('#stepCircle1').addClass('activeStep'); $('#stepCircle2').addClass('activeStep'); $('#stepCircle3').addClass('activeStep'); @@ -471,7 +471,8 @@ else if(stepNumber == 1){ $RequiredFieldSelected = 1; } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); $RequiredFieldSelected = 1; } else if(stepNumber == 3){ @@ -482,7 +483,8 @@ }); } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); if($('#booking_date').val() != '' && $('#booking_time').val() != ''){ $RequiredFieldSelected = 1; } @@ -502,7 +504,3 @@ - - \ No newline at end of file diff --git a/application/views/pages/includes/booking-form-no.php b/application/views/pages/includes/booking-form-no.php index 40a067a..29a30ad 100755 --- a/application/views/pages/includes/booking-form-no.php +++ b/application/views/pages/includes/booking-form-no.php @@ -188,8 +188,7 @@ if (is_array($services) && count($services) > 0) {
-
- +
@@ -424,7 +423,8 @@ if (is_array($services) && count($services) > 0) { $('#bookingStep'+stepNumber).show(); - if(stepNumber == 4){ + if(stepNumber == 4){ + recaptcha_callback(); $('#stepCircle1').addClass('activeStep'); $('#stepCircle2').addClass('activeStep'); $('#stepCircle3').addClass('activeStep'); @@ -471,7 +471,8 @@ if (is_array($services) && count($services) > 0) { else if(stepNumber == 1){ $RequiredFieldSelected = 1; } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); $RequiredFieldSelected = 1; } else if(stepNumber == 3){ @@ -482,7 +483,8 @@ if (is_array($services) && count($services) > 0) { }); } - else if(stepNumber == 4){ + else if(stepNumber == 4){ + recaptcha_callback(); if($('#booking_date').val() != '' && $('#booking_time').val() != ''){ $RequiredFieldSelected = 1; } @@ -502,7 +504,3 @@ if (is_array($services) && count($services) > 0) { - - \ No newline at end of file diff --git a/load_services.json b/load_services.json index f0f3ca2..9d41816 100755 --- a/load_services.json +++ b/load_services.json @@ -1 +1 @@ -[{"service_name":"Alkalmi m\u0171szempilla felhelyez\u00e9se (beauty)","service_id":"23"},{"service_name":"Alkalmi smink (beauty)","service_id":"20"},{"service_name":"Bajusz \u00e9s \u00e1ll (beauty)","service_id":"38"},{"service_name":"Dupl\u00e1zott szempilla 2D (beauty)","service_id":"15"},{"service_name":"Dupl\u00e1zott szempilla 2D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"16"},{"service_name":"D\u00fas\u00edtott szempilla 3D-5D (beauty)","service_id":"17"},{"service_name":"D\u00fas\u00edtott szempilla 3D-5D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"18"},{"service_name":"Eg\u00e9sz h\u00e1t (barber)","service_id":"45"},{"service_name":"Eg\u00e9sz mell (barber)","service_id":"41"},{"service_name":"Egyszer\u0171 d\u00edsz\u00edt\u00e9s \u2013 Kreat\u00edv k\u00f6r\u00f6mdesign (beauty)","service_id":"55"},{"service_name":"Egyszer\u0171 d\u00edsz\u00edt\u00e9s \u2013 Kreat\u00edv k\u00f6r\u00f6mdesign m\u0171k\u00f6r\u00f6mre (beauty)","service_id":"63"},{"service_name":"Egysz\u00edn\u0171 g\u00e9llakkoz\u00e1s \u2013 a r\u00e9gi anyag elt\u00e1vol\u00edt\u00e1s\u00e1val (beauty)","service_id":"50"},{"service_name":"Egysz\u00edn\u0171 g\u00e9llakkoz\u00e1s \u2013 elt\u00e1vol\u00edt\u00e1s n\u00e9lk\u00fcl (beauty)","service_id":"49"},{"service_name":"\u00c9p\u00edtett zsel\u00e9s k\u00f6r\u00f6m elt\u00e1vol\u00edt\u00e1s \u2013 m\u00e1s szolg\u00e1ltat\u00e1s n\u00e9lk\u00fcl (beauty)","service_id":"66"},{"service_name":"Er\u0151s\u00edtett g\u00e9llakk a r\u00e9gi anyag elt\u00e1vol\u00edt\u00e1s\u00e1val (beauty)","service_id":"52"},{"service_name":"Er\u0151s\u00edtett g\u00e9llakk elt\u00e1vol\u00edt\u00e1s n\u00e9lk\u00fcl (beauty)","service_id":"51"},{"service_name":"Extra d\u00edsz\u00edt\u00e9s \u2013 Kreat\u00edv k\u00f6r\u00f6mdesign (beauty)","service_id":"56"},{"service_name":"Extra d\u00edsz\u00edt\u00e9s \u2013 Kreat\u00edv k\u00f6r\u00f6mdesign m\u0171k\u00f6r\u00f6mre (beauty)","service_id":"64"},{"service_name":"F\u00e9rfi hajv\u00e1g\u00e1s (barber)","service_id":"1"},{"service_name":"Francia d\u00edsz\u00edt\u00e9s (beauty)","service_id":"53"},{"service_name":"Francia d\u00edsz\u00edt\u00e9s m\u0171k\u00f6r\u00f6mre (beauty)","service_id":"61"},{"service_name":"F\u00fcll gyanta (barber)","service_id":"11"},{"service_name":"G\u00e9llakk vagy er\u0151s\u00edtett g\u00e9llakk elt\u00e1vol\u00edt\u00e1s \u2013 m\u00e1s szolg\u00e1ltat\u00e1s n\u00e9lk\u00fcl (beauty)","service_id":"65"},{"service_name":"Gyerekhajv\u00e1g\u00e1s (barber)","service_id":"3"},{"service_name":"Hagyom\u00e1nyos forr\u00f3t\u00f6r\u00f6lk\u00f6z\u0151s k\u00e9sesborotv\u00e1l\u00e1s (barber)","service_id":"5"},{"service_name":"H\u00e1t \u00e9s v\u00e1ll (barber)","service_id":"43"},{"service_name":"H\u00e1t, mell \u00e9s has (barber)","service_id":"47"},{"service_name":"H\u00e1t, v\u00e1ll \u00e9s nyak (barber)","service_id":"46"},{"service_name":"Henna fest\u00e9s, tartalmazza a szem\u00f6ld\u00f6k form\u00e1z\u00e1st is (beauty)","service_id":"28"},{"service_name":"H\u00f3nalj (beauty)","service_id":"34"},{"service_name":"H\u00f3nalj (barber)","service_id":"44"},{"service_name":"Kar (beauty)","service_id":"32"},{"service_name":"Klasszikus csomag (barber)","service_id":"7"},{"service_name":"Klasszikus manik\u00fcr (beauty)","service_id":"48"},{"service_name":"Klasszikus szempilla 1D (beauty)","service_id":"13"},{"service_name":"Klasszikus szempilla 1D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"14"},{"service_name":"L\u00e1b t\u00e9rdig (beauty)","service_id":"36"},{"service_name":"Mell \u00e9s h\u00e1t (barber)","service_id":"42"},{"service_name":"Menyasszonyi pr\u00f3basmink (beauty)","service_id":"21"},{"service_name":"Menyasszonyi smink (beauty)","service_id":"22"},{"service_name":"Minden egyben csomag (barber)","service_id":"9"},{"service_name":"Modern csomag (barber)","service_id":"8"},{"service_name":"Ombre d\u00edsz\u00edt\u00e9s \u2013 L\u00e1gy \u00e1tmenet (beauty)","service_id":"54"},{"service_name":"Ombre d\u00edsz\u00edt\u00e9s \u2013 L\u00e1gy \u00e1tmenet m\u0171k\u00f6r\u00f6mre (beauty)","service_id":"62"},{"service_name":"Orr (beauty)","service_id":"39"},{"service_name":"Orr gyanta (barber)","service_id":"12"},{"service_name":"Puderes szem\u00f6ld\u00f6ktetov\u00e1l\u00e1s (beauty)","service_id":"31"},{"service_name":"Puderes szem\u00f6ld\u00f6ktetov\u00e1l\u00e1s 1,5 \u00e9ven bel\u00fcli friss\u00edt\u00e9se (beauty)","service_id":"30"},{"service_name":"Skinfade hajv\u00e1g\u00e1s (barber)","service_id":"2"},{"service_name":"Szak\u00e1llfest\u00e9s (barber)","service_id":"6"},{"service_name":"Szak\u00e1lligaz\u00edt\u00e1s (barber)","service_id":"4"},{"service_name":"Szem\u00f6ld\u00f6k fest\u00e9s \u00e9s form\u00e1z\u00e1s (beauty)","service_id":"25"},{"service_name":"Szem\u00f6ld\u00f6k form\u00e1z\u00e1s (beauty)","service_id":"27"},{"service_name":"Szem\u00f6ld\u00f6k gyanta \u00e9s szem\u00f6ld\u00f6k igaz\u00edt\u00e1s (barber)","service_id":"10"},{"service_name":"Szem\u00f6ld\u00f6k lamin\u00e1l\u00e1s, form\u00e1z\u00e1ssal \u00e9s fest\u00e9ssel (beauty)","service_id":"24"},{"service_name":"Szempilla fest\u00e9s (beauty)","service_id":"26"},{"service_name":"Szempilla leold\u00e1sa (beauty)","service_id":"19"},{"service_name":"Szempilla lifting, tartalmazza a fest\u00e9s is (beauty)","service_id":"29"},{"service_name":"Teljes l\u00e1b (beauty)","service_id":"35"},{"service_name":"\u00daj szett zsel\u00e9s k\u00f6r\u00f6mhosszabb\u00edt\u00e1s (L) \u2013 hossz\u00fa (beauty)","service_id":"59"},{"service_name":"\u00daj szett zsel\u00e9s k\u00f6r\u00f6mhosszabb\u00edt\u00e1s (M) \u2013 k\u00f6zepes hossz (beauty)","service_id":"58"},{"service_name":"\u00daj szett zsel\u00e9s k\u00f6r\u00f6mhosszabb\u00edt\u00e1s (S) \u2013 norm\u00e1l hossz (beauty)","service_id":"57"},{"service_name":"Zsel\u00e9s k\u00f6r\u00f6mhosszabb\u00edt\u00e1s t\u00f6lt\u00e9s \u2013 len\u0151tt k\u00f6rm\u00f6k friss\u00edt\u00e9se (3-5 h\u00e9ten bel\u00fcl) (beauty)","service_id":"60"}] \ No newline at end of file +[{"service_name":"Alkalmi m\u0171szempilla felhelyez\u00e9se (beauty)","service_id":"23"},{"service_name":"Alkalmi smink (beauty)","service_id":"21"},{"service_name":"Bajusz \u00e9s \u00e1ll (beauty)","service_id":"38"},{"service_name":"Dupl\u00e1zott szempilla 2D (beauty)","service_id":"15"},{"service_name":"Dupl\u00e1zott szempilla 2D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"16"},{"service_name":"D\u00fas\u00edtott szempilla 3D-5D (beauty)","service_id":"17"},{"service_name":"D\u00fas\u00edtott szempilla 3D-5D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"18"},{"service_name":"Eg\u00e9sz h\u00e1t (barber)","service_id":"45"},{"service_name":"Eg\u00e9sz mell (barber)","service_id":"41"},{"service_name":"Egy k\u00f6r\u00f6m jav\u00edt\u00e1sa (beauty)","service_id":"68"},{"service_name":"Egyszer\u0171 d\u00edsz\u00edt\u00e9s \u2013 Kreat\u00edv k\u00f6r\u00f6mdesign m\u0171k\u00f6r\u00f6mre (beauty)","service_id":"63"},{"service_name":"faszom (beauty)","service_id":"69"},{"service_name":"F\u00e9rfi hajv\u00e1g\u00e1s (barber)","service_id":"1"},{"service_name":"F\u00fcll gyanta (barber)","service_id":"11"},{"service_name":"Gyerekhajv\u00e1g\u00e1s (barber)","service_id":"3"},{"service_name":"Hagyom\u00e1nyos forr\u00f3t\u00f6r\u00f6lk\u00f6z\u0151s k\u00e9sesborotv\u00e1l\u00e1s (barber)","service_id":"5"},{"service_name":"H\u00e1t (beauty)","service_id":"37"},{"service_name":"H\u00e1t \u00e9s v\u00e1ll (barber)","service_id":"43"},{"service_name":"H\u00e1t, mell \u00e9s has (barber)","service_id":"47"},{"service_name":"H\u00e1t, v\u00e1ll \u00e9s nyak (barber)","service_id":"46"},{"service_name":"Henna fest\u00e9s, tartalmazza a szem\u00f6ld\u00f6k form\u00e1z\u00e1st is (beauty)","service_id":"28"},{"service_name":"H\u00f3nalj (beauty)","service_id":"34"},{"service_name":"H\u00f3nalj (barber)","service_id":"44"},{"service_name":"Kar (beauty)","service_id":"32"},{"service_name":"Klasszikus csomag (barber)","service_id":"7"},{"service_name":"Klasszikus szempilla 1D (beauty)","service_id":"13"},{"service_name":"Klasszikus szempilla 1D \u00fajrat\u00f6lt\u00e9se (beauty)","service_id":"14"},{"service_name":"L\u00e1b t\u00e9rdig (beauty)","service_id":"36"},{"service_name":"Mell \u00e9s h\u00e1t (barber)","service_id":"42"},{"service_name":"Menyasszonyi smink (beauty)","service_id":"22"},{"service_name":"Minden egyben csomag (barber)","service_id":"9"},{"service_name":"Modern csomag (barber)","service_id":"8"},{"service_name":"Nappali smink (beauty)","service_id":"20"},{"service_name":"N\u0151i intim bikinivonal (beauty)","service_id":"33"},{"service_name":"Orr (beauty)","service_id":"39"},{"service_name":"Orr gyanta (barber)","service_id":"12"},{"service_name":"Puderes szem\u00f6ld\u00f6ktetov\u00e1l\u00e1s (beauty)","service_id":"31"},{"service_name":"Puderes szem\u00f6ld\u00f6ktetov\u00e1l\u00e1s 1,5 \u00e9ven bel\u00fcli friss\u00edt\u00e9se (beauty)","service_id":"30"},{"service_name":"Skinfade hajv\u00e1g\u00e1s (barber)","service_id":"2"},{"service_name":"Szak\u00e1llfest\u00e9s (barber)","service_id":"6"},{"service_name":"Szak\u00e1lligaz\u00edt\u00e1s (barber)","service_id":"4"},{"service_name":"Szem\u00f6ld\u00f6k fest\u00e9s \u00e9s form\u00e1z\u00e1s (beauty)","service_id":"25"},{"service_name":"Szem\u00f6ld\u00f6k form\u00e1z\u00e1s (beauty)","service_id":"27"},{"service_name":"Szem\u00f6ld\u00f6k gyanta \u00e9s szem\u00f6ld\u00f6k igaz\u00edt\u00e1s (barber)","service_id":"10"},{"service_name":"Szem\u00f6ld\u00f6k lamin\u00e1l\u00e1s, form\u00e1z\u00e1ssal \u00e9s fest\u00e9ssel (beauty)","service_id":"24"},{"service_name":"Szempilla fest\u00e9s (beauty)","service_id":"26"},{"service_name":"Szempilla leold\u00e1sa (beauty)","service_id":"19"},{"service_name":"Szempilla lifting, tartalmazza a fest\u00e9s is (beauty)","service_id":"29"},{"service_name":"Teljes l\u00e1b (beauty)","service_id":"35"}] \ No newline at end of file