sozsoft-platform/configs/seeds/docs/modules/HrLeave.md
2026-10-05 17:11:06 +03:00

41 KiB
Raw Blame History

İK › İzin Yönetimi (App.Hr.Leave)

İzin talebi, iki aşamalı onay (departman müdürü → İK), yıllık izin bakiyesi ve rapor (istirahat) eşlemesi. İnsan Kaynakları menüsü yalnız İK içindir: tüm talepleri ve bakiyeleri İK izler. Çalışan ve müdür izinle ilgili her şeyi Intranet › Dashboard'daki widget'lardan yapar. Wizard ekranları, SQL nesneleri ve custom component widget'larıyla kuruludur. Çerçeve dışında iki ek vardır (kullanıcı onayıyla): Grid Workflow'da kayıttan okunan onaycı (@Kolon) ve kullanıcı detayındaki İzinler sekmesi.

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
Çalışan Bakiyesini izler, izin talebi açar, taleplerinin onay durumunu takip eder, henüz karar verilmemiş talebini düzeltir/siler Intranet panosu: İzinlerim widget'ı → İzin Talebi Oluştur · Taleplerim · Bakiyem · Profil › İzinlerim (bakiye + talepler salt okunur, İzin Talebi Oluştur)
Departman müdürü Departmanının taleplerini onaylar/reddeder Intranet panosu: Ekibimin İzinleri widget'ı → Ekibimin İzin Talepleri
İK Tüm talepleri izler, ikinci onayı verir, çalışan adına talep girer, bakiyeleri izler, açılış/devir düzeltmesi girer, çalışma günlerini ve kademeleri ayarlar İK › İzin Yönetimi › İzin Talepleri · İzin Bakiyeleri · Ayarlar › İnsan Kaynakları › İzin · Kullanıcı detayı › İzinler
Sağlık birimi Raporu Sağlık Kartı'na girer; kayıt izin listesine onaylı düşer İK › Sağlık Kartları › İstirahat Raporları

Kapsam: kiracı (IsTenant). Şube kırılımı yoktur.


2. Analiz ve kararlar

2.1 Talep

