fixed #70 + made db script ignore double bookings
Some checks failed
Tests / Run Go Tests (push) Failing after 2m0s
Some checks failed
Tests / Run Go Tests (push) Failing after 2m0s
This commit is contained in:
@@ -128,6 +128,9 @@ func (b *Booking) InsertWithTimestamp() error {
|
||||
if b.Timestamp.IsZero() {
|
||||
return b.Insert()
|
||||
}
|
||||
if !checkLastBooking(*b) {
|
||||
return SameBookingError{}
|
||||
}
|
||||
stmt, err := DB.Prepare((`INSERT INTO anwesenheit (card_uid, geraet_id, check_in_out, anwesenheit_typ, timestamp) VALUES ($1, $2, $3, $4, $5) RETURNING counter_id`))
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -175,22 +175,39 @@ func GetWorkDays(user User, tsFrom, tsTo time.Time) []WorkDay {
|
||||
qStr, err := DB.Prepare(`
|
||||
WITH all_days AS (
|
||||
SELECT generate_series($2::DATE, $3::DATE - INTERVAL '1 day', INTERVAL '1 day')::DATE AS work_date),
|
||||
ordered_bookings AS (
|
||||
SELECT
|
||||
a.timestamp::DATE AS work_date,
|
||||
a.timestamp,
|
||||
a.check_in_out,
|
||||
a.counter_id,
|
||||
a.anwesenheit_typ,
|
||||
sat.anwesenheit_name AS anwesenheit_typ_name,
|
||||
LAG(a.timestamp) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_timestamp,
|
||||
LAG(a.check_in_out) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_check
|
||||
FROM anwesenheit a
|
||||
LEFT JOIN s_anwesenheit_typen sat ON a.anwesenheit_typ = sat.anwesenheit_id
|
||||
WHERE a.card_uid = $1
|
||||
AND a.timestamp::DATE >= $2
|
||||
AND a.timestamp::DATE <= $3
|
||||
)
|
||||
normalized_bookings AS (
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT
|
||||
a.card_uid,
|
||||
a.timestamp,
|
||||
a.timestamp::DATE AS work_date,
|
||||
a.check_in_out,
|
||||
a.counter_id,
|
||||
a.anwesenheit_typ,
|
||||
sat.anwesenheit_name AS anwesenheit_typ_name,
|
||||
LAG(a.check_in_out) OVER (
|
||||
PARTITION BY a.card_uid, a.timestamp::DATE
|
||||
ORDER BY a.timestamp
|
||||
) AS prev_check
|
||||
FROM anwesenheit a
|
||||
LEFT JOIN s_anwesenheit_typen sat
|
||||
ON a.anwesenheit_typ = sat.anwesenheit_id
|
||||
WHERE a.card_uid = $1
|
||||
AND a.timestamp::DATE >= $2
|
||||
AND a.timestamp::DATE <= $3
|
||||
) t
|
||||
WHERE prev_check IS NULL OR prev_check <> check_in_out
|
||||
),
|
||||
ordered_bookings AS (
|
||||
SELECT
|
||||
*,
|
||||
LAG(timestamp) OVER (
|
||||
PARTITION BY card_uid, work_date
|
||||
ORDER BY timestamp
|
||||
) AS prev_timestamp
|
||||
FROM normalized_bookings
|
||||
)
|
||||
SELECT
|
||||
d.work_date,
|
||||
COALESCE(MIN(b.timestamp), NOW()) AS time_from,
|
||||
@@ -228,6 +245,62 @@ func GetWorkDays(user User, tsFrom, tsTo time.Time) []WorkDay {
|
||||
GROUP BY d.work_date
|
||||
ORDER BY d.work_date ASC;`)
|
||||
|
||||
// qStr, err := DB.Prepare(`
|
||||
// WITH all_days AS (
|
||||
// SELECT generate_series($2::DATE, $3::DATE - INTERVAL '1 day', INTERVAL '1 day')::DATE AS work_date),
|
||||
// ordered_bookings AS (
|
||||
// SELECT
|
||||
// a.timestamp::DATE AS work_date,
|
||||
// a.timestamp,
|
||||
// a.check_in_out,
|
||||
// a.counter_id,
|
||||
// a.anwesenheit_typ,
|
||||
// sat.anwesenheit_name AS anwesenheit_typ_name,
|
||||
// LAG(a.timestamp) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_timestamp,
|
||||
// LAG(a.check_in_out) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_check
|
||||
// FROM anwesenheit a
|
||||
// LEFT JOIN s_anwesenheit_typen sat ON a.anwesenheit_typ = sat.anwesenheit_id
|
||||
// WHERE a.card_uid = $1
|
||||
// AND a.timestamp::DATE >= $2
|
||||
// AND a.timestamp::DATE <= $3
|
||||
// )
|
||||
// SELECT
|
||||
// d.work_date,
|
||||
// COALESCE(MIN(b.timestamp), NOW()) AS time_from,
|
||||
// COALESCE(MAX(b.timestamp), NOW()) AS time_to,
|
||||
// COALESCE(
|
||||
// EXTRACT(EPOCH FROM SUM(
|
||||
// CASE
|
||||
// WHEN b.prev_check IN (1, 3) AND b.check_in_out IN (2, 4, 254)
|
||||
// THEN b.timestamp - b.prev_timestamp
|
||||
// ELSE INTERVAL '0'
|
||||
// END
|
||||
// )), 0
|
||||
// ) AS total_work_seconds,
|
||||
// COALESCE(
|
||||
// EXTRACT(EPOCH FROM SUM(
|
||||
// CASE
|
||||
// WHEN b.prev_check IN (2, 4, 254) AND b.check_in_out IN (1, 3)
|
||||
// THEN b.timestamp - b.prev_timestamp
|
||||
// ELSE INTERVAL '0'
|
||||
// END
|
||||
// )), 0
|
||||
// ) AS total_pause_seconds,
|
||||
// COALESCE(jsonb_agg(jsonb_build_object(
|
||||
// 'check_in_out', b.check_in_out,
|
||||
// 'timestamp', b.timestamp,
|
||||
// 'counter_id', b.counter_id,
|
||||
// 'anwesenheit_typ', b.anwesenheit_typ,
|
||||
// 'anwesenheit_typ', jsonb_build_object(
|
||||
// 'anwesenheit_id', b.anwesenheit_typ,
|
||||
// 'anwesenheit_name', b.anwesenheit_typ_name
|
||||
// )
|
||||
// ) ORDER BY b.timestamp), '[]'::jsonb) AS bookings
|
||||
// FROM all_days d
|
||||
// LEFT JOIN ordered_bookings b ON d.work_date = b.work_date
|
||||
// GROUP BY d.work_date
|
||||
// ORDER BY d.work_date ASC;`)
|
||||
|
||||
if err != nil {
|
||||
log.Println("Error preparing SQL statement", err)
|
||||
return workDays
|
||||
|
||||
Reference in New Issue
Block a user