Compare commits

...

5 commits

Author SHA1 Message Date
001d8bd2ce
NOTICKET: Javaodc & Cleanup
All checks were successful
Quality Check / Linting Check (push) Successful in 16s
Quality Check / Linting Check (pull_request) Successful in 21s
Quality Check / Javadoc Check (push) Successful in 36s
Quality Check / Javadoc Check (pull_request) Successful in 33s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-15 10:22:13 +02:00
082c6a7a2f
#17: Cleanup
All checks were successful
Quality Check / Linting Check (push) Successful in 18s
Quality Check / Linting Check (pull_request) Successful in 22s
Quality Check / Javadoc Check (push) Successful in 36s
Quality Check / Javadoc Check (pull_request) Successful in 34s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-15 09:51:57 +02:00
54bdc21040
#17: Update Views to show the Nurse
All checks were successful
Quality Check / Linting Check (push) Successful in 12s
Quality Check / Javadoc Check (push) Successful in 20s
Quality Check / Linting Check (pull_request) Successful in 12s
Quality Check / Javadoc Check (pull_request) Successful in 20s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-15 08:49:06 +02:00
c6c3e6528a
#17: Update Treatment Model, Dao and Fixtures for Relation to a Nurse
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-15 08:43:25 +02:00
a4e61157ef
#10: Add TODOs for implementation
All checks were successful
Quality Check / Linting Check (push) Successful in 12s
Quality Check / Javadoc Check (push) Successful in 20s
2024-05-15 00:39:27 +02:00
33 changed files with 786 additions and 272 deletions

Binary file not shown.

View file

@ -1,7 +1,6 @@
package de.hitec.nhplus;
import de.hitec.nhplus.datastorage.ConnectionBuilder;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
@ -12,18 +11,35 @@ import javafx.stage.Stage;
import java.io.IOException;
/**
* @author dominik.saeume@hmmh.ag
* The application main class, holding the {@link #main} entrypoint.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class Main extends Application {
private Stage primaryStage;
/**
* The main entry point.
*/
public static void main(String[] args) {
launch(args);
}
/**
* Implementation of the JavaFX start hook.
*/
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
mainWindow();
executeMainApplication();
}
public void mainWindow() {
/**
* Executes the main application.
*/
private void executeMainApplication() {
try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/main/MainWindowView.fxml"));
TabPane pane = loader.load();
@ -44,7 +60,4 @@ public class Main extends Application {
}
}
public static void main(String[] args) {
launch(args);
}
}

View file

