sozsoft-platform/configs/seeds/docs/modules/HrTrainings.md

320 lines
18 KiB
Markdown
Raw Normal View History

2026-10-04 15:04:16 +00:00
# İK › Eğitimler (`App.Hr.Trainings`)
Şirket içi ve dışı eğitimlerin kaydı: eğitim tipi → konu tanımları, eğitim oturumu (tarih/saat,
süre, yer, eğitmen, maliyet, kazandırdığı yetkinlikler), katılımcılar (katılım durumu, puan,
katılım belgesi) ve eğitim dosyaları. Tamamı konfigürasyondur (Wizard + rapor şablonu); 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 / eğitim sorumlusu | Tip ve konu tanımlar, eğitim açar, katılımcı ekler, katılım/puan girer, dosya yükler, katılım belgesi basar | Eğitim Tipleri · Eğitim Konuları · Eğitimler |
| Yönetim | Eğitim adedi, açık/kapalı durum ve toplam maliyeti izler (widget, Pivot, Chart) | Eğitimler |
Kapsam: kiracı (`IsTenant`). Eğitim bir şubeye bağlıdır (`BranchId` zorunlu); satır süzmesi yoktur.
---
## 2. Analiz ve kararlar
> Modül §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Kararlar artefaktlardan
> (wizard, SQL, seed, commit `36546d0c` "Human Resources -> Eğitim bilgileri") okunmuştur.
| Konu | Karar |
| --- | --- |
| Yol | Wizard ekranları; eğitim kaydının altında Katılımcılar ve Dosyalar sekmeleri (menüsüz alt formlar) |
| Tanımlar | Tip ve konu tanımları İK › Tanımlar'da değil **Eğitimler** dalının içindedir; konu bir tipe bağlıdır ve tip seçimine göre süzülür |
| Süre | `Toplam Süre (saat) = gün sayısı (bitiş dahil) × günlük saat (bitiş – başlangıç saati)` — formda hesaplanır |
| Maliyet | Altı kalem (yer, eğitmen, konaklama, ulaşım, ikram, diğer) toplanarak `CostTotal` formda hesaplanır |
| Yetkinlik | Eğitimin kazandırdığı yetkinlikler `SkillIds` (çok değerli, `Hr_T_Skill`) olarak saklanır; çalışan profiline (`Adm_T_UserSkill`) **yazılmaz** |
| Katılımcı | Personel seçilince işe giriş tarihi, departman ve pozisyon kullanıcı kaydından kopyalanır (eğitim anındaki hâli saklanır) |
| Katılım durumu | Attended / NotAttended / Excused; varsayılan **Attended** |
| Katılım belgesi | Yalnızca `Attended` satırda görünen satır butonu → **Katılım Belgesi** raporu (`DynamicReport`) |
| Dosyalar | Belge türü `Hr_T_DocumentType` (ortak İK tanımı); dosya içeriği base64 (`dxImageUpload`) |
---
## 3. Menü ve ekranlar
`İnsan Kaynakları › Eğitimler` (`App.Hr.Trainings`, ikon `FcGraduationCap`)
| Sıra | Menü (TR / EN) | `ListFormCode` | Alt formlar | Görünümler | Widget'lar |
| --- | --- | --- | --- | --- | --- |
| 1 | Eğitim Tipleri / Training Types | `App.Hr.TrainingType` | — | Grid, Card, Pivot, Chart | Toplam · Aktif · Pasif |
| 2 | Eğitim Konuları / Training Subjects | `App.Hr.TrainingSubject` | — | Grid, Card, Pivot, Chart | Toplam · Aktif · Pasif |
| 3 | Eğitimler / Trainings | `App.Hr.Training` | `TrainingParticipant`, `TrainingFile` (`Id → TrainingId`, menüsüz) | Grid, Card, Pivot, Chart | Toplam · Açık · Kapalı · Toplam Maliyet |
Seed verisi: 8 eğitim tipi (Oryantasyon, İş Başı, Teknik Oryantasyon, Grup, Firma Dışı, Eğitim
İçerikli Sosyal Faaliyet, Akademi, Rotasyon) ve 18 eğitim konusu (`data/App.Hr.{TrainingType,TrainingSubject}.json`).
Satır butonu: Katılımcılar › **Katılım Belgesi** — rapor `3840a20d-3233-4d17-bc06-ccfd8d87b32a`,
görünürlük `AttendanceStatus === 'Attended'`.
---
## 4. Veri modeli
```
Hr_T_TrainingType ──< Hr_T_TrainingSubject
│ │
└──────< Hr_T_Training >──── Sas_T_Branch
├──< Hr_T_TrainingParticipant >── AbpUsers (+ Department, JobPosition)
└──< Hr_T_TrainingFile >── Hr_T_DocumentType
```
| Tablo | Önemli kolonlar | Kural |
| --- | --- | --- |
| `Hr_T_TrainingType` | `Name`, `IsActive` | — |
| `Hr_T_TrainingSubject` | `TrainingTypeId`, `Name`, `IsEvaluated` (değerlendirilsin mi), `IsActive` | — |
| `Hr_T_Training` | `TrainingTypeId`, `TrainingSubjectId` (tipe göre cascade), `EntryDate`, `BranchId`, `StartDate`, `EndDate`, `StartTime`, `EndTime`, `TotalHours`, `Status` (Open/Closed), `TrainerName`, `TrainingPlace`, `TrainingInstitution`, `Description`, `SkillIds`, `CostPlace`, `CostTrainer`, `CostAccommodation`, `CostTransport`, `CostCatering`, `CostOther`, `CostTotal` | Bitiş başlangıçtan önce olamaz (form) |
| `Hr_T_TrainingParticipant` | `TrainingId`, `UserId`, `HireDate`, `DepartmentId`, `JobPositionId`, `AttendanceStatus`, `EvaluationScore`, `ExamScore`, `LeaveDate`, `Note` | — |
| `Hr_T_TrainingFile` | `TrainingId`, `DocumentTypeId`, `FileDate`, `FileName`, `FileContent` | Dosya zorunlu |
Tablo düzeyinde CHECK ya da tekil indeks yoktur; kurallar formdadır.
---
## 5. İş kuralları ve hesaplar
Hesapların tamamı `EditorScript`'tir (sunucu tarafında after-command yoktur):
| Alan | Kural |
| --- | --- |
| `EntryDate` | Yeni kayıtta bugün |
| `Status` | Yeni kayıtta `Open` |
| `TotalHours` | Başlangıç/bitiş tarihi ya da saatlerinden biri değişince `round(days(StartDate, EndDate) × hours(StartTime, EndTime), 2)`; dört alan dolu olmalı |
| `EndDate` | Başlangıçtan önceyse uyarı + değişiklik geri alınır |
| `CostTotal` | Altı maliyet kaleminden biri değişince toplam |
| Katılımcı `UserId` | Seçilince `HireDate`, `DepartmentId`, `JobPositionId` kopyalanır |
| `AttendanceStatus` | Yeni satırda `Attended` |
| Dosya `FileDate` | Yeni satırda bugün |
| Tip/Konu `IsActive`, `IsEvaluated` | Yeni kayıtta `true` |
Saat hesabı aynı günlük saat aralığının her gün tekrarlandığını varsayar; gün sayısına bitiş günü dahildir.
---
## 6. Yetki ve görünürlük
İzin grubu `App.Hr`, modül `Sas|Hr`. Yetki ağacı menüyü izler: `App.Hr.Trainings` ara yetkisinin
altında üç ekranın kökü + `.Create/.Update/.Delete/.Export/.Import/.Note`; `TrainingParticipant` ve
`TrainingFile` `App.Hr.Training` altındadır. Satır süzmesi yoktur. Hiçbir yetki role otomatik atanmaz.
| Rol | Yetkiler |
| --- | --- |
| Eğitim sorumlusu | `App.Hr.Trainings` dalının tamamı |
| Bölüm yöneticisi (izleme) | `App.Hr.Training` + `App.Hr.TrainingParticipant` (salt okuma) |
---
## 7. Entegrasyonlar
| Kaynak | Kullanım |
| --- | --- |
| `Sas_T_Branch` | Eğitimin şubesi |
| `AbpUsers` | Katılımcı; işe giriş tarihi, departman, pozisyon kopyası |
2026-10-04 21:18:13 +00:00
| Kullanıcı detayı › Eğitimler | Katılımcılar ekranı çalışana süzülmüş açılır; satır eklemek çalışanı eğitime katılımcı yapar (`HrPersonnel.md`) |
2026-10-04 15:04:16 +00:00
| `Hr_T_Department`, `Hr_T_JobPosition` | Katılımcının o anki birimi (Pivot kırılımı) |
| `Hr_T_Skill` / `Hr_T_SkillType` | Eğitimin kazandırdığı yetkinlikler |
| `Hr_T_DocumentType` | Eğitim dosyası türü |
| Raporlar | Katılım Belgesi (`DynamicReport`, `Raporlar` kategorisi) |
2026-10-04 21:18:13 +00:00
| Performans Yönetimi | Gelişim planı aksiyonu bir eğitime bağlanabilir (`Hr_T_DevelopmentPlan.TrainingId`); çalışan o eğitimde **Attended** ise aksiyon kendiliğinden tamamlanır: plan kaydında ve katılımcı kaydında (`Hr_S_DevelopmentPlanSync`, `Hr_S_TrainingSync`; bkz. `HrPerformance.md`) |
| Puantaj ve Devam Takibi | **Katıldı** işaretli katılımcının başlangıç–bitiş arasındaki iş günleri puantajda `Eğitimde` (vardiya saatleriyle) yazılır, okutması olmadığı için devamsız sayılmaz. Eğitim ya da katılımcı eklenince, değişince, silinince `Hr_S_TrainingSync` günleri hemen yeniden hesaplar (`HrAttendance.md` §7.1) |
2026-10-04 15:04:16 +00:00
---
## 8. Akış örneği
1. İK **Eğitimler**'de "İş Sağlığı ve Güvenliği" kaydını açar: tip Grup Eğitimi, konu İSG, şube
Merkez, 3–4 Kasım 09:00–17:00 → toplam süre 16 saat; eğitmen ve yer maliyetini girer → toplam
maliyet hesaplanır; kazandırdığı yetkinliği (İSG) seçer.
2. **Katılımcılar** sekmesine personeli ekler; departman/pozisyon kopyalanır, durum Katıldı.
3. Gelmeyen personeli **Katılmadı**, raporlu olanı **Mazeretli** yapar; sınav/değerlendirme puanlarını girer.
4. Katılanların satırından **Katılım Belgesi** basılır; imzalı liste **Dosyalar** sekmesine yüklenir.
5. Eğitim **Kapalı** yapılır; widget'taki toplam maliyete eklenir.
---
## 9. Sık sorulanlar
**Toplam süre hesaplanmıyor.** Başlangıç/bitiş tarihi ve başlangıç/bitiş saatinin dördü de dolu olmalı.
**Katılım belgesi butonu görünmüyor.** Yalnızca katılım durumu "Katıldı" olan satırda çıkar.
**Eğitim konusu listesi boş.** Konu, seçilen eğitim tipine göre süzülür; önce tip seçin.
**Eğitimdeki yetkinlik çalışan profiline yazılıyor mu?** Hayır; `SkillIds` eğitimin bilgisidir. Profil, Performans Yönetimi'nde tamamlanan değerlendirmeden güncellenir.
**Katılımcının departmanı sonradan değişti, eğitimde eski görünüyor.** Bilinçli: eğitim anındaki birim saklanır.
---
## 10. Dosyalar ve geri alma
| Dosya | İçerik |
| --- | --- |
2026-10-05 12:58:59 +00:00
| `configs/seeds/sql/object/Hr_T_{TrainingType,TrainingSubject,Training,TrainingParticipant,TrainingFile}.sql` | Tablolar |
| `configs/seeds/wizard/{TrainingType,TrainingSubject,Training,TrainingParticipant,TrainingFile}.json` | 5 wizard |
| `configs/seeds/data/App.Hr.{TrainingType,TrainingSubject}.json` | Tanım verisi |
| `configs/seeds/data/App.Reports.ReportTemplates.json` | Katılım Belgesi şablonu |
| `configs/seeds/data/App.Menus.Menu.json`, `Abp.Identity.Permissions.json`, `App.Languages.LanguageText.json` | Menü, yetki, dil satırları |
2026-10-04 15:04:16 +00:00
Kurulum: DB Migrate. Geri alma: Wizard Manager'dan alt formlar (`TrainingParticipant`, `TrainingFile`)
önce, sonra `Training`, `TrainingSubject`, `TrainingType` silinir; tablolar yalnızca onayda seçilirse
düşer. Gelişim planlarındaki `TrainingId` bağları silinmez, boşa 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.
### Eğitim Tipleri — `App.Hr.TrainingType`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/TrainingType.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Hr.Trainings` › `App.Hr.TrainingType` (sıra 1) |
| Yetki | `App.Hr.TrainingType` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Eğitim Tipleri — eğitimlerin türü (oryantasyon, iş başı, grup, firma dışı, akademi, rotasyon…). |
| Geliştirme talebi | Human Resources -> Eğitim |
| Kaynak | `Hr_T_TrainingType` · 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` |
| Veri aynası | `data/App.Hr.TrainingType.json` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `Name` | Adı | dxTextBox | ✓ | ✓ | |
| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | script |
### Eğitim Konuları — `App.Hr.TrainingSubject`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/TrainingSubject.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Hr.Trainings` › `App.Hr.TrainingSubject` (sıra 2) |
| Yetki | `App.Hr.TrainingSubject` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Eğitim Konuları — bir eğitim tipine bağlı konu başlıkları (İSG, siber güvenlik, iş başı eğitimi…). |
| Geliştirme talebi | Human Resources -> Eğitim |
| Kaynak | `Hr_T_TrainingSubject` · 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` |
| Veri aynası | `data/App.Hr.TrainingSubject.json` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TrainingTypeId` | Eğitim Tipi | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_TrainingType |
| `Name` | Eğitim Konusu | dxTextBox | ✓ | ✓ | |
| `IsEvaluated` | Değerlendirilsin mi? | dxCheckBox | ✓ | ✓ | script |
| `IsActive` | Aktif | dxCheckBox | ✓ | ✓ | script |
### Eğitimler — `App.Hr.Training`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/Training.json` |
| Yol | Liste (Wizard) |
| Menü | `App.Hr.Trainings` › `App.Hr.Training` (sıra 3) |
| Yetki | `App.Hr.Training` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Eğitimler — düzenlenen her eğitim oturumu: tarih/saat, süre, yer, eğitmen, maliyet, kazandırdığı yetkinlikler, katılımcılar ve dosyalar. |
| Geliştirme talebi | Human Resources -> Eğitim |
| Kaynak | `Hr_T_Training` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Alt formlar | `App.Hr.TrainingParticipant` (Id → TrainingId), `App.Hr.TrainingFile` (Id → TrainingId) |
| Widget'lar | `App.Widget.Total`, `App.Hr.Training.Widget.Open`, `App.Hr.Training.Widget.Closed`, `App.Hr.Training.Widget.Cost` |
2026-10-04 21:18:13 +00:00
| Komutlar | UpdateAfter: `Hr_S_TrainingSync` · DeleteAfter: `Hr_S_TrainingSync` |
2026-10-04 15:04:16 +00:00
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TrainingTypeId` | Eğitim Tipi | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_TrainingType |
| `TrainingSubjectId` | Eğitim Konusu | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_TrainingSubject (← TrainingTypeId) |
| `EntryDate` | Giriş Tarihi | dxDateBox | ✓ | ✓ | script |
| `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch |
| `StartDate` | Eğitim Baş. Tarihi | dxDateBox | ✓ | ✓ | script |
| `EndDate` | Bit. Tarihi | dxDateBox | ✓ | ✓ | script |
| `StartTime` | Eğitim Baş. Saati | dxDateBox | | ✓ | script |
| `EndTime` | Bit. Saati | dxDateBox | | ✓ | script |
| `TotalHours` | Top. Eğitim Süresi (Saat) | dxNumberBox | | ✓ | |
| `Status` | Durum | dxRadioGroup | ✓ | ✓ | liste: Open, Closed · script |
| `TrainerName` | Eğitim Veren Kişi | dxTextBox | | ✓ | |
| `TrainingPlace` | Eğitim Yeri | dxTextBox | | ✓ | |
| `TrainingInstitution` | Eğitim Veren Kurum | dxTextBox | | ✓ | |
| `Description` | Açıklama | dxTextArea | | ✓ | |
| `SkillIds` | Yetkinlikler | dxTagBox | | ✓ | sorgu: Hr_T_Skill |
| `CostPlace` | Eğitim Yeri Maliyeti | dxNumberBox | | ✓ | script |
| `CostTrainer` | Eğitmen Maliyeti | dxNumberBox | | ✓ | script |
| `CostAccommodation` | Konaklama | dxNumberBox | | ✓ | script |
| `CostTransport` | Ulaşım | dxNumberBox | | ✓ | script |
| `CostCatering` | İkram | dxNumberBox | | ✓ | script |
| `CostOther` | Diğer | dxNumberBox | | ✓ | script |
| `CostTotal` | Toplam Maliyet | dxNumberBox | | ✓ | |
### Katılımcılar — `App.Hr.TrainingParticipant`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/TrainingParticipant.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Hr.TrainingParticipant` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Katılımcılar — eğitime katılan personel ve katılım sonucu. |
| Geliştirme talebi | Human Resources -> Eğitim |
| Kaynak | `Hr_T_TrainingParticipant` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
2026-10-04 21:18:13 +00:00
| Komutlar | InsertAfter: `Hr_S_TrainingSync` · UpdateAfter: `Hr_S_TrainingSync` · DeleteAfter: `Hr_S_TrainingSync` |
2026-10-04 15:04:16 +00:00
| Butonlar | `App.Hr.TrainingParticipant.Certificate` |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TrainingId` | Eğitim | dxSelectBox | | | sorgu: Hr_T_Training |
| `UserId` | Adı Soyadı | dxSelectBox | ✓ | ✓ | sorgu: AbpUsers · script |
| `HireDate` | İşe Giriş Tarihi | dxDateBox | | ✓ | |
| `DepartmentId` | Bölüm | dxSelectBox | | ✓ | sorgu: Hr_T_Department |
| `JobPositionId` | Görevi | dxSelectBox | | ✓ | sorgu: Hr_T_JobPosition |
| `AttendanceStatus` | Katılım Durumu | dxSelectBox | ✓ | ✓ | liste: Attended, NotAttended, Excused · script |
| `EvaluationScore` | Değerlendirme Puanı | dxNumberBox | | ✓ | |
| `ExamScore` | Sınav Notu | dxNumberBox | | ✓ | |
| `LeaveDate` | Ayrılma Tarihi | dxDateBox | | ✓ | |
| `Note` | Not | dxTextArea | | ✓ | |
### Dosyalar — `App.Hr.TrainingFile`
| Özellik | Değer |
| --- | --- |
| Wizard | `wizard/TrainingFile.json` |
| Yol | Liste (Wizard) |
| Menü | Menüsüz (alt form) |
| Yetki | `App.Hr.TrainingFile` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` |
| Açıklama | Eğitim Dosyaları — eğitime ait doküman ve dijital kaynaklar (sunum, imzalı katılım listesi, sertifika örneği…). |
| Geliştirme talebi | Human Resources -> Eğitim |
| Kaynak | `Hr_T_TrainingFile` · filtre `"IsDeleted" = 'false'` |
| Görünümler | Grid, Card, Pivot, Chart (açılış grid) |
| Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup |
| Kapsam | Kiracı |
| Alan | Başlık | Editör | Zorunlu | Formda | Kaynak |
| --- | --- | --- | --- | --- | --- |
| `TrainingId` | Eğitim | dxTextBox | | | |
| `DocumentTypeId` | Dosya Türü | dxSelectBox | | ✓ | sorgu: Hr_T_DocumentType |
| `FileDate` | Tarih | dxDateBox | ✓ | ✓ | script |
| `FileName` | Dosya Adı | dxTextBox | ✓ | ✓ | |
| `FileContent` | Dosya | dxImageUpload | ✓ | ✓ | |
<!-- module-doc:auto:end -->