+ {/* ————— Les quatre nombres du trésorier ————— */}
+
+ 1 ? "s" : ""}`} />
+
+
+ 1 ? "s" : ""} encaissée${totaux.aRattraperCount > 1 ? "s" : ""}`}
+ accent={totaux.aRattraperCount > 0 ? "alerte" : "bon"}
+ />
+
+
+ {(totaux.ecartCount > 0 || totaux.nonPointeesCount > 0) && (
+
+
+
+ {totaux.ecartCount > 0 &&
+ `${totaux.ecartCount} adhésion${totaux.ecartCount > 1 ? "s sont comptabilisées" : " est comptabilisée"} pour un montant différent de la fiche. `}
+ {totaux.nonPointeesCount > 0 &&
+ `${totaux.nonPointeesCount} figure${totaux.nonPointeesCount > 1 ? "nt" : ""} dans les comptes sans être marquée${totaux.nonPointeesCount > 1 ? "s" : ""} réglée${totaux.nonPointeesCount > 1 ? "s" : ""} sur la fiche.`}
+
+
+ )}
+
+ {impossible ? (
+
+
+
+ ) : (
+
+
+ setGeste("pointer")}
+ />
+ 1 ? "s" : ""} à porter aux comptes`}
+ onClick={() => setGeste("reprise")}
+ />
+
+
+ {geste === "pointer" ? (
+
+
+ Un reversement HelloAsso ou une remise de chèques arrive en une
+ seule ligne sur le compte. Choisissez l’écriture, cochez les
+ familles qu’elle couvre : le total coché doit retomber sur son
+ montant.
+
+
+
+ choisirEcriture(e.target.value)}
+ >
+ Choisir une recette…
+ {ecrituresRecette.map((e) => (
+
+ {new Date(e.occurredAt).toLocaleDateString("fr-FR")} ·{" "}
+ {e.label} · {euros(e.amountCents)}
+ {e.affecteCents > 0
+ ? ` · ${euros(e.affecteCents)} déjà pointés`
+ : ""}
+
+ ))}
+
+
+
+ {ecriture && (
+ <>
+
+
+ {Object.keys(coches).length} adhésion
+ {Object.keys(coches).length > 1 ? "s" : ""} cochée
+ {Object.keys(coches).length > 1 ? "s" : ""} ·{" "}
+
+ {euros(totalCoche)}
+ {" "}
+ sur {euros(ecriture.amountCents)}
+
+
+ {reste === 0
+ ? "Le compte y est"
+ : reste > 0
+ ? `${euros(reste)} non affectés`
+ : `${euros(-reste)} de trop`}
+
+
+
+
+
+ Cocher les règlements reçus
+
+ setCoches({})}
+ >
+ Tout décocher
+
+
+
+
+
+
+ {enCours ? (
+
+ ) : (
+
+ )}
+ Enregistrer le pointage
+
+ >
+ )}
+
+ ) : (
+
+ {aRattraper.length === 0 ? (
+
+ ) : (
+ <>
+
+ {aRattraper.length} adhésion
+ {aRattraper.length > 1 ? "s sont marquées réglées" : " est marquée réglée"}{" "}
+ sur {aRattraper.length > 1 ? "leurs fiches" : "sa fiche"} sans
+ figurer dans les comptes, soit{" "}
+
+ {euros(totaux.aRattraperCents)}
+
+ . Les écritures créées ici naissent en brouillon : vous les
+ relisez, puis vous les validez.
+
+
+
+
+
+ setMode(e.target.value as "groupee" | "par_adherent")
+ }
+ >
+
+ Une écriture groupée ({euros(totaux.aRattraperCents)})
+
+
+ Une écriture par adhérent ({aRattraper.length})
+
+
+
+
+ setCompteId(e.target.value)}
+ >
+ {comptes.map((c) => (
+
+ {c.name}
+
+ ))}
+
+
+
+ setCategorieId(e.target.value)}
+ >
+ {categoriesRecette.map((c) => (
+
+ {c.name}
+
+ ))}
+
+
+
+ setDate(e.target.value)}
+ />
+
+
+ setLibelle(e.target.value)}
+ maxLength={200}
+ />
+
+
+
+
+ {enCours ? (
+
+ ) : (
+
+ )}
+ Porter {aRattraper.length} adhésion
+ {aRattraper.length > 1 ? "s" : ""} aux comptes
+
+ >
+ )}
+
+ )}
+
+ )}
+
+ {/* ————— L'état, adhérent par adhérent ————— */}
+
+
+
+ Adhérent par adhérent · {anneeCourante}
+
+ {annees.length > 1 && (
+
+ {
+ const url = new URL(window.location.href);
+ url.searchParams.set("annee", e.target.value);
+ router.push(`${url.pathname}${url.search}`);
+ }}
+ aria-label="Année scolaire"
+ >
+ {annees.map((a) => (
+
+ {a}
+
+ ))}
+
+
+ )}
+
+
+ {lignes.length === 0 ? (
+
+
+
+ ) : (
+
+ {lignes.map((ligne) => (
+
+
+
+ {ligne.nom}
+
+ {ligne.ecritures.length > 0 && (
+
+ {ligne.ecritures.map((e) => e.label).join(" · ")}
+
+ )}
+
+
+ {ETATS[ligne.etat].texte}
+
+
+ {euros(ligne.duCents)}
+
+
+ ))}
+
+ )}
+
+
+ );
+}
+
+function Chiffre({
+ titre,
+ valeur,
+ aide,
+ accent,
+}: {
+ titre: string;
+ valeur: string;
+ aide: string;
+ accent?: "bon" | "alerte";
+}) {
+ return (
+