# İK › Çalışma Takvimi ve Vardiyalar (`App.Hr.WorkCalendar`, `App.Hr.Shift`) Çalışma zamanının iki temel tanımı: resmi tatil / yarım gün takvimi (yıllık tekrarlı ya da tek seferlik) ve vardiya tanımları (saat aralığı, mola, gece vardiyası). Diğer modüller bu tanımları lookup olarak kullanır. Tamamı konfigürasyondur (Wizard + seed); vardiya ayrıca kullanıcı kaydına bağlanır. > Bu doküman modülün tek "nasıl çalışır" kaynağıdır. Modülde yapılan her değişiklik aynı commit'te > buraya yansır (`lowcode.instructions.md` §0.13). --- ## 1. Amaç ve kapsam | Persona | Ne yapar | Ekran | | --- | --- | --- | | İK | Yılın tatil ve yarım günlerini girer, takvim görünümünden kontrol eder | Çalışma Takvimi | | İK / üretim planlama | Vardiya tanımlarını yönetir, çalışanı vardiyaya bağlar | Vardiyalar · Kimlik › Kullanıcılar | Kapsam: kiracı (`IsTenant`). Şube kırılımı yoktur — takvim kiracının tamamı için geçerlidir. --- ## 2. Analiz ve kararlar > Modüller §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Kararlar artefaktlardan > (wizard, seed, commit `130e23bc` "Disiplin Dosyaları, Çalışma Takvimi") okunmuştur. | Konu | Karar | | --- | --- | | Tatil tekrarı | Sabit tarihli resmi tatiller `RecurrenceRule = FREQ=YEARLY` ile **bir kez** girilir, her yıl tekrarlar; dini bayramlar ay takvimine bağlı olduğu için **her yıl ayrı** satırdır (tekrar kuralı boş) | | Gün türü | `Holiday` (tam gün tatil) / `HalfDay` (arife, yarım gün) | | Görünüm | Liste görünümlerine ek olarak **Scheduler** (takvim) görünümü; `AllDay` her zaman `true` | | Vardiya saatleri | `StartTime` / `EndTime` `SS:dd` metin; çalışma süresi elle girilir (otomatik hesap yok) | | Gece vardiyası | Bayrak (`IsNightShift`) — sağlık kartındaki "gece çalışabilir" sonucuyla birlikte değerlendirilir, otomatik kontrol yoktur | | Vardiya bağı | Kullanıcı kaydında `ShiftId` alanı (`LookupQueryValues.TenantShiftValues`: "Ad (başlangıç-bitiş)") | | Menü yeri | Çalışma Takvimi ve Vardiyalar `İnsan Kaynakları` kökündedir. Vardiyalar wizard dosyasında üst menü `App.Hr.Definitions` yazılıdır, menü satırı kökte durur (bkz. §9) | --- ## 3. Menü ve ekranlar | Menü (TR / EN) | `ListFormCode` | Yer | Görünümler | Widget'lar | | --- | --- | --- | --- | --- | | Çalışma Takvimi / Work Calendar | `App.Hr.WorkCalendar` | `İnsan Kaynakları` (sıra 2, `FcCalendar`) | Grid, Card, Pivot, Chart, **Scheduler** | Toplam · Tatil · Yarım Gün | | Vardiyalar / Shifts | `App.Hr.Shift` | `İnsan Kaynakları` (sıra 3, `FcClock`) | Grid, Card, Pivot, Chart | Toplam · Aktif · Pasif | Scheduler eşlemesi: metin `Name`, başlangıç `StartDate`, bitiş `EndDate`, tüm gün `AllDay`, tekrar `RecurrenceRule`. Seed verisi: - Çalışma takvimi, 16 satır (`data/App.Hr.WorkCalendar.json`): - Yıllık tekrarlı tatiller: Yılbaşı, 23 Nisan, 1 Mayıs, 19 Mayıs, 15 Temmuz, 30 Ağustos, 29 Ekim. - Yıllık tekrarlı yarım gün: 28 Ekim arifesi. - Yıla özel satırlar: 2026 ve 2027 Ramazan/Kurban bayramları ve arifeleri. - Vardiyalar, 3 satır (`data/App.Hr.Shift.json`): Sabah 08:00–16:00, Akşam 16:00–00:00, Gece 00:00–08:00 (gece vardiyası). --- ## 4. Veri modeli | Tablo | Kolonlar | | --- | --- | | `Hr_T_WorkCalendar` | `Name`, `StartDate`, `EndDate`, `DayType` (Holiday/HalfDay), `RecurrenceRule` (boş / `FREQ=YEARLY`), `AllDay`, `IsActive` | | `Hr_T_Shift` | `Name`, `StartTime`, `EndTime`, `BreakMinutes`, `WorkingHours`, `IsNightShift`, `IsActive` | | `AbpUsers.ShiftId` | Çalışanın vardiyası (genişletme kolonu) | Entity yoktur (wizard tabloları); `sql/object/Hr_T_{WorkCalendar,Shift}.sql`. --- ## 5. İş kuralları | Yer | Kural | | --- | --- | | Takvim — yeni kayıt | Gün türü `Holiday`, tekrar `FREQ=YEARLY`, tüm gün, aktif | | Takvim — çok günlü tatil | Başlangıç–bitiş aralığı olarak tek satırda girilebilir | | Vardiya — yeni kayıt | Gece vardiyası hayır, aktif | Takvim ve vardiya başka bir hesaba (izin günü, mesai, puantaj) **bağlı değildir**; platformda puantaj/izin hesaplayan modül yoktur. --- ## 6. Yetki ve görünürlük İzin grubu `App.Hr`, modül `Sas|Hr`. Her ekranın kökü + `.Create/.Update/.Delete/.Export/.Import/.Note`. Hiçbir yetki role otomatik atanmaz. Takvimin okunması tüm çalışanlara açılabilir; düzenleme İK'da kalmalıdır. --- ## 7. Entegrasyonlar | Kullanan | Nasıl | | --- | --- | | Kimlik › Kullanıcılar | `ShiftId` alanı vardiya lookup'ı | | Olay Günlüğü (`App.Hr.EventLog`) | Olay kaydında vardiya seçimi | | Sağlık Kartları | Vardiyalı / gece çalışabilir sonucu (bilgi; vardiya tanımıyla otomatik eşleşmez) | --- ## 8. Akış örneği 1. Yıl başında İK **Çalışma Takvimi**'nde o yılın dini bayram satırlarını ekler (sabit tatiller zaten yıllık tekrarlıdır) ve Scheduler görünümünde yılı kontrol eder. 2. Üretim için **Vardiyalar**'a "Hafta Sonu 08:00–20:00, mola 60 dk, çalışma 11 saat" eklenir. 3. Kullanıcı ekranında çalışanların **Vardiya** alanı güncellenir; Olay Günlüğü kayıtlarında da bu vardiyalar seçilir. --- ## 9. Sık sorulanlar ve bilinen sınırlar **Ramazan Bayramı gelecek yıl görünmüyor.** Dini bayramlar yıla özeldir; her yıl yeni satır girilir. **Çalışma süresi neden hesaplanmıyor?** Vardiya saatleri metindir, süre elle girilir. **Takvim izin/puantaj hesabını etkiliyor mu?** Hayır; bu hesapları yapan bir modül yoktur. **Vardiyalar menüde Tanımlamalar altında değil.** Menü satırı `İnsan Kaynakları` kökündedir; wizard dosyasındaki üst menü (`App.Hr.Definitions`) eski değerdir. Wizard yeniden deploy edilirse menü Tanımlamalar altına taşınabilir — yeniden deploy etmeden önce wizard'daki üst menü kökle eşitlenmelidir. --- ## 10. Dosyalar ve geri alma | Dosya | İçerik | | --- | --- | | `configs/seeds/host/sql/object/Hr_T_{WorkCalendar,Shift}.sql` | Tablolar | | `configs/seeds/host/wizard/{WorkCalendar,Shift}.json` | 2 wizard | | `configs/seeds/host/data/App.Hr.{WorkCalendar,Shift}.json` | Takvim ve vardiya verisi (ekran kayıtları dosyaya aynalanır) | | `api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs` (`TenantShiftValues`) | Kullanıcı ekranındaki vardiya lookup'ı | Geri alma: Wizard Manager'dan silinir; vardiya tablosu kullanıcı ekranının lookup'ı tarafından okunduğu için düşürülmemelidir. ## Ek — Ekran envanteri (otomatik) > Wizard dosyalarından üretilir; deploy, silme, tasarımcı kaydı ve import'ta yenilenir. Elle düzenleme bir sonraki yenilemede kaybolur. ### Çalışma Takvimi — `App.Hr.WorkCalendar` | Özellik | Değer | | --- | --- | | Wizard | `wizard/WorkCalendar.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr` › `App.Hr.WorkCalendar` (sıra 2) | | Yetki | `App.Hr.WorkCalendar` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Çalışma Takvimi — resmi tatiller, arife (yarım gün) ve çalışılmayan günler. | | Kaynak | `Hr_T_WorkCalendar` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart, Scheduler (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Widget'lar | `App.Widget.Total`, `App.Hr.WorkCalendar.DayType.Holiday`, `App.Hr.WorkCalendar.DayType.HalfDay` | | Form varsayılanları | DayType=Holiday, RecurrenceRule=FREQ=YEARLY, AllDay=true, IsActive=true | | Veri aynası | `data/App.Hr.WorkCalendar.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Adı | dxTextBox | ✓ | ✓ | | | `StartDate` | Başlangıç Tarihi | dxDateBox | ✓ | ✓ | | | `EndDate` | Bitiş Tarihi | dxDateBox | ✓ | ✓ | | | `DayType` | Gün Türü | dxSelectBox | ✓ | ✓ | liste: Holiday, HalfDay | | `RecurrenceRule` | Tekrarlama Kuralı | dxSelectBox | | ✓ | liste: FREQ=YEARLY | | `AllDay` | Tüm Gün | dxCheckBox | | | | | `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | | ### Vardiyalar — `App.Hr.Shift` | Özellik | Değer | | --- | --- | | Wizard | `wizard/Shift.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Definitions` › `App.Hr.Shift` (sıra 9) | | Yetki | `App.Hr.Shift` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Vardiyalar — çalışma vardiyalarının tanımı (sabah, akşam, gece…). | | Geliştirme talebi | Human Resources -> Olay Günlüğü | | Kaynak | `Hr_T_Shift` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Widget'lar | `App.Widget.Total`, `App.Widget.Active`, `App.Widget.Passive` | | Form varsayılanları | IsNightShift=false, IsActive=true | | Veri aynası | `data/App.Hr.Shift.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Vardiya Adı | dxTextBox | ✓ | ✓ | | | `StartTime` | Başlangıç Saati | dxTextBox | | ✓ | | | `EndTime` | Bitiş Saati | dxTextBox | | ✓ | | | `BreakMinutes` | Mola (dk) | dxNumberBox | | ✓ | | | `WorkingHours` | Çalışma Süresi (Saat) | dxNumberBox | | ✓ | | | `IsNightShift` | Gece Vardiyası | dxCheckBox | ✓ | ✓ | | | `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | |