diff --git a/.env.example b/.env.example deleted file mode 100644 index 350f270..0000000 --- a/.env.example +++ /dev/null @@ -1,8 +0,0 @@ -PORT=3000 -JWT_SECRET=yourSuperSecretKey # Replace with your actual secret key - -# Database configuration -DB_HOST=localhost -DB_USER=root -DB_PASSWORD= -DB_NAME=api_isakafo \ No newline at end of file diff --git a/config/databases.js b/config/databases.js index ef3a6b5..9c20f51 100644 --- a/config/databases.js +++ b/config/databases.js @@ -27,7 +27,7 @@ async function initDB() { updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); `); - + // ajoute une autre table si necessaire // add a default admin user if none exists @@ -37,8 +37,8 @@ async function initDB() { const hashedPassword = await bcrypt.hash('admin123', 10); await connection.query( - 'INSERT INTO users (username, password, role) VALUES (?, ?, ?)', - ['admin', hashedPassword, 'admin'] + 'INSERT INTO users (user_name,user_email, user_password, user_role) VALUES (?, ?, ?, ? )', + ['admin','valerien@gmai.com' ,hashedPassword, 'admin'] ); console.log('✅ Default admin user created: admin / admin123'); diff --git a/controllers/staffsController.js b/controllers/staffsController.js new file mode 100644 index 0000000..6870b2d --- /dev/null +++ b/controllers/staffsController.js @@ -0,0 +1,126 @@ +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; +} diff --git a/routes/authRoute.js b/routes/authRoute.js index bcdacdc..531d786 100644 --- a/routes/authRoute.js +++ b/routes/authRoute.js @@ -11,7 +11,7 @@ router.post('/login', async (req, res) => { try { const [rows] = await pool.query( - 'SELECT * FROM users WHERE username = ?', + 'SELECT * FROM users WHERE user_name = ?', [username] ); @@ -21,7 +21,7 @@ router.post('/login', async (req, res) => { const user = rows[0]; - const isMatch = await bcrypt.compare(password, user.password); + const isMatch = await bcrypt.compare(password, user.user_password); if (!isMatch) { return res.status(401).json({ message: 'username or password incorect' }); diff --git a/routes/protectedRoute.js b/routes/protectedRoute.js index 206462a..45cd543 100644 --- a/routes/protectedRoute.js +++ b/routes/protectedRoute.js @@ -1,12 +1,18 @@ const express = require('express'); const authMiddleware = require('../middleware/authMiddleware'); const userController = require('../controllers/UserController'); - +const staffController = require('../controllers/staffsController'); const router = express.Router(); router.get('/profile', authMiddleware(), userController.getProfile); router.get('/admin', authMiddleware('admin'), userController.getAdminPage); router.post('/create', authMiddleware('admin'), userController.createUser); - +router.get('/staffs', authMiddleware(), staffController.index); +router.get('/staffs/create', authMiddleware('admin'), staffController.create); +router.post('/staffs/store', authMiddleware('admin'), staffController.store); +router.get('/staffs/:id/edit', authMiddleware(), staffController.edit); +router.post('/staffs/:id/update', authMiddleware('admin'), staffController.update); +router.get('/staffs/:id/contact', authMiddleware(), staffController.contact); +router.get('/staffs/:employeId/statut/:date', authMiddleware(), staffController.calculerStatutEmploye); module.exports = router;