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.
 
 
 

317 lines
9.6 KiB

const { database } = require('../database')
const { getNiveau } = require('./Niveau')
const { matiereSysteme } = require('../function/System')
/**
* Function to insert notes into the database
* @param {Object} formData - The form data containing subject names and values
* @param {number} etudiant_id - The student ID
* @param {string} etudiant_niveau - The student level
* @returns {Promise} - Promise resolving to the database response or an error
*/
async function insertNote(etudiant_id, etudiant_niveau, mention_id, formData, annee_scolaire) {
// Extract keys and values dynamically
const matiere_id = Object.keys(formData)
const values = Object.values(formData)
const query = database.prepare(
`INSERT INTO notes (etudiant_id, matiere_id, etudiant_niveau, mention_id, note, annee_scolaire) VALUES (?, ?, ?, ?, ?, ?)`
)
const insertRepechQuery = database.prepare(
`INSERT INTO notesrepech (etudiant_id, matiere_id, etudiant_niveau, mention_id, note, annee_scolaire) VALUES (?, ?, ?, ?, ?, ?)`
)
console.log(annee_scolaire)
try {
let response
let newMatiereId = []
// run the session normale
database.transaction(() => {
for (let j = 0; j < matiere_id.length; j++) {
if (values[j] < 10) {
newMatiereId.push(matiere_id[j])
}
response = query.run(
etudiant_id,
matiere_id[j],
etudiant_niveau,
mention_id,
parseFloat(values[j].replace(',', '.')) || 0,
annee_scolaire
)
}
})()
// run the second session and set it to be 0 to display it from screen
database.transaction(() => {
for (let j = 0; j < newMatiereId.length; j++) {
response = insertRepechQuery.run(
etudiant_id,
newMatiereId[j],
etudiant_niveau,
mention_id,
0,
annee_scolaire
)
}
})()
return response
} catch (error) {
return error
}
}
/**
*
* @returns promise
*/
async function getNoteOnline() {
const query = database.prepare('SELECT notes.* FROM notes ')
try {
let response = await query.all()
return response
} catch (error) {
return error
}
}
/**
*
* @returns promise
*/
async function getNote(id, niveau, mention_id) {
let semestre = await matiereSysteme(niveau)
const query = database.prepare(
'SELECT notes.*, matieres.* FROM notes JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_id = ? AND notes.etudiant_niveau = ?'
)
const matiereQuery = database.prepare(`
SELECT DISTINCT m.*
FROM matieres m
JOIN matiere_semestre ms ON m.id = ms.matiere_id
JOIN semestres s ON ms.semestre_id = s.id
WHERE (s.nom LIKE ? OR s.nom LIKE ?)
AND ms.mention_id = ?
`)
let res = await matiereQuery.all(`%${semestre[0]}%`, `%${semestre[1]}%`, mention_id)
let response = await query.all(id, niveau)
const infoEtudiants = database.prepare('SELECT * FROM etudiants WHERE id = ?')
let etudiant = await infoEtudiants.get(id)
let arrayResponseIdMatiere = []
for (let index = 0; index < response.length; index++) {
arrayResponseIdMatiere.push(response[index].matiere_id)
}
const filteredIds = res
.filter((matiere) => !arrayResponseIdMatiere.includes(matiere.id))
.map((matiere) => matiere.id)
const json = filteredIds.reduce((acc, id) => {
acc[id] = '0'
return acc
}, {})
const query2 = database.prepare(
'SELECT notes.*, matieres.* FROM notes JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_id = ? AND notes.etudiant_niveau = ?'
)
try {
let response2 = query2.all(id, niveau)
return response2
} catch (error) {
console.error('Error in query2:', error)
return error
}
}
/**
* Verify if a student has notes
* @returns {Promise<Array>} - Promise resolving to an array of notes or an empty array
*/
async function verifyEtudiantIfHeHasNotes() {
try {
// Prepare the query to filter by etudiant_id and etudiant_niveau
const query = database.prepare('SELECT DISTINCT etudiant_id, etudiant_niveau FROM notes')
// Execute the query with the provided parameters
const response = query.all()
// Return the response
return response
} catch (error) {
console.error('Error verifying student notes:', error)
throw error
}
}
/**
* function to show moyenne in screen
*
* @returns promise
*/
async function showMoyen(niveau, scolaire) {
const query = database.prepare(
`SELECT DISTINCT etudiant_id FROM notes WHERE etudiant_niveau = ? AND annee_scolaire = ?`
)
let etudiantWithNotes = await query.all(niveau, scolaire)
let allEtudiantWithNotes = []
const query2 = database.prepare(
'SELECT notes.*, etudiants.*, matieres.id, matieres.nom AS nomMat, matieres.credit FROM notes INNER JOIN etudiants ON (notes.etudiant_id = etudiants.id) INNER JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_id = ?'
)
try {
for (let index = 0; index < etudiantWithNotes.length; index++) {
allEtudiantWithNotes.push(query2.all(etudiantWithNotes[index].etudiant_id))
}
return allEtudiantWithNotes
} catch (error) {
return error
}
}
/**
* function used when updating note
* @param {Object} formData - The form data containing subject names and values
* @param {string} niveau - The student level
* @returns {Promise} - Promise resolving to the database response or an error
*/
async function updateNote(formData, niveau, id, mention_id, annee_scolaire) {
// Extract keys and values dynamically
const matiere_id = Object.keys(formData)
const values = Object.values(formData)
const query = database.prepare(
'UPDATE notes SET note= ? WHERE etudiant_id = ? AND etudiant_niveau = ? AND matiere_id = ?'
)
const clearFromRepech = database.prepare(
'DELETE FROM notesrepech WHERE etudiant_id = ? AND etudiant_niveau = ? AND matiere_id = ?'
)
const insertRepechQuery = database.prepare(
`INSERT INTO notesrepech (etudiant_id, matiere_id, etudiant_niveau, mention_id, note, annee_scolaire) VALUES (?, ?, ?, ?, ?, ?)`
)
const checkRepechQuery = database.prepare(
'SELECT * FROM notesrepech WHERE etudiant_id = ? AND matiere_id = ? AND etudiant_niveau = ?'
)
try {
let response
for (let index = 0; index < matiere_id.length; index++) {
let data = values[index]
if (typeof data === 'string') {
data = parseFloat(data.replace(',', '.'))
} else {
data = parseFloat(String(data).replace(',', '.'))
}
let check = await checkRepechQuery.get(id, matiere_id[index], niveau)
if (data < 10) {
if (!check) {
insertRepechQuery.run(id, matiere_id[index], niveau, mention_id, 0, annee_scolaire)
}
response = await query.run(data, id, niveau, matiere_id[index])
} else {
clearFromRepech.run(id, niveau, matiere_id[index])
response = await query.run(data, id, niveau, matiere_id[index])
}
}
return response
} catch (error) {
return error
}
}
async function blockShowMoyene() {
const query = database.prepare(
'SELECT DISTINCT etudiant_niveau, annee_scolaire FROM notes ORDER BY annee_scolaire DESC'
)
const queryMention = database.prepare('SELECT * FROM mentions')
try {
let response = await query.all()
let mention = await queryMention.all()
let niveau = response.map((item) => item.etudiant_niveau)
let annee_scolaire = response.map((item) => item.annee_scolaire)
const query2 = database.prepare(
`SELECT notes.*, etudiants.id AS etudiantsId, etudiants.mention_id AS mentionId, etudiants.niveau, matieres.* FROM notes INNER JOIN etudiants ON (notes.etudiant_id = etudiants.id) INNER JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_niveau = ? AND notes.annee_scolaire = ?`
)
let allData = []
for (let index = 0; index < niveau.length; index++) {
allData.push(await query2.all(niveau[index], annee_scolaire[index]))
}
return { response, allData, mention }
} catch (error) {
return error
}
}
/**
* get all note with matiere for single student
* @param {*} id
* @param {*} niveau
* @param {*} annee_scolaire
* @returns promise
*/
async function getMatiereAndNote(id, niveau, annee_scolaire) {
const query = database.prepare(
'SELECT * FROM notes INNER JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_id = ? AND notes.etudiant_niveau = ? AND notes.annee_scolaire = ?'
)
try {
let response = await query.all(id, niveau, annee_scolaire)
return response
} catch (error) {
return error
}
}
async function getNotesWithRepechToDisplay(id, anneescolaire, niveau) {
const queryNoteNormal = database.prepare(
'SELECT * FROM notes INNER JOIN matieres ON (notes.matiere_id = matieres.id) WHERE notes.etudiant_id = ? AND notes.annee_scolaire = ? AND notes.etudiant_niveau = ?'
)
let noteNormal = await queryNoteNormal.all(id, anneescolaire, niveau)
const queryNoteRepech = database.prepare(
'SELECT * FROM notesrepech INNER JOIN matieres ON (notesrepech.matiere_id = matieres.id) WHERE notesrepech.etudiant_id = ? AND notesrepech.annee_scolaire = ? AND notesrepech.etudiant_niveau = ?'
)
let noteRepech = await queryNoteRepech.all(id, anneescolaire, niveau)
const semestreQuery = database.prepare(
'SELECT * FROM semestres INNER JOIN matiere_semestre ON(semestres.id = matiere_semestre.semestre_id)'
)
let semestre = await semestreQuery.all()
return { noteNormal, noteRepech, semestre }
}
module.exports = {
insertNote,
getNote,
showMoyen,
getNoteOnline,
verifyEtudiantIfHeHasNotes,
updateNote,
blockShowMoyene,
getMatiereAndNote,
getNotesWithRepechToDisplay
}