182 lines
4.3 KiB
SQL
182 lines
4.3 KiB
SQL
-- name: ListActiveEmployees :many
|
|
SELECT
|
|
de.id,
|
|
de.firstname,
|
|
de.surname,
|
|
de."contractStart",
|
|
de."contractEnd",
|
|
de."contractHoursWeek",
|
|
de."contractSalaryHour",
|
|
de."contractTypeName",
|
|
e.id as "dlId",
|
|
e."personTransportCertificate"
|
|
FROM "DyflexisEmployee" as de
|
|
INNER JOIN "Employee" as e ON de.id::text = e."personnelNumber"
|
|
WHERE de."contractStart" < CURRENT_DATE AND de."contractEnd" > (CURRENT_DATE - INTERVAL '2 months');
|
|
|
|
-- name: GetWorkSummaryForEmployeeInPeriod :one
|
|
WITH wt AS (
|
|
SELECT
|
|
COUNT(*) as days,
|
|
COALESCE(sum(duration), 0)::bigint as minutes
|
|
FROM "WorkTime"
|
|
WHERE "userId" = @employee_id AND "startDate" > @start_date AND "startDate" < @end_date
|
|
)
|
|
SELECT
|
|
wt.days,
|
|
(minutes / 60.0)::float as hours,
|
|
wt.minutes
|
|
FROM wt;
|
|
|
|
-- name: ListPlannedTimesForEmployeeInPeriod :many
|
|
SELECT
|
|
DISTINCT ON (day)
|
|
"startDate"::DATE as day,
|
|
"startDate",
|
|
"endDate",
|
|
department,
|
|
pause,
|
|
duration
|
|
FROM "PlannedTime"
|
|
WHERE
|
|
"userId" = @employee_id AND
|
|
"startDate" > @start_date AND
|
|
"startDate" < @end_date AND
|
|
department <> 'Fortbildung' AND
|
|
note IS NULL
|
|
ORDER BY day, "startDate" ASC;
|
|
|
|
-- name: ListWorkTimesForEmployeeInPeriod :many
|
|
SELECT * FROM "WorkTime"
|
|
WHERE "userId" = @employee_id AND "startDate" > @start_date AND "startDate" < @end_date;
|
|
|
|
-- name: GetSicknessSummaryForEmployeeInPeriod :one
|
|
WITH pt AS (
|
|
SELECT
|
|
COUNT(*) as days,
|
|
COALESCE(sum(duration), 0)::bigint as minutes
|
|
FROM "PlannedTime"
|
|
WHERE "userId" = @employee_id AND "startDate" > @start_date AND "startDate" < @end_date AND note = 'sick'
|
|
)
|
|
SELECT
|
|
pt.days,
|
|
(minutes / 60)::float as hours,
|
|
pt.minutes
|
|
FROM pt;
|
|
|
|
-- name: GetEmployeeDyflexis :one
|
|
SELECT * FROM "DyflexisEmployee"
|
|
WHERE
|
|
id = $1 AND
|
|
"contractStart" < CURRENT_DATE AND
|
|
"contractEnd" > (CURRENT_DATE - INTERVAL '2 months')
|
|
LIMIT 1;
|
|
|
|
-- name: FetchDrivenToursInInterval :many
|
|
SELECT * FROM "Tour"
|
|
WHERE "check" <> 3
|
|
AND "deletedAt" IS NULL
|
|
AND (
|
|
"patientId" IS NULL
|
|
OR "patientId" NOT IN (
|
|
'b7424477-a4b2-42f7-b7e7-a4bef24f6979',
|
|
'3554e1a9-9c07-45e5-b53c-692a77e4fa9a'
|
|
)
|
|
)
|
|
-- ID's for Pause and Feierabend respectively
|
|
AND (
|
|
"carName" IS NULL
|
|
OR "carName" NOT IN (
|
|
'Storno',
|
|
'Abgabe',
|
|
'Löschen'
|
|
)
|
|
)
|
|
AND "startDate" >= @start_date
|
|
AND "startDate" <= @end_date
|
|
AND ("driverId" = @employee_id OR "codriverId" = @employee_id)
|
|
ORDER BY "startDate" DESC;
|
|
|
|
-- name: CountTourengeldAmountInPeriod :one
|
|
WITH ToursInPeriod AS (
|
|
SELECT
|
|
(("startDate" AT TIME ZONE 'UTC') AT TIME ZONE 'Europe/Berlin')::DATE as day,
|
|
"operationId",
|
|
"occupiedKm",
|
|
CASE
|
|
WHEN "occupiedKm" <= 30 THEN 1.0
|
|
ELSE ROUND("occupiedKm" / 30.0)
|
|
END AS tour_value,
|
|
CASE
|
|
WHEN EXTRACT(ISODOW FROM "startDate") = 6 AND "occupiedKm" <= 30 THEN 0.5
|
|
ELSE 0.0
|
|
END AS weekend_bonus,
|
|
"infectionName",
|
|
CASE
|
|
WHEN "infectionName" = 'Covid-19' THEN 0.5
|
|
ELSE 0.0
|
|
END AS infection_bonus
|
|
FROM
|
|
"Tour"
|
|
WHERE
|
|
"check" <> 3
|
|
AND "deletedAt" IS NULL
|
|
AND (
|
|
"patientId" IS NULL
|
|
OR "patientId" NOT IN (
|
|
'b7424477-a4b2-42f7-b7e7-a4bef24f6979',
|
|
'3554e1a9-9c07-45e5-b53c-692a77e4fa9a'
|
|
)
|
|
)
|
|
-- ID's for Pause and Feierabend respectively
|
|
AND (
|
|
"carName" IS NULL
|
|
OR "carName" NOT IN (
|
|
'Storno',
|
|
'Abgabe',
|
|
'Löschen'
|
|
)
|
|
AND "carName" LIKE '%KTW%'
|
|
)
|
|
AND "startDate" >= @start_date
|
|
AND "startDate" <= @end_date
|
|
AND ("driverId" ILIKE @employee_id OR "codriverId" ILIKE @employee_id)
|
|
ORDER BY
|
|
"day"
|
|
),
|
|
DailyCounts AS (
|
|
SELECT
|
|
day,
|
|
SUM(tour_value) + SUM(weekend_bonus) + SUM(infection_bonus) AS tour_amount
|
|
FROM
|
|
ToursInPeriod
|
|
GROUP BY
|
|
day
|
|
),
|
|
HighActivityDays AS (
|
|
SELECT
|
|
day,
|
|
GREATEST(0, tour_amount - 6) AS tourengeld
|
|
FROM
|
|
DailyCounts
|
|
)
|
|
SELECT
|
|
SUM(tourengeld)::float as tourengeld
|
|
FROM
|
|
HighActivityDays;
|
|
|
|
-- name: GetEmployeeByName :one
|
|
SELECT
|
|
dy.id as dyflexis_id,
|
|
dl.id as dispolive_id,
|
|
dy."contractSalaryHour"
|
|
FROM "DyflexisEmployee" as dy
|
|
INNER JOIN
|
|
"Employee" as dl ON dy.id::text = dl."personnelNumber"
|
|
WHERE
|
|
TRIM(dy.firstname) = @firstname AND
|
|
TRIM(dy.surname) = @lastname AND
|
|
"contractStart" < CURRENT_DATE AND
|
|
"contractEnd" > (CURRENT_DATE - INTERVAL '2 months')
|
|
ORDER BY dy."contractEnd" DESC;
|