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

299 lines
16 KiB
Markdown
Raw Normal View History

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 -->