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

182 lines
13 KiB
Markdown
Raw Normal View History

2026-10-04 15:04:16 +00:00
# İK › Personel Kaydı (Kimlik › Kullanıcılar › detay)
Çalışanın özlük kaydı ayrı bir İK ekranında değil, kullanıcı detay sayfasındadır
(`/admin/users/detail/:userId`): iletişim ve ek bilgiler, askerlik, engellilik, nüfus/kimlik, doğum ve
aile, yabancı uyruklu belgeleri, organizasyon (departman/pozisyon/vardiya), sözleşme ve deneme süresi,
işten çıkış, sürücü belgesi, eğitim geçmişi, yabancı diller, yetenekler, yeterlilik belgeleri, eş ve
çocuklar, acil durum kişileri, banka ve ücret bilgileri, yan haklar, iş deneyimi. (Sağlık Kartı sekmesi
için bkz. [HrHealthCard.md](HrHealthCard.md).) Tek değerli alanlar `AbpUsers` genişletme kolonlarında,
çok kayıtlılar `Adm_T_User*` tablolarındadır; diğer İK modüllerinin hepsi çalışanı buradan okur.
> 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 / özlük | Personelin bütün özlük, sözleşme, eğitim, aile ve mali bilgisini girer | Kimlik › Kullanıcılar › Detay |
| Sistem yöneticisi | Kullanıcıyı açar; listede temel alanları (departman, pozisyon, cinsiyet, adres…) düzenler | Kimlik › Kullanıcılar |
| Yönetici | Deneme süresi bitimine 15 gün kala bildirim alır | Bildirimler |
Kapsam: kiracı. Rota yetkisi `AbpIdentity.Users.Update`.
---
## 2. Analiz ve kararlar
> §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Kararlar koddan (`Details.tsx` ve sekme
> bileşenleri, `PlatformIdentityAppService`, `ListFormSeeder_Administration.cs`, entity'ler) okunmuştur.
| Konu | Karar |
| --- | --- |
| Yer | Ayrı "personel" tablosu yok; özlük = kullanıcı. Tek değerli alanlar ABP extra property olarak `AbpUsers` kolonları |
| Çok kayıtlı bilgiler | `Adm_T_User{WorkExperience,Education,Language,Skill,Certificate,FamilyMember,EmergencyContact,Benefit}`; detay sekmelerinde gömülü liste (`App.IdentityManagement.*`), yeni satırın `UserId`'si sayfa filtresinden dolar |
| Kaydetme | Her form sekmesi kendi formuyla bütün modeli `PUT /api/app/platform-identity/user` (`UpdateUserAsync`) ile gönderir; başka sekmede kaydedilmemiş değişiklik gitmez |
| Mali bilgiler | Ayrı DTO ve uç (`GetFinancialAsync` / `UpdateFinancialAsync`, `Users.Update` yetkisi) — intranet listelerine akan `UserInfoViewModel`'de taşınmasın diye |
| Deneme süresi | İşe giriş ile işe giriş + **4 ay** arasında olmalı (4857 s. İK md. 15; toplu sözleşmeyle 4 ay) — hem formda hem sunucuda |
| Koşullu alanlar | Tecil bitişi yalnız "Tecilli"de, sözleşme bitişi yalnız "Belirli Süreli"de, yabancı uyruklu bölümü yalnız TR dışı uyrukta, engellilik oranı/raporu yalnız "Engelli"de **görünür**; gizlenince değer silinmez |
| Ölçekler | Dil seviyesi `Hr_T_SkillLevel` ile, diğer yetenekler sabit 1–5 ile (bkz. [HrOrganization.md](HrOrganization.md)) |
| Saklama biçimleri | Engellilik raporu ve avatar dışındaki dosyalar base64 kolonda; ehliyet sınıfları `|` ile birleştirilmiş metin; medeni durum ve eğitim düzeyi Türkçe anahtar |
---
## 3. Ekranlar ve sekmeler
| Sekme (TR) | İçerik | Kayıt |
| --- | --- | --- |
| Genel | İletişim (e-posta, ikinci e-posta, ad, soyad, telefon, ikinci telefon, kullanıcı tipi İç/Dış), ek bilgiler (ev adresi, uyruk, cinsiyet), askerlik (durum: Yapıldı/Muaf/Tecilli/Yapılmadı + tecil bitişi), avatar (kırpma, ≤ 2 MB), engellilik (engelli, oran %, rapor PDF/JPG/PNG ≤ 5 MB) | `UpdateUserAsync` (+ avatar `UpdateAvatarAsync`) |
| Kimlik Bilgileri | Nüfus cüzdanı (kimlik no, seri no, veriliş yeri/tarihi, il, ilçe, köy, cilt, aile sıra, sıra no), doğum ve aile (doğum yeri/tarihi, baba/anne adı, medeni durum Bekar/Evli/Boşanmış/Dul, evlenme tarihi), yabancı uyruklu (pasaport no/geçerlilik, çalışma izni no/bitiş) | `UpdateUserAsync` |
| İş | Organizasyon (departman → pozisyon, sicil no, SGK no, vardiya grubu, PDKS kart no), sözleşme (çalışma şekli Tam/Yarı Zamanlı, sözleşme türü Belirsiz/Belirli, işe başlama, sözleşme bitişi, deneme süresi bitişi, kıdem başlangıcı), işten çıkış (tarih, SGK çıkış kodu, açıklama), sürücü belgesi (sınıflar çoklu M…G, no, veriliş, geçerlilik), iletişim kanalları (Rocket, Telegram) + **Daha Önce Çalıştığı Yerler** listesi | `UpdateUserAsync` + `App.IdentityManagement.UserWorkExperience` |
| Eğitim ve Yetenekler | En yüksek eğitim seviyesi + **Eğitim Geçmişi**, **Yabancı Diller**, **Yetenekler**, **Yeterlilik Belgeleri** listeleri | `UpdateUserAsync` + 4 liste |
| Aile / Acil Durum | **Eş ve Çocuklar**, **Acil Durum Kişileri** listeleri | 2 liste |
| Finansal | Banka adı, IBAN; ücret tipi Aylık/Günlük/Saatlik, brüt ücret, para birimi + **Yan Haklar** listesi | `UpdateFinancialAsync` + `App.IdentityManagement.UserBenefit` |
| Sağlık Kartı | Bkz. [HrHealthCard.md](HrHealthCard.md) | — |
Gömülü listeler (hepsi menüsüz alt liste, `Adm_T_*`):
| Liste | Alanlar | Kural |
| --- | --- | --- |
| `UserWorkExperience` | Firma*, iş kolu* (sektör), giriş*, çıkış, yaptığı iş (HTML) | Giriş tarihine göre azalan |
| `UserEducation` | Eğitim düzeyi* (İlkokul…Doktora), okul*, bölüm, başlangıç, mezuniyet, mezun (varsayılan evet) | — |
| `UserLanguage` | Dil* ("Languages" tipi yetenekler), seviye (dilin seviyeleri), not | Kullanıcı × dil tekil |
| `UserSkill` | Yetenek* (dil dışı tipler), seviye* 1–5 (Başlangıç…Uzman, varsayılan 3), not | `CHECK 1–5`; kullanıcı × yetenek tekil |
| `UserCertificate` | Belge* (`Hr_T_Certificate`), belge no, veren kurum, düzenleme, son kullanma, not | Son kullanmaya göre artan |
| `UserFamilyMember` | Yakınlık* (Eş/Çocuk), ad*, soyad, TC kimlik, doğum tarihi, çalışma durumu (Çalışıyor/Çalışmıyor/Öğrenci/Emekli), sigorta kapsamında, yan hak kapsamında | — |
| `UserEmergencyContact` | Ad soyad*, yakınlık* (Eş, Anne/Baba, Kardeş, Çocuk, Akraba, Arkadaş, Diğer), telefon* | — |
| `UserBenefit` | Yan hak türü* (`Hr_T_BenefitType`, **kod** saklanır), tutar, başlangıç, bitiş, not | — |
Kullanıcı listesi (`AbpIdentity.Users`) popup'ında düzenlenen İK alanları: departman*, pozisyon*,
cinsiyet, ev adresi (+ avatar, e-posta, ad, soyad, tip, telefon, çalışma saati). Diğer özlük alanları
listede gizli kolon olarak durur.
---
## 4. Veri modeli
| Yer | İçerik |
| --- | --- |
| `AbpUsers` genişletme kolonları | Bütün form sekmesi alanları; sabitler `PlatformConsts.AbpIdentity.User.*`, erişim `AbpIdentityUserExtensions`, kolon tipleri `PlatformEfCoreEntityExtensionMappings` |
| `Adm_T_UserWorkExperience` | `CompanyName`, `SectorId` (FK Sector), `StartDate`, `EndDate`, `JobDescription` |
| `Adm_T_UserEducation` | `EducationLevel`, `SchoolName`, `Department`, `StartDate`, `EndDate`, `IsGraduated` |
| `Adm_T_UserLanguage` | `SkillId` (FK Skill), `SkillLevelId` (FK SkillLevel), `Note` |
| `Adm_T_UserSkill` | `SkillId`, `Level` (1–5), `Note` |
| `Adm_T_UserCertificate` | `CertificateId` (`Hr_T_Certificate`, FK'siz), `CertificateNo`, `IssuedBy`, `IssueDate`, `ExpiryDate`, `Note` |
| `Adm_T_UserFamilyMember` | `Relationship`, `Name`, `Surname`, `IdentityNumber`, `BirthDate`, `EmploymentStatus`, `IsInsuranceCovered`, `IsBenefitCovered` |
| `Adm_T_UserEmergencyContact` | `Name`, `Relationship`, `PhoneNumber` |
| `Adm_T_UserBenefit` | `BenefitType` (kod), `Amount`, `StartDate`, `EndDate`, `Note` |
Entity'ler `Entities/Tenant/Administration/User*.cs` (`FullAuditedEntity<Guid>, IMultiTenant`), EF
yapılandırması `PlatformDbContext.cs`.
---
## 5. İş kuralları
| Yer | Kural |
| --- | --- |
| Deneme süresi | `HireDate ≤ ProbationEndDate ≤ HireDate + 4 ay`; formda gün bazında, sunucuda (`UpdateUserAsync`) tam zamanla |
| Departman değişimi | Pozisyon temizlenir; pozisyon listesi departmana göre süzülür |
| IBAN | Formda boşluk silinir, büyük harfe çevrilir, `^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$` deseni; sunucu yalnız normalleştirir |
| Engellilik raporu | ≤ 5 MB (yalnız formda), base64 olarak kolonda |
| Avatar | `{userId}.jpg` avatar blob kabına yazılır; boş gönderim siler |
| Deneme süresi hatırlatması | `ProbationReminderWorker` günlük çalışır; aktif, çıkışı olmayan ve deneme bitişi **bugün + 15 gün** olan kullanıcılar için `DenemeSuresiBitiyor` bildirimi üretir (tip yoksa atlar) |
| Doğum günü | `BirthDate` intranet panosundaki "Bugün Doğanlar" kutusunu besler (bkz. [HrIntranet.md](HrIntranet.md)) |
---
## 6. Yetki ve görünürlük
| İşlem | Yetki |
| --- | --- |
| Detay sayfası (rota), liste "Detay" butonu | `AbpIdentity.Users.Update` |
| Gömülü listeler | okuma `AbpIdentity.Users`; ekle/güncelle/sil `AbpIdentity.Users.Update` (Yan Haklar alanlarında ekleme `Users.Create`) |
| Mali bilgiler, avatar | `AbpIdentity.Users.Update` (sunucuda) |
| Kullanıcı listesi ekle/güncelle | `Users.Create` / `Users.Update` |
Özlük verisi kişisel veri, sağlık ve engellilik verisi özel nitelikli kişisel veridir (KVKK). Kullanıcı
yönetimi yetkisi yalnız İK ve sistem yöneticilerinde olmalıdır.
**Kontrol edilmeli — güvenlik (koddan tespit edildi):**
- `PlatformIdentityAppService.GetByIdAsync` ve `UpdateUserAsync` yalnız oturum ister (`[Authorize]`); `Users.Update` yalnız arayüz rotasında denetlenir. Oturum açmış herhangi bir kullanıcı API'yi doğrudan çağırarak başka birinin özlük kaydını (engellilik raporu dahil) okuyup güncelleyebilir.
- Banka, IBAN ve ücret alanları `AbpIdentity.Users` listesinde gizli ama okunabilir/dışa aktarılabilir kolon olarak durur; liste okuma yetkisi olan kullanıcı kolon seçiciyle görebilir.
- Intranet doğum günü listesine giden `UserInfoViewModel` kimlik no, SGK no ve sağlık kartı alanlarını da taşır.
---
## 7. Entegrasyonlar
| Kullanan | Okuduğu |
| --- | --- |
| Tüm İK modülleri | Çalışan, departman, pozisyon |
| Organizasyon Şeması | Pozisyondaki kullanıcılar |
| Vardiyalar / Olay Günlüğü | `ShiftId` |
| Yeterlilik Belgeleri, Yan Hak Türleri, Sektörler, SGK çıkış kodları, Para Birimleri | Lookup kaynakları |
| Performans Yönetimi | Tamamlanan değerlendirme `Adm_T_UserSkill`'e yazar |
| İşe Alım | İşe alınan adayın kaydı kullanıcıya `UserId` ile bağlanır |
| Intranet | Doğum günleri, kullanıcı kartları |
| Bildirimler | Deneme süresi hatırlatması (`DenemeSuresiBitiyor`) |
---
## 8. Akış örneği
1. BT kullanıcıyı listeden açar (ad, e-posta, departman, pozisyon). İK **Detay**'a girer.
2. **Kimlik Bilgileri**: nüfus ve aile bilgileri; **Genel**: adres, uyruk, askerlik, avatar.
3. **İş**: sicil/SGK no, vardiya, sözleşme türü Belirsiz, işe başlama 01.10, deneme süresi bitişi 01.12 (4 ayı aşarsa kayıt reddedilir); önceki iş yerleri listesi.
4. **Eğitim ve Yetenekler**: lisans mezuniyeti, İngilizce B2, "Kaynak Uzmanı 4", forklift belgesi.
5. **Aile / Acil Durum**: eş ve çocuk (sigorta kapsamında), acil durum kişisi.
6. **Finansal**: banka/IBAN, aylık brüt ücret TRY; yemek kartı yan hakkı.
7. 15 Kasım'da yöneticilere deneme süresinin bitmek üzere olduğu bildirimi gider.
---
## 9. Sık sorulanlar ve bilinen sınırlar
**Detayda e-postayı değiştirdim, kaydolmadı.** `UpdateUserAsync` e-postayı yazmaz; e-posta kullanıcı listesindeki düzenlemeden değişir.
**Başka sekmede yaptığım değişiklik kayboldu.** Her sekme ayrı kaydedilir; sekme değiştirmeden önce kaydedin.
**Sözleşmeyi Belirsiz yaptım, bitiş tarihi hâlâ kayıtlı.** Koşullu alanlar yalnız gizlenir, değer silinmez.
**Pozisyon listede zorunlu, detayda değil.** Doğru; kullanıcı listesi popup'ı zorunlu tutar.
**Acil durum kişisinde ad kolonu "Doktor Adı Soyadı" görünüyor.** Alan başlığı yanlış dil anahtarını (`App.Listform.ListformField.FullName`) kullanıyor; düzeltilmeli.
**Aile üyelerindeki sigorta/yan hak işaretleri bir yere gidiyor mu?** Şu an bunları okuyan bir ekran/rapor bulunmadı.
---
## 10. Dosyalar
| Dosya | İçerik |
| --- | --- |
| `ui/src/views/admin/user-management/Details.tsx`, `EducationSkillsTab.tsx`, `FamilyEmergencyTab.tsx`, `FinancialTab.tsx`, `userFormFields.tsx`, `useUserFieldLookup.ts` | Detay sayfası ve sekmeler |
| `api/src/Sozsoft.Platform.Application/Identity/PlatformIdentityAppService.cs` | `GetByIdAsync`, `UpdateUserAsync`, `Get/UpdateFinancialAsync`, `UpdateAvatarAsync` |
| `api/src/Sozsoft.Platform.Domain/Extensions/AbpIdentityUserExtensions.cs`, `EntityFrameworkCore/PlatformEfCoreEntityExtensionMappings.cs` | Genişletme alanları |
| `api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/User*.cs` | Çok kayıtlı entity'ler |
| `api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs` | `AbpIdentity.Users` ve `App.IdentityManagement.*` listeleri |
| `api/src/Sozsoft.Platform.Domain/BackgroundWorkers/ProbationReminderWorker.cs` | Deneme süresi hatırlatması |