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

40 KiB
Raw Blame History

İK › Puantaj ve Devam Takibi (App.Hr.Attendance)

Günlük giriş/çıkış hareketlerinden (PDKS, Excel aktarımı, elle giriş) çalışan × gün puantajı; personel bazlı aylık puantaj, dönem kapanışı ve PDKS'nin hareket gönderdiği uç. Kişi eşlemesi kullanıcı kartındaki PDKS Kart No / Sicil No alanlarıyladır. İzin Yönetimi (onaylı izin → İzinli), Sağlık Kartı (istirahat → Raporlu), Çalışma Takvimi (resmî tatil / arife) ve Vardiyalar (saat, mola, tolerans) puantajın girdisidir. Çalışan kendi puantajını Intranet › Dashboard'daki Puantajım widget'ından izler; İK menüsü İK içindir. Wizard ekranları, SQL nesneleri, custom component widget'ı, Custom Endpoint ve zamanlanmış işle kuruludur. Çerçeve dışında tek ek vardır (kullanıcı onayıyla): kullanıcı detayındaki Puantaj 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 Seçtiği ayın net saatini, geç kalma/erken çıkış dakikasını, fazla mesaisini, devamsız/izinli/raporlu günlerini ve yıllık toplamı (270 saatlik fazla mesai sınırıyla) görür Intranet panosu: Puantajım widget'ı → Puantajım (aylar) → ayın günleri · Profil › Puantajım (aylık puantaj salt okunur)
İK Hareketleri izler/düzeltir, elle takip edilen çalışanın gelmediği günü işaretler, aylık puantajı izler, ayı yeniden hesaplar ve kapatır, çalışanın PDKS Kart No'sunu kullanıcı kartına (İş sekmesi) girer, toleransı ve fazla mesai kurallarını ayarlar İK › Puantaj ve Devam Takibi · Ayarlar › İnsan Kaynakları › Puantaj · Kullanıcı detayı › Puantaj
PDKS (servis kullanıcısı) Kart okutmalarını toplu gönderir POST /api/app/custom-endpoint/hr/attendance/

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


2. Analiz ve kararlar

2.1 Talep

Human Resources → Puantaj ve Devam Takibi modülü: günlük hareketler, personel bazlı aylık puantaj. Intranet › Dashboard'da aylık puantajıma ulaşabileceğim, ilgili ayın durumunu ve yıllık toplamı gösteren widget (sol kolon, anket tarafı). Kolonlar: ilk giriş, son çıkış, net çalışma süresi, mola düşümü, geç kalma (dk), erken çıkış (dk), fazla mesai (saat), gün tipi (çalışma, hafta tatili, resmî tatil, izinli, raporlu, devamsız). Tolerans vardiya bazında (ör. 10 dk), ayarlardan dinamik. Haftalık 45 saati aşan çalışma fazla mesaidir, ücreti %50 zamlıdır (4857 md. 41), yıllık üst sınır 270 saat; ayarlardan yönetilir. Veri elle yazılabilir ya da PDKS'den akabilir. Kullanıcı detayında İzinler gibi bir Puantaj sekmesi. Diğer modüllerle core koda dokunmadan entegre olmalı.

2.2 Depodan okunanlar (sorulmadı)

  • Vardiya Hr_T_Shift (StartTime/EndTime SS:dd metin, BreakMinutes, WorkingHours, gece vardiyası); çalışanın vardiyası AbpUsers.ShiftId.
  • Tatiller Hr_T_WorkCalendar (Holiday / HalfDay, FREQ=YEARLY); hafta tatili İzin Yönetimi'nin App.HrSettings.Leave.Work{Gün} ayarları.
  • Onaylı izin Hr_T_LeaveRequest.ApprovalStatus = 'Onaylandı'; rapor Adm_T_UserSickLeave.
  • İstihdam AbpUsers.HireDate / TerminationDate; departman/pozisyon DepartmentId / JobPositionId.
  • Kullanıcı kartında (İş sekmesi) PDKS Kart No (AbpUsers.PdksCardNo) ve Sicil No (RegistrationNo) alanları var; ayrı kart tablosu açılmadı.
  • Zamanlanmış işin saklı yordamı parametresiz çağrılır (PlatformBackgroundWorker); Custom Endpoint gövdesindeki dizi ham JSON metni olarak bağlanır.

2.3 Keşif turu cevapları

# Soru Seçilen
1 Veri modeli Ham hareket (Hr_T_AttendanceLog) + hesaplanan gün (Hr_T_Timesheet); İK günü elle düzeltebilir, düzeltilen gün yeniden hesapta ezilmez
2 Tolerans yeri Vardiyada (LateToleranceMinutes, EarlyLeaveToleranceMinutes), boşsa Ayarlar › Puantaj (10 dk)
3 Geç kalma dakikası Tolerans aşılırsa dakikanın tamamı yazılır, aşılmazsa 0
4 Fazla mesai Haftalık (Pzt–Paz) birikim 45 saati aştığı günden itibaren aşan kısım o günlere; hafta tatili ve resmî tatildeki çalışmanın tamamı; yıllık 270 saati aşan satır işaretlenir (engellemez)
5 PDKS Excel import + API ucu (Custom Endpoint); kişi eşlemesi kullanıcı kartındaki PDKS Kart No, Sicil No ya da kullanıcı adıyla
6 Mola MAX(vardiya molası, gün içi okutulan çıkış→giriş aralıkları)
7 Hesap zamanı Hareket kaydında (o hafta) + gece işi (okutmasız günler) + dönem kaydı (ay)
8 Kapanış İK ayı kilitler, onay akışı yok; müdür ekranı/widget'ı yok
9 Kullanıcı detayı sekmesi Core istisnası onaylandı (Details.tsx + TimesheetTab.tsx, İzinler sekmesi emsali)
10 Elle takip (üretim sırasında) Elle takipte yalnız gelinmeyen gün yazılır; yazılmayan iş günü "geldi" kabul edilir

