Skip to content

Commit

Permalink
Merge pull request #119 from avinyafoundation/main
Browse files Browse the repository at this point in the history
added changes to add IT and CS ss to the attendance module
  • Loading branch information
YujithIsura authored Mar 14, 2024
2 parents 46cdff1 + 9a90b87 commit aa77840
Show file tree
Hide file tree
Showing 7 changed files with 6,227 additions and 15 deletions.
2 changes: 1 addition & 1 deletion api/Dependencies.toml
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ modules = [
[[package]]
org = "ballerina"
name = "http"
version = "2.8.3"
version = "2.8.5"
dependencies = [
{org = "ballerina", name = "auth"},
{org = "ballerina", name = "cache"},
Expand Down
57 changes: 57 additions & 0 deletions api/daily_activity_participant_attendance_summary_report.bal
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
public isolated service class DailyActivityParticipantAttendanceSummaryReportData {
private ActivityParticipantAttendanceSummaryReport activity_participant_attendance_summary_report = {
sign_in_date: "",
present_count: -1,
late_count:-1,
total_count:-1,
present_attendance_percentage:0.0,
late_attendance_percentage: 0.0
};

isolated function init(ActivityParticipantAttendanceSummaryReport? activity_participant_attendance_summary_report = null) returns error? {
if(activity_participant_attendance_summary_report != null) {
self.activity_participant_attendance_summary_report = activity_participant_attendance_summary_report.cloneReadOnly();
return;
}

}


isolated resource function get sign_in_date() returns string? {
lock {
return self.activity_participant_attendance_summary_report.sign_in_date;
}
}

isolated resource function get present_count() returns int? {
lock {
return self.activity_participant_attendance_summary_report.present_count;
}
}


isolated resource function get late_count() returns int? {
lock {
return self.activity_participant_attendance_summary_report.late_count;
}
}

isolated resource function get total_count() returns int? {
lock {
return self.activity_participant_attendance_summary_report.total_count;
}
}

isolated resource function get present_attendance_percentage() returns decimal? {

lock {
return self.activity_participant_attendance_summary_report.present_attendance_percentage;
}
}

isolated resource function get late_attendance_percentage() returns decimal? {
lock {
return self.activity_participant_attendance_summary_report.late_attendance_percentage;
}
}
}
166 changes: 155 additions & 11 deletions api/main.bal
Original file line number Diff line number Diff line change
Expand Up @@ -1625,12 +1625,23 @@ io:println(id_no);

time:Utc startTime = time:utcNow();

int|error? avinya_type_id = db_client->queryRow(
`SELECT avinya_type FROM organization WHERE id = ${organization_id};`
);
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());

if !(avinya_type_id is int) {
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());
return error("AvinyaType ID does not exist");
}


