Introduces /massage alongside barber and beauty: landing page, booking flow, admin support, home tile and SEO entries, in all three languages. Architecture - application/config/verticals.php + vertical_helper.php: one registry entry per vertical (branding, assets, views, behaviour flags). A fourth vertical is a config entry plus content files. - Strangler: barber and beauty keep pointing at their existing view files, so their rendered HTML is unchanged. Only massage uses the new generic pages/vertical-*.php and includes/vertical-*.php views, which collapse the four duplicated per-language nav/footer branches into one. - Pages::vertical() + one route; booking(), booking_finished(), _booking_error() and manage_booking() are now registry-driven. Worker/vertical coupling - getActiveWorkers() derives the vertical from services.service_category_id instead of the workers.is_barber / is_beauty flags, which were a hand-maintained cache of exactly that fact. Verified against production data: the derived set reproduced the stored flags for every worker, in both verticals. No schema change was needed for massage. - The legacy flags are now written through from the category so a rollback cannot strand a new worker, and the admin worker UI shows the derived verticals read-only instead of two dropdowns that controlled nothing. Bug fixes found along the way (all pre-existing) - booking_process() had no server-side category guard; cross-vertical mixing was prevented only by client-side JS. - add-service-form / add-worker-form emitted `selected` on every category option, so the newest category silently became the default. - update-service-form offered only barber/beauty, so editing a service of any other type silently rewrote it. - getWorkerScheduleByDay ignored schedule overrides while getAvailableTimes honoured them, so slots could be shown and then rejected. Added an override-aware getWorkerScheduleForDate() and used it in both guards. - Booking lists dereferenced a null service if one had been hard-deleted. - main.css: .tiles was tuned for exactly two tiles, including an absolutely-positioned .style1 at the 1280px breakpoint. Massage-specific behaviour, opt-in per vertical - strip_category_prefix: grouped service lists show "50 min" under the treatment heading rather than repeating the full name. The full name is carried in data-service-name so the totals panel stays unambiguous, and services.service_name is untouched for emails and admin. - single_service_booking: one treatment per booking, enforced in the UI and in booking_process(). Re-clicking the selection releases it. - Displayed treatment time (50/80/110 min) is in the service name; the booked slot (60/90/120 min) is service_time and covers changing and payment. service_time is never shown to the guest. DB migrations for dev/prod are in documents/ - additive only, no ALTER. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
5.1 KiB
PHP
Executable File
82 lines
5.1 KiB
PHP
Executable File
<div class="mainContentContainer" style="top:100px">
|
|
<div class="pageTitle"><?php echo $pageTitle;?></div>
|
|
<form method="post" action="<?php echo base_url();?>workers/worker-process" enctype="multipart/form-data">
|
|
<input type="hidden" name ="worker_id" value="<?php echo htmlspecialchars($selectedItem->worker_id, ENT_QUOTES, 'UTF-8');?>">
|
|
<div class="formRow">
|
|
<label class="formTitle">Név</label>
|
|
<input type="text" class="formInputBox" name="worker_name" value="<?php echo htmlspecialchars($selectedItem->worker_name, ENT_QUOTES, 'UTF-8');?>">
|
|
</div>
|
|
<div class="formRow">
|
|
<img src="<?php echo SITEURL.'assets/img/workers/'.$selectedItem->worker_profile_img;?>" width="100px">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Profilkép</label>
|
|
<input type="file" class="formInputBox" name="worker_img">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Leírás</label>
|
|
<input type="text" class="formInputBox" name="worker_info" value="<?php echo htmlspecialchars($selectedItem->worker_info, ENT_QUOTES, 'UTF-8');?>">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Vertikálok</label>
|
|
<div class="formInputBox" style="border:0;padding-left:0;">
|
|
<?php
|
|
$workerVerticals = isset($workerVerticals) ? $workerVerticals : array();
|
|
echo $workerVerticals
|
|
? htmlspecialchars(implode(', ', $workerVerticals), ENT_QUOTES, 'UTF-8')
|
|
: '<span style="color:#b00;">nincs szolgáltatás ebben a kategóriában</span>';
|
|
?>
|
|
<div style="font-size:11px;color:#888;margin-top:4px;">
|
|
A szolgáltatás kategóriából származtatva - a kategória módosításával változik.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="formRow">
|
|
<label class="formTitle">Szolgáltatás kategória</label>
|
|
<select class="formDropdownBox" style="padding:0;" name="service_category_id">
|
|
<?php
|
|
if(!empty($serviceCategories)){
|
|
foreach($serviceCategories as $serviceCategoryItem){
|
|
echo '<option value="'.$serviceCategoryItem->service_category_id.'" '.($selectedItem->service_category_id == $serviceCategoryItem->service_category_id?' selected':'').'>'.$serviceCategoryItem->serv_cat_name.'</option>';
|
|
}
|
|
}
|
|
?>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="formRow">
|
|
<label class="formTitle">Aktív</label>
|
|
<select class="formDropdownBox" style="padding:0;" name="is_active">
|
|
<option value="1" <?php echo $selectedItem->is_active?'selected':'';?>>igen</option>
|
|
<option value="0" <?php echo !$selectedItem->is_active?'selected':'';?>>nem</option>
|
|
</select>
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Ebédszünet ablak kezdete</label>
|
|
<input type="text" class="formInputBox" name="lunch_window_start" value="<?php echo isset($selectedItem->lunch_window_start) ? substr($selectedItem->lunch_window_start, 0, 5) : ''; ?>" placeholder="HH:MM (pl. 11:00)" pattern="[0-2][0-9]:[0-5][0-9]" inputmode="numeric">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Ebédszünet ablak vége</label>
|
|
<input type="text" class="formInputBox" name="lunch_window_end" value="<?php echo isset($selectedItem->lunch_window_end) ? substr($selectedItem->lunch_window_end, 0, 5) : ''; ?>" placeholder="HH:MM (pl. 14:00)" pattern="[0-2][0-9]:[0-5][0-9]" inputmode="numeric">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Ebédszünet preferált időpont</label>
|
|
<input type="text" class="formInputBox" name="lunch_preferred_time" value="<?php echo isset($selectedItem->lunch_preferred_time) ? substr($selectedItem->lunch_preferred_time, 0, 5) : ''; ?>" placeholder="HH:MM (pl. 12:00)" pattern="[0-2][0-9]:[0-5][0-9]" inputmode="numeric">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">Google Calendar ID</label>
|
|
<input type="text" class="formInputBox" name="google_calendar_id" value="<?php echo htmlspecialchars(isset($selectedItem->google_calendar_id) ? $selectedItem->google_calendar_id : '', ENT_QUOTES, 'UTF-8');?>">
|
|
</div>
|
|
<div class="formRow">
|
|
<label class="formTitle">ntfy Topic</label>
|
|
<input type="text" class="formInputBox" name="ntfy_topic" value="<?php echo htmlspecialchars(isset($selectedItem->ntfy_topic) ? $selectedItem->ntfy_topic : '', ENT_QUOTES, 'UTF-8');?>">
|
|
</div>
|
|
<div class="formRow">
|
|
<input type="submit" class="submitButton" name="updateWorker" value="Módosítás">
|
|
<a href="<?php echo base_url();?>workers" class="cancelButton">Mégsem</a>
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|