Compare commits
54 Commits
bec7358f2a
...
featureNHP
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0277dafc5e | ||
|
|
31ee074b02 | ||
|
|
4d2d048b11 | ||
|
|
4942312e8a | ||
|
|
d8d6b1c7db | ||
|
|
37022f4fa6 | ||
|
|
7a20fc6ab3 | ||
|
|
75eb4734eb | ||
| 597452001c | |||
| 2aabb09d8e | |||
| 6edeac9139 | |||
|
|
372e00e551 | ||
|
|
21169563a1 | ||
|
|
2190bf2cc6 | ||
|
|
a242079438 | ||
|
|
c11cf91fd4 | ||
|
|
bf834a9897 | ||
|
|
5b70fdcc3d | ||
|
|
990058c082 | ||
| 1dee17c23d | |||
|
|
0050532afc | ||
| cc183eba6a | |||
| 504de1bd7b | |||
|
|
f621ff6f41 | ||
|
|
e4d10570a1 | ||
|
|
94dfd1f29b | ||
| 6dbf5f2946 | |||
| 4806c01a8f | |||
| 9a0593dcae | |||
| 5d582bc4e5 | |||
| 6dc58b3560 | |||
| f43a29d6c1 | |||
|
|
6f6420d1e5 | ||
|
|
602e39e8d2 | ||
|
|
a653b9bd3c | ||
|
|
62a874f9f2 | ||
|
|
273ead56ed | ||
|
|
d55a69c267 | ||
|
|
ab371e433b | ||
|
|
d71617680f | ||
|
|
a43e02defb | ||
|
|
3e5d4b6b9c | ||
| 52c755273a | |||
| cb54a1a35f | |||
| 7355823ad7 | |||
| a368b31cca | |||
| f3abc98779 | |||
| 8b0869c153 | |||
| 2ac877490e | |||
|
|
7c158b21d2 | ||
|
|
d424821e11 | ||
| b72eadd688 | |||
|
|
e5250a85bd | ||
|
|
f5ae1f49e7 |
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -8,7 +8,7 @@
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_20" default="true" project-jdk-name="liberica-20" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="liberica-20" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
1
.idea/sqldialects.xml
generated
1
.idea/sqldialects.xml
generated
@@ -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.
@@ -1,47 +1,129 @@
|
||||
Du hast im Projekt die Aufgabe übernommen, dich mit den datenschutzrechtlichen Gegebenheiten für die erfolgreiche Umsetzung von NHPlus, auseinander zu setzen. Recherchiere im ersten Schritt die grundlegenden Bestimmungen laut DSGVO bezüglich der Speicherung von Kundendaten und der Daten der Mitarbeiter. Beantworte dabei mindestens folgende Fragen und begründe die Antwort ggf. mit den entsprechenden Paragraphen:
|
||||
Du hast im Projekt die Aufgabe übernommen, dich mit den datenschutzrechtlichen Gegebenheiten für die erfolgreiche Umsetzung von **NHPlus** auseinanderzusetzen. Recherchiere im ersten Schritt die grundlegenden Bestimmungen laut **DSGVO** bezüglich der Speicherung von **Kundendaten** und der **Daten der Mitarbeiter**. Beantworte dabei mindestens folgende Fragen und begründe die Antwort ggf. mit den entsprechenden Paragraphen:
|
||||
|
||||
1. Was musst du bei der technischen Umsetzung der Speicherung von personenbezogenen Daten bedenken?
|
||||
---
|
||||
|
||||
a. Patientendaten in Krankenakten sind nach Abschluss der Behandlung zu sperren und spätestens nach 30 Jahren zu löschen. § 7 Abs. 4 bleibt unberührt.
|
||||
### 1. Was musst du bei der technischen Umsetzung der Speicherung von personenbezogenen Daten bedenken?
|
||||
|
||||
2. Welche Rechte haben die Patienten (Kunden) bezogen auf ihre persönlichen Daten?
|
||||
Bei der technischen Umsetzung der Speicherung personenbezogener Daten – insbesondere sensibler Patientendaten – sind folgende datenschutzrechtliche Anforderungen gemäß DSGVO zu berücksichtigen:
|
||||
|
||||
a. Patienten haben das Recht, eine Kopie der Akten zu erhalten (Art. 15 DSGVO) und auch das Recht, diese zu berichtigen (Art. 16 DSGVO).
|
||||
Des Weiteren haben sie auch das Recht, Daten löschen zu lassen(Art. 17 DSGVO) und darüber informiert zu werden, sollte ein Verstoß seitens der medizinischen Einrichtung gegen die DSGVO bestehen(Art. 34 DSGVO).
|
||||
- #### Integrität und Vertraulichkeit (Art. 5 Abs. 1 lit. f DSGVO):
|
||||
Personenbezogene Daten müssen durch geeignete technische und organisatorische Maßnahmen vor unbefugtem Zugriff, Verlust oder Veränderung geschützt werden (z.B. Verschlüsselung, Zugriffskontrolle, sichere Authentifizierung).
|
||||
|
||||
3. Welche Rechte haben die Mitarbeiter/innen bezogen auf ihre persönlichen Daten?
|
||||
- #### Speicherbegrenzung (Art. 5 Abs. 1 lit. e DSGVO):
|
||||
Daten dürfen nur so lange gespeichert werden, wie sie für den Zweck ihrer Erhebung erforderlich sind. Nach Ablauf dieser Frist sind sie zu löschen oder zu anonymisieren.
|
||||
|
||||
a. Mitarbeiter/innen haben das Recht zu erfahren, wofür die Daten verwendet werden, wer die Daten verwendet und was für Daten gespeichert werden(Art. 15 DSGVO).
|
||||
Sie haben auch das Recht, die Weiterverarbeitung der Daten einzuschränken, wenn der Verdacht besteht, dass die Daten nicht richtig genutzt werden(Art. 18 DSGVO).
|
||||
- #### Sperrung und Löschung medizinischer Daten:
|
||||
Laut § 7 Abs. 4 Musterberufsordnung für Ärzte (MBO-Ä) sind Patientendaten nach Abschluss der Behandlung zu sperren und spätestens nach 30 Jahren zu löschen. Diese nationale Regelung konkretisiert die Speicherbegrenzung der DSGVO im medizinischen Bereich.
|
||||
|
||||
4. Welche Stellen bieten zertifizierte Fortbildungen für angehende Datenschutzbeauftragte an und welche Firmen sind verpflichtet einen eigenen Datenschutzbeauftragten zu stellen?
|
||||
- #### Datensicherheit (Art. 32 DSGVO):
|
||||
Es müssen angemessene Maßnahmen zur Sicherstellung der Verfügbarkeit, Belastbarkeit und Vertraulichkeit der Systeme getroffen werden, z.B. durch regelmäßige Backups, Verschlüsselung und Protokollierung von Zugriffen.
|
||||
|
||||
a. Der [TüvSüd](https://www.tuvsud.com/de-de/dienstleistungen/cyber-security/datenschutz?utm_source=google&utm_medium=cpc&utm_campaign=a-on_g--se-ge-xdsb_de_de_ba_aca_lds_ts&utm_term=datenschutz%20datenschutzbeauftragter&utm_id=170779529&s_kwcid=AL!14017!3!457723098854!p!!g!!datenschutz%20datenschutzbeauftragter&gad_source=1&gclid=Cj0KCQjwna6_BhCbARIsALId2Z0NjfIyPtKqpPlx75nZGsM905YEuHfgj-Q0xoPbYHIKEVH__PdE_5YaAjvfEALw_wcB) bietet Weiterbildungen an sowie die IHKs.
|
||||
---
|
||||
|
||||
b. Ab 20 Mitarbeitern, die regelmäßig und automatisiert personenbezogene Daten verarbeiten, ist ein Datenschutzbeauftragter gesetzlich vorgeschrieben (DSGVO, BDSG). Dies gilt für jede systematische, IT-gestützte Datenverarbeitung, unabhängig vom Beschäftigungsstatus. [IHK Stttgart](https://www.ihk.de/stuttgart/fuer-unternehmen/recht-und-steuern/datenschutzrecht/der-betriebliche-datenschutzbeauftragte2-3810788#:~:text=I.-,Wann%20muss%20ein%20Datenschutzbeauftragter%20bestellt%20werden%3F,verpflichtend%20ein%20Datenschutzbeauftragter%20zu%20benennen.)
|
||||
### 2. Welche Rechte haben die Patienten (Kunden) bezogen auf ihre persönlichen Daten?
|
||||
|
||||
5. Recherchiere nun die Besonderheiten für die Aufbewahrung von Patientendaten. Wo finden sich diese Regelungen wieder?
|
||||
|
||||
a. [Some INFO](https://www.virchowbund.de/praxis-knowhow/praxis-gruenden-und-ausbauen/patientenakten-aufbewahren)
|
||||
Zu den Rechten, die Patientinnen und Patienten haben, gehören:
|
||||
|
||||
6. Welche Grundsätze zur Arbeit mit Patientendaten stehen in Konflikt mit den Grundsätzen der DSGVO?
|
||||
- **Einsichtsrecht in die Behandlungsunterlagen:**
|
||||
Patientinnen und Patienten haben das Recht, ihre Behandlungsunterlagen einzusehen. Dazu zählt auch das Recht, Kopien dieser Unterlagen zu erhalten.
|
||||
|
||||
a. Behandlung vs Datenminimierung:
|
||||
Zur Behandlung werden sehr viele Unterschiedliche personenbezogene Daten benötigt und desto mehr Daten desto besser kann die Behandlung vollzogen werden, jedoch geht die Datenminimierung der DSGVO davon aus, dass nur so wenig wie es nur geht an Daten erhoben werden sollen.
|
||||
- **Recht auf Information und Aufklärung:**
|
||||
Patientinnen und Patienten müssen vor einer Behandlung umfassend und verständlich über Diagnose, geplante Maßnahmen, Risiken und Alternativen informiert werden.
|
||||
|
||||
b. Langfristige Speicherung vs Speicherbegrenzung:
|
||||
Laut nationalem Recht müssen die Patientenakten für bis zu 10 Jahre oder länger abgespeichert sein, dies geht jedoch gegen die DSGVO die besagt das die Daten nur so lange abgespeichert sein sollen, wie sie benötigt werden. Deshalb gibt es legitime Ausnahmen für nationale Aufbewahrungspflichten.
|
||||
- **Recht auf Selbstbestimmung:**
|
||||
Medizinische Maßnahmen dürfen grundsätzlich nur mit der **Einwilligung** der Patientin oder des Patienten durchgeführt werden. Ohne diese Zustimmung ist eine Behandlung – außer in Notfällen – nicht zulässig.
|
||||
|
||||
c. Transparenz vs medizinische Fachsprache:
|
||||
In der DSGVO haben diejenigen von denen die Daten erhoben werden ein Auskunftsrecht darauf zu wissen was mit ihnen geschieht, jedoch ist das für einen Patienten schwierig zu verstehen aufgrund der medizinischen Fachsprache die dort in Verwendung ist.
|
||||
---
|
||||
|
||||
d. Zweckbindung vs Forschung:
|
||||
Die Gesundheitsdaten könnten weiterverwendet werden für wissenschaftliche Forschung, jedoch steht in der DSGVO das eine weiterverarbeitung der Daten für neue Zwecke nicht ohne Weiteres erlaubt ist.
|
||||
### 3. Welche Rechte haben die MitarbeiterInnen bezogen auf ihre persönlichen Daten?
|
||||
|
||||
7. Gegen welche Bestimmungen des Datenschutzgesetzes verstößt NHPlus?
|
||||
- Mitarbeitende dürfen jederzeit alle personenbezogenen Daten einsehen, die über sie gespeichert sind – einschließlich der Personalakte.
|
||||
- MitarbeiterInnen haben das Recht zu erfahren, **wofür die Daten verwendet werden**, **wer die Daten verwendet** und **welche Daten gespeichert werden** *(Art. 15 DSGVO)*.
|
||||
- Sie haben auch das Recht, die Weiterverarbeitung der Daten einzuschränken, wenn der Verdacht besteht, dass die Daten **nicht richtig genutzt werden** *(Art. 18 DSGVO)*.
|
||||
|
||||
---
|
||||
|
||||
8. Erarbeite ein Konzept, welches die technischen Voraussetzungen für die korrekte Umsetzung aller Gesetze stellt. Benenne dabei die konkreten Änderungen oder Erweiterungen, die in der Anwendung NHPlus zu realisieren sind.
|
||||
### 4. Welche Stellen bieten zertifizierte Fortbildungen für angehende Datenschutzbeauftragte an und welche Firmen sind verpflichtet, einen eigenen Datenschutzbeauftragten zu stellen?
|
||||
|
||||
**Anbieter zertifizierter Fortbildungen:**
|
||||
|
||||
Hinweis: Nutze die anliegenden Informationen, insbesondere für die Krankenhaus/Pflegebezogenen Regelungen und Gesetze.
|
||||
- Zertifizierte Weiterbildungen zum Datenschutzbeauftragten werden unter anderem von der TÜV SÜD Akademie angeboten.
|
||||
- Auch die Industrie- und Handelskammern bieten entsprechende Schulungen an, häufig mit IHK-Zertifikat.
|
||||
|
||||
**Pflicht zur Benennung eines Datenschutzbeauftragten:**
|
||||
|
||||
- Nach DSGVO und BDSG ist ein Datenschutzbeauftragter gesetzlich vorgeschrieben,
|
||||
wenn ein Unternehmen **mindestens 20 Personen** beschäftigt, die **regelmäßig und automatisiert personenbezogene Daten verarbeiten** – unabhängig von Art der Anstellung.
|
||||
|
||||
---
|
||||
|
||||
### 5. Recherchiere nun die Besonderheiten für die Aufbewahrung von Patientendaten. Wo finden sich diese Regelungen wieder?
|
||||
|
||||
- **Die Aufbewahrung von Patientendaten** unterliegt besonderen gesetzlichen Regelungen, da es sich um besonders schützenswerte personenbezogene Gesundheitsdaten handelt.
|
||||
|
||||
- **Die Regelungen** befinden sich im DSGVO unter Art. 9 und Art. 5 Abs. 1 Buchstabe e.
|
||||
|
||||
- **Art. 5 Abs. 1 Buchstabe e**: Sagt aus, dass Personenbezogene-/Patientendaten nicht länger aufbewahrt werden dürfen, als sie gebraucht werden.
|
||||
|
||||
- **Art. 9**: Laut diesem Artikel sind Patienten-/Gesundheitsdaten eine besondere Kategorie. Besondere Kategorien unterliegen bestimmten "Sonder"-Regelungen.
|
||||
|
||||
- [Informationen des Virchowbundes](https://www.virchowbund.de/praxis-knowhow/praxis-gruenden-und-ausbauen/patientenakten-aufbewahren)
|
||||
- [DSGVO](https://dsgvo-gesetz.de/)
|
||||
---
|
||||
|
||||
### 6. Welche Grundsätze zur Arbeit mit Patientendaten stehen in Konflikt mit den Grundsätzen der DSGVO?
|
||||
|
||||
**a. Behandlung vs. Datenminimierung:**
|
||||
Für eine gute Behandlung werden viele Daten benötigt – im Widerspruch zur DSGVO, die fordert, nur das **nötigste Maß an Daten** zu erheben.
|
||||
|
||||
**b. Langfristige Speicherung vs. Speicherbegrenzung:**
|
||||
Gesetze fordern Aufbewahrung über viele Jahre (z. B. 10 oder 30 Jahre), die DSGVO erlaubt Speicherung aber nur **solange wie nötig**. Es gibt **nationale Ausnahmen**.
|
||||
|
||||
**c. Transparenz vs. medizinische Fachsprache:**
|
||||
PatientInnen haben laut DSGVO **ein Auskunftsrecht**, doch die Sprache in medizinischen Unterlagen ist oft **schwer verständlich**.
|
||||
|
||||
**d. Zweckbindung vs. Forschung:**
|
||||
Gesundheitsdaten könnten zur Forschung verwendet werden, aber die DSGVO erlaubt **Zweckänderungen nur eingeschränkt**.
|
||||
|
||||
---
|
||||
|
||||
### 7. Gegen welche Bestimmungen des Datenschutzgesetzes verstößt NHPlus?
|
||||
|
||||
NHPlus verletzt in mehreren Punkten die Datenschutz-Grundverordnung (DSGVO). Besonders kritisch sind folgende Aspekte:
|
||||
|
||||
#### Zu viele Daten erhoben:
|
||||
- Es werden mehr persönliche Informationen gesammelt, als für die medizinische Versorgung nötig sind – etwa der Vermögensstand der Patienten. Das widerspricht dem Prinzip der Datenminimierung (Art. 5 Abs. 1 lit. c DSGVO).
|
||||
|
||||
#### Schwache IT-Sicherheit:
|
||||
- Gesundheitsdaten sind nicht ausreichend durch Passwörter oder ähnliche Schutzmaßnahmen gesichert. So kann es leicht zu unbefugtem Zugriff kommen – ein Verstoß gegen Art. 32 DSGVO.
|
||||
|
||||
#### Keine Zugriffsbeschränkungen:
|
||||
- Alle Mitarbeitenden können auf sämtliche Patientendaten zugreifen – egal, ob sie damit zu tun haben oder nicht. Das verletzt das „Need-to-know“-Prinzip (Art. 5 Abs. 1 lit. f DSGVO).
|
||||
|
||||
#### Daten nicht getrennt:
|
||||
- Patientendaten sind nicht klar voneinander getrennt gespeichert. So sehen z. B. Pflegekräfte Informationen, die für ihre Arbeit gar nicht relevant sind. Das widerspricht dem Prinzip der Zweckbindung und Vertraulichkeit.
|
||||
|
||||
---
|
||||
|
||||
### 8. Erarbeite ein Konzept, welches die technischen Voraussetzungen für die korrekte Umsetzung aller Gesetze stellt.
|
||||
Benenne dabei die konkreten Änderungen oder Erweiterungen, die in der Anwendung NHPlus zu realisieren sind.
|
||||
|
||||
#### Datenminimierung:
|
||||
- Anpassung des Datenmodells: Entfernung des Attributs "Vermögensstand" aus der Klasse Patient (siehe "IB MVP in JavaFX.docx" für die Klassenstruktur).
|
||||
- Datenbankänderung: Löschen der entsprechenden Spalte in der Tabelle für Patientendaten.
|
||||
- UI-Anpassung: Entfernung der Eingabe- und Anzeigefelder für den Vermögensstand in den Views zur Patientenverwaltung (siehe "IB User Stories.docx" und "AB 03 Userstories_Akzeptanzkriterien_Tasks_Testfälle.docx" für die Views).
|
||||
|
||||
#### Datensicherheit - Passwortschutz
|
||||
- Implementierung von Passwort-Hashing: Verwendung einer sicheren Hashing-Funktion (z.B., bcrypt oder Argon2) zur Speicherung von Passwörtern in der Datenbank.
|
||||
- Passwortrichtlinien: Erzwingung von Mindestanforderungen an Passwörter (z.B., Länge, Komplexität).
|
||||
- Sicherer Authentifizierungsmechanismus: Integration des Passwortschutzes in den Anmeldeprozess.
|
||||
#### Datensicherheit - Zugriffsschutz
|
||||
- Rollenbasierte Zugriffskontrolle (RBAC): Definition von Benutzerrollen (z.B., Arzt, Pflegekraft, Administrator) mit spezifischen Berechtigungen.
|
||||
- Zugriffskontrollmechanismus: Implementierung von Prüfungen in der Anwendungslogik, um den Zugriff auf Daten und Funktionen basierend auf der Benutzerrolle zu steuern.
|
||||
- UI-Anpassung: Filterung oder Ausblendung von Daten und Funktionen in der Benutzeroberfläche, basierend auf der Benutzerrolle.
|
||||
#### Zweckbindung und Datenintegrität - Datentrennung
|
||||
- Logische Datentrennung: Implementierung von Filtern oder Abfragen, um sicherzustellen, dass Pflegekräfte nur die Patientendaten sehen, die ihnen zugewiesen sind. Dies kann auf Datenbankebene oder in der Anwendungslogik erfolgen.
|
||||
- UI-Anpassung: Anzeige von Patientendaten in der Benutzeroberfläche basierend auf der Zuständigkeit der Pflegekraft.
|
||||
---
|
||||
####
|
||||
> > **Hinweis:** Nutze die anliegenden Informationen, insbesondere für die krankenhaus- und pflegebezogenen Regelungen und Gesetze.
|
||||
0
documentation/userstorys/.gitignore
vendored
Normal file
0
documentation/userstorys/.gitignore
vendored
Normal file
53
documentation/userstorys/fynn_sperrfrist.md
Normal file
53
documentation/userstorys/fynn_sperrfrist.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# **User Story**
|
||||
Ich bin Wohnbereichsleiter der Curanum Schwachhausen
|
||||
und würde mir wünschen, dass die Sperrfrist für Kundenbezogene Daten 10 Jahre beträgt.
|
||||
Diese Daten sollen bis zum Ablauf dieser Frist nicht gelöscht werden.
|
||||
Nach Ablauf der Frist können die Daten dann gelöscht werden.
|
||||
Der Grund für mein Anliegen ist, dass es einige Patienten gab die sich
|
||||
erkundigt haben was mit ihren Daten passiert, nachdem der Zweck für den die Daten angefordert wurden erfüllt wurde.
|
||||
Des Weiteren gibt es gesetzliche Regelungen, die es einzuhalten gilt.
|
||||
|
||||
|
||||
---
|
||||
|
||||
# **Akzeptanzkriterien:**
|
||||
|
||||
- **A_1**: Sperrung statt Löschung der Daten
|
||||
- **A_2**: Gesicherter Zugang zu den Daten
|
||||
- **A_3**: Endgültige Löschung der Daten nach Ablauf der Sperrfrist (10 Jahre)
|
||||
- **A_4**: Benachrichtigen der Patienten zur Löschung der Daten
|
||||
|
||||
|
||||
---
|
||||
|
||||
# **Tasks**
|
||||
|
||||
- **T_1**: Sperrung der Patientendaten durch Button
|
||||
- **T_2**: Geischerter Login zur sicheren Aufbewahrung der Daten
|
||||
- **T_3**: Automatisiertes Löschen der Daten nach Ablauf der Sperrfrist (10 Jahre)
|
||||
- **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
|
||||
|
||||
|
||||
---
|
||||
|
||||
# **Testfälle**
|
||||
|
||||
**TF_1**: Sperren der Daten
|
||||
- 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 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
|
||||
@@ -0,0 +1,52 @@
|
||||
# **User Story**
|
||||
|
||||
Moin, mein Name ist Udo und ich habe früher das Pflegeheim Curanum Schwachhausen von meinem Vater übernommen und inzwischen leite ich vier Pflegeeinrichtungen in Bremen.
|
||||
Nach einem verlorenen Gerichtsprozess wegen unzureichender Pflegedokumentation ist mir bewusst geworden,
|
||||
wie wichtig rechtssichere und datenschutzkonforme Prozesse sind.
|
||||
Deshalb möchte ich den Vermögensstand vollständig aus unserer Anwendung entfernen lassen,
|
||||
damit keine unnötigen sensiblen Daten gespeichert werden und wir künftige rechtliche Risiken vermeiden.
|
||||
|
||||
---
|
||||
|
||||
# **Akzeptanzkriterien:**
|
||||
|
||||
- **A_1:**
|
||||
In der UI darf kein Eingabefeld oder Anzeigeelement für den Vermögensstand mehr vorhanden sein
|
||||
|
||||
- **A_2:**
|
||||
In der Datenbank darf das Feld für Vermögensstand nicht mehr verwendet werden
|
||||
|
||||
- **A_3:**
|
||||
Alte Daten müssen vollständig entfernt wird
|
||||
---
|
||||
|
||||
# **Tasks**
|
||||
|
||||
- **T_1:**
|
||||
Entferne das Eingabefeld „Vermögensstand“ aus den Formularen in der GUI (z. B. AllPatientView.fxml)
|
||||
|
||||
- **T_2:**
|
||||
Entferne die Datenbankspalte oder setze sie auf inaktiv in AllPatientController, PatientDAO und auch aus dem Patient model
|
||||
|
||||
- **T_3:**
|
||||
Führe ein einmaliges Migrationsskript aus, das vorhandene Vermögensdaten aus der Datenbank entfernt
|
||||
|
||||
- **T_4:**
|
||||
Prüfe, ob Schnittstellen (z. B. zu Rechnungsmodulen) vom Entfernen betroffen sind und passe ggf. an
|
||||
---
|
||||
|
||||
# **Testfälle**
|
||||
|
||||
- **TF_1:**
|
||||
Vorbedingung: Applikation gestartet
|
||||
auszuführende Testschritte: - Eingabemaske für Patienten öffnen
|
||||
erwartetes Ergebnis: Kein Feld für Vermögensstand sichtbar
|
||||
- **TF_2:**
|
||||
Vorbedingung: Zugriff auf Patientendatenbank
|
||||
auszuführende Testschritte: - Abfrage auf Spalte „Vermögensstand“ starten
|
||||
erwartetes Ergebnis: Spalte existiert nicht mehr oder enthält nur NULL-Werte
|
||||
- **TF3_:**
|
||||
Vorbedingung: Alte Patientendaten mit Vermögensstand waren gespeichert
|
||||
auszuführende Testschritte: - Migration ausführen und Daten prüfen
|
||||
erwartetes Ergebnis: Vermögensstand ist aus allen Datensätzen entfernt
|
||||
|
||||
67
documentation/userstorys/saad_erweiterung_im_pfleger_3_4.md
Normal file
67
documentation/userstorys/saad_erweiterung_im_pfleger_3_4.md
Normal 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.
|
||||
|
||||
|
||||
38
documentation/userstorys/userstory_brunhilde.md
Normal file
38
documentation/userstorys/userstory_brunhilde.md
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
### User-Story
|
||||
- Ich bin eine Bewohnerin des Pflegeheimes.
|
||||
- Ich bin 69
|
||||
- Mir ist wichtig, dass nicht jeder an meine Daten kommt
|
||||
|
||||
Moin ich bin die Brunhilde und mir ist wichtig, dass nicht jeder meine Daten sieht. Maria pflegt mich und nicht Markus. Daher muss Markus auch nicht wissen, dass ich Probleme mit dem Toilettengang habe. Konkret möchte ich, dass ich im System Maria zugeordnet werde und Maria sich anmeldet und meine Daten sieht.
|
||||
### Akzeptanzkriterien
|
||||
- Ich kann Maria zugeordnet werden
|
||||
- Maria kann meine Daten sehen
|
||||
- Andere Leute als Maria können meine Daten nicht sehen
|
||||
|
||||
### Tasks
|
||||
- Es soll eine verschlüsselte Datenbank der Logindaten der Pfleger geben
|
||||
- Dafür soll es eine DAO als einzige Verbindung geben
|
||||
- Die Klasse Pfleger soll Zuordnungen der Klasse Patient speichern können
|
||||
- Die Hauptanwendung muss in einen Login-Bildschirm starten
|
||||
- Dieser Bildschirm soll
|
||||
- Diese Zuordnungen sollen auch in einer Datenbank gespeichert werden
|
||||
- Dafür soll es eine DAO als einzige Verbindung geben
|
||||
- Nur zugeordnete Pfleger sollen die Daten eines Patienten ansehen können
|
||||
- Die Klasse Admin muss implementiert werden und muss mindestens Patienten Pflegern zuordnen können
|
||||
### Testfälle
|
||||
- TF1
|
||||
- Der Pfleger hat ein Endgerät und das Programm
|
||||
- Der Pfleger öffnet das Programm
|
||||
- Ein Anmeldebildschirm wird gezeigt
|
||||
|
||||
- TF2
|
||||
- Der Pfleger hat den Anmeldebildschirm offen
|
||||
- Der Pfleger gibt seine korrekten Daten ein und loggt sich ein
|
||||
- Der Pfleger sieht nur ihm zugeordneten Patienten
|
||||
|
||||
- TF3
|
||||
- Der Admin hat sich angemeldet und Patient A ist niemandem zugeordnet
|
||||
- Er ordnet Patient A Pfleger B zu
|
||||
- Wenn Pfleger B sich einloggt, sieht er die Daten von Patient A
|
||||
- Wenn sich Pfleger A einloggt, sieht er nicht die Daten von Patient A
|
||||
21
documentation/userstorys/userstory_template.md
Normal file
21
documentation/userstorys/userstory_template.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# **User Story**
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# **Akzeptanzkriterien:**
|
||||
|
||||
- **A_1:**
|
||||
|
||||
---
|
||||
|
||||
# **Tasks**
|
||||
|
||||
- **T_1:**
|
||||
|
||||
---
|
||||
|
||||
# **Testfälle**
|
||||
|
||||
TF_1:
|
||||
109
documentation/userstorys/wim_erweiterung_im_pfleger_1_2.md
Normal file
109
documentation/userstorys/wim_erweiterung_im_pfleger_1_2.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# **User Story**
|
||||
|
||||
**Mein Name ist Maria,**
|
||||
**als** überlastete Pflegerin mit wenig IT-Affinität,
|
||||
**möchte ich** in der Navigationsleiste der Anwendung eine Übersicht aller Pflegerinnen und Pfleger aufrufen können sowie bei jeder Behandlung sehen, wer diese durchgeführt hat,
|
||||
**damit** ich trotz Zeitdruck schnell die zuständige Person identifizieren und direkt telefonisch kontaktieren kann, um Rückfragen zu klären oder Übergaben abzustimmen, ohne lange suchen oder tippen zu müssen.
|
||||
|
||||
---
|
||||
|
||||
# **Akzeptanzkriterien:**
|
||||
|
||||
- **A_1:** In der Navigationsleiste gibt es einen neuen Button „Pflegekräfte“, der zu einer Ansicht aller Pfleger/innen führt
|
||||
- **A_2:** Die Ansicht zeigt alle Pflegekräfte mit:
|
||||
- ID
|
||||
- Nachname
|
||||
- Vorname
|
||||
- Telefonnummer
|
||||
|
||||
- **A_3:** Bei der Anzeige einer einzelnen Behandlung (Behandlungsdetailansicht) wird zusätzlich angezeigt:
|
||||
- Der Name der Pflegekraft (Format: **Nachname, Vorname**)
|
||||
- Die zugehörige Telefonnummer
|
||||
|
||||
- **A_4:** Die Daten stimmen mit dem bestehenden Pflegedatensatz überein.
|
||||
|
||||
---
|
||||
|
||||
# **Tasks**
|
||||
|
||||
- **T_1:** Navigationsleiste um Button **„Pflegekräfte“** erweitern
|
||||
|
||||
- **T_2:** Button der zur **AllCaregiverView.fxml**-Ansicht führt.
|
||||
|
||||
- **T_3:** Behandlung Einzelansicht um Labels für Pflegekraft Name und -telefonnummer ergänzen
|
||||
|
||||
- **T_4:** Im `TreatmentController` Pflegekraft Daten aus Datenbank laden
|
||||
|
||||
- **T_5:** Sicherstellen, dass `Treatment`-Objekte die Pflegekraft-ID enthalten
|
||||
|
||||
- **T_6:** SQL-`JOIN` oder DTO einführen, um Pflegekraft Daten direkt mitzuladen
|
||||
|
||||
- **T_7:** Fehlerbehandlung für ungültige oder fehlende Pflegekraft Zuweisungen
|
||||
|
||||
- **T_8:** Darstellung & Formatierung der Pflegekraft Daten in der UI
|
||||
|
||||
- **T_9:** Bestehende Tests erweitern / neue Tests für neue UI-Komponenten schreiben
|
||||
|
||||
---
|
||||
|
||||
# **Testfälle**
|
||||
|
||||
TF_1: Navigation zur Pflegekräfte-Übersicht
|
||||
|
||||
- **Vorbedingung:** Anwendung ist gestartet, Benutzer ist eingeloggt.
|
||||
- **Testschritte:**
|
||||
1. Klicke auf „Pflegekräfte“ in der linken Navigationsleiste.
|
||||
- **Erwartet:** `AllCaregiverView.fxml` wird geladen, eine Tabelle mit Pflegekräften wird angezeigt.
|
||||
|
||||
TF_2: Pflegekraft Daten in Übersicht
|
||||
|
||||
- **Vorbedingung:** Die Pflegekräfte Ansicht (`AllCaregiverView.fxml`) ist geöffnet.
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Überprüfe die Tabelle visuell oder per Testautomatisierung.
|
||||
- **Erwartetes Ergebnis:** Jede Zeile zeigt:
|
||||
- Eine ID
|
||||
- Nachname
|
||||
- Vorname
|
||||
- Telefonnummer
|
||||
|
||||
Die Daten sind deckungsgleich mit den Daten in der Datenbank.
|
||||
|
||||
TF_3: Pflegekraft in Behandlungsdetails sichtbar
|
||||
|
||||
- **Vorbedingung:** Eine Behandlung ist vorhanden, der eine Pflegekraft zugewiesen wurde.
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Öffne die Detailansicht der Behandlung.
|
||||
- **Erwartetes Ergebnis:** Es werden zwei Labels angezeigt:
|
||||
- Pflegekraft Name im Format: „Nachname, Vorname“
|
||||
- Telefonnummer der Pflegekraft
|
||||
|
||||
TF_4: Behandlung ohne Pflegekraft zeigt Hinweis
|
||||
|
||||
- **Vorbedingung:** Eine Behandlung ohne zugeordnete Pflegekraft ist vorhanden.
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Öffne die Detailansicht dieser Behandlung.
|
||||
- **Erwartetes Ergebnis:**
|
||||
- Im Label für den Pflegernamen steht: „Keine Pflegekraft zugeordnet“
|
||||
- Im Telefonnummer-Label steht: „–“ oder ist ausgeblendet
|
||||
|
||||
TF_5: Format des Namens korrekt
|
||||
|
||||
- **Vorbedingung:** Eine Pflegekraft mit Nachname „Müller“ und Vorname „Anna“ ist zugewiesen.
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Öffne die Behandlungsdetailansicht.
|
||||
- **Erwartetes Ergebnis:** Im Label steht exakt: `Müller, Anna`
|
||||
|
||||
TF_6: Telefonnummer formatiert
|
||||
|
||||
- **Vorbedingung:** Pflegekraft ist zugewiesen und besitzt eine Telefonnummer.
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Öffne Behandlungsdetailansicht
|
||||
- **Erwartetes Ergebnis:** Telefonnummer ist korrekt formatiert (z.B. `+49 123 4567890`)
|
||||
|
||||
TF_7: Fehlerhafte Zuordnung wird abgefangen
|
||||
|
||||
- **Vorbedingung:** Es existiert eine Behandlung mit einer verwaisten Pflegekraft-ID (z.B. gelöscht).
|
||||
- **Auszuführende Testschritte:**
|
||||
1. Öffne die Behandlung Detailansicht
|
||||
- **Erwartetes Ergebnis:**
|
||||
- Die Pflegekraft-Labels zeigen „Keine Pflegekraft zugeordnet“
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
110
src/main/java/de/hitec/nhplus/datastorage/LockedPatientDao.java
Normal file
110
src/main/java/de/hitec/nhplus/datastorage/LockedPatientDao.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
123
src/main/java/de/hitec/nhplus/model/LockedPatient.java
Normal file
123
src/main/java/de/hitec/nhplus/model/LockedPatient.java
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package de.hitec.nhplus.utils;
|
||||
|
||||
public class CheckBeforeStart {
|
||||
|
||||
public void checkExpiredPatient () {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -77,4 +77,4 @@
|
||||
<padding>
|
||||
<Insets top="10.0" />
|
||||
</padding>
|
||||
</AnchorPane>
|
||||
</AnchorPane>
|
||||
|
||||
73
src/main/resources/de/hitec/nhplus/LockedPatientView.fxml
Normal file
73
src/main/resources/de/hitec/nhplus/LockedPatientView.fxml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user