import React, { useState, useEffect } from 'react'; import { api } from '../stores/api'; import { useStore } from '../stores/store'; import PageHeader from '../components/PageHeader'; const STATUTS = { proposee: { label: 'À seconder', cls: 'bg-yellow-100 text-yellow-700' }, secondee: { label: 'Secondée', cls: 'bg-blue-100 text-blue-700' }, adoptee: { label: 'Résolution', cls: 'bg-green-100 text-green-700' }, rejetee: { label: 'Rejetée', cls: 'bg-red-100 text-red-700' }, }; const TYPES = { proposition: 'Proposition', resolution: 'Résolution', generale: 'Résolution', nomination: 'Nomination', contribution: 'Contribution', }; export default function Decisions() { const { postes } = useStore(); const [propositions, setPropositions] = useState([]); const [resolutions, setResolutions] = useState([]); const [tab, setTab] = useState('cours'); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [msg, setMsg] = useState(''); const [sujet, setSujet] = useState(''); const [description, setDescription] = useState(''); const [resolutionId, setResolutionId] = useState(''); const [resolutionForm, setResolutionForm] = useState({}); const estExecutif = postes.some((p) => ['RSG', 'RSG Substitut(e)', 'Trésorier(ière)', 'Secrétaire'].includes(p) ); const charger = async () => { setLoading(true); try { const [props, res] = await Promise.all([ api.get('/propositions/?limite=100'), api.get('/propositions/resolutions'), ]); setPropositions(props); setResolutions(res); if (res.length > 0 && !resolutionId) setResolutionId(res[0].id); } catch (e) { setError(e.message); } setLoading(false); }; useEffect(() => { charger(); }, []); const flash = (m) => { setMsg(m); setTimeout(() => setMsg(''), 2500); }; const soumettre = async () => { if (!sujet.trim()) { setError('Le sujet est obligatoire'); return; } setError(''); try { await api.post('/propositions/', { sujet: sujet.trim(), description: description.trim() || null, }); setSujet(''); setDescription(''); setTab('cours'); flash('Proposition soumise'); await charger(); } catch (e) { setError(e.message); } }; const seconder = async (id) => { setError(''); try { await api.post(`/propositions/${id}/seconder`); flash('Proposition secondée'); await charger(); } catch (e) { setError(e.message); } }; const mettreAJourResolution = (id, champ, valeur) => { setResolutionForm({ ...resolutionForm, [id]: { ...(resolutionForm[id] || {}), [champ]: valeur }, }); }; const transformer = async (id) => { setError(''); const form = resolutionForm[id] || {}; const etantDonneQue = (form.etant_donne_que || '').trim(); const groupeADecideDe = (form.groupe_a_decide_de || '').trim(); if (!etantDonneQue || !groupeADecideDe) { setError('Les sections "ÉTANT DONNÉ QUE" et "LE GROUPE A DÉCIDÉ DE" sont obligatoires'); return; } try { await api.patch(`/propositions/${id}/voter`, { statut: 'adoptee', etant_donne_que: etantDonneQue, groupe_a_decide_de: groupeADecideDe, }); setResolutionForm({ ...resolutionForm, [id]: { etant_donne_que: '', groupe_a_decide_de: '' } }); flash('Résolution créée'); await charger(); } catch (e) { setError(e.message); } }; const rejeter = async (id) => { setError(''); try { await api.patch(`/propositions/${id}/voter`, { statut: 'rejetee' }); flash('Proposition rejetée'); await charger(); } catch (e) { setError(e.message); } }; const enCours = propositions.filter((p) => ['proposee', 'secondee'].includes(p.statut)); const resolutionChoisie = resolutions.find((r) => r.id === resolutionId); if (loading) return
Chargement...
📌
Aucune décision en cours
{p.sujet}
{p.description &&{p.description}
}Proposée par {p.proposeur_prenom}
{p.secondeur_prenom &&Secondée par {p.secondeur_prenom}
}📜
Aucune résolution
{resolutionChoisie.numero_resolution || 'Résolution'}
{resolutionChoisie.sujet}
{resolutionChoisie.description}
}Type : {TYPES[resolutionChoisie.type_proposition] || resolutionChoisie.type_proposition}
Date : {resolutionChoisie.date_adoption || resolutionChoisie.date_vote || resolutionChoisie.cree_le?.slice(0, 10) || '—'}
Proposée par {resolutionChoisie.proposeur_prenom}
{resolutionChoisie.secondeur_prenom &&Secondée par {resolutionChoisie.secondeur_prenom}
}Texte de la résolution
{resolutionChoisie.etant_donne_que && (ÉTANT DONNÉ QUE{'\n'}{resolutionChoisie.etant_donne_que}
)} {resolutionChoisie.groupe_a_decide_de && (LE GROUPE A DÉCIDÉ DE{'\n'}{resolutionChoisie.groupe_a_decide_de}
)} {!resolutionChoisie.etant_donne_que && !resolutionChoisie.groupe_a_decide_de && ({resolutionChoisie.note}
)}