2.4 Üretimde verilen kararlar

Konu Karar Neden
Takip türü Çalışan bazında otomatik: kullanıcı kartında PDKS Kart No'su olan çalışan ilk PDKS/aktarım okutmasının gününden itibaren okutmayla takip edilir (okutmasız iş günü Devamsız); diğerleri elle takip edilir (kayıtsız iş günü vardiya saatleriyle IsAssumed). Elle girilen hareket takip türünü değiştirmez Ayrı bir ayar gerektirmez; kartın sonradan verilmesi geçmiş günleri devamsıza çevirmez
Gün sınırı Hareketin iş günü vardiya bitişi ile bir sonraki başlangıç arasındaki boşluğun ortasından ayrılır (Hr_V_AttendanceShift.DayOffset) Gece vardiyasının 23:50 okutması vardiyanın başladığı ertesi güne yazılır
Okutma yönü In / Out / Auto; Auto sıraya göre giriş/çıkış sayılır PDKS'lerin çoğu yön göndermez
Elle düzeltme Günlük Puantaj'da kaydedilen gün IsManual = 1 olur; otomatiğe dönmek için satır silinir (yeniden hesap aynı günü kurar) Ekrandan "elle mi" bilgisini ayrıca istemeden yeniden hesabın düzeltmeyi ezmesini önler
Kapalı dönem Hesap kapalı ayın günlerini yazmaz, yalnız haftalık birikime alır; ekrandan gelen hareket/gün değişikliği THROW ile geri alınır; PDKS/gece işi okutmayı ClosedPeriod hatasıyla işaretler PDKS gönderimi tek bir eski okutma yüzünden durmasın
Kurulum sırası Vardiya çözümü view'dadır (Hr_V_AttendanceShift) SQL nesneleri dosya adına göre kurulur; Hr_F_* fonksiyonları Hr_T_* tablolarından önce oluşur
Gece işi kapsamı Scope = Host ve Kiracılar; prosedür veritabanındaki bütün kiracıları işler ve aynı gün işlenen kiracıyı dönemin NightlyAt değeriyle atlar Saklı yordam kiracı parametresi almaz
İzin entegrasyonu Hr_S_LeaveRequestAfterSave ve Hr_S_LeaveSickLeaveSync sonunda talebin/raporun günleri yeniden hesaplanır Onaylı izin ve rapor anında puantaja düşer; çekirdek koda dokunulmaz
Aylık özet anahtarı PeriodKey = {EmployeeId}-{YYYYMM} hem view'ın Id'si hem günlük satırın kolonudur Alt form ilişkisi tek alanla kurulur
Widget sınıfları Bileşen sınıfları className literalleriyle yazılır, koşullu kısım dizge birleştirmeyle eklenir Safelist üreteci şablon dizgisindeki ifadeyi sınıf sanır

2.5 Varsayılan kalanlar

  • Varsayılan vardiya 08:00–18:00, mola 60 dk (vardiyası olmayan çalışan için, ayarlarda değişir).
  • İzinli/raporlu gün haftalık 45 saat birikimine 0 katkı verir; o gün okutma varsa net süre birikime girer.
  • Yarım gün izinli günde geç/erken yazılmaz; arifede (HalfDay) vardiya süresinin yarısında biter.
  • Yalnız giriş okutması olan gün IsIncomplete (Eksik Okutma) işaretlenir, net süre 0'dır.

3. Menü ve ekranlar

3.1 İK menüsü

İnsan Kaynakları › Puantaj ve Devam Takibi (App.Hr.Attendance, sıra 15, FcAlarmClock) — yalnız İK.

Sıra Menü (TR / EN) ListFormCode Kaynak Alt formlar Widget'lar
1 Günlük Hareketler / Attendance Events App.Hr.AttendanceLog Hr_T_AttendanceLog — Bugün · PDKS (bu ay) · Manuel (bu ay) · Hatalı
2 Günlük Puantaj / Daily Timesheet App.Hr.Timesheet Hr_T_Timesheet — Devamsız gün · Geç kalınan gün · Fazla mesai saati · Eksik okutma (bu ay)
3 Aylık Puantaj / Monthly Timesheet App.Hr.TimesheetMonthly Hr_V_TimesheetMonthly (salt okunur) App.Hr.Timesheet (Id → PeriodKey) Çalışan · Fazla mesai · Devamsız gün (bu ay) · Yıllık sınırı aşan
4 Puantaj Dönemleri / Timesheet Periods App.Hr.TimesheetPeriod Hr_T_TimesheetPeriod — Açık · Kapalı · Toplam

Görünümler: hepsi Grid, Card, Pivot, Chart. Günlük Puantaj'da ekleme yoktur (günleri hesap kurar). Koşullu biçim: gün tipi (Devamsız kırmızı, Raporlu mor, İzinli mavi, tatiller gri), geç/erken/fazla mesai > 0, hareket hatası, aylık satırda yıllık sınırın aşılması (satır).

3.2 Çalışana ait ekranlar (menüsüz)

Ekran ListFormCode Satır süzmesi Yapılabilen
Puantajım App.Hr.MyTimesheet EmployeeId = @USERID (Hr_V_TimesheetMonthly) Ayları görür; detayda ayın günleri
Puantaj Günlerim App.Hr.MyTimesheetDay EmployeeId = @USERID (Hr_T_Timesheet) Puantajım'ın sekmesi (Id → PeriodKey), salt okunur

