sozsoft-platform/configs/seeds/host/docs/modules/HrWorkCalendar.md

196 lines
9.4 KiB
Markdown
Raw Normal View History

2026-10-04 15:04:16 +00:00
<!-- module-doc: claims=App.Hr.Shift -->
# İ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.
<!-- module-doc:auto:begin -->
## 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 | ✓ | ✓ | |
<!-- module-doc:auto:end -->