Compare commits

...

11 Commits

Author SHA1 Message Date
ftraue
0277dafc5e commit 27/05 2025-05-27 12:11:01 +02:00
ftraue
31ee074b02 commit 2025-05-06 13:44:59 +02:00
sar
4d2d048b11 -commit 2025-05-06 12:38:39 +02:00
sar
4942312e8a -commit 2025-05-06 12:37:34 +02:00
sar
d8d6b1c7db Merge remote-tracking branch 'origin/main'
# Conflicts:
#	documentation/userstorys/saad_erweiterung_im_pfleger_3_4.md
2025-05-06 12:33:02 +02:00
sar
37022f4fa6 -commit 2025-05-06 12:32:13 +02:00
ftraue
7a20fc6ab3 Merge remote-tracking branch 'origin/main' 2025-05-06 12:27:06 +02:00
ftraue
75eb4734eb wlf 2025-05-06 12:26:51 +02:00
597452001c Rename to fit 2025-05-06 12:16:35 +02:00
2aabb09d8e Refactor layout 2025-05-06 12:15:09 +02:00
6edeac9139 Refactor layout 2025-05-06 12:14:40 +02:00
19 changed files with 642 additions and 90 deletions

1
.idea/sqldialects.xml generated
View File

@@ -2,6 +2,7 @@
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/datastorage/TreatmentDao.java" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/utils/SetUpDB.java" dialect="SQLite" />
<file url="PROJECT" dialect="SQLite" />
</component>
</project>

Binary file not shown.

View File

@@ -28,6 +28,7 @@ Des Weiteren gibt es gesetzliche Regelungen, die es einzuhalten gilt.
- **T_4**: Überprüfen durch Mitarbeiter, ob Daten gesperrt/ gelöscht gehören
- **T_5**: Automatisieren der Löschung der Daten durch Anpassung des Programmes
- **T_6**: Automatisiertes benachrichtigen der betroffenen Patienten per Mail kurz vor der Löschung der Daten
- **T_7**: Entsperren der Daten durch Button mit Zustimmung des Patienten oder im Falle eines Notfalls
---
@@ -35,11 +36,18 @@ Des Weiteren gibt es gesetzliche Regelungen, die es einzuhalten gilt.
# **Testfälle**
**TF_1**: Sperren der Daten
- Vorbedingung: Einloggen als autorisierter Benutzer
- Vorbedingung: Einloggen als autorisierter Benutzer über gesicherten Login
- Auszuführende Testschritte: Suchen und Sperren der Daten, die 10 Jahre oder älter sind
- Erwartetes Ergebnis: Daten sind weiterhin verfügbar, aber nicht zugänglich
- Erwartetes Ergebnis: Daten sind weiterhin vorhanden, aber nicht zugänglich solange die Sperre nicht aufgehoben wurde
**TF_2**: Löschen der Daten
- Vorbedingung: Sperrfrist ist abgelaufen
- Auszuführende Testschritte: Löschen der Daten mit abgelaufener Sperrfrist
- Erwartetes Ergebnis: Endgültige Löschung und Vernichtung der Daten
**TF_3**: Entsperren der Daten
- Vorbedingung: Daten sind gesperrt
- Auszuführende Testschritte: Daten werden durch Mitarbeiter mit autorisiertem Zugang im Falle eines Notfalls
oder durch die Zustimmung des Patienten über einen Button entsperrt
- Erwartetes Ergebnis: Daten werden wieder freigegeben und können verwendet werden

View File

