15 KiB
İ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 11, 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 |
Hr_T_DisciplinaryDecision |
CaseId, DecisionDate, PenaltyTypeId, EffectiveDate, NotificationDate, DeductionAmount, Status (Draft/Final), DecisionText |
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 |
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
- 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. - İK Savunmalar sekmesine savunma talebi ekler; son tarih 2 gün sonrası önerilir; dosya panoda Savunma Bekleniyor'a çekilir.
- Personel savunmasını verince talep Savunma Verildi yapılır, metin ve tarih girilir; verilmezse Savunma Verilmedi.
- 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ı.
- İ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.
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 11) |
| 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 12) |
| 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 | dxTextArea | ✓ |
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 | dxTextArea | ✓ |
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 | ✓ | ✓ |