# İK › Disiplin Dosyaları (`App.Hr.DisciplinaryCase`) Personel disiplin süreci: olay tutanağı (personel, tarih/saat/yer, tanıklar, tutanağı tutan) → savunma talebi ve savunma → karar (ceza türü, yürürlük/tebliğ, ücret kesintisi) → belgeler. Tamamı konfigürasyondur (Wizard + SQL); entity, migration ya da React kodu yoktur. > 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 / disiplin kurulu sekreteryası | Dosya açar, tutanağı yazar, savunma ister, savunmayı ve kararı işler, belgeleri yükler, dosyayı kapatır | Disiplin Dosyaları | | Yönetici (tutanağı tutan) | Olayı kaydeder | Disiplin Dosyaları | | İK yöneticisi | Ceza türü tanımlarını yönetir | İK › Tanımlar › Ceza Türleri | Kapsam: kiracı (`IsTenant`). Satır süzmesi yoktur; disiplin kaydı hassas veridir, görünürlük yalnızca yetkiyle sınırlanır. --- ## 2. Analiz ve kararlar > Modül §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Kararlar artefaktlardan (wizard, > SQL, seed, commit `130e23bc` "Disiplin Dosyaları, Çalışma Takvimi") okunmuştur. | Konu | Karar | | --- | --- | | Yol | Tek menü ekranı (dosya) + üç menüsüz alt form: Savunmalar, Kararlar, Belgeler | | Menü yeri | Dosya ekranı doğrudan `İnsan Kaynakları` kökünde; ceza türü İK › Tanımlar'da | | Dosya durumu | Open → AwaitingDefense → Decided → Closed; **elle** değiştirilir (Todo panosunda sürükleyerek ya da formdan). Savunma/karar girilmesi durumu otomatik değiştirmez | | Savunma süresi | Son savunma tarihi = talep tarihi + **2 gün** (formda önerilir, değiştirilebilir); talep tarihinden önce olamaz | | Ceza türü | Ağırlık (`Severity` 1–5) sırasıyla listelenir; karar ekranında yalnız aktif türler | | Ücret kesintisi | Kararda tutar olarak saklanır; bordroya aktarım yoktur | | Tanıklar | Çok değerli kullanıcı seçimi (`WitnessUserIds`, `dxTagBox`) | | Dosya numarası | `DSP-YYYY-00001` (kiracı + yıl bazında, insert sonrası SQL) | | Onay akışı, bildirim, rapor | Yok | --- ## 3. Menü ve ekranlar | Menü (TR / EN) | `ListFormCode` | Yer | Alt formlar | Görünümler | Widget'lar | | --- | --- | --- | --- | --- | --- | | Disiplin Dosyaları / Disciplinary Cases | `App.Hr.DisciplinaryCase` | `İnsan Kaynakları` (sıra 10, `FcHighPriority`) | `DisciplinaryDefense`, `DisciplinaryDecision`, `DisciplinaryFile` (`Id → CaseId`) | Grid, Card, Pivot, Chart, **Todo** | Toplam · Açık · Savunma Bekleniyor · Kapanan (Karara Bağlandı + Kapandı) | | Ceza Türleri / Penalty Types | `App.Hr.DisciplinaryPenaltyType` | `İnsan Kaynakları › Tanımlar` | — | Grid, Card, Pivot, Chart | — (tanım listesi) | Todo panosu: başlık `Subject`, açıklama `IncidentDescription`, tarih `IncidentDate`, sütun sırası `Open, AwaitingDefense, Decided, Closed`. Seed verisi (`data/App.Hr.DisciplinaryPenaltyType.json`): Sözlü Uyarı (1), Yazılı Uyarı (2), İhtar (3), Kınama (3), Ücret Kesintisi (4), Fesih (5). --- ## 4. Veri modeli ``` AbpUsers ──< Hr_T_DisciplinaryCase ──< Hr_T_DisciplinaryDefense (UserId, ReportedById, ├──< Hr_T_DisciplinaryDecision >── Hr_T_DisciplinaryPenaltyType WitnessUserIds) └──< Hr_T_DisciplinaryFile >── Hr_T_DocumentType ``` | Tablo | Önemli kolonlar | | --- | --- | | `Hr_T_DisciplinaryPenaltyType` | `Name`, `Severity`, `Description`, `IsActive` | | `Hr_T_DisciplinaryCase` | `CaseNo`, `UserId`, `DepartmentId`, `JobPositionId`, `IncidentDate`, `IncidentTime`, `IncidentPlace`, `ReportedById`, `Status`, `Subject`, `IncidentDescription` (HTML tutanak), `WitnessUserIds` | | `Hr_T_DisciplinaryDefense` | `CaseId`, `RequestDate`, `DueDate`, `ResponseDate`, `Status` (Requested/Submitted/NotSubmitted), `DefenseText` (HTML) | | `Hr_T_DisciplinaryDecision` | `CaseId`, `DecisionDate`, `PenaltyTypeId`, `EffectiveDate`, `NotificationDate`, `DeductionAmount`, `Status` (Draft/Final), `DecisionText` (HTML) | | `Hr_T_DisciplinaryFile` | `CaseId`, `DocumentTypeId`, `FileDate`, `FileName`, `FileContent` | Tablo düzeyinde CHECK ya da tekil indeks yoktur; kurallar formdadır. --- ## 5. İş kuralları ve hesaplar | Yer | Kural | | --- | --- | | Dosya — yeni kayıt | Olay tarihi bugün, tutanağı tutan oturumdaki kullanıcı, durum `Open` | | Dosya — personel seçimi | Departman ve pozisyon kullanıcı kaydından kopyalanır (olay anındaki hâli saklanır) | | Dosya — insert sonrası | `CaseNo = 'DSP-' + yıl + '-' + 5 hane` (kiracı + yıl içinde `MAX + 1`, yalnız boşsa) | | Savunma — yeni kayıt | Talep tarihi bugün, durum `Requested`, son tarih talep + 2 gün | | Savunma — tarih kontrolü | Son tarih talep tarihinden önceyse uyarı + değişiklik geri alınır | | Karar — yeni kayıt | Karar tarihi bugün, durum `Draft` | | Belge — yeni kayıt | Tarih bugün | Tavsiye edilen kullanım sırası: dosya `Open` → savunma istenince `AwaitingDefense` → karar `Final` olunca `Decided` → tebliğ ve belgeler tamamlanınca `Closed`. Bu sıra sistemce zorlanmaz. --- ## 6. Yetki ve görünürlük İzin grubu `App.Hr`, modül `Sas|Hr`. `App.Hr.DisciplinaryCase` kökü + `.Create/.Update/.Delete/.Export/.Import/.Note`; `DisciplinaryDefense`, `DisciplinaryDecision`, `DisciplinaryFile` onun altındadır. Ceza türü `App.Hr.Definitions` altındadır. Satır süzmesi yoktur. Hiçbir yetki role otomatik atanmaz. | Rol | Yetkiler | | --- | --- | | İK disiplin sorumlusu | Dosya + üç alt form (tam) + ceza türü | | Tutanak tutan yönetici | `App.Hr.DisciplinaryCase` (+ `.Create`) — ancak bu yetki tüm dosyaları gösterir | Disiplin verisi kişisel ve hassas veridir; okuma yetkisi dar tutulmalıdır. --- ## 7. Entegrasyonlar | Kaynak | Kullanım | | --- | --- | | `AbpUsers` | Personel, tutanağı tutan, tanıklar | | Kullanıcı detayı › Disiplin | Disiplin Dosyaları ekranı çalışana süzülmüş açılır (`HrPersonnel.md`) | | `Hr_T_Department`, `Hr_T_JobPosition` | Olay anındaki birim (Pivot kırılımı) | | `Hr_T_DocumentType` | Belge türü (ortak İK tanımı) | Bildirim, onay akışı, rapor şablonu ya da bordro bağlantısı yoktur. --- ## 8. Akış örneği 1. Vardiya amiri **Disiplin Dosyaları**'nda yeni dosya açar: personel seçilir (departman/pozisyon dolar), olay tarihi/saati/yeri, konu, tutanak metni ve tanıklar girilir → `DSP-2026-00001`, durum Açık. 2. İK **Savunmalar** sekmesine savunma talebi ekler; son tarih 2 gün sonrası önerilir; dosya panoda **Savunma Bekleniyor**'a çekilir. 3. Personel savunmasını verince talep **Savunma Verildi** yapılır, metin ve tarih girilir; verilmezse **Savunma Verilmedi**. 4. Kurul kararı **Kararlar** sekmesine girilir: ceza türü Yazılı Uyarı, yürürlük ve tebliğ tarihi, durum **Kesinleşti**; dosya **Karara Bağlandı**. 5. İmzalı tutanak, savunma ve tebliğ belgesi **Belgeler** sekmesine yüklenir; dosya **Kapandı** yapılır. --- ## 9. Sık sorulanlar **Savunma/karar girdim, dosya durumu değişmedi.** Durum elle yönetilir; panoda sürükleyin ya da formdan seçin. **Son savunma tarihi neden 2 gün sonrası?** Formdaki varsayılan öneridir; değiştirilebilir, yalnızca talep tarihinden önce olamaz. **Ücret kesintisi bordroya yansıyor mu?** Hayır; karar kaydında bilgi olarak durur. **Tutanak metni listede görünmüyor.** HTML alan listede gizlidir; detayda ve Todo kartında görünür. **Bir yöneticinin yalnız kendi tuttuğu dosyaları görmesi mümkün mü?** Şu an değil (satır süzmesi yok). Gerekirse ayrı bir persona ekranı `DefaultFilter` (`"ReportedById" = '@USERID'`) ile açılır (Performans modülündeki kalıp). --- ## 10. Dosyalar ve geri alma | Dosya | İçerik | | --- | --- | | `configs/seeds/sql/object/Hr_T_Disciplinary{PenaltyType,Case,Defense,Decision,File}.sql` | Tablolar | | `configs/seeds/wizard/Disciplinary{PenaltyType,Case,Defense,Decision,File}.json` | 5 wizard | | `configs/seeds/data/App.Hr.DisciplinaryPenaltyType.json` | Ceza türleri | | `configs/seeds/data/App.Menus.Menu.json`, `Abp.Identity.Permissions.json`, `App.Languages.LanguageText.json` | Menü, yetki, dil satırları | Kurulum: DB Migrate. Geri alma: Wizard Manager'dan alt formlar (`DisciplinaryDefense`, `DisciplinaryDecision`, `DisciplinaryFile`) önce, sonra `DisciplinaryCase` ve `DisciplinaryPenaltyType` silinir; tablolar yalnızca onayda seçilirse düşer. ## Ek — Ekran envanteri (otomatik) > Wizard dosyalarından üretilir; deploy, silme, tasarımcı kaydı ve import'ta yenilenir. Elle düzenleme bir sonraki yenilemede kaybolur. ### Disiplin Dosyaları — `App.Hr.DisciplinaryCase` | Özellik | Değer | | --- | --- | | Wizard | `wizard/DisciplinaryCase.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr` › `App.Hr.DisciplinaryCase` (sıra 10) | | Yetki | `App.Hr.DisciplinaryCase` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Disiplin Dosyaları — bir personel hakkındaki olay tutanağı ile başlayan disiplin süreci: savunma, karar ve belgeler tek dosyada. | | Kaynak | `Hr_T_DisciplinaryCase` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart, Todo (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Alt formlar | `App.Hr.DisciplinaryDefense` (Id → CaseId), `App.Hr.DisciplinaryDecision` (Id → CaseId), `App.Hr.DisciplinaryFile` (Id → CaseId) | | Widget'lar | `App.Widget.Total`, `App.Hr.DisciplinaryCase.Widget.Open`, `App.Hr.DisciplinaryCase.Widget.AwaitingDefense`, `App.Hr.DisciplinaryCase.Widget.Closed` | | Todo | başlık `Subject`, durum `Status` (Open,AwaitingDefense,Decided,Closed) | | Komutlar | InsertAfter: SQL | | Form varsayılanları | IncidentDate=@DATE, ReportedById=@USERID, Status=Open | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `CaseNo` | Dosya No | dxTextBox | | | | | `UserId` | Personel | dxSelectBox | ✓ | ✓ | sorgu: AbpUsers · script | | `DepartmentId` | Departman | dxSelectBox | | ✓ | sorgu: Hr_T_Department | | `JobPositionId` | Pozisyon | dxSelectBox | | ✓ | sorgu: Hr_T_JobPosition | | `IncidentDate` | Olay Tarihi | dxDateBox | ✓ | ✓ | | | `IncidentTime` | Olay Saati | dxDateBox | | ✓ | | | `IncidentPlace` | Olay Yeri | dxTextBox | | ✓ | | | `ReportedById` | Tutanağı Tutan | dxSelectBox | | ✓ | sorgu: AbpUsers | | `Status` | Durum | dxRadioGroup | ✓ | ✓ | liste: Open, AwaitingDefense, Decided, Closed | | `Subject` | Konu | dxTextBox | ✓ | ✓ | | | `IncidentDescription` | Olay Tutanağı | dxHtmlEditor | ✓ | ✓ | | | `WitnessUserIds` | Tanıklar | dxTagBox | | ✓ | sorgu: AbpUsers | ### Ceza Türleri — `App.Hr.DisciplinaryPenaltyType` | Özellik | Değer | | --- | --- | | Wizard | `wizard/DisciplinaryPenaltyType.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Definitions` › `App.Hr.DisciplinaryPenaltyType` (sıra 17) | | Yetki | `App.Hr.DisciplinaryPenaltyType` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Ceza Türleri — disiplin kararlarında verilebilecek cezalar ve ağırlıkları (sözlü uyarı, yazılı uyarı, ihtar, kınama, ücret kesintisi, fesih). | | Kaynak | `Hr_T_DisciplinaryPenaltyType` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Form varsayılanları | Severity=1, IsActive=true | | Veri aynası | `data/App.Hr.DisciplinaryPenaltyType.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Ad | dxTextBox | ✓ | ✓ | | | `Severity` | Ağırlık | dxNumberBox | ✓ | ✓ | | | `Description` | Açıklama | dxTextArea | | ✓ | | | `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | | ### Savunmalar — `App.Hr.DisciplinaryDefense` | Özellik | Değer | | --- | --- | | Wizard | `wizard/DisciplinaryDefense.json` | | Yol | Liste (Wizard) | | Menü | Menüsüz (alt form) | | Yetki | `App.Hr.DisciplinaryDefense` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Savunmalar — disiplin dosyası için personelden istenen savunma ve verilen cevap. | | Kaynak | `Hr_T_DisciplinaryDefense` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Form varsayılanları | RequestDate=@DATE, Status=Requested | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `CaseId` | Disiplin Dosyası | dxTextBox | | | | | `RequestDate` | Talep Tarihi | dxDateBox | ✓ | ✓ | script | | `DueDate` | Son Savunma Tarihi | dxDateBox | ✓ | ✓ | script | | `ResponseDate` | Savunma Tarihi | dxDateBox | | ✓ | | | `Status` | Durum | dxRadioGroup | ✓ | ✓ | liste: Requested, Submitted, NotSubmitted | | `DefenseText` | Savunma Metni | dxHtmlEditor | | ✓ | | ### Kararlar — `App.Hr.DisciplinaryDecision` | Özellik | Değer | | --- | --- | | Wizard | `wizard/DisciplinaryDecision.json` | | Yol | Liste (Wizard) | | Menü | Menüsüz (alt form) | | Yetki | `App.Hr.DisciplinaryDecision` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Kararlar — disiplin dosyası için verilen karar ve ceza. | | Kaynak | `Hr_T_DisciplinaryDecision` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Form varsayılanları | DecisionDate=@DATE, Status=Draft | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `CaseId` | Disiplin Dosyası | dxTextBox | | | | | `DecisionDate` | Karar Tarihi | dxDateBox | ✓ | ✓ | | | `PenaltyTypeId` | Ceza Türü | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_DisciplinaryPenaltyType | | `EffectiveDate` | Yürürlük Tarihi | dxDateBox | | ✓ | | | `NotificationDate` | Tebliğ Tarihi | dxDateBox | | ✓ | | | `DeductionAmount` | Kesinti Tutarı | dxNumberBox | | ✓ | | | `Status` | Durum | dxRadioGroup | ✓ | ✓ | liste: Draft, Final | | `DecisionText` | Karar Metni | dxHtmlEditor | | ✓ | | ### Belgeler — `App.Hr.DisciplinaryFile` | Özellik | Değer | | --- | --- | | Wizard | `wizard/DisciplinaryFile.json` | | Yol | Liste (Wizard) | | Menü | Menüsüz (alt form) | | Yetki | `App.Hr.DisciplinaryFile` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Disiplin Belgeleri — dosyaya ait imzalı tutanak, savunma, tebliğ gibi belgeler. | | Kaynak | `Hr_T_DisciplinaryFile` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Form varsayılanları | FileDate=@DATE | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `CaseId` | Disiplin Dosyası | dxTextBox | | | | | `DocumentTypeId` | Dosya Türü | dxSelectBox | | ✓ | sorgu: Hr_T_DocumentType | | `FileDate` | Tarih | dxDateBox | ✓ | ✓ | | | `FileName` | Dosya Adı | dxTextBox | ✓ | ✓ | | | `FileContent` | Dosya | dxImageUpload | ✓ | ✓ | |