@@ -0,0 +1,67 @@
# **User Story**
Ich bin Mario, 43 Jahre alt, und arbeite seit 11 Jahren als Pflegekraft in einem Seniorenheim.
In meinem Alltag dokumentiere ich viele Behandlungen oft unter Zeitdruck, zwischen Tür und Angel. Da kommt es leicht zu Fehlern, vor allem wenn ich schnell herausfinden muss, wer welche Behandlung durchgeführt hat oder wenn ich selbst eine neue Behandlung dokumentiere.
Was mich besonders stört: Die Pflegekraft muss immer manuell eingetragen werden manchmal vertippt man sich oder sucht ewig nach dem richtigen Namen.
Ich möchte daher, dass ich beim Anlegen einer neuen Behandlung einfach per ComboBox aus einer Liste aktiver Pflegekräfte die zuständige Person auswählen kann. So kann ich sie eindeutig zuordnen, ohne dass es zu Fehlern kommt auch wenn zwei Kolleg*innen denselben Nachnamen haben.
Die Auswahl soll automatisch mit der Behandlung gespeichert werden, sodass ich (oder jemand anderes) später noch weiß, wer was gemacht hat etwa für Rückfragen, Nachverfolgung oder in der Übergabe.
---
# **Akzeptanzkriterien:**
- **A_1:** Ich sehe beim Erstellen einer neuen Behandlung eine ComboBox mit allen aktiven Pflegekräften.
- **A_2:** Die Pflegekräfte müssen aus der Datenbank über ein Repository abgefragt werden (z.B. findAktivePflegekraefte()).
- **A_3:** Die gewählte Pflegekraft-ID wird beim Speichern zusammen mit der Behandlung abgespeichert.
- **A_4**: Die Datenbankstruktur wird angepasst, falls die Pflegekraft-Zuordnung noch nicht vorgesehen ist.
- **A_5**: Beim Öffnen einer bestehenden Behandlung wird die zugehörige Pflegekraft in der ComboBox vorausgewählt angezeigt.
- **A_6**: Inaktive Pflegekräfte dürfen nicht in der Liste erscheinen, selbst wenn sie früher mal Behandlungen durchgeführt haben.
- **A_7**: Es gibt eine Fehlerprüfung: Wenn keine Pflegekraft ausgewählt wurde, erscheint eine Warnung.
---
# **Tasks**
- **T_1:** Auswahl der Pflegekräfte durch ComboBox
- **T_2:** Nur aktive Pflegekräfte in der ComboBox anzeigen
- **T_3:** Pflegekraft nach 10 Jahren Inaktivität aus dem System löschen
- **T_4:** Benachrichtigung der Pflegekräfte über das Löschen aus dem System
---
# **Testfälle**
TF_1: Auswahl einer Pflegekraft bei neuer Behandlung
- **Vorbedingung:** Mario ist eingeloggt. Mehrere aktive Pflegekräfte sind im System vorhanden.
- **Ablauf:**
1. Mario öffnet die Maske zum Anlegen einer neuen Behandlung.
- **Erwartet:** Eine ComboBox mit allen aktiven Pflegekräften wird angezeigt.
TF_2: Speicherung der Auswahl
- **Vorbedingung:** Mario hat eine Pflegekraft aus der Liste gewählt.
- **Ablauf:**
1. Er speichert die Behandlung.
- **Erwartet:** Die gewählte Pflegekraft ist korrekt mit der Behandlung verknüpft.
TF3: Keine Auswahl Fehlermeldung
- **Vorbedingung:** Mario öffnet die Maske, trifft aber keine Auswahl.
- **Ablauf:** Er klickt auf „Speichern“.
- **Erwartet:** Eine Meldung erscheint: „Bitte eine Pflegekraft auswählen.“
TF4: Inaktive Pflegekräfte sind nicht sichtbar
- **Vorbedingung:** Eine Pflegekraft wurde kürzlich deaktiviert.
- **Ablauf:** Mario öffnet die Maske.
- **Erwartet:** Die deaktivierte Pflegekraft erscheint nicht in der Liste.
TF 5: Anzeige der zugeordneten Pflegekraft in bestehender Behandlung
- **Vorbedingung:** Eine bestehende Behandlung ist mit Pflegekraft „Anna Müller“ verknüpft.
- **Ablauf:** Mario öffnet die Behandlung zur Bearbeitung.
- **Erwartet:** In der ComboBox ist „Müller, Anna“ vorausgewählt.

View File

