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.
509 lines
12 KiB
509 lines
12 KiB
const { pool } = require('../database')
|
|
const { matiereSysteme } = require('../function/System')
|
|
|
|
/**
|
|
* function uset to create matiere
|
|
* @param {*} nom
|
|
* @returns Promise
|
|
*/
|
|
async function createMatiere(nom, credit, uniter, ue) {
|
|
const sql =
|
|
'INSERT INTO matieres (nom, unite_enseignement, credit, heure, ue) VALUES (?, ?, ?, ?, ?)'
|
|
|
|
const uniterHeure = 'SELECT uniter_heure FROM nessesaryTable'
|
|
let [rows] = await pool.query(uniterHeure)
|
|
const uniterHeureValue = rows[0].uniter_heure
|
|
const heure = credit * uniterHeureValue
|
|
try {
|
|
const [result] = await pool.query(sql, [nom, uniter, credit, heure, ue])
|
|
|
|
return {
|
|
success: true,
|
|
id: result.insertId
|
|
}
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
}
|
|
|
|
/**
|
|
* function to get all matieres
|
|
* @returns Promise
|
|
*/
|
|
async function getMatiere() {
|
|
const sql = 'SELECT m.*, n.nom AS niveau_nom FROM matieres m LEFT JOIN niveaus n ON m.niveau_id = n.id ORDER BY m.id DESC'
|
|
|
|
try {
|
|
let [rows] = await pool.query(sql)
|
|
|
|
return rows
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
}
|
|
|
|
async function displayMatiereFromForm(niveau, mention_id, parcours) {
|
|
// Fetch the semestre array
|
|
let semestre = await matiereSysteme(niveau) // Ensure this returns an array with at least 2 items
|
|
|
|
if (niveau !== 'L1') {
|
|
if (semestre.length < 2) {
|
|
console.error('Error: Semestre array does not contain enough elements.')
|
|
return
|
|
}
|
|
|
|
// Prepare the query
|
|
let matiereQuery = `
|
|
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
|
|
JOIN parcoursmatiere pm ON m.id = pm.matiere_id
|
|
JOIN parcours p ON pm.parcour_id = p.id
|
|
WHERE (s.nom LIKE ? OR s.nom LIKE ?)
|
|
AND ms.mention_id = ?
|
|
AND p.nom = ?
|
|
`
|
|
|
|
try {
|
|
// Execute the query with parameters
|
|
let [rows] = await pool.query(matiereQuery, [
|
|
`%${semestre[0]}%`,
|
|
`%${semestre[1]}%`,
|
|
mention_id,
|
|
parcours
|
|
])
|
|
|
|
// Log the response
|
|
return rows
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
} else {
|
|
if (semestre.length < 2) {
|
|
console.error('Error: Semestre array does not contain enough elements.')
|
|
return
|
|
}
|
|
|
|
// Prepare the query
|
|
let matiereQuery = `
|
|
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 = ?
|
|
`
|
|
|
|
try {
|
|
// Execute the query with parameters
|
|
let [rows] = await pool.query(matiereQuery, [
|
|
`%${semestre[0]}%`,
|
|
`%${semestre[1]}%`,
|
|
mention_id
|
|
])
|
|
|
|
// Log the response
|
|
return rows
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* function to get single matiere
|
|
* @param {*} id
|
|
* @returns promise
|
|
*/
|
|
async function getSingleMatiere(id) {
|
|
const sql = 'SELECT * FROM matieres WHERE id = ?'
|
|
|
|
try {
|
|
let [rows] = await pool.query(sql, [id])
|
|
|
|
return rows[0]
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
}
|
|
|
|
/**
|
|
* function used when updating matiere
|
|
* @param {*} nom
|
|
* @param {*} id
|
|
* @returns promise
|
|
*/
|
|
async function updateMatiere(nom, id, credit, uniter, ue) {
|
|
const sql =
|
|
'UPDATE matieres SET nom = ?, credit = ?, unite_enseignement = ?, heure = ?, ue = ? WHERE id = ?'
|
|
|
|
const uniterHeure = 'SELECT uniter_heure FROM nessesaryTable'
|
|
let [rows] = await pool.query(uniterHeure)
|
|
const uniterHeureValue = rows[0].uniter_heure
|
|
const heure = credit * uniterHeureValue
|
|
|
|
try {
|
|
let [result] = await pool.query(sql, [nom, credit, uniter, heure, ue, id])
|
|
|
|
if (result.affectedRows === 0) {
|
|
return {
|
|
success: false,
|
|
message: 'Année Scolaire non trouvé ou aucune modification effectuée.'
|
|
}
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
message: 'Année Scolaire mis à jour avec succès.'
|
|
}
|
|
} catch (error) {
|
|
return { success: false, error: 'Erreur veullez réeseyer' + error }
|
|
}
|
|
}
|
|
async function updateMatiereNiveau(formData) {
|
|
const { niveau_id, id } = formData; // ici id sera bien défini
|
|
const sql = 'UPDATE matieres SET niveau_id = ? WHERE id = ?';
|
|
|
|
try {
|
|
const [result] = await pool.query(sql, [niveau_id, id]);
|
|
|
|
if (result.affectedRows === 0) {
|
|
return {
|
|
success: false,
|
|
message: `Matière avec id ${id} non trouvée ou niveau déjà attribué.`
|
|
};
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
message: `Niveau de la matière ${id} mis à jour avec succès.`
|
|
};
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
error: 'Erreur lors de la mise à jour : ' + error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
async function deleteMatiere(id) {
|
|
console.log("id: ", id);
|
|
const sql = 'DELETE FROM matieres WHERE id = ?';
|
|
|
|
try {
|
|
let [result] = await pool.query(sql, [id]);
|
|
console.log("Résultat DELETE:", result);
|
|
|
|
if (result.affectedRows === 0) {
|
|
return {
|
|
success: false,
|
|
message: 'Matière non trouvée.'
|
|
};
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
message: 'Matière supprimée avec succès.'
|
|
};
|
|
} catch (error) {
|
|
console.log("err: ",+ error)
|
|
return { success: false, error: 'Erreur, veuillez réessayer: ' + error };
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Assign mentions to a matiere
|
|
* @param {Object} formData - keys = mention_ids, values = true/false
|
|
* @param {number} id - matiere_id
|
|
*/
|
|
async function asygnationToMention(formData, id) {
|
|
const selectedKeys = Object.keys(formData).filter((key) => formData[key])
|
|
|
|
if (selectedKeys.length === 0) {
|
|
return { success: false, error: 'No mentions selected.' }
|
|
}
|
|
|
|
// build placeholders like (?, ?, ?)
|
|
const placeholders = selectedKeys.map(() => '?').join(',')
|
|
|
|
const deleteMentionSql = `
|
|
DELETE FROM matiere_mention
|
|
WHERE matiere_id = ?
|
|
`
|
|
|
|
const deleteSemestreMentionSql = `
|
|
DELETE FROM matiere_semestre
|
|
WHERE matiere_id = ?
|
|
AND mention_id NOT IN (${placeholders})
|
|
`
|
|
|
|
const deleteNotesSql = `
|
|
DELETE FROM notes
|
|
WHERE matiere_id = ?
|
|
AND mention_id NOT IN (${placeholders})
|
|
`
|
|
|
|
const insertMentionSql = `
|
|
INSERT INTO matiere_mention (matiere_id, mention_id)
|
|
VALUES (?, ?)
|
|
`
|
|
|
|
try {
|
|
const connection = await pool.getConnection()
|
|
try {
|
|
await connection.beginTransaction()
|
|
|
|
// delete all from matiere_mention for this matiere
|
|
await connection.query(deleteMentionSql, [id])
|
|
|
|
// delete from matiere_semestre not in selected mentions
|
|
await connection.query(deleteSemestreMentionSql, [id, ...selectedKeys])
|
|
|
|
// delete from notes not in selected mentions
|
|
await connection.query(deleteNotesSql, [id, ...selectedKeys])
|
|
|
|
// re-insert new mentions
|
|
for (const mentionId of selectedKeys) {
|
|
await connection.query(insertMentionSql, [id, mentionId])
|
|
}
|
|
|
|
await connection.commit()
|
|
|
|
return { success: true }
|
|
} catch (error) {
|
|
await connection.rollback()
|
|
console.error(error)
|
|
return { success: false, error: error.message }
|
|
} finally {
|
|
connection.release()
|
|
}
|
|
} catch (connErr) {
|
|
console.error(connErr)
|
|
return { success: false, error: 'Database connection error.' }
|
|
}
|
|
}
|
|
|
|
async function getMentionMatiere(id) {
|
|
const sql = 'SELECT * FROM matiere_mention WHERE matiere_id = ?'
|
|
|
|
try {
|
|
let [rows] = await pool.query(sql, [id])
|
|
|
|
return rows
|
|
} catch (error) {
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function getMentionMatiereChecked(matiere_id) {
|
|
const getMentionMatiere = 'SELECT * FROM matiere_mention WHERE matiere_id = ?'
|
|
let [rows] = await pool.query(getMentionMatiere, [matiere_id])
|
|
let MentionArray = rows
|
|
let arrayID = []
|
|
|
|
for (let index = 0; index < MentionArray.length; index++) {
|
|
arrayID.push(MentionArray[index].mention_id)
|
|
}
|
|
|
|
const mentionQuery = `SELECT * FROM mentions WHERE id IN (${arrayID.map(() => '?').join(', ')})`
|
|
|
|
try {
|
|
let [rows] = await pool.query(mentionQuery, [...arrayID])
|
|
|
|
return rows
|
|
} catch (error) {
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function getSemestreMatiere(id) {
|
|
const sql = 'SELECT * FROM matiere_semestre WHERE matiere_id = ?'
|
|
|
|
try {
|
|
let [rows] = await pool.query(sql, [id])
|
|
|
|
return rows
|
|
} catch (error) {
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function getSemestre() {
|
|
const sql = 'SELECT * FROM semestres'
|
|
|
|
try {
|
|
let [rows] = await pool.query(sql)
|
|
|
|
return rows
|
|
} catch (error) {
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function insertUpdateMentionSemestre(matiere_id, formData) {
|
|
try {
|
|
const connection = await pool.getConnection()
|
|
|
|
try {
|
|
await connection.beginTransaction()
|
|
|
|
// Clear all old rows
|
|
const deleteSql = `
|
|
DELETE FROM matiere_semestre
|
|
WHERE matiere_id = ?
|
|
`
|
|
await connection.query(deleteSql, [matiere_id])
|
|
|
|
// Prepare INSERT
|
|
const insertSql = `
|
|
INSERT INTO matiere_semestre (matiere_id, semestre_id, mention_id)
|
|
VALUES (?, ?, ?)
|
|
`
|
|
|
|
// Insert new rows
|
|
for (const mention_id of Object.keys(formData)) {
|
|
for (const semestre_id of formData[mention_id]) {
|
|
await connection.query(insertSql, [matiere_id, semestre_id, mention_id])
|
|
}
|
|
}
|
|
|
|
await connection.commit()
|
|
|
|
return { success: true }
|
|
} catch (err) {
|
|
await connection.rollback()
|
|
console.error(err)
|
|
return { success: false, error: err.message }
|
|
} finally {
|
|
connection.release()
|
|
}
|
|
} catch (err) {
|
|
console.error(err)
|
|
return { success: false, error: 'Database connection failed.' }
|
|
}
|
|
}
|
|
|
|
async function getEnseignants() {
|
|
try {
|
|
const latestIdsSql = `
|
|
SELECT MAX(id) AS id
|
|
FROM matiereEnseignants
|
|
GROUP BY matiere_id
|
|
ORDER BY MAX(date) DESC
|
|
`
|
|
|
|
const [rows] = await pool.query(latestIdsSql)
|
|
|
|
const latestIds = rows.map((r) => r.id)
|
|
|
|
if (latestIds.length === 0) {
|
|
return []
|
|
}
|
|
|
|
// Build placeholders (?, ?, ?, …)
|
|
const placeholders = latestIds.map(() => `?`).join(`,`)
|
|
const fetchSql = `
|
|
SELECT *
|
|
FROM matiereEnseignants
|
|
WHERE id IN (${placeholders})
|
|
`
|
|
|
|
const [enseignants] = await pool.query(fetchSql, latestIds)
|
|
|
|
return enseignants
|
|
} catch (error) {
|
|
console.error(error)
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function insertNewProf(matiere_id, nom, prenom, contact, date) {
|
|
const sql = `
|
|
INSERT INTO matiereEnseignants
|
|
(matiere_id, nom_enseignant, prenom_enseignant, contact, date)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
`
|
|
|
|
try {
|
|
const [result] = await pool.query(sql, [matiere_id, nom, prenom, contact, date])
|
|
|
|
return {
|
|
success: true,
|
|
id: result.insertId
|
|
}
|
|
} catch (error) {
|
|
console.error(error)
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function getSIngleProf(matiere_id) {
|
|
const sql = `
|
|
SELECT *
|
|
FROM matiereEnseignants
|
|
WHERE matiere_id = ?
|
|
ORDER BY date DESC
|
|
LIMIT 1
|
|
`
|
|
|
|
try {
|
|
const [rows] = await pool.query(sql, [matiere_id])
|
|
return rows[0] || null
|
|
} catch (error) {
|
|
console.error(error)
|
|
return error
|
|
}
|
|
}
|
|
|
|
async function updateProf(matiere_id, nom, prenom, contact, date) {
|
|
const sql = `
|
|
UPDATE matiereEnseignants
|
|
SET nom_enseignant = ?,
|
|
prenom_enseignant = ?,
|
|
contact = ?,
|
|
date = ?
|
|
WHERE matiere_id = ?
|
|
`
|
|
|
|
try {
|
|
const [result] = await pool.query(sql, [nom, prenom, contact, date, matiere_id])
|
|
|
|
if (result.affectedRows === 0) {
|
|
return {
|
|
success: false,
|
|
message: 'Année Scolaire non trouvé.'
|
|
}
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
message: 'Année Scolaire supprimé avec succès.'
|
|
}
|
|
} catch (error) {
|
|
console.error(error)
|
|
return error
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
createMatiere,
|
|
getSIngleProf,
|
|
getMatiere,
|
|
getSingleMatiere,
|
|
updateMatiere,
|
|
updateMatiereNiveau,
|
|
displayMatiereFromForm,
|
|
deleteMatiere,
|
|
asygnationToMention,
|
|
getMentionMatiere,
|
|
getMentionMatiereChecked,
|
|
getSemestreMatiere,
|
|
getSemestre,
|
|
insertUpdateMentionSemestre,
|
|
getEnseignants,
|
|
insertNewProf,
|
|
updateProf
|
|
}
|
|
|