Compare commits

..

16 commits

Author SHA1 Message Date
arminribic
917aa8275f
#10: Add Base for Delete Date Functionality
All checks were successful
Quality Check / Linting Check (push) Successful in 12s
Quality Check / Javadoc Check (push) Successful in 21s
2024-05-15 12:08:48 +02:00
arminribic
453616c175
#10: Update Views to Reflect Locked and Active Nurses 2024-05-15 12:08:22 +02:00
arminribic
9353c9990e
#10: Modify Model, Dao and Fixtures 2024-05-15 12:04:25 +02:00
192c14eb0d Merge pull request 'Javadoc' (#35) from javadoc into main
All checks were successful
Javadoc Deploy / Javadoc (push) Successful in 31s
Quality Check / Linting Check (push) Successful in 11s
Quality Check / Javadoc Check (push) Successful in 21s
Reviewed-on: #35
Reviewed-by: SZUT-Ole <ole.kueck@hmmh.de>
2024-05-15 09:59:59 +00:00
c2857de8ee
NOTICKET: Javaodc & Cleanup
All checks were successful
Quality Check / Linting Check (push) Successful in 17s
Quality Check / Linting Check (pull_request) Successful in 21s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 31s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-15 11:44:19 +02:00
cc59218a41 Merge pull request 'task/#17 Treatement -> Nurse Relation' (#36) from task/refactor-dao into main
All checks were successful
Javadoc Deploy / Javadoc (push) Successful in 32s
Quality Check / Linting Check (push) Successful in 14s
Quality Check / Linting Check (pull_request) Successful in 21s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 31s
Reviewed-on: #36
Reviewed-by: SZUT-Armin <arminribic@web.de>
2024-05-15 09:29:51 +00: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
9de598ef67
NOTICKET: Fix Javadoc Generation
All checks were successful
Javadoc Deploy / Javadoc (push) Successful in 29s
Quality Check / Linting Check (push) Successful in 32s
Quality Check / Javadoc Check (push) Successful in 37s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-07 19:26:27 +02:00
f5dc9c3343 Merge pull request '#22 story/medikamente-modul-grundimplementierung' (#34) from story/medikamente-modul-grundimplementierung into main
Some checks failed
Quality Check / Qualty Check (push) Successful in 14s
Javadoc Deploy / Javadoc (push) Failing after 25s
Reviewed-on: #34
Reviewed-by: SZUT-Ole <ole.kueck@hmmh.de>
2024-05-07 12:58:49 +00:00
b04fa5a938
#22: Update Ingredients with Medication
All checks were successful
Quality Check / Qualty Check (push) Successful in 11s
Quality Check / Qualty Check (pull_request) Successful in 12s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-07 14:56:40 +02:00
daead5c79b
#22: Remove Wrong Javadoc
All checks were successful
Quality Check / Qualty Check (push) Successful in 11s
Quality Check / Qualty Check (pull_request) Successful in 12s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-07 14:51:08 +02:00
7f13ad3980
#22: Add Medication View and Update DAO
All checks were successful
Quality Check / Qualty Check (push) Successful in 8s
Quality Check / Qualty Check (pull_request) Successful in 9s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-07 13:05:14 +02:00
bbbb569b55
#22: Setup Model and DAO
All checks were successful
Quality Check / Qualty Check (push) Successful in 8s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-06 23:43:09 +02:00
45 changed files with 1576 additions and 303 deletions

View file

@ -15,9 +15,7 @@ jobs:
- name: "Checkout"
uses: "https://git.euph.dev/actions/checkout@v3"
- name: "javadoc"
run: |
mvn package
mvn javadoc:javadoc -f pom.xml
run: mvn package javadoc:javadoc -f pom.xml
- name: "Deploy Javadoc"
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock

View file

@ -5,13 +5,23 @@ on:
- pull_request
jobs:
qs:
name: "Qualty Check"
linting:
name: "Linting Check"
runs-on: "ubuntu-latest"
container:
image: "git.euph.dev/actions/runner-java-21:latest"
steps:
- name: "Checkout"
uses: "https://git.euph.dev/actions/checkout@v3"
- name: "CHECK"
- name: "Checkstyle Linting"
run: mvn checkstyle:check -e
javadoc:
name: "Javadoc Check"
runs-on: "ubuntu-latest"
container:
image: "git.euph.dev/actions/runner-java-21:latest"
steps:
- name: "Checkout"
uses: "https://git.euph.dev/actions/checkout@v3"
- name: "Generate Javadoc"
run: mvn package javadoc:javadoc -f pom.xml

View file

@ -25,6 +25,8 @@
<option value="file://$PROJECT_DIR$/src/main/resources/de/hitec/nhplus/patient/database/Patient.sql" />
<option value="file://$PROJECT_DIR$/src/main/resources/de/hitec/nhplus/treatment/database/Treatment.sql" />
<option value="file://$PROJECT_DIR$/src/main/resources/de/hitec/nhplus/nurse/database/Nurse.sql" />
<option value="file://$PROJECT_DIR$/src/main/resources/de/hitec/nhplus/medication/database/Medication.sql" />
<option value="file://$PROJECT_DIR$/src/main/resources/de/hitec/nhplus/medication/database/Medication_Ingredient.sql" />
</array>
</option>
<option name="outLayout" value="File per object by schema.groovy" />

View file

@ -3,7 +3,6 @@
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/patient/database/PatientDao.java" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/treatment/database/TreatmentDao.java" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/treatment/database/NurseDao.java" dialect="GenericSQL" />
<file url="PROJECT" dialect="SQLite" />
</component>
</project>

Binary file not shown.

View file

@ -1,2 +0,0 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

15
pom.xml
View file

@ -21,12 +21,12 @@
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>20.0.1</version>
<version>21.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>20.0.1</version>
<version>21.0.2</version>
</dependency>
<dependency>
<groupId>org.controlsfx</groupId>
@ -112,11 +112,20 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.0</version>
<version>3.6.3</version>
<configuration>
<source>21</source>
<release>21</release>
<author>true</author>
<doclint>all,-missing</doclint>
<reportOutputDirectory>${project.basedir}</reportOutputDirectory>
<sourcepath>src/main/java</sourcepath>
<destDir>javadoc_build</destDir>
<tags>
<tag>
<name>implSpec</name>
</tag>
</tags>
</configuration>
</plugin>
</plugins>

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 Heidemann
* @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,9 +7,10 @@ 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 Bernd Heidemannn
* @author Dominik Säume
* @version 1.0
*/
public class ConnectionBuilder {
@ -20,8 +21,7 @@ public class ConnectionBuilder {
private static Connection connection;
/**
* @return a Thread-safe {@link Connection} to the Database.
* @author Bernd Heidemann
* @return A thread-safe {@link Connection} to the database.
*/
synchronized public static Connection getConnection() {
try {
@ -38,9 +38,7 @@ public class ConnectionBuilder {
}
/**
* Closes the Connection to the Database.
*
* @author Bernd Heidemann
* Closes the connection to the database.
*/
synchronized public static void closeConnection() {
try {

View file

@ -4,51 +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 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 DAO is implemented
* @author Bernd Heidemann
* @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemannn
* @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
* @author Bernd Heidemann
* @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 of the Element in the Database
* @author Bernd Heidemann
* @param id The ID of the element in the database.
* @return a model instance of {@link T}.
*/
T read(int id) throws SQLException;
/**
* Read all Database Entries to a {@link List} of Model objects.
*
* @author Bernd Heidemann
* @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.
* @author Bernd Heidemann
* @param t The model instance.
*/
void update(T t) throws SQLException;
/**
* Delete a Database Entry.
* Delete a database entry.
*
* @param id of the Element in the Database.
* @author Bernd Heidemann
* @param id The ID of the element in the database.
*/
void delete(int id) throws SQLException;
}

View file

@ -1,13 +1,15 @@
package de.hitec.nhplus.datastorage;
import de.hitec.nhplus.medication.database.MedicationDao;
import de.hitec.nhplus.nurse.database.NurseDao;
import de.hitec.nhplus.patient.database.PatientDao;
import de.hitec.nhplus.treatment.database.TreatmentDao;
/**
* The {@link DaoFactory} is a Singleton({@link DaoFactory#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 Bernd Heidemannn
* @author Dominik Säume
* @version 1.0
*/
public class DaoFactory {
@ -15,16 +17,13 @@ public class DaoFactory {
private static DaoFactory instance;
/**
* A Private Constructor according to the Singleton Pattern.
*
* @author Bernd Heidemann
* A private constructor according to the singleton pattern.
*/
private DaoFactory() {
}
/**
* @return {@link DaoFactory}, the Singleton Instance
* @author Bernd Heidemann
* @return The singleton instance of {@link DaoFactory}.
*/
public static DaoFactory getInstance() {
if (DaoFactory.instance == null) {
@ -34,26 +33,34 @@ public class DaoFactory {
}
/**
* @return a {@link TreatmentDao}
* @author Bernd Heidemann
* @return A new {@link TreatmentDao} instance with a database connection.
* @see de.hitec.nhplus.treatment.Treatment Treatment
*/
public TreatmentDao createTreatmentDao() {
return new TreatmentDao(ConnectionBuilder.getConnection());
}
/**
* @return a {@link PatientDao}
* @author Bernd Heidemann
* @return A new {@link PatientDao} instance with a database connection.
* @see de.hitec.nhplus.patient.Patient Patient
*/
public PatientDao createPatientDAO() {
return new PatientDao(ConnectionBuilder.getConnection());
}
/**
* @return a {@link NurseDao}
* @author Dominik Säume
* @return A new {@link NurseDao} instance with a database connection.
* @see de.hitec.nhplus.nurse.Nurse Nurse
*/
public NurseDao createNurseDAO() {
return new NurseDao(ConnectionBuilder.getConnection());
}
/**
* @return A new {@link MedicationDao} instance with a database connection.
* @see de.hitec.nhplus.medication.Medication Medication
*/
public MedicationDao createMedicationDAO() {
return new MedicationDao(ConnectionBuilder.getConnection());
}
}

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 DAO is implemented
* @author Bernd Heidemann
* @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemannn
* @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 a Database Connection, which should be gotten from {@link ConnectionBuilder}
* @author Bernd Heidemann
* @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
* @author Bernd Heidemann
* @param t The model instance.
*/
@Override
public void create(T t) throws SQLException {
@ -38,10 +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 of the Element in the Database
* @author Bernd Heidemann
* @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 {
@ -54,9 +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.
*
* @author Bernd Heidemann
* @return a {@link List} of type {@link T} holding all database entries as model instances.
*/
@Override
public List<T> readAll() throws SQLException {
@ -64,10 +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.
* @author Bernd Heidemann
* @param t The model instance.
*/
@Override
public void update(T t) throws SQLException {
@ -75,27 +74,62 @@ public abstract class DaoImp<T> implements Dao<T> {
}
/**
* Delete a Database Entry.
* Delete a database entry.
*
* @param id of the Element in the Database.
* @author Bernd Heidemann
* @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

@ -1,12 +1,44 @@
package de.hitec.nhplus.fixtures;
import de.hitec.nhplus.datastorage.ConnectionBuilder;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
public interface Fixture<T>
{
/**
* 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.
* @author Dominik Säume
* @version 1.0
* @implSpec The implementations should be added to the {@link Fixtures#main}.
*/
public interface Fixture<T> {
/**
* Drop all dependent tables.
*
* @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.
*
* @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.
*
* @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}.
*/
Map<String, T> load() throws SQLException;
}

View file

@ -1,33 +1,50 @@
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;
public class Fixtures
{
public static void main(String[] args)
{
/**
* A class, implementing an entrypoint({@link #main}), for loading a specific set of data.
*
* @author Dominik Säume
* @version 1.0
*/
public class Fixtures {
/**
* An entrypoint, for loading a specific set of data.
*
* @param args unused.
*/
public static void main(String[] args) {
Connection connection = ConnectionBuilder.getConnection();
try
{
try {
PatientFixture patientFixture = new PatientFixture();
patientFixture.dropTable(connection);
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);
medicationFixture.setupTable(connection);
medicationFixture.load();
} catch (Exception exception) {
System.out.println(exception.getMessage());

View file

@ -0,0 +1,161 @@
package de.hitec.nhplus.fixtures;
import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.medication.Ingredient;
import de.hitec.nhplus.medication.Medication;
import de.hitec.nhplus.medication.database.MedicationDao;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
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";
@Override
public void dropTable(Connection connection) throws SQLException {
connection.createStatement().execute("DROP TABLE IF EXISTS medication");
connection.createStatement().execute("DROP TABLE IF EXISTS medication_ingredient");
}
@Override
public void setupTable(Connection connection) throws SQLException {
final InputStream schema = Main.class.getResourceAsStream(SCHEMA);
final InputStream ingredientSchema = Main.class.getResourceAsStream(INGREDIENT_SCHEMA);
assert schema != null;
assert ingredientSchema != null;
String SQL = new Scanner(schema, StandardCharsets.UTF_8)
.useDelimiter("\\A")
.next();
String ingredientSQL = ";" + new Scanner(ingredientSchema, StandardCharsets.UTF_8)
.useDelimiter("\\A")
.next();
connection.createStatement().execute(SQL);
connection.createStatement().execute(ingredientSQL);
}
@Override
public Map<String, Medication> load() throws SQLException {
List<Medication> medications = new ArrayList<>();
Ingredient metforminhydrochlorid = new Ingredient("Metforminhydrochlorid");
Ingredient cellulose = new Ingredient("Cellulose");
Ingredient povidon = new Ingredient("Povidon");
Ingredient magnesiumstearat = new Ingredient("Magnesiumstearat");
Ingredient lisinoprilDihydrat = new Ingredient("Lisinopril-Dihydrat");
Ingredient mannitol = new Ingredient("Mannitol");
Ingredient calciumphosphat = new Ingredient("Calciumphosphat");
Ingredient simvastatin = new Ingredient("Simvastatin");
Ingredient laktose = new Ingredient("Laktose");
Ingredient enoxaparinNatrium = new Ingredient("Enoxaparin-Natrium");
Ingredient benzylalkohol = new Ingredient("Benzylalkohol");
Ingredient wasser = new Ingredient("Wasser");
Ingredient levothyroxinnatrium = new Ingredient("Levothyroxinnatrium");
Ingredient staerke = new Ingredient("Stärke");
Ingredient akaziengummi = new Ingredient("Akaziengummi");
Ingredient warfarinnatrium = new Ingredient("Warfarinnatrium");
medications.add(new Medication(
1,
"Metformin",
"AstraZeneca",
List.of(
metforminhydrochlorid,
cellulose,
povidon,
magnesiumstearat
),
"Übelkeit, Durchfall, Laktatazidose (selten)",
"Oral",
100
));
medications.add(new Medication(
2,
"Lisinopril",
"Teva Pharmaceuticals",
List.of(
lisinoprilDihydrat,
mannitol,
calciumphosphat,
magnesiumstearat
),
"Schwindel, trockener Husten",
"Oral",
150
));
medications.add(new Medication(
3,
"Simvastatin",
"Mylan",
List.of(
simvastatin,
laktose,
cellulose,
magnesiumstearat
),
"Muskelschmerzen, Leberprobleme(selten)",
"Oral",
80
));
medications.add(new Medication(
4,
"Enoxaparin",
"Sanofi",
List.of(
enoxaparinNatrium,
benzylalkohol,
wasser
),
"Blutungen, Reaktionen an der Injektionsstelle",
"Unterhautinjektion",
120
));
medications.add(new Medication(
5,
"Levothyroxin",
"Sandoz",
List.of(
levothyroxinnatrium,
laktose,
staerke,
akaziengummi
),
"Herzrasen, Gewichtsverlust",
"Oral",
90
));
medications.add(new Medication(
6,
"Warfarin",
"Apotex Inc.",
List.of(
warfarinnatrium,
laktose,
staerke,
magnesiumstearat
),
"Blutungen, Blutergüsse",
"Oral",
110
));
MedicationDao dao = DaoFactory.getInstance().createMedicationDAO();
Map<String, Medication> medicationsByName = new HashMap<>();
for (Medication medication : medications) {
dao.create(medication);
medicationsByName.put(medication.getName(), medication);
}
return medicationsByName;
}
}

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,10 +12,15 @@ 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 {
connection.createStatement().execute("DROP TABLE nurse");
connection.createStatement().execute("DROP TABLE IF EXISTS nurse");
}
@Override

View file

@ -13,10 +13,15 @@ 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 {
connection.createStatement().execute("DROP TABLE patient");
connection.createStatement().execute("DROP TABLE IF EXISTS patient");
}
@Override

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,16 +16,24 @@ 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
public void dropTable(Connection connection) throws SQLException {
connection.createStatement().execute("DROP TABLE treatment");
connection.createStatement().execute("DROP TABLE IF EXISTS treatment");
}
@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

@ -12,6 +12,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 Heidemann
* @author Dominik Säume
*/
public class MainWindowController {
@FXML
private TabPane mainTabPane;
@ -35,6 +41,10 @@ public class MainWindowController {
private AnchorPane lockedNursePage;
@FXML
private Tab lockedNurseTab;
@FXML
private AnchorPane medicationPage;
@FXML
private Tab medicationTab;
@FXML
public void initialize() {
@ -44,6 +54,7 @@ public class MainWindowController {
patientTab.setOnSelectionChanged(event -> loadPatientPage());
treatmentTab.setOnSelectionChanged(event -> loadTreatmentsPage());
nurseTab.setOnSelectionChanged(event -> loadNursePage());
medicationTab.setOnSelectionChanged(event -> loadMedicationPage());
nurseTabPane.getSelectionModel().select(activeNurseTab);
@ -52,6 +63,9 @@ public class MainWindowController {
lockedNurseTab.setOnSelectionChanged(event -> loadLockedNursePage());
}
/**
* Loads the patient page into its tab.
*/
private void loadPatientPage() {
try {
BorderPane patientsPane = FXMLLoader.load(
@ -67,6 +81,9 @@ public class MainWindowController {
}
}
/**
* Loads the treatment page into its tab.
*/
private void loadTreatmentsPage() {
try {
BorderPane treatmentsPane = FXMLLoader.load(
@ -82,6 +99,9 @@ public class MainWindowController {
}
}
/**
* Loads the nurse page into its tab.
*/
private void loadNursePage() {
SelectionModel<Tab> selectionModel = nurseTabPane.getSelectionModel();
Tab selectedTab = selectionModel.getSelectedItem();
@ -122,4 +142,22 @@ public class MainWindowController {
exception.printStackTrace();
}
}
/**
* Loads the medication page into its tab.
*/
private void loadMedicationPage() {
try {
BorderPane medicationPane = FXMLLoader.load(
Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/medication/AllMedicationView.fxml"))
);
medicationPage.getChildren().setAll(medicationPane);
AnchorPane.setTopAnchor(medicationPane, 0d);
AnchorPane.setBottomAnchor(medicationPane, 0d);
AnchorPane.setLeftAnchor(medicationPane, 0d);
AnchorPane.setRightAnchor(medicationPane, 0d);
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

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 Heidemann
* @author Dominik Säume
*/
public abstract class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty surName;

View file

@ -0,0 +1,79 @@
package de.hitec.nhplus.medication;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.medication.database.MedicationDao;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
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;
@FXML
private TableColumn<Medication, Integer> columnId;
@FXML
private TableColumn<Medication, String> columnName;
@FXML
private TableColumn<Medication, String> columnManufacturer;
@FXML
private TableColumn<Medication, String> columnIngredient;
@FXML
private TableColumn<Medication, String> columnPossibleSideEffects;
@FXML
private TableColumn<Medication, String> columnAdministrationMethod;
@FXML
private TableColumn<Medication, Integer> columnCurrentStock;
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();
this.columnId.setCellValueFactory(new PropertyValueFactory<>("id"));
this.columnName.setCellValueFactory(new PropertyValueFactory<>("name"));
this.columnManufacturer.setCellValueFactory(new PropertyValueFactory<>("manufacturer"));
this.columnIngredient.setCellValueFactory(
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"));
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 {
this.medications.setAll(dao.readAll());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
}

View file

@ -0,0 +1,32 @@
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;
public Ingredient(String name) {
this.name = new SimpleStringProperty(name);
}
public String getName() {
return name.get();
}
public SimpleStringProperty nameProperty() {
return name;
}
public void setName(String name) {
this.name.set(name);
}
}

View file

@ -0,0 +1,167 @@
package de.hitec.nhplus.medication;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
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;
private final SimpleStringProperty manufacturer;
private final SimpleListProperty<Ingredient> ingredients;
private final SimpleStringProperty possibleSideEffects;
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,
List<Ingredient> ingredients,
String possibleSideEffects,
String administrationMethod,
int currentStock
) {
this.name = new SimpleStringProperty(name);
this.manufacturer = new SimpleStringProperty(manufacturer);
this.ingredients = new SimpleListProperty<>(FXCollections.observableArrayList(ingredients));
this.possibleSideEffects = new SimpleStringProperty(possibleSideEffects);
this.administrationMethod = new SimpleStringProperty(administrationMethod);
this.currentStock = new SimpleIntegerProperty(currentStock);
}
/**
* This constructor allows instantiating a {@link Medication} object with all existing fields.
*/
public Medication(
int id,
String name,
String manufacturer,
List<Ingredient> ingredients,
String possibleSideEffects,
String administrationMethod,
int currentStock
) {
this.id = new SimpleIntegerProperty(id);
this.name = new SimpleStringProperty(name);
this.manufacturer = new SimpleStringProperty(manufacturer);
this.ingredients = new SimpleListProperty<>(FXCollections.observableArrayList(ingredients));
this.possibleSideEffects = new SimpleStringProperty(possibleSideEffects);
this.administrationMethod = new SimpleStringProperty(administrationMethod);
this.currentStock = new SimpleIntegerProperty(currentStock);
}
public int getId() {
return id.get();
}
public SimpleIntegerProperty idProperty() {
return id;
}
public String getName() {
return name.get();
}
public SimpleStringProperty nameProperty() {
return name;
}
public void setName(String name) {
this.name.set(name);
}
public String getManufacturer() {
return manufacturer.get();
}
public SimpleStringProperty manufacturerProperty() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer.set(manufacturer);
}
public ObservableList<Ingredient> getIngredients() {
return ingredients.get();
}
public SimpleListProperty<Ingredient> ingredientsProperty() {
return ingredients;
}
public void setIngredients(List<Ingredient> ingredients) {
this.ingredients.set(FXCollections.observableArrayList(ingredients));
}
public String getPossibleSideEffects() {
return possibleSideEffects.get();
}
public SimpleStringProperty possibleSideEffectsProperty() {
return possibleSideEffects;
}
public void setPossibleSideEffects(String possibleSideEffects) {
this.possibleSideEffects.set(possibleSideEffects);
}
public String getAdministrationMethod() {
return administrationMethod.get();
}
public SimpleStringProperty administrationMethodProperty() {
return administrationMethod;
}
public void setAdministrationMethod(String administrationMethod) {
this.administrationMethod.set(administrationMethod);
}
public int getCurrentStock() {
return currentStock.get();
}
public SimpleIntegerProperty currentStockProperty() {
return currentStock;
}
public void setCurrentStock(int currentStock) {
this.currentStock.set(currentStock);
}
@Override
public String toString() {
return new StringJoiner(System.lineSeparator())
.add("MEDICATION")
.add("ID: " + this.getId())
.add("Name: " + this.getName())
.add("Manufacturer: " + this.getManufacturer())
.add("Ingredients: " + this.getIngredients()
.stream()
.map(Ingredient::getName)
.collect(Collectors.joining(", ", "[", "]")))
.add("Possible Side Effects: " + this.getPossibleSideEffects())
.add("Administration Method: " + this.getAdministrationMethod())
.add("Current Stock: " + this.getCurrentStock())
.toString();
}
}

View file

@ -0,0 +1,189 @@
package de.hitec.nhplus.medication.database;
import de.hitec.nhplus.datastorage.Dao;
import de.hitec.nhplus.medication.Ingredient;
import de.hitec.nhplus.medication.Medication;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
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 Heidemannn
* @author Dominik Säume
*/
public class MedicationDao implements Dao<Medication> {
protected final Connection connection;
public MedicationDao(Connection connection) {
this.connection = connection;
}
@Override
public void create(Medication medication) throws SQLException {
final String medicationSQL = """
INSERT INTO medication
(name, manufacturer, possibleSideEffects, administrationMethod, currentStock)
VALUES (?, ?, ?, ?, ?);
""";
PreparedStatement medicationStatement = this.connection.prepareStatement(medicationSQL);
medicationStatement.setString(1, medication.getName());
medicationStatement.setString(2, medication.getManufacturer());
medicationStatement.setString(3, medication.getPossibleSideEffects());
medicationStatement.setString(4, medication.getAdministrationMethod());
medicationStatement.setInt(5, medication.getCurrentStock());
medicationStatement.execute();
final String ingredientSQL = """
INSERT INTO medication_ingredient
(id, name)
VALUES (?, ?);
""";
for (Ingredient ingredient : medication.getIngredients()) {
PreparedStatement ingredientStatement = this.connection.prepareStatement(ingredientSQL);
ingredientStatement.setInt(1, medication.getId());
ingredientStatement.setString(2, ingredient.getName());
ingredientStatement.execute();
}
}
@Override
public Medication read(int id) throws SQLException {
final String SQL = """
SELECT medication.*, medication_ingredient.id
FROM medication
LEFT JOIN medication_ingredient ON medication.id = medication_ingredient.id
WHERE medication.id = ?
""";
PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, id);
ResultSet result = statement.executeQuery();
return getInstanceFromResultSet(result);
}
@Override
public List<Medication> readAll() throws SQLException {
final String SQL = """
SELECT medication.*, medication_ingredient.name
FROM medication LEFT JOIN
medication_ingredient ON medication.id = medication_ingredient.id
""";
ResultSet result = connection.prepareStatement(SQL).executeQuery();
List<Medication> medications = new ArrayList<>();
Map<Integer, List<Ingredient>> ingredientMap = new HashMap<>();
int currentMedicationId;
int lastMedicationId = -1;
while (result.next()) {
currentMedicationId = result.getInt(1);
if (currentMedicationId != lastMedicationId) {
Medication medication = new Medication(
result.getInt(1),
result.getString(2),
result.getString(3),
List.of(),
result.getString(4),
result.getString(5),
result.getInt(6)
);
medications.add(medication);
lastMedicationId = currentMedicationId;
continue;
}
List<Ingredient> ingredients = ingredientMap.computeIfAbsent(currentMedicationId, k -> new ArrayList<>());
ingredients.add(new Ingredient(result.getString(7)));
lastMedicationId = currentMedicationId;
}
for (Medication medication : medications) {
medication.setIngredients(ingredientMap.get(medication.getId()));
}
return medications;
}
@Override
public void update(Medication medication) throws SQLException {
final String SQL = """
UPDATE medication SET
name = ?,
manufacturer = ?,
possibleSideEffects = ?,
administrationMethod = ?,
currentStock = ?
WHERE id = ?
""";
PreparedStatement preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setString(1, medication.getName());
preparedStatement.setString(2, medication.getManufacturer());
preparedStatement.setString(3, medication.getPossibleSideEffects());
preparedStatement.setString(4, medication.getAdministrationMethod());
preparedStatement.setInt(5, medication.getCurrentStock());
preparedStatement.setInt(6, medication.getId());
preparedStatement.executeUpdate();
final String ingredientDeleteSQL = """
DELETE FROM medication_ingredient WHERE id = ?
""";
PreparedStatement ingredientStatement = this.connection.prepareStatement(ingredientDeleteSQL);
ingredientStatement.setInt(1, medication.getId());
ingredientStatement.executeUpdate();
final String ingredientCreateSQL = """
INSERT INTO medication_ingredient
(id, name)
VALUES (?, ?);
""";
for (Ingredient ingredient : medication.getIngredients()) {
PreparedStatement statement = this.connection.prepareStatement(ingredientCreateSQL);
statement.setInt(1, medication.getId());
statement.setString(2, ingredient.getName());
statement.execute();
}
}
@Override
public void delete(int id) throws SQLException {
final String SQL = """
DELETE FROM medication WHERE medication.id = ?;
""";
PreparedStatement preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setInt(1, id);
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),
result.getString(2),
result.getString(3),
List.of(),
result.getString(4),
result.getString(5),
result.getInt(6)
);
List<Ingredient> ingredients = new ArrayList<>();
while (result.next()) {
ingredients.add(new Ingredient(result.getString(2)));
}
medication.setIngredients(ingredients);
return medication;
}
}

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;
@ -42,6 +48,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();
@ -74,15 +84,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.readAllActive());
this.nurses.setAll(this.dao.readAllActive());
}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();
@ -97,6 +120,7 @@ public class AllNurseController {
readAllAndShowInTableView();
clearTextfields();
}
@FXML
public void handleLock(){
Nurse selectedItem = this.tableView.getSelectionModel().getSelectedItem();
@ -113,11 +137,4 @@ public class AllNurseController {
readAllAndShowInTableView();
}
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldPhoneNumber.clear();
}
}

View file

@ -7,11 +7,23 @@ 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;
private final SimpleBooleanProperty locked;
/**
* 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,
@ -32,6 +44,9 @@ public class Nurse extends Person {
this.locked = new SimpleBooleanProperty(isLocked);
}
/**
* This constructor allows instantiating a {@link Nurse} object with all existing fields.
*/
public Nurse(
int id,
String firstName,
@ -44,6 +59,7 @@ public class Nurse extends Person {
this.phoneNumber = new SimpleStringProperty(phoneNumber);
this.locked = new SimpleBooleanProperty(isLocked);
}
public String calculateDeleteDate() {
//TODO: Lese alle Behandlungen die Dieser Pfleger Durchgefürt hat & brechene mit ihnen das Datum
return "Comming soon";

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 Heidemann
* @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 Heidemann
* @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 Heidemannn
* @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 Heidemann
* @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,11 +67,19 @@ 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(
@ -66,6 +88,12 @@ public class AllTreatmentController {
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,24 +212,51 @@ 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
public void handleDelete() {
@ -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) {
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 Heidemann
* @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()),
@ -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 Heidemannn
* @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 Heidemann
*/
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,8 +5,19 @@ import javafx.scene.control.Alert;
import java.time.LocalDate;
import java.time.LocalTime;
public class Validator
{
/**
* 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");
@ -14,6 +25,12 @@ public class Validator
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()) {
return false;
@ -25,6 +42,12 @@ 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) {
return false;
@ -36,6 +59,12 @@ public class Validator
}
return true;
}
/**
* 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;
@ -47,6 +76,13 @@ public class Validator
}
return true;
}
/**
* 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)
@ -59,24 +95,57 @@ public class Validator
}
/**
* 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

@ -24,4 +24,9 @@ module de.hitec.nhplus {
exports de.hitec.nhplus.nurse.database;
opens de.hitec.nhplus.nurse to javafx.base, javafx.fxml;
opens de.hitec.nhplus.nurse.database to javafx.base, javafx.fxml;
exports de.hitec.nhplus.medication;
exports de.hitec.nhplus.medication.database;
opens de.hitec.nhplus.medication to javafx.base, javafx.fxml;
opens de.hitec.nhplus.medication.database to javafx.base, javafx.fxml;
}

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?>
<TabPane
fx:id="mainTabPane"
@ -26,4 +25,7 @@
</Tab>
</TabPane>
</Tab>
<Tab fx:id="medicationTab" text="Medikamente">
<AnchorPane fx:id="medicationPage"/>
</Tab>
</TabPane>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<BorderPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="de.hitec.nhplus.medication.AllMedicationController"
>
<padding>
<Insets top="8" left="8" right="8" bottom="8"/>
</padding>
<center>
<TableView fx:id="tableView">
<columns>
<TableColumn
fx:id="columnId"
minWidth="40.0"
text="ID"
/>
<TableColumn
fx:id="columnName"
minWidth="140.0"
text="Name"
/>
<TableColumn
fx:id="columnManufacturer"
minWidth="140.0"
text="Hersteller"
/>
<TableColumn
fx:id="columnIngredient"
minWidth="140.0"
text="Inhaltsstoffe"
/>
<TableColumn
fx:id="columnPossibleSideEffects"
minWidth="200.0"
text="Mögliche Nebenwirkungen"
/>
<TableColumn
fx:id="columnAdministrationMethod"
minWidth="180.0"
text="Verabreichungsmethode"
/>
<TableColumn
fx:id="columnCurrentStock"
minWidth="100.0"
text="Lagerbestand"
/>
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
</TableView>
</center>
<bottom>
<BorderPane>
<BorderPane.margin>
<Insets top="8.0"/>
</BorderPane.margin>
<right>
<HBox spacing="8.0">
<Button
fx:id="buttonAdd"
mnemonicParsing="false"
prefWidth="90.0"
text="Hinzufügen"
/>
<Button
fx:id="buttonDelete"
mnemonicParsing="false"
prefWidth="90.0"
text="Löschen"
/>
</HBox>
</right>
</BorderPane>
</bottom>
</BorderPane>

View file

@ -0,0 +1,9 @@
CREATE TABLE medication
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
manufacturer TEXT NOT NULL,
possibleSideEffects TEXT NOT NULL,
administrationMethod TEXT NOT NULL,
currentStock INTEGER NOT NULL
)

View file

@ -0,0 +1,6 @@
CREATE TABLE medication_ingredient
(
id INTEGER NOT NULL ,
name TEXT NOT NULL,
FOREIGN KEY (id) REFERENCES medication (id) ON DELETE CASCADE
)

View file

@ -12,7 +12,7 @@
<Insets top="8" left="8" right="8" bottom="8"/>
</padding>
<center>
<TableView fx:id="tableView" editable="true" layoutX="31.0" layoutY="40.0">
<TableView fx:id="tableView" editable="true">
<columns>
<TableColumn
fx:id="columnId"

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
)