3.3 Intranet › Dashboard widget'ı

Sol kolon (Column: 0), İzinlerim'in (35/36) altında; kayıt data/App.DeveloperKit.IntranetWidgets.json.

Code · sıra Bileşen PermissionName Gösterir Buton
my-timesheet · 37 MyTimesheetWidget App.Hr.MyTimesheet Ay seçici (varsayılan içinde bulunulan ay); net saat, çalışılan gün, fazla mesai, geç kalma dk, erken çıkış dk, devamsız gün; izinli/raporlu/tatil günü; yıl toplamı (net saat, geç kalma, devamsız) ve fazla mesai / yıllık sınır çubuğu Puantajım

Bileşen code modunda, rotasızdır; veriyi Puantajım ekranının sorgusundan okur (GET /api/app/list-form-select/select).

3.4 Kullanıcı detayı › Puantaj

ui/src/views/admin/user-management/TimesheetTab.tsx: içinde bulunulan yılın sekiz kartı (çalışma günü, net saat, fazla mesai — yıllık sınırı aşınca kırmızı —, geç kalma, erken çıkış, devamsız, izinli, raporlu), altında kullanıcıya süzülmüş Aylık Puantaj, Günlük Puantaj ve Günlük Hareketler listeleri. Her parça kendi ekran yetkisiyle görünür; yeni hareket satırının EmployeeId'si süzgeçten dolar.

3.5 Ayarlar

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

Kod Varsayılan Kullanım
App.HrSettings.Attendance.LateToleranceMinutes 10 Vardiyada tolerans yoksa
App.HrSettings.Attendance.EarlyLeaveToleranceMinutes 10 Vardiyada tolerans yoksa
App.HrSettings.Attendance.WeeklyLimitHours 45 Haftalık fazla mesai sınırı
App.HrSettings.Attendance.OvertimeRate 1.5 Zamlı fazla mesai saati çarpanı (Aylık Puantaj)
App.HrSettings.Attendance.AnnualOvertimeLimitHours 270 Yıllık sınır (işaret, widget çubuğu)
App.HrSettings.Attendance.DefaultShiftStart / DefaultShiftEnd 08:00 / 18:00 Vardiyası olmayan çalışan
App.HrSettings.Attendance.DefaultBreakMinutes 60 Vardiyası (ya da vardiya molası) olmayan çalışan

Hafta tatili İzin Yönetimi'nin çalışma günü ayarlarından (App.HrSettings.Leave.Work{Gün}) okunur.


4. Veri modeli

Tablo / nesne Kolonlar Not
AbpUsers (mevcut) PdksCardNo, RegistrationNo, ShiftId, HireDate, TerminationDate Kişi eşlemesi, vardiya, istihdam aralığı
Hr_T_AttendanceLog EmployeeId (boş olabilir), CardNo, EventTime (yerel saat), Direction (In/Out/Auto), Source (Manual/Pdks/Import), DeviceCode, Note, WorkDate (hesaplanır), IsProcessed, ProcessError (UnknownCard/ClosedPeriod) IsProcessed = 0 satırları işlenmeyi bekler
Hr_T_Timesheet EmployeeId, WorkDate, PeriodYear, PeriodMonth, PeriodKey, ShiftId, DayType (Work/WeeklyOff/Holiday/Leave/Sick/Training/Absent), LeaveTypeId (izinli/raporlu günün türü), TrainingId (eğitim günü), FirstIn, LastOut, BreakMinutes, NetMinutes, NetHours, LateMinutes, EarlyLeaveMinutes, OvertimeHours, IsManual, IsIncomplete, IsAssumed, Note, CalculatedAt Çalışan × gün tek etkin satır
Hr_T_TimesheetPeriod PeriodYear, PeriodMonth, Status (Open/Closed), CalculatedAt, ClosedAt, ClosedById, NightlyAt, Note Kiracıda yıl+ay tekil (prosedür denetler)
Hr_T_Shift (+) LateToleranceMinutes, EarlyLeaveToleranceMinutes Vardiyalar ekranında düzenlenir
Hr_V_AttendanceShift Çalışanın dakika cinsinden vardiyası, mola, toleranslar, DayOffset Varsayılanlar ayardan
Hr_V_TimesheetMonthly Çalışan × ay toplamları, UnpaidLeaveDays (ücretsiz türdeki izinli gün — bordroda eksik gün), TrainingDays, OvertimePaidHours, YearOvertimeHours, AnnualOvertimeLimit, IsOverAnnualLimit, PeriodStatus Id = PeriodKey

Entity yoktur (wizard tabloları); sql/object/.


5. İş kuralları ve hesaplar

5.1 Prosedürler

