Uprawnienia do dokumentów
Założenia ogólne:
Temat dotyczy dostępu do dokumentów w zakresie odczytu i edycji i zmiany statusu danych.
Dotyczy wszystkich dokumentów zapisanych w bazie dokumentów w systemie (nie mylić z uprawnieniami do wykonywania raportów).
Uprawnienia dotyczą całych dokumentów (odczyt i edycja), lub ich fragmentów (edycja) wydzielonych konkretnymi grupami pól. Oddzielnie definiujemy uprawnienia do działań na poszczególnych etapach edycji.
Uprawnienia można definiować na dwa sposoby - uproszczony i zaawansowany. Uprawnienia uproszczone: Uprawnienia ogólne:
Uprawnienia określamy w postaci stringów zawierających listę wymaganych uprawnień.
Testowanie, czy aktualnie zalogowany użytkownik posiada wskazane uprawnienie odbywa się w metodzie (Delphi i skrypty):
TfmCustomBLForm.ChkDocRights(ARights : string):boolean;virtual;
Gdzie ARights określa listę wymaganych uprawnień. Wystarczy posiadać choć jedno z nich, by warunek był spełniony.
Funkcja jest nadpisywana w różnych formularzach Delphi tak, że dany dokument może być edytowany/odczytywany w ramach jednego formularza, a nie innego.
Uprawnienia do odczytu i edycji określamy w postaci oddzielnych stringów. Lista uprawnień stosowanych w pobytach:
Uprawnienia są sprawdzane przez funkcję odziedziczoną w formularzu pobytów z funkcji:
Function TfmCustomBLForm.ChkRights(ARights : string):boolean;virtual;
Obecnie system rozpoznanie następujące uprawnienia:
Uprawnienia dostępne we wszystkich formularzach:
Upr(id_Uprawnienia) - uprawnienie ogólne systemu – id_uprawnienia oznacza identyfikator
uprawnienia ogólnego
Grp(idx_grupy_prac) - przynależność do grupy pracowników przedstawianej jako identyfikator grupy;
GrpN(Nazwa_grupy) - przynależność do grupy pracowników przedstawianej jako nazwa grupy;
bdView
- testuje, czy zalogowany może odczytywać wynik
usługi. Odczytać usługę wolno, gdy ma się choć jedno:
- usługa ma status = X i ma się prawo do odczytu zgodnie ze stopniem poufności
usługi (określonym w definicji usługi)
- otwieramy ją nad formularzem badania
i jest to to samo badanie, które jest
otwarte w tym formularzu
bdEdit - testuje, czy zalogowany może edytować jakąkolwiek usługę w badaniu,
którego dotyczy dokument (z uwzględnieniem statusu usługi)
bdEditUsl(AIdx_uslugi) -testuje, czy zalogowany może edytować wskazaną usługę w badaniu, którego
dotyczy dokument (z uwzględnieniem statusu usługi)
UWAGA: Powyższe uprawnienia już działają, ale nie są jeszcze obsługiwane w edytorze uprawnień (jednak mogą być już skutecznie stosowane)
Uprawnienia dostępne w formularzu pobytu:
pbEdMed - uprawnienia edycji części medycznej zgodnie w uprawnieniem Edycja
części medycznej w definicji oddziału
pbEdPiel - uprawnienia edycji części medycznej zgodnie w uprawnieniem Edycja
części pielęgniarskiej w definicji oddziału
pbLekProw - jest lekarzem prowadzącym pacjenta
pbLekNadz - jest lekarzem nadzorującym
pbLekMozeProw - może być lekarzem prowadzącym
pbLekMozeNadz - może być lekarzem nadzorującym
pbLekMozePrzyjm - może być lekarzem przyjmującym na oddział
pbLekMozeWypis - może wypisywać pacjenta
pbLekMozeTylkoDyzurny - może być tylko lekarzem dyżurnym
pbLekMozePrzekaz - może przekazywać pacjenta
pbLekMozePotwPrzyj - może potwierdzać przyjęcie
pbLekMozeCofacWypis - może cofać wypis
pbLekMozeCofacPotw - może cofać potwierdzenie przyjęcia
pbLekMozeEdRapPrzyj - może edytować raport przyjęć
pbLekMozeEdListeOczek - może edytować listę oczekujących
pbStan(NAZWA_STANOWISKA) – pracuje na stanowisku o nazwie: NAZWA_STANOWISKA
Jeśli pracownik spełnia choć jeden warunek, to ma prawo odczytu/edycji dokumentu, lub zakładki. Uprawnienia zaawansowane:
Uprawnienia zaawansowane są podawane w postaci wyrażenia FastScriptu poprzedzonego znakiem „=”. Dają one większe możliwości.
W celu symulowania wymienionych powyżej stałych można stosować funkcje: function Upr(AId_upr : integer) : boolean
Testuje, czy zalogowany użytkownik posiada wskazane uprawnienie function UprFm(AUpr : string; AArg: string = ‘’) : boolean
Testuje, czy zalogowany użytkownik posiada wskazane uprawnienie typowe dla formularza - np.: pbEdMed, pbLekProw. W zasadzie działa funkcji sprowadza się do sprawdzenia uprawnienia uproszczonego opisanego powyżej, czyli ważne jest też wywołanie:
= UprFm(‘Upr’, ‘123’)
AArg oznacza dodatkowy argument i zwykle może by pominięte, wówczas oznacza ‘’.
UWAGA: Funkcja zwraca sensowne wyniki jedynie w sytuacji wywoływania w wyrażeniu sprawdzania uprawnień (w definicji pól i dokumentów) function Grp(AId_grp : integer) : boolean
Testuje, czy zalogowany użytkownik należy do grupy pracowników o podanym idx function GrpN(AGrp : string) : boolean
Testuje, czy zalogowany użytkownik należy do grupy pracowników o podanej nazwie
function bdEdit : boolean
Testuje, czy zalogowany może edytować jakąkolwiek usługę w badaniu, którego dotyczy dokument (z uwzględnieniem statusu usługi) function bdEditUsl(AIdx_uslugi : integer) : boolean
Testuje, czy zalogowany może edytować wskazaną usługę w badaniu, którego dotyczy dokument (z uwzględnieniem statusu usługi)
-
czyli dopuszczalny ciąg to np.:
= (Upr(123) or Grp(10) or (Upr(120) and UprFm(‘pbLekProw’))) and not GrpN(‘Brzydale’)
Oczywiście wyrażenie może sięgać do różnych narzędzi np.:
=GrpN(‘Brzydale’) or (ParentForm.ClassName = 'TfmHosp') Implementacja sterowania uprawnieniami:
System dopuszcza obecnie dwa sposoby sterownia uprawnieniami:
- Tradycyjny oparty na uprawnieniach do zakładek dla WPEdit i wstęg dla FastReport. System zabezpiecza dane w momencie otwierania i generowania kart. Reszta odbywa się ręcznie z poziomu skryptu.
- Nowy – oparty na uprawnieniach dotyczących grup pól z uwzględnieniem ich etapu edycji. W nowym systemie nadal można korzystać z funkcji zmieniających uprawnienia do zakładek/wstęg, ale nie jest to polecane.
Tradycyjny system jest ustawiany jako domyślny dla starych raportów.
Dla nowych domyślnie jest wybierany nowy system.
Dla danego dokumentu stosowany jest jeden z tych systemów (nie oba równocześnie) – chodzi o sposób zabezpieczania pól w momencie otwierania kart.
Stosowany system uprawnień wybieramy na etapie definicji pól dokumentu w polu: System uprawnień
Poniżej jest opisany nowy system zabezpieczania pól.
Podczas otwierania dokumentu (SelectDocument) :
- system sprawdza prawa do odczytu dokumentu i ewentualnie ukrywa dokument.
- Jeśli cały dokument nie spełnia uprawnień do edycji, to klawisz edycji nie jest dostępny. Przy otwieraniu do edycji po wykonaniu procedury (1.) sprawdza prawa do edycji poszczególnych pól. Jeśli brak uprawnień do edycji konkretnych pól, jest ono chronione.
Edycja jest dozwolona, jeśli zalogowany użytkownik posiada prawo edycji grupy pól do której pole należy na etapie edycji, na jakim to pole się znajduje.
- Po wykonaniu pkt. 1 i ew. 2 wywoływane jest zdarzenie skryptowe: TfrxWPContainer.OnOpenDocEvent(AFirstOpen : boolean; AEditing : boolean; var ErrorMessage : string)
AFirstOpen – czy jest to pierwsze otwarcie dokumentu do edycji od czasu wygenerowania. W rzeczywistości jest ustawione na True przy pierwszym OnOpenDocEvent po wykonaniu funkcji GenerateDocument.
AEditing – oznacza, czy dokument jest otwierany do edycji, czy odczytu. W przypadku kart innych, niż główna – zawsze przybiera wartość false.
ErrorMessage – można tu podać wiadomość, która zostanie zaprezentowana jako błąd.
W zdarzeniu tym można dodatkowo włączać, lub wyłączać ochronę zakładek (metoda ta nie jest obecnie zalecana; została zachowana z racji kompatybilności ze starymi raportami)
W zdarzeniu OnAppendEvent można dodać nowe fragmenty, które w momencie dodawania będą miały automatycznie włączaną odpowiednią protekcję (dotyczy to jedynie nowego systemu zabezpieczeń).
Reasumując system automatycznie, bazując na uprawnieniach użytkownika i wymaganych uprawnieniach pól włącza protekcję grup pól w następujących sytuacjach:
- Otwieranie nowej karty (protekcja jest uaktualniana dla całej otwieranej karty)
- Dodawania fragmentów dokumentu (protekcja jest uaktualniana dla całej otwartej karty)
- Zmianie statusu pól (protekcja jest uaktualniana dla wszystkich pól w całym dokumencie – we wszystkich kartach)
UWAGA: Obecnie nie jest polecane ręczne modyfikowanie protekcji pól/zakładek po wykonaniu tych operacji, choć odpowiednie funkcje ciągle są dostępne.
W dokumencie dane pole może występować kilkukrotnie z różnymi SID. Dla systemu uprawnień są one jednak nierozróżnialne – czyli jeśli mają one ten sam status, to system zastosuje dla nich taką sama protekcję. Tak więc jeśli te same pola z różnymi SID mają być/lub nie być edytowalne powinny być na innym etapie realizacji.
Z poziomu skryptów dostępna jest funkcja:
TfrxWPContainer .ChkDocRights(ARights : string):Boolean
Sprawdzająca, czy zalogowany użytkownik posiada choć jedno z uprawnień z listy ARights. Może ona być przydatna na etapie wywoływania zdarzenia: OnOpenDocEvent.