package managedbean.medicalTest; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalTime; import java.util.ArrayList; import java.util.Base64; import java.util.List; import javax.annotation.PostConstruct; import javax.faces.application.FacesMessage; import javax.faces.event.AjaxBehaviorEvent; import javax.faces.view.ViewScoped; import javax.inject.Named; import org.primefaces.event.SelectEvent; import org.primefaces.model.UploadedFile; import TO.MedicalTestTO; import TO.PatientTO; import common.Constants; import common.MedicalTestType; import common.UserType; import managedbean.common.ManagedBeanBase; import managedbean.common.SessionUtils; @Named("mt") @ViewScoped public class MedicalTestMBean extends ManagedBeanBase implements Serializable { private static final long serialVersionUID = 1L; private int userID; private UserType userType; private List medicalTests; private MedicalTestTO selected; private PatientTO patSelected; private PatientTO patientFilterSelected; private boolean addNewMode = false; private UploadedFile imageUpload; private List patientList; private List patientWithTestList; private String lastUIQuery; private String lastUIQueryPatFilter; private List medicalTestTypes; private LocalDate testDate; private LocalTime testTime; private String testObservations; private MedicalTestType testType; public MedicalTestMBean() { } @PostConstruct public void init() { this.userType = SessionUtils.getUserType(); this.userID = Integer.valueOf(SessionUtils.getUserId()); this.medicalTestTypes = new ArrayList(); this.medicalTestTypes.add(MedicalTestType.BLOOD_TEST); this.medicalTestTypes.add(MedicalTestType.CT_SCAN); this.medicalTestTypes.add(MedicalTestType.MAGNETIC_RESONANCE_IMAGING); this.selected = null; this.patSelected = null; this.lastUIQuery = ""; this.lastUIQueryPatFilter = ""; switch (userType) { case ADMINISTRATOR: case PATIENT: this.patientList = null; this.patientWithTestList = null; break; case SPECIALIST_DOCTOR: this.patientList = this.getRemoteManagerCommon().listPatientsPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); this.patientWithTestList = this.getRemoteManagerMedicalTest().loadPatientsForSpecialistDoctor(userID, null, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); break; case FAMILY_DOCTOR: this.patientList = null; this.patientWithTestList = this.getRemoteManagerMedicalTest().loadPatientsForFamilyDoctor(userID, null, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); } this.loadMedicalTests(); } public void addImage() { if (this.imageUpload != null) { String content = "data:" + imageUpload.getContentType() + ";base64," + Base64.getEncoder().encodeToString(imageUpload.getContents()); System.out.println("FILE Content base64: "); System.out.println(content); this.selected.setHighresimage(content); getRemoteManagerMedicalTest().addImage(this.selected.getId(), content); this.loadMedicalTests(); this.imageUpload = null; } else { System.out.println("IMAGEN SUBIDA ES NULA"); } } public UploadedFile getImageUpload() { return imageUpload; } public void setImageUpload(UploadedFile imageUpload) { this.imageUpload = imageUpload; } public void removeImage() { this.selected.setHighresimage(null); getRemoteManagerMedicalTest().removeImage(this.selected.getId()); this.loadMedicalTests(); } public MedicalTestTO getSelected() { return this.selected; } public void setSelected(MedicalTestTO selected) { this.selected = selected; } public PatientTO getPatSelected() { return this.patSelected; } public void setPatSelected(PatientTO s) { this.patSelected = s; } public void loadMedicalTests() { Integer patId = -1; if (this.patientFilterSelected != null) patId = this.patientFilterSelected.getId(); switch (userType) { case PATIENT: // Cargar las pruebas para el paciente en sesión this.medicalTests = getRemoteManagerMedicalTest().loadMedicalTestForPatient(userID); break; case SPECIALIST_DOCTOR: // Cargar las pruebas que el doctor especialista ha creado this.medicalTests = getRemoteManagerMedicalTest().loadMedicalTestForSpecialistDoctor(userID, patId); break; case FAMILY_DOCTOR: // Cargar las pruebas para los pacientes del doctor de familia en sesión this.medicalTests = getRemoteManagerMedicalTest().loadMedicalTestForFamilyDoctor(userID, patId); break; case ADMINISTRATOR: this.medicalTests = null; this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Operación no válida para el tipo de usuario actual."); break; } } public List completePatient(String query) { if (query != null && query.equals(this.lastUIQuery) == false) { this.lastUIQuery = query; // Recuperamos las xxx primeras coincidencias this.patientList = this.getRemoteManagerCommon().listPatientsFiltered(query, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); } return this.patientList; } public List completePatientFilter(String query) { if (query != null && query.equals(this.lastUIQueryPatFilter) == false) { this.lastUIQueryPatFilter = query; switch (userType) { case SPECIALIST_DOCTOR: // Cargar los pacientes a los que ha añadido pruebas médicas el médico especialista this.patientWithTestList = this.getRemoteManagerMedicalTest().loadPatientsForSpecialistDoctor(userID, query, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); break; case FAMILY_DOCTOR: // Cargar los pacientes del médico de familia que tiene pruebas médicas hechas this.patientWithTestList = this.getRemoteManagerMedicalTest().loadPatientsForFamilyDoctor(userID, query, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); break; case ADMINISTRATOR: case PATIENT: this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Operación no válida para el tipo de usuario actual."); this.patientWithTestList = null; break; } } return this.patientWithTestList; } public List getPatientList() { return patientList; } public List getPatientWithTestList() { return patientWithTestList; } public List getMedicalTests() { return this.medicalTests; } public void setMedicalTests(List list) { // Nothing to do } public boolean isSpecialistDoctor() { return this.userType == UserType.SPECIALIST_DOCTOR; } public boolean isPatSelector() { return !(userType == UserType.PATIENT); } public void clearFilteredPatient() { this.addNewMode = false; this.selected = null; this.patientFilterSelected = null; this.loadMedicalTests(); } public void onChangePatient(AjaxBehaviorEvent event) { this.selected = null; this.loadMedicalTests(); } public void onSelectPatient(SelectEvent event) { this.selected = null; this.patientFilterSelected = (PatientTO) event.getObject(); this.loadMedicalTests(); } public void onSelectMT(SelectEvent event) { this.selected = (MedicalTestTO) event.getObject(); this.addNewMode = false; } public void addMT() { // Si hay un paciente filtrado en la busqueda de pruebas, lo seleccionamos para la prueba a añadir. //this.patSelected = this.patientFilterSelected; this.testDate = LocalDate.now(); this.testTime = LocalTime.now(); this.testObservations = ""; this.testType = MedicalTestType.BLOOD_TEST; this.addNewMode = true; } public boolean isAddNewMode() { return addNewMode; } public void setAddNewMode(boolean addNewMode) { this.addNewMode = addNewMode; } public boolean getViewCreate() { return addNewMode && userType == UserType.SPECIALIST_DOCTOR; } public boolean getViewEdit() { return !addNewMode && this.selected != null; } public List getMedicalTestTypes() { return this.medicalTestTypes; } public void save() { try { MedicalTestTO mt = this.getRemoteManagerMedicalTest().addMedicalTest(this.patSelected.getId(), this.userID, this.testDate, this.testTime, this.testType, this.testObservations); this.addFacesMessage(FacesMessage.SEVERITY_INFO, "Éxito", String.format("La prueba médica se ha guardado correctamente, el identificador asignado es: %d", mt.getId())); // Volvemos al modo añadir (limpiamos el formulario). this.addMT(); this.loadMedicalTests(); } catch (Exception ex) { this.manageException(ex); } } public PatientTO getPatientFilterSelected() { return patientFilterSelected; } public void setPatientFilterSelected(PatientTO patientFilterSelected) { this.patientFilterSelected = patientFilterSelected; } public LocalDate getTestDate() { return testDate; } public void setTestDate(LocalDate testDate) { this.testDate = testDate; } public LocalTime getTestTime() { return testTime; } public void setTestTime(LocalTime testTime) { this.testTime = testTime; } public String getTestObservations() { return testObservations; } public void setTestObservations(String testObservations) { this.testObservations = testObservations; } public MedicalTestType getTestType() { return testType; } public void setTestType(MedicalTestType testType) { this.testType = testType; } }