5 changed files with 139 additions and 15 deletions
@ -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 |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
|
|||
Loading…
Reference in new issue