188 lines
12 KiB
Markdown
188 lines
12 KiB
Markdown
|
|
# İK › Organizasyon ve Yetkinlik (Departman, Pozisyon, Organizasyon Şeması, Yetenek Tipleri)
|
|||
|
|
|
|||
|
|
Şirketin organizasyon iskeleti ve yetkinlik sözlüğü: şubeye bağlı departman ağacı, departmana bağlı
|
|||
|
|
pozisyon ağacı, bunların görsel organizasyon şeması ve yetenek tipi → yetenek → seviye sözlüğü.
|
|||
|
|
Çalışanın departman/pozisyon/işe giriş/vardiya bilgileri ve yetkinlikleri kullanıcı kaydında tutulur.
|
|||
|
|
Diğer bütün İK modülleri (İşe Alım, Eğitim, Performans, Disiplin, Sağlık Kartı…) bu tanımları lookup
|
|||
|
|
olarak kullanır. Bu bölüm **entity + C# seeder** ile kuruludur (wizard değil); Organizasyon Şeması
|
|||
|
|
özel bir React sayfasıdır.
|
|||
|
|
|
|||
|
|
> 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 | Departman ve pozisyon ağacını, yetenek sözlüğünü yönetir | İK › Tanımlamalar › Departmanlar · Pozisyonlar · Yetenek Tipleri |
|
|||
|
|
| İK / sistem yöneticisi | Çalışanın departman, pozisyon, işe giriş, vardiya, yetkinlik ve dil bilgilerini girer | Kimlik › Kullanıcılar › detay (İş Bilgileri, Eğitim ve Yetkinlik sekmeleri) |
|
|||
|
|
| Tüm kullanıcılar (yetkili) | Organizasyonu departman ya da pozisyon bazında görür, JPG olarak dışa aktarır | İK › Organizasyon Şeması |
|
|||
|
|
|
|||
|
|
Kapsam: kiracı. Departman ve pozisyon **şube bazlıdır** (`BranchId` zorunlu); ekranlarda satır süzmesi yoktur.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Analiz ve kararlar
|
|||
|
|
|
|||
|
|
> Bu bölüm §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Kararlar koddan
|
|||
|
|
> (`ListFormSeeder_Hr.cs`, entity'ler, `OrgChartAppService`, `OrgChart.tsx`) okunmuştur.
|
|||
|
|
|
|||
|
|
| Konu | Karar |
|
|||
|
|
| --- | --- |
|
|||
|
|
| Yol | Entity + `ListFormSeeder_Hr.cs` (migration'lı tablolar); şema için özel React sayfası + AppService |
|
|||
|
|
| Departman | Ağaç (`ParentId`), şubeye bağlı; varsayılan görünüm **Tree**; aynı şubede ad tekil |
|
|||
|
|
| Pozisyon | Ağaç (`ParentId` = üst pozisyon), departmana ve şubeye bağlı; varsayılan görünüm **Tree**; aynı departmanda ad tekil |
|
|||
|
|
| Yönetici ilişkisi | Departmanda yönetici alanı **yoktur**; hiyerarşi pozisyon ağacından okunur |
|
|||
|
|
| Host şubesi | Host varsayılan şubesi sabit kimlikle kurulur (`PlatformConsts.Branches.BranchIdDefaultValue = 1c125bf3-…`); seed departman/pozisyon satırları buna bağlıdır, kiracı şubeleri yeni GUID alır |
|
|||
|
|
| Admin varsayılanı | Admin kullanıcı departman **Yönetim**, pozisyon **Genel Müdür** ile kurulur |
|
|||
|
|
| Yetkinlik sözlüğü | Yetenek Tipi ekranının iki alt formu: Seviyeler (ad + `Progress` 0–100 kaydırıcı + varsayılan) ve Yetenekler |
|
|||
|
|
| Çalışan yetkinliği | İki ayrı ölçek: **diller** `Hr_T_SkillLevel` seviyesiyle (`UserLanguage`), **diğer yetkinlikler** sabit 1–5 ile (`Adm_T_UserSkill`) |
|
|||
|
|
| Tip adı bağımlılığı | Bazı lookup'lar tip adını sabit yazar (`'Languages'`, `'Technical Skills'`) — bu tipler yeniden adlandırılmamalıdır |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Menü ve ekranlar
|
|||
|
|
|
|||
|
|
| Menü (TR) | `ListFormCode` / rota | Yer | Görünüm | Alt formlar |
|
|||
|
|
| --- | --- | --- | --- | --- |
|
|||
|
|
| Yetenek Tipleri | `App.Hr.SkillType` | Tanımlamalar (1) | Grid | `App.Hr.SkillLevel`, `App.Hr.Skill` (`Id → SkillTypeId`) |
|
|||
|
|
| Departmanlar | `App.Hr.Department` | Tanımlamalar (2) | **Tree** (`Id`/`ParentId`, tümü açık) | — |
|
|||
|
|
| Pozisyonlar | `App.Hr.JobPosition` | Tanımlamalar (3) | **Tree** | — |
|
|||
|
|
| Organizasyon Şeması | `/admin/organization` (`@/views/admin/hr/OrgChart`) | `İnsan Kaynakları` (4) | Özel sayfa | — |
|
|||
|
|
|
|||
|
|
Bu ekranlarda widget yoktur ve veri seed dosyasına aynalanmaz (`SeedSync*` kapalı).
|
|||
|
|
|
|||
|
|
**Organizasyon Şeması** (`ui/src/views/admin/hr/OrgChart.tsx`):
|
|||
|
|
- **Mod:** Departman ya da Pozisyon.
|
|||
|
|
- **Kullanıcıları göster:** Açık/kapalı seçilebilir.
|
|||
|
|
- **Yakınlaştırma:** %30–300 arası, Ctrl + tekerlek ile de.
|
|||
|
|
- **Dışa aktarma:** JPG olarak.
|
|||
|
|
- **Kartlar:** Derinliğe göre renklenir, alt sayısı ve aç/kapa düğmesi taşır, sürüklenerek yeri değiştirilir (yer kaydedilmez).
|
|||
|
|
- **Kullanıcı satırı:** Avatar gösterir; üzerine gelince profil kartı açılır (unvan, departman, e-posta, telefon).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Veri modeli
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Sas_T_Branch ──< Hr_T_Department (ParentId ağacı) ──< Hr_T_JobPosition (ParentId ağacı)
|
|||
|
|
▲
|
|||
|
|
AbpUsers.DepartmentId / JobPositionId / HireDate / ShiftId ┘
|
|||
|
|
|
|||
|
|
Hr_T_SkillType ──< Hr_T_SkillLevel (Progress, IsDefault)
|
|||
|
|
└────────< Hr_T_Skill ──< Adm_T_UserSkill (Level 1–5)
|
|||
|
|
└────< UserLanguage (SkillLevelId)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| Tablo | Kolonlar | Kural |
|
|||
|
|
| --- | --- | --- |
|
|||
|
|
| `Hr_T_Department` | `BranchId` (zorunlu), `Name` (64), `ParentId` | `UX (TenantId, BranchId, Name)` |
|
|||
|
|
| `Hr_T_JobPosition` | `BranchId` (zorunlu), `DepartmentId` (zorunlu, FK Restrict), `Name` (64), `ParentId` | `UX (TenantId, Name, DepartmentId)` |
|
|||
|
|
| `Hr_T_SkillType` | `Name` (128) | `UX (TenantId, Name)`; silinince yetenek/seviye kademeli silinir |
|
|||
|
|
| `Hr_T_SkillLevel` | `SkillTypeId`, `Name`, `Progress` (int, 0), `IsDefault` | `UX (TenantId, SkillTypeId, Name)` |
|
|||
|
|
| `Hr_T_Skill` | `SkillTypeId`, `Name` | `UX (TenantId, SkillTypeId, Name)` |
|
|||
|
|
| `Adm_T_UserSkill` | `UserId`, `SkillId`, `Level`, `Note` (512) | `CHECK Level BETWEEN 1 AND 5`; `UX (TenantId, UserId, SkillId)` |
|
|||
|
|
| `AbpUsers` (genişletme) | `DepartmentId`, `JobPositionId`, `HireDate`, `ShiftId`, sözleşme/fesih/ehliyet alanları | `PlatformModuleExtensionConfigurator`, `AbpIdentityUserExtensions` |
|
|||
|
|
|
|||
|
|
Entity'ler: `Entities/Tenant/Hr/Definitions/{SkillType,Skill,SkillLevel,Department,JobPosition}.cs`
|
|||
|
|
(`FullAuditedEntity<Guid>, IMultiTenant`); EF yapılandırması `PlatformDbContext.cs`.
|
|||
|
|
|
|||
|
|
Seed (`configs/seeds/host/data/`):
|
|||
|
|
|
|||
|
|
| Dosya | İçerik |
|
|||
|
|
| --- | --- |
|
|||
|
|
| `App.Hr.Department.json` | Yönetim (kök) → Üretim, Satış, Finans (→ Muhasebe), Bilgi İşlem |
|
|||
|
|
| `App.Hr.JobPosition.json` | Genel Müdür (kök) → BT, İhracat, İç Piyasa, Üretim, Finans müdürleri; Finans Müdürü → Muhasebe Müdürü → Muhasebe Şefi |
|
|||
|
|
| `App.Hr.SkillType.json` | Languages, Soft Skills, Technical Skills |
|
|||
|
|
| `App.Hr.Skill.json` | 31 yetenek: 21 dil, 3 soft skill, 7 teknik |
|
|||
|
|
| `App.Hr.SkillLevel.json` | Diller C2 100 · C1 85 · B2 75 · B1 60 · A2 40 · A1 10 (varsayılan); Soft Skills Expert 100 · Advanced 80 · Intermediate 50 · Elementary 25 · Beginner 15 (varsayılan); **Technical Skills için seviye yok** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. İş kuralları
|
|||
|
|
|
|||
|
|
| Yer | Kural |
|
|||
|
|
| --- | --- |
|
|||
|
|
| Departman formu | Ad → üst departman → şube; şube değişince üst departman temizlenir; üst departman listesi şubeye göre süzülür |
|
|||
|
|
| Pozisyon formu | Ad → üst pozisyon → şube → departman; şube değişince departman ve üst pozisyon, departman değişince üst pozisyon temizlenir. Üst pozisyon listesi seçilen departmanın **ve üst departmanlarının** pozisyonları + tüm kök pozisyonlardır (`JobPositionFullValues`) |
|
|||
|
|
| Seviye — yeni kayıt | `IsDefault = true` (tek varsayılan zorlanmaz) |
|
|||
|
|
| Kullanıcı — İş Bilgileri | Departman değişince pozisyon temizlenir, pozisyon listesi departmana göre süzülür; deneme süresi sonu işe girişten önce ya da 4 aydan sonra olamaz (`PlatformIdentityAppService`) |
|
|||
|
|
| Şema — Departman modu | Her departman kartında o departmanın **en üst pozisyonu** ve yalnızca o pozisyondaki kullanıcılar gösterilir (üst pozisyonu olmayan ya da üstü başka departmanda olan; ada göre ilk) |
|
|||
|
|
| Şema — Pozisyon modu | Her pozisyon bir kart; o pozisyondaki tüm kullanıcılar |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. Yetki ve görünürlük
|
|||
|
|
|
|||
|
|
İzin grubu `App.Hr`, modül `Sas|Hr`:
|
|||
|
|
|
|||
|
|
| Yetki | Üst | Alt yetkiler |
|
|||
|
|
| --- | --- | --- |
|
|||
|
|
| `App.Hr.SkillType` | `App.Hr.Definitions` | Create, Update, Delete, Export, Import, Note |
|
|||
|
|
| `App.Hr.SkillLevel`, `App.Hr.Skill` | `App.Hr.Definitions` | Create, Update, Delete, Export, Import |
|
|||
|
|
| `App.Hr.Department`, `App.Hr.JobPosition` | `App.Hr.Definitions` | Create, Update, Delete, Export, Import |
|
|||
|
|
| `App.Hr.OrgChart` | grup kökü | — (menü ve rota bu yetkiyi ister) |
|
|||
|
|
|
|||
|
|
Çalışanın iş bilgileri ve yetkinlikleri kullanıcı ekranının yetkileriyle (`AbpIdentity.Users.*`) düzenlenir.
|
|||
|
|
Hiçbir yetki role otomatik atanmaz.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. Entegrasyonlar (kim kullanıyor)
|
|||
|
|
|
|||
|
|
| Tanım | Kullanan modüller |
|
|||
|
|
| --- | --- |
|
|||
|
|
| Departman / Pozisyon | İşe Alım (talep, ilan, teklif), Eğitim katılımcısı, Disiplin dosyası, Sağlık Kartı listesi, Performans değerlendirmesi, kullanıcı ekranı, Organizasyon Şeması |
|
|||
|
|
| Yetenek / Seviye | Aday yetkinlikleri, eğitimin kazandırdıkları, Performans yetkinlik değerlendirmesi (seviye `Progress` = puan), kullanıcı dil ve yetkinlik listeleri |
|
|||
|
|
| `Adm_T_UserSkill` | Performans Yönetimi tamamlanınca yönetici seviyesini buraya yazar (bkz. `HrPerformance.md`) |
|
|||
|
|
| Vardiya (`ShiftId`) | Bkz. `HrWorkCalendar.md` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. Akış örneği
|
|||
|
|
|
|||
|
|
1. İK **Departmanlar**'a "Kalite" departmanını şube Merkez, üst departman Üretim olarak ekler (ağaçta Üretim'in altında görünür).
|
|||
|
|
2. **Pozisyonlar**'a "Kalite Şefi"ni departman Kalite, üst pozisyon Üretim Müdürü olarak ekler.
|
|||
|
|
3. Kullanıcı detayının **İş Bilgileri** sekmesinde çalışanın departmanı Kalite, pozisyonu Kalite Şefi, işe giriş tarihi ve vardiyası girilir; **Eğitim ve Yetkinlik** sekmesine İngilizce B2 ve "Kaynak Uzmanı 4/5" eklenir.
|
|||
|
|
4. **Organizasyon Şeması** Pozisyon modunda Kalite Şefi kartı Üretim Müdürü'nün altında, çalışanla birlikte görünür; şema JPG olarak dışa aktarılır.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. Sık sorulanlar ve bilinen sınırlar
|
|||
|
|
|
|||
|
|
**Departman yöneticisi nerede?** Yok; hiyerarşi pozisyon ağacındadır. (Performans modülü bu yüzden yöneticiyi değerlendirme kaydında tutar.)
|
|||
|
|
|
|||
|
|
**Şemada departman kartında neden tüm çalışanlar yok?** Departman modunda yalnız en üst pozisyondakiler gösterilir; herkes için Pozisyon modunu kullanın.
|
|||
|
|
|
|||
|
|
**Şemadaki kart yerleri kaydedilmiyor.** Sürükleme yalnız görünümü değiştirir.
|
|||
|
|
|
|||
|
|
**Teknik yetenekler için seviye seçilemiyor.** Seed'de Technical Skills tipine seviye tanımlı değil; kullanıcı yetkinliği 1–5 ölçeğiyle girilir. Performans modülünde bu tipe seviye eklenmesi gerekir.
|
|||
|
|
|
|||
|
|
**"Languages" tipinin adını değiştirdim, dil listesi boşaldı.** Lookup'lar tip adını sabit kullanır (`TenantLanguageSkillValues`, `TechnicalSkillsValues`).
|
|||
|
|
|
|||
|
|
Kontrol edilmeli (koddan tespit edilen tutarsızlıklar):
|
|||
|
|
- Organizasyon Şeması API'si (`api/app/org-chart`) yalnız oturum ister, `App.Hr.OrgChart` yetkisini denetlemez; menü ve rota yetkiyle korunur.
|
|||
|
|
- `BranchDepartmentValues` ve `JobPositionFullValues` lookup'larında açık kiracı koşulu yoktur; `JobPositionFullValues` departmandan bağımsız tüm kök pozisyonları da listeler.
|
|||
|
|
- Yetenek alt formunun popup başlığı Seviye ekranının anahtarını kullanır (`ListFormSeeder_Hr.cs`).
|
|||
|
|
- Yetenek Tipi/Seviye/Yetenek yetkileri `MultiTenancySide 2`, Departman/Pozisyon `3`'tür.
|
|||
|
|
- Bir tipte birden çok varsayılan seviye işaretlenebilir.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. Dosyalar
|
|||
|
|
|
|||
|
|
| Dosya | İçerik |
|
|||
|
|
| --- | --- |
|
|||
|
|
| `api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Hr.cs` | Beş ekranın ListForm tanımı |
|
|||
|
|
| `api/src/Sozsoft.Platform.Domain/Entities/Tenant/Hr/Definitions/*.cs` | Entity'ler |
|
|||
|
|
| `api/src/Sozsoft.Platform.Application/OrgChart/OrgChartAppService.cs`, `Application.Contracts/OrgChart/OrgChartDto.cs` | Şema API'si (`GET departments`, `GET job-positions`) |
|
|||
|
|
| `ui/src/views/admin/hr/OrgChart.tsx`, `ui/src/services/orgChart.service.ts` | Şema sayfası |
|
|||
|
|
| `ui/src/views/admin/user-management/Details.tsx`, `EducationSkillsTab.tsx` | Kullanıcı iş bilgileri ve yetkinlik sekmeleri |
|
|||
|
|
| `api/src/Sozsoft.Platform.Application.Contracts/LookUpQueryValues.cs` | Şube/departman/pozisyon/yetenek lookup'ları |
|
|||
|
|
| `configs/seeds/host/data/App.Hr.{Department,JobPosition,SkillType,Skill,SkillLevel}.json` | Seed |
|
|||
|
|
| `configs/seeds/host/data/App.Menus.Routes.json` (`admin.hr.organization`) | Şema rotası |
|
|||
|
|
|
|||
|
|
Bu tablolar migration'lıdır; ekranlar seeder'dan kurulduğu için Wizard Manager'dan silinmez.
|