popremplissgeprofil
This commit is contained in:
@@ -5237,8 +5237,10 @@ app.post('/api/profil/documents/:type', authenticateToken, upload.single('file')
|
||||
`);
|
||||
|
||||
// Notifier les Finance du même campus
|
||||
const typeLabels = { rib: 'RIB', cartegrise: 'Carte grise', permis: 'Permis de conduire' };
|
||||
const campusNorm = normalizeCampus(campus);
|
||||
// Notifier les Finance du même campus
|
||||
const typeLabels = { rib: 'RIB', cartegrise: 'carte grise', permis: 'permis de conduire' };
|
||||
const typeLabelsAvecArticle = { rib: 'son RIB', cartegrise: 'sa carte grise', permis: 'son permis de conduire' };
|
||||
const campusNorm = normalizeCampus(campus);
|
||||
const financeResult = await pool.request()
|
||||
.input('campus', sql.NVarChar, campusNorm ? `%${campusNorm}%` : '%')
|
||||
.query(`
|
||||
@@ -5249,29 +5251,29 @@ WHERE r.role IN ('Finance', 'VerificateurFinance') AND r.actif = 1
|
||||
AND c.campus LIKE @campus AND c.Actif = 1
|
||||
`);
|
||||
|
||||
const frontendUrl = process.env.FRONTEND_URL || 'https://myndf.ensup-adm.net';
|
||||
for (const finance of financeResult.recordset) {
|
||||
try {
|
||||
await creerNotification({
|
||||
destinataireId: finance.id,
|
||||
destinataireEmail: finance.email,
|
||||
type: 'validationdoc',
|
||||
titre: `Document à valider — ${prenom} ${nom}`,
|
||||
message: `${prenom} ${nom} (${campus}) a soumis son ${typeLabels[type]} pour validation.`,
|
||||
noteId: null
|
||||
});
|
||||
} catch (e) { console.error('Notif BDD Finance doc', e.message); }
|
||||
try {
|
||||
await sendMailGraph(
|
||||
finance.email,
|
||||
`Document à valider — ${typeLabels[type]} de ${prenom} ${nom}`,
|
||||
`<div style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto">
|
||||
const frontendUrl = process.env.FRONTEND_URL || 'https://myndf.ensup-adm.net';
|
||||
for (const finance of financeResult.recordset) {
|
||||
try {
|
||||
await creerNotification({
|
||||
destinataireId: finance.id,
|
||||
destinataireEmail: finance.email,
|
||||
type: 'validationdoc',
|
||||
titre: `Document à valider — ${prenom} ${nom}`,
|
||||
message: `${prenom} ${nom} (${campus}) a soumis ${typeLabelsAvecArticle[type]} pour validation.`,
|
||||
noteId: null
|
||||
});
|
||||
} catch (e) { console.error('Notif BDD Finance doc', e.message); }
|
||||
try {
|
||||
await sendMailGraph(
|
||||
finance.email,
|
||||
`Document à valider — ${typeLabels[type]} de ${prenom} ${nom}`,
|
||||
`<div style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto">
|
||||
<div style="background:linear-gradient(135deg,#6366f1,#4f46e5);color:white;padding:24px;border-radius:12px 12px 0 0">
|
||||
<h2 style="margin:0">Document à valider</h2>
|
||||
</div>
|
||||
<div style="padding:24px;background:#f8fafc;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 12px 12px">
|
||||
<p>Bonjour <strong>${finance.prenom} ${finance.nom}</strong>,</p>
|
||||
<p><strong>${prenom} ${nom}</strong> (${campus}) a soumis son <strong>${typeLabels[type]}</strong> en attente de votre validation.</p>
|
||||
<p><strong>${prenom} ${nom}</strong> (${campus}) a soumis ${typeLabelsAvecArticle[type]} en attente de votre validation.</p>
|
||||
<div style="text-align:center;margin-top:24px">
|
||||
<a href="${frontendUrl}" style="background:#6366f1;color:white;padding:13px 28px;text-decoration:none;border-radius:8px;font-weight:700">
|
||||
Valider les documents
|
||||
@@ -5308,6 +5310,39 @@ app.delete('/api/profil/documents/:type', authenticateToken, async (req, res) =>
|
||||
});
|
||||
|
||||
|
||||
// GET /api/finance/documents-historique — Finance voit l'historique des docs traités (validés/refusés)
|
||||
app.get('/api/finance/documents-historique', authenticateToken, async (req, res) => {
|
||||
if (!hasAnyRole(req.user, 'Finance', 'VerificateurFinance', 'superUtilisateur'))
|
||||
return res.status(403).json({ error: 'Accès réservé Finance' });
|
||||
try {
|
||||
const request = pool.request();
|
||||
let campusFilter = '';
|
||||
if (req.user.campus && !hasAnyRole(req.user, 'superUtilisateur')) {
|
||||
const campusCode = normalizeCampus(req.user.campus);
|
||||
if (campusCode) {
|
||||
request.input('campus', sql.NVarChar, `%${campusCode}%`);
|
||||
campusFilter = 'AND c.campus LIKE @campus';
|
||||
}
|
||||
}
|
||||
const result = await request.query(`
|
||||
SELECT d.id, d.collaborateurId, d.type, d.fileName, d.sharepointUrl,
|
||||
d.dateUpload, d.DateModification, d.statut, d.commentaire,
|
||||
d.dateValidation, d.validePar,
|
||||
c.prenom, c.nom, c.email, c.campus, c.departement,
|
||||
v.prenom + ' ' + v.nom AS validateurNom
|
||||
FROM DocumentsCollaborateur d
|
||||
JOIN CollaborateurAD c ON c.id = d.collaborateurId
|
||||
LEFT JOIN CollaborateurAD v ON v.id = d.validePar
|
||||
WHERE d.statut IN ('valide', 'refuse') ${campusFilter}
|
||||
ORDER BY d.dateValidation DESC, d.DateModification DESC
|
||||
`);
|
||||
res.json(result.recordset);
|
||||
} catch (error) {
|
||||
console.error('GET /api/finance/documents-historique:', error.message);
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// GET /api/finance/documents-a-valider — Finance voit les docs en_attente de son campus
|
||||
app.get('/api/finance/documents-a-valider', authenticateToken, async (req, res) => {
|
||||
if (!hasAnyRole(req.user, 'Finance', 'VerificateurFinance', 'superUtilisateur'))
|
||||
|
||||
Reference in New Issue
Block a user