2026-10-04 15:04:16 +00:00
<!-- module - doc: claims=App.Hr.DisciplinaryPenaltyType -->
# İ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 |
| --- | --- | --- | --- | --- | --- |
2026-10-04 21:18:13 +00:00
| 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ı ) |
2026-10-04 15:04:16 +00:00
| 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` |
2026-10-04 21:18:13 +00:00
| `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) |
2026-10-04 15:04:16 +00:00
| `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 |
2026-10-04 21:18:13 +00:00
| Kullanı cı detayı › Disiplin | Disiplin Dosyaları ekranı çalı şana süzülmüş açı lı r (`HrPersonnel.md`) |
2026-10-04 15:04:16 +00:00
| `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/host/sql/object/Hr_T_Disciplinary{PenaltyType,Case,Defense,Decision,File}.sql` | Tablolar |
| `configs/seeds/host/wizard/Disciplinary{PenaltyType,Case,Defense,Decision,File}.json` | 5 wizard |
| `configs/seeds/host/data/App.Hr.DisciplinaryPenaltyType.json` | Ceza türleri |
| `configs/seeds/host/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.
<!-- 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.
### Disiplin Dosyaları — `App.Hr.DisciplinaryCase`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/DisciplinaryCase.json` |
| Yol | Liste (Wizard) |
2026-10-04 21:18:13 +00:00
| Menü | `App.Hr` › `App.Hr.DisciplinaryCase` (sı ra 10) |
2026-10-04 15:04:16 +00:00
| 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) |
2026-10-04 21:18:13 +00:00
| Menü | `App.Hr.Definitions` › `App.Hr.DisciplinaryPenaltyType` (sı ra 17) |
2026-10-04 15:04:16 +00:00
| 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 |
2026-10-04 21:18:13 +00:00
| `DefenseText` | Savunma Metni | dxHtmlEditor | | ✓ | |
2026-10-04 15:04:16 +00:00
### 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 |
2026-10-04 21:18:13 +00:00
| `DecisionText` | Karar Metni | dxHtmlEditor | | ✓ | |
2026-10-04 15:04:16 +00:00
### 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 | ✓ | ✓ | |
<!-- module - doc:auto:end -->