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, estExecutif } = useStore(); const [propositions, setPropositions] = useState([]); const [resolutions, setResolutions] = useState([]); const [membres, setMembres] = 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 [resolutionForm, setResolutionForm] = useState({}); const [seconderPour, setSeconderPour] = useState({}); const [decisionOuverte, setDecisionOuverte] = useState(null); const peutExecutif = 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, membresActifs] = await Promise.all([ api.get('/propositions/?limite=100'), api.get('/propositions/resolutions'), api.get('/membres/actifs'), ]); setPropositions(props); setResolutions(res); setMembres(membresActifs); } catch (e) { setError(e.message); } setLoading(false); }; useEffect(() => { charger(); }, []); const flash = (m) => { setMsg(m); setTimeout(() => setMsg(''), 2500); }; const soumettre = async () => { if (!sujet.trim()) { setError("L'objet 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, membreId = '') => { setError(''); try { const query = membreId ? `?membre_id=${membreId}` : ''; await api.post(`/propositions/${id}/seconder${query}`); 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(''); const form = resolutionForm[id] || {}; const etantDonneQue = (form.etant_donne_que || '').trim(); if (!etantDonneQue) { setError('La section "ÉTANT DONNÉ QUE" est obligatoire pour rejeter une proposition'); return; } try { await api.patch(`/propositions/${id}/voter`, { statut: 'rejetee', etant_donne_que: etantDonneQue, }); flash('Proposition rejetée'); await charger(); } catch (e) { setError(e.message); } }; const enCours = propositions.filter((p) => ['proposee', 'secondee'].includes(p.statut)); 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
{decision.description}
}Type : {TYPES[decision.type_decision] || decision.type_decision}
Date : {decision.date_adoption || decision.date_vote || decision.cree_le?.slice(0, 10) || '—'}
Proposée par {decision.proposeur_prenom}
{decision.secondeur_prenom &&Secondée par {decision.secondeur_prenom}
}{decision.statut === 'rejetee' ? 'Motif conservé' : 'Texte de la résolution'}
{decision.etant_donne_que && (ÉTANT DONNÉ QUE{'\n'}{decision.etant_donne_que}
)} {decision.groupe_a_decide_de && (LE GROUPE A DÉCIDÉ DE{'\n'}{decision.groupe_a_decide_de}
)} {!decision.etant_donne_que && !decision.groupe_a_decide_de && ({decision.note}
)}