From 25b72877c84bd716ecb3e8344b9b6fd1418f58ad Mon Sep 17 00:00:00 2001 From: Vishnu Tejas Date: Fri, 2 May 2025 15:40:24 +0530 Subject: [PATCH] Added a query to get the absents of month --- src/graphql/queries/attendance_queries.rs | 39 ++++++++++++++++++++++- src/models/attendance.rs | 8 +++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/graphql/queries/attendance_queries.rs b/src/graphql/queries/attendance_queries.rs index 2050051..0bc4772 100644 --- a/src/graphql/queries/attendance_queries.rs +++ b/src/graphql/queries/attendance_queries.rs @@ -1,7 +1,8 @@ use std::sync::Arc; -use crate::models::attendance::{Attendance, AttendanceWithMember}; +use crate::models::attendance::{AbsentsWithMember, Attendance, AttendanceWithMember}; use async_graphql::{Context, Object, Result}; +use chrono::Datelike; use chrono::NaiveDate; use sqlx::PgPool; @@ -41,4 +42,40 @@ impl AttendanceQueries { Ok(records) } + + async fn absents_by_month( + &self, + ctx: &Context<'_>, + date: NaiveDate, + ) -> Result> { + let pool = ctx.data::>().expect("Pool must be in context."); + + let end_date = date + .with_day(1) + .unwrap() + .with_month(date.month() + 1) + .unwrap(); + + let records = sqlx::query_as::<_, AbsentsWithMember>( + "SELECT mem.name, mem.year, att.member_id, + COUNT(*) AS absent_days + FROM attendance att + JOIN member mem ON att.member_id = mem.member_id + WHERE + att.is_present = FALSE + AND att.date >= $1 + AND att.date < $2 + GROUP BY + att.member_id, mem.name, mem.year + ORDER BY + absent_days DESC, mem.name + ", + ) + .bind(date) + .bind(end_date) + .fetch_all(pool.as_ref()) + .await?; + + Ok(records) + } } diff --git a/src/models/attendance.rs b/src/models/attendance.rs index 9efc9dc..f129c64 100644 --- a/src/models/attendance.rs +++ b/src/models/attendance.rs @@ -58,3 +58,11 @@ pub struct AttendanceWithMember { pub year: i32, pub group_id: i32, } + +#[derive(SimpleObject, FromRow)] +pub struct AbsentsWithMember { + pub member_id: i32, + pub absent_days: i64, + pub name: String, + pub year: i32, +}