Nesne Ne yapar Çağıran
Hr_S_TimesheetCalculate @TenantId, @EmployeeId, @From, @To, @ActorId Aralığı tam haftalara genişletip (bugünle sınırlı) çalışan × gün satırlarını kurar/günceller; kapalı ayı yazmaz Aşağıdakilerin hepsi, izin ve rapor prosedürleri
Hr_S_AttendanceProcess @FailOnClosed İşlenmemiş hareketlerde kart → çalışan, iş günü, hata; etkilenen günleri (eski + yeni) yeniden hesaplar Günlük Hareketler kayıt/silme, PDKS ucu, gece işi
Hr_S_AttendanceImport @TenantId, @UserId, @Items PDKS gönderimini (CardNo, RegistrationNo ya da UserName; EventTime, Direction, DeviceCode) yazar, tekrarı atlar; Received/Inserted/Skipped/Errors döner Custom Endpoint
Hr_S_TimesheetPeriodAfterSave @PeriodId, @ActorId Yıl/ay doğrulama ve tekillik; açık dönemde ayı yeniden hesaplar; kapatmada son hesap + kilit Puantaj Dönemleri kayıt
Hr_S_TimesheetNightly Kart numarası sonradan girilen "Kart tanımsız" okutmaları yeniden kuyruğa alır ve işler; her kiracı için ayın dönemini açar, dünün ayını ve kapanmamışsa önceki ayı hesaplar Zamanlanmış iş Timesheet Nightly (02:00)
Hr_F_WorkCalendarDayType @TenantId, @Day Güne düşen Holiday / HalfDay Hesap
Hr_F_TimesheetPeriodClosed @TenantId, @From, @To Aralığın değdiği aylardan biri kapalı dönem mi İzin, rapor ve izin guard prosedürleri
Hr_S_TrainingSync @TrainingId, @UserId, @ActorId Katılımcının (boşsa bütün katılımcıların) eğitim günlerini yeniden hesaplar, bağlı gelişim aksiyonunu tamamlar Eğitimler ve Katılımcılar kayıt/silme
Hr_S_WorkCalendarAfterSave @CalendarId, @ActorId Takvim satırına denk gelen izinlerin gün sayısını ve puantajı yeniden hesaplar Çalışma Takvimi kayıt/silme

5.2 Günün hesabı

  1. Gün tipi (öncelik sırasıyla):

    1. rapor (Sağlık Kartı istirahati; takvim günü, hafta sonu dahil) → Sick;
    2. onaylı ücretsiz izin (LeaveType.IsPaid = 0: ücretsiz izin, doğum izni; takvim günü) → Leave;
    3. takvim tatili → Holiday; ayarda çalışma günü değil → WeeklyOff;
    4. onaylı ücretli izin → Leave (ücretli izne denk gelen tatil izin günü değildir, 4857 md. 56 — izin gün sayısıyla aynı kural); yarım gün izinde okutma varsa Work;
    5. okutma var → Work;
    6. eğitime "Katıldı" işaretli katılımcı → Training (vardiya saatleriyle, IsAssumed);
    7. elle takip edilen çalışan → Work (IsAssumed, vardiya saatleri); geçmiş gün → Absent; kartlı çalışanın okutmasız bugünü yazılmaz.

    İzinli/raporlu günde LeaveTypeId, eğitim gününde TrainingId yazılır. İstihdam dışındaki okutmasız gün yazılmaz.

  2. İlk giriş / son çıkış: ilk In (yoksa ilk okutma) / son Out (ilk girişten sonraysa).

  3. Mola = MAX(vardiya molası, ilk giriş–son çıkış arasındaki çıkış→giriş aralıkları), brüt süreyi aşamaz; elle düzeltilen günde girilen mola.

  4. Net = son çıkış − ilk giriş − mola.

  5. Geç kalma = ilk giriş − vardiya başlangıcı, tolerans aşılırsa tamamı; erken çıkış = vardiya bitişi (arifede yarı süre) − son çıkış, tolerans aşılırsa tamamı. Yalnız Work gününde; eğitim günü haftalık birikime çalışma gibi girer.

  6. Fazla mesai = WeeklyOff/Holiday gününde net sürenin tamamı; diğer günlerde haftanın kümülatif netinin sınırı aştığı kısım (max(0, kümülatif − sınır) − max(0, önceki kümülatif − sınır)).

  7. Kaynağı kalkan gün: tek çalışanlık hesap, artık hiçbir izin/rapor/katılımla örtüşmeyen Leave/Sick/Training günlerini (talebin tarihi değişti, rapor ya da katılım silindi) aralığa katar; eski günler aynı işlemde düzelir.

  8. Aylık view: OvertimePaidHours = OvertimeHours × OvertimeRate; YearOvertimeHours ocaktan o aya birikim; IsOverAnnualLimit sınır aşımı.

5.3 Ekran komutları

Ekran Komut
Günlük Hareketler Ekle/düzenle/sil sonrası satır işlenmemiş işaretlenir → Hr_S_AttendanceProcess 1 (kapalı dönemde kayıt geri alınır)
Günlük Puantaj Düzenle/sil öncesi kapalı dönem kontrolü; düzenleme sonrası IsManual = 1, IsAssumed = 0 ve günün haftası yeniden hesaplanır; silme sonrası gün otomatik yeniden kurulur
Puantaj Dönemleri Kayıt sonrası Hr_S_TimesheetPeriodAfterSave; kapalı dönem silinemez; ayda onay bekleyen izin varsa kapatılamaz

Hata kodları: 51200 (kapalı döneme hareket), 51201 (kapalı dönemin günü), 51210 (PDKS gövdesi), 51220–51223 (dönem; 51223 onay bekleyen izin), 51118 (kapalı döneme izin), 51120 (kapalı döneme rapor).


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

İzin grubu App.Hr, modül Sas|Hr. Kök App.Hr.Attendance (sıra 9); dört ekran altında, her biri .Create/.Update/.Delete/.Export/.Import/.Note ile. App.Hr.MyTimesheet (sıra 10) kökte, App.Hr.MyTimesheetDay onun altında. Ayar yetkisi App.HrSettings.Attendance (App.Administration grubu, App.HrSettings altında). Hiçbir yetki role otomatik atanmaz.

Rol Yetkiler
Tüm çalışanlar App.Hr.MyTimesheet, App.Hr.MyTimesheetDay (widget ve Puantajım)
İK App.Hr.Attendance dalının tamamı, App.HrSettings.Attendance
PDKS servis kullanıcısı PDKS rolü + App.DeveloperKit.CustomEndpoints.Post

