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...

; return (
{msg &&
{msg}
} {error &&
{error}
}
{[ ['cours', `En cours (${enCours.length})`], ['nouvelle', 'Soumettre'], ['historique', `Résolutions (${resolutions.length})`], ].map(([val, label]) => ( ))}
{tab === 'cours' && ( enCours.length === 0 ? (

📌

Aucune décision en cours

) : (
{enCours.map((p) => { const statut = STATUTS[p.statut] || STATUTS.proposee; const form = resolutionForm[p.id] || {}; const resolutionComplete = (form.etant_donne_que || '').trim() && (form.groupe_a_decide_de || '').trim(); const motifRejetPresent = (form.etant_donne_que || '').trim(); return (

{p.sujet}

{p.description &&

{p.description}

}
{statut.label}

Proposée par {p.proposeur_prenom}

{p.secondeur_prenom &&

Secondée par {p.secondeur_prenom}

}
{p.statut === 'proposee' && (
{peutExecutif && (