@@ -1,72 +0,0 @@
# **User Story**
Mein Name ist Mario. Wenn ich eine neue Behandlung anlege, möchte ich die zuständige Pflegekraft einfach über eine Auswahlliste (ComboBox) auswählen können, damit ich sie direkt mit der Behandlung verknüpfen kann.
---
# **Akzeptanzkriterien:**
- **A_1:** Beim Anlegen einer neuen Behandlung ist eine ComboBox sichtbar, die alle aktiven Pflegekräfte enthält.
- **A_2:** Nach Auswahl einer Pflegekraft wird diese korrekt mit der Behandlung gespeichert.
- **A_2:** Nur aktive Pflegekräfte werden zur Auswahl angeboten.
---
# **Tasks**
- **T_1:** Klasse Behandlungsformular um ein ComboBox-Element erweitern.
- **T_2:** Methode ladeAktivePflegekraefte() in Klasse PflegekraftVerwaltung implementieren, die aktive Pflegekräfte liefert.
- **T_3:** Auswahlwert beim Speichern der Behandlung in die Datenbank übertragen (Klasse BehandlungSpeichernService anpassen).
---
# **Testfälle**
TF_1: Pflegekraft in ComboBox auswählbar
- Vorbedingung: Mehrere aktive Pflegekräfte sind im System angelegt.
- Testschritte:
Behandlungsformular öffnen
ComboBox prüfen und eine Pflegekraft auswählen
Behandlung speichern
Erwartetes Ergebnis: Pflegekraft wird korrekt angezeigt und gespeichert.
TF_2: Nur aktive Pflegekräfte auswählbar
Vorbedingung: Es gibt aktive und inaktive Pflegekräfte im System.
Testschritte:
Behandlungsformular öffnen
ComboBox prüfen
Erwartetes Ergebnis: Nur aktive Pflegekräfte werden angezeigt.
TF_3: Zuweisung bei bereits gespeicherter Behandlung korrekt sichtbar
Vorbedingung: Behandlung mit zugewiesener Pflegekraft ist gespeichert.
Testschritte:
Behandlung öffnen
Erwartetes Ergebnis: Zugeordnete Pflegekraft ist sichtbar in der ComboBox (vorausgewählt).
TF_4: Behandlung ohne Pflegekraft verhindert Speicherung (optional)
Vorbedingung: Behandlung wird ohne Pflegekraft erstellt.
Testschritte:
Keine Auswahl treffen
Auf „Speichern“ klicken
Erwartetes Ergebnis: Fehlermeldung erscheint, Speicherung wird verhindert.

View File

@@ -1,12 +1,17 @@
package de.hitec.nhplus.controller;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.LockedPatientDao;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.model.LockedPatient;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
@@ -15,9 +20,20 @@ import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.utils.DateConverter;
import javafx.scene.control.*;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.BooleanProperty;
import javafx.beans.binding.Bindings;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -28,6 +44,8 @@ public class AllPatientController {
@FXML
private TableView<Patient> tableView;
@FXML
private TableColumn<Patient, Integer> columnId;
@@ -55,6 +73,9 @@ public class AllPatientController {
@FXML
private Button buttonAdd;
@FXML
private Button buttonLock;
@FXML
private TextField textFieldSurname;
@@ -81,8 +102,11 @@ public class AllPatientController {
* after loading an FXML-File. At this point of the lifecycle of the Controller, the fields can be accessed and
* configured.
*/
@FXML
public void initialize() {
this.readAllAndShowInTableView();
this.dao = DaoFactory.getDaoFactory().createPatientDAO();
this.columnId.setCellValueFactory(new PropertyValueFactory<>("pid"));
@@ -106,14 +130,15 @@ public class AllPatientController {
this.columnAssets.setCellValueFactory(new PropertyValueFactory<>("assets"));
this.columnAssets.setCellFactory(TextFieldTableCell.forTableColumn());
//Anzeigen der Daten
this.tableView.setItems(this.patients);
this.buttonDelete.setDisable(true);
this.tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Patient>() {
@Override
public void changed(ObservableValue<? extends Patient> observableValue, Patient oldPatient, Patient newPatient) {;
public void changed(ObservableValue<? extends Patient> observableValue, Patient oldPatient, Patient newPatient) {
AllPatientController.this.buttonDelete.setDisable(newPatient == null);
}
});
@@ -126,6 +151,7 @@ public class AllPatientController {
this.textFieldCareLevel.textProperty().addListener(inputNewPatientListener);
this.textFieldRoomNumber.textProperty().addListener(inputNewPatientListener);
this.textFieldAssets.textProperty().addListener(inputNewPatientListener);
}
/**
@@ -231,8 +257,11 @@ public class AllPatientController {
Patient selectedItem = this.tableView.getSelectionModel().getSelectedItem();
if (selectedItem != null) {
try {
LockedPatientDao lockedPatientDao = DaoFactory.getDaoFactory().createLockedPatientDAO();
lockedPatientDao.insertIntoLockedPatient(selectedItem);
DaoFactory.getDaoFactory().createPatientDAO().deleteById(selectedItem.getPid());
this.tableView.getItems().remove(selectedItem);
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -253,8 +282,10 @@ public class AllPatientController {
String careLevel = this.textFieldCareLevel.getText();
String roomNumber = this.textFieldRoomNumber.getText();
String assets = this.textFieldAssets.getText();
Patient newPatient = new Patient(firstName, surname, date, careLevel, roomNumber, assets);
try {
this.dao.create(new Patient(firstName, surname, date, careLevel, roomNumber, assets));
this.dao.create(newPatient);
} catch (SQLException exception) {
exception.printStackTrace();
}

View File

@@ -0,0 +1,117 @@
package de.hitec.nhplus.controller;
import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.LockedPatientDao;
import de.hitec.nhplus.model.LockedPatient;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableView;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.model.Patient;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class LockedPatientController {
@FXML
private TableView<Patient> lockedTableView;
@FXML
private TableColumn<Patient, Integer> lockedColumnId;
@FXML
private TableColumn<Patient, String> lockedColumnFirstName;
@FXML
private TableColumn<Patient, String> lockedColumnSurname;
@FXML
private TableColumn<Patient, String> lockedColumnDateOfBirth;
@FXML
private TableColumn<Patient, String> lockedColumnCareLevel;
@FXML
private TableColumn<Patient, String> lockedColumnRoomNumber;
@FXML
private TableColumn<Patient, String> lockedColumnAssets;
@FXML
private Button buttonUnlock;
private final ObservableList<Patient> lockedPatients = FXCollections.observableArrayList();
private PatientDao dao;
public void initialize() {
this.dao = DaoFactory.getDaoFactory().createPatientDAO();
this.lockedColumnId.setCellValueFactory(new PropertyValueFactory<>("pid"));
this.lockedColumnFirstName.setCellValueFactory(new PropertyValueFactory<>("firstName"));
this.lockedColumnFirstName.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnSurname.setCellValueFactory(new PropertyValueFactory<>("surname"));
this.lockedColumnSurname.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnDateOfBirth.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
this.lockedColumnDateOfBirth.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnCareLevel.setCellValueFactory(new PropertyValueFactory<>("careLevel"));
this.lockedColumnCareLevel.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnRoomNumber.setCellValueFactory(new PropertyValueFactory<>("roomNumber"));
this.lockedColumnRoomNumber.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnAssets.setCellValueFactory(new PropertyValueFactory<>("assets"));
this.lockedColumnAssets.setCellFactory(TextFieldTableCell.forTableColumn());
lockedTableView.setItems(this.lockedPatients);
lockedTableView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
buttonUnlock.setDisable(false);
} else {
buttonUnlock.setDisable(true);
}
});
}
@FXML
public void handleUnlock() {
Patient selectedPatient = lockedTableView.getSelectionModel().getSelectedItem();
PatientDao patientDao = DaoFactory.getDaoFactory().createPatientDAO();
LockedPatientDao lockedPatientDao = DaoFactory.getDaoFactory().createLockedPatientDAO();
if (selectedPatient != null) {
try {
patientDao.create(selectedPatient);
lockedPatientDao.deleteById(selectedPatient.getPid());
lockedPatients.remove(selectedPatient);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -32,4 +32,13 @@ public class MainWindowController {
exception.printStackTrace();
}
}
@FXML
private void handleShowLockedPatient(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/LockedPatientView.fxml"));
try {
mainBorderPane.setCenter(loader.load());
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

View File

@@ -1,7 +1,13 @@
package de.hitec.nhplus.datastorage;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DaoFactory {
private static final String DB_URL = "jdbc:sqlite:nhplus.db";
private static DaoFactory instance;
private DaoFactory() {
@@ -14,6 +20,10 @@ public class DaoFactory {
return DaoFactory.instance;
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL);
}
public TreatmentDao createTreatmentDao() {
return new TreatmentDao(ConnectionBuilder.getConnection());
}
@@ -21,4 +31,7 @@ public class DaoFactory {
public PatientDao createPatientDAO() {
return new PatientDao(ConnectionBuilder.getConnection());
}
public LockedPatientDao createLockedPatientDAO() {
return new LockedPatientDao(ConnectionBuilder.getConnection());
}
}

View File

@@ -1,5 +1,7 @@
package de.hitec.nhplus.datastorage;
import de.hitec.nhplus.model.Patient;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
@@ -14,6 +16,7 @@ public abstract class DaoImp<T> implements Dao<T> {
@Override
public void create(T t) throws SQLException {
getCreateStatement(t).executeUpdate();
}
@Override
@@ -54,4 +57,5 @@ public abstract class DaoImp<T> implements Dao<T> {
protected abstract PreparedStatement getUpdateStatement(T t);
protected abstract PreparedStatement getDeleteStatement(long key);
}
}

View File

@@ -0,0 +1,110 @@
package de.hitec.nhplus.datastorage;
import de.hitec.nhplus.model.LockedPatient;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.utils.DateConverter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class LockedPatientDao extends DaoImp<Patient>{
public LockedPatientDao(Connection connection) {
super(connection);
}
@Override
protected Patient getInstanceFromResultSet(ResultSet resultSet) throws SQLException {
long pid = resultSet.getLong("pid");
String firstname = resultSet.getString("firstname");
String surname = resultSet.getString("surname");
String dob = resultSet.getString("dateOfBirth");
String carelevel = resultSet.getString("carelevel");
String roomnumber = resultSet.getString("roomnumber");
String assets = resultSet.getString("assets");
boolean locked = resultSet.getBoolean("locked");
Patient patient = new Patient(
pid,
firstname,
surname,
DateConverter.convertStringToLocalDate(dob),
carelevel,
roomnumber,
assets
);
patient.setLocked(locked);
return patient;
}
@Override
protected ArrayList<Patient> getListFromResultSet(ResultSet set) throws SQLException {
ArrayList<Patient> list = new ArrayList<>();
while (set.next()) {
list.add(getInstanceFromResultSet(set));
}
return list;
}
public void insertIntoLockedPatient(Patient lockedPatient) {
final String SQL = "INSERT INTO locked_patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets, locked) VALUES (?, ?, ?, ?, ?, ?, ?)";
try {
PreparedStatement stmt = this.connection.prepareStatement(SQL);
stmt.setString(1, lockedPatient.getFirstName());
stmt.setString(2, lockedPatient.getSurname());
stmt.setString(3, lockedPatient.getDateOfBirth());
stmt.setString(4, lockedPatient.getCareLevel());
stmt.setString(5, lockedPatient.getRoomNumber());
stmt.setString(6, lockedPatient.getAssets());
stmt.setBoolean(7, true);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected PreparedStatement getCreateStatement(Patient lockedPatient) {
PreparedStatement stmt = null;
return stmt;
}
@Override
protected PreparedStatement getReadByIDStatement(long key) {
return null;
}
@Override
protected PreparedStatement getReadAllStatement() {
try {
final String SQL = "SELECT * FROM locked_patient";
return this.connection.prepareStatement(SQL);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
protected PreparedStatement getUpdateStatement(Patient patient) {
return null;
}
@Override
protected PreparedStatement getDeleteStatement(long key) {
PreparedStatement preparedStatement = null;
try {
final String SQL = "DELETE FROM patient WHERE pid = ?";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setLong(1, key);
} catch (SQLException exception) {
exception.printStackTrace();
}
return preparedStatement;
}
}

View File

@@ -6,6 +6,7 @@ import de.hitec.nhplus.utils.DateConverter;
import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
* Implements the Interface <code>DaoImp</code>. Overrides methods to generate specific <code>PreparedStatements</code>,
@@ -13,6 +14,8 @@ import java.util.ArrayList;
*/
public class PatientDao extends DaoImp<Patient> {
private static PatientDao instance;
/**
* The constructor initiates an object of <code>PatientDao</code> and passes the connection to its super class.
*
@@ -32,8 +35,7 @@ public class PatientDao extends DaoImp<Patient> {
protected PreparedStatement getCreateStatement(Patient patient) {
PreparedStatement preparedStatement = null;
try {
final String SQL = "INSERT INTO patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets) " +
"VALUES (?, ?, ?, ?, ?, ?)";
final String SQL = "INSERT INTO patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets, locked) VALUES (?, ?, ?, ?, ?, ?, ?)";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setString(1, patient.getFirstName());
preparedStatement.setString(2, patient.getSurname());
@@ -41,6 +43,7 @@ public class PatientDao extends DaoImp<Patient> {
preparedStatement.setString(4, patient.getCareLevel());
preparedStatement.setString(5, patient.getRoomNumber());
preparedStatement.setString(6, patient.getAssets());
preparedStatement.setBoolean(7, patient.isLocked());
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -66,6 +69,13 @@ public class PatientDao extends DaoImp<Patient> {
return preparedStatement;
}
public static PatientDao getInstance(Connection connection) {
if (instance == null) {
instance = new PatientDao(connection);
}
return instance;
}
/**
* Maps a <code>ResultSet</code> of one patient to an object of <code>Patient</code>.
*
@@ -73,8 +83,8 @@ public class PatientDao extends DaoImp<Patient> {
* @return Object of class <code>Patient</code> with the data from the resultSet.
*/
@Override
protected Patient getInstanceFromResultSet(ResultSet result) throws SQLException {
return new Patient(
public Patient getInstanceFromResultSet(ResultSet result) throws SQLException {
Patient patient = new Patient(
result.getInt(1),
result.getString(2),
result.getString(3),
@@ -82,6 +92,8 @@ public class PatientDao extends DaoImp<Patient> {
result.getString(5),
result.getString(6),
result.getString(7));
patient.setLocked(result.getBoolean("buttonLock"));
return patient;
}
/**
@@ -139,7 +151,8 @@ public class PatientDao extends DaoImp<Patient> {
"dateOfBirth = ?, " +
"carelevel = ?, " +
"roomnumber = ?, " +
"assets = ? " +
"assets = ?, " +
"locked = ? " +
"WHERE pid = ?";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setString(1, patient.getFirstName());
@@ -148,7 +161,8 @@ public class PatientDao extends DaoImp<Patient> {
preparedStatement.setString(4, patient.getCareLevel());
preparedStatement.setString(5, patient.getRoomNumber());
preparedStatement.setString(6, patient.getAssets());
preparedStatement.setLong(7, patient.getPid());
preparedStatement.setBoolean(7, patient.isLocked());
preparedStatement.setLong(8, patient.getPid());
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -173,4 +187,21 @@ public class PatientDao extends DaoImp<Patient> {
}
return preparedStatement;
}
public void lockPatient(long pid, boolean locked) throws SQLException {
final String SQL = "UPDATE patient SET locked = ? WHERE pid = ?";
PreparedStatement stmt = this.connection.prepareStatement(SQL);
stmt.setBoolean(1, locked);
stmt.setLong(2, pid);
stmt.executeUpdate();
}
public List<Patient> readAllLocked() throws SQLException {
String sql = "SELECT * FROM locked_patient WHERE locked = 1";
PreparedStatement statement = this.connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
return getListFromResultSet(resultSet);
}
}

View File

@@ -0,0 +1,123 @@
package de.hitec.nhplus.model;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleStringProperty;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
public class LockedPatient extends Person {
private SimpleLongProperty pid;
private final SimpleStringProperty dateOfBirth;
private final SimpleStringProperty careLevel;
private final SimpleStringProperty roomNumber;
private final SimpleStringProperty assets;
/**
* Constructor to initiate an object of class <code>Patient</code> with the given parameter. Use this constructor
* to initiate objects, which are not persisted yet, because it will not have a patient id (pid).
*
* @param firstName First name of the patient.
* @param surname Last name of the patient.
* @param dateOfBirth Date of birth of the patient.
* @param careLevel Care level of the patient.
* @param roomNumber Room number of the patient.
* @param assets Assets of the patient.
*/
public LockedPatient(String firstName, String surname, LocalDate dateOfBirth, String careLevel, String roomNumber, String assets) {
super(firstName, surname);
this.dateOfBirth = new SimpleStringProperty(DateConverter.convertLocalDateToString(dateOfBirth));
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked = new SimpleBooleanProperty();
}
public LockedPatient(long pid, String firstName, String surname, LocalDate dateOfBirth, String careLevel, String roomNumber, String assets) {
super(firstName, surname);
this.pid = new SimpleLongProperty(pid);
this.dateOfBirth = new SimpleStringProperty(DateConverter.convertLocalDateToString(dateOfBirth));
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked.set(false);
}
public long getPid() {
return pid.get();
}
public SimpleLongProperty pidProperty() {
return pid;
}
public String getDateOfBirth() {
return dateOfBirth.get();
}
public SimpleStringProperty dateOfBirthProperty() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth.set(dateOfBirth);
}
public String getCareLevel() {
return careLevel.get();
}
public SimpleStringProperty careLevelProperty() {
return careLevel;
}
public void setCareLevel(String careLevel) {
this.careLevel.set(careLevel);
}
public String getRoomNumber() {
return roomNumber.get();
}
public SimpleStringProperty roomNumberProperty() {
return roomNumber;
}
private SimpleBooleanProperty locked = new SimpleBooleanProperty(false);
public boolean isLocked() {
return locked.get();
}
public void setLocked(boolean value) {
this.locked.set(value);
}
public BooleanProperty lockedProperty() {
return locked;
}
public void setRoomNumber(String roomNumber) {
this.roomNumber.set(roomNumber);
}
public String getAssets() {
return assets.get();
}
public SimpleStringProperty assetsProperty() {
return assets;
}
public void setAssets(String assets) {
this.assets.set(assets);
}
}

View File

@@ -3,6 +3,8 @@ package de.hitec.nhplus.model;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.BooleanProperty;
import java.time.LocalDate;
import java.util.ArrayList;
@@ -36,6 +38,7 @@ public class Patient extends Person {
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked = new SimpleBooleanProperty();
}
/**
@@ -57,6 +60,7 @@ public class Patient extends Person {
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked.set(false);
}
public long getPid() {
@@ -104,6 +108,20 @@ public class Patient extends Person {
return roomNumber;
}
private SimpleBooleanProperty locked = new SimpleBooleanProperty(false);
public boolean isLocked() {
return locked.get();
}
public void setLocked(boolean value) {
this.locked.set(value);
}
public BooleanProperty lockedProperty() {
return locked;
}
public void setRoomNumber(String roomNumber) {
this.roomNumber.set(roomNumber);

View File

@@ -0,0 +1,8 @@
package de.hitec.nhplus.utils;
public class CheckBeforeStart {
public void checkExpiredPatient () {
}
}

View File

@@ -1,9 +1,6 @@
package de.hitec.nhplus.utils;
import de.hitec.nhplus.datastorage.ConnectionBuilder;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.datastorage.TreatmentDao;
import de.hitec.nhplus.datastorage.*;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.model.Treatment;
@@ -33,6 +30,7 @@ public class SetUpDB {
SetUpDB.setUpTableTreatment(connection);
SetUpDB.setUpPatients();
SetUpDB.setUpTreatments();
SetUpDB.setUpLockedPatient();
}
/**
@@ -55,7 +53,8 @@ public class SetUpDB {
" dateOfBirth TEXT NOT NULL, " +
" carelevel TEXT NOT NULL, " +
" roomnumber TEXT NOT NULL, " +
" assets TEXt NOT NULL" +
" assets TEXt NOT NULL," +
" locked BOOLEAN DEFAULT FALSE" +
");";
try (Statement statement = connection.createStatement()) {
statement.execute(SQL);
@@ -98,6 +97,15 @@ public class SetUpDB {
}
}
private static void setUpLockedPatient() {
try {
LockedPatientDao dao = DaoFactory.getDaoFactory().createLockedPatientDAO();
dao.readAll();
} catch (SQLException exception){
exception.printStackTrace();
}
}
private static void setUpTreatments() {
try {
TreatmentDao dao = DaoFactory.getDaoFactory().createTreatmentDao();

View File

@@ -77,4 +77,4 @@
<padding>
<Insets top="10.0" />
</padding>
</AnchorPane>
</AnchorPane>

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="de.hitec.nhplus.controller.LockedPatientController" prefHeight="500.0" prefWidth="855.0">
<children>
<TableView fx:id="lockedTableView" layoutX="31.0" layoutY="120.0" prefHeight="287.0" prefWidth="825.0" AnchorPane.bottomAnchor="100.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="80.0">
<columns>
<TableColumn fx:id="lockedColumnId" maxWidth="1200.0" minWidth="5.0" prefWidth="5.0" text="ID" />
<TableColumn fx:id="lockedColumnSurname" maxWidth="7500.0" minWidth="20.0" prefWidth="100.0" text="Nachname" />
<TableColumn fx:id="lockedColumnFirstName" maxWidth="7500.0" prefWidth="75.0" text="Vorname" />
<TableColumn fx:id="lockedColumnDateOfBirth" maxWidth="7500.0" prefWidth="75.0" text="Geburtstag" />
<TableColumn fx:id="lockedColumnCareLevel" prefWidth="75.0" text="Pflegegrad" />
<TableColumn fx:id="lockedColumnRoomNumber" prefWidth="75.0" text="Raum" />
<TableColumn fx:id="lockedColumnAssets" prefWidth="75.0" text="Vermögensstand" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
<HBox layoutX="623.0" layoutY="419.3999938964844" spacing="10.0" AnchorPane.bottomAnchor="15.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0">
<children>
<GridPane hgap="10.0" vgap="10.0">
<columnConstraints>
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" prefWidth="200.0" />
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" minWidth="200.0" prefWidth="200.0" />
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" minWidth="10.0" prefWidth="160.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<padding>
<Insets right="10.0" />
</padding>
<HBox.margin>
<Insets />
</HBox.margin>
</GridPane>
</children>
</HBox>
<HBox alignment="TOP_CENTER" layoutX="10.0" layoutY="10.0" prefWidth="200.0" spacing="25.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="5.0">
<children>
<Label alignment="CENTER" contentDisplay="CENTER" minWidth="400.0" text="Gesperrte Patienten/innen" textAlignment="CENTER">
<font>
<Font size="36.0" />
</font>
</Label>
</children>
</HBox>
<Button fx:id="buttonUnlock" text="Entsperren" onAction="#handleUnlock" AnchorPane.rightAnchor="10" AnchorPane.bottomAnchor="15" prefWidth="90"/>
</children>
<padding>
<Insets top="10.0" />
</padding>
</AnchorPane>

View File

@@ -19,6 +19,9 @@
<VBox.margin>
<Insets bottom="50.0" left="10.0" right="10.0" top="50.0" />
</VBox.margin></Button>
<Button alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleShowLockedPatient" prefWidth="105.0" text="Gesperrte Patienten/innen">
<Insets bottom="50" left="10" right="10" top="100"/>
</Button>
</children>
</VBox>
</left>