7. Entegrasyonlar

Modül Yön Nasıl
Kimlik › Kullanıcılar → puantaj PDKS Kart No / Sicil No kişi eşlemesi, vardiya, işe giriş/çıkış; kart numarası değişikliği gece işinde yansır
İzin Yönetimi → puantaj Hr_S_LeaveRequestAfterSave (kayıt, karar, silme) sonunda talebin günleri — tarihi değiştiyse eski günleri de — yeniden hesaplanır; onaylı izin Leave
Sağlık Kartı › İstirahatler ↔ izin, → puantaj Hr_S_LeaveSickLeaveSync (kayıt, silme) raporu onaylı Rapor talebine eşler, rapora denk gelen izin günlerini bakiyeye döndürür (Hr_S_LeaveDaysRefresh), günleri yeniden hesaplar; rapor Sick
Eğitimler → puantaj Katıldı işaretli katılımcının eğitim günleri Training; eğitim/katılımcı kaydı Hr_S_TrainingSync ile hemen yansır
Çalışma Takvimi → izin, → puantaj Tatil Holiday, arife HalfDay (yarım vardiya); takvim kaydı denk gelen izinlerin gün sayısını ve puantajı hemen yeniler (Hr_S_WorkCalendarAfterSave)
Vardiyalar / kullanıcı vardiyası → puantaj Saat, mola, tolerans; değişiklik gece işinde ya da dönem kaydında yansır
İzin ayarları → puantaj Hafta tatili günleri
PDKS → hareket Custom Endpoint POST /api/app/custom-endpoint/hr/attendance/ (data/App.DeveloperKit.CustomEndpoints.json, PermissionsJson: rol PDKS)
Excel → hareket Günlük Hareketler import'u aynı kayıt yolundan (InsertAfterCommand) geçer; Source boş gelir ve Import yazılır
Intranet ← puantaj my-timesheet widget'ı
Kullanıcı detayı ← puantaj Puantaj sekmesi

7.1 Çakışma kuralları (modüller birbirine zıt sonuç vermez)

Durum Kural Nerede
Raporlu gün Devamsız yazılmaz; Sick her şeyin önündedir (okutma olsa da) Hr_S_TimesheetCalculate
Yıllık izin sırasında rapor Rapora denk gelen izin günü izinden sayılmaz, bakiyeye döner; puantajda Sick Hr_F_LeaveNetDays, Hr_S_LeaveDaysRefresh
Rapor talebi onay beklerken Sağlık kartına ve puantaja düşmez; onayla istirahat kaydı oluşur, redde kalkar Hr_S_LeaveRequestAfterSave
Ücretli izne denk gelen tatil Puantajda Holiday/WeeklyOff; izin gün sayısına girmez (4857 md. 56) hesap + Hr_F_LeaveWorkDays
Ücretsiz izin / doğum izni Hafta tatili ve genel tatil dahil Leave (ücret doğmaz); aylıkta UnpaidLeaveDays hesap + aylık view
Eğitime katılan Okutması yoksa devamsız değil Training; okutması varsa Work hesap
Kapalı puantaj ayı İzin talebi ve rapor eklenemez/değiştirilemez/silinemez (51118, 51120); onay bekleyen izni olan ay kapatılamaz (51223) guard + kayıt prosedürleri + dönem kaydı
İstihdam dışı İzin tarihleri işe giriş – işten çıkış arasında olmalı (51119); puantaj istihdam dışında gün yazmaz Hr_S_LeaveRequestAfterSave, hesap
Takvime sonradan girilen bayram Denk gelen izinlerin gün sayısı ve puantaj hemen yenilenir Hr_S_WorkCalendarAfterSave

PDKS gövdesi:

{ "Items": [ { "CardNo": "000123", "EventTime": "2026-10-05T08:02:00", "Direction": "In", "DeviceCode": "GATE-1" } ] }

Items dizi ya da JSON metni olabilir; CardNo yerine UserName gönderilebilir. Endpoint kaydı kiracıya aittir (CustomEndpoint IMultiTenant): seed satırı host'a kurulur, kiracıda Developer Kit › Custom Endpoints'ten aynı SQL ve parametrelerle eklenir.


8. Akış örneği

  1. İK üretim çalışanlarının kullanıcı kartına (İş sekmesi) PDKS Kart No girer; ofis çalışanlarında alan boştur (elle takip).
  2. PDKS her 5 dakikada okutmaları uca gönderir; Günlük Hareketler'e düşer, Günlük Puantaj o hafta için güncellenir. Tanımsız kart "Kart tanımsız" görünür; numara kullanıcı kartına girilince gece işi okutmayı işler.
  3. Gece 02:00'de iş dünü kurar: kartlı çalışanın okutmasız iş günü Devamsız, elle takip edilen çalışanın günü vardiya saatleriyle Varsayılan çalışma.
  4. Ofis çalışanı bir gün gelmez; İK Günlük Puantaj'da o günü Devamsız yapar (gün Elle olur).
  5. Ay sonunda İK Aylık Puantaj'ı kontrol eder, yıllık sınırı aşanları görür; Puantaj Dönemleri'nde ayı Kapalı yapar.
  6. Çalışan panodaki Puantajım'da ayını ve yıl toplamını görür, butonla aylarına ve günlerine iner.

9. Sık sorulanlar ve bilinen sınırlar

Okutması olmayan çalışan neden hep "geldi" görünüyor? Kullanıcı kartında PDKS Kart No yoksa (ya da henüz PDKS okutması gelmediyse) elle takip edilir; gelinmeyen gün Günlük Puantaj'da işaretlenir. İlk PDKS okutmasından itibaren okutmayla takip edilir.

