Spis treści

Gabinet dentystyczny - usuwanie pacjentów i wizyt

Nadszedł czas na implementację usuwania pacjentów oraz wizyt.

Usuwanie nie będzie tak naprawdę usuwaniem, lecz ukrywaniem - dodatkowa, boolowska kolumna deleted w tabelach patient oraz visit będzie flagą oznaczającą “usunięty” rekord w bazie. Dzięki temu omyłkowe usunięcie będzie “odwracalne”.

Zmiany w SQL

Zmiana schematu bazy

Konieczna będzie mała zmiana schematu: każdaą encję poszerzam o pole deleted:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
create table if not exists patient (
  id integer primary key,
  name string not null,
  surname string not null,
  birthdate date not null,
  note_id integer,
  deleted boolean default false,
  foreign key(note_id) references note(id) 
);

create table if not exists note (
  id integer primary key,
  deleted boolean default false,
  text string not null
);

create table if not exists visit (
  id integer primary key,
  vdatetime datetime not null default CURRENT_TIMESTAMP,
  patient_id integer not null,
  note_id integer,
  deleted boolean default false,
  foreign key(patient_id) references patient(id),
  foreign key(note_id) references note(id)
);

Zmiana zapytań pobierających pacjentów

Zapytanie o listę pacjentów uwzględnia tylko te wiersze, dla których deleted=false:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
select 
  p.id, p.name, p.surname, p.birthdate, n.id, n.text 
from 
  patient p 
left join 
  note n 
on 
  p.note_id = n.id 
where 
  p.id=? and p.deleted=false

Podobnie będzie z listą wizyt: wyświetlam jedynie nieusunięte wiersze nieusuniętych pacjentów:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
select 
  v.id, v.vdatetime, v.patient_id, v.note_id, n.text, p.name, p.surname 
from 
  visit v 
left join 
  note n 
on 
  v.note_id=n.id 
left join 
  patient p 
on 
  v.patient_id=p.id
where 
  (v.deleted = false) and (p.deleted = false)

Przy małym rozmiarze bazy i założonym przypadku użycia (hipotetyczny stomatolog obsługuje regulanie grupę kilkudziesięciu bądź nawet kilkuset pacjentów) nie będzie to znacząco wpływało na wydajność czy rozmiar pliku z bazą SQLite. Baza będzie więc add-only.

Interfejs użytkownika na razie nie daje możliwości przywrócenia usuniętych (ukrytych) wierszy, ale to w przyszłości może się zmienić.

Screenshoty

Usuwanie wizyty

W każdym wierszu tabeli dodałam przycisk usuwania, który w html-u jest częścią formularza generującego żądanie POST do endpointu (dla wizyty nr 5) /visits/5/delete:

Przed usunięciem wizyty

Po usunięciu wizyty

Na liście wizyt nie pojawia się usunięta wizyta:

Usunięta wizyta nie jest widoczna

Usuwanie pacjenta

Podobnie jest z usuwaniem pacjenta.

Usuwanie pacjenta

Widok pacjentów po usunięciu pacjenta

Widok pacjentów bez widocznego usuniętego pacjenta

Widok wizyt

Usunięcie pacjenta skutkuje oczywiście “zniknięciem” przypisanych do niego wizyt w widoku wizyt:

Widok wizyt bez widocznych wizyt usuniętego pacjenta

Inne zmiany

Do programu dodałam też favicon (moduł github.com/thinkerou/favicon), co wymagało dodania jednego wiersza kodu:

1
r.Use(favicon.New("assets/favicon.ico"))

A także - w templejcie header.tmpl - odnośnik do fontawesome:

1
 <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>