Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/assets/vue/services/attendanceService.js

253 lines
9.0 KiB

import { ENTRYPOINT } from "../config/entrypoint"
import axios from "axios"
export const ATTENDANCE_STATES = {
ABSENT: { id: 0, label: "Absent", score: 0 },
PRESENT: { id: 1, label: "Present", score: 1 },
LATE_15: { id: 2, label: "Late < 15 min", score: 1 },
LATE_15_PLUS: { id: 3, label: "Late > 15 min", score: 0.5 },
ABSENT_JUSTIFIED: { id: 4, label: "Absent, justified", score: 0.25 },
}
export default {
/**
* Fetches all attendance lists for a specific course.
* @param {Object} params - Filters for the attendance lists.
* @returns {Promise<Object>} - Data of the attendance lists.
*/
getAttendances: async (params) => {
const response = await axios.get(`${ENTRYPOINT}attendances/`, { params })
return response.data
},
/**
* Fetches a specific attendance list by its ID.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Object>} - Data of the specific attendance list.
*/
getAttendance: async (attendanceId) => {
const response = await axios.get(`${ENTRYPOINT}attendances/${attendanceId}/`)
return response.data
},
/**
* Fetches groups filtered by the parent node (course).
* @param {Number|String} parentNodeId - The ID of the parent resource node (course).
* @returns {Promise<Array>} - List of groups associated with the course.
*/
fetchGroups: async (parentNodeId) => {
try {
const response = await axios.get(`${ENTRYPOINT}groups`, {
params: { "resourceNode.parent": parentNodeId },
})
return response.data["hydra:member"].map((group) => ({
label: group.title,
value: group.iid,
}))
} catch (error) {
console.error("Error fetching groups:", error)
throw error
}
},
/**
* Creates a new attendance list.
* @param {Object} data - Data for the new attendance list.
* @returns {Promise<Object>} - Data of the created attendance list.
*/
createAttendance: async (data) => {
const response = await axios.post(`${ENTRYPOINT}attendances`, data)
return response.data
},
/**
* Updates an existing attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @param {Object} data - Updated data for the attendance list.
* @returns {Promise<Object>} - Data of the updated attendance list.
*/
updateAttendance: async (attendanceId, data) => {
const response = await axios.put(`${ENTRYPOINT}attendances/${attendanceId}`, data)
return response.data
},
/**
* Deletes an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Object>} - Result of the deletion.
*/
deleteAttendance: async (attendanceId) => {
const response = await axios.delete(`${ENTRYPOINT}attendances/${attendanceId}`)
return response.data
},
/**
* Toggles the visibility of an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<void>} - Result of the toggle action.
*/
toggleVisibility: async (attendanceId) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/toggle_visibility`
await axios.put(endpoint, {}, { headers: { "Content-Type": "application/json" } })
},
/**
* Soft deletes an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<void>} - Result of the soft delete action.
*/
softDelete: async (attendanceId) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/soft_delete`
await axios.put(endpoint, {}, { headers: { "Content-Type": "application/json" } })
},
/**
* Adds a new calendar event to an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @param {Object} data - Data for the new calendar event.
* @returns {Promise<Object>} - Data of the created calendar event.
*/
addCalendarEvent: async (attendanceId, data) => {
const response = await axios.post(`${ENTRYPOINT}attendances/${attendanceId}/calendars`, data)
return response.data
},
/**
* Updates an existing calendar event.
* @param {Number|String} calendarId - ID of the calendar event.
* @param {Object} data - Updated data for the calendar event.
* @returns {Promise<Object>} - Data of the updated calendar event.
*/
updateCalendarEvent: async (calendarId, data) => {
const response = await axios.put(`${ENTRYPOINT}c_attendance_calendars/${calendarId}`, data)
return response.data
},
/**
* Deletes a specific calendar event.
* @param {Number|String} calendarId - ID of the calendar event.
* @returns {Promise<Object>} - Result of the deletion.
*/
deleteCalendarEvent: async (calendarId) => {
const response = await axios.delete(`${ENTRYPOINT}c_attendance_calendars/${calendarId}`)
return response.data
},
/**
* Adds a new calendar entry directly to an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @param {Object} data - Calendar data, including repetition and groups.
* @returns {Promise<Object>} - Data of the created calendar entry.
*/
addAttendanceCalendar: async (attendanceId, data) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/calendars`
const response = await axios.post(endpoint, data, {
headers: { "Content-Type": "application/json" },
})
return response.data
},
/**
* Fetches full attendance data (dates and attendance status).
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Object>} - Full attendance data structured for Vue.
*/
getFullAttendanceData: async (attendanceId) => {
try {
const response = await axios.get(`/attendance/full-data`, {
params: { attendanceId },
})
return response.data
} catch (error) {
console.error("Error fetching full attendance data:", error)
throw error
}
},
/**
* Fetches users related to attendance based on course, session, or group.
* @param {Object} params - Object with courseId, sessionId, and/or groupId.
* @returns {Promise<Array>} - List of users.
*/
getAttendanceSheetUsers: async (params) => {
try {
const response = await axios.get(`/attendance/users/context`, { params })
return response.data
} catch (error) {
console.error("Error fetching attendance sheet users:", error)
throw error
}
},
/**
* Updates an existing calendar entry for an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @param {Number|String} calendarId - ID of the calendar entry to update.
* @param {Object} data - Updated calendar data.
* @returns {Promise<Object>} - Data of the updated calendar entry.
*/
updateAttendanceCalendar: async (attendanceId, calendarId, data) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/calendars/${calendarId}`
const response = await axios.put(endpoint, data)
return response.data
},
/**
* Deletes a specific calendar entry for an attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @param {Number|String} calendarId - ID of the calendar entry to delete.
* @returns {Promise<Object>} - Result of the deletion.
*/
deleteAttendanceCalendar: async (attendanceId, calendarId) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/calendars/${calendarId}`
const response = await axios.delete(endpoint)
return response.data
},
/**
* Deletes all calendar entries for a specific attendance list.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Object>} - Result of the deletion.
*/
deleteAllAttendanceCalendars: async (attendanceId) => {
const endpoint = `${ENTRYPOINT}attendances/${attendanceId}/calendars`
const response = await axios.delete(endpoint)
return response.data
},
/**
* Exports an attendance list to PDF format.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Blob>} - PDF file of the attendance list.
*/
exportAttendanceToPdf: async (attendanceId) => {
const response = await axios.get(`${ENTRYPOINT}attendances/${attendanceId}/export/pdf`, {
responseType: "blob",
})
return response.data
},
/**
* Exports an attendance list to XLS format.
* @param {Number|String} attendanceId - ID of the attendance list.
* @returns {Promise<Blob>} - XLS file of the attendance list.
*/
exportAttendanceToXls: async (attendanceId) => {
const response = await axios.get(`${ENTRYPOINT}attendances/${attendanceId}/export/xls`, {
responseType: "blob",
})
return response.data
},
saveAttendanceSheet: async (data) => {
try {
const response = await axios.post(`/attendance/sheet/save`, data, {
headers: { "Content-Type": "application/json" },
})
return response.data
} catch (error) {
console.error("Error saving attendance sheet:", error)
throw error
}
},
}