Düzelttiğim gün neden yeniden hesapta değişmiyor? Elle düzeltilen gün korunur. Otomatiğe döndürmek için satırı silin.

Vardiya/takvim/ayar değişti, puantaj eski. Gece işi dünün ve önceki ayın günlerini yeniler; hemen yansıtmak için Puantaj Dönemleri'nde ilgili ayı kaydedin.

Kapalı aya PDKS okutması geldi. Okutma Kapalı dönem hatasıyla kalır; dönem açılıp kaydedilirse hareket ekranından düzenlenerek işlenir.

Fazla mesai hafta tatilinde neden tamamı? Talepte istenen kural (hafta tatili ve resmî tatilde çalışma fazla mesaidir); haftalık 45 saat birikimine bu günler katılmaz.

İzin talebinin tarihi değişti, eski günler ne olur? Aynı kayıtta düzelir: tek çalışanlık hesap kaynağı kalmayan izinli/raporlu/eğitim günlerini aralığa katar.

Hasta raporu alan çalışan devamsız mı yazılır? Hayır. Rapor günleri (hafta sonu dahil) Raporludur; aynı güne izin ya da okutma düşse bile rapor önce gelir. Yıllık izindeyken rapor alındıysa o günler izinden düşmez, bakiyeye döner.

Eğitimdeki çalışan devamsız görünüyor. Katılımcı satırında durum "Katıldı" olmalıdır; "Katılmadı/Mazeretli" günler normal hesaplanır.

Çalışma Takvimi kaydı sonrası hangi günler yenilenir? Satırın tarihleri (yıllık tekrarlıda bu yıl ve gelecek yıl). Tarihi değiştirilen satırın eski günleri gece işinde ya da dönem kaydında düzelir.


10. Dosyalar ve geri alma

Dosya İçerik
configs/seeds/sql/object/Hr_T_{AttendanceLog,Timesheet,TimesheetPeriod}.sql Tablolar
configs/seeds/sql/object/Hr_T_Shift.sql Vardiya toleransı kolonları
configs/seeds/sql/object/Hr_V_{AttendanceShift,TimesheetMonthly}.sql View'lar
configs/seeds/sql/object/Hr_F_{WorkCalendarDayType,TimesheetPeriodClosed,LeaveNetDays}.sql Takvim günü türü, kapalı dönem, rapordan arınmış izin günü
configs/seeds/sql/object/Hr_S_{TimesheetCalculate,AttendanceProcess,AttendanceImport,TimesheetPeriodAfterSave,TimesheetNightly}.sql Hesap ve tetikler
configs/seeds/sql/object/Hr_S_{LeaveRequestAfterSave,LeaveRequestGuard,LeaveSickLeaveSync,LeaveDaysRefresh}.sql İzin/rapor → puantaj tetiği, kapalı dönem guard'ı, rapor → izin günü
configs/seeds/sql/object/Hr_S_{TrainingSync,WorkCalendarAfterSave}.sql Eğitim ve takvim → puantaj tetiği
configs/seeds/wizard/{LeaveRequest,MyLeaveRequest,HealthCardSickLeave,Training,TrainingParticipant,WorkCalendar}.json Tetik komutları (silme dahil)
api/src/Sozsoft.Platform.DbMigrator/Migrations/ListFormSeeder_Administration.cs (UserSickLeave) Kullanıcı detayındaki istirahat listesinin silme tetiği
configs/seeds/wizard/{AttendanceLog,Timesheet,TimesheetMonthly,TimesheetPeriod,MyTimesheet,MyTimesheetDay}.json 6 wizard
configs/seeds/wizard/Shift.json Tolerans alanları
configs/seeds/data/App.DeveloperKit.CustomComponents/1bca19aa-e144-5e4c-b23b-9eddd4dafd19.json MyTimesheetWidget
configs/seeds/data/App.DeveloperKit.IntranetWidgets.json my-timesheet
configs/seeds/data/App.DeveloperKit.CustomEndpoints.json PDKS ucu
configs/seeds/data/App.BackgroundWorkers.RecurringJobs.json Timesheet Nightly
configs/seeds/data/App.SettingDefinitions.json App.HrSettings.Attendance.*
configs/seeds/data/{App.Menus.Menu,Abp.Identity.Permissions,App.Languages.LanguageText}.json Menü, yetki, dil
ui/src/views/admin/user-management/{TimesheetTab,Details}.tsx Kullanıcı detayı › Puantaj

Geri alma: Wizard Manager'dan altı ekran silinir; widget, endpoint, iş ve ayar satırları kendi ekranlarından kaldırılır. İzin/rapor prosedürlerindeki Hr_S_TimesheetCalculate çağrısı kaldırılmadan prosedür silinmemelidir. Tablolar düşürülmez.

Ek — Ekran envanteri (otomatik)

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

Günlük Hareketler — App.Hr.AttendanceLog

