Nastavení kalendáře a stavy¶
Entity: CalendarSettings, AppointmentStatus (tabulky calendar_settings, appointment_statuses)
Prověřeno proti commitu: c9483ac (5. 10. 2026)
Testy: backend/tests/Feature/Audit/NastaveniKalendareStavyAuditTest.php
Routy¶
| Routa | Perimetr | Ochrana | Controller |
|---|---|---|---|
GET/POST/PUT/DELETE /api/calendarSettings |
interní | oprávnění statuses |
EntityCrudController CRUD |
GET/POST/PUT/DELETE /api/appointmentStatuses |
interní | oprávnění statuses |
EntityCrudController CRUD |
GET /api/public/calendarSettings |
veřejný alias pro staff | staff session | EntityCrudController::list |
GET /api/public/appointmentStatuses |
veřejný katalog | bez middleware, volitelné public filtry | EntityCrudController::publicList |
Kdo to volá z Reactu¶
pages/CalendarSettings.jsx a pages/OperatingHoursSettings.jsx spravují CalendarSettings.
pages/AppointmentStatusSettings.jsx spravuje stavy termínů. Calendar.jsx,
components/therapist/TherapistCalendarView.jsx a lib/StatusContext.jsx nastavení a stavy
čtou pro vykreslení kalendáře. base44Client.js má pro obě entity public fallback.
Opravené nálezy¶
KAL-04 — Veřejný list stavů termínů není omezený na firmu (střední)¶
Stav: opravený
Test: KAL-04: veřejný list stavů termínů nevrací stavy jiné firmy
Ověřený fakt — appointmentStatuses má public_list => true, ale nemá
public_company_scope. Veřejný list tak bez session skládá dotaz bez company_id omezení.
Oprava — public list appointmentStatuses používá tenant scope. Bez staff session
se v single-tenant režimu omezí na první aktivní firmu.
Dopad — veřejný nebo fallback klient může dostat stavy termínů jiné firmy. Protože stavy ovlivňují zobrazení obsazenosti, plateb a workflow kalendáře, cizí číselník může vést k úniku interní konfigurace i k nekonzistentnímu UI.
KAL-05 — Veřejný list stavů termínů vrací neaktivní stavy (střední)¶
Stav: opravený
Test: KAL-05: veřejný list stavů termínů nevrací neaktivní stavy
Ověřený fakt — appointmentStatuses povoluje veřejný filtr is_active, ale nemá
public_default_filters. Požadavek bez filtru proto vrací aktivní i neaktivní stavy.
Oprava — public list appointmentStatuses má výchozí filtr is_active = 1.
Explicitní public filtry mohou výsledek dál zúžit.
Dopad — klientské a kalendářové obrazovky mohou přes public fallback pracovat se stavy, které už nemají být nabízené ani viditelné.
Ověřené bez nálezu¶
- Interní endpointy
/api/calendarSettingsa/api/appointmentStatusesnejsou dostupné anonymně. - Public alias
/api/public/calendarSettingsvyžaduje staff session. - Interní listy nastavení kalendáře a stavů se filtrují podle firmy přihlášeného uživatele.