feat(membre): add certificat make date

This commit is contained in:
Thibaut Valentin 2025-01-17 10:56:46 +01:00
parent f637300e87
commit 8623275854
3 changed files with 66 additions and 20 deletions

View File

@ -41,6 +41,7 @@ import org.hibernate.reactive.mutiny.Mutiny;
import java.io.*;
import java.nio.file.Files;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Objects;
@ -438,11 +439,27 @@ public class MembreService {
photoCell.setBorder(PdfPCell.NO_BORDER);
memberTable.addCell(photoCell);
String[] cert;
if (licence.getCertificate() != null && !licence.getCertificate().isBlank()) {
cert = licence.getCertificate().split("¤");
if (cert.length <= 1){
cert = new String[]{licence.getCertificate(), "--"};
}else{
try {
cert[1] = sdf.format(new SimpleDateFormat("yyyy-MM-dd").parse(cert[1]));
} catch (ParseException e) {
cert[1] = "--";
}
}
} else {
cert = new String[]{"--", "--"};
}
// Adding member details
memberTable.addCell(new Phrase("NOM : " + m.getLname().toUpperCase(), bodyFont));
memberTable.addCell(new Phrase("Prénom : " + m.getFname(), bodyFont));
memberTable.addCell(new Phrase("Licence n° : " + m.getLicence(), bodyFont));
memberTable.addCell(new Phrase("Certificat médical par Dr " + licence.getCertificate(), bodyFont));
memberTable.addCell(new Phrase("Certificat médical par " + cert[0] + ", le " + cert[1], bodyFont));
memberTable.addCell(new Phrase("")); // Empty cell for spacing
document.add(memberTable);

View File

@ -4,9 +4,7 @@ import {useEffect, useReducer, useState} from "react";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faPen} from "@fortawesome/free-solid-svg-icons";
import {AxiosError} from "../../../components/AxiosError.jsx";
import {CheckField, TextField} from "../../../components/MemberCustomFiels.jsx";
import {apiAxios, errFormater, getSaison} from "../../../utils/Tools.js";
import {Input} from "../../../components/Input.jsx";
import {toast} from "react-toastify";
function licenceReducer(licences, action) {
@ -93,6 +91,7 @@ function sendLicence(event, dispatch) {
event.preventDefault();
const formData = new FormData(event.target);
formData.set('certificate', `${event.target.certificateBy?.value}¤${event.target.certificateDate?.value}`)
formData.set('licence', event.target.licence?.value?.length > 0 ? event.target.licence?.value : null)
toast.promise(
@ -132,14 +131,18 @@ function removeLicence(id, dispatch) {
function ModalContent({licence, dispatch}) {
const [saison, setSaison] = useState(0)
const [certificate, setCertificate] = useState("")
const [certificateBy, setCertificateBy] = useState("")
const [certificateDate, setCertificateDate] = useState("")
const [validate, setValidate] = useState(false)
const [isNew, setNew] = useState(true)
const setSeason = (event) => {
setSaison(Number(event.target.value))
}
const handleCertificateChange = (event) => {
setCertificate(event.target.value);
const handleCertificateByChange = (event) => {
setCertificateBy(event.target.value.replaceAll('¤', ''));
}
const handleCertificateDateChange = (event) => {
setCertificateDate(event.target.value.replaceAll('¤', ''));
}
const handleValidateChange = (event) => {
setValidate(event.target.value === 'true');
@ -149,12 +152,14 @@ function ModalContent({licence, dispatch}) {
if (licence.id !== -1) {
setNew(false)
setSaison(licence.saison)
setCertificate(licence.certificate)
setCertificateBy(licence.certificate.split('¤')[0])
setCertificateDate(licence.certificate.split('¤')[1])
setValidate(licence.validate)
} else {
setNew(true)
setSaison(getSaison())
setCertificate("")
setCertificateBy("")
setCertificateDate("")
setValidate(false)
}
}, [licence]);
@ -178,9 +183,15 @@ function ModalContent({licence, dispatch}) {
<span className="input-group-text" id="basic-addon2">{saison + 1}</span>
</div>
<span>Médecin figurant sur le certificat médical</span>
<TextField name="certificate" text="Nom" value={certificate}
onChange={handleCertificateChange} required={false}/>
<span>Certificat médical</span>
<div className="input-group mb-3 ">
<span className="input-group-text" id="basic-addon2">Fait par</span>
<input type="text" className="form-control" placeholder="Fait par" name="certificateBy"
aria-label="Fait par" aria-describedby="basic-addon2" value={certificateBy} onChange={handleCertificateByChange}/>
<span className="input-group-text" id="basic-addon2">, le</span>
<input type="date" className="form-control" placeholder="jj/mm/aaaa" name="certificateDate"
aria-describedby="basic-addon2" value={certificateDate} onChange={handleCertificateDateChange}/>
</div>
<RadioGroupeOnOff name="validate" text="Validation de la licence" value={validate}
onChange={handleValidateChange}/>
</div>

View File

@ -7,7 +7,6 @@ import {AxiosError} from "../../../components/AxiosError.jsx";
import {apiAxios, errFormater, getSaison} from "../../../utils/Tools.js";
import {toast} from "react-toastify";
import {ColoredText} from "../../../components/ColoredCircle.jsx";
import {TextField} from "../../../components/MemberCustomFiels.jsx";
function licenceReducer(licences, action) {
switch (action.type) {
@ -91,6 +90,8 @@ function sendLicence(event, dispatch) {
event.preventDefault();
const formData = new FormData(event.target);
formData.set('certificate', `${event.target.certificateBy?.value}¤${event.target.certificateDate?.value}`)
toast.promise(
apiAxios.post(`/licence/club/${formData.get('membre')}`, formData),
{
@ -127,20 +128,31 @@ function removeLicence(id, dispatch) {
}
function ModalContent({licence, dispatch}) {
const [certificate, setCertificate] = useState("")
const [certificateBy, setCertificateBy] = useState("")
const [certificateDate, setCertificateDate] = useState("")
const [isNew, setNew] = useState(true)
const handleCertificateChange = (event) => {
setCertificate(event.target.value);
const handleCertificateByChange = (event) => {
setCertificateBy(event.target.value.replaceAll('¤', ''));
}
const handleCertificateDateChange = (event) => {
setCertificateDate(event.target.value.replaceAll('¤', ''));
}
useEffect(() => {
if (licence.id !== -1) {
setNew(false)
setCertificate(licence.certificate)
if (licence.certificate === null){
setCertificateBy("")
setCertificateDate("")
}else {
setCertificateBy(licence.certificate.split('¤')[0])
setCertificateDate(licence.certificate.split('¤')[1])
}
} else {
setNew(true)
setCertificate("")
setCertificateBy("")
setCertificateDate("")
}
}, [licence]);
@ -157,9 +169,15 @@ function ModalContent({licence, dispatch}) {
aria-label="Close"></button>
</div>
<div className="modal-body">
<span>Médecin figurant sur le certificat médical</span>
<TextField name="certificate" text="Nom" value={certificate}
onChange={handleCertificateChange} required={false} disabled={!currentSaison || licence.validate}/>
<span>Certificat médical</span>
<div className="input-group mb-3 ">
<span className="input-group-text" id="basic-addon2">Fait par</span>
<input type="text" className="form-control" placeholder="Fait par" name="certificateBy"
aria-label="Fait par" aria-describedby="basic-addon2" value={certificateBy} onChange={handleCertificateByChange}/>
<span className="input-group-text" id="basic-addon2">, le</span>
<input type="date" className="form-control" placeholder="jj/mm/aaaa" name="certificateDate"
aria-describedby="basic-addon2" value={certificateDate} onChange={handleCertificateDateChange}/>
</div>
<div className="input-group mb-3 justify-content-md-center">
<div>Validation de la licence: <ColoredText boolean={licence.validate}/></div>