CREATE OR REPLACE VIEW public."Hr_V_AttendanceShift" AS -- Çalışanın puantajda kullanılan vardiyası (dakika cinsinden). Kullanıcı kartında vardiya yoksa ya da -- vardiyanın alanı boşsa Ayarlar › İnsan Kaynakları › Puantaj'daki varsayılan geçerlidir. -- DayOffset: hareketin hangi iş gününe yazılacağı. Vardiya bitişi ile bir sonraki başlangıç arasındaki -- boşluğun ortası gün sınırıdır; gece vardiyasındaki 23:50 okutması vardiyanın başladığı ertesi günün -- hareketidir. İş günü = ("Zaman" - "DayOffset" * INTERVAL '1 minute')::date. -- Geçersiz metin (TRY_CONVERT karşılığı) pg_input_is_valid ile NULL'a düşer. SELECT x."EmployeeId", x."TenantId", x."ShiftId", x."StartMin", x."EndMin", x."BreakMin", x."LateTol", x."EarlyTol", x."StartMin" - ((x."StartMin" - ((x."EndMin" + ((x."StartMin" - x."EndMin" + 1440) % 1440) / 2) % 1440) + 1440) % 1440) AS "DayOffset" FROM "AbpUsers" u LEFT JOIN "Hr_T_Shift" s ON s."Id" = u."ShiftId" AND s."IsDeleted" = FALSE CROSS JOIN LATERAL ( SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.DefaultShiftStart') AS DefaultStartText, public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.DefaultShiftEnd') AS DefaultEndText ) h CROSS JOIN LATERAL ( SELECT CASE WHEN pg_input_is_valid(s."StartTime", 'time') THEN s."StartTime"::time END AS ShiftStart, CASE WHEN pg_input_is_valid(s."EndTime", 'time') THEN s."EndTime"::time END AS ShiftEnd, CASE WHEN pg_input_is_valid(h.DefaultStartText, 'time') THEN h.DefaultStartText::time END AS DefaultStart, CASE WHEN pg_input_is_valid(h.DefaultEndText, 'time') THEN h.DefaultEndText::time END AS DefaultEnd ) t CROSS JOIN LATERAL ( SELECT u."Id" AS "EmployeeId", u."TenantId", s."Id" AS "ShiftId", COALESCE(EXTRACT(HOUR FROM t.ShiftStart)::int * 60 + EXTRACT(MINUTE FROM t.ShiftStart)::int, EXTRACT(HOUR FROM t.DefaultStart)::int * 60 + EXTRACT(MINUTE FROM t.DefaultStart)::int, 480) AS "StartMin", COALESCE(EXTRACT(HOUR FROM t.ShiftEnd)::int * 60 + EXTRACT(MINUTE FROM t.ShiftEnd)::int, EXTRACT(HOUR FROM t.DefaultEnd)::int * 60 + EXTRACT(MINUTE FROM t.DefaultEnd)::int, 1080) AS "EndMin", COALESCE(s."BreakMinutes", (SELECT CASE WHEN pg_input_is_valid(z.v, 'integer') THEN z.v::int END FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.DefaultBreakMinutes') AS v) z), 60) AS "BreakMin", COALESCE(s."LateToleranceMinutes", (SELECT CASE WHEN pg_input_is_valid(z.v, 'integer') THEN z.v::int END FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.LateToleranceMinutes') AS v) z), 10) AS "LateTol", COALESCE(s."EarlyLeaveToleranceMinutes", (SELECT CASE WHEN pg_input_is_valid(z.v, 'integer') THEN z.v::int END FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.EarlyLeaveToleranceMinutes') AS v) z), 10) AS "EarlyTol" ) x WHERE u."IsDeleted" = FALSE;