sozsoft-platform/configs/seeds/postgres/object/Hr_V_AttendanceShift.sql

40 lines
3.1 KiB
MySQL
Raw Permalink Normal View History

2026-10-06 11:24:30 +00:00
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 (
2026-10-19 14:35:08 +00:00
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
2026-10-06 11:24:30 +00:00
) 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
2026-10-19 14:35:08 +00:00
FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.DefaultBreakMinutes') AS v) z), 60) AS "BreakMin",
2026-10-06 11:24:30 +00:00
COALESCE(s."LateToleranceMinutes",
(SELECT CASE WHEN pg_input_is_valid(z.v, 'integer') THEN z.v::int END
2026-10-19 14:35:08 +00:00
FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.LateToleranceMinutes') AS v) z), 10) AS "LateTol",
2026-10-06 11:24:30 +00:00
COALESCE(s."EarlyLeaveToleranceMinutes",
(SELECT CASE WHEN pg_input_is_valid(z.v, 'integer') THEN z.v::int END
2026-10-19 14:35:08 +00:00
FROM (SELECT public."Hr_F_HrSetting"(u."TenantId", 'Adm.HrSettings.Attendance.EarlyLeaveToleranceMinutes') AS v) z), 10) AS "EarlyTol"
2026-10-06 11:24:30 +00:00
) x
WHERE u."IsDeleted" = FALSE;