if (result_limit > 0) {
lock {
attendance_records = db_client->query(
`SELECT *
FROM activity_participant_attendance
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37) AND
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id}) AND
activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
ORDER BY created DESC
LIMIT ${result_limit};`
Expand All @@ -1643,7 +1654,7 @@ io:println(id_no);
attendance_records = db_client->query(
`SELECT *
FROM activity_participant_attendance
WHERE person_id IN (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37)
WHERE person_id IN (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id})
AND activity_instance_id IN (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND DATE(sign_in_time) BETWEEN ${from_date} AND ${to_date}
ORDER BY created DESC;`
Expand All @@ -1654,8 +1665,8 @@ io:println(id_no);
attendance_records = db_client->query(
`SELECT *
FROM activity_participant_attendance
WHERE person_id in (SELECT id FROM person WHERE avinya_type_id=37 AND
organization_id in (SELECT id FROM organization WHERE id in (SELECT child_org_id FROM parent_child_organization WHERE parent_org_id IN (SELECT child_org_id from parent_child_organization where parent_org_id = ${parent_organization_id})) AND avinya_type = 87))
WHERE person_id in (SELECT id FROM person WHERE avinya_type_id=${avinya_type_id} AND
organization_id in (SELECT id FROM organization WHERE id in (SELECT child_org_id FROM parent_child_organization WHERE parent_org_id IN (SELECT child_org_id from parent_child_organization where parent_org_id = ${parent_organization_id})) AND avinya_type IN (87, 10, 96)))
AND activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND DATE(sign_in_time) BETWEEN ${from_date} AND ${to_date}
ORDER BY DATE(sign_in_time),created DESC;`
Expand All @@ -1667,7 +1678,7 @@ io:println(id_no);
attendance_records = db_client->query(
`SELECT *
FROM activity_participant_attendance
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37) AND
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id}) AND
activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
ORDER BY created DESC;`
);
Expand Down Expand Up @@ -1700,14 +1711,24 @@ io:println(id_no);

time:Utc startTime = time:utcNow();

int|error? avinya_type_id = db_client->queryRow(
`SELECT avinya_type FROM organization WHERE id = ${organization_id};`
);
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());

if !(avinya_type_id is int) {
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());
return error("AvinyaType ID does not exist");
}

if (result_limit > 0) {
lock {
attendance_records = db_client->query(
`SELECT apa.*,p.preferred_name,p.digital_id
FROM activity_participant_attendance apa
LEFT JOIN person p ON apa.person_id = p.id
FROM activity_participant_attendance
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37) AND
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id}) AND
activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND TIME_FORMAT(sign_in_time, '%H:%i:%s') > '07:30:59'
ORDER BY created DESC
Expand All @@ -1722,7 +1743,7 @@ LEFT JOIN person p ON apa.person_id = p.id
`SELECT apa.*,p.preferred_name,p.digital_id
FROM activity_participant_attendance apa
LEFT JOIN person p ON apa.person_id = p.id
WHERE person_id IN (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37)
WHERE person_id IN (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id})
AND activity_instance_id IN (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND DATE(sign_in_time) BETWEEN ${from_date} AND ${to_date}
AND TIME_FORMAT(sign_in_time, '%H:%i:%s') > '07:30:59'
Expand All @@ -1736,8 +1757,8 @@ LEFT JOIN person p ON apa.person_id = p.id
FROM activity_participant_attendance apa
LEFT JOIN person p ON apa.person_id = p.id
LEFT JOIN organization o ON p.organization_id = o.id
WHERE apa.person_id in (SELECT id FROM person WHERE avinya_type_id=37 AND
organization_id in (SELECT id FROM organization WHERE id in (SELECT child_org_id FROM parent_child_organization WHERE parent_org_id IN (SELECT child_org_id from parent_child_organization where parent_org_id = ${parent_organization_id})) AND avinya_type = 87))
WHERE apa.person_id in (SELECT id FROM person WHERE avinya_type_id=${avinya_type_id} AND
organization_id in (SELECT id FROM organization WHERE id in (SELECT child_org_id FROM parent_child_organization WHERE parent_org_id IN (SELECT child_org_id from parent_child_organization where parent_org_id = ${parent_organization_id})) AND avinya_type IN (87, 10, 96)))
AND apa.activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND DATE(apa.sign_in_time) BETWEEN ${from_date} AND ${to_date}
AND TIME_FORMAT(apa.sign_in_time, '%H:%i:%s') > '07:30:59'
Expand All @@ -1751,7 +1772,7 @@ ORDER BY DATE(apa.sign_in_time) DESC;`
`SELECT apa.*,p.preferred_name,p.digital_id
FROM activity_participant_attendance apa
LEFT JOIN person p ON apa.person_id = p.id
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=37) AND
WHERE person_id in (SELECT id FROM person WHERE organization_id = ${organization_id} AND avinya_type_id=${avinya_type_id}) AND
activity_instance_id in (SELECT id FROM activity_instance WHERE activity_id = ${activity_id})
AND TIME_FORMAT(sign_in_time, '%H:%i:%s') > '07:30:59'
ORDER BY created DESC;`
Expand Down Expand Up @@ -3833,7 +3854,7 @@ WHERE name = "Admission Cycle" AND NOW() BETWEEN start_time AND end_time;`
)
ORDER BY subquery.a_date DESC;`
);
}
}
lock {
late_attendance = db_client->query(
`SELECT COUNT(*) AS late_attendance
Expand Down Expand Up @@ -4492,6 +4513,129 @@ lock {
}
}

isolated resource function get daily_attendance_summary_report(int? parent_organization_id, string? from_date = null, string? to_date = null) returns DailyActivityParticipantAttendanceSummaryReportData[]|error? {

stream<ActivityParticipantAttendanceSummaryReport, error?> daily_attendance_summary_report_records;

if(from_date != null && to_date != null) {

lock{

daily_attendance_summary_report_records = db_client->query(
`SELECT
DATE(pa.sign_in_time) AS sign_in_date,
COUNT(pa.person_id) AS present_count,
COUNT(CASE WHEN TIME_FORMAT(pa.sign_in_time, '%H:%i:%s') > '07:30:59' THEN 1 END) AS late_count,
ts.total_count
FROM
activity_participant_attendance pa
JOIN person p ON pa.person_id = p.id
JOIN (
SELECT COUNT(*) AS total_count
FROM person p
JOIN organization o ON o.id = p.organization_id
WHERE p.avinya_type_id = 37
AND p.id != 26
AND o.avinya_type != 95
AND p.organization_id IN (
SELECT id
FROM organization
WHERE id IN (
SELECT child_org_id
FROM parent_child_organization
WHERE parent_org_id IN (
SELECT child_org_id
FROM parent_child_organization
WHERE parent_org_id = ${parent_organization_id}
)
)
)
) ts
WHERE
pa.sign_in_time IS NOT NULL
AND pa.activity_instance_id IN (
SELECT id
FROM activity_instance
WHERE activity_id = 4
)
AND p.avinya_type_id = 37
AND DATE(pa.sign_in_time) BETWEEN ${from_date} AND ${to_date}
AND p.organization_id IN (
SELECT id
FROM organization
WHERE id IN (
SELECT child_org_id
FROM parent_child_organization
WHERE parent_org_id IN (
SELECT child_org_id
FROM parent_child_organization
WHERE parent_org_id = ${parent_organization_id}
)
)
)
GROUP BY DATE(pa.sign_in_time), ts.total_count;`);
}

DailyActivityParticipantAttendanceSummaryReportData[] attendanceSummaryReportDatas = [];

check from ActivityParticipantAttendanceSummaryReport attendance_summary_report_record in daily_attendance_summary_report_records
do {

int? present_count = attendance_summary_report_record.present_count;

int? late_count = attendance_summary_report_record.late_count;

int? total_count = attendance_summary_report_record.total_count;



decimal? present_attendance_percentage = (present_count * 100) / total_count;

decimal? late_attendance_percentage = (late_count * 100) / total_count;



if (present_attendance_percentage is null) {
present_attendance_percentage = 0;
}
if(late_attendance_percentage is null){
late_attendance_percentage = 0;
}

decimal roundedPresentAttendancePercentage = 0;
decimal roundedLateAttendancePercentage = 0;

if(present_attendance_percentage is decimal) {
roundedPresentAttendancePercentage = decimal:round(present_attendance_percentage, 2);
}

if(late_attendance_percentage is decimal ){
roundedLateAttendancePercentage = decimal:round(late_attendance_percentage, 2);
}

ActivityParticipantAttendanceSummaryReport attendanceSummaryData = {
sign_in_date : attendance_summary_report_record.sign_in_date,
present_count : present_count,
late_count : late_count,
total_count : total_count,
present_attendance_percentage:roundedPresentAttendancePercentage,
late_attendance_percentage:roundedLateAttendancePercentage
};

DailyActivityParticipantAttendanceSummaryReportData|error dailyAttendanceSummaryReportData = new DailyActivityParticipantAttendanceSummaryReportData(attendanceSummaryData);

if !(dailyAttendanceSummaryReportData is error) {
attendanceSummaryReportDatas.push(dailyAttendanceSummaryReportData);
}
};
check daily_attendance_summary_report_records.close();
return attendanceSummaryReportDatas;

}else{
return error("Provide non-null values for both 'From Date' and 'To Date'.");
}
}

}

isolated function calculateWeekdays(time:Utc toDate, time:Utc fromDate) returns int {
Expand Down
28 changes: 25 additions & 3 deletions api/organization_data.bal
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import ballerina/io;

public isolated service class OrganizationData {
private Organization organization;

Expand Down Expand Up @@ -95,7 +97,7 @@ public isolated service class OrganizationData {
child_org_ids = db_client->query(
`SELECT *
FROM parent_child_organization
WHERE parent_org_id = ${self.organization.id} AND parent_org_id != 17`
WHERE parent_org_id = ${self.organization.id} AND parent_org_id != 17 AND parent_org_id != 24`
);
}

Expand Down Expand Up @@ -139,13 +141,33 @@ public isolated service class OrganizationData {
isolated resource function get people() returns PersonData[]|error? {
// Get list of people in the organization
stream<Person, error?> people;
lock {

lock{
int|error? avinya_type_id = db_client->queryRow(
`SELECT avinya_type FROM organization WHERE id = ${self.organization.id};`
);
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());

if !(avinya_type_id is int) {
io:println("Eval Criteria ID: ", (check avinya_type_id).toString());
return error("AvinyaType ID does not exist");
}

if(avinya_type_id == 10 || avinya_type_id == 96){ // if organization is 10 or 96, get all vocational it students or cs students
people = db_client->query(
`SELECT *
FROM person
WHERE avinya_type_id=${avinya_type_id} AND organization_id = ${self.organization.id}`
);
}else{
people = db_client->query(
`SELECT *
FROM person
WHERE organization_id = ${self.organization.id} AND avinya_type_id=37`
);
}
}
}


PersonData[] peopleData = [];

Expand Down
10 changes: 10 additions & 0 deletions api/types.bal
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,16 @@ public type ActivityParticipantAttendanceForLateAttendance record {|
string? digital_id;
|};

public type ActivityParticipantAttendanceSummaryReport record {|
readonly string? record_type = "activity_participant_attendance_summary_report";
string? sign_in_date;
int? present_count;
int? late_count;
int? total_count;
decimal? present_attendance_percentage;
decimal? late_attendance_percentage;
|};

public type ActivityParticipantAttendanceMissedBySecurity record {|
readonly string? record_type = "activity_participant_attendance_missed_by_security";
string? sign_in_time;
Expand Down
Loading

0 comments on commit aa77840

Please sign in to comment.