import React, { useState, useEffect } from 'react'; import { api } from '../stores/api'; import PageHeader from '../components/PageHeader'; import SuccessCheck from '../components/SuccessCheck'; export default function RedigerPV() { const [reunions, setReunions] = useState([]); const [pvList, setPvList] = useState([]); const [propositions, setPropositions] = useState([]); const [reunionId, setReunionId] = useState(''); const [contenu, setContenu] = useState(''); const [decisions, setDecisions] = useState([]); const [loading, setLoading] = useState(true); const [success, setSuccess] = useState(false); const [viewPv, setViewPv] = useState(null); const [error, setError] = useState(''); useEffect(() => { Promise.all([ api.get('/presences/reunions'), api.get('/pv/'), api.get('/propositions/?statut=secondee'), ]).then(([r, p, props]) => { setReunions(r); setPvList(p); setPropositions(props); setLoading(false); }).catch(() => setLoading(false)); }, []); // Auto-renseigner les décisions depuis les propositions secondées const chargerPropositions = () => { if (propositions.length === 0) return; const decisionsAuto = propositions.map((p) => ({ sujet: p.sujet, decision: p.description || '', proposeur: p.proposeur_prenom, secondeur: p.secondeur_prenom || '', statut: 'en_attente', proposition_id: p.id, })); setDecisions((prev) => { // Ne pas dupliquer les propositions déjà ajoutées const existants = new Set(prev.map((d) => d.proposition_id).filter(Boolean)); const nouvelles = decisionsAuto.filter((d) => !existants.has(d.proposition_id)); return [...prev, ...nouvelles]; }); }; const ajouterDecision = () => { setDecisions([...decisions, { sujet: '', decision: '', proposeur: '', secondeur: '', statut: 'en_attente' }]); }; const updateDecision = (idx, field, value) => { const copy = [...decisions]; copy[idx][field] = value; setDecisions(copy); }; const supprimerDecision = (idx) => { setDecisions(decisions.filter((_, i) => i !== idx)); }; const handleSubmit = async () => { if (!reunionId) { setError("Sélectionnez une réunion d'affaires"); return; } if (!contenu.trim()) { setError('Le contenu du PV est obligatoire'); return; } setError(''); try { const validDecisions = decisions.filter((d) => d.sujet.trim()); await api.post('/pv/', { reunion_id: reunionId, contenu: contenu.trim(), decisions: validDecisions.length > 0 ? validDecisions : null, }); setSuccess(true); } catch (e) { setError(e.message); } }; if (success) return ; // Vue lecture d'un PV existant if (viewPv) { return (

Procès-verbal

{viewPv.date_reunion ? new Date(viewPv.date_reunion).toLocaleDateString('fr-CA') : ''}

Rédigé par {viewPv.redacteur_prenom}

{viewPv.approuve && ( Approuvé )}
{viewPv.contenu}
{viewPv.decisions && viewPv.decisions.length > 0 && (

Décisions

{viewPv.decisions.map((d, i) => (

{d.sujet}

{d.decision}

{d.proposeur && `Proposé par ${d.proposeur}`} {d.secondeur && `, secondé par ${d.secondeur}`}

))}
)}
); } return (
{/* PV existants */} {pvList.length > 0 && (

PV récents

{pvList.slice(0, 5).map((p) => ( ))}
)} {/* Nouveau PV */}

Nouveau procès-verbal