This commit is contained in:
parent
e008933a01
commit
9964e964ce
@ -1,27 +1,25 @@
|
||||
package com.triz.trizservice.bean;
|
||||
|
||||
import com.triz.trizservice.modeles.Centre;
|
||||
import com.triz.trizservice.modeles.Examen;
|
||||
import com.triz.trizservice.modeles.Machine;
|
||||
import com.triz.trizservice.modeles.ServiceUser;
|
||||
import com.triz.trizservice.modeles.TypeMachine;
|
||||
import com.triz.trizservice.security.impl.PingService;
|
||||
import com.triz.trizservice.service.TransactionService;
|
||||
import com.triz.util.UtilContext;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.faces.application.FacesMessage;
|
||||
import javax.faces.bean.ManagedBean;
|
||||
import javax.faces.bean.ViewScoped;
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.primefaces.PrimeFaces;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
@ -33,14 +31,15 @@ public class DicomPacsBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// TODO : remplacer par l'injection du DAO réel (DaoServiceImpl / EJB)
|
||||
// quand le mapping table sera défini.
|
||||
// ============================================================
|
||||
// ATTRIBUTS
|
||||
// ============================================================
|
||||
private List<Machine> machines;
|
||||
private Machine selectedMachine;
|
||||
|
||||
private Centre centre;
|
||||
private ServiceUser user;
|
||||
|
||||
private Date dernierMajOrthanc;
|
||||
private String etatMwlScp;
|
||||
private Date dernierEtudeRecu;
|
||||
|
||||
@ -53,141 +52,451 @@ public class DicomPacsBean implements Serializable {
|
||||
@Autowired
|
||||
private PingService pingService;
|
||||
|
||||
// ============================================================
|
||||
// INITIALISATION
|
||||
// ============================================================
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
|
||||
centre = context.getCurrentEtablissement();
|
||||
user = context.getCurrentUser();
|
||||
|
||||
machines = new ArrayList<>();
|
||||
|
||||
if (centre != null) {
|
||||
machines = service.getAllByCentre(Machine.class, centre);
|
||||
}
|
||||
|
||||
selectedMachine = new Machine();
|
||||
context.saveNewManipulation("Machine", "", "Consulter Machine", new Date(), new Date(), user, "", "");
|
||||
// Valeurs d'en-tête neutres pour l'instant (pas de source de données branchée)
|
||||
dernierMajOrthanc = null;
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Manipulation : consultation de la liste des machines
|
||||
// --------------------------------------------------------
|
||||
context.saveNewManipulation(
|
||||
"Machine",
|
||||
"",
|
||||
"CONSULTATION Machine",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Etat MWL / SCP
|
||||
// --------------------------------------------------------
|
||||
etatMwlScp = "Actif";
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Dernière étude reçue
|
||||
// --------------------------------------------------------
|
||||
dernierEtudeRecu = null;
|
||||
|
||||
if (centre != null) {
|
||||
|
||||
Examen examen = service.getLastExamenByCentre(centre);
|
||||
|
||||
if (examen != null) {
|
||||
|
||||
Calendar calDate = Calendar.getInstance();
|
||||
calDate.setTime(examen.getDate());
|
||||
|
||||
Calendar calHeure = Calendar.getInstance();
|
||||
calHeure.setTime(examen.getHeureDebut());
|
||||
|
||||
calDate.set(
|
||||
Calendar.HOUR_OF_DAY,
|
||||
calHeure.get(Calendar.HOUR_OF_DAY)
|
||||
);
|
||||
|
||||
calDate.set(
|
||||
Calendar.MINUTE,
|
||||
calHeure.get(Calendar.MINUTE)
|
||||
);
|
||||
|
||||
calDate.set(
|
||||
Calendar.SECOND,
|
||||
calHeure.get(Calendar.SECOND)
|
||||
);
|
||||
|
||||
calDate.set(
|
||||
Calendar.MILLISECOND,
|
||||
0
|
||||
);
|
||||
|
||||
dernierEtudeRecu = calDate.getTime();
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Démarrage du ping
|
||||
// --------------------------------------------------------
|
||||
pingService.startPingThread();
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// NOUVELLE MACHINE
|
||||
// ============================================================
|
||||
public void prepareNew() {
|
||||
|
||||
selectedMachine = new Machine();
|
||||
}
|
||||
|
||||
public void prepareEdit(Machine machine) {
|
||||
selectedMachine = machine;
|
||||
PrimeFaces.current().ajax().update(":dicomPacsForm:dlgMachine");
|
||||
}
|
||||
|
||||
public void saveMachine() {
|
||||
try {
|
||||
if (selectedMachine.getId() == null) {
|
||||
|
||||
selectedMachine.setFkCentre(centre);
|
||||
machines.add(selectedMachine);
|
||||
|
||||
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine ajoutée avec succès");
|
||||
} else {
|
||||
selectedMachine.setLastUpdate(new Date());
|
||||
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine modifiée avec succès");
|
||||
|
||||
}
|
||||
service.save(selectedMachine);
|
||||
if (selectedMachine.getId() == null) {
|
||||
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Ajouter Machine", new Date(), new Date(), user, "", "");
|
||||
|
||||
} else {
|
||||
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Modifier Machine", new Date(), new Date(), user, "", "");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.getMessage());
|
||||
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de l'enregistrement");
|
||||
}
|
||||
PrimeFaces.current()
|
||||
.ajax()
|
||||
.update(":dicomPacsForm:dlgMachine");
|
||||
}
|
||||
|
||||
public void deleteMachine() {
|
||||
// ============================================================
|
||||
// MODIFICATION MACHINE
|
||||
// ============================================================
|
||||
public void prepareEdit(Machine machine) {
|
||||
|
||||
selectedMachine = machine;
|
||||
|
||||
PrimeFaces.current()
|
||||
.ajax()
|
||||
.update(":dicomPacsForm:dlgMachine");
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// SAUVEGARDE MACHINE
|
||||
// ============================================================
|
||||
public void saveMachine() {
|
||||
|
||||
try {
|
||||
|
||||
// IMPORTANT :
|
||||
// On vérifie si elle est nouvelle AVANT le save()
|
||||
boolean estNouveau = (selectedMachine.getId() == null);
|
||||
|
||||
if (estNouveau) {
|
||||
|
||||
selectedMachine.setFkCentre(centre);
|
||||
|
||||
} else {
|
||||
|
||||
selectedMachine.setLastUpdate(new Date());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Sauvegarde
|
||||
// ----------------------------------------------------
|
||||
service.save(selectedMachine);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Recharger la liste
|
||||
// ----------------------------------------------------
|
||||
machines = service.getAllByCentre(
|
||||
Machine.class,
|
||||
centre
|
||||
);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Historique
|
||||
// ----------------------------------------------------
|
||||
context.saveNewManipulation(
|
||||
"Machine",
|
||||
selectedMachine.getId().toString(),
|
||||
estNouveau
|
||||
? "CREATION Machine"
|
||||
: "MODIFICATION Machine",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Message
|
||||
// ----------------------------------------------------
|
||||
String message = estNouveau
|
||||
? "Machine ajoutée avec succès"
|
||||
: "Machine modifiée avec succès";
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_INFO,
|
||||
"Succès",
|
||||
message
|
||||
);
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
e.printStackTrace();
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_ERROR,
|
||||
"Erreur",
|
||||
"Une erreur est survenue lors de l'enregistrement"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// SUPPRESSION / DESACTIVATION MACHINE
|
||||
// ============================================================
|
||||
public void deleteMachine() {
|
||||
|
||||
try {
|
||||
|
||||
selectedMachine.setActif(Boolean.FALSE);
|
||||
selectedMachine.setLastUpdate(new Date());
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Sauvegarde
|
||||
// ----------------------------------------------------
|
||||
service.save(selectedMachine);
|
||||
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Desactiver Machine", new Date(), new Date(), user, "", "");
|
||||
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine supprimée avec succès");
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Historique
|
||||
// ----------------------------------------------------
|
||||
context.saveNewManipulation(
|
||||
"Machine",
|
||||
selectedMachine.getId().toString(),
|
||||
"DESACTIVATION Machine",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Recharger
|
||||
// ----------------------------------------------------
|
||||
machines = service.getAllByCentre(
|
||||
Machine.class,
|
||||
centre
|
||||
);
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_INFO,
|
||||
"Succès",
|
||||
"Machine désactivée avec succès"
|
||||
);
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.getMessage());
|
||||
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de la suppression");
|
||||
|
||||
e.printStackTrace();
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_ERROR,
|
||||
"Erreur",
|
||||
"Une erreur est survenue lors de la suppression"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void addMessage(FacesMessage.Severity severity, String summary, String detail) {
|
||||
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));
|
||||
// ============================================================
|
||||
// ACTIVER / DESACTIVER MACHINE
|
||||
// ============================================================
|
||||
public void toggleActif() {
|
||||
|
||||
try {
|
||||
|
||||
boolean nouvelEtat
|
||||
= !Boolean.TRUE.equals(
|
||||
selectedMachine.getActif()
|
||||
);
|
||||
|
||||
selectedMachine.setActif(nouvelEtat);
|
||||
selectedMachine.setLastUpdate(new Date());
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Sauvegarde
|
||||
// ----------------------------------------------------
|
||||
service.save(selectedMachine);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Historique
|
||||
// ----------------------------------------------------
|
||||
context.saveNewManipulation(
|
||||
"Machine",
|
||||
selectedMachine.getId().toString(),
|
||||
nouvelEtat
|
||||
? "ACTIVATION Machine"
|
||||
: "DESACTIVATION Machine",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Recharger
|
||||
// ----------------------------------------------------
|
||||
machines = service.getAllByCentre(
|
||||
Machine.class,
|
||||
centre
|
||||
);
|
||||
|
||||
// ----------------------------------------------------
|
||||
// Message
|
||||
// ----------------------------------------------------
|
||||
String msg = nouvelEtat
|
||||
? "Machine réactivée avec succès"
|
||||
: "Machine désactivée avec succès";
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_INFO,
|
||||
"Succès",
|
||||
msg
|
||||
);
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
e.printStackTrace();
|
||||
|
||||
addMessage(
|
||||
FacesMessage.SEVERITY_ERROR,
|
||||
"Erreur",
|
||||
"Une erreur est survenue"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// STATUTS DISPONIBLES
|
||||
// ============================================================
|
||||
public List<String> getStatutsDisponibles() {
|
||||
return Arrays.asList("Actif", "Inactif", "Indisponible");
|
||||
|
||||
return Arrays.asList(
|
||||
"Actif",
|
||||
"Inactif",
|
||||
"Indisponible"
|
||||
);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// TYPES DE MACHINE
|
||||
// ============================================================
|
||||
public List<TypeMachine> getTypesMachineDisponibles() {
|
||||
// TODO : brancher sur le tab "Types de machines" de Paramétrage une fois l'entité TypeMachine exposée
|
||||
return service.findAll(TypeMachine.class);
|
||||
|
||||
return service.findAll(
|
||||
TypeMachine.class
|
||||
);
|
||||
}
|
||||
|
||||
// ===== Getters / Setters =====
|
||||
public List<Machine> getMachines() {
|
||||
return machines;
|
||||
}
|
||||
|
||||
public void setMachines(List<Machine> machines) {
|
||||
this.machines = machines;
|
||||
}
|
||||
|
||||
public Machine getSelectedMachine() {
|
||||
return selectedMachine;
|
||||
}
|
||||
|
||||
public void setSelectedMachine(Machine selectedMachine) {
|
||||
this.selectedMachine = selectedMachine;
|
||||
}
|
||||
// Supprimer le champ dernierMajOrthanc et son setter, garder seulement ce getter :
|
||||
|
||||
// ============================================================
|
||||
// DERNIERE MAJ ORTHANC
|
||||
// ============================================================
|
||||
public Date getDernierMajOrthanc() {
|
||||
|
||||
if (machines == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return machines.stream()
|
||||
.filter(m -> "Orthanc Principal".equals(m.getNom()))
|
||||
.filter(m
|
||||
-> "Orthanc Principal".equals(
|
||||
m.getNom()
|
||||
)
|
||||
)
|
||||
.map(Machine::getLastUpdate)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// ETAT MWL SCP
|
||||
// ============================================================
|
||||
public String getEtatMwlScp() {
|
||||
|
||||
return etatMwlScp;
|
||||
}
|
||||
|
||||
public void setEtatMwlScp(String etatMwlScp) {
|
||||
|
||||
this.etatMwlScp = etatMwlScp;
|
||||
}
|
||||
|
||||
public java.util.Date getDernierEtudeRecu() {
|
||||
// ============================================================
|
||||
// DERNIERE ETUDE RECUE
|
||||
// ============================================================
|
||||
public Date getDernierEtudeRecu() {
|
||||
|
||||
return dernierEtudeRecu;
|
||||
}
|
||||
|
||||
public void setDernierEtudeRecu(java.util.Date dernierEtudeRecu) {
|
||||
public void setDernierEtudeRecu(
|
||||
Date dernierEtudeRecu) {
|
||||
|
||||
this.dernierEtudeRecu = dernierEtudeRecu;
|
||||
}
|
||||
|
||||
public void toggleActif() {
|
||||
try {
|
||||
boolean nouvelEtat = !Boolean.TRUE.equals(selectedMachine.getActif());
|
||||
selectedMachine.setActif(nouvelEtat);
|
||||
selectedMachine.setLastUpdate(new Date());
|
||||
service.save(selectedMachine);
|
||||
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "reactiver Machine", new Date(), new Date(), user, "", "");
|
||||
// TODO : persister le changement via le DAO réel (merge)
|
||||
|
||||
String msg = nouvelEtat ? "Machine réactivée avec succès" : "Machine désactivée avec succès";
|
||||
addMessage(FacesMessage.SEVERITY_INFO, "Succès", msg);
|
||||
} catch (Exception e) {
|
||||
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue");
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// ETAT GLOBAL DU PING
|
||||
// ============================================================
|
||||
public boolean isActif() {
|
||||
|
||||
return pingService.isActif();
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// MESSAGE
|
||||
// ============================================================
|
||||
private void addMessage(
|
||||
FacesMessage.Severity severity,
|
||||
String summary,
|
||||
String detail) {
|
||||
|
||||
FacesContext.getCurrentInstance()
|
||||
.addMessage(
|
||||
null,
|
||||
new FacesMessage(
|
||||
severity,
|
||||
summary,
|
||||
detail
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// GETTERS / SETTERS
|
||||
// ============================================================
|
||||
public List<Machine> getMachines() {
|
||||
|
||||
return machines;
|
||||
}
|
||||
|
||||
public void setMachines(
|
||||
List<Machine> machines) {
|
||||
|
||||
this.machines = machines;
|
||||
}
|
||||
|
||||
public Machine getSelectedMachine() {
|
||||
|
||||
return selectedMachine;
|
||||
}
|
||||
|
||||
public void setSelectedMachine(
|
||||
Machine selectedMachine) {
|
||||
|
||||
this.selectedMachine = selectedMachine;
|
||||
}
|
||||
|
||||
public Centre getCentre() {
|
||||
|
||||
return centre;
|
||||
}
|
||||
|
||||
public void setCentre(Centre centre) {
|
||||
|
||||
this.centre = centre;
|
||||
}
|
||||
|
||||
public ServiceUser getUser() {
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(ServiceUser user) {
|
||||
|
||||
this.user = user;
|
||||
}
|
||||
}
|
||||
|
||||
@ -115,6 +115,16 @@ public class ExamenDetailBean implements Serializable {
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
context.saveNewManipulation(
|
||||
"Examen",
|
||||
examen.getId().toString(),
|
||||
"CONSULTATION Examen",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
}
|
||||
allMedecins = service.getAllMedecinByCenter(centre);
|
||||
}
|
||||
@ -227,6 +237,16 @@ public class ExamenDetailBean implements Serializable {
|
||||
public void enregistrerObservation() {
|
||||
if (examen != null) {
|
||||
service.save(examen);
|
||||
context.saveNewManipulation(
|
||||
"Examen",
|
||||
examen.getId().toString(),
|
||||
"MODIFICATION Observation",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
}
|
||||
this.editObservation = false;
|
||||
}
|
||||
@ -603,6 +623,16 @@ public class ExamenDetailBean implements Serializable {
|
||||
examen.setFkInterpreteurAssi(medecin);
|
||||
System.out.println(" examen.setFkInterpreteurAssi " + examen.getFkInterpreteurAssi());
|
||||
service.save(examen);
|
||||
context.saveNewManipulation(
|
||||
"Examen",
|
||||
examen.getId().toString(),
|
||||
"MODIFICATION Interpréteur assigné",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
} else {
|
||||
selectedMedecinId = examen.getFkInterpreteurAssi() != null
|
||||
? examen.getFkInterpreteurAssi().getId().toString()
|
||||
@ -624,7 +654,16 @@ public class ExamenDetailBean implements Serializable {
|
||||
Medecin medecinCourant = service.getMedecinByUser(user);
|
||||
examen.setManipulateur(medecinCourant);
|
||||
service.save(examen);
|
||||
|
||||
context.saveNewManipulation(
|
||||
"Examen",
|
||||
examen.getId().toString(),
|
||||
"VALIDATION Examen",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "",
|
||||
getMsg("distribution.message.consultationValidee")));
|
||||
@ -641,7 +680,16 @@ public class ExamenDetailBean implements Serializable {
|
||||
examen.setAnnule(true);
|
||||
examen.setHeureFin(new Date());
|
||||
service.save(examen);
|
||||
|
||||
context.saveNewManipulation(
|
||||
"Examen",
|
||||
examen.getId().toString(),
|
||||
"ANNULATION Examen",
|
||||
new Date(),
|
||||
new Date(),
|
||||
user,
|
||||
"",
|
||||
""
|
||||
);
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_WARN, "",
|
||||
getMsg("distribution.message.consultationAnnulee")));
|
||||
|
||||
727
src/main/java/com/triz/trizservice/bean/PatientBean.java
Normal file
727
src/main/java/com/triz/trizservice/bean/PatientBean.java
Normal file
@ -0,0 +1,727 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package com.triz.trizservice.bean;
|
||||
|
||||
import com.triz.trizservice.modeles.Centre;
|
||||
import com.triz.trizservice.modeles.Examen;
|
||||
import com.triz.trizservice.modeles.Patient;
|
||||
import com.triz.trizservice.modeles.Queue;
|
||||
import com.triz.trizservice.modeles.Wilaya;
|
||||
import com.triz.trizservice.service.TransactionService;
|
||||
import com.triz.util.UtilContext;
|
||||
import java.io.Serializable;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.faces.application.FacesMessage;
|
||||
import javax.faces.context.FacesContext;
|
||||
import org.primefaces.model.StreamedContent;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import org.springframework.context.annotation.Scope;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
// PDF (OpenPDF / com.lowagie.text)
|
||||
import com.lowagie.text.Document;
|
||||
import com.lowagie.text.Element;
|
||||
import com.lowagie.text.Font;
|
||||
import com.lowagie.text.FontFactory;
|
||||
import com.lowagie.text.PageSize;
|
||||
import com.lowagie.text.Paragraph;
|
||||
import com.lowagie.text.Phrase;
|
||||
import com.lowagie.text.pdf.PdfPCell;
|
||||
import com.lowagie.text.pdf.PdfPTable;
|
||||
import com.lowagie.text.pdf.PdfWriter;
|
||||
import com.triz.util.UtilFile;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.Period;
|
||||
import java.time.ZoneId;
|
||||
import java.util.Date;
|
||||
import static org.apache.commons.math3.stat.ranking.TiesStrategy.RANDOM;
|
||||
|
||||
// Excel (Apache POI)
|
||||
import org.apache.poi.ss.usermodel.BorderStyle;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.primefaces.PrimeFaces;
|
||||
import org.primefaces.model.DefaultStreamedContent;
|
||||
|
||||
@Component("patientBean")
|
||||
@Scope("view")
|
||||
public class PatientBean implements Serializable {
|
||||
|
||||
// TODO : remplacer par votre service DAO existant (même pattern que DaoServiceImpl utilisé ailleurs)
|
||||
@Autowired
|
||||
private TransactionService service;
|
||||
@Autowired
|
||||
private UtilContext context; // TODO : remplacer par le vrai service/DAO
|
||||
|
||||
// Réutilise la méthode déjà en place pour retrouver l'Examen d'une Queue
|
||||
private List<Patient> patientList;
|
||||
private Centre centre;
|
||||
|
||||
private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
private static final SecureRandom RANDOM = new SecureRandom();
|
||||
|
||||
// Cache id patient -> a déjà un examen (évite de recalculer à chaque rendu de ligne du dataTable)
|
||||
private final Map<UUID, Boolean> dejaExamenCache = new HashMap<>();
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
chargerPatients();
|
||||
}
|
||||
|
||||
public void chargerPatients() {
|
||||
centre = context.getCurrentEtablissement();
|
||||
patientList = service.getAllByCentre(Patient.class, centre);
|
||||
dejaExamenCache.clear();
|
||||
}
|
||||
|
||||
public List<Patient> getPatientList() {
|
||||
return patientList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vrai si le patient a au moins une Queue déjà associée à un Examen ->
|
||||
* déclenche l'indicateur orange dans la liste.
|
||||
*/
|
||||
public boolean isPatientADejaExamen(Patient patient) {
|
||||
if (patient == null || patient.getId() == null) {
|
||||
return false;
|
||||
}
|
||||
return dejaExamenCache.computeIfAbsent(patient.getId(), id -> {
|
||||
List<Queue> queues = patient.getQueueList();
|
||||
if (queues == null) {
|
||||
return false;
|
||||
}
|
||||
for (Queue q : queues) {
|
||||
Examen e = getExamenByQueue(q);
|
||||
if (e != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Classe CSS appliquée à la ligne du p:dataTable (bordure orange à gauche).
|
||||
*/
|
||||
public String getRowStyleClass(Patient patient) {
|
||||
return isPatientADejaExamen(patient) ? "patient-row-deja-examen" : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Conservée pour compatibilité si utilisée ailleurs (ex. lien direct vers
|
||||
* un formulaire patient vierge) ; l'"Ajouter" de la liste passe désormais
|
||||
* par ouvrirAjoutPatient() + le dialog, pas par cette navigation.
|
||||
*/
|
||||
public String ajouterPatient() {
|
||||
return "/views/patient/form.xhtml?faces-redirect=true";
|
||||
}
|
||||
|
||||
public String consulterPatient(Patient patient) {
|
||||
return "/views/patient/form.xhtml?faces-redirect=true&patient=" + patient.getId();
|
||||
}
|
||||
|
||||
public void basculerStatut(Patient patient) {
|
||||
patient.setActif(!Boolean.TRUE.equals(patient.getActif()));
|
||||
service.save(patient);
|
||||
}
|
||||
|
||||
public Examen getExamenByQueue(Queue queue) {
|
||||
|
||||
List<Examen> examens = service.getExamenByQueue(queue);
|
||||
|
||||
if (examens == null || examens.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (Examen examen : examens) {
|
||||
if (Boolean.FALSE.equals(examen.getAnnule())) {
|
||||
return examen;
|
||||
}
|
||||
}
|
||||
|
||||
return examens.get(0);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Ajout d'un nouveau patient (dialog "Nouveau patient")
|
||||
// ---------------------------------------------------------------
|
||||
private Patient nouveauPatient;
|
||||
private List<Wilaya> allWilayas;
|
||||
|
||||
private static final String CODE_PATIENT_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
private static final int CODE_PATIENT_LONGUEUR = 10;
|
||||
private static final int CODE_PATIENT_TENTATIVES_MAX = 5;
|
||||
|
||||
public void ouvrirAjoutPatient() {
|
||||
nouveauPatient = new Patient();
|
||||
nouveauPatient.setActif(true);
|
||||
if (allWilayas == null) {
|
||||
allWilayas = service.findAll(Wilaya.class); // TODO : adapter à la vraie méthode du service (triée par code)
|
||||
}
|
||||
}
|
||||
|
||||
public void enregistrerNouveauPatient() {
|
||||
if (nouveauPatient == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (patientInvalide(nouveauPatient)) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_WARN,
|
||||
"Champs obligatoires manquants",
|
||||
"Le nom et le prénom sont obligatoires"));
|
||||
return;
|
||||
}
|
||||
|
||||
nouveauPatient.setCreeLe(new Date());
|
||||
nouveauPatient.setFkCentre(centre); // TODO : adapter si un autre mécanisme assigne le centre courant
|
||||
|
||||
try {
|
||||
sauvegarderAvecCodeUnique(nouveauPatient);
|
||||
} catch (RuntimeException e) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR,
|
||||
"Erreur lors de la création du patient", e.getMessage()));
|
||||
return;
|
||||
}
|
||||
|
||||
if (patientList != null) {
|
||||
patientList.add(0, nouveauPatient);
|
||||
}
|
||||
dejaExamenCache.remove(nouveauPatient.getId());
|
||||
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Patient créé",
|
||||
nouveauPatient.getPrenom() + " " + nouveauPatient.getNom()));
|
||||
|
||||
nouveauPatient = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère un code_patient (contrainte unique en base) et sauvegarde, en
|
||||
* réessayant avec un nouveau code en cas de collision.
|
||||
*
|
||||
* TODO : le catch(RuntimeException) est un filet générique — remplace-le
|
||||
* par l'exception réelle de violation de contrainte unique de ta stack (ex.
|
||||
* org.springframework.dao.DataIntegrityViolationException si Spring
|
||||
* Data/JPA, ou l'exception équivalente levée par ton
|
||||
* TransactionService.save(...)), pour ne pas masquer d'autres erreurs de
|
||||
* sauvegarde sous ce même retry.
|
||||
*/
|
||||
private void sauvegarderAvecCodeUnique(Patient patient) {
|
||||
String code = genererCodePatient();
|
||||
while (service.getPatientByCode(code) != null) {
|
||||
code = genererCodePatient();
|
||||
}
|
||||
patient.setCodePatient(genererCodePatient());
|
||||
|
||||
service.save(patient);
|
||||
PrimeFaces.current().executeScript("PF('dlgPatient').hide();");
|
||||
|
||||
}
|
||||
|
||||
public String genererCodePatient() {
|
||||
StringBuilder code = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
code.append(CHARS.charAt(RANDOM.nextInt(CHARS.length())));
|
||||
}
|
||||
|
||||
return code.toString();
|
||||
}
|
||||
|
||||
private boolean patientInvalide(Patient patient) {
|
||||
|
||||
return patient == null
|
||||
|| patient.getNom() == null
|
||||
|| patient.getPrenom() == null
|
||||
|| patient.getDateNaissance() == null
|
||||
|| patient.getSexe() == null
|
||||
|| patient.getTelephone() == null
|
||||
|| patient.getAdresse() == null;
|
||||
}
|
||||
|
||||
public Patient getNouveauPatient() {
|
||||
return nouveauPatient;
|
||||
}
|
||||
|
||||
public void setNouveauPatient(Patient nouveauPatient) {
|
||||
this.nouveauPatient = nouveauPatient;
|
||||
}
|
||||
|
||||
public List<Wilaya> getAllWilayas() {
|
||||
return allWilayas;
|
||||
}
|
||||
|
||||
public StreamedContent exportListePatientsPdf() {
|
||||
|
||||
try {
|
||||
|
||||
String fileName = "Liste_Patients_" + System.currentTimeMillis() + ".pdf";
|
||||
|
||||
File file = new File(
|
||||
UtilFile.getFilePath(
|
||||
"PDF",
|
||||
fileName
|
||||
)
|
||||
);
|
||||
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
Document document = new Document(PageSize.A4.rotate());
|
||||
|
||||
PdfWriter.getInstance(
|
||||
document,
|
||||
new FileOutputStream(file)
|
||||
);
|
||||
|
||||
document.open();
|
||||
|
||||
Font centreFont = FontFactory.getFont(
|
||||
FontFactory.HELVETICA_BOLD,
|
||||
16
|
||||
);
|
||||
|
||||
Font titleFont = FontFactory.getFont(
|
||||
FontFactory.HELVETICA_BOLD,
|
||||
14,
|
||||
Font.UNDERLINE
|
||||
);
|
||||
|
||||
Font infoFont = FontFactory.getFont(
|
||||
FontFactory.HELVETICA,
|
||||
10
|
||||
);
|
||||
|
||||
Paragraph centreParagraph = new Paragraph(
|
||||
centre != null ? centre.getName() : "",
|
||||
centreFont
|
||||
);
|
||||
|
||||
centreParagraph.setAlignment(Element.ALIGN_CENTER);
|
||||
|
||||
document.add(centreParagraph);
|
||||
|
||||
document.add(new Paragraph(" "));
|
||||
|
||||
Paragraph title = new Paragraph(
|
||||
"Liste des patients",
|
||||
titleFont
|
||||
);
|
||||
|
||||
title.setAlignment(Element.ALIGN_CENTER);
|
||||
|
||||
document.add(title);
|
||||
|
||||
document.add(new Paragraph(" "));
|
||||
|
||||
Paragraph dateGeneration = new Paragraph(
|
||||
"Date de génération : "
|
||||
+ new SimpleDateFormat("dd/MM/yyyy HH:mm")
|
||||
.format(new Date()),
|
||||
infoFont
|
||||
);
|
||||
|
||||
dateGeneration.setAlignment(Element.ALIGN_RIGHT);
|
||||
|
||||
document.add(dateGeneration);
|
||||
|
||||
document.add(new Paragraph(" "));
|
||||
|
||||
PdfPTable table = new PdfPTable(9);
|
||||
|
||||
table.setWidthPercentage(100);
|
||||
|
||||
table.setWidths(new float[]{
|
||||
12f, // Code
|
||||
15f, // Nom
|
||||
15f, // Prénom
|
||||
8f, // Sexe
|
||||
13f, // Date naissance
|
||||
7f, // Age
|
||||
13f, // Téléphone
|
||||
17f, // Email
|
||||
10f // Status
|
||||
});
|
||||
|
||||
Font headerFont = FontFactory.getFont(
|
||||
FontFactory.HELVETICA_BOLD,
|
||||
10
|
||||
);
|
||||
PdfPCell cell;
|
||||
|
||||
cell = new PdfPCell(new Phrase("Code", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Nom", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Prénom", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Sexe", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Date naissance", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Age", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Téléphone", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Email", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
cell = new PdfPCell(new Phrase("Status", headerFont));
|
||||
cell.setBorderWidth(1);
|
||||
table.addCell(cell);
|
||||
|
||||
Font rowFont = FontFactory.getFont(
|
||||
FontFactory.HELVETICA,
|
||||
9
|
||||
);
|
||||
|
||||
SimpleDateFormat sdfDate = new SimpleDateFormat("dd/MM/yyyy");
|
||||
|
||||
for (Patient p : patientList) {
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getCodePatient() != null ? p.getCodePatient() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getNom() != null ? p.getNom() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getPrenom() != null ? p.getPrenom() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getSexe() != null ? p.getSexe() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getDateNaissance() != null
|
||||
? sdfDate.format(p.getDateNaissance())
|
||||
: "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
calculerAge(p.getDateNaissance()) != null ? String.valueOf(calculerAge(p.getDateNaissance())) : "-",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getTelephone() != null ? p.getTelephone() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
p.getEmail() != null ? p.getEmail() : "",
|
||||
rowFont));
|
||||
|
||||
table.addCell(new Phrase(
|
||||
Boolean.TRUE.equals(p.getActif()) ? "Actif" : "Inactif",
|
||||
rowFont));
|
||||
}
|
||||
|
||||
document.add(table);
|
||||
|
||||
document.close();
|
||||
|
||||
return DefaultStreamedContent.builder()
|
||||
.name(fileName)
|
||||
.contentType("application/pdf")
|
||||
.stream(() -> {
|
||||
try {
|
||||
return new FileInputStream(file);
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
})
|
||||
.build();
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public StreamedContent exportListePatientsExcel() {
|
||||
|
||||
try {
|
||||
|
||||
String fileName = "Liste_Patients_" + System.currentTimeMillis() + ".xlsx";
|
||||
|
||||
File file = new File(
|
||||
UtilFile.getFilePath(
|
||||
"Excel",
|
||||
fileName
|
||||
)
|
||||
);
|
||||
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
Workbook workbook = new XSSFWorkbook();
|
||||
|
||||
Sheet sheet = workbook.createSheet("Patients");
|
||||
|
||||
sheet.addMergedRegion(
|
||||
new CellRangeAddress(0, 0, 0, 8));
|
||||
|
||||
sheet.addMergedRegion(
|
||||
new CellRangeAddress(2, 2, 0, 8));
|
||||
|
||||
sheet.addMergedRegion(
|
||||
new CellRangeAddress(4, 4, 0, 8));
|
||||
|
||||
/*
|
||||
* STYLE TITRE
|
||||
*/
|
||||
CellStyle titleStyle = workbook.createCellStyle();
|
||||
|
||||
org.apache.poi.ss.usermodel.Font titleFont = workbook.createFont();
|
||||
titleFont.setBold(true);
|
||||
titleFont.setUnderline(org.apache.poi.ss.usermodel.Font.U_SINGLE);
|
||||
titleFont.setFontHeightInPoints((short) 14);
|
||||
|
||||
titleStyle.setFont(titleFont);
|
||||
titleStyle.setAlignment(HorizontalAlignment.CENTER);
|
||||
/*
|
||||
* STYLE ENTETE
|
||||
*/
|
||||
CellStyle headerStyle = workbook.createCellStyle();
|
||||
|
||||
org.apache.poi.ss.usermodel.Font headerFont = workbook.createFont();
|
||||
headerFont.setBold(true);
|
||||
|
||||
headerStyle.setFont(headerFont);
|
||||
|
||||
headerStyle.setBorderTop(BorderStyle.THIN);
|
||||
headerStyle.setBorderBottom(BorderStyle.THIN);
|
||||
headerStyle.setBorderLeft(BorderStyle.THIN);
|
||||
headerStyle.setBorderRight(BorderStyle.THIN);
|
||||
|
||||
headerStyle.setAlignment(HorizontalAlignment.CENTER);
|
||||
|
||||
/*
|
||||
* STYLE DONNEES
|
||||
*/
|
||||
CellStyle dataStyle = workbook.createCellStyle();
|
||||
|
||||
dataStyle.setBorderTop(BorderStyle.THIN);
|
||||
dataStyle.setBorderBottom(BorderStyle.THIN);
|
||||
dataStyle.setBorderLeft(BorderStyle.THIN);
|
||||
dataStyle.setBorderRight(BorderStyle.THIN);
|
||||
|
||||
int rowNum = 0;
|
||||
|
||||
Row centreRow = sheet.createRow(rowNum++);
|
||||
centreRow.setHeightInPoints(25);
|
||||
|
||||
Cell centreCell = centreRow.createCell(0);
|
||||
|
||||
centreCell.setCellValue(
|
||||
centre != null ? centre.getName() : "");
|
||||
|
||||
centreCell.setCellStyle(titleStyle);
|
||||
|
||||
rowNum++;
|
||||
|
||||
Row titleRow = sheet.createRow(rowNum++);
|
||||
titleRow.setHeightInPoints(25);
|
||||
|
||||
Cell titleCell = titleRow.createCell(0);
|
||||
|
||||
titleCell.setCellValue("Liste des patients");
|
||||
|
||||
titleCell.setCellStyle(titleStyle);
|
||||
|
||||
rowNum++;
|
||||
|
||||
Row dateRow = sheet.createRow(rowNum++);
|
||||
|
||||
Cell dateCell = dateRow.createCell(0);
|
||||
|
||||
dateCell.setCellValue(
|
||||
"Date de génération : "
|
||||
+ new SimpleDateFormat("dd/MM/yyyy HH:mm")
|
||||
.format(new Date()));
|
||||
|
||||
rowNum += 2;
|
||||
|
||||
/*
|
||||
* ENTETES
|
||||
*/
|
||||
Row header = sheet.createRow(rowNum++);
|
||||
|
||||
String[] headers = {
|
||||
"Code Patient",
|
||||
"Nom",
|
||||
"Prénom",
|
||||
"Sexe",
|
||||
"Date naissance",
|
||||
"Age",
|
||||
"Téléphone",
|
||||
"Email",
|
||||
"Status"
|
||||
};
|
||||
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
|
||||
Cell cell = header.createCell(i);
|
||||
|
||||
cell.setCellValue(headers[i]);
|
||||
|
||||
cell.setCellStyle(headerStyle);
|
||||
}
|
||||
|
||||
SimpleDateFormat sdfDate
|
||||
= new SimpleDateFormat("dd/MM/yyyy");
|
||||
|
||||
/*
|
||||
* DONNEES
|
||||
*/
|
||||
for (Patient p : patientList) {
|
||||
|
||||
Row row = sheet.createRow(rowNum++);
|
||||
|
||||
Cell c0 = row.createCell(0);
|
||||
c0.setCellValue(
|
||||
p.getCodePatient() != null ? p.getCodePatient() : "");
|
||||
c0.setCellStyle(dataStyle);
|
||||
|
||||
Cell c1 = row.createCell(1);
|
||||
c1.setCellValue(
|
||||
p.getNom() != null ? p.getNom() : "");
|
||||
c1.setCellStyle(dataStyle);
|
||||
|
||||
Cell c2 = row.createCell(2);
|
||||
c2.setCellValue(
|
||||
p.getPrenom() != null ? p.getPrenom() : "");
|
||||
c2.setCellStyle(dataStyle);
|
||||
|
||||
Cell c3 = row.createCell(3);
|
||||
c3.setCellValue(
|
||||
p.getSexe() != null ? p.getSexe() : "");
|
||||
c3.setCellStyle(dataStyle);
|
||||
|
||||
Cell c4 = row.createCell(4);
|
||||
c4.setCellValue(
|
||||
p.getDateNaissance() != null
|
||||
? sdfDate.format(p.getDateNaissance())
|
||||
: "");
|
||||
c4.setCellStyle(dataStyle);
|
||||
|
||||
Cell c5 = row.createCell(5);
|
||||
String age = calculerAge(p.getDateNaissance());
|
||||
c5.setCellValue(age != null ? age : "-");
|
||||
c5.setCellStyle(dataStyle);
|
||||
|
||||
Cell c6 = row.createCell(6);
|
||||
c6.setCellValue(
|
||||
p.getTelephone() != null ? p.getTelephone() : "");
|
||||
c6.setCellStyle(dataStyle);
|
||||
|
||||
Cell c7 = row.createCell(7);
|
||||
c7.setCellValue(
|
||||
p.getEmail() != null ? p.getEmail() : "");
|
||||
c7.setCellStyle(dataStyle);
|
||||
|
||||
Cell c8 = row.createCell(8);
|
||||
c8.setCellValue(
|
||||
Boolean.TRUE.equals(p.getActif()) ? "Actif" : "Inactif");
|
||||
c8.setCellStyle(dataStyle);
|
||||
}
|
||||
|
||||
/*
|
||||
* LARGEUR COLONNES
|
||||
*/
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
sheet.autoSizeColumn(i);
|
||||
}
|
||||
|
||||
FileOutputStream fos = new FileOutputStream(file);
|
||||
|
||||
workbook.write(fos);
|
||||
|
||||
fos.close();
|
||||
workbook.close();
|
||||
|
||||
return DefaultStreamedContent.builder()
|
||||
.name(fileName)
|
||||
.contentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||
.stream(() -> {
|
||||
try {
|
||||
return new FileInputStream(file);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
})
|
||||
.build();
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public String calculerAge(Date dateNaissance) {
|
||||
|
||||
if (dateNaissance == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
LocalDate naissance;
|
||||
|
||||
if (dateNaissance instanceof java.sql.Date) {
|
||||
naissance = ((java.sql.Date) dateNaissance).toLocalDate();
|
||||
} else {
|
||||
naissance = dateNaissance.toInstant()
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDate();
|
||||
}
|
||||
|
||||
int age = Period.between(naissance, LocalDate.now()).getYears();
|
||||
|
||||
if (age > 0) {
|
||||
return Integer.toString(age);
|
||||
} else {
|
||||
return "-";
|
||||
}
|
||||
}
|
||||
}
|
||||
1126
src/main/java/com/triz/trizservice/bean/PatientDetailBean.java
Normal file
1126
src/main/java/com/triz/trizservice/bean/PatientDetailBean.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package com.triz.trizservice.bean;
|
||||
|
||||
import com.triz.trizservice.modeles.Patient;
|
||||
import com.triz.trizservice.modeles.TypeAlerteMedical;
|
||||
import com.triz.trizservice.service.TransactionService;
|
||||
import java.util.UUID;
|
||||
import javax.faces.component.UIComponent;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.convert.Converter;
|
||||
import javax.faces.convert.FacesConverter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author FORCE TECH
|
||||
*/
|
||||
@FacesConverter(value = "typeAlerteMedicaleConverter")
|
||||
@Component
|
||||
public class TypeAlerteMedicaleConverter implements Converter{
|
||||
@Autowired
|
||||
private TransactionService service;
|
||||
|
||||
public TypeAlerteMedicaleConverter() {
|
||||
// JSF instancie ce convertisseur lui-même (new MachineConverter()),
|
||||
// donc @Autowired ne se déclenche jamais tout seul.
|
||||
// Cet appel va chercher le WebApplicationContext Spring actif
|
||||
// et injecte manuellement les champs @Autowired de cette instance.
|
||||
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
|
||||
|
||||
if (value == null || value.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return service.findById(TypeAlerteMedical.class, UUID.fromString(value));
|
||||
} catch (IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
|
||||
|
||||
if (object == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (object instanceof String) {
|
||||
return (String) object;
|
||||
}
|
||||
|
||||
if (!(object instanceof TypeAlerteMedical)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
TypeAlerteMedical patient = (TypeAlerteMedical) object;
|
||||
|
||||
return patient.getId() != null
|
||||
? patient.getId().toString()
|
||||
: "";
|
||||
}
|
||||
|
||||
}
|
||||
@ -6,6 +6,7 @@ package com.triz.trizservice.bean.converter;
|
||||
|
||||
import com.triz.trizservice.modeles.Wilaya;
|
||||
import com.triz.trizservice.service.TransactionService;
|
||||
import java.util.UUID;
|
||||
import javax.faces.application.FacesMessage;
|
||||
import javax.faces.component.UIComponent;
|
||||
import javax.faces.context.FacesContext;
|
||||
@ -26,22 +27,38 @@ public class WilayaConverter implements Converter {
|
||||
protected transient TransactionService service;
|
||||
|
||||
@Override
|
||||
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
|
||||
try {
|
||||
return service.findById(Wilaya.class, value);
|
||||
} catch (NumberFormatException e) {
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Wilaya n'existe pas.");
|
||||
public Wilaya getAsObject(FacesContext context, UIComponent component, String value) {
|
||||
|
||||
if (value == null || value.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return service.findById(Wilaya.class, value);
|
||||
} catch (IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
|
||||
if (object != null) {
|
||||
return String.valueOf(((Wilaya) object).getName());
|
||||
} else {
|
||||
return null;
|
||||
if (object == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (object instanceof String) {
|
||||
return (String) object;
|
||||
}
|
||||
|
||||
if (!(object instanceof Wilaya)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
Wilaya patient = (Wilaya) object;
|
||||
|
||||
return patient.getCode() != null
|
||||
? patient.getCode()
|
||||
: "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -6,9 +6,12 @@ package com.triz.trizservice.modeles;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
import javax.annotation.Generated;
|
||||
import javax.persistence.Basic;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.Lob;
|
||||
@ -39,9 +42,9 @@ public class AlertesMedicales implements Serializable {
|
||||
@Id
|
||||
@Basic(optional = false)
|
||||
@NotNull
|
||||
@Lob
|
||||
@GeneratedValue
|
||||
@Column(name = "id")
|
||||
private Object id;
|
||||
private UUID id;
|
||||
@Size(max = 2147483647)
|
||||
@Column(name = "derscription")
|
||||
private String derscription;
|
||||
@ -58,15 +61,15 @@ public class AlertesMedicales implements Serializable {
|
||||
public AlertesMedicales() {
|
||||
}
|
||||
|
||||
public AlertesMedicales(Object id) {
|
||||
public AlertesMedicales(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Object getId() {
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Object id) {
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
||||
@ -6,9 +6,11 @@ package com.triz.trizservice.modeles;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
import javax.persistence.Basic;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.Lob;
|
||||
@ -40,9 +42,9 @@ public class FichierDossier implements Serializable {
|
||||
@Id
|
||||
@Basic(optional = false)
|
||||
@NotNull
|
||||
@Lob
|
||||
@GeneratedValue
|
||||
@Column(name = "id")
|
||||
private Object id;
|
||||
private UUID id;
|
||||
@Column(name = "date")
|
||||
@Temporal(TemporalType.DATE)
|
||||
private Date date;
|
||||
@ -59,15 +61,15 @@ public class FichierDossier implements Serializable {
|
||||
public FichierDossier() {
|
||||
}
|
||||
|
||||
public FichierDossier(Object id) {
|
||||
public FichierDossier(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Object getId() {
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Object id) {
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
||||
@ -108,6 +108,21 @@ public class Patient implements Serializable {
|
||||
private List<Queue> queueList;
|
||||
@Column(name = "code_patient", unique = true, length = 10)
|
||||
private String codePatient;
|
||||
@Column(name = "actif")
|
||||
private Boolean actif = true;
|
||||
@Column(name = "nis")
|
||||
private String nis;
|
||||
@JoinColumn(name = "fk_wilaya", referencedColumnName = "code")
|
||||
@ManyToOne
|
||||
private Wilaya fkWilaya;
|
||||
|
||||
public Wilaya getFkWilaya() {
|
||||
return fkWilaya;
|
||||
}
|
||||
|
||||
public void setFkWilaya(Wilaya fkWilaya) {
|
||||
this.fkWilaya = fkWilaya;
|
||||
}
|
||||
|
||||
public Patient() {
|
||||
}
|
||||
@ -307,4 +322,20 @@ public class Patient implements Serializable {
|
||||
this.codePatient = codePatient;
|
||||
}
|
||||
|
||||
public Boolean getActif() {
|
||||
return actif;
|
||||
}
|
||||
|
||||
public void setActif(Boolean actif) {
|
||||
this.actif = actif;
|
||||
}
|
||||
|
||||
public String getNis() {
|
||||
return nis;
|
||||
}
|
||||
|
||||
public void setNis(String nis) {
|
||||
this.nis = nis;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -62,7 +62,8 @@ public class Queue implements Serializable {
|
||||
@JoinColumn(name = "fk_queue_tips", referencedColumnName = "id")
|
||||
@ManyToOne
|
||||
private QueueTips fkQueueTips;
|
||||
|
||||
@OneToMany(mappedBy = "fkQueue")
|
||||
private List<Examen> ExamenList;
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_type_examen")
|
||||
private TypeExamen fkTypeExamen;
|
||||
@ -179,4 +180,12 @@ public class Queue implements Serializable {
|
||||
this.fkTypeExamen = fkTypeExamen;
|
||||
}
|
||||
|
||||
public List<Examen> getExamenList() {
|
||||
return ExamenList;
|
||||
}
|
||||
|
||||
public void setExamenList(List<Examen> ExamenList) {
|
||||
this.ExamenList = ExamenList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -177,4 +177,8 @@ public interface DaoService {
|
||||
|
||||
public List<Queue> getQueueByCentreByRequete(Centre centre,String requete);
|
||||
|
||||
public Examen getLastExamenByCentre(Centre centre);
|
||||
|
||||
public Patient getPatientByCode(String code);
|
||||
|
||||
}
|
||||
|
||||
@ -177,4 +177,10 @@ public interface TransactionService {
|
||||
public Consultation getConsultationByExamen(Examen examen);
|
||||
|
||||
public List<Queue> getQueueByCentreByRequete(Centre centre,String requete);
|
||||
|
||||
public Examen getLastExamenByCentre(Centre centre);
|
||||
|
||||
public Patient getPatientByCode(String code);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -465,7 +465,7 @@ public class DaoServiceImpl implements DaoService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Queue> getQueueByCentre(Centre centre,Date date) {
|
||||
public List<Queue> getQueueByCentre(Centre centre, Date date) {
|
||||
return getCurrentSession().createQuery("select s from Queue s where s.fkPatient.fkCentre=:centre and s.date=:date ").setParameter("centre", centre).setParameter("date", date).list();
|
||||
}
|
||||
|
||||
@ -481,6 +481,23 @@ public class DaoServiceImpl implements DaoService {
|
||||
|
||||
@Override
|
||||
public List<Queue> getQueueByCentreByRequete(Centre centre, String requete) {
|
||||
return getCurrentSession().createQuery("select s from Queue s where s.fkPatient.fkCentre=:centre"+requete).setParameter("centre", centre).list();
|
||||
return getCurrentSession().createQuery("select s from Queue s where s.fkPatient.fkCentre=:centre" + requete).setParameter("centre", centre).list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Examen getLastExamenByCentre(Centre centre) {
|
||||
List<Examen> examens = getCurrentSession().createQuery(
|
||||
"SELECT e FROM Examen e WHERE e.annule = false ORDER BY e.date DESC, e.heureDebut DESC",
|
||||
Examen.class)
|
||||
.setMaxResults(1)
|
||||
.getResultList();
|
||||
|
||||
Examen dernierExamen = examens.isEmpty() ? null : examens.get(0);
|
||||
return dernierExamen;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Patient getPatientByCode(String code) {
|
||||
return (Patient) getCurrentSession().createQuery("select s from Patient s where s.codePatient=:code").setParameter("code", code).setMaxResults(1).uniqueResult();
|
||||
}
|
||||
}
|
||||
|
||||
@ -434,8 +434,8 @@ public class TransactionServiceImpl implements TransactionService {
|
||||
|
||||
@Transactional("transactionManager")
|
||||
@Override
|
||||
public List<Queue> getQueueByCentre(Centre centre,Date date) {
|
||||
return daoService.getQueueByCentre(centre,date);
|
||||
public List<Queue> getQueueByCentre(Centre centre, Date date) {
|
||||
return daoService.getQueueByCentre(centre, date);
|
||||
}
|
||||
|
||||
@Transactional("transactionManager")
|
||||
@ -455,4 +455,16 @@ public class TransactionServiceImpl implements TransactionService {
|
||||
public List<Queue> getQueueByCentreByRequete(Centre centre, String requete) {
|
||||
return daoService.getQueueByCentreByRequete(centre, requete);
|
||||
}
|
||||
|
||||
@Transactional("transactionManager")
|
||||
@Override
|
||||
public Examen getLastExamenByCentre(Centre centre) {
|
||||
return daoService.getLastExamenByCentre(centre);
|
||||
}
|
||||
|
||||
@Transactional("transactionManager")
|
||||
@Override
|
||||
public Patient getPatientByCode(String code) {
|
||||
return daoService.getPatientByCode(code);
|
||||
}
|
||||
}
|
||||
|
||||
@ -935,3 +935,16 @@ ADD COLUMN code_patient VARCHAR(10);
|
||||
|
||||
ALTER TABLE patient
|
||||
ADD CONSTRAINT uk_patient_code UNIQUE (code_patient);
|
||||
|
||||
ALTER TABLE patient
|
||||
ADD COLUMN actif BOOLEAN DEFAULT TRUE;
|
||||
|
||||
ALTER TABLE patient
|
||||
ADD COLUMN nis VARCHAR(20);
|
||||
|
||||
ALTER TABLE patient
|
||||
ADD COLUMN fk_wilaya varchar;
|
||||
ALTER TABLE patient
|
||||
ADD CONSTRAINT fk_patient_wilaya
|
||||
FOREIGN KEY (fk_wilaya)
|
||||
REFERENCES wilaya(code);
|
||||
@ -4420,3 +4420,97 @@ distribution.message.consultationAnnulee=Examen annul\u00e9e
|
||||
distribution.page.selectionner=S\u00e9lectionner
|
||||
distribution.page.confirmerValidation=Confirmez-vous la validation de cet examen ?
|
||||
distribution.page.confirmerAnnulation=Confirmez-vous l'annulation de cet examen ?
|
||||
|
||||
# Titre / breadcrumb
|
||||
distribution.page.patients=Patients
|
||||
distribution.page.patients.liste=Liste des Patients
|
||||
distribution.page.patient.liste.message.non=Aucun patient trouv\u00e9
|
||||
|
||||
# L\u00e9gende de l'indicateur orange
|
||||
distribution.page.patient.legende.dejaExamen=Patients qui ont d\u00e9j\u00e0 fait un examen
|
||||
|
||||
# Colonnes du tableau
|
||||
distribution.page.patient.code=ID Patient
|
||||
distribution.page.patient.nom=Nom
|
||||
distribution.page.patient.prenom=Pr\u00e9nom
|
||||
distribution.page.patient.sexe=Sexe
|
||||
distribution.page.patient.dateNaissance=Date de Naissance
|
||||
distribution.page.patient.age=Age
|
||||
distribution.page.patient.telephone=T\u00e9l\u00e9phone
|
||||
distribution.page.patient.email=Email
|
||||
distribution.page.status=Status
|
||||
|
||||
# Action
|
||||
distribution.page.consulter=Consulter
|
||||
|
||||
# Panneau de filtre
|
||||
distribution.filtre.dateNaissance=Date de naissance
|
||||
distribution.filtre.dateDebut=Date d\u00e9but
|
||||
distribution.filtre.dateFin=Date fin
|
||||
distribution.filtre.rapide=Filtres rapides
|
||||
distribution.filtre.patient.dejaExamen=Patients ayant d\u00e9j\u00e0 un examen
|
||||
distribution.filtre.criteres=Crit\u00e8res
|
||||
distribution.filtre.reinitialiser=R\u00e9initialiser
|
||||
distribution.filtre.appliquer=Appliquer
|
||||
|
||||
# Statuts de consultation (typeConsultation)
|
||||
distribution.statut.annule=Annul\u00e9
|
||||
distribution.statut.normal=Normal
|
||||
distribution.statut.definitve=D\u00e9finitive
|
||||
distribution.statut.brouillon=Brouillon
|
||||
|
||||
# ===================== Page d\u00e9tail Examen =====================
|
||||
distribution.page.examen.detail=D\u00e9tail examen
|
||||
distribution.page.examen.ajouterSignature=Ajouter signature
|
||||
distribution.page.examen.visualiser=Visualiser
|
||||
distribution.page.examen.consultation=Consultation
|
||||
distribution.page.valider=Valider
|
||||
distribution.page.confirmerValidation=Voulez-vous vraiment valider cette consultation ?
|
||||
distribution.page.confirmerAnnulation=Voulez-vous vraiment annuler cette consultation ?
|
||||
distribution.page.patient.nom=Patient
|
||||
distribution.page.patient.sexe=Sexe
|
||||
distribution.page.priorite=Priorit\u00e9
|
||||
distribution.page.observation=Observation
|
||||
distribution.page.voirPlus=Voir plus
|
||||
distribution.page.voirMoins=Voir moins
|
||||
distribution.page.interpreteurAssigne=Interpr\u00e8te Assign\u00e9
|
||||
distribution.page.completeLe=Compl\u00e9t\u00e9 le
|
||||
distribution.page.consulteLe=Consult\u00e9 le
|
||||
distribution.page.rapportCreeLe=Rapport cr\u00e9\u00e9 le
|
||||
distribution.page.etudeInstanceId=Study Instance UID
|
||||
distribution.page.typeExamen=Type d'examen
|
||||
distribution.page.machine=Machine
|
||||
distribution.page.lateralite=Lat\u00e9ralit\u00e9
|
||||
distribution.page.rapport=Rapport
|
||||
distribution.page.typeConsultation=Type consultation
|
||||
distribution.page.medecinConsultant=M\u00e9decin consultant
|
||||
distribution.page.rapportEcritPar=Rapport \u00e9crit par
|
||||
distribution.page.rapportEcrit=Rapport \u00c9crit
|
||||
distribution.page.aucuneConsultation=Aucune consultation pour cet examen
|
||||
distribution.page.rapportsDictes=Rapports dict\u00e9s
|
||||
distribution.page.imagesCles=Images cl\u00e9s
|
||||
distribution.message.aucuneImageCle=Aucune image cl\u00e9
|
||||
|
||||
# ===================== Page d\u00e9tail Patient (Dossier patients) =====================
|
||||
distribution.page.patient.detail=Fiche patient
|
||||
distribution.page.patient.idPatient=Id Patient
|
||||
distribution.page.patient.dateNaissance=Date de naissance
|
||||
distribution.page.patient.telephone=T\u00e9l\u00e9phone
|
||||
distribution.page.patient.telephoneRelative=T\u00e9l\u00e9phone Relative
|
||||
distribution.page.patient.email=Email
|
||||
distribution.page.patient.wilaya=Wilaya
|
||||
distribution.page.patient.adresse=Adresse
|
||||
distribution.page.patient.groupage=Groupage
|
||||
distribution.page.patient.alertesMedicaux=Alertes M\u00e9dicaux
|
||||
distribution.page.patient.aucuneAlerte=Aucune alerte m\u00e9dicale
|
||||
distribution.page.patient.alerteMedicale=Alerte m\u00e9dicale
|
||||
distribution.page.patient.typeAlerte=Type Alerte
|
||||
distribution.page.patient.description=Description
|
||||
distribution.page.patient.dateHeure=Date et heure
|
||||
distribution.page.patient.modifierAlerte=Modifier Alerte
|
||||
distribution.page.patient.nouvelleAlerte=Ajouter une alerte
|
||||
distribution.page.patient.confirmerSuppressionAlerte=Voulez-vous vraiment supprimer cette alerte ?
|
||||
distribution.page.patient.nouveauPatient=Nouveau patient
|
||||
distribution.page.patient.nouveauPatientSousTitre=Cr\u00e9er une nouvelle fiche patient
|
||||
distribution.page.patient.codeGenereAuto=L'identifiant patient sera g\u00e9n\u00e9r\u00e9 automatiquement \u00e0 l'enregistrement.
|
||||
distribution.page.champObligatoire=champ obligatoire
|
||||
@ -125,7 +125,7 @@
|
||||
<p:menuitem id="m_dossier_patients"
|
||||
value="Dossier patients"
|
||||
icon="pi pi-id-card"
|
||||
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
|
||||
url="#{request.contextPath}/views/patient/list.xhtml?idpage=Suivis_flotte"
|
||||
rendered="#{utilControleAccess.isshowPrivilegeAdd('dossier')}" />
|
||||
|
||||
</p:submenu>
|
||||
|
||||
@ -37,13 +37,7 @@
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#layoutTopbarForm .layout-topbar.custom-topbar .layout-topbar-right {
|
||||
background-color: #F8FAFC !important;
|
||||
height: 100% !important;
|
||||
flex: 1 1 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
#layoutTopbarForm .layout-topbar.custom-topbar .layout-menu-button {
|
||||
position: absolute !important;
|
||||
@ -116,7 +110,7 @@
|
||||
background-color: #0D1B2E !important;
|
||||
}
|
||||
#layoutTopbarForm .layout-topbar-right {
|
||||
background-color: #FFFFFF !important;
|
||||
background-color: #{empty topbarRightColor ? '#FFFFFF' : topbarRightColor} !important;
|
||||
height: 100% !important;
|
||||
flex: 1 1 auto;
|
||||
|
||||
@ -131,7 +125,7 @@
|
||||
.topbar-page-title {
|
||||
font-weight: 700;
|
||||
font-size: 20px;
|
||||
color: #0D1B2E;
|
||||
color: #{empty topbarTextColor ? '#0D1B2E' : topbarTextColor};
|
||||
font-family: 'Inter', sans-serif;
|
||||
margin-right: auto;
|
||||
margin-left: 35px;
|
||||
@ -147,7 +141,7 @@
|
||||
}
|
||||
|
||||
.topbar-date {
|
||||
color: #94A3B8;
|
||||
color: #{empty topbarTextColor ? '#94A3B8' : topbarTextColor};
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
@ -186,7 +180,7 @@
|
||||
|
||||
.notification-button .ui-icon {
|
||||
font-size: 22px !important;
|
||||
color: #64748B !important;
|
||||
color: #{empty topbarTextColor ? '#64748B' : topbarTextColor} !important;
|
||||
line-height: 1 !important;
|
||||
}
|
||||
|
||||
|
||||
@ -36,7 +36,10 @@
|
||||
|
||||
<h:body styleClass="#{app.bodyClass}" >
|
||||
<div class="layout-wrapper #{app.layoutClass}">
|
||||
<ui:include src="./sections/topbar.xhtml" />
|
||||
<ui:include src="./sections/topbar.xhtml">
|
||||
<ui:param name="topbarRightColor" value="#{topbarRightColor}" />
|
||||
<ui:param name="topbarTextColor" value="#{topbarTextColor}" />
|
||||
</ui:include>
|
||||
<ui:include src="./sections/rightmenu.xhtml" />
|
||||
<ui:include src="./sections/menu.xhtml" />
|
||||
|
||||
|
||||
@ -9,7 +9,8 @@
|
||||
<ui:define name="title">
|
||||
#{msg['distribution.page.examen.detail']}
|
||||
</ui:define>
|
||||
|
||||
<ui:param name="topbarRightColor" value="#0088FF" />
|
||||
<ui:param name="topbarTextColor" value="#FFFFFF" />
|
||||
<ui:define name="breadcrumb">
|
||||
<f:metadata>
|
||||
<f:viewParam name="id" value="#{examenDetailBean.idExamen}" />
|
||||
|
||||
@ -9,7 +9,8 @@
|
||||
<ui:define name="title">
|
||||
#{msg['distribution.page.examen']}
|
||||
</ui:define>
|
||||
|
||||
<ui:param name="topbarRightColor" value="#0088FF" />
|
||||
<ui:param name="topbarTextColor" value="#FFFFFF" />
|
||||
<ui:define name="breadcrumb">
|
||||
<f:metadata>
|
||||
<f:viewParam name="homeOutcome" value="/favorites/dashboard" />
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,658 @@
|
||||
<?xml version='1.0' encoding='UTF-8' ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html">
|
||||
<h:head>
|
||||
<title>Facelet Title</title>
|
||||
</h:head>
|
||||
<h:body>
|
||||
Hello from Facelets
|
||||
</h:body>
|
||||
</html>
|
||||
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:h="http://java.sun.com/jsf/html"
|
||||
xmlns:f="http://java.sun.com/jsf/core"
|
||||
xmlns:ui="http://java.sun.com/jsf/facelets"
|
||||
xmlns:p="http://primefaces.org/ui"
|
||||
template="/WEB-INF/layout/template.xhtml">
|
||||
<ui:define name="title">
|
||||
#{msg['distribution.page.patients']}
|
||||
</ui:define>
|
||||
<ui:param name="topbarRightColor" value="#0D1B2E" />
|
||||
<ui:param name="topbarTextColor" value="#FFFFFF" />
|
||||
<ui:define name="breadcrumb">
|
||||
<f:metadata>
|
||||
<f:viewParam name="homeOutcome" value="/favorites/dashboard" />
|
||||
<f:viewParam name="value" value="Dossier patients" />
|
||||
</f:metadata>
|
||||
</ui:define>
|
||||
|
||||
<ui:define name="content">
|
||||
<style>
|
||||
.card .ui-datatable-tablewrapper table td,
|
||||
.card .ui-datatable-tablewrapper table th {
|
||||
vertical-align: middle !important;
|
||||
}
|
||||
.card .ui-datatable-tablewrapper table td {
|
||||
padding-top: 14px !important;
|
||||
padding-bottom: 14px !important;
|
||||
}
|
||||
|
||||
.page-center-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: calc(100vh - 160px);
|
||||
}
|
||||
.page-center-wrapper .card {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.table-header-title {
|
||||
font-weight: 700;
|
||||
font-size: 1.05rem;
|
||||
color: #343a40;
|
||||
}
|
||||
|
||||
.table-header-legend {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 12px;
|
||||
color: #6B6B63;
|
||||
margin-top: 4px;
|
||||
}
|
||||
.legend-dot {
|
||||
display: inline-block;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 2px;
|
||||
background-color: #F5821F;
|
||||
}
|
||||
|
||||
.btn-green-outline,
|
||||
.btn-green-outline.ui-button {
|
||||
background-color: #ffffff !important;
|
||||
border: 1px solid #0D9488 !important;
|
||||
color: #0D9488 !important;
|
||||
}
|
||||
.btn-green-outline:hover {
|
||||
background-color: #e6f5f4 !important;
|
||||
}
|
||||
|
||||
.btn-view-green,
|
||||
.btn-view-green.ui-button {
|
||||
background-color: #0D9488 !important;
|
||||
border-color: #0D9488 !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
.btn-view-green:hover {
|
||||
background-color: #0b7d73 !important;
|
||||
}
|
||||
|
||||
.btn-export {
|
||||
background-color: #ffffff !important;
|
||||
border: 1px solid #dee2e6 !important;
|
||||
color: #0D9488 !important;
|
||||
}
|
||||
.btn-export:hover {
|
||||
background-color: #e6f5f4 !important;
|
||||
border-color: #0D9488 !important;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
display: inline-block;
|
||||
padding: 4px 14px;
|
||||
border-radius: 6px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
min-width: 100px;
|
||||
}
|
||||
.status-actif {
|
||||
background-color: #0D9488;
|
||||
}
|
||||
.status-inactif {
|
||||
background-color: #F16B77;
|
||||
}
|
||||
|
||||
/* Bordure orange gauche pour les patients ayant déjà un examen */
|
||||
.ui-datatable-tablewrapper table tbody tr.patient-row-deja-examen {
|
||||
border-left: 4px solid #F5821F;
|
||||
}
|
||||
|
||||
.patient-filter-panel.ui-overlaypanel {
|
||||
border-radius: 8px;
|
||||
border: 0.5px solid #B4B2A9;
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
width: 380px !important;
|
||||
}
|
||||
|
||||
.patient-filter-grid {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
padding: 8px 4px;
|
||||
}
|
||||
|
||||
.filter-section-title {
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
font-weight: 600;
|
||||
color: #6B6B63;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.filter-date-range {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
.filter-date-range .ui-calendar {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.filter-checkbox-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.filter-select.ui-selectonemenu {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.filter-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
margin-top: 12px;
|
||||
padding-top: 12px;
|
||||
border-top: 0.5px solid #B4B2A9;
|
||||
}
|
||||
|
||||
.patient-filter-panel .ui-overlaypanel-close {
|
||||
background-color: #0D9488 !important;
|
||||
border-color: #0D9488 !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
.patient-filter-panel .ui-overlaypanel-close:hover {
|
||||
background-color: #0b7d73 !important;
|
||||
border-color: #0b7d73 !important;
|
||||
}
|
||||
.patient-filter-panel .ui-overlaypanel-close .pi,
|
||||
.patient-filter-panel .ui-overlaypanel-close .ui-icon-closethick {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
/* ===================== Dialog Nouveau patient ===================== */
|
||||
.ui-dialog.patient-dialog {
|
||||
border-radius: 12px;
|
||||
border: none;
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 16px 40px rgba(13, 27, 46, 0.18);
|
||||
}
|
||||
.ui-dialog.patient-dialog .ui-dialog-titlebar {
|
||||
display: none;
|
||||
}
|
||||
.ui-dialog.patient-dialog .ui-dialog-content {
|
||||
padding: 0 !important;
|
||||
box-sizing: border-box !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
.patient-dialog-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
padding: 20px 24px;
|
||||
border-bottom: 0.5px solid #EFEDE7;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.patient-dialog-icon {
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(13, 148, 136, 0.12);
|
||||
color: #0D9488;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.patient-dialog-header-text {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.patient-dialog-title {
|
||||
display: block;
|
||||
font-size: 15px;
|
||||
font-weight: 700;
|
||||
color: #0D1B2E;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.patient-dialog-subtitle {
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
color: #94A3AA;
|
||||
margin-top: 1px;
|
||||
}
|
||||
.patient-dialog-close {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
color: #94A3AA;
|
||||
cursor: pointer;
|
||||
flex-shrink: 0;
|
||||
transition: background-color 0.15s ease, color 0.15s ease;
|
||||
}
|
||||
.patient-dialog-close:hover {
|
||||
background-color: rgba(148, 163, 170, 0.15);
|
||||
color: #343a40;
|
||||
}
|
||||
.patient-dialog-body {
|
||||
padding: 22px 24px 24px 24px;
|
||||
box-sizing: border-box;
|
||||
overflow-x: hidden;
|
||||
background-color: #FCFCFB;
|
||||
max-height: 60vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.patient-dialog-footer {
|
||||
background-color: #F1EFE8;
|
||||
padding: 14px 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
}
|
||||
.dialog-confirm-btn.ui-button {
|
||||
background-color: #378ADD !important;
|
||||
border-color: #378ADD !important;
|
||||
border-radius: 7px !important;
|
||||
color: #fff !important;
|
||||
font-weight: 600;
|
||||
padding: 0 16px !important;
|
||||
}
|
||||
.dialog-confirm-btn.ui-button:hover {
|
||||
background-color: #2f79c4 !important;
|
||||
}
|
||||
.dialog-secondary-btn,
|
||||
.dialog-secondary-btn.ui-button {
|
||||
background-color: #ffffff !important;
|
||||
border: 1px solid #DCE0E5 !important;
|
||||
color: #495057 !important;
|
||||
border-radius: 7px !important;
|
||||
}
|
||||
.dialog-secondary-btn:hover {
|
||||
background-color: #F8F9FA !important;
|
||||
}
|
||||
|
||||
/* Grille 2 colonnes pour le formulaire */
|
||||
.dialog-field-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 4px 20px;
|
||||
}
|
||||
.dialog-field-grid .dialog-field {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.dialog-field-full {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
.dialog-field-hint {
|
||||
grid-column: 1 / -1;
|
||||
font-size: 12px;
|
||||
color: #94A3AA;
|
||||
background-color: rgba(13, 148, 136, 0.06);
|
||||
border: 1px dashed rgba(13, 148, 136, 0.3);
|
||||
border-radius: 8px;
|
||||
padding: 8px 12px;
|
||||
margin-bottom: 18px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.dialog-field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 7px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.dialog-field-label {
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.6px;
|
||||
font-weight: 700;
|
||||
color: #0D9488;
|
||||
}
|
||||
.dialog-field-input {
|
||||
width: 100% !important;
|
||||
max-width: 100% !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
.dialog-field-input.ui-inputtext,
|
||||
.dialog-field-input.ui-inputtextarea {
|
||||
border: 1px solid #DCE0E5 !important;
|
||||
border-radius: 8px !important;
|
||||
box-shadow: none !important;
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
font-size: 14px;
|
||||
background-color: #ffffff;
|
||||
padding: 9px 12px !important;
|
||||
transition: border-color 0.15s ease;
|
||||
}
|
||||
.dialog-field-input.ui-inputtext:focus,
|
||||
.dialog-field-input.ui-inputtextarea:focus {
|
||||
border-color: #0D9488 !important;
|
||||
}
|
||||
.ui-selectonemenu.dialog-field-input {
|
||||
height: 40px !important;
|
||||
display: flex !important;
|
||||
align-items: center;
|
||||
border: 1px solid #DCE0E5 !important;
|
||||
border-radius: 8px !important;
|
||||
background-color: #ffffff !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
.ui-selectonemenu.dialog-field-input .ui-selectonemenu-label {
|
||||
border: none !important;
|
||||
background: transparent !important;
|
||||
padding: 0 12px !important;
|
||||
line-height: 38px !important;
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
font-size: 14px;
|
||||
color: #343a40;
|
||||
}
|
||||
.ui-selectonemenu.dialog-field-input .ui-selectonemenu-label.ui-placeholder {
|
||||
color: #B4B2A9;
|
||||
}
|
||||
.ui-selectonemenu.dialog-field-input .ui-selectonemenu-trigger {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
border-left: 1px solid #DCE0E5 !important;
|
||||
width: 34px !important;
|
||||
flex-shrink: 0;
|
||||
color: #94A3AA !important;
|
||||
}
|
||||
.ui-calendar.dialog-field-input input.ui-inputtext {
|
||||
width: 100% !important;
|
||||
box-sizing: border-box !important;
|
||||
border: 1px solid #DCE0E5 !important;
|
||||
border-radius: 8px !important;
|
||||
box-shadow: none !important;
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
font-size: 14px;
|
||||
padding: 9px 12px !important;
|
||||
}
|
||||
.dialog-field-checkbox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
height: 40px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<h:form id="form">
|
||||
<div class="page-center-wrapper">
|
||||
#{patientBean.init()}
|
||||
<p:growl id="growlMessages" showDetail="true" life="4000" />
|
||||
<div class="card">
|
||||
<p:dataTable id="dataTable" var="p"
|
||||
rows="30" paginator="true" draggableColumns="true"
|
||||
value="#{patientBean.patientList}"
|
||||
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
|
||||
rowsPerPageTemplate="20,30,40,60,80,100"
|
||||
emptyMessage="#{msg['distribution.page.patient.liste.message.non']}"
|
||||
selectionMode="single"
|
||||
rowKey="#{p.id}"
|
||||
rowStyleClass="#{patientBean.getRowStyleClass(p)}">
|
||||
|
||||
<f:facet name="header">
|
||||
<div class="flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<span class="table-header-title">#{msg['distribution.page.patients.liste']}</span>
|
||||
<div class="table-header-legend">
|
||||
<span class="legend-dot" />
|
||||
<span>#{msg['distribution.page.patient.legende.dejaExamen']}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
|
||||
<p:commandButton id="xlsExport" styleClass="mr-2 mb-2 btn-export"
|
||||
icon="pi pi-file-excel" title="Excel" ajax="false">
|
||||
<p:fileDownload value="#{patientBean.exportListePatientsExcel()}" />
|
||||
</p:commandButton>
|
||||
|
||||
<p:commandButton id="pdfExport" styleClass="mr-2 mb-2 btn-export"
|
||||
ajax="false" icon="pi pi-file-pdf" title="PDF">
|
||||
<p:fileDownload value="#{patientBean.exportListePatientsPdf()}" />
|
||||
</p:commandButton>
|
||||
|
||||
<p:commandButton id="toggler" styleClass="mr-2 mb-2 btn-green-outline"
|
||||
type="button" value="Columns" icon="pi pi-align-justify"/>
|
||||
<p:columnToggler datasource="dataTable" trigger="toggler" />
|
||||
|
||||
<p:commandButton value="Ajouter" icon="pi pi-plus" styleClass="mr-2 mb-2 btn-view-green"
|
||||
actionListener="#{patientBean.ouvrirAjoutPatient}"
|
||||
update=":dlg:dlgAjoutPatient"
|
||||
oncomplete="PF('ajoutPatientDialog').show()"
|
||||
process="@this" />
|
||||
</div>
|
||||
</div>
|
||||
</f:facet>
|
||||
|
||||
<!-- ID Patient -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.code']}"
|
||||
filterBy="#{p.codePatient}" filterMatchMode="contains" sortBy="#{p.codePatient}">
|
||||
<h:outputText value="#{p.codePatient}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Nom -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.nom']}"
|
||||
filterBy="#{p.nom}" filterMatchMode="contains" sortBy="#{p.nom}">
|
||||
<h:outputText value="#{p.nom}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Prénom -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.prenom']}"
|
||||
filterBy="#{p.prenom}" filterMatchMode="contains" sortBy="#{p.prenom}">
|
||||
<h:outputText value="#{p.prenom}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Sexe -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.sexe']}"
|
||||
filterBy="#{p.sexe}" filterMatchMode="contains" sortBy="#{p.sexe}">
|
||||
<h:outputText value="#{p.sexe}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Date de naissance -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.dateNaissance']}"
|
||||
sortBy="#{p.dateNaissance}">
|
||||
<h:outputText value="#{p.dateNaissance}">
|
||||
<f:convertDateTime pattern="dd/MM/yyyy" />
|
||||
</h:outputText>
|
||||
</p:column>
|
||||
|
||||
<!-- Age -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.age']}"
|
||||
sortBy="#{patientBean.calculerAge(p.dateNaissance)}">
|
||||
<h:outputText value="#{patientBean.calculerAge(p.dateNaissance)}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Téléphone -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.telephone']}"
|
||||
filterBy="#{p.telephone}" filterMatchMode="contains" sortBy="#{p.telephone}">
|
||||
<h:outputText value="#{p.telephone}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Email -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.patient.email']}"
|
||||
filterBy="#{p.email}" filterMatchMode="contains" sortBy="#{p.email}">
|
||||
<h:outputText value="#{p.email}" />
|
||||
</p:column>
|
||||
|
||||
<!-- Status -->
|
||||
<p:column style="text-align: center;" headerText="#{msg['distribution.page.status']}"
|
||||
sortBy="#{p.actif}">
|
||||
<h:panelGroup styleClass="status-badge #{p.actif ? 'status-actif' : 'status-inactif'}">
|
||||
<h:outputText value="#{p.actif ? 'Actif' : 'Inactif'}" />
|
||||
</h:panelGroup>
|
||||
</p:column>
|
||||
|
||||
<!-- Action -->
|
||||
<p:column style="width:100px; text-align: center;" exportable="false"
|
||||
draggable="false" toggleable="false" headerText="Action">
|
||||
<p:commandButton id="buttonConsulter" styleClass="btn-view-green"
|
||||
style="height:30px; text-align: center"
|
||||
action="#{patientBean.consulterPatient(p)}"
|
||||
icon="pi pi-search" title="#{msg['distribution.page.consulter']}" />
|
||||
</p:column>
|
||||
|
||||
</p:dataTable>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</h:form>
|
||||
|
||||
|
||||
<h:form id="dlg">
|
||||
<!-- ============================ -->
|
||||
<!-- Dialog Nouveau patient -->
|
||||
<!-- ============================ -->
|
||||
<p:dialog widgetVar="ajoutPatientDialog" modal="true" resizable="false" id="dlgAjoutPatient"
|
||||
showEffect="fade" hideEffect="fade" closable="true"
|
||||
styleClass="patient-dialog" width="620">
|
||||
|
||||
<h:panelGroup layout="block" styleClass="patient-dialog-header">
|
||||
<span class="patient-dialog-icon">
|
||||
<i class="pi pi-user-plus"></i>
|
||||
</span>
|
||||
<h:panelGroup layout="block" styleClass="patient-dialog-header-text">
|
||||
<span class="patient-dialog-title">#{msg['distribution.page.patient.nouveauPatient']}</span>
|
||||
<span class="patient-dialog-subtitle">#{msg['distribution.page.patient.nouveauPatientSousTitre']}</span>
|
||||
</h:panelGroup>
|
||||
<span class="patient-dialog-close" onclick="PF('ajoutPatientDialog').hide();">
|
||||
<i class="pi pi-times"></i>
|
||||
</span>
|
||||
</h:panelGroup>
|
||||
|
||||
<h:panelGroup id="panel" layout="block" styleClass="patient-dialog-body">
|
||||
<div class="dialog-field-grid">
|
||||
|
||||
<div class="dialog-field-hint">
|
||||
<i class="pi pi-info-circle"></i>
|
||||
<span>#{msg['distribution.page.patient.codeGenereAuto']}</span>
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.prenom']}<span class="required-mark">*</span></label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.prenom}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.prenom']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.nom']}<span class="required-mark">*</span></label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.nom}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.nom']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.sexe']}<span class="required-mark">*</span></label>
|
||||
<p:selectOneMenu value="#{patientBean.nouveauPatient.sexe}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.sexe']} : #{msg['distribution.page.champObligatoire']}">
|
||||
<f:selectItem itemLabel="#{msg['distribution.page.selectionner']}" itemValue="" noSelectionOption="true" />
|
||||
<f:selectItem itemLabel="Homme" itemValue="Homme" />
|
||||
<f:selectItem itemLabel="Femme" itemValue="Femme" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.dateNaissance']}<span class="required-mark">*</span></label>
|
||||
<p:calendar value="#{patientBean.nouveauPatient.dateNaissance}" pattern="dd/MM/yyyy"
|
||||
placeholder="jj/mm/aaaa" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.dateNaissance']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">NIN</label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.nin}" styleClass="dialog-field-input" />
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">NIS</label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.nis}" styleClass="dialog-field-input" />
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.telephone']}<span class="required-mark">*</span></label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.telephone}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.telephone']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.telephoneRelative']}<span class="required-mark">*</span></label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.telephoneRelative}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.telephoneRelative']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.email']}</label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.email}" styleClass="dialog-field-input" />
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.wilaya']}<span class="required-mark">*</span></label>
|
||||
<p:selectOneMenu value="#{patientBean.nouveauPatient.fkWilaya}" styleClass="dialog-field-input"
|
||||
filter="true" filterMatchMode="contains" converter="wilayaConverter"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.wilaya']} : #{msg['distribution.page.champObligatoire']}">
|
||||
<f:converter binding="#{wilayaConverter}" />
|
||||
<f:selectItem itemLabel="#{msg['distribution.page.selectionner']}" itemValue="#{null}" noSelectionOption="true" />
|
||||
<f:selectItems value="#{patientBean.allWilayas}" var="w" itemLabel="#{w.code}:#{w.name}" itemValue="#{w}" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
|
||||
<div class="dialog-field dialog-field-full">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.adresse']}<span class="required-mark">*</span></label>
|
||||
<p:inputText value="#{patientBean.nouveauPatient.adresse}" styleClass="dialog-field-input"
|
||||
required="true" requiredMessage="#{msg['distribution.page.patient.adresse']} : #{msg['distribution.page.champObligatoire']}" />
|
||||
</div>
|
||||
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.patient.groupage']}</label>
|
||||
<p:selectOneMenu value="#{patientBean.nouveauPatient.groupage}" styleClass="dialog-field-input">
|
||||
<f:selectItem itemLabel="#{msg['distribution.page.selectionner']}" itemValue="" noSelectionOption="true" />
|
||||
<f:selectItem itemLabel="A+" itemValue="A+" />
|
||||
<f:selectItem itemLabel="A-" itemValue="A-" />
|
||||
<f:selectItem itemLabel="B+" itemValue="B+" />
|
||||
<f:selectItem itemLabel="B-" itemValue="B-" />
|
||||
<f:selectItem itemLabel="AB+" itemValue="AB+" />
|
||||
<f:selectItem itemLabel="AB-" itemValue="AB-" />
|
||||
<f:selectItem itemLabel="O+" itemValue="O+" />
|
||||
<f:selectItem itemLabel="O-" itemValue="O-" />
|
||||
</p:selectOneMenu>
|
||||
</div>
|
||||
<div class="dialog-field">
|
||||
<label class="dialog-field-label">#{msg['distribution.page.status']}</label>
|
||||
<div class="dialog-field-checkbox">
|
||||
<p:selectBooleanCheckbox value="#{patientBean.nouveauPatient.actif}" itemLabel="Actif" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</h:panelGroup>
|
||||
|
||||
<f:facet name="footer">
|
||||
<div class="patient-dialog-footer">
|
||||
<p:commandButton value="#{msg['distribution.page.annuler']}" icon="pi pi-times" type="button"
|
||||
styleClass="dialog-secondary-btn"
|
||||
onclick="PF('ajoutPatientDialog').hide();" />
|
||||
<p:commandButton
|
||||
value="#{msg['distribution.page.enregistrer']}"
|
||||
icon="pi pi-check"
|
||||
action="#{patientBean.enregistrerNouveauPatient}"
|
||||
update=":form:dataTable :form:growlMessages :dlg:panel" />
|
||||
</div>
|
||||
</f:facet>
|
||||
</p:dialog>
|
||||
</h:form>
|
||||
</ui:define>
|
||||
</ui:composition>
|
||||
Loading…
Reference in New Issue
Block a user