# 0. TODO
- [ ] widoki aplikacji (prezentowane dane i akcje)
- [x] implementacja każdej mikrousługi
- [x] lekarz
- [x] pacjent
- [x] recepty
- [x] leki
- [ ] implementacja "listuj recepty" + dokumentacja
- [ ] implementacja serializacji danych + usunąć komentarz w dokumentacji
- [ ] implementacja "aktualizuj bazę leków" lub aktualizacja dokumentacji
- [ ] screenshoty ze swaggera
- [ ] stworzyć XML z przykładowymi danymi dla mikrousługi danych
- [ ] stworzyć gramatykę XSD dla plików XML
- [ ] stworzyć skrypty uruchomieniowe bat/bash
- [ ] stworzyć skrypty curl testowania mikrousług
# 1. Encje
Związki między encjami zostały zaznaczone poprzez uwzględnienie obcych kluczy (id) na liście danych konkretnej encji. Nazwy pól klas we właściwej implementacji nie muszą pokrywać się dokładnie z zaproponowanymi w tej sekcji. Polskie nazyw zostały przyjęte dla zachowania spójności niniejszej dokumentacji.
## Lekarz
Dane:
- id_lekarza
- imię
- nazwisko
- pesel
- hasło
- specjalizacja
Operacje na encji:
- **dodaj lekarza** (dane wejściowe: imię, nazwisko, pesel, hasło, specjalizacja; dane wyjściowe: id_lekarza|Null)
- **autoryzuj lekarza** (dane wejściowe: pesel, hasło; dane wyjściowe: True|False)
- **usuń lekarza** (dane wejściowe: id_lekarza; dane wyjściowe: True|False)
- **listuj wystawione recepty** (dane wejściowe: id_lekarza; dane wyjściowe: lista id_recepty powiązanych z podanym id_lekarza)
## Pacjent
Dane:
- id_pacjenta
- imię
- nazwisko
- pesel
- hasło
- data urodzenia
- miejsce zamieszkania
Operacje na encji:
- **dodaj pacjenta** (dane wejściowe: imię, nazwisko, pesel, data urodzenia, miejsce zamieszkania; dane wyjściowe: True|False)
- **usuń pacjenta** (dane wejściowe: id_pacjenta; dane wyjściowe: True|False)
- **autoryzuj pacjenta** (dane wejściowe: pesel, hasło; dane wyjściowe: True|False)
- **listuj przypisane recepty** (dane wejściowe: id_pacjenta, dane wyjściowe: lista id_recepty powiązanych z danym id_pacjenta)
## Recepta
Dane:
- id_recepty
- id_lekarza
- id_pacjenta
- data wystawienia
- data zrealizowania
- lista id_leku
Operacje na encji:
- **dodaj receptę** (parametry wejściowe: id_lekarza, id_pacjenta, lista id_leków; parametry wyjściowe id_recepty|Null)
- **usuń receptę** (parametry wejściowe: id recepty, parametry wyjściowe True|False)
- **listuj recepty** TODO
Przy listowaniu recept każdy użytkownik systemu może je filtrować z poziomu API w obrębie swoich uprawnień po wybranym z parametrów:
- id_recepty
- status (czy zrealizowana?)
- data wystawienia
- data realizacji
## Lek
Dane:
- id_leku
- nazwa_leku
Operacje na encji:
- **aktualizuj bazę leków** (parametry wejściowe: Null; parametry wyjściowe: True|False)
Dane o lekach wczytywane są z [pliku CSV](https://rejestrymedyczne.ezdrowie.gov.pl/registry/rpl) udostępnionego przez Centrum e-Zdrowia.
# 2. Widoki
W poprzedniej sekcji wypisane zostały encje, ich dane i dokładne specyfikacje dostępnych operacji do wykonania na encjach.
Dalsza część:
- listuje role i operacje dostępne na danym poziomie uprawnień
- stanowi wstępny zarys dla końcowej aplikacji użytkownika
- przedstawia widoki użytkownika aplikacji
## Role
Wydzielono dwie **role** o różnym poziomie uprawnień: **lekarz** i **pacjent**. Uzyskanie uprawnień wymaga autoryzacji hasłem.
Operacje dostępne z perspektywy lekarza:
- dodaj lekarza
- usuń lekarza
- dodaj pacjenta
- usuń pacjenta
- listuj wystawione recepty
- dodaj receptę
- usuń receptę
- aktualizuj bazę leków
Operacje dostępne z perspektywy pacjenta:
- listuj recepty
- listuj przypisane recepty
## Aplikacje
Przewidujemy przygotowanie uniwersalnej aplikacji webowej dla każdego typu użytkownika.
Ponadto osobne aplikacje zostaną dostarczone dla lekarzy i dla pacjentów.
Dla lekarzy może zostać przygotowana aplikacja desktopowa.
Dla pacjentów może zostać przygotowana aplikacja mobilna na systemy Android.
## Widoki na przykładzie aplikacji webowej
Najważniejszą aplikacją końcową użytkownika jest uniwersalna aplikacja webowa, więc rozważyliśmy możliwe widoki dla tego rozwiązania.
1. Ekran logowania
2. Lista recept
3. Szczegóły recepty
4. Dodawanie recepty (tylko dla lekarza)
5. Panel CRUD dla encji pacjenta i encji lekarza
Dla lekarza widok _listy recept_ zawiera dodatkowe przyciski pozwalające na:
- dodawanie recepty
- aktualizację bazy leków
- przeście do panelu CRUD
Z każdego widoku można wrócić do domyślnego widoku _listy recept_.
### Scenariusze użycia
Perspektywa lekarza:
1. Zalogowanie się do aplikacji.
2. Wyświetlenie listy wystawionych ostatnio recept.
3. Dodanie nowego pacjenta do systemu.
4. Wystawienie nowej recepty dla pacjenta.
Perspektywa pacjenta:
1. Zalogowanie się do aplikacji.
2. Wyświetlenie listy przypisanych recept.
3. Przeszukanie listy recept po stanie realizacji.
4. Wyświetlenie szczegółów recepty.
5. Ponowne wyświetlenie pełnej listy przypisanych recept.
# 3. Mikrousługi
## Reprezentacja danych
Wszelkie dane (pacjentów, recept, lekarzy, leków) mikrousługi przesyłają między sobą w formacie JSON.
Poszczególne mikrousługi przechowują statyczne dane w formacie XML z gramatyką XSD.
(TODO, OPTIONAL)
Zaimplementowano serializację danych zapisanych w pamięci do statycznych plików XML, aby przechowywać zmiany w aplikacji.
## Wydzielone mikrousługi danych
Rozwiązanie zostało podzielone zgodnie z podziałem na encje.
- dane o lekarzach
- dane o pacjentach
- dane o receptach
- dane o lekach
## Operacje usługowe mikrousług danych
Poza operacjami dla encji wyspecyfikowanymi w punkcie pierwszym, określone zostały poeracje usługowe szczególne dla danej mikrousługi.
Dla mikrousługi danych o lekarzach:
- dodaj lekarza
- usuń lekarza
- **zwróć dane o lekarzu** (parametry wejściowe: id_lekarza; dane wyjściowe: imię, nazwisko i specjalizacja lekarza)
Dla mikrousługi danych o pacjentach:
- dodaj pacjenta
- usuń pacjenta
- **zwróć dane o pacjencie** (parametry wejściowe: id_pacjenta; dane wyjściowe: imię, nazwisko pacjenta)
Dla mikrousługi danych o receptach:
- dodaj receptę
- usuń receptę
- filtruj recepty
Dla mikrousługi danych o lekach:
- **zwróć dane o leku** (parametry wejściowe: id_leku; dane wyjściowe: nazwa leku)
TODO: screenshoty ze swaggera
## Mikrousługi aplikacyjne
### lekarz
- addPatient (wszystkie atrybuty)
- addMedicine (wszystkie atrybuty)
- addPrescription (wszystkie atrybuty)
- removePatient (id)
- removeMedicine (id)
- removePrescription (id)
- completePrescription (id)
- getPrescriptions
- getPrescriptionById (id)
- getPrescriptionByPatientId (id)
- getPatients
- getPatientById (id)
- getMedicine
- getMedicineById (id)
### pacjent
- getPrescriptions
- getPrescriptionById (id)
# 4. Implementacja
Implementacja dostępna jest w repozytorium pod adresem: [link](https://gitlab-stud.elka.pw.edu.pl/kpaluch/uaim_proj_jg_kp_sw_ww).