Özellik Değer
Wizard wizard/AttendanceLog.json
Yol Liste (Wizard)
Menü App.Hr.Attendance › App.Hr.AttendanceLog (sıra 1)
Yetki App.Hr.AttendanceLog + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Günlük Hareketler — PDKS'den (kart okuyucu), Excel aktarımından gelen ya da elle girilen ham giriş/çıkış okutmaları.
Kaynak Hr_T_AttendanceLog · 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.Attendance.Widget.Today, App.Hr.Attendance.Widget.Pdks, App.Hr.Attendance.Widget.Manual, App.Hr.Attendance.Widget.Error
Komutlar InsertAfter: Hr_S_AttendanceProcess · UpdateAfter: Hr_S_AttendanceProcess · DeleteAfter: Hr_S_AttendanceProcess
Form varsayılanları Direction=Auto, Source=Manual
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
CardNo Kart No dxTextBox ✓
EventTime Zaman dxDateBox ✓ ✓
Direction Yön dxSelectBox ✓ ✓ liste: In, Out, Auto
Source Kaynak dxSelectBox ✓ liste: Manual, Pdks, Import
DeviceCode Cihaz dxTextBox ✓
WorkDate İş Günü dxDateBox
ProcessError Hata dxSelectBox liste: UnknownCard, ClosedPeriod
Note Not dxTextArea ✓

Günlük Puantaj — App.Hr.Timesheet

Özellik Değer
Wizard wizard/Timesheet.json
Yol Liste (Wizard)
Menü App.Hr.Attendance › App.Hr.Timesheet (sıra 2)
Yetki App.Hr.Timesheet + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Günlük Puantaj — çalışan × gün satırı: ilk giriş, son çıkış, net çalışma süresi, mola düşümü, geç kalma (dk), erken çıkış (dk), fazla mesai (saat) ve gün tipi (çalışma, hafta tatili, resmî tatil, izinli, raporlu, eğitimde, devamsız).
Kaynak Hr_T_Timesheet · 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.Attendance.Widget.Absent, App.Hr.Attendance.Widget.Late, App.Hr.Attendance.Widget.Overtime, App.Hr.Attendance.Widget.Incomplete
Komutlar UpdateBefore: SQL · UpdateAfter: Hr_S_TimesheetCalculate · DeleteBefore: SQL · DeleteAfter: Hr_S_TimesheetCalculate
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
WorkDate İş Günü dxDateBox ✓
DayType Gün Tipi dxSelectBox ✓ ✓ liste: Work, WeeklyOff, Holiday, Training, Leave, Sick, Absent
LeaveTypeId İzin Türü dxSelectBox ✓ sorgu: Hr_T_LeaveType
TrainingId Eğitim dxSelectBox sorgu: Hr_T_Training
ShiftId Vardiya dxSelectBox sorgu: Hr_T_Shift
FirstIn İlk Giriş dxDateBox ✓
LastOut Son Çıkış dxDateBox ✓
NetHours Net Çalışma (saat) dxNumberBox
BreakMinutes Mola Düşümü (dk) dxNumberBox ✓
LateMinutes Geç Kalma (dk) dxNumberBox
EarlyLeaveMinutes Erken Çıkış (dk) dxNumberBox
OvertimeHours Fazla Mesai (saat) dxNumberBox
IsAssumed Varsayılan dxCheckBox
IsManual Elle dxCheckBox
IsIncomplete Eksik Okutma dxCheckBox
Note Not dxTextArea ✓
PeriodYear Yıl dxNumberBox
PeriodMonth Ay dxNumberBox
PeriodKey Dönem Anahtarı dxTextBox

Aylık Puantaj — App.Hr.TimesheetMonthly

Özellik Değer
Wizard wizard/TimesheetMonthly.json
Yol Liste (Wizard)
Menü App.Hr.Attendance › App.Hr.TimesheetMonthly (sıra 3)
Yetki App.Hr.TimesheetMonthly + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Aylık Puantaj — Günlük Puantaj'ın personel bazlı aylık toplamı (salt okunur).
Kaynak Hr_V_TimesheetMonthly
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✗ · düzenle ✗ · sil ✗ · popup
Kapsam Kiracı
Alt formlar App.Hr.Timesheet (Id → PeriodKey)
Widget'lar App.Hr.Attendance.Widget.Employees, App.Hr.Attendance.Widget.Overtime, App.Hr.Attendance.Widget.Absent, App.Hr.Attendance.Widget.OverLimit
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
DepartmentId Departman dxSelectBox ✓ sorgu: Hr_T_Department
JobPositionId Pozisyon dxSelectBox ✓ sorgu: Hr_T_JobPosition
PeriodYear Yıl dxNumberBox ✓
PeriodMonth Ay dxNumberBox ✓
PeriodStatus Dönem Durumu dxSelectBox ✓ liste: Open, Closed
WorkDays Çalışma Günü dxNumberBox ✓
NetHours Net Çalışma (saat) dxNumberBox ✓
LateMinutes Geç Kalma (dk) dxNumberBox ✓
LateDays Geç Kalınan Gün dxNumberBox ✓
EarlyLeaveMinutes Erken Çıkış (dk) dxNumberBox ✓
EarlyLeaveDays Erken Çıkılan Gün dxNumberBox ✓
OvertimeHours Fazla Mesai (saat) dxNumberBox ✓
OvertimePaidHours Zamlı Fazla Mesai (saat) dxNumberBox ✓
WeeklyOffDays Hafta Tatili dxNumberBox ✓
HolidayDays Resmî Tatil dxNumberBox ✓
LeaveDays İzinli Gün dxNumberBox ✓
UnpaidLeaveDays Ücretsiz İzinli Gün dxNumberBox ✓
TrainingDays Eğitim Günü dxNumberBox ✓
SickDays Raporlu Gün dxNumberBox ✓
AbsentDays Devamsız Gün dxNumberBox ✓
IncompleteDays Eksik Okutmalı Gün dxNumberBox ✓
AssumedDays Varsayılan Gün dxNumberBox ✓
YearOvertimeHours Yıllık Fazla Mesai (saat) dxNumberBox ✓
AnnualOvertimeLimit Yıllık Fazla Mesai Sınırı dxNumberBox ✓
IsOverAnnualLimit Yıllık Sınır Aşıldı dxNumberBox