@ -7,7 +7,7 @@ import java.sql.DriverManager;
import java.sql.SQLException;
/**
* The {@link DaoFactory} allows a safe connection to the Database.
* The {@link DaoFactory} allows a safe connection to the database.
*
* @author Bernd Heidemann
* @author Dominik Säume
@ -21,7 +21,7 @@ public class ConnectionBuilder {
private static Connection connection;
/**
* @return A Thread-safe {@link Connection} to the Database.
* @return A thread-safe {@link Connection} to the database.
*/
synchronized public static Connection getConnection() {
try {
@ -38,7 +38,7 @@ public class ConnectionBuilder {
}
/**
* Closes the Connection to the Database.
* Closes the connection to the database.
*/
synchronized public static void closeConnection() {
try {

View file

@ -4,47 +4,48 @@ import java.sql.SQLException;
import java.util.List;
/**
* {@link Dao} is the Abbreviation of Data-Access-Object.
* This Interface has the Basic Methods which are needed on any {@link Dao} to work as expected.
* {@link Dao} is the abbreviation for Data-Access-Object.
* This interface has the Basic Methods that are needed on any {@link Dao} to work as expected.
*
* @param <T> The Model for which that {@link Dao} is implemented.
* @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemann
* @author Dominik Säume
* @version 1.0
* @implSpec The Implementations should be added to the {@link DaoFactory}.
* @implSpec The implementations should be added to the {@link DaoFactory}.
*/
public interface Dao<T> {
/**
* Create a Database Entry from a Model object.
* Create a database entry from a model object.
*
* @param t The Model instance.
* @param t The model instance.
*/
void create(T t) throws SQLException;
/**
* Read a Database Entry to a Model object.
* Read a database entry to a model object.
*
* @param id The ID of the Element in the Database.
* @param id The ID of the element in the database.
* @return a model instance of {@link T}.
*/
T read(int id) throws SQLException;
/**
* @return All Database Entries as a {@link List} of Model instances
* @return All database entries as a {@link List} of model instances.
*/
List<T> readAll() throws SQLException;
/**
* Update the Database according to the Values of the Model object.
* Update the database according to the values of the model object.
*
* @param t The Model instance.
* @param t The model instance.
*/
void update(T t) throws SQLException;
/**
* Delete a Database Entry.
* Delete a database entry.
*
* @param id The ID of the Element in the Database.
* @param id The ID of the element in the database.
*/
void delete(int id) throws SQLException;
}

View file

@ -6,7 +6,7 @@ import de.hitec.nhplus.patient.database.PatientDao;
import de.hitec.nhplus.treatment.database.TreatmentDao;
/**
* The {@link DaoFactory} is a Singleton({@link #getInstance}) which should be used to get {@link Dao}s.
* The {@link DaoFactory} is a singleton({@link #getInstance}) that should be used to get {@link Dao}s.
*
* @author Bernd Heidemann
* @author Dominik Säume
@ -17,13 +17,13 @@ public class DaoFactory {
private static DaoFactory instance;
/**
* A Private Constructor according to the Singleton Pattern.
* A private constructor according to the singleton pattern.
*/
private DaoFactory() {
}
/**
* @return The Singleton Instance.
* @return The singleton instance of {@link DaoFactory}.
*/
public static DaoFactory getInstance() {
if (DaoFactory.instance == null) {
@ -33,7 +33,7 @@ public class DaoFactory {
}
/**
* @return A new {@link TreatmentDao} Instance with a Database Connection.
* @return A new {@link TreatmentDao} instance with a database connection.
* @see de.hitec.nhplus.treatment.Treatment Treatment
*/
public TreatmentDao createTreatmentDao() {
@ -41,7 +41,7 @@ public class DaoFactory {
}
/**
* @return A new {@link PatientDao} Instance with a Database Connection.
* @return A new {@link PatientDao} instance with a database connection.
* @see de.hitec.nhplus.patient.Patient Patient
*/
public PatientDao createPatientDAO() {
@ -49,7 +49,7 @@ public class DaoFactory {
}
/**
* @return A new {@link NurseDao} Instance with a Database Connection.
* @return A new {@link NurseDao} instance with a database connection.
* @see de.hitec.nhplus.nurse.Nurse Nurse
*/
public NurseDao createNurseDAO() {
@ -57,7 +57,7 @@ public class DaoFactory {
}
/**
* @return A new {@link MedicationDao} Instance with a Database Connection.
* @return A new {@link MedicationDao} instance with a database connection.
* @see de.hitec.nhplus.medication.Medication Medication
*/
public MedicationDao createMedicationDAO() {

View file

@ -7,30 +7,30 @@ import java.sql.SQLException;
import java.util.List;
/**
* The {@link DaoImp} is a Generic Base Implementation of the {@link Dao},
* which should fit most use cases.
* The {@link DaoImp} is a generic base implementation of the {@link Dao},
* that should fit most use cases.
*
* @param <T> The Model for which that {@link Dao} is implemented.
* @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemann
* @author Dominik Säume
* @version 1.0
* @implSpec The Implementations should be added to the {@link DaoFactory}.
* @implSpec The implementations should be added to the {@link DaoFactory}.
*/
public abstract class DaoImp<T> implements Dao<T> {
protected final Connection connection;
/**
* @param connection The Database Connection to use
* @implSpec The Connection should be Received from the {@link ConnectionBuilder}.
* @param connection The database {@link Connection} to use.
* @implSpec The {@link Connection} should be received from the {@link ConnectionBuilder}.
*/
public DaoImp(Connection connection) {
this.connection = connection;
}
/**
* Creates a new Database Entry from a Model object.
* Creates a new database entry from a model object.
*
* @param t The Model instance.
* @param t The model instance.
*/
@Override
public void create(T t) throws SQLException {
@ -38,9 +38,10 @@ public abstract class DaoImp<T> implements Dao<T> {
}
/**
* Read a Database Entry to a Model object.
* Read a database entry to a model object.
*
* @param id The ID of the Element in the Database.
* @param id The ID of the element in the database.
* @return the model instance of type {@link T}, which was read.
*/
@Override
public T read(int id) throws SQLException {
@ -53,7 +54,9 @@ public abstract class DaoImp<T> implements Dao<T> {
}
/**
* Read all Database Entries to a {@link List} of Model objects.
* Read all database entries to a {@link List} of model objects.
*
* @return a {@link List} of type {@link T} holding all database entries as model instances.
*/
@Override
public List<T> readAll() throws SQLException {
@ -61,9 +64,9 @@ public abstract class DaoImp<T> implements Dao<T> {
}
/**
* Update the Database according to the Values of the Model object.
* Update the database according to the values of the model object.
*
* @param t The Model instance.
* @param t The model instance.
*/
@Override
public void update(T t) throws SQLException {
@ -71,26 +74,62 @@ public abstract class DaoImp<T> implements Dao<T> {
}
/**
* Delete a Database Entry.
* Delete a database entry.
*
* @param id The ID of the Element in the Database.
* @param id The ID of the element in the database.
*/
@Override
public void delete(int id) throws SQLException {
getDeleteStatement(id).executeUpdate();
}
/**
* @param result The {@link ResultSet} from execution of the statement received from {@link #getReadByIDStatement}.
* @return The model instance of type {@link T}.
* @implSpec This will be called in {@link #read}.
*/
protected abstract T getInstanceFromResultSet(ResultSet result) throws SQLException;
protected abstract List<T> getListFromResultSet(ResultSet result) throws SQLException;
protected abstract PreparedStatement getCreateStatement(T t) throws SQLException;
/**
* @param id The ID of the database entry to read.
* @return A {@link PreparedStatement} to read a specific entry by its ID.
* @implSpec This will be called in {@link #read}.
* The output of the execution will be used in {@link #getInstanceFromResultSet}.
*/
protected abstract PreparedStatement getReadByIDStatement(int id) throws SQLException;
/**
* @param result The {@link ResultSet} from execution of the statement received from {@link #getReadAllStatement}.
* @return A {@link List} of type {@link T} holding all database entries as model instances.
* @implSpec This will be called in {@link #readAll}.
*/
protected abstract List<T> getListFromResultSet(ResultSet result) throws SQLException;
/**
* @return A {@link PreparedStatement} to read all entries of this model.
* @implSpec This will be called in {@link #readAll}.
* The output of the execution will be used in {@link #getListFromResultSet}.
*/
protected abstract PreparedStatement getReadAllStatement() throws SQLException;
/**
* @param t The model instance of type {@link T} for which an entry should be created.
* @return a {@link PreparedStatement} which can be used to create a new database entry for the model instance.
* @implSpec This will be called in {@link #create}.
*/
protected abstract PreparedStatement getCreateStatement(T t) throws SQLException;
/**
* @param t The model instance of type {@link T} for which the entry should be updated.
* @return a {@link PreparedStatement} which can be used to update the database entry for the model instance.
* @implSpec This will be called in {@link #update}.
*/
protected abstract PreparedStatement getUpdateStatement(T t) throws SQLException;
/**
* @param id The ID of the database entry which should be deleted.
* @return a {@link PreparedStatement} which can be used to delete the database entry.
* @implSpec This will be called in {@link #delete}.
*/
protected abstract PreparedStatement getDeleteStatement(int id) throws SQLException;
}

View file

@ -7,36 +7,36 @@ import java.sql.SQLException;
import java.util.Map;
/**
* A Fixture is a Class, which can be used to set up a specific set of Data.
* A fixture is a class, which can be used to set up a specific set of data.
*
* @param <T> The Model for which the {@link Fixture} is implemented.
* @param <T> The model for which the {@link Fixture} is implemented.
* @author Dominik Säume
* @version 1.0
* @implSpec The Implementations should be added to the {@link Fixtures#main}.
* @implSpec The implementations should be added to the {@link Fixtures#main}.
*/
public interface Fixture<T> {
/**
* Drop all Dependent Tables.
* Drop all dependent tables.
*
* @param connection A Database {@link Connection}, which should be received from
* @param connection A database {@link Connection}, which should be received from
* the {@link ConnectionBuilder#getConnection}
* @implSpec Use {@code IF EXISTS}, to ensure that it doesn't throw an {@link Exception}.
*/
void dropTable(Connection connection) throws SQLException;
/**
* Set up the Empty Tables with the Schema.
* Set up the empty tables with the schema.
*
* @param connection A Database {@link Connection}, which should be received from
* @param connection A database {@link Connection}, which should be received from
* the {@link ConnectionBuilder#getConnection}
*/
void setupTable(Connection connection) throws SQLException;
/**
* Loads all Model specific Data to the Database.
* Loads all model specific data to the database.
*
* @return A Map of Models with a {@link String} key, to be used by other {@link Fixture}
* @return A map of models with a {@link String} key, to be used by other {@link Fixture}
* @implSpec The {@link de.hitec.nhplus.datastorage.Dao Dao} should be received
* from {@link de.hitec.nhplus.datastorage.DaoFactory DaoFactory}.
*/

View file

@ -1,13 +1,14 @@
package de.hitec.nhplus.fixtures;
import de.hitec.nhplus.datastorage.ConnectionBuilder;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.patient.Patient;
import java.sql.Connection;
import java.util.Map;
/**
* A Class, Implementing an Entrypoint({@link #main}), for loading a Specific set of Data.
* A class, implementing an entrypoint({@link #main}), for loading a specific set of data.
*
* @author Dominik Säume
* @version 1.0
@ -15,7 +16,7 @@ import java.util.Map;
public class Fixtures {
/**
* An Entrypoint, for loading a Specific set of Data.
* An entrypoint, for loading a specific set of data.
*
* @param args unused.
*/
@ -28,15 +29,17 @@ public class Fixtures {
patientFixture.setupTable(connection);
Map<String, Patient> patientsByName = patientFixture.load();
TreatmentFixture treatmentFixture = new TreatmentFixture(patientsByName);
NurseFixture nurseFixture = new NurseFixture();
nurseFixture.dropTable(connection);
nurseFixture.setupTable(connection);
Map<String, Nurse> nursesByName = nurseFixture.load();
TreatmentFixture treatmentFixture = new TreatmentFixture(patientsByName, nursesByName);
treatmentFixture.dropTable(connection);
treatmentFixture.setupTable(connection);
treatmentFixture.load();
NurseFixture nurseFixture = new NurseFixture();
nurseFixture.dropTable(connection);
nurseFixture.setupTable(connection);
nurseFixture.load();
MedicationFixture medicationFixture = new MedicationFixture();
medicationFixture.dropTable(connection);

View file

@ -12,7 +12,11 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
/**
* {@link Fixture} for {@link Medication}.
*
* @author Dominik Säume
*/
public class MedicationFixture implements Fixture<Medication> {
private static final String SCHEMA = "/de/hitec/nhplus/medication/database/Medication.sql";
private static final String INGREDIENT_SCHEMA = "/de/hitec/nhplus/medication/database/Medication_Ingredient.sql";

View file

@ -4,6 +4,7 @@ import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.nurse.database.NurseDao;
import de.hitec.nhplus.treatment.Treatment;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@ -11,6 +12,11 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
/**
* {@link Fixture} for {@link Nurse}.
*
* @author Dominik Säume
*/
public class NurseFixture implements Fixture<Nurse> {
@Override
public void dropTable(Connection connection) throws SQLException {

View file

@ -13,6 +13,11 @@ import java.util.*;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate;
/**
* {@link Fixture} for {@link Patient}.
*
* @author Dominik Säume
*/
public class PatientFixture implements Fixture<Patient> {
@Override
public void dropTable(Connection connection) throws SQLException {

View file

@ -2,6 +2,7 @@ package de.hitec.nhplus.fixtures;
import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.treatment.Treatment;
import de.hitec.nhplus.treatment.database.TreatmentDao;
@ -15,11 +16,19 @@ import java.util.*;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalTime;
/**
* {@link Fixture} for {@link Treatment}.
*
* @author Dominik Säume
*/
public class TreatmentFixture implements Fixture<Treatment> {
private final Map<String, Patient> patientsByName;
private final Map<String, Nurse> nursesByName;
public TreatmentFixture(Map<String, Patient> patientsByName) {
public TreatmentFixture(Map<String, Patient> patientsByName, Map<String, Nurse> nursesByName) {
this.patientsByName = patientsByName;
this.nursesByName = nursesByName;
}
@Override
@ -45,9 +54,13 @@ public class TreatmentFixture implements Fixture<Treatment> {
Patient ahmet = patientsByName.get("Ahmet");
Patient elisabeth = patientsByName.get("Elisabeth");
Nurse ole = nursesByName.get("Ole");
Nurse armin = nursesByName.get("Armin");
treatments.add(new Treatment(
1,
seppl,
ole,
convertStringToLocalDate("2023-06-03"),
convertStringToLocalTime("11:00"),
convertStringToLocalTime("15:00"),
@ -59,6 +72,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
2,
seppl,
armin,
convertStringToLocalDate("2023-06-05"),
convertStringToLocalTime("11:00"),
convertStringToLocalTime("12:30"),
@ -70,6 +84,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
3,
martina,
ole,
convertStringToLocalDate("2023-06-04"),
convertStringToLocalTime("07:30"),
convertStringToLocalTime("08:00"),
@ -79,6 +94,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
4,
seppl,
armin,
convertStringToLocalDate("2023-06-06"),
convertStringToLocalTime("15:10"),
convertStringToLocalTime("16:00"),
@ -88,6 +104,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
8,
seppl,
ole,
convertStringToLocalDate("2023-06-08"),
convertStringToLocalTime("15:00"),
convertStringToLocalTime("16:00"),
@ -97,6 +114,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
9,
martina,
armin,
convertStringToLocalDate("2023-06-07"),
convertStringToLocalTime("11:00"),
convertStringToLocalTime("11:30"),
@ -106,6 +124,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
12,
hans,
armin,
convertStringToLocalDate("2023-06-08"),
convertStringToLocalTime("15:00"),
convertStringToLocalTime("15:30"),
@ -115,6 +134,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
14,
ahmet,
ole,
convertStringToLocalDate("2023-08-24"),
convertStringToLocalTime("09:30"),
convertStringToLocalTime("10:15"),
@ -123,6 +143,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
16,
elisabeth,
armin,
convertStringToLocalDate("2023-08-31"),
convertStringToLocalTime("13:30"),
convertStringToLocalTime("13:45"),
@ -132,6 +153,7 @@ public class TreatmentFixture implements Fixture<Treatment> {
treatments.add(new Treatment(
17,
elisabeth,
ole,
convertStringToLocalDate("2023-09-01"),
convertStringToLocalTime("16:00"),
convertStringToLocalTime("17:00"),

View file

@ -11,6 +11,12 @@ import javafx.scene.layout.BorderPane;
import java.io.IOException;
import java.util.Objects;
/**
* Controller for the main window of the application, which holds all tabs.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class MainWindowController {
@FXML
private TabPane mainTabPane;
@ -42,6 +48,9 @@ public class MainWindowController {
medicationTab.setOnSelectionChanged(event -> loadMedicationPage());
}
/**
* Loads the patient page into its tab.
*/
private void loadPatientPage() {
try {
BorderPane patientsPane = FXMLLoader.load(
@ -57,6 +66,9 @@ public class MainWindowController {
}
}
/**
* Loads the treatment page into its tab.
*/
private void loadTreatmentsPage() {
try {
BorderPane treatmentsPane = FXMLLoader.load(
@ -72,6 +84,9 @@ public class MainWindowController {
}
}
/**
* Loads the nurse page into its tab.
*/
private void loadNursePage() {
try {
BorderPane nursePane = FXMLLoader.load(
@ -87,6 +102,9 @@ public class MainWindowController {
}
}
/**
* Loads the medication page into its tab.
*/
private void loadMedicationPage() {
try {
BorderPane medicationPane = FXMLLoader.load(

View file

@ -2,6 +2,12 @@ package de.hitec.nhplus.main;
import javafx.beans.property.SimpleStringProperty;
/**
* A simple base model for a {@link Person} that can be extended.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public abstract class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty surName;

View file

@ -13,6 +13,11 @@ import javafx.scene.control.cell.PropertyValueFactory;
import java.sql.SQLException;
import java.util.stream.Collectors;
/**
* The controller for viewing all {@link Medication}s.
*
* @author Dominik Säume
*/
public class AllMedicationController {
@FXML
private TableView<Medication> tableView;
@ -34,6 +39,10 @@ public class AllMedicationController {
private final ObservableList<Medication> medications = FXCollections.observableArrayList();
private MedicationDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() {
readAllAndShowInTableView();
@ -41,16 +50,14 @@ public class AllMedicationController {
this.columnName.setCellValueFactory(new PropertyValueFactory<>("name"));
this.columnManufacturer.setCellValueFactory(new PropertyValueFactory<>("manufacturer"));
this.columnIngredient.setCellValueFactory(
cellData -> {
return new SimpleStringProperty(
cellData
.getValue()
.getIngredients()
.stream()
.map(ingredient -> ingredient.getName())
.collect(Collectors.joining("\n"))
);
});
cellData -> new SimpleStringProperty(
cellData
.getValue()
.getIngredients()
.stream()
.map(ingredient -> ingredient.getName())
.collect(Collectors.joining("\n"))
));
this.columnPossibleSideEffects.setCellValueFactory(new PropertyValueFactory<>("possibleSideEffects"));
this.columnAdministrationMethod.setCellValueFactory(new PropertyValueFactory<>("administrationMethod"));
this.columnCurrentStock.setCellValueFactory(new PropertyValueFactory<>("currentStock"));
@ -58,6 +65,9 @@ public class AllMedicationController {
this.tableView.setItems(this.medications);
}
/**
* Internal method to read all data and set it to the table view.
*/
public void readAllAndShowInTableView() {
this.dao = DaoFactory.getInstance().createMedicationDAO();
try {

View file

@ -2,6 +2,13 @@ package de.hitec.nhplus.medication;
import javafx.beans.property.SimpleStringProperty;
/**
* The simple model for an {@link Ingredient}.
*
* @author Dominik Säume
* @implSpec This isn't a conventional model, because it isn't directly stored in the database,
* but it can be changed to do that, in the case that its complexity rises in the future.
*/
public class Ingredient {
private final SimpleStringProperty name;

View file

@ -10,6 +10,11 @@ import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
/**
* The model for a {@link Medication}.
*
* @author Dominik Säume
*/
public class Medication {
private SimpleIntegerProperty id;
private final SimpleStringProperty name;
@ -19,6 +24,13 @@ public class Medication {
private final SimpleStringProperty administrationMethod;
private final SimpleIntegerProperty currentStock;
/**
* This constructor allows instantiating a {@link Medication} object,
* before it is stored in the database, by omitting the {@link Medication#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.medication.database.MedicationDao#create MedicationDao.create}.
*/
public Medication(
String name,
String manufacturer,
@ -35,6 +47,9 @@ public class Medication {
this.currentStock = new SimpleIntegerProperty(currentStock);
}
/**
* This constructor allows instantiating a {@link Medication} object with all existing fields.
*/
public Medication(
int id,
String name,

View file

@ -13,6 +13,13 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* The {@link MedicationDao} is an implementation of the{@link de.hitec.nhplus.datastorage.Dao Dao}
* for the {@link Medication} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class MedicationDao implements Dao<Medication> {
protected final Connection connection;
@ -153,6 +160,13 @@ public class MedicationDao implements Dao<Medication> {
preparedStatement.executeUpdate();
}
/**
* Constructs a {@link Medication} object from the {@link ResultSet} obtained after executing a database query.
* This method is used internally to map the {@link ResultSet} data to a {@link Medication} object.
*
* @param result The {@link ResultSet} containing the data retrieved from the database.
* @return A {@link Medication} object constructed from the {@link ResultSet} data.
*/
private Medication getInstanceFromResultSet(ResultSet result) throws SQLException {
Medication medication = new Medication(
result.getInt(1),

View file

@ -17,6 +17,12 @@ import javafx.scene.control.cell.TextFieldTableCell;
import java.sql.SQLException;
/**
* The controller for viewing all {@link Nurse}s.
*
* @author Dominik Säume
* @author Ole Kück
*/
public class AllNurseController {
@FXML
public TextField textFieldSurName;
@ -40,6 +46,10 @@ public class AllNurseController {
private final ObservableList<Nurse> nurses = FXCollections.observableArrayList();
private NurseDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() {
this.readAllAndShowInTableView();
@ -72,15 +82,28 @@ public class AllNurseController {
this.textFieldPhoneNumber.textProperty().addListener(inputNewNurseValidationListener);
}
/**
* Internal method to read all data and set it to the table view.
*/
private void readAllAndShowInTableView(){
this.nurses.clear();
this.dao = DaoFactory.getInstance().createNurseDAO();
try {
this.nurses.addAll(this.dao.readAll());
this.nurses.setAll(this.dao.readAll());
}catch (SQLException exception){
exception.printStackTrace();
}
}
/**
* Internal method that clears the text fields used for creating a new {@link Nurse}.
*/
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldPhoneNumber.clear();
}
@FXML
public void handleAdd(){
String surname=this.textFieldSurName.getText();
@ -96,10 +119,5 @@ public class AllNurseController {
clearTextfields();
}
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldPhoneNumber.clear();
}
}

View file

@ -6,10 +6,22 @@ import javafx.beans.property.SimpleStringProperty;
import java.util.StringJoiner;
/**
* The model for a {@link Nurse}.
*
* @author Dominik Säume
*/
public class Nurse extends Person {
private SimpleIntegerProperty id;
private final SimpleStringProperty phoneNumber;
/**
* This constructor allows instantiating a {@link Nurse} object,
* before it is stored in the database, by omitting the {@link Nurse#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.nurse.database.NurseDao#create NurseDao.create}.
*/
public Nurse(
String firstName,
String surName,
@ -19,6 +31,9 @@ public class Nurse extends Person {
this.phoneNumber = new SimpleStringProperty(phoneNumber);
}
/**
* This constructor allows instantiating a {@link Nurse} object with all existing fields.
*/
public Nurse(
int id,
String firstName,

View file

@ -10,6 +10,12 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link NurseDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao}
* for the {@link Nurse} model.
*
* @author Dominik Säume
*/
public class NurseDao extends DaoImp<Nurse> {
public NurseDao(Connection connection) {
super(connection);

View file

@ -19,6 +19,13 @@ import java.time.LocalDate;
import static de.hitec.nhplus.utils.Validator.*;
/**
* The controller for viewing all {@link Patient}s.
*
* @author Bernd Heideman
* @author Dominik Säume
* @author Armin Ribic
*/
public class AllPatientController {
@FXML
@ -53,6 +60,10 @@ public class AllPatientController {
private final ObservableList<Patient> patients = FXCollections.observableArrayList();
private PatientDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() {
this.readAllAndShowInTableView();
@ -104,6 +115,41 @@ public class AllPatientController {
this.textFieldRoomNumber.textProperty().addListener(inputNewPatientValidationListener);
}
/**
* Internal method to read all data and set it to the table view.
*/
private void readAllAndShowInTableView() {
this.patients.clear();
this.dao = DaoFactory.getInstance().createPatientDAO();
try {
this.patients.setAll(this.dao.readAll());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Internal method that stores the changes in the database.
*/
private void doUpdate(TableColumn.CellEditEvent<Patient, String> event) {
try {
this.dao.update(event.getRowValue());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Internal method that clears the text fields used for creating a new {@link Patient}.
*/
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldDateOfBirth.clear();
this.textFieldCareLevel.clear();
this.textFieldRoomNumber.clear();
}
@FXML
public void handleOnEditFirstname(TableColumn.CellEditEvent<Patient, String> event) {
String newFirstName = event.getNewValue();
@ -164,25 +210,6 @@ public class AllPatientController {
this.doUpdate(event);
}
private void doUpdate(TableColumn.CellEditEvent<Patient, String> event) {
try {
this.dao.update(event.getRowValue());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
private void readAllAndShowInTableView() {
this.patients.clear();
this.dao = DaoFactory.getInstance().createPatientDAO();
try {
this.patients.addAll(this.dao.readAll());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@FXML
public void handleDelete() {
Patient selectedItem = this.tableView.getSelectionModel().getSelectedItem();
@ -212,12 +239,4 @@ public class AllPatientController {
readAllAndShowInTableView();
clearTextfields();
}
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldDateOfBirth.clear();
this.textFieldCareLevel.clear();
this.textFieldRoomNumber.clear();
}
}

View file

@ -11,6 +11,13 @@ import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;
/**
* The model for a {@link Patient}.
*
* @author Bernd Heideman
* @author Dominik Säume
* @author Armin Ribic
*/
public class Patient extends Person {
private SimpleIntegerProperty id;
private final SimpleStringProperty dateOfBirth;
@ -18,6 +25,13 @@ public class Patient extends Person {
private final SimpleStringProperty roomNumber;
private final List<Treatment> allTreatments = new ArrayList<>();
/**
* This constructor allows instantiating a {@link Patient} object,
* before it is stored in the database, by omitting the {@link Patient#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.patient.database.PatientDao#create PatientDao.create}.
*/
public Patient(
String firstName,
String surName,
@ -31,6 +45,9 @@ public class Patient extends Person {
this.roomNumber = new SimpleStringProperty(roomNumber);
}
/**
* This constructor allows instantiating a {@link Patient} object with all existing fields.
*/
public Patient(
int id,
String firstName,

View file

@ -11,6 +11,13 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link PatientDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao}
* for the {@link Patient} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class PatientDao extends DaoImp<Patient> {
public PatientDao(Connection connection) {

View file

@ -2,6 +2,8 @@ package de.hitec.nhplus.treatment;
import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.nurse.database.NurseDao;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.patient.database.PatientDao;
import de.hitec.nhplus.treatment.database.TreatmentDao;
@ -20,6 +22,12 @@ import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
/**
* The controller for viewing all {@link Treatment}s.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class AllTreatmentController {
@FXML
@ -31,6 +39,9 @@ public class AllTreatmentController {
@FXML
private TableColumn<Treatment, String> columnPatientName;
@FXML
private TableColumn<Treatment, String> columnNurseName;
@FXML
private TableColumn<Treatment, String> columnDate;
@ -46,6 +57,9 @@ public class AllTreatmentController {
@FXML
private ComboBox<String> comboBoxPatientSelection;
@FXML
public ComboBox<String> comboBoxNurseSelection;
@FXML
private Button buttonDelete;
@ -53,19 +67,33 @@ public class AllTreatmentController {
private TreatmentDao dao;
private final ObservableList<String> patientSelection = FXCollections.observableArrayList();
private ArrayList<Patient> patientList;
private final ObservableList<String> nurseSelection = FXCollections.observableArrayList();
private ArrayList<Nurse> nurseList;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() {
readAllAndShowInTableView();
comboBoxPatientSelection.setItems(patientSelection);
comboBoxPatientSelection.getSelectionModel().select(0);
comboBoxPatientSelection.getSelectionModel().select("alle");
comboBoxNurseSelection.setItems(nurseSelection);
this.columnId.setCellValueFactory(new PropertyValueFactory<>("id"));
this.columnPatientName.setCellValueFactory(
cellData -> {
cellData -> {
Patient patient = cellData.getValue().getPatient();
return new SimpleStringProperty(patient.getSurName() + ", " + patient.getFirstName());
}
);
this.columnNurseName.setCellValueFactory(
cellData -> {
Nurse nurse = cellData.getValue().getNurse();
return new SimpleStringProperty(nurse.getSurName() + ", " + nurse.getFirstName());
}
);
this.columnDate.setCellValueFactory(new PropertyValueFactory<>("date"));
this.columnBegin.setCellValueFactory(new PropertyValueFactory<>("begin"));
this.columnEnd.setCellValueFactory(new PropertyValueFactory<>("end"));
@ -83,8 +111,10 @@ public class AllTreatmentController {
this.createComboBoxData();
}
/**
* Internal method to read all data and set it to the table view.
*/
public void readAllAndShowInTableView() {
comboBoxPatientSelection.getSelectionModel().select(0);
this.dao = DaoFactory.getInstance().createTreatmentDao();
try {
this.treatments.setAll(dao.readAll());
@ -93,22 +123,83 @@ public class AllTreatmentController {
}
}
/**
* Internal method to create the data set for the combobox that is used for creating a new {@link Treatment}.
*/
private void createComboBoxData() {
PatientDao dao = DaoFactory.getInstance().createPatientDAO();
PatientDao patientDAO = DaoFactory.getInstance().createPatientDAO();
NurseDao nurseDao = DaoFactory.getInstance().createNurseDAO();
try {
patientList = (ArrayList<Patient>) dao.readAll();
patientList = (ArrayList<Patient>) patientDAO.readAll();
this.patientSelection.add("alle");
for (Patient patient : patientList) {
this.patientSelection.add(patient.getSurName());
}
nurseList = (ArrayList<Nurse>) nurseDao.readAll();
for (Nurse nurse : nurseList) {
this.nurseSelection.add(nurse.getSurName());
}
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Internal method to get the {@link Patient} object by its surname.
*
* @see AllTreatmentController#handleComboBoxPatient
* @see AllTreatmentController#handleNewTreatment
*/
private Patient searchInPatientList(String surname) {
for (Patient patient : this.patientList) {
if (patient.getSurName().equals(surname)) {
return patient;
}
}
return null;
}
/**
* Internal method to get the {@link Nurse} object by its surname.
*
* @see AllTreatmentController#handleNewTreatment
*/
private Nurse searchInNurseList(String surname) {
for (Nurse nurse : this.nurseList) {
if (nurse.getSurName().equals(surname)) {
return nurse;
}
}
return null;
}
/**
* Method to save the changes to a {@link Treatment}.
*/
protected void updateTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.update(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Method to create a new {@link Treatment}.
*/
public void createTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.create(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@FXML
public void handleComboBox() {
public void handleComboBoxPatient() {
String selectedPatient = this.comboBoxPatientSelection.getSelectionModel().getSelectedItem();
this.treatments.clear();
this.dao = DaoFactory.getInstance().createTreatmentDao();
@ -121,23 +212,50 @@ public class AllTreatmentController {
}
}
Patient patient = searchInList(selectedPatient);
Patient patient = searchInPatientList(selectedPatient);
if (patient != null) {
try {
this.treatments.setAll(this.dao.readTreatmentsByPid(patient.getId()));
this.treatments.setAll(this.dao.readTreatmentsByPatient(patient.getId()));
} catch (SQLException exception) {
exception.printStackTrace();
}
}
}
private Patient searchInList(String surname) {
for (Patient patient : this.patientList) {
if (patient.getSurName().equals(surname)) {
return patient;
}
/**
* Internal method to create a {@link TreatmentModalController TreatmentModal}.
*
* @param treatment The {@link Treatment} which should be edited. Set null to create a new one.
* @param title The Title of the created modal.
* @param patient The {@link Patient} whose {@link Treatment} this is.
* @param nurse The {@link Nurse} who did the {@link Treatment}.
*/
public void treatmentWindow(Treatment treatment, String title, Patient patient, Nurse nurse) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
controller.initialize(
this,
stage,
treatment,
patient,
nurse
);
stage.setScene(scene);
stage.setTitle(title);
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException exception) {
exception.printStackTrace();
}
return null;
}
@FXML
@ -154,17 +272,31 @@ public class AllTreatmentController {
@FXML
public void handleNewTreatment() {
try {
String selectedPatient = this.comboBoxPatientSelection.getSelectionModel().getSelectedItem();
Patient patient = searchInList(selectedPatient);
newTreatmentWindow(patient);
} catch (NullPointerException exception) {
String selectedPatient = this.comboBoxPatientSelection.getSelectionModel().getSelectedItem();
Patient patient = searchInPatientList(selectedPatient);
if(patient == null) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information");
alert.setHeaderText("Patient für die Behandlung fehlt!");
alert.setContentText("Wählen Sie über die Combobox einen Patienten aus!");
alert.showAndWait();
return;
}
String selectedNurse = this.comboBoxNurseSelection.getSelectionModel().getSelectedItem();
Nurse nurse = searchInNurseList(selectedNurse);
if(nurse == null) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information");
alert.setHeaderText("Pfleger für die Behandlung fehlt!");
alert.setContentText("Wählen Sie über die Combobox einen Pfleger aus!");
alert.showAndWait();
return;
}
treatmentWindow(null, "NHPlus - Neue Behandlung", patient, nurse);
}
@FXML
@ -174,81 +306,14 @@ public class AllTreatmentController {
if (event.getClickCount() == 2 && (tableView.getSelectionModel().getSelectedItem() != null)) {
int index = this.tableView.getSelectionModel().getSelectedIndex();
Treatment treatment = this.treatments.get(index);
treatmentWindow(treatment);
treatmentWindow(
treatment,
"NHPlus - Behandlung",
treatment.getPatient(),
treatment.getNurse()
);
}
});
}
public void newTreatmentWindow(Patient patient) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
controller.initialize(
this,
stage,
null,
patient
);
stage.setScene(scene);
stage.setTitle("NHPlus - Neue Behandlung");
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException exception) {
exception.printStackTrace();
}
}
public void treatmentWindow(Treatment treatment) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
PatientDao pDao = DaoFactory.getInstance().createPatientDAO();
controller.initialize(
this,
stage,
treatment,
pDao.read(treatment.getPatient().getId())
);
stage.setScene(scene);
stage.setTitle("NHPlus - Behandlung");
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException | SQLException exception) {
exception.printStackTrace();
}
}
public void createTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.create(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
public void updateTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.update(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
}

View file

@ -1,5 +1,6 @@
package de.hitec.nhplus.treatment;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.property.SimpleIntegerProperty;
@ -10,18 +11,40 @@ import java.time.LocalDate;
import java.time.LocalTime;
import java.util.StringJoiner;
/**
* The model for a {@link Treatment}.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class Treatment {
private SimpleIntegerProperty id;
private final SimpleObjectProperty<Patient> patient;
private final SimpleObjectProperty<Nurse> nurse;
private final SimpleObjectProperty<LocalDate> date;
private final SimpleObjectProperty<LocalTime> begin;
private final SimpleObjectProperty<LocalTime> end;
private final SimpleStringProperty description;
private final SimpleStringProperty remarks;
public Treatment(Patient patient, LocalDate date, LocalTime begin,
LocalTime end, String description, String remarks) {
/**
* This constructor allows instantiating a {@link Treatment} object,
* before it is stored in the database, by omitting the {@link Treatment#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.treatment.database.TreatmentDao#create TreatmentDao.create}.
*/
public Treatment(
Patient patient,
Nurse nurse,
LocalDate date,
LocalTime begin,
LocalTime end,
String description,
String remarks
) {
this.patient = new SimpleObjectProperty<>(patient);
this.nurse = new SimpleObjectProperty<>(nurse);
this.date = new SimpleObjectProperty<>(date);
this.begin = new SimpleObjectProperty<>(begin);
this.end = new SimpleObjectProperty<>(end);
@ -29,10 +52,22 @@ public class Treatment {
this.remarks = new SimpleStringProperty(remarks);
}
public Treatment(int id, Patient patient, LocalDate date, LocalTime begin,
LocalTime end, String description, String remarks) {
/**
* This constructor allows instantiating a {@link Treatment} object with all existing fields.
*/
public Treatment(
int id,
Patient patient,
Nurse nurse,
LocalDate date,
LocalTime begin,
LocalTime end,
String description,
String remarks
) {
this.id = new SimpleIntegerProperty(id);
this.patient = new SimpleObjectProperty<>(patient);
this.nurse = new SimpleObjectProperty<>(nurse);
this.date = new SimpleObjectProperty<>(date);
this.begin = new SimpleObjectProperty<>(begin);
this.end = new SimpleObjectProperty<>(end);
@ -48,6 +83,10 @@ public class Treatment {
return patient.getValue();
}
public Nurse getNurse() {
return nurse.getValue();
}
public String getDate() {
return date.getValue().toString();
}
@ -88,6 +127,10 @@ public class Treatment {
return patient;
}
public SimpleObjectProperty<Nurse> nurseProperty() {
return nurse;
}
public SimpleObjectProperty<LocalDate> dateProperty() {
return date;
}
@ -117,6 +160,7 @@ public class Treatment {
.add("TREATMENT")
.add("ID: " + this.getId())
.add("Patient: " + this.getPatient().getSurName() + ", " + this.getPatient().getFirstName())
.add("Nurse: " + this.getNurse().getSurName() + ", " + this.getNurse().getFirstName())
.add("Date: " + this.getDate())
.add("Begin: " + this.getBegin())
.add("End: " + this.getEnd())

View file

@ -1,5 +1,6 @@
package de.hitec.nhplus.treatment;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.value.ChangeListener;
@ -13,7 +14,14 @@ import java.time.LocalTime;
import static de.hitec.nhplus.utils.Validator.*;
/**
* The controller for creating and editing a specific {@link Treatment}.
*
* @author Dominik Säume
*/
public class TreatmentModalController {
@FXML
private Label labelNurseName;
@FXML
private Label labelFirstName;
@FXML
@ -33,18 +41,30 @@ public class TreatmentModalController {
private AllTreatmentController controller;
private Stage stage;
private Patient patient;
private Nurse nurse;
private Treatment treatment;
private boolean isNewTreatment = false;
public void initialize(AllTreatmentController controller, Stage stage, Treatment treatment, Patient patient) {
/**
* Initialization method that is called after the binding of all the fields.
*/
public void initialize(
AllTreatmentController controller,
Stage stage,
Treatment treatment,
Patient patient,
Nurse nurse
) {
this.controller = controller;
this.stage = stage;
this.patient = patient;
this.nurse = nurse;
if (treatment == null) {
isNewTreatment = true;
LocalTime currentTime = LocalTime.now();
this.treatment = new Treatment(
patient,
nurse,
LocalDate.now(),
LocalTime.of(currentTime.getHour(), currentTime.getMinute()),
LocalTime.of(currentTime.getHour(), currentTime.getMinute()),
@ -60,16 +80,16 @@ public class TreatmentModalController {
ChangeListener<String> inputNewTreatmentTextValidationListener = (observableValue, oldText, newText) ->
{
boolean isValid = isValidDate(this.datePicker.getValue())
&& isValidTimeRange(this.textFieldBegin.getText(), this.textFieldEnd.getText())
&& isValidDescription(this.textFieldDescription.getText());
&& isValidTimeRange(this.textFieldBegin.getText(), this.textFieldEnd.getText())
&& isValidDescription(this.textFieldDescription.getText());
this.buttonSave.setDisable(!isValid);
};
ChangeListener<LocalDate> inputNewTreatmentDateValidationListener = (observableValue, localDate, t1) ->
{
boolean isValid = isValidDate(this.datePicker.getValue())
&& isValidTimeRange(this.textFieldBegin.getText(), this.textFieldEnd.getText())
&& isValidDescription(this.textFieldDescription.getText());
&& isValidTimeRange(this.textFieldBegin.getText(), this.textFieldEnd.getText())
&& isValidDescription(this.textFieldDescription.getText());
this.buttonSave.setDisable(!isValid);
};
@ -97,7 +117,11 @@ public class TreatmentModalController {
}
/**
* Internal method to show the data in the view.
*/
private void showData() {
this.labelNurseName.setText(nurse.getSurName());
this.labelFirstName.setText(patient.getFirstName());
this.labelSurName.setText(patient.getSurName());
LocalDate date = DateConverter.convertStringToLocalDate(treatment.getDate());
@ -136,8 +160,4 @@ public class TreatmentModalController {
public void handleCancel() {
stage.close();
}
public Treatment getTreatment() {
return treatment;
}
}

View file

@ -2,6 +2,8 @@ package de.hitec.nhplus.treatment.database;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.DaoImp;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.treatment.Treatment;
import de.hitec.nhplus.utils.DateConverter;
@ -12,6 +14,13 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link TreatmentDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao}
* for the {@link Treatment} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class TreatmentDao extends DaoImp<Treatment> {
public TreatmentDao(Connection connection) {
@ -22,16 +31,17 @@ public class TreatmentDao extends DaoImp<Treatment> {
protected PreparedStatement getCreateStatement(Treatment treatment) throws SQLException {
final String SQL = """
INSERT INTO treatment
(patientId, date, begin, end, description, remark)
VALUES (?, ?, ?, ?, ?, ?)
(patientId, nurseId, date, begin, end, description, remark)
VALUES (?, ?, ?, ?, ?, ?, ?)
""";
PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, treatment.getPatient().getId());
statement.setString(2, treatment.getDate());
statement.setString(3, treatment.getBegin());
statement.setString(4, treatment.getEnd());
statement.setString(5, treatment.getDescription());
statement.setString(6, treatment.getRemarks());
statement.setInt(2, treatment.getNurse().getId());
statement.setString(3, treatment.getDate());
statement.setString(4, treatment.getBegin());
statement.setString(5, treatment.getEnd());
statement.setString(6, treatment.getDescription());
statement.setString(7, treatment.getRemarks());
return statement;
}
@ -48,11 +58,12 @@ public class TreatmentDao extends DaoImp<Treatment> {
return new Treatment(
result.getInt(1),
DaoFactory.getInstance().createPatientDAO().read(result.getInt(2)),
DateConverter.convertStringToLocalDate(result.getString(3)),
DateConverter.convertStringToLocalTime(result.getString(4)),
DaoFactory.getInstance().createNurseDAO().read(result.getInt(3)),
DateConverter.convertStringToLocalDate(result.getString(4)),
DateConverter.convertStringToLocalTime(result.getString(5)),
result.getString(6),
result.getString(7)
DateConverter.convertStringToLocalTime(result.getString(6)),
result.getString(7),
result.getString(8)
);
}
@ -71,15 +82,33 @@ public class TreatmentDao extends DaoImp<Treatment> {
return list;
}
private PreparedStatement getReadAllTreatmentsOfOnePatientByPid(int patientId) throws SQLException {
/**
* Retrieves a list of {@link Treatment}s associated with a specific
* {@link Patient#id patient ID} from the database.
*
* @param patientId The {@link Patient#id ID} of the {@link Patient} whose {@link Treatment}s are to be retrieved.
* @return A {@link List} of {@link Treatment} objects associated with the specified {@link Patient} ID.
*/
public List<Treatment> readTreatmentsByPatient(int patientId) throws SQLException {
final String SQL = "SELECT * FROM treatment WHERE patientId = ?";
PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, patientId);
return statement;
ResultSet result = statement.executeQuery();
return getListFromResultSet(result);
}
public List<Treatment> readTreatmentsByPid(int patientId) throws SQLException {
ResultSet result = getReadAllTreatmentsOfOnePatientByPid(patientId).executeQuery();
/**
* Retrieves a list of {@link Treatment}s associated with a specific
* {@link Nurse#id patient ID} from the database.
*
* @param nurseId The {@link Nurse#id ID} of the {@link Nurse} whose {@link Treatment}s are to be retrieved.
* @return A {@link List} of {@link Treatment} objects associated with the specified {@link Nurse} ID.
*/
public List<Treatment> readTreatmentsByNurse(int nurseId) throws SQLException {
final String SQL = "SELECT * FROM treatment WHERE nurseId = ?";
PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, nurseId);
ResultSet result = statement.executeQuery();
return getListFromResultSet(result);
}
@ -87,7 +116,6 @@ public class TreatmentDao extends DaoImp<Treatment> {
protected PreparedStatement getUpdateStatement(Treatment treatment) throws SQLException {
final String SQL = """
UPDATE treatment SET
patientId = ?,
date = ?,
begin = ?,
end = ?,
@ -96,13 +124,12 @@ public class TreatmentDao extends DaoImp<Treatment> {
WHERE id = ?
""";
PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, treatment.getPatient().getId());
statement.setString(2, treatment.getDate());
statement.setString(3, treatment.getBegin());
statement.setString(4, treatment.getEnd());
statement.setString(5, treatment.getDescription());
statement.setString(6, treatment.getRemarks());
statement.setInt(7, treatment.getId());
statement.setString(1, treatment.getDate());
statement.setString(2, treatment.getBegin());
statement.setString(3, treatment.getEnd());
statement.setString(4, treatment.getDescription());
statement.setString(5, treatment.getRemarks());
statement.setInt(6, treatment.getId());
return statement;
}

View file

@ -4,23 +4,44 @@ import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* A utility class that holds utility methods for date conversion.
*
* @author Bernd Heideman
*/
public class DateConverter {
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String TIME_FORMAT = "HH:mm";
/**
* @param date A date {@link String} in the format: yyyy-MM-dd.
* @return The converted date {@link String} as {@link LocalDate}.
*/
public static LocalDate convertStringToLocalDate(String date) {
return LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
}
/**
* @param time A time {@link String} in the format: HH:mm.
* @return The converted time {@link String} as {@link LocalTime}.
*/
public static LocalTime convertStringToLocalTime(String time) {
return LocalTime.parse(time, DateTimeFormatter.ofPattern(TIME_FORMAT));
}
/**
* @param date A {@link LocalDate} which should be converted to a {@link String}.
* @return The converted {@link LocalDate} in the format: yyy-MM-dd.
*/
public static String convertLocalDateToString(LocalDate date) {
return date.format(DateTimeFormatter.ofPattern(DATE_FORMAT));
}
/**
* @param time A {@link LocalTime} which should be converted to a {@link String}.
* @return The converted {@link LocalTime} in the format: HH:mm.
*/
public static String convertLocalTimeToString(LocalTime time) {
return time.format(DateTimeFormatter.ofPattern(TIME_FORMAT));
}

View file

@ -5,17 +5,34 @@ import javafx.scene.control.Alert;
import java.time.LocalDate;
import java.time.LocalTime;
public class Validator
{
public static void showValidationError(String type){
/**
* A utility class for validating all kinds of data.
*
* @author Dominik Säume
* @author Ole Kück
*/
public class Validator {
/**
* Shows a modal with a specific validation error.
*
* @param type The type for which a validation error should be shown as {@link String}.
*/
public static void showValidationError(String type) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error");
alert.setHeaderText(null);
alert.setContentText("Invalid " + type + " !");
alert.showAndWait();
}
/**
* Validate that a {@link String} is a valid date.
*
* @param text The date {@link String} to validate.
*/
public static boolean isValidDate(String text) {
if(text.isBlank()){
if (text.isBlank()) {
return false;
}
try {
@ -25,8 +42,14 @@ public class Validator
}
return true;
}
/**
* Validate that a {@link LocalDate} is a valid date for storage in the database.
*
* @param date The {@link LocalDate} to validate.
*/
public static boolean isValidDate(LocalDate date) {
if(date == null){
if (date == null) {
return false;
}
try {
@ -36,21 +59,34 @@ public class Validator
}
return true;
}
public static boolean isValidTime(String text){
if(text.isBlank()){
/**
* Validate that a {@link String} is a valid time.
*
* @param text The time {@link String} to validate.
*/
public static boolean isValidTime(String text) {
if (text.isBlank()) {
return false;
}
try {
DateConverter.convertStringToLocalTime(text);
}catch (Exception exception){
} catch (Exception exception) {
return false;
}
return true;
}
public static boolean isValidTimeRange(String start, String end){
if(
!isValidTime(start) || !isValidTime(end)
){
/**
* Validate that two time {@link String}s are a valid time range.
*
* @param start The starting time {@link String}.
* @param end The ending time {@link String}.
*/
public static boolean isValidTimeRange(String start, String end) {
if (
!isValidTime(start) || !isValidTime(end)
) {
return false;
}
LocalTime startTime = DateConverter.convertStringToLocalTime(start);
@ -59,24 +95,57 @@ public class Validator
}
public static boolean isValidDescription(String text) {
return !text.isBlank();
}
public static boolean isValidFirstName(String text){
return !text.isBlank();
}
public static boolean isValidSurName(String text){
return !text.isBlank();
}
public static boolean isValidPhoneNumber(String text){
return !text.isBlank();
}
public static boolean isValidCareLevel(String text){
return !text.isBlank();
}
public static boolean isValidRoomNumber(String text){
/**
* Validate that a {@link String} is a valid description.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidDescription(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid first name.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidFirstName(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid surname.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidSurName(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid phone number.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidPhoneNumber(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid care level.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidCareLevel(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid room number.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidRoomNumber(String text) {
return !text.isBlank();
}
}

View file

@ -28,6 +28,11 @@
minWidth="80.0"
text="Patient"
/>
<TableColumn
fx:id="columnNurseName"
minWidth="80.0"
text="Pflegekraft"
/>
<TableColumn
fx:id="columnDate"
maxWidth="-1.0"
@ -66,7 +71,11 @@
<ComboBox
fx:id="comboBoxPatientSelection"
prefWidth="200.0"
onAction="#handleComboBox"
onAction="#handleComboBoxPatient"
/>
<ComboBox
fx:id="comboBoxNurseSelection"
prefWidth="200.0"
/>
<Button
mnemonicParsing="false"

View file

@ -30,21 +30,33 @@
<Label
GridPane.rowIndex="0"
GridPane.columnIndex="0"
text="Vorname:"
text="Pfleger:"
/>
<Label
GridPane.rowIndex="0"
GridPane.columnIndex="1"
prefWidth="200"
fx:id="labelNurseName" text="Pfleger Name"
/>
<!-- Row 1 -->
<Label
GridPane.rowIndex="1"
GridPane.columnIndex="0"
text="Vorname:"
/>
<Label
GridPane.rowIndex="1"
GridPane.columnIndex="1"
prefWidth="200"
fx:id="labelFirstName" text="Vorname"
/>
<Label
GridPane.rowIndex="0"
GridPane.rowIndex="1"
GridPane.columnIndex="3"
text="Nachname:"
/>
<Label
GridPane.rowIndex="0"
GridPane.rowIndex="1"
GridPane.columnIndex="4"
prefWidth="200"
fx:id="labelSurName"

View file

@ -2,10 +2,12 @@ CREATE TABLE treatment
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
patientId INTEGER NOT NULL,
nurseId INTEGER NOT NULL ,
date TEXT NOT NULL,
begin TEXT NOT NULL,
end TEXT NOT NULL,
description TEXT NOT NULL,
remark TEXT NOT NULL,
FOREIGN KEY (patientId) REFERENCES patient (id) ON DELETE CASCADE
FOREIGN KEY (patientId) REFERENCES patient (id) ON DELETE CASCADE,
FOREIGN KEY (nurseId) REFERENCES nurse (id) ON DELETE SET NULL
)