# İ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ı | | 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`) | | `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) | | 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) | --- ## 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 | | --- | --- | | `configs/seeds/host/sql/object/Hr_T_{TrainingType,TrainingSubject,Training,TrainingParticipant,TrainingFile}.sql` | Tablolar | | `configs/seeds/host/wizard/{TrainingType,TrainingSubject,Training,TrainingParticipant,TrainingFile}.json` | 5 wizard | | `configs/seeds/host/data/App.Hr.{TrainingType,TrainingSubject}.json` | Tanım verisi | | `configs/seeds/host/data/App.Reports.ReportTemplates.json` | Katılım Belgesi şablonu | | `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 (`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. ## 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` | | Komutlar | UpdateAfter: `Hr_S_TrainingSync` · DeleteAfter: `Hr_S_TrainingSync` | | 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ı | | Komutlar | InsertAfter: `Hr_S_TrainingSync` · UpdateAfter: `Hr_S_TrainingSync` · DeleteAfter: `Hr_S_TrainingSync` | | 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 | ✓ | ✓ | |