Puantaj Dönemleri — App.Hr.TimesheetPeriod

Özellik Değer
Wizard wizard/TimesheetPeriod.json
Yol Liste (Wizard)
Menü App.Hr.Attendance › App.Hr.TimesheetPeriod (sıra 4)
Yetki App.Hr.TimesheetPeriod + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Puantaj Dönemleri — aylık puantaj dönemleri: yeniden hesaplama ve kapanış.
Kaynak Hr_T_TimesheetPeriod · 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.Attendance.Widget.Open, App.Hr.Attendance.Widget.Closed, App.Widget.Total
Komutlar InsertAfter: Hr_S_TimesheetPeriodAfterSave · UpdateAfter: Hr_S_TimesheetPeriodAfterSave · DeleteBefore: SQL
Form varsayılanları PeriodYear=@YEAR, PeriodMonth=@MONTH, Status=Open
Alan Başlık Editör Zorunlu Formda Kaynak
PeriodYear Yıl dxNumberBox ✓ ✓
PeriodMonth Ay dxNumberBox ✓ ✓
Status Durum dxRadioGroup ✓ ✓ liste: Open, Closed
CalculatedAt Hesaplanma dxDateBox
ClosedAt Kapanış dxDateBox
ClosedById Kapatan dxSelectBox sorgu: AbpUsers
NightlyAt Gece İşi dxDateBox
Note Not dxTextArea ✓

Puantajım — App.Hr.MyTimesheet

Özellik Değer
Wizard wizard/MyTimesheet.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.MyTimesheet + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Puantajım — kendi aylık puantajınız: ay ay çalışma günü, net saat, geç kalma, erken çıkış, fazla mesai ve izinli/raporlu/devamsız günler.
Kaynak Hr_V_TimesheetMonthly · filtre "EmployeeId" = '@USERID'
Görünümler Grid, Card, Pivot, Chart (açılış grid)
Düzenleme ekle ✗ · düzenle ✗ · sil ✗ · popup
Kapsam Kiracı
Alt formlar App.Hr.MyTimesheetDay (Id → PeriodKey)
Alan Başlık Editör Zorunlu Formda Kaynak
EmployeeId Çalışan dxSelectBox ✓ sorgu: AbpUsers
PeriodYear Yıl dxNumberBox ✓
PeriodMonth Ay dxNumberBox ✓
PeriodStatus Dönem Durumu dxSelectBox ✓ liste: Open, Closed
WorkDays Çalışma Günü dxNumberBox ✓
NetHours Net Çalışma (saat) dxNumberBox ✓
LateMinutes Geç Kalma (dk) dxNumberBox ✓
LateDays Geç Kalınan Gün dxNumberBox ✓
EarlyLeaveMinutes Erken Çıkış (dk) dxNumberBox ✓
EarlyLeaveDays Erken Çıkılan Gün dxNumberBox ✓
OvertimeHours Fazla Mesai (saat) dxNumberBox ✓
OvertimePaidHours Zamlı Fazla Mesai (saat) dxNumberBox ✓
WeeklyOffDays Hafta Tatili dxNumberBox ✓
HolidayDays Resmî Tatil dxNumberBox ✓
LeaveDays İzinli Gün dxNumberBox ✓
UnpaidLeaveDays Ücretsiz İzinli Gün dxNumberBox ✓
TrainingDays Eğitim Günü dxNumberBox ✓
SickDays Raporlu Gün dxNumberBox ✓
AbsentDays Devamsız Gün dxNumberBox ✓
IncompleteDays Eksik Okutmalı Gün dxNumberBox ✓
AssumedDays Varsayılan Gün dxNumberBox ✓
YearOvertimeHours Yıllık Fazla Mesai (saat) dxNumberBox ✓
AnnualOvertimeLimit Yıllık Fazla Mesai Sınırı dxNumberBox ✓
IsOverAnnualLimit Yıllık Sınır Aşıldı dxNumberBox

Puantaj Günlerim — App.Hr.MyTimesheetDay

Özellik Değer
Wizard wizard/MyTimesheetDay.json
Yol Liste (Wizard)
Menü Menüsüz (alt form)
Yetki App.Hr.MyTimesheetDay + .Create, .Update, .Delete, .Export, .Import, .Note
Açıklama Puantaj Günlerim — puantajınızın günleri: ilk giriş, son çıkış, net çalışma, mola, geç kalma, erken çıkış, fazla mesai ve gün tipi.
Kaynak Hr_T_Timesheet · 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ı
Alan Başlık Editör Zorunlu Formda Kaynak
WorkDate İş Günü dxDateBox
DayType Gün Tipi dxSelectBox liste: Work, WeeklyOff, Holiday, Training, Leave, Sick, Absent
LeaveTypeId İzin Türü dxSelectBox sorgu: Hr_T_LeaveType
TrainingId Eğitim dxSelectBox sorgu: Hr_T_Training
FirstIn İlk Giriş dxDateBox
LastOut Son Çıkış dxDateBox
NetHours Net Çalışma (saat) dxNumberBox
BreakMinutes Mola Düşümü (dk) dxNumberBox
LateMinutes Geç Kalma (dk) dxNumberBox
EarlyLeaveMinutes Erken Çıkış (dk) dxNumberBox
OvertimeHours Fazla Mesai (saat) dxNumberBox
IsAssumed Varsayılan dxCheckBox
IsManual Elle dxCheckBox
IsIncomplete Eksik Okutma dxCheckBox
Note Not dxTextBox
PeriodKey Dönem Anahtarı dxTextBox