İnsan Kaynakları › İzin Yönetimi. Kullanıcı Intranet Dashboard'dan kendi bakiye raporunu izler, izin talebi oluşturur, bir butonla taleplerini ve onay durumlarını takip eder (Performansım widget'ındaki Değerlendirmelerim gibi). İzin türüne göre gerekli alanlar doldurulur; bakiye yetmezse talep engellenir veya uyarı verilir; aynı tarihlerde çakışan talep oluşturulamaz. Sağlık Kartı › İstirahatler ile Rapor türündeki izin tek kayıttır. İzin bakiyesi kullanıcı kartında gösterilir. Alanlar: izin türü, başlangıç/bitiş tarihi ve saati, yarım gün, gün sayısı (otomatik), açıklama, ek belge, durum. Yıllık hak çalışma yılına göre hesaplanır. Onay önce departman müdürü (İş Pozisyonları'ndaki departman müdürü), sonra İK. Talep gelince yöneticiye bildirim gider. İK menüsü yalnız İK kullanır; widget'lar Aktif Anketler'in altına (sol kolon).

2.2 Depodan okunanlar (sorulmadı)

  • İzin türleri Hr_T_LeaveType (İK › Tanımlamalar): cinsiyet, yıllık en fazla gün, ücretli, yıllık izinden düşer, belge gerekir, yarım gün.
  • Rapor kayıtları Adm_T_UserSickLeave; iki ekran kullanır: Sağlık Kartı (App.Hr.HealthCardSickLeave) ve kullanıcı detayı (App.IdentityManagement.UserSickLeave).
  • Kıdem AbpUsers.SeniorityStartDate (boşsa HireDate), doğum BirthDate, cinsiyet Gender, departman/pozisyon DepartmentId/JobPositionId.
  • Tatiller Hr_T_WorkCalendar (Holiday / HalfDay, FREQ=YEARLY tekrar).
  • Pozisyon ağacı Hr_T_JobPosition (DepartmentId + ParentId); departmanda "müdür" alanı yoktur.
  • Grid Workflow onaycıyı düğümde sabit tutuyordu — kayda göre değişen müdür için motor eki gerekti.

2.3 Keşif turu cevapları

# Soru Seçilen
1 Onay akışı Grid Workflow + motor eki: düğüm onaycısı @Kolon ise kayıttan okunur
2 Müdür nasıl bulunur Departmanın en üst pozisyonu (üst pozisyonu başka departmanda ya da üstü olmayan); çalışan o pozisyondaysa bir üst pozisyonun sahibi; birden çok müdür varsa herhangi biri
3 Yıllık hak İş Kanunu md.53 kademeleri + devir (kullanılmayan izin devreder)
4 Bakiye yetersiz İzin türü bazında İK seçer: BalanceExceedAction = Engelle / Uyar ve kaydet
5 İK onaycısı Düğümde sabit kullanıcı(lar) (İzin Talepleri akışının "İK Onayı" düğümü)
6 Gün sayısı Ayarlar › İnsan Kaynakları › İzin'deki çalışma günleri + Çalışma Takvimi tatilleri (kullanıcı kararı: tüm İK ayarları bu grupta)
7 Rapor talebi Onay akışından geçer; onaylanınca Sağlık Kartı'nda görünür (onay beklerken sağlık kartına ve puantaja düşmez), reddedilirse kalkar
8 Kullanıcı kartı Kullanıcı detayına İzinler sekmesi (bakiye özeti + talepler + defter)
9 Üstü olmayan pozisyon (Genel Müdür) Müdür adımı atlanır, talep doğrudan İK Onayı'na gider (üretim sırasında soruldu)

2.4 Üretimde verilen kararlar

Konu Karar Neden
Persona ekranında akış İzin Taleplerim ekranında Workflow yoktur; ilk adımı (Müdür Onayı + müdür kullanıcı adları) kayıt sonrası prosedür yazar Workflow alanlarını yazabilen persona ekranı, çalışanın durumu API ile "Onaylandı" yapmasına izin verirdi; alanlar İK yetkisine kilitli
Müdür ekranı Ekibimin İzin Talepleri ayrı ekran, aynı akış başlıklarıyla; satır ManagerIds ile süzülür Akış düğümleri ekrana bağlıdır, durum başlıkla eşleşir (FindCurrentCriteria)
İK onaycısının tek kaynağı Kayıt sonrası prosedür İK adımına girerken onaycıyı İzin Talepleri akışının "İK Onayı" düğümünden okur Ekibimin İzin Talepleri akışındaki İK düğümü ayrı düzenlenirse sapma olmasın
Yöneticinin geçişleri Müdür yalnız Müdür Onayı → İK Onayı / Reddedildi yapabilir; başka geçiş geri alınır Workflow alanları müdür ekranında yazılabilir olmak zorunda (motor ekranın kayıt yolunu kullanır)
Bakiye defteri Hak ediş yılı başına satır; 0. yıl düzeltmeler ve ilk hak edişten önceki kullanım Devirli kümülatif bakiyenin denetlenebilir dökümü
Açılış bakiyesi Bakiye Düzeltmeleri (± gün) Devirli hesapta sistem öncesi kullanım girilmezse geçmiş bütün yıllar kullanılmamış görünür
Bildirim Uygulama içi + toast (IzinTalebiOnayBekliyor, IzinTalebiSonuclandi); Workflow Inform düğümü kullanılmadı Inform yalnız e-posta gönderir ve onaycısı sabittir
Ek belge dxImageUpload (base64, nvarchar(MAX)), listede gizli Platform standardı
En üst pozisyon Prosedür RequiresManagerApproval'ı yazar (1 = müdür onayı gerekir, 0 = atlanır); İzin Talepleri akışında Başlangıç ile Müdür Onayı arasında bu kolona bakan karşılaştırma düğümü vardır, çalışanın kendi talebinde prosedür durumu doğrudan İK Onayı yapar Motorun karşılaştırma düğümü yalnız sayısal kolon okur (EvaluateCondition) ve satırı ekranın sorgusundan alır; kolon İzin Talepleri'nde gizli alandır
Form günü Gün formda tarayıcıda önizlenir (hafta içi gün, yarım günde 0,5), kalıcı değer prosedürün hesabıdır; İzin Türü lookup'ı cascade değildir Cascade ebeveyni çocuğu kilitler ve değiştiğinde temizler; ayrıntı §5.1
Bildirim başlığı Bildirim panelinde ve etkinlik kaydında tip adı yerine kaydın Subject'i gösterilir (bütün modüller) Tip adı (PerformansDurumDegisti) koddur; konu çevrilmiş metindir

2.5 Varsayılan kalanlar

  • Çalışma günleri Pzt–Cum; kademeler 14 / 20 / 26, genç/yaşlı en az 20 (ayarlarda değiştirilir).
  • İzin türü varsayılanı: yıllık izinden düşen ya da yıllık sınırı olan türler Engelle, diğerleri Uyar ve kaydet (seed).
  • Rapor kaydı SickLeaveType = Disease, gün sayısı takvim günü (Sağlık Kartı kuralı); izin talebindeki gün çalışma günüdür.

3. Menü ve ekranlar

3.1 İK menüsü

İnsan Kaynakları › İzin Yönetimi (App.Hr.Leave, sıra 14, FcOvertime) — yalnız İK.

Sıra Menü (TR / EN) ListFormCode Wizard Kaynak Alt formlar Widget'lar
1 İzin Talepleri / Leave Requests App.Hr.LeaveRequest LeaveRequest.json Hr_T_LeaveRequest — Müdür Onayında · İK Onayında · Onaylanan (bu yıl) · Reddedilen (bu yıl)
2 İzin Bakiyeleri / Leave Balances App.Hr.LeaveBalance LeaveBalance.json Hr_V_LeaveSummary (salt okunur) LeaveBalanceAdjustment, LeaveBalanceYear (Id → EmployeeId) Çalışan · Toplam Kalan Gün · Eksi Bakiye · Onay Bekleyen Gün

Menüsüz alt formlar: Bakiye Düzeltmeleri (App.Hr.LeaveBalanceAdjustment, Hr_T_LeaveBalanceAdjustment), İzin Defteri (App.Hr.LeaveBalanceYear, Hr_V_LeaveBalanceYear, salt okunur).

Görünümler: hepsi Grid, Card, Pivot, Chart.

3.2 Çalışana ve müdüre ait ekranlar (menüsüz)

Ekran ListFormCode Satır süzmesi Yapılabilen
İzin Taleplerim App.Hr.MyLeaveRequest EmployeeId = @USERID Ekle; karar verilmeden düzelt/sil. EmployeeId sunucuda @USERID ile yazılır
Bakiyem App.Hr.MyLeaveBalance EmployeeId = @USERID Defteri görür
Ekibimin İzin Talepleri App.Hr.TeamLeaveRequest ManagerIds içinde kullanıcı Müdür adımında Onayla / Reddet

Talep formu doğrudan açılır: /admin/form/App.Hr.MyLeaveRequest.

3.3 Intranet › Dashboard widget'ları

Sol kolon (Column: 0), Aktif Anketler'in (30) altında; kayıtlar data/App.DeveloperKit.IntranetWidgets.json.

Code · sıra Bileşen PermissionName Gösterir Butonlar
my-leave · 35 MyLeaveWidget App.Hr.MyLeaveRequest Kalan / kullanılan / onay bekleyen gün, sonraki hak ediş, süren ilk 3 talep ve durumu İzin Talebi Oluştur · Taleplerim · Bakiyem
team-leave · 36 TeamLeaveWidget App.Hr.TeamLeaveRequest Onayımı bekleyen talep sayısı ve ilk 5'i, bugün izinde olanlar Onay Bekleyenler

Bileşenler code modunda, rotasızdır; veriyi ekranların kendi sorgusundan okur (GET /api/app/list-form-select/select). Bakiye kartları App.Hr.MyLeaveBalance yetkisi yoksa gizlenir.

3.4 Kullanıcı detayı › İzinler

ui/src/views/admin/user-management/LeaveTab.tsx: İzin Bakiyeleri satırından altı kart (hak edilen, düzeltme, kullanılan, bekleyen, kalan, kullanılabilir), altında kullanıcıya süzülmüş İzin Talepleri ve İzin Defteri listeleri. Her parça kendi ekran yetkisiyle görünür; İK buradan çalışan adına talep ekleyebilir (yeni satırın EmployeeId'si süzgeçten dolar).

3.5 Ayarlar

Ayarlar › İnsan Kaynakları › İzin (App.HrSettings › App.HrSettings.Leave, sağlayıcılar T|G|D):

Kod Varsayılan
App.HrSettings.Leave.Work{Monday…Sunday} Pzt–Cum True, Cmt–Paz False
App.HrSettings.Leave.AnnualDays1To5 / AnnualDays5To15 / AnnualDays15Plus 14 / 20 / 26
App.HrSettings.Leave.MinDaysYoungOld 20

SQL tarafı ayarı dbo.Hr_F_HrSetting ile ABP'nin sırasıyla okur (kiracı → genel → tanım varsayılanı).


4. Veri modeli

AbpUsers ──< Hr_T_LeaveRequest >── Hr_T_LeaveType
   │              └── Adm_T_UserSickLeave (SickLeaveId, Rapor türünde)
   └──< Hr_T_LeaveBalanceAdjustment
Hr_V_LeaveBalanceYear (defter) ──▶ Hr_V_LeaveSummary (çalışan başına toplam)
Nesne Önemli kolonlar Kural
Hr_T_LeaveRequest RequestNo, EmployeeId/EmployeeName/DepartmentId/JobPositionId, LeaveTypeId, StartDate/EndDate (tarih+saat), IsHalfDay, HalfDayPart (Morning/Afternoon), Days (0,5 adımlı), Description, DocumentFileName/DocumentContent, BalanceWarning, SickLeaveId, ManagerIds/ManagerUserNames, RequiresManagerApproval (int, 1/0), ApprovalStatus/ApprovalUser/ApprovalDate/ApprovalDescription, LastNotifiedStatus, IsActive EndDate ≥ StartDate; kiracı + tam audit
Hr_T_LeaveBalanceAdjustment EmployeeId, AdjustmentDate, Days (≠ 0, ±), Reason, IsActive —
Hr_T_LeaveType (+ kolon) BalanceExceedAction (Block/Warn, varsayılan Block) Kayıpsız ALTER ADD
Hr_V_LeaveBalanceYear Id ({EmployeeId}-{YearNo}), YearNo, AccrualDate, PeriodEndDate, EntitledDays, UsedDays, PendingDays, RemainingDays, CumulativeRemainingDays, NextAccrualDate, NextAccrualDays Görünüm
Hr_V_LeaveSummary Id (= kullanıcı), ServiceYears, EntitledDays, AdjustmentDays, UsedDays, PendingDays, RemainingDays, AvailableDays, NextAccrualDate/Days, IsActive Görünüm

Durum değerleri (Workflow düğüm başlıkları): Onaya Gönderildi · Müdür Onayı · İK Onayı · Onaylandı · Reddedildi.


5. İş kuralları ve hesaplar

5.1 Gün sayısı (Hr_F_LeaveWorkDays)

Başlangıç–bitiş tarihleri (saat dikkate alınmaz) arasındaki her gün: ayarlarda çalışma günü değilse 0; Çalışma Takvimi'nde Holiday ise 0, HalfDay ise 0,5; aksi 1. Yıllık tekrarlı satır başlangıç yılından itibaren her yıl aynı gün/aya düşer. Yarım gün talepte sonuç en fazla 0,5'tir.

Formda gün veri girerken dolar (Başlangıç, Bitiş ve Yarım Gün alanlarının EditorScript'i, custom tarifi). Bu bir önizlemedir: iki tarih arasındaki hafta içi günler sayılır, yarım günde 0,5 yazılır; Çalışma Günleri ayarı ve Çalışma Takvimi tatilleri formda düşülmez. Kayıtta prosedür günü Hr_F_LeaveWorkDays ile yeniden hesaplar ve kayıtlı değer odur.

Olay Formda
Başlangıç / Bitiş değişir Gün yeniden hesaplanır; yarım gün açıkken Başlangıç değişirse Bitiş onu izler
Yarım Gün işaretlenir Bitiş = Başlangıç, Gün 0,5, Yarım Gün Dilimi açılır
Yarım Gün kaldırılır Dilim temizlenip kilitlenir, Gün tam gün olarak hesaplanır

Notlar:

  • Dilim kilidi custom kuralıdır (readOnly tarifi değil). Grid popup'ında editörler yeniden çizilince kural açılış olayıyla (isReady) tekrar çalışır; o anda form verisi güncel değildir (form.getEditor popup editörünü döndürmez) ve tarif Yarım Gün'ü eski hâliyle okuyup kilidi geri kapatırdı. Kural bu çalışmada değeri grid'in düzenlenen satırından (editor.component.cellValue) okur; form sayfasında form verisinden.
  • Dilimin script'i yoktur. Form sayfası script'li bir editör değişince formData'yı baştan yazar; bu sırada açılır liste temizlenip yeniden dolar ve script'i olsaydı kendini tetikleyip sonsuz döngüye girerdi. Tutarlılığı prosedür sağlar: yarım gün değilse dilim silinir, yarım günde boş dilim Morning olur.
  • İzin Türü düz bir lookup'tır, cascade kullanılmaz: bool ebeveyn false iken çocuğu kilitler, tarih değişince değeri silerdi.

5.2 Yıllık hak ve bakiye (Hr_V_LeaveBalanceYear)

Değer Formül
Hak ediş tarihi Kıdem başlangıcı + n yıl (n = 1, 2, …), bugün ve (varsa) işten çıkış tarihine kadar
Hak edilen n ≤ 5 → AnnualDays1To5; 6 ≤ n ≤ 14 → AnnualDays5To15; n ≥ 15 → AnnualDays15Plus. Hak ediş tarihindeki yaş ≤ 18 ya da ≥ 50 ise en az MinDaysYoungOld
Kullanılan / bekleyen Yıllık izinden düşen türdeki onaylı / onay bekleyen taleplerin günü; talep başlangıcının düştüğü hak ediş dönemine yazılır
0. yıl Düzeltmelerin toplamı ve ilk hak edişten önce başlayan talepler
Kalan Σ(hak edilen + düzeltme) − Σ kullanılan (devirli)
Kullanılabilir Kalan − onay bekleyen

5.3 Kayıt sonrası (Hr_S_LeaveRequestAfterSave)

Her ekleme/güncellemede (Workflow kararı dahil) çalışır; THROW kaydı geri alır.

  1. Çalışan adı, departman, pozisyon kullanıcı kartından; talep no IZN-YYYY-00001. (İK formunda çalışan seçilince departman ve pozisyon formda da hemen dolar: Çalışan lookup'ı iki kolonu döndürür, copy tarifi yazar.)
  2. Müdür (§2.3 karar 2) bulunur → ManagerIds, ManagerUserNames. Bulunamazsa: çalışanın pozisyonunun üst pozisyonu yoksa (Genel Müdür) RequiresManagerApproval = 0 yazılır ve müdür adımı atlanır; değilse ve talep müdür adımına kadar ise THROW 51110 (yapılandırma eksik).
  3. Müdür ekranından izinsiz geçiş önceki duruma geri alınır.
  4. Çalışanın yeni talebi Müdür Onayı'na (müdür adımı atlanıyorsa İK Onayı'na) alınır; adıma girerken onaycı yazılır (müdür adımı → ManagerUserNames, İK adımı → İzin Talepleri akışının "İK Onayı" düğümü).
  5. Gün sayısı hesaplanır.
  6. Talep sonuçlanmamışsa doğrulanır:
Kod Kural
51111 Tür cinsiyeti çalışana uymuyor
51112 Tür yarım güne izin vermiyor
51113 Yarım günde başlangıç ve bitiş aynı gün olmalı
51114 Tür belge istiyor, belge yok
51115 Aralıkta çalışma günü yok
51116 Reddedilmemiş başka bir talep ya da talebe bağlı olmayan istirahat aynı güne düşüyor (aynı günün iki ayrı yarısı serbest)
51117 Yıllık izinden düşen türde gün > kullanılabilir bakiye, ya da türün yıllık sınırı aşılıyor — tür Block ise; Warn ise kayıt yapılır, uyarı BalanceWarning'e yazılır
51118 Talebin (yeni ya da eski) tarihleri kapalı puantaj dönemine düşüyor — ekleme, düzeltme, karar ve silme reddedilir (Hr_F_TimesheetPeriodClosed; eski tarihleri Hr_S_LeaveRequestGuard denetler)
51119 Tarihler çalışanın işe giriş – işten çıkış aralığının dışında
  1. Rapor (Code = Sick) türünde talep onaylandığında istirahat satırı açılır/güncellenir; reddedilen, onay bekleyen ya da türü değişen talebin istirahati kalkar. Rapor türü dışındaki talebin gün sayısı rapora denk gelen günleri saymaz (Hr_F_LeaveNetDays); rapor değişince çalışanın diğer taleplerinin gün sayısı yenilenir (Hr_S_LeaveDaysRefresh).
  2. Silinen talep (silme sonrası komut aynı prosedürü çağırır): bağlı istirahat kalkar, puantaj yeniden hesaplanır.
  3. Durum bildirim taşıyan bir değere geçtiyse bir kez bildirim gider, LastNotifiedStatus güncellenir.
  4. Puantaj: talebin günleri yeniden hesaplanır; tarihi değişen talebin eski günlerini hesap kendisi aralığa katar.

5.4 Satır koruması (Hr_S_LeaveRequestGuard, before-command)

Aktör Kural
Çalışan Yalnız kendi talebi (51100); durum Onaya Gönderildi/Müdür Onayı değilse düzeltme/silme yok (51101)
Müdür Silemez (51102); ManagerIds içinde olmalı (51103); talep Müdür Onayı'nda olmalı (51104)
İK Serbest
Hepsi Talebin kayıttaki (eski) tarihleri kapalı puantaj dönemine düşüyorsa düzeltme/silme yok (51118)

Alan kilidi: persona ekranlarında çalışanın/müdürün değiştirmemesi gereken alanların yazma yetkisi App.Hr.LeaveRequest.Create/.Update'e bağlıdır; sunucu yetkisi olmayan alanı düşürür. Bu yüzden çalışan/müdür rolüne İzin Talepleri'nin .Create/.Update yetkisi verilmez.

5.5 Rapor ↔ izin (tek kayıt)

Nereden Ne olur
İzin talebi, tür Rapor Onayda Adm_T_UserSickLeave satırı açılır (SickLeaveId); onaylı talep güncellenince güncellenir, silinince/reddedilince kalkar
Sağlık Kartı › İstirahat Raporları ya da kullanıcı detayı › İstirahatler Hr_S_LeaveSickLeaveSync: onaylı Rapor talebi açılır (onay akışına girmez), güncellemede tarih/gün, silmede (silme sonrası komut aynı prosedürü çağırır) talep kalkar. Rapora denk gelen yıllık izin günleri bakiyeye döner. Kapalı puantaj ayına düşen rapor kaydedilmez (51120). Kiracıda Sick kodlu tür yoksa eşleme yapılmaz
Çalışma Takvimi Takvim satırı kaydedilince denk gelen taleplerin gün sayısı yeniden hesaplanır (Hr_S_WorkCalendarAfterSave)

5.6 Onay akışı (Grid Workflow)

Onaya Gönderildi (Start) → Müdür Onayı Gerekli mi? (Compare, RequiresManagerApproval = 1) → evet: Müdür Onayı (Approval, @ManagerUserNames) / hayır: doğrudan İK Onayı (Approval, seed'de system@sozsoft.com) → Onaylandı (End); iki onay adımının reddi → Reddedildi (End). Karşılaştırma düğümü yalnız İzin Talepleri akışındadır (akış İK grid'inden eklenen kayıtta orada başlar); Ekibimin İzin Talepleri akışı başlatılmaz, yalnız müdür adımından ilerler. Akış iki ekranda aynı başlıklarla durur. İK onaycısı İzin Talepleri › ListForm › Workflow › "İK Onayı" düğümünden değiştirilir (§2.4).


6. Yetki ve görünürlük

İzin grubu App.Hr, modül Sas|Hr. Dal App.Hr.Leave → App.Hr.LeaveRequest, App.Hr.LeaveBalance (altında LeaveBalanceAdjustment, LeaveBalanceYear). Kökte menüsüz App.Hr.MyLeaveRequest, App.Hr.MyLeaveBalance, App.Hr.TeamLeaveRequest. Ayar: App.HrSettings › App.HrSettings.Leave (Administration grubu, App.Setting altında). Her ekranda .Create/.Update/.Delete/.Export/.Import/.Note. Hiçbir yetki role otomatik atanmaz.

Rol Verilecek yetkiler
Tüm çalışanlar App.Hr.MyLeaveRequest (+ .Create/.Update/.Delete), App.Hr.MyLeaveBalance
Müdürler Yukarıdakiler + App.Hr.TeamLeaveRequest (+ .Update — Workflow kararı güncelleme yetkisi ister)
İK App.Hr.Leave dalının tamamı + App.HrSettings.Leave

Widget'lar liste okuma yetkisiyle görünür (İzinlerim App.Hr.MyLeaveRequest, Ekibimin İzinleri App.Hr.TeamLeaveRequest).


7. Entegrasyonlar

Kaynak Kullanım
AbpUsers Çalışan, kıdem, doğum tarihi, cinsiyet, departman/pozisyon; onaycı kullanıcı adları
Hr_T_JobPosition / Hr_T_Department Departman müdürü çözümü
Hr_T_LeaveType Tür kuralları (cinsiyet, yarım gün, belge, yıllık sınır, yıllık izinden düşme, aşım davranışı)
Hr_T_WorkCalendar Tatil ve yarım günler
AbpSettings / Sas_H_SettingDefinition Çalışma günleri ve kademeler
Adm_T_UserSickLeave Rapor eşlemesi
Puantaj ve Devam Takibi Hr_S_LeaveRequestAfterSave sonunda talebin günleri Hr_S_TimesheetCalculate ile yeniden hesaplanır: onaylı izin İzinli, rapor Raporlu gün olur; ücretli izne denk gelen tatil İzinli değil tatil, ücretsiz izin hafta sonu dahil İzinli yazılır. Tarihi değişen ya da silinen talebin eski günleri aynı işlemde düzelir (HrAttendance.md §7.1). Kapalı puantaj ayına düşen talep değiştirilemez; onay bekleyen talebi olan ay kapatılamaz. Çalışma günü ayarları puantajda hafta tatilini de belirler
Bildirimler IzinTalebiOnayBekliyor (müdür / İK onaycısı), IzinTalebiSonuclandi (çalışan); kurallar Custom + UiActivity/UiToast. Metinler App.Hr.Leave.Notification.{Approval,Result}.{Subject,Message} (TR), yer tutucular [Employee], [LeaveType], [StartDate], [EndDate], [Days], [Status]. Yazan: Hr_S_LeaveNotify

8. Akış örneği

  1. İK Ayarlar › İnsan Kaynakları › İzin'de Cumartesi'yi çalışma günü yapar (gerekirse); eski çalışanlar için İzin Bakiyeleri › Bakiye Düzeltmeleri'ne sistem öncesi kullanılan günleri eksi olarak girer.
  2. Muhasebe Şefi panodaki İzinlerim widget'ında kalan 18 günü görür, İzin Talebi Oluştur ile 3 günlük yıllık izin açar.
  3. Gün kayıtta 3 hesaplanır, talep Müdür Onayı'na düşer, Muhasebe Müdürü bildirim alır.
  4. Müdür Ekibimin İzinleri → Onay Bekleyenler'den talebi seçip Onayla der → talep İK Onayı'na geçer, İK onaycısı bildirim alır.
  5. İK İzin Talepleri'nde onaylar → Onaylandı; çalışan bildirim alır, bakiye 15'e iner.
  6. Çalışan rapor alır, Rapor türünde talep açıp raporu ekler → Sağlık Kartı › İstirahat Raporları'nda görünür; aynı onay akışından geçer.
  7. Sağlık birimi başka bir raporu doğrudan Sağlık Kartı'na girer → İzin Talepleri'nde onaylı Rapor talebi olarak görünür.

9. Sık sorulanlar

"Departman müdürü bulunamadı" hatası. Çalışanın kullanıcı kartında departman ve pozisyon dolu olmalı; departmanın en üst pozisyonunda (ya da üst pozisyonlarda) aktif bir kullanıcı bulunmalı (§5.3 adım 2). Üst pozisyonu olmayan çalışan (Genel Müdür) bu hatayı almaz; talebi doğrudan İK onayına gider.

Genel Müdür'ün talebini kim onaylar? Müdür adımı atlanır, yalnız İK onaylar (§2.3 karar 9).

Gün sayısı beklenenden az. Hafta sonu, ayarlarda kapalı gün ve Çalışma Takvimi tatilleri sayılmaz; arife 0,5 sayılır.

Bakiye çok yüksek görünüyor. Devirli hesap kıdem başlangıcından bugüne bütün yılları sayar; sistem öncesi kullanılan izin Bakiye Düzeltmeleri'ne eksi olarak girilmelidir.

Bakiyem/İzinlerim'de kıdem uyarısı. Kullanıcı kartında Kıdem Başlangıç ya da İşe Giriş tarihi yok.

Talebimi değiştiremiyorum. Müdür karar verdikten sonra çalışan değiştiremez/silemez (51101); İK ile görüşülür.

Müdür Onayla butonunu görmüyor. Rolünde App.Hr.TeamLeaveRequest.Update olmalı; talep Müdür Onayı'nda ve kullanıcı o departmanın müdürü olmalı.

İK onaycısı nasıl değişir? İzin Talepleri › ListForm › Workflow › "İK Onayı" düğümü. Ekibimin İzin Talepleri'ndeki aynı düğüm akışı ilerletir; onaycı kayda İzin Talepleri düğümünden yazılır.

Bildirim gelmiyor. Kiracıda IzinTalebiOnayBekliyor / IzinTalebiSonuclandi tipi ve Custom kuralları olmalı (yeni kiracıya kopyalanır, mevcut kiracıda Administration › Bildirimler'den eklenir).

Kullanıcı detayındaki İstirahatler'den girilen rapor izinlere düşmüyor. O ekranın kancaları C# seeder'dadır (ListFormSeeder_Administration); daha önce kurulmuş bir veritabanında ekran yeniden kurulmadıkça kanca yoktur. Sağlık Kartı ekranı wizard'dır ve migrate ile güncellenir.


10. Dosyalar ve geri alma

Dosya İçerik
configs/seeds/sql/object/Hr_T_LeaveRequest.sql, Hr_T_LeaveBalanceAdjustment.sql, Hr_T_LeaveType.sql (BalanceExceedAction) Tablolar
…/Hr_F_HrSetting.sql, Hr_F_LeaveWorkDays.sql Ayar okuma, gün sayısı
…/Hr_V_LeaveBalanceYear.sql, Hr_V_LeaveSummary.sql Bakiye görünümleri
…/Hr_S_LeaveRequestAfterSave.sql, Hr_S_LeaveRequestGuard.sql, Hr_S_LeaveNotify.sql, Hr_S_LeaveSickLeaveSync.sql Prosedürler
configs/seeds/wizard/{LeaveRequest,MyLeaveRequest,TeamLeaveRequest,LeaveBalance,LeaveBalanceAdjustment,LeaveBalanceYear,MyLeaveBalance}.json 7 wizard; LeaveType.json (alan), HealthCardSickLeave.json (kancalar)
configs/seeds/data/App.DeveloperKit.CustomComponents/{23744edc-eda9-512e-8079-fe2e8e5fd2a8,3b7b16c6-aa96-5765-8e19-fe5e727feb52}.json MyLeaveWidget, TeamLeaveWidget
configs/seeds/data/App.DeveloperKit.IntranetWidgets.json, App.SettingDefinitions.json, App.Notifications.Notification{Types,Rules}.json, App.Menus.Menu.json, Abp.Identity.Permissions.json, App.Languages.LanguageText.json, App.Hr.LeaveType.json Seed satırları
api/src/Sozsoft.Platform.Application/ListForms/ListFormWorkflowAppService.cs @Kolon onaycı
api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs Kullanıcı detayı istirahat kancaları
ui/src/views/admin/listForm/workflow/WorkflowCriteria.tsx Tasarımcıda alan onaycısı seçeneği
ui/src/views/admin/user-management/LeaveTab.tsx, Details.tsx İzinler sekmesi

Kurulum: DB Migrate (SQL nesneleri, ekranlar WizardDataSeeder, satırlar ListFormSeedDataApplier), ardından rollere yetki (§6). Ayar tanımları uygulama yeniden başlayınca ayar ekranında görünür.

Geri alma: Wizard Manager'dan 7 wizard silinir (alt formlar önce); tabloları düşürmek onayda seçilirse olur. Widget bileşenleri ve pano kayıtları, bildirim tip/kural satırları, ayar tanımları, Hr_F_*/Hr_V_*/Hr_S_Leave* nesneleri elle kaldırılır. BalanceExceedAction kolonu kalır (kayıpsız ekleme geri alınmaz).

Ek — Ekran envanteri (otomatik)

Wizard dosyalarından üretilir; deploy, silme, tasarımcı kaydı ve import'ta yenilenir. Elle düzenleme bir sonraki yenilemede kaybolur.

İzin Talepleri — App.Hr.LeaveRequest

Özellik Değer
Wizard wizard/LeaveRequest.json
Yol Liste (Wizard)
Menü App.Hr.Leave › App.Hr.LeaveRequest (sıra 1)
Yetki App.Hr.LeaveRequest + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama İzin Talepleri — kurumdaki bütün izin talepleri ve onay durumları. Yalnız İnsan Kaynakları kullanır.
Kaynak Hr_T_LeaveRequest · 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.Hr.Leave.Widget.ManagerApproval, App.Hr.Leave.Widget.HrApproval, App.Hr.Leave.Widget.Approved, App.Hr.Leave.Widget.Rejected
Komutlar InsertAfter: Hr_S_LeaveRequestAfterSave · UpdateBefore: Hr_S_LeaveRequestGuard · UpdateAfter: Hr_S_LeaveRequestAfterSave · DeleteBefore: Hr_S_LeaveRequestGuard · DeleteAfter: Hr_S_LeaveRequestAfterSave
Form varsayılanları IsHalfDay=false, StartDate=@DATE, EndDate=@DATE
Onay akışı Start 'Onaya Gönderildi' → Compare 'Müdür Onayı Gerekli mi?' → Approval 'Müdür Onayı' → Approval 'İK Onayı' → End 'Onaylandı' → End 'Reddedildi'
Alan Başlık Editör Zorunlu Formda Kaynak
RequestNo Talep No dxTextBox ✓
EmployeeId Çalışan dxSelectBox ✓ ✓ sorgu: AbpUsers · script
DepartmentId Departman dxSelectBox ✓ sorgu: Hr_T_Department
JobPositionId İş Pozisyonu dxSelectBox ✓ sorgu: Hr_T_JobPosition
LeaveTypeId İzin Türü dxSelectBox ✓ ✓ sorgu: Hr_T_LeaveType
StartDate Başlangıç Tarihi dxDateBox ✓ ✓ script
EndDate Bitiş Tarihi dxDateBox ✓ ✓ script
IsHalfDay Yarım Gün dxCheckBox ✓ script
HalfDayPart Yarım Gün Dilimi dxSelectBox ✓ liste: Morning, Afternoon
Days Gün dxNumberBox ✓
BalanceWarning Bakiye Uyarısı dxTextBox ✓
ManagerUserNames Departman Müdürleri dxTextBox
RequiresManagerApproval Müdür Onayı Gerekli dxNumberBox
Description Açıklama dxTextArea ✓
DocumentFileName Belge Adı dxTextBox ✓
DocumentContent Belge (rapor vb.) dxImageUpload ✓
ApprovalStatus Onay Durumu dxTextBox ✓
ApprovalUser Onaylayan dxTextBox ✓
ApprovalDate Onay Tarihi dxDateBox ✓
ApprovalDescription Onay Açıklaması dxTextBox ✓

İzin Bakiyeleri — App.Hr.LeaveBalance

Özellik Değer
Wizard wizard/LeaveBalance.json
Yol Liste (Wizard)
Menü App.Hr.Leave › App.Hr.LeaveBalance (sıra 2)
Yetki App.Hr.LeaveBalance + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama İzin Bakiyeleri — her çalışanın yıllık izin bakiyesi.
Kaynak Hr_V_LeaveSummary
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✗ · düzenle ✗ · sil ✗ · popup
Kapsam Kiracı
Alt formlar App.Hr.LeaveBalanceAdjustment (Id → EmployeeId), App.Hr.LeaveBalanceYear (Id → EmployeeId)
Widget'lar App.Widget.Total, App.Hr.Leave.Widget.RemainingDays, App.Hr.Leave.Widget.NegativeBalance, App.Hr.Leave.Widget.PendingDays
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeName Çalışan Adı dxTextBox ✓
DepartmentId Departman dxSelectBox ✓ sorgu: Hr_T_Department
JobPositionId İş Pozisyonu dxSelectBox ✓ sorgu: Hr_T_JobPosition
SeniorityStartDate Kıdem Başlangıcı dxDateBox ✓
ServiceYears Kıdem Yılı dxNumberBox ✓
EntitledDays Hak Edilen Gün dxNumberBox ✓
AdjustmentDays Düzeltme Günü dxNumberBox ✓
UsedDays Kullanılan Gün dxNumberBox ✓
PendingDays Onay Bekleyen Gün dxNumberBox ✓
RemainingDays Kalan Gün dxNumberBox ✓
AvailableDays Kullanılabilir Gün dxNumberBox ✓
NextAccrualDate Sonraki Hak Ediş dxDateBox ✓
NextAccrualDays Sonraki Hak Ediş Günü dxNumberBox ✓
IsActive Aktif dxCheckBox ✓

Bakiye Düzeltmeleri — App.Hr.LeaveBalanceAdjustment

Özellik Değer
Wizard wizard/LeaveBalanceAdjustment.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.LeaveBalanceAdjustment + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Bakiye Düzeltmeleri — çalışanın yıllık izin bakiyesine elle yapılan ekleme ve düşümler.
Kaynak Hr_T_LeaveBalanceAdjustment · filtre "IsDeleted" = 'false'
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✓ · düzenle ✓ · sil ✓ · popup
Kapsam Kiracı
Form varsayılanları IsActive=true, AdjustmentDate=@DATE
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
AdjustmentDate Düzeltme Tarihi dxDateBox ✓ ✓
Days Gün dxNumberBox ✓ ✓
IsActive Aktif dxCheckBox ✓
Reason Neden dxTextArea ✓ ✓

İzin Defteri — App.Hr.LeaveBalanceYear

Özellik Değer
Wizard wizard/LeaveBalanceYear.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.LeaveBalanceYear + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama İzin Defteri — çalışanın yıllık izninin yıl yıl dökümü.
Kaynak Hr_V_LeaveBalanceYear
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
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
YearNo Hizmet Yılı dxNumberBox ✓
AccrualDate Hak Ediş Tarihi dxDateBox ✓
PeriodEndDate Dönem Sonu dxDateBox ✓
EntitledDays Hak Edilen Gün dxNumberBox ✓
UsedDays Kullanılan Gün dxNumberBox ✓
PendingDays Onay Bekleyen Gün dxNumberBox ✓
RemainingDays Kalan Gün dxNumberBox ✓
CumulativeRemainingDays Kümülatif Bakiye dxNumberBox ✓
NextAccrualDate Sonraki Hak Ediş dxDateBox ✓
NextAccrualDays Sonraki Hak Ediş Günü dxNumberBox ✓

İzin Taleplerim — App.Hr.MyLeaveRequest

Özellik Değer
Wizard wizard/MyLeaveRequest.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.MyLeaveRequest + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama İzin Taleplerim — oturum açan çalışanın kendi izin talepleri ve onay durumları.
Kaynak Hr_T_LeaveRequest · filtre "IsDeleted" = 'false' AND "EmployeeId" = '@USERID'
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✓ · düzenle ✓ · sil ✓ · popup
Kapsam Kiracı
Komutlar InsertAfter: Hr_S_LeaveRequestAfterSave · UpdateBefore: Hr_S_LeaveRequestGuard · UpdateAfter: Hr_S_LeaveRequestAfterSave · DeleteBefore: Hr_S_LeaveRequestGuard · DeleteAfter: Hr_S_LeaveRequestAfterSave
Form varsayılanları IsHalfDay=false, StartDate=@DATE, EndDate=@DATE
Alan Başlık Editör Zorunlu Formda Kaynak
RequestNo Talep No dxTextBox ✓
LeaveTypeId İzin Türü dxSelectBox ✓ ✓ sorgu: Hr_T_LeaveType
StartDate Başlangıç Tarihi dxDateBox ✓ ✓ script
EndDate Bitiş Tarihi dxDateBox ✓ ✓ script
IsHalfDay Yarım Gün dxCheckBox ✓ script
HalfDayPart Yarım Gün Dilimi dxSelectBox ✓ liste: Morning, Afternoon
Days Gün dxNumberBox ✓
BalanceWarning Bakiye Uyarısı dxTextBox ✓
Description Açıklama dxTextArea ✓
DocumentFileName Belge Adı dxTextBox ✓
DocumentContent Belge (rapor vb.) dxImageUpload ✓
ApprovalStatus Onay Durumu dxTextBox ✓
ApprovalUser Onaylayan dxTextBox ✓
ApprovalDate Onay Tarihi dxDateBox ✓
ApprovalDescription Onay Açıklaması dxTextBox ✓

Ekibimin İzin Talepleri — App.Hr.TeamLeaveRequest

Özellik Değer
Wizard wizard/TeamLeaveRequest.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.TeamLeaveRequest + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Ekibimin İzin Talepleri — müdürü olduğunuz departmandaki çalışanların izin talepleri.
Kaynak Hr_T_LeaveRequest · filtre "IsDeleted" = 'false' AND '|' + "ManagerIds" + '|' LIKE '%|@USERID|%'
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✗ · düzenle ✗ · sil ✗ · popup
Kapsam Kiracı
Komutlar UpdateBefore: Hr_S_LeaveRequestGuard · UpdateAfter: Hr_S_LeaveRequestAfterSave
Onay akışı Start 'Onaya Gönderildi' → Approval 'Müdür Onayı' → Approval 'İK Onayı' → End 'Onaylandı' → End 'Reddedildi'
Alan Başlık Editör Zorunlu Formda Kaynak
RequestNo Talep No dxTextBox ✓
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
DepartmentId Departman dxSelectBox ✓ sorgu: Hr_T_Department
JobPositionId İş Pozisyonu dxSelectBox ✓ sorgu: Hr_T_JobPosition
LeaveTypeId İzin Türü dxSelectBox ✓ sorgu: Hr_T_LeaveType
StartDate Başlangıç Tarihi dxDateBox ✓
EndDate Bitiş Tarihi dxDateBox ✓
IsHalfDay Yarım Gün dxCheckBox ✓
HalfDayPart Yarım Gün Dilimi dxSelectBox ✓ liste: Morning, Afternoon
Days Gün dxNumberBox ✓
BalanceWarning Bakiye Uyarısı dxTextBox ✓
ManagerUserNames Departman Müdürleri dxTextBox
Description Açıklama dxTextArea ✓
DocumentFileName Belge Adı dxTextBox ✓
DocumentContent Belge (rapor vb.) dxImageUpload ✓
ApprovalStatus Onay Durumu dxTextBox ✓
ApprovalUser Onaylayan dxTextBox ✓
ApprovalDate Onay Tarihi dxDateBox ✓
ApprovalDescription Onay Açıklaması dxTextArea ✓

Bakiyem — App.Hr.MyLeaveBalance

Özellik Değer
Wizard wizard/MyLeaveBalance.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.MyLeaveBalance + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Bakiyem — yıllık izin hakkınızın ve kullanımınızın yıl yıl dökümü.
Kaynak Hr_V_LeaveBalanceYear · filtre "EmployeeId" = '@USERID'
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
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
YearNo Hizmet Yılı dxNumberBox ✓
AccrualDate Hak Ediş Tarihi dxDateBox ✓
PeriodEndDate Dönem Sonu dxDateBox ✓
EntitledDays Hak Edilen Gün dxNumberBox ✓
UsedDays Kullanılan Gün dxNumberBox ✓
PendingDays Onay Bekleyen Gün dxNumberBox ✓
RemainingDays Kalan Gün dxNumberBox ✓
CumulativeRemainingDays Kümülatif Bakiye dxNumberBox ✓
NextAccrualDate Sonraki Hak Ediş dxDateBox ✓
NextAccrualDays Sonraki Hak Ediş Günü dxNumberBox ✓