# İK › İşe Alım (`App.Hr.Recruitment`) Kadro talebinden işe alıma kadar uçtan uca süreç: onaylı kadro talebi → iş ilanı → aday havuzu (CV, KVKK açık rızası) → başvuru (aşama panosu) → mülakat (takvim, kriter ağırlıklı puan) → teklif (iç onay, teklif mektubu). Tamamı konfigürasyondur (Wizard + SQL + 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 | | --- | --- | --- | | Talep eden yönetici | Kadro talebi açar, onaya gönderir | Kadro Talepleri | | Onaycı | Kadro talebini ve teklifi onaylar / reddeder | Kadro Talepleri · Teklifler (Grid Workflow butonları) | | İK / işe alım uzmanı | İlan açar, aday ve başvuruları yönetir, mülakat planlar, teklif hazırlar, aday kaydını personele bağlar | İlanlar · Adaylar · Başvurular · Mülakatlar · Teklifler | | Mülakatçı | Kendisine atanan mülakatta kriter bazlı puan verir | Mülakatlar (+ bildirim) | | İK yöneticisi | Aday kaynağı, ret sebebi, değerlendirme kriteri tanımlarını yönetir | İK › Tanımlar | Kapsam: kiracı (`IsTenant`). Şube, kayıtta veri olarak tutulur (satır süzmesi yoktur). --- ## 2. Analiz ve kararlar > Modül §0.13 kuralından önce üretildi; keşif turu kaydı yoktur. Aşağıdaki kararlar üretilen > artefaktlardan (wizard, SQL, seed, commit `16fd5df0` "İşe Alım modülü") okunmuştur. | Konu | Karar | | --- | --- | | Yol | Her adım ayrı Wizard ekranı; ilan ve aday ekranlarında başvuru alt formu, başvuruda mülakat ve teklif alt formu | | Kadro talebi ve teklif onayı | **Grid Workflow** (`WorkflowDto`): Start → Approval (`Onay Bekliyor`) → Inform → End `Onaylandı` / `Reddedildi`. Onaycı **düğümün `Approver` değeridir** (seed'de platform admin e-postası); motor onaycıyı kayıttaki alandan okumaz — ListForm › Workflow sekmesinden değiştirilir | | İlan kaynağı | İlan yalnızca **onaylı** (`ApprovalStatus = 'Onaylandı'`) kadro talebinden açılır; şube/departman/pozisyon/adet/çalışma şekli talepten `copy` ile dolar | | Aday kimliği | E-posta kiracı içinde tekildir (filtreli unique index) | | KVKK | Açık rıza **zorunlu**: formda zorunlu alan + tabloda `CHECK (KvkkConsent = 1)`; rıza tarihi/yöntemi/imzalı belge saklanır; satır butonu **KVKK Açık Rıza Formu** raporunu açar | | Başvuru | Aday × ilan çifti tekildir; aşama **Todo (kanban)** panosunda yönetilir | | Aşama ilerlemesi | Mülakat eklenince `Interview`, teklif eklenince `Offer`, teklif `Accepted` olunca `Hired` — SQL ile, **geri gitmez** | | Mülakat puanı | Kriter başına 1–5; `OverallScore = Σ(puan × kriter ağırlığı) / Σ ağırlık`; başvurunun `AverageScore`'u mülakatların ortalaması | | Mülakatçı bildirimi | Mülakat eklenince mülakatçıya `IseAlimMulakatAtandi` bildirimi (kanallar `UiActivity` + `Mail`) | | Belge numaraları | `KT-YYYY-00001` (talep), `ILN-…` (ilan), `TKL-…` (teklif) — insert sonrası SQL, kiracı + yıl bazında | | Personele dönüşüm | İşe alınan adayın kullanıcı (personel) kaydını **BT elle açar**; İK aday kaydını `UserId` ile o kullanıcıya bağlar (otomatik kullanıcı açılmaz) | | Kanban başlığı | `CandidateName` / `PostingTitle` başvuruya metin olarak kopyalanır (Todo başlığı metin kolon ister) | --- ## 3. Menü ve ekranlar `İnsan Kaynakları › İşe Alım` (`App.Hr.Recruitment`, ikon `FcManager`) | Sıra | Menü (TR / EN) | `ListFormCode` | Alt formlar | Görünümler | Widget'lar | | --- | --- | --- | --- | --- | --- | | 1 | Kadro Talepleri / Staff Requests | `App.Hr.StaffRequest` | — | Grid, Card, Pivot, Chart | Toplam · Onay Bekliyor · Onaylanan · Onaylı kadro adedi (Σ Headcount) | | 2 | İlanlar / Job Postings | `App.Hr.JobPosting` | `JobApplication` (`Id → JobPostingId`) | Grid, Card, Pivot, Chart | Toplam · Yayında · Taslak · Kapalı | | 3 | Adaylar / Candidates | `App.Hr.Candidate` | `JobApplication` (`Id → CandidateId`) | Grid, Card, Pivot, Chart | Toplam · Aktif · Pasif · Personele Dönüşen | | 4 | Başvurular / Applications | `App.Hr.JobApplication` | `Interview`, `JobOffer` (`Id → ApplicationId`) | Grid, Card, Pivot, Chart, **Todo** | — (alt form olarak da kullanıldığı için yok) | | 5 | Mülakatlar / Interviews | `App.Hr.Interview` | `InterviewScore` (`Id → InterviewId`, menüsüz) | Grid, Card, Pivot, Chart, **Scheduler** | — | | 6 | Teklifler / Job Offers | `App.Hr.JobOffer` | — | Grid, Card, Pivot, Chart | — | Tanımlar `İnsan Kaynakları › Tanımlar` (`App.Hr.Definitions`) altında, verileri seed dosyasıyla aynalı: | Menü | `ListFormCode` | Seed | | --- | --- | --- | | Aday Kaynakları | `App.Hr.CandidateSource` | 7 kayıt: LinkedIn, Kariyer.net, Yenibiris, Şirket Web Sitesi, Referans, Kariyer Fuarı, Doğrudan Başvuru | | Ret Sebepleri | `App.Hr.RejectionReason` | 8 kayıt; `RejectedBy` = Company / Candidate | | Değerlendirme Kriterleri | `App.Hr.EvaluationCriterion` | 6 kayıt (ağırlıklı): İletişim 1, Teknik Yetkinlik 2, Problem Çözme 1.5, Takım Çalışması 1, Motivasyon 1, Kurum Kültürüne Uyum 1 | Satır butonları (`DynamicReport`, `Raporlar` kategorisi): | Ekran | Buton | Rapor şablonu | Görünürlük | | --- | --- | --- | --- | | Adaylar | KVKK Açık Rıza Formu | `475c1ab4-4600-5ef2-a43e-1366ed89b0ed` | Her satır | | Teklifler | Teklif Mektubu | `80d38666-423d-5e1d-8766-01f2c46be768` | `ApprovalStatus === 'Onaylandı'` | --- ## 4. Veri modeli ``` Hr_T_StaffRequest ──< Hr_T_JobPosting ──< Hr_T_JobApplication >── Hr_T_Candidate ──> AbpUsers (UserId, personel) │ ├──< Hr_T_Interview ──< Hr_T_InterviewScore >── Hr_T_EvaluationCriterion └──< Hr_T_JobOffer ``` | Tablo | Önemli kolonlar | Kural | | --- | --- | --- | | `Hr_T_StaffRequest` | `RequestNo`, `RequestDate`, `RequestedById`, `BranchId` → `DepartmentId` → `JobPositionId` (cascade), `Headcount`, `EmploymentType`, `ExpectedStartDate`, `Reason` (NewPosition/Replacement), `ReplacedUserId`, ücret aralığı + `CurrencyId`, `Qualifications` (HTML), onay alanları | `Reason ≠ Replacement` ise `ReplacedUserId` temizlenir (script) | | `Hr_T_JobPosting` | `PostingNo`, `StaffRequestId`, `Title`, `Status` (Draft/Published/Closed/Cancelled), şube/departman/pozisyon, `Headcount`, `EmploymentType`, `WorkModel` (Office/Hybrid/Remote), `Location`, `PublishDate`, `ClosingDate`, `SourceIds` (yayın kanalları, çok değerli), açıklama/nitelikler (HTML) | Başlık boşsa pozisyon adı kopyalanır | | `Hr_T_Candidate` | Kişisel bilgiler, fotoğraf, ülke → şehir, eğitim (`EducationLevel`, okul, bölüm, mezuniyet), deneyim, ücret beklentisi, `SourceId`, `SkillIds` (`Hr_T_Skill`, çok değerli), `CvDocument`, `UserId`, KVKK alanları | `UX (TenantId, Email)`; `CHECK (KvkkConsent = 1)` | | `Hr_T_JobApplication` | `CandidateId`, `JobPostingId`, `CandidateName`, `PostingTitle`, `ApplicationDate`, `SourceId`, `OwnerUserId`, `AverageScore`, `Stage`, `RejectionReasonId`, `RejectionNote`, `SortOrder` | `UX (TenantId, CandidateId, JobPostingId)`; aşama `Rejected` değilse ret sebebi/notu temizlenir | | `Hr_T_Interview` | `ApplicationId`, `Title`, `InterviewType` (Phone/Video/FaceToFace/Technical/Hr), `InterviewerUserId`, `StartDate`, `EndDate`, `Location`, `MeetingUrl`, `Status` (Planned/Completed/Cancelled/NoShow), `Recommendation` (Hire/Hold/Reject), `OverallScore` | Bitiş boşsa başlangıç + 1 saat (script) | | `Hr_T_InterviewScore` | `InterviewId`, `CriterionId`, `Score`, `Comment` | `CHECK (Score BETWEEN 1 AND 5)`; `UX (InterviewId, CriterionId)` | | `Hr_T_JobOffer` | `OfferNo`, `ApplicationId`, `CandidateName`, `OfferDate`, `ValidUntil`, `StartDate`, `GrossSalary` + `CurrencyId`, `Status` (Draft/Sent/Accepted/Declined/Expired), `ResponseDate`, pozisyon bilgileri, `BenefitCodes` (`Hr_T_BenefitType`), onay alanları | `CHECK (GrossSalary >= 0)`; durum Accepted/Declined olunca yanıt tarihi bugün (script) | --- ## 5. İş kuralları ve hesaplar ### 5.1 Başvuru aşamaları ``` Applied → Screening → Interview → Offer → Hired └──→ Rejected (her aşamadan, elle) ``` | Tetik | Etki (after-command SQL) | | --- | --- | | Mülakat eklendi | Başvuru `Applied`/`Screening` ise → `Interview` | | Teklif eklendi | Başvuru `Applied`/`Screening`/`Interview` ise → `Offer`; teklif zaten `Accepted` ise → `Hired` | | Teklif güncellendi (`Accepted`) | Başvuru henüz `Hired` değilse → `Hired` | | Elle | Panodan sürükleme ya da formdan her aşama seçilebilir | Otomatik ilerleme yalnızca ileri gider; geri almak elle yapılır. ### 5.2 Puanlar - `Interview.OverallScore = Σ(Score × Criterion.Weight) / Σ Weight` (silinmemiş puanlar). - `JobApplication.AverageScore = AVG(Interview.OverallScore)` (puanı olan mülakatlar). - Puan eklenince, güncellenince ya da silinince ikisi de yeniden hesaplanır. ### 5.3 Metin kopyaları `CandidateName`, `PostingTitle` (başvuru), `Title` (mülakat = aday – ilan), `CandidateName` (teklif) after-command ile yazılır. Aday, ilan ya da başvuru güncellendiğinde **tüm** değişmiş kopyalar topluca düzeltilir (sorgu `@Id` ile değil fark koşuluyla çalışır). ### 5.4 Numaratörler `KT-`, `ILN-`, `TKL-` + yıl + 5 hane; kiracı ve yıl bazında `MAX + 1`. Numara yalnızca boşsa yazılır. ### 5.5 Onay akışı (Kadro Talebi, Teklif) Grid Workflow; durum `ApprovalStatus`, onaylayan `ApprovalUser`, tarih `ApprovalDate`, açıklama `ApprovalDescription`. Onay/Ret butonlarını akış kendisi çizer. Onaycı düğümde sabittir (`system@sozsoft.com` seed değeri) — gerçek onaycı ListForm › Workflow'dan girilmelidir. --- ## 6. Yetki ve görünürlük İzin grubu `App.Hr`, modül `Sas|Hr`. Yetki ağacı menüyü izler: `App.Hr.Recruitment` ara yetkisinin altında her ekranın kökü + `.Create/.Update/.Delete/.Export/.Import/.Note`; `App.Hr.InterviewScore` mülakat yetkisinin altındadır. Tanımlar `App.Hr.Definitions` altındadır. Satır süzmesi yoktur — ekran yetkisi olan tüm kayıtları görür. Hiçbir yetki role otomatik atanmaz. Önerilen dağıtım: | Rol | Yetkiler | | --- | --- | | Talep eden yöneticiler | `App.Hr.StaffRequest` (+ `.Create/.Update`) | | Mülakatçılar | `App.Hr.Interview` (+ `.Update`), `App.Hr.InterviewScore` (+ `.Create/.Update/.Delete`) | | İşe alım uzmanı | `App.Hr.Recruitment` dalının tamamı + üç tanım ekranı | | Onaycı | Onaylayacağı ekranın kökü + `.Update` | KVKK: aday verisi kişisel veridir; Adaylar ekranının yetkisi yalnızca işe alım ekibine verilmelidir. --- ## 7. Entegrasyonlar | Kaynak | Kullanım | | --- | --- | | `Sas_T_Branch`, `Hr_T_Department`, `Hr_T_JobPosition` | Şube → departman → pozisyon cascade (talep, ilan, teklif) | | `Sas_H_Currency` | Ücret para birimi (varsayılan TRY) | | `Sas_H_Country`, `Sas_H_City` | Aday adresi (ülke → şehir cascade) | | `Hr_T_Skill` / `Hr_T_SkillType` | Aday yetkinlikleri (`SkillIds`) | | `Hr_T_BenefitType` | Teklifteki yan haklar (`BenefitCodes`) | | `AbpUsers` | Talep eden, ayrılan personel, sorumlu, mülakatçı, personele dönüşen aday | | Bildirimler | Tip `IseAlimMulakatAtandi`; kurallar `Custom` + `UiActivity`/`Mail`; metin `App.Hr.Interview.Notification.{Subject,Message}`, yer tutucular `[Candidate]`, `[Posting]`, `[Date]` | | Raporlar | KVKK Açık Rıza Formu, Teklif Mektubu (`DynamicReport`) | --- ## 8. Akış örneği 1. Satış müdürü **Kadro Talepleri**'nde "Satış Temsilcisi, 2 kişi, yeni pozisyon" talebini açar → `KT-2026-00001`; onaya gönderir, onaycı onaylar → `Onaylandı`. 2. İK **İlanlar**'da talebi seçer; şube/departman/pozisyon/adet dolar, başlık pozisyon adı olur; yayın kanallarını (LinkedIn, Kariyer.net) seçip durumu **Published** yapar → `ILN-2026-00001`. 3. Gelen adaylar **Adaylar**'a CV ve KVKK rızasıyla girilir; KVKK formu satır butonundan basılır. 4. İlanın **Başvurular** sekmesinden aday eklenir (`Applied`); kanban panosunda **Screening**'e çekilir. 5. Başvurunun **Mülakatlar** sekmesinden teknik mülakat planlanır → başvuru `Interview` olur, mülakatçıya bildirim gider; mülakatçı kriterleri puanlar → genel ve ortalama puan hesaplanır. 6. **Teklifler**'de teklif hazırlanır → başvuru `Offer`; teklif onaya gider, onaylanınca **Teklif Mektubu** basılır. 7. Aday kabul eder, teklif **Accepted** yapılır → başvuru `Hired`. BT kullanıcıyı açar, İK aday kaydının **Personel** alanına bağlar ("Personele Dönüşen" kartı artar). --- ## 9. Sık sorulanlar **İlan açarken kadro talebi listede yok.** Yalnızca onaylanmış (`ApprovalStatus = 'Onaylandı'`) talepler listelenir. **Onay butonu kimde görünüyor?** Akış düğümündeki `Approver`'da (seed'de admin). ListForm › Workflow'dan gerçek onaycıyı yazın. **Başvuru aşaması geri gitmedi.** Otomatik ilerleme yalnız ileri gider; geri almayı panodan ya da formdan elle yapın. **Ret sebebi alanı temizlendi.** Ret sebebi ve notu yalnızca `Rejected` aşamasında tutulur. **Aday kaydı kaydedilmiyor.** KVKK rızası işaretli olmalı (tablo da zorlar) ve e-posta kiracıda tekil olmalı. **Aynı aday aynı ilana ikinci kez eklenemiyor.** Aday × ilan tekildir. **Mülakat puanı nasıl hesaplanıyor?** Kriter ağırlıklı ortalama (§5.2); ağırlıklar İK › Tanımlar › Değerlendirme Kriterleri'nden. **İşe alınan aday otomatik personel olmuyor mu?** Hayır; kullanıcıyı BT açar, İK aday kaydına bağlar. --- ## 10. Dosyalar ve geri alma | Dosya | İçerik | | --- | --- | | `configs/seeds/host/sql/object/Hr_T_{StaffRequest,JobPosting,Candidate,JobApplication,Interview,InterviewScore,JobOffer,CandidateSource,RejectionReason,EvaluationCriterion}.sql` | Tablolar, CHECK ve tekil indeksler | | `configs/seeds/host/wizard/{StaffRequest,JobPosting,Candidate,JobApplication,Interview,InterviewScore,JobOffer,CandidateSource,RejectionReason,EvaluationCriterion}.json` | 10 wizard | | `configs/seeds/host/data/App.Hr.{CandidateSource,RejectionReason,EvaluationCriterion}.json` | Tanım verisi | | `configs/seeds/host/data/App.Reports.ReportTemplates.json` | KVKK formu ve teklif mektubu şablonları | | `configs/seeds/host/data/App.Notifications.Notification{Types,Rules}.json` | `IseAlimMulakatAtandi` tipi ve 2 kuralı | | `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 wizard'lar silinir (alt formlar önce: `InterviewScore` → `Interview`/`JobOffer` → `JobApplication` → diğerleri); tablolar yalnızca onayda seçilirse düşer. Rapor şablonları ve bildirim satırları elle kaldırılır. ## Ek — Ekran envanteri (otomatik) > Wizard dosyalarından üretilir; deploy, silme, tasarımcı kaydı ve import'ta yenilenir. Elle düzenleme bir sonraki yenilemede kaybolur. ### Kadro Talepleri — `App.Hr.StaffRequest` | Özellik | Değer | | --- | --- | | Wizard | `wizard/StaffRequest.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.StaffRequest` (sıra 1) | | Yetki | `App.Hr.StaffRequest` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Kadro Talepleri — bir departmanın yeni ya da boşalan bir pozisyon için personel istemesi ve bu isteğin onay süreci. İşe alım sürecinin ilk adımıdır; ilan yalnızca onaylanmış talepten açılır. | | Kaynak | `Hr_T_StaffRequest` · 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.Pending`, `App.Hr.StaffRequest.Widget.Approved`, `App.Hr.StaffRequest.Widget.Headcount` | | Komutlar | InsertAfter: SQL | | Form varsayılanları | IsActive=true, RequestDate=@DATE, RequestedById=@USERID, Headcount=1, EmploymentType=FullTime, Reason=NewPosition, CurrencyId=TRY | | Onay akışı | Start 'Onaya Gönderildi' → Approval 'Onay Bekliyor' → Inform 'Onay Bilgisi' → Inform 'Ret Bilgisi' → End 'Onaylandı' → End 'Reddedildi' | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `RequestNo` | Talep No | dxTextBox | | ✓ | | | `RequestDate` | Talep Tarihi | dxDateBox | ✓ | ✓ | | | `RequestedById` | Talep Eden | dxSelectBox | | ✓ | sorgu: AbpUsers | | `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch | | `DepartmentId` | Departman | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Department (← BranchId) | | `JobPositionId` | İş Pozisyonu | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobPosition (← DepartmentId) | | `Headcount` | Kadro Adedi | dxNumberBox | ✓ | ✓ | | | `EmploymentType` | Çalışma Şekli | dxSelectBox | ✓ | ✓ | liste: FullTime, PartTime, Contract, Intern, Seasonal | | `ExpectedStartDate` | Beklenen Başlangıç | dxDateBox | | ✓ | | | `Reason` | Talep Nedeni | dxRadioGroup | ✓ | ✓ | liste: NewPosition, Replacement · script | | `ReplacedUserId` | Ayrılan Personel | dxSelectBox | | ✓ | sorgu: AbpUsers | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `MinSalary` | Asgari Ücret | dxNumberBox | | ✓ | | | `MaxSalary` | Azami Ücret | dxNumberBox | | ✓ | | | `CurrencyId` | Para Birimi | dxSelectBox | | ✓ | sorgu: Sas_H_Currency | | `Qualifications` | Aranan Nitelikler | dxHtmlEditor | | ✓ | | | `Description` | Açıklama | dxTextArea | | ✓ | | | `ApprovalStatus` | Onay Durumu | dxTextBox | | ✓ | | | `ApprovalUser` | Onaylayan | dxTextBox | | ✓ | | | `ApprovalDate` | Onay Tarihi | dxDateBox | | ✓ | | | `ApprovalDescription` | Onay Açıklaması | dxTextArea | | ✓ | | ### İlanlar — `App.Hr.JobPosting` | Özellik | Değer | | --- | --- | | Wizard | `wizard/JobPosting.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.JobPosting` (sıra 2) | | Yetki | `App.Hr.JobPosting` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | İlanlar — onaylanmış kadro taleplerinden açılan iş ilanları ve ilana gelen başvurular. | | Kaynak | `Hr_T_JobPosting` · 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.JobApplication` (Id → JobPostingId) | | Widget'lar | `App.Widget.Total`, `App.Widget.Published`, `App.Widget.Draft`, `App.Hr.JobPosting.Widget.Closed` | | Komutlar | InsertAfter: SQL · UpdateAfter: SQL | | Form varsayılanları | IsActive=true, Status=Draft, Headcount=1, EmploymentType=FullTime, WorkModel=Office, PublishDate=@DATE | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `PostingNo` | İlan No | dxTextBox | | ✓ | | | `StaffRequestId` | Kadro Talebi | dxSelectBox | | ✓ | sorgu: Hr_T_StaffRequest · script | | `Title` | İlan Başlığı | dxTextBox | ✓ | ✓ | | | `Status` | Durum | dxSelectBox | ✓ | ✓ | liste: Draft, Published, Closed, Cancelled | | `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch | | `DepartmentId` | Departman | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Department (← BranchId) | | `JobPositionId` | İş Pozisyonu | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobPosition (← DepartmentId) | | `Headcount` | Kadro Adedi | dxNumberBox | ✓ | ✓ | | | `EmploymentType` | Çalışma Şekli | dxSelectBox | ✓ | ✓ | liste: FullTime, PartTime, Contract, Intern, Seasonal | | `WorkModel` | Çalışma Modeli | dxSelectBox | ✓ | ✓ | liste: Office, Hybrid, Remote | | `Location` | Lokasyon | dxTextBox | | ✓ | | | `PublishDate` | Yayın Tarihi | dxDateBox | | ✓ | | | `ClosingDate` | Son Başvuru Tarihi | dxDateBox | | ✓ | | | `SourceIds` | Yayın Kanalları | dxTagBox | | ✓ | sorgu: Hr_T_CandidateSource | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `Description` | Açıklama | dxHtmlEditor | | ✓ | | | `Requirements` | Aranan Nitelikler | dxHtmlEditor | | ✓ | | ### Adaylar — `App.Hr.Candidate` | Özellik | Değer | | --- | --- | | Wizard | `wizard/Candidate.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.Candidate` (sıra 3) | | Yetki | `App.Hr.Candidate` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Adaylar — CV ve KVKK açık rızası ile tutulan aday havuzu. Bir aday birden fazla ilana başvurabilir. | | Kaynak | `Hr_T_Candidate` · 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.JobApplication` (Id → CandidateId) | | Widget'lar | `App.Widget.Total`, `App.Widget.Active`, `App.Widget.Passive`, `App.Hr.Candidate.Widget.Converted` | | Komutlar | UpdateAfter: SQL | | Form varsayılanları | IsActive=true, KvkkConsentDate=@NOW, KvkkConsentMethod=Written, CurrencyId=TRY | | Butonlar | `App.Hr.Candidate.KvkkConsentForm` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Photo` | Fotoğraf | dxImageUpload | | ✓ | | | `FirstName` | Adı | dxTextBox | ✓ | ✓ | | | `LastName` | Soyadı | dxTextBox | ✓ | ✓ | | | `Email` | E-posta | dxTextBox | ✓ | ✓ | | | `PhoneNumber` | Telefon | dxTextBox | | ✓ | | | `Gender` | Cinsiyet | dxSelectBox | | ✓ | liste: Male, Female | | `BirthDate` | Doğum Tarihi | dxDateBox | | ✓ | | | `Country` | Ülke | dxSelectBox | | ✓ | sorgu: Sas_H_Country | | `City` | Şehir | dxSelectBox | | ✓ | sorgu: Sas_H_City (← Country) | | `Address` | Adres | dxTextBox | | ✓ | | | `EducationLevel` | Eğitim Düzeyi | dxSelectBox | | ✓ | liste: Primary, HighSchool, Associate, Bachelor, Master, Doctorate | | `School` | Okul | dxTextBox | | ✓ | | | `Major` | Bölüm | dxTextBox | | ✓ | | | `GraduationYear` | Mezuniyet Yılı | dxNumberBox | | ✓ | | | `ExperienceYears` | Deneyim (Yıl) | dxNumberBox | | ✓ | | | `CurrentCompany` | Mevcut Firma | dxTextBox | | ✓ | | | `CurrentTitle` | Mevcut Ünvan | dxTextBox | | ✓ | | | `ExpectedSalary` | Ücret Beklentisi | dxNumberBox | | ✓ | | | `CurrencyId` | Para Birimi | dxSelectBox | | ✓ | sorgu: Sas_H_Currency | | `SourceId` | Kaynak | dxSelectBox | | ✓ | sorgu: Hr_T_CandidateSource | | `LinkedInUrl` | LinkedIn | dxTextBox | | ✓ | | | `UserId` | Personel | dxSelectBox | | ✓ | sorgu: AbpUsers | | `SkillIds` | Yetkinlikler | dxTagBox | | ✓ | sorgu: Hr_T_Skill | | `CvDocument` | CV | dxImageUpload | | ✓ | | | `Notes` | Notlar | dxTextBox | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `KvkkConsent` | Adayın KVKK kapsamında açık rızası alındı | dxCheckBox | ✓ | ✓ | | | `KvkkConsentDate` | Rıza Tarihi | dxDateBox | ✓ | ✓ | | | `KvkkConsentMethod` | Rıza Alma Yöntemi | dxSelectBox | ✓ | ✓ | liste: Written, Electronic, Email | | `KvkkConsentDocument` | İmzalı Rıza Belgesi | dxImageUpload | | ✓ | | ### Başvurular — `App.Hr.JobApplication` | Özellik | Değer | | --- | --- | | Wizard | `wizard/JobApplication.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.JobApplication` (sıra 4) | | Yetki | `App.Hr.JobApplication` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Başvurular — bir adayın bir ilana başvurusu ve başvurunun aşama takibi (kanban panosu). | | Kaynak | `Hr_T_JobApplication` · 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.Interview` (Id → ApplicationId), `App.Hr.JobOffer` (Id → ApplicationId) | | Todo | başlık `CandidateName`, durum `Stage` (Applied,Screening,Interview,Offer,Hired,Rejected) | | Komutlar | InsertAfter: SQL · UpdateAfter: SQL | | Form varsayılanları | IsActive=true, ApplicationDate=@DATE, Stage=Applied, OwnerUserId=@USERID | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `CandidateId` | Aday | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Candidate · script | | `JobPostingId` | İlan | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobPosting | | `CandidateName` | Aday | dxTextBox | | | | | `PostingTitle` | İlan | dxTextBox | | | | | `ApplicationDate` | Başvuru Tarihi | dxDateBox | ✓ | ✓ | | | `SourceId` | Kaynak | dxSelectBox | | ✓ | sorgu: Hr_T_CandidateSource | | `OwnerUserId` | Sorumlu | dxSelectBox | | ✓ | sorgu: AbpUsers | | `AverageScore` | Ortalama Puan | dxNumberBox | | ✓ | | | `Stage` | Aşama | dxSelectBox | ✓ | ✓ | liste: Applied, Screening, Interview, Offer, Hired, Rejected · script | | `RejectionReasonId` | Ret Sebebi | dxSelectBox | | ✓ | sorgu: Hr_T_RejectionReason | | `RejectionNote` | Ret Açıklaması | dxTextArea | | ✓ | | | `SortOrder` | Sıralama | dxNumberBox | | | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `Notes` | Notlar | dxTextArea | | ✓ | | ### Mülakatlar — `App.Hr.Interview` | Özellik | Değer | | --- | --- | | Wizard | `wizard/Interview.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.Interview` (sıra 5) | | Yetki | `App.Hr.Interview` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Mülakatlar — başvuru için mülakat planlama, mülakatçı ataması ve kriter bazlı puanlama. | | Kaynak | `Hr_T_Interview` · filtre `"IsDeleted" = 'false'` | | Görünümler | Grid, Card, Pivot, Chart, Scheduler (açılış grid) | | Düzenleme | ekle ✓ · düzenle ✓ · sil ✓ · popup | | Kapsam | Kiracı | | Alt formlar | `App.Hr.InterviewScore` (Id → InterviewId) | | Komutlar | InsertAfter: SQL · UpdateAfter: SQL · DeleteAfter: SQL | | Form varsayılanları | IsActive=true, InterviewType=FaceToFace, Status=Planned, InterviewerUserId=@USERID | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `ApplicationId` | Başvuru | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobApplication | | `Title` | Başlık | dxTextBox | | | | | `InterviewType` | Mülakat Türü | dxSelectBox | ✓ | ✓ | liste: Phone, Video, FaceToFace, Technical, Hr | | `InterviewerUserId` | Mülakatçı | dxSelectBox | ✓ | ✓ | sorgu: AbpUsers | | `StartDate` | Başlangıç | dxDateBox | ✓ | ✓ | script | | `EndDate` | Bitiş | dxDateBox | ✓ | ✓ | | | `Location` | Yer | dxTextBox | | ✓ | | | `MeetingUrl` | Toplantı Bağlantısı | dxTextBox | | ✓ | | | `Status` | Durum | dxSelectBox | ✓ | ✓ | liste: Planned, Completed, Cancelled, NoShow | | `Recommendation` | Öneri | dxSelectBox | | ✓ | liste: Hire, Hold, Reject | | `OverallScore` | Genel Puan | dxNumberBox | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `Notes` | Notlar | dxTextArea | | ✓ | | ### Teklifler — `App.Hr.JobOffer` | Özellik | Değer | | --- | --- | | Wizard | `wizard/JobOffer.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Recruitment` › `App.Hr.JobOffer` (sıra 6) | | Yetki | `App.Hr.JobOffer` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Teklifler — işe alınması düşünülen adaya yapılan ücret ve şart teklifi, iç onayı ve teklif mektubu. | | Kaynak | `Hr_T_JobOffer` · 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: SQL · UpdateAfter: SQL | | Form varsayılanları | IsActive=true, OfferDate=@DATE, Status=Draft, CurrencyId=TRY, EmploymentType=FullTime, WorkModel=Office | | Butonlar | `App.Hr.JobOffer.OfferLetter` | | Onay akışı | Start 'Onaya Gönderildi' → Approval 'Onay Bekliyor' → Inform 'Onay Bilgisi' → Inform 'Ret Bilgisi' → End 'Onaylandı' → End 'Reddedildi' | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `OfferNo` | Teklif No | dxTextBox | | ✓ | | | `ApplicationId` | Başvuru | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobApplication · script | | `CandidateName` | Aday | dxTextBox | | | | | `OfferDate` | Teklif Tarihi | dxDateBox | ✓ | ✓ | | | `ValidUntil` | Geçerlilik Tarihi | dxDateBox | | ✓ | | | `StartDate` | İşe Başlama Tarihi | dxDateBox | | ✓ | | | `GrossSalary` | Brüt Maaş | dxNumberBox | ✓ | ✓ | | | `CurrencyId` | Para Birimi | dxSelectBox | ✓ | ✓ | sorgu: Sas_H_Currency | | `Status` | Durum | dxSelectBox | ✓ | ✓ | liste: Draft, Sent, Accepted, Declined, Expired · script | | `ResponseDate` | Yanıt Tarihi | dxDateBox | | ✓ | | | `BranchId` | Şube Adı | dxSelectBox | ✓ | ✓ | sorgu: Sas_T_Branch | | `DepartmentId` | Departman | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_Department (← BranchId) | | `JobPositionId` | İş Pozisyonu | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_JobPosition (← DepartmentId) | | `EmploymentType` | Çalışma Şekli | dxSelectBox | ✓ | ✓ | liste: FullTime, PartTime, Contract, Intern, Seasonal | | `WorkModel` | Çalışma Modeli | dxSelectBox | ✓ | ✓ | liste: Office, Hybrid, Remote | | `BenefitCodes` | Yan Haklar | dxTagBox | | ✓ | sorgu: Hr_T_BenefitType | | `Notes` | Notlar | dxTextBox | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | | `ApprovalStatus` | Onay Durumu | dxTextBox | | ✓ | | | `ApprovalUser` | Onaylayan | dxTextBox | | ✓ | | | `ApprovalDate` | Onay Tarihi | dxDateBox | | ✓ | | | `ApprovalDescription` | Onay Açıklaması | dxTextBox | | ✓ | | ### Aday Kaynakları — `App.Hr.CandidateSource` | Özellik | Değer | | --- | --- | | Wizard | `wizard/CandidateSource.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Definitions` › `App.Hr.CandidateSource` (sıra 13) | | Yetki | `App.Hr.CandidateSource` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Aday Kaynakları — adayların ve ilanların hangi kanaldan geldiğini/yayınlandığını tanımlayan liste (LinkedIn, Kariyer.net, referans, kariyer fuarı…). | | Kaynak | `Hr_T_CandidateSource` · 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` | | Form varsayılanları | IsActive=true | | Veri aynası | `data/App.Hr.CandidateSource.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Adı | dxTextBox | ✓ | ✓ | | | `Description` | Açıklama | dxTextArea | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | ### Ret Sebepleri — `App.Hr.RejectionReason` | Özellik | Değer | | --- | --- | | Wizard | `wizard/RejectionReason.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Definitions` › `App.Hr.RejectionReason` (sıra 14) | | Yetki | `App.Hr.RejectionReason` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Ret Sebepleri — bir başvurunun şirket ya da aday tarafından neden kapatıldığını sınıflandıran liste. | | Kaynak | `Hr_T_RejectionReason` · 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` | | Form varsayılanları | IsActive=true, RejectedBy=Company | | Veri aynası | `data/App.Hr.RejectionReason.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Adı | dxTextBox | ✓ | ✓ | | | `RejectedBy` | Reddeden | dxRadioGroup | ✓ | ✓ | liste: Company, Candidate | | `Description` | Açıklama | dxTextArea | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | ### Değerlendirme Kriterleri — `App.Hr.EvaluationCriterion` | Özellik | Değer | | --- | --- | | Wizard | `wizard/EvaluationCriterion.json` | | Yol | Liste (Wizard) | | Menü | `App.Hr.Definitions` › `App.Hr.EvaluationCriterion` (sıra 15) | | Yetki | `App.Hr.EvaluationCriterion` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Değerlendirme Kriterleri — mülakatlarda puanlanan kriterler ve ağırlıkları (iletişim, teknik yetkinlik, problem çözme…). | | Kaynak | `Hr_T_EvaluationCriterion` · 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` | | Form varsayılanları | IsActive=true, Weight=1 | | Veri aynası | `data/App.Hr.EvaluationCriterion.json` | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `Name` | Adı | dxTextBox | ✓ | ✓ | | | `Weight` | Ağırlık | dxNumberBox | ✓ | ✓ | | | `Description` | Açıklama | dxTextArea | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | | ### Mülakat Puanları — `App.Hr.InterviewScore` | Özellik | Değer | | --- | --- | | Wizard | `wizard/InterviewScore.json` | | Yol | Liste (Wizard) | | Menü | Menüsüz (alt form) | | Yetki | `App.Hr.InterviewScore` + `.Create`, `.Update`, `.Delete`, `.Export`, `.Import`, `.Note` | | Açıklama | Mülakat Puanları — mülakatta her değerlendirme kriterine verilen 1–5 puan. | | Kaynak | `Hr_T_InterviewScore` · 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: SQL · UpdateAfter: SQL · DeleteAfter: SQL | | Form varsayılanları | IsActive=true | | Alan | Başlık | Editör | Zorunlu | Formda | Kaynak | | --- | --- | --- | --- | --- | --- | | `InterviewId` | Mülakat | dxTextBox | | | | | `CriterionId` | Kriter | dxSelectBox | ✓ | ✓ | sorgu: Hr_T_EvaluationCriterion | | `Score` | Puan | dxSelectBox | ✓ | ✓ | liste: 1, 2, 3, 4, 5 | | `Comment` | Yorum | dxTextArea | | ✓ | | | `IsActive` | Aktif | dxCheckBox | | ✓ | |