commit
This commit is contained in:
parent
5b051acb4c
commit
8735df5b43
@ -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
|
||||
@ -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');
|
||||
|
||||
126
controllers/staffsController.js
Normal file
126
controllers/staffsController.js
Normal file
@ -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;
|
||||
}
|
||||
@ -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' });
|
||||
|
||||
@ -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
Block a user