HR self-servis izin portalı + takvim view + marka logo yayılımı
Personel kendi izin taleplerini güvenli bir portal üzerinden girer, İK takvim üzerinden onaylar. İş yükü azaltıcı 5-fazlı sprint.
- Kalıcı personel portalı —
hr_leave_portal.php- İK
hr_leave_token.php'de "Kalıcı Portal Linki" seçer →token_type='personal', 365 gün TTL - Personel
?t=<hash>ile giriş yapar: dashboard'da kullanılan / bekleyen / kalan yıllık kota tile'ları + yeni talep formu + son 20 talep + bekleyenler için "İptal Et" - Mevcut tek-kullanımlık
hr_leave_public.phpakışı korundu — geriye dönük uyumlu, otomatik yönlendirme - Aynı personelde yeni portal linki üretildiğinde önceki otomatik iptal edilir (tek aktif invariant)
- İK
- HR takvim view —
hr_leaves.php?tab=takvim(FullCalendar 6.1)- Ay / Hafta / Liste view, TR locale, status renk paleti (bekliyor sarı, onaylı yeşil, reddedildi kırmızı, iptal gri)
- Event click → detay modal: firma, tarih, gün, durum, kaynak, neden + onay/red butonları (canWrite + status='bekliyor' şartıyla)
- Yeni JSON endpoint
hr_leaves_calendar_api.php— customer_id + tarih range + opsiyonel status filtresi, TD_JSON_ENDPOINT pattern - Reddedilen / iptal edilen event'ler için toggle checkbox — refetch tetikler
- Composite index
idx_hr_leaves_cal (customer_id, start_date, end_date)range query performansı
- Akıllı kontroller — portal formu submit öncesi
- Yıllık kota:
hr_leave_types.max_days_per_yearaşılırsa HARD BLOCK — "talep 7 gün, kalan hakkınız 3 gün..." - Departman çakışması: aynı departmanda o tarihte izinli var mı → SOFT WARNING + zorunlu onay checkbox, kaydolmaz
- Sticky form değerleri (validation error'da kullanıcı yeniden yazmasın)
- Yıllık kota:
- Bildirim akışı —
lib/HrLeaveMailer.php- Yeni
onRejected(, , )— personel'e "izin reddedildi" e-postası (opsiyonel İK notu) - Yeni
notifyHrOfNewRequest(, )— portal talebi sonrası İK ekibine (admin + can_write user'lar) toplu bilgi + CTA butonu - Best-effort try/catch — mail hatası ana akışı bozmaz
- Yeni
- Marka logo yayılımı — 15 marketing/public sayfa
- Eski "TD" text mark → yeni 4-diamond cube (
logo-cube-white.svg· siyah karo) - pricing, auth_guide, errors, examples, integrations, self_host, webhooks_catalog, changelog, roadmap, legal_page, components, trust, onboarding, status, api
- Her sayfa kendi lokal
.brand-markCSS'i;background:#0a0a0a+overflow:hidden+ childimgrule ile normalize edildi
- Eski "TD" text mark → yeni 4-diamond cube (
Şema değişikliği idempotent (hr_init.php içinde information_schema check + ALTER pattern'i), ilk HR sayfa yüklemesinde çalışır. sw.js td-v57 → td-v58, endpoint bypass listesine hr_leaves_calendar_api.php eklendi.