---
# System prepended metadata

title: 0. TODO

---

# 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).
