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.
 

126 lines
3.8 KiB

const { pool } = require('../config/databases');
// 📌 Afficher la liste des employés
exports.index = async (req, res) => {
try {
const [staffs] = await pool.query('SELECT * FROM staffs');
res.json(staffs);
} catch (err) {
res.status(500).json({ error: 'Erreur lors de la récupération des employés' });
}
};
// 📌 Afficher un employé pour modification
exports.edit = async (req, res) => {
const id = req.params.id;
try {
const [rows] = await pool.query('SELECT * FROM staffs WHERE id = ?', [id]);
if (rows.length === 0) {
return res.status(404).json({ message: 'Employé non trouvé' });
}
res.json(rows[0]);
} catch (err) {
res.status(500).json({ error: 'Erreur lors de la récupération de l\'employé' });
}
};
// 🖊️ Mettre à jour un employé
exports.update = async (req, res) => {
const id = req.params.id;
const data = req.body;
if (data.planning && typeof data.planning === 'object') {
data.planning = JSON.stringify(data.planning);
data.heures_semaine = calculerHeuresSemaine(req.body.planning);
}
try {
await pool.query('UPDATE staffs SET ? WHERE id = ?', [data, id]);
res.json({ message: 'Employé mis à jour avec succès' });
} catch (err) {
res.status(500).json({ error: 'Erreur lors de la mise à jour' });
}
};
// ➕ Afficher formulaire de création (en REST on ne fait rien ici)
exports.create = (req, res) => {
res.json({ message: 'Créer un nouvel employé' });
};
// 🗂️ Enregistrer un nouvel employé
exports.store = async (req, res) => {
const data = req.body;
// Gérer le champ "nouveau poste"
if (data.poste === 'nouveau_poste') {
if (!data.nouveau_poste || data.nouveau_poste.trim() === '') {
return res.status(400).json({ error: 'Le champ Nouveau poste est requis.' });
}
data.poste = data.nouveau_poste.trim();
}
// Convertir planning + calcul heures
if (data.planning && typeof data.planning === 'object') {
data.planning = JSON.stringify(data.planning);
data.heures_semaine = calculerHeuresSemaine(req.body.planning);
} else {
data.heures_semaine = 0;
}
data.performance = 0;
// Validation simple
if (!data.nom || !data.prenom || !data.poste || !data.telephone) {
return res.status(400).json({ error: 'Champs obligatoires manquants.' });
}
try {
await pool.query('INSERT INTO staffs SET ?', [data]);
res.status(201).json({ message: '✅ Employé ajouté avec succès' });
} catch (err) {
res.status(500).json({ error: 'Erreur lors de l\'ajout de l\'employé' });
}
};
// 📬 Simuler le contact de l’employé
exports.contact = (req, res) => {
const id = req.params.id;
// Logique simulée
res.json({ message: `Contact simulé avec l'employé ID ${id}` });
};
// 🧠 Calculer le statut de l’employé (présent/absent)
exports.calculerStatutEmploye = async (req, res) => {
const { employeId, date } = req.params;
try {
const [pointage] = await pool.query(
`SELECT * FROM pointages WHERE employe_id = ? AND date = ?`,
[employeId, date]
);
if (pointage.length === 0) return res.json({ statut: 'absent' });
const employePresent = pointage[0].heure_sortie === null ? 'present' : 'present';
res.json({ statut: employePresent });
} catch (err) {
res.status(500).json({ error: 'Erreur lors de la vérification du statut' });
}
};
// 🕒 Fonction utilitaire pour calculer les heures à partir du planning
function calculerHeuresSemaine(planning) {
let totalHeures = 0;
for (const jour in planning) {
const horaires = planning[jour];
if (horaires.de && horaires.a) {
const debut = new Date(`1970-01-01T${horaires.de}:00`);
const fin = new Date(`1970-01-01T${horaires.a}:00`);
const diffMs = fin - debut;
const heures = diffMs / (1000 * 60 * 60);
if (heures > 0) totalHeures += heures;
}
}
return totalHeures;
}