Compare commits

..

6 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
17 changed files with 609 additions and 54 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

@@ -1,61 +1,67 @@
# **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.
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:** 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.
- **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:** 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).
- **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: Pflegekraft in ComboBox auswählbar
TF_1: Auswahl einer Pflegekraft bei neuer Behandlung
- 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.
- **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: Nur aktive Pflegekräfte auswählbar
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.
- Vorbedingung: Es gibt aktive und inaktive Pflegekräfte im System.
TF3: Keine Auswahl Fehlermeldung
- 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.
- **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,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>