\documentclass{sprz}

\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{graphicx}  
\usepackage{multirow}  
\usepackage{tabularx}  
\usepackage{enumitem} 
\usepackage{colortbl}  
\usepackage{array}     
\newcommand{\uwaga}[1]{\textcolor{red}{\textbf{#1}}}
\usepackage{placeins}

\begin{document}
	\pagestyle{empty} 
	\sffamily
	\renewcommand{\arraystretch}{1.4}
	\noindent
	\begin{tabularx}{\textwidth}{|X|m{2.5cm}|c|}
		\hline
		
		\textbf{\footnotesize Numer zlecenia oraz nazwa i akronim projektu:} \newline
		\textbf{Archivium} 
		& 
		\textbf{\footnotesize Zleceniodawca: PJATK} 
		& 
		\textbf{\footnotesize Zleceniobiorca:} \\ 
		
		\cline{1-2}
		
		\begin{minipage}[t]{\linewidth}
			\textbf{\footnotesize Zespół projektowy:}
			\begin{itemize}[nosep, leftmargin=1em, label=$\bullet$]
				\item Oleksii Sumrii
				\item Krzysztof Cieślik
				\item Robert Elwart
				\item Szymon Stefański
				\item Mateusz Falkowski
			\end{itemize} 
			\vspace{0.2cm} 
		\end{minipage}
		& 
		
		% Komórka Kierownika
		\begin{minipage}[t]{\linewidth}
			\textbf{\footnotesize Kierownik projektu:} \newline
			Krzysztof Cieślik
			\vspace{2cm} 
		\end{minipage}
		& 
		
		\multirow{-2}{*}{\centering\includegraphics[width=5cm, keepaspectratio]{sprz/logoPjatk.png}} 
		
		\\ \hline
		
		\textbf{\footnotesize Nazwa dokumentu:} \newline
		\textit{Specyfikacji Wymagań Systemowych} 
		& 
		\textbf{\footnotesize Odpowiedzialny za dokument:} \newline
		\textit{Zespół projektowy} 
		& 
		\textbf{\footnotesize Opiekun projektu:} \newline
		Tadeusz Puźniakowski \\ \hline
		
	\end{tabularx}
	\newline
	\begin{table}[h!]
		\centering
		\begin{tabular}{|l|p{0.3\textwidth}|l|l|l|}
			\hline
			\textbf{Wersja} & \textbf{Opis modyfikacji} & \textbf{Rozdział} & \textbf{Autor} & \textbf{Data} \\ \hline
			v1 & Wersja wstępna & całość & Oleksii Sumrii & 12/11/2025 \\ \hline
			v2 & Wersja wstępna & całość & Mateusz Falkowski & 12/11/2025 \\ \hline
			v3 & Wersja wstępna & całość & Oleksii Sumrii & 05/01/2025 \\ \hline
			v4 & Wersja wstępna & całość & Krzysztof Cieślik & 20/01/2026 \\ \hline
			v5 & Wersja wstępna & całość & Szymon Stefański & 25/01/2026 \\ \hline
		\end{tabular}
	\end{table}
	
	\uwaga{Do promotora:
		- Formatowanie,fonty itd dokumentu nie zostało tutaj wykonane w poprawny sposób ponieważ i tak planujemy przeniesienie tego na LaTeX.}
		
		\uwaga{uwagi, przyszłe zmiany będą w tym kolorze.}
	
	
	\chapter{Wprowadzenie – o dokumencie}
	
	\section{Cel dokumentu}
	Celem niniejszego dokumentu jest zdefiniowanie i usystematyzowanie wymagań funkcjonalnych, pozafunkcjonalnych oraz środowiskowych dla systemu Archivium. 
	Dokument powstał na podstawie badania ankietowego, opracowanych person i analizy rozwiązań konkurencyjnych.
	
	\section{Zakres dokumentu}
	Dokument obejmuje analizę potrzeb użytkowników, określenie wymagań funkcjonalnych i pozafunkcjonalnych oraz założeń architektonicznych.
	\newline
	Dokument opiera się na wstępnej analizie dokonanej w dokumencie DZW oraz przeprowadzonej ankiecie i wytworzonych personach oraz wytworzonym rich picture.
	
	\uwaga{tu pojawi się jeszcze jeśli się uda Burza mózgów}
	\uwaga{
	Metoda polegająca na zbieraniu pomysłów od uczestników spotkania. Żaden pomysł nie może być krytykowany ani negowany podczas panelu. Na koniec należy wybrać najlepsze propozycje i je poddać dalszej analizie. 
	}
	
	\uwaga{
	i Grupy focusowe
	(
	Metoda przydatna do pozyskiwania danych jakościowych, polegająca na zaproszeniu wybranej grupy uczestników i przeprowadzeniu z nimi moderowanej dyskusji na konkretny temat.}
	
	\uwaga{
	W planach jest próba spotkania się z zarządem organizacji hackerspace pomorze która mogłaby używać tego programu i z kilkoma osobami które mają zawodowe doświadczenie w tworzeniu dokumentacji projektowej.
	Wtedy też pojawi się dodatkowy udziałowiec
	)}
	\newpage
	\section{Rich Picture}
	\begin{figure}[h!]
		\centering
		\includegraphics[width=1.27\textwidth, angle=90]{sprz/richPicture}
		\label{png:richPicture}
	\end{figure}
	\newpage
	
	\section{Dokumenty powiązane}
	\begin{itemize}
		\item Karta\_projektu-Gr73c(SCESF)-v0\_Archivium
		\item DZW-Gr73c(SCESF)-v0\_Archivium
		\item IEC 82079-1
		\item Art. 54-60 (RODO)
		\item PRZ1 proj\_dyp
		\item Zasady redagowania instrukcji
	\end{itemize}
	
	\section{Odbiorcy}
	Zespół projektowy, zleceniodawca i opiekun projektu.
	
	\section{Słownik pojęć}
	\begin{description}
		\item \textbf{SQLCipher} - Rozszerzenie SQLite umożliwiające szyfrowanie bazy danych za pomocą algorytmu AES-256.
		\item \textbf{OCR (Optical Character Recognition)} - technologia rozpoznawania tekstu z obrazów lub skanów dokumentów
		\item \textbf {Użytkownik końcowy} - Osoba korzystająca z systemu do zarządzania swoimi dokumentami.
		\item \textbf{DZW} - Dokument Założeń Wstępnych.
		\item \textbf{Wyszukiwanie semantyczne} - Metoda przeszukiwania bazy danych, która rozumie intencję użytkownika i kontekst zapytania.
		\item \textbf{LLM (Large Language Model)} - Rodzaj sztucznej inteligencji wyszkolonej na ogromnych zbiorach danych, zdolny do generowania tekstu, streszczania dokumentów i odpowiadania na pytania w języku naturalnym.
		\item \textbf{RWD (Responsive Web Design)} - Interfejs dopasowywujący się do wielkości ekranu.
		\item \textbf{WCAG (Web Content Accessibility Guidelines)} - Standardy dostępności dla osób z niepełnosprawnościami.
	\end{description}
	
	\chapter{Projekt w kontekście}
	
	\section{Kontekst biznesowy}
	Program ma dostarczać funkcjonalności potrzebne do pracy z dokumentami tekstowymi z dodatkowymi funkcjonalnościami których nie posiada konkurencyjne oprogramowania szczególnie open source takimi jak wersjonowanie dokumentów, automatyczne szyfrowanie.
	
	\section{Udziałowcy}
	\begin{itemize}
		\item \textbf{Użytkownicy indywidualni} – osoby korzystające z aplikacji w celach osobistych lub zawodowych, które potrzebują prostego narzędzia do tworzenia, edytowania i organizowania własnych dokumentów.
		\item \textbf{Firmy i organizacje} – klienci instytucjonalni wykorzystujący aplikację do zarządzania dokumentacją wewnętrzną i archiwizowania projektów.
		\item \textbf{Zespół programistyczny} - odpowiedzialny za tworzenie i rozwijanie funkcjonalności aplikacji.
		\item \textbf{Infrastruktura techniczna} - docelowy komputer osobisty na którym będzie działać oprogramowanie.
		\newline
		(udziałowiec nieożywiony).
	\end{itemize}
	
	\FloatBarrier
	
	\begin{stakeholder}[label={stk:utk01}, caption={Użytkownicy indywidualni}]
		\id{UTK 01}
		\name{Użytkownicy indywidualni}
		\descr{Są to osoby fizyczne wykorzystujące aplikację do celów osobistych. W strukturze projektu są określani jako klienci zewnętrzni, którzy potrzebują wygodnego narzędzia do organizowania dokumentów.}
		\type{Ożywiony}
		\viewpoint{Użytkownik końcowy. Interesuje go przede wszystkim warstwa użytkowa i funkcjonalność aplikacji, a nie jej wewnętrzna architektura.}
		\limitations{Wiedza techniczna, korzystanie z urządzeń o różnych parametrach.
			Korzystają z urządzeń o różnych parametrach sprzętowych.}
		\requ{NF01, NF03, NF02, ŚD01, W04, Wszystkie Wymagania Funkcjonalne}
	\end{stakeholder}
	
	\FloatBarrier
	
	\begin{stakeholder}[label={stk:utk02}, caption={Firmy i organizacje}]
		\id{UTK 02}
		\name{Firmy i organizacje}
		\descr{Instytucje wdrażające aplikację jako autonomiczne oprogramowanie desktopowe/lokalne dla poszczególnych użytkowników, pozbawione centralnej administracji serwerowej w procesie użytkowania.}
		\type{Ożywiony}
		\viewpoint{Użytkownik końcowy}
		\limitations{Ograniczone możliwości zdalnego wsparcia technicznego wynikające z braku centralnego panelu administracyjnego.
			Samodzielna instalacja i aktualizacja oprogramowania na rozproszonych stanowiskach pracy.
			\newline
			Praca w środowisku lokalnym bez dostępu do centralnej bazy danych.
			Konieczność zapewnienia bezpieczeństwa danych na poziomie stacji roboczej (zgodnie z polityką organizacji).}
		\requ{NF01, NF03, ŚD01}
	\end{stakeholder}
	
	\FloatBarrier
	
	\begin{stakeholder}[label={stk:utk03}, caption={Zespół programistyczny}]
		\id{ZPR 01}
		\name{Zespół programistyczny}
		\descr{Pięcioosobowy zespół odpowiedzialny za projektowanie, implementację, testowanie oraz dokumentację systemu.}
		\type{Ożywiony}
		\viewpoint{Twórca systemu}
		\limitations{
		\begin{itemize}
			\item \textbf{Zasoby i harmonogram:} - Sztywny budżet projektu wynoszący 250 PLN oraz konieczność ukończenia prac w ciągu 10 miesięcy.
			\item \textbf{Prawne i licencyjne:} - Obowiązek stosowania bibliotek zgodnych z przyjętą licencją GPL v3 (np. MIT, Apache 2.0, BSD).
		\end{itemize}
		}
		\requ{NF01, NF03, ŚD01, ŚD02}
	\end{stakeholder}
	
	\FloatBarrier
	
	\begin{stakeholder}[label={stk:utk04}, caption={Lokalna stacja robocza (Komputer osobisty)}]
		\id{UNP 01}
		\name{Lokalna stacja robocza (Komputer osobisty)}
		\descr{Środowisko sprzętowe i systemowe (Windows/Linux), na którym lokalnie zainstalowana jest aplikacja Archivium. Zapewnia zasoby procesora, pamięci RAM oraz miejsce na dysku niezbędne do działania programu.}
		\type{Nieożywiony}
		\viewpoint{Środowisko uruchomieniowe}
		\limitations{Całość przetwarzania i składowania danych musi zamknąć się w zasobach lokalnego komputera.
		\newline
		Konieczność płynnego działania na współczesnych procesorach klasy konsumenckiej}
		\requ{NF01, NF03, ŚD01, ŚD02, NF02}
	\end{stakeholder}
	
	\FloatBarrier
	
	\begin{stakeholder}[label={stk:utk05}, caption={Licencja GPL v3}]
		\id{UNP 02}
		\name{Licencja GPL v3}
		\descr{Wybrana licencja wpływa na wybór zastosowanych bibliotek i komponentów w systemie oraz spełnienia ich warunków licencyjnych.}
		\type{Nieożywiony}
		\viewpoint{Zespół programistyczny}
		\limitations{Zastosowane biblioteki muszą pozwalać na stosowanie ich w programie wydanym na licencji GPL v3.}
		\requ{Wszsytkie wymagania funkcjonalne, W02}
	\end{stakeholder}
	
	\FloatBarrier
	
	\clearpage
	\section{Klienci}

	\subsection{Klienci wewnętrzni}
	\begin{itemize}
	\item \textbf{Zespół projektowy} – odpowiedzialny za tworzenie i wdrażanie funkcjonalności aplikacji. Ich potrzeby obejmują jasne wymagania projektowe oraz stabilne środowisko techniczne, które umożliwia testowanie i rozwijanie aplikacji.
	\end{itemize}
	
	\subsection{Klienci zewnętrzni}
	\begin{itemize}
		\item \textbf{Użytkownicy indywidualni} - Osoby korzystające z aplikacji w celach osobistych lub zawodowych, które potrzebują wygodnego narzędzia do organizowania dokumentów. Zwykle nie posiadają zaawansowanej wiedzy technicznej dlatego wymagają prostego, intuicyjnego interfejsu oraz dostępności aplikacji na różnych urządzeniach.
		\item \textbf{Firmy i organizacje} - Klienci instytucjonalni wykorzystujący aplikację do zarządzania dokumentacją wewnętrzną i archiwizacji projektów. Zazwyczaj posiadają własne procedury dotyczące przechowywania i przetwarzania danych, dlatego wymagają bezpieczeństwa danych i zgodności z przepisami. Dodatkowo kontrola wersji i archiwizacja pozytywnie wpłynie na przepływ informacji w firmie.
	\end{itemize}
	
	\section{Charakterystyka użytkowników}
	\begin{itemize}
		\item \textbf{Użytkownicy indywidualni}: Osoby fizyczne korzystające z aplikacji w celach osobistych lub zawodowych.
		\newline
		\textbf{Uprawnienia dostępu}: Użytkownicy mają dostęp do wszystkich funkcji aplikacji, umożliwiających tworzenie, edycję, organizację, wersjonowanie i eksport dokumentów.
	\end{itemize}
	\begin{itemize}
		\item \textbf{Firmy i organizacje}: Klienci instytucjonalni wykorzystujący aplikację do zarządzania dokumentacją wewnętrzną i archiwizacji projektów. Aplikacja jest przeznaczona do użytku przez jednego użytkownika w organizacji, na przykład do zarządzania osobistymi zbiorami dokumentów lub archiwizacji w małych jednostkach.
		\newline
		\textbf{Uprawnienia dostępu}: Zarządzanie strukturą dokumentów i archiwów organizacyjnych, kontrola wersji i śledzenie historii zmian w dokumentach.
	\end{itemize}
	
	
	\chapter{Wymagania}
	\section{Wymagania ogólne i dziedzinowe}
	
	\begin{requirementstab}[label={tab:requirements:W01},caption={Bezpieczne przechowywanie dokumentów}]
		\id{W01}
		\priority{M}
		\name{Bezpieczne przechowywanie dokumentów}
		\descr{System musi umożliwiać lokalne, zaszyfrowane przechowywanie danych bez konieczności dostępu do sieci Internet. Wszystkie dokumenty i metadane są zapisywane w pliku bazy danych na urządzeniu użytkownika.
		\newline
		Plik bazy danych jest nieczytelny dla zewnętrznych edytorów bez podania klucza szyfrującego.}
		\sholder{ZPR 01, UTK 01, UTK 02}
		\reqrelated{WF01, WF07, NF01}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:W02},caption={Kreator dokumentów}]
		\id{W02}
		\priority{M}
		\name{Kreator dokumentów}
		\descr{Użytkownik może tworzyć nowe i edytować istniejące dokumenty. System zapisuje dokument w lokalnej bazie danych.}
		\sholder{ZPR 01, UTK 01, UTK 02}
		\reqrelated{WF01, WF07, WF08, I01, WF04}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:W03},caption={Edytor dokumentów obsługujący podstawowe funkcjonalności}]
		\id{W03}
		\priority{M}
		\name{Edytor dokumentów obsługujący podstawowe funkcjonalności}
		\descr{Edytor wspiera: zaawansowane formatowanie tekstu, tabele o określonych wymiarach, listy, wstawianie multimediów (np. zdjęcia), obsługę hiperłączy oraz formuły matematyczne.}
		\sholder{ZPR 01, UTK 01, UTK 02}
		\reqrelated{WF01, WF07, WF08, I01, WF04}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:W04},caption={Wydajność}]
		\id{W04}
		\priority{M}
		\name{Wydajność}
		\descr{Program musi działać płynnie na urządzeniu docelowym zgodnie z ogólnie przyjętymi dobrymi praktykami dotyczącymi responsywności UX/UI}
		\sholder{ZPR 01, UTK 01, UTK 02, UNP 01}
		\reqrelated{WF07, W02, NF03, ŚD01}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:W05},caption={Intuicyjność interfejsu}]
		\id{W05}
		\priority{M}
		\name{Intuicyjność interfejsu}
		\descr{UI programu musi być prosty i jednolity zgodnie z dobrymi praktykami dotyczącymi responsywności UX/UI takich jak heurystykami Nielsena, Three-click rule, RWD, WCAG, Prawo Fittsa.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{W02}
	\end{requirementstab}
	
	\FloatBarrier
	
	%3.2 
	\section{Wymagania funkcjonalne}
	%3.2.1 
	\subsection{Nazwa funkcji/usługi}
	
	\begin{requirementstab}[label={tab:requirements:WF01},caption={Pryzkładowa tabela z wymaganiami na interfejs z otoczeniem}]
		\id{WF01}
		\priority{M}
		\name{Dodawanie dokumentów.}
		\descr{Użytkownik ma możliwość utworzenia nowego dokumentu. Aplikacja wyświetla pusty plik, który w każdym momencie może zostać zapisany tekstem, mogą zostać utworzone tabelki, listy punktowe, mogą zostać wklejona zdjęcia czy wzory matematyczne. Cały proces kończy się powstaniem nowego dokumentu, gdy użytkownik kliknie przycisk “Zapisz”.}
		\acceptcrit{
				Dodany dokument jest widoczny w aplikacji i zapisany w bazie danych.
				\newline
				Użytkownik może poprawnie wstawić, i wyświetlić wszystkie kluczowe elementy: \textbf{tabele, listy, multimedia, hiperłącza oraz formuły matematyczne.}
				\newline 
				Po ponownym uruchomieniu aplikacji cała treść (w tym wstawione multimedia i wzory) pozostaje dostępna i poprawnie wyrenderowana.}
		\inputdata{Akcja użytkownika - polecenie utworzenia nowego dokumentu; tytuł dokumentu}
		\preconditions{Aplikacja uruchomiona; użytkownik zalogowany;}
		\postconditions{Dokument zostanie zapisany w zaszyfrowanej bazie i widoczny w interfejsie użytkownika.}
		\exceptions{Błąd przy tworzeniu pliku, brak miejsca na dysku, przerwanie zapisu.}
		\implementation{Integracja z modułem bazy danych SQLCipher przy pomocy SQLAlchemy; funkcja importu pliku i generowania metadanych.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{W01, W02, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF02},caption={Edycja dokumentów}]
		\id{WF02}
		\priority{M}
		\name{Edycja dokumentów}
		\descr{Użytkownik wybiera istniejący dokument a aplikacja musi wyświetlić go dokładnie tak, jak został zapisany. Użytkownik może dopisać nowe zdania, poprawić błędy, dodać lub usunąć nowe elementy jak np.\textbf{tabele, listy, multimedia, hiperłącza oraz formuły matematyczne.}  Po kliknięciu “Zapisz” stara wersja pliku jest archiwizowana ,a wyedytowana staje się obowiązującą.}
		\acceptcrit{
				 Nowa wersja dokumentu jest widoczna w aplikacji jako obecna, a stara jest zapisywana w bazie danych.
				 \newline
				 Użytkownik może zmienić treść istniejącego dokumentu poprzez wstawianie, modyfikowanie i usuwanie wszystkie elementów dokumentu.
				 \newline
				 Po ponownym uruchomieniu aplikacji cała treść (w tym wstawione, zmodyfikowane multimedia i wzory) pozostaje dostępna i poprawnie wyrenderowana.}
		\inputdata{Dokument zapisany w bazie danych}
		\preconditions{Aplikacja uruchomiona; użytkownik zalogowany;}
		\postconditions{Nowa i stara wersja dokumentu zostanie zapisana w zaszyfrowanej bazie. Nowa wersja aktywa w edytorze.}
		\exceptions{Błąd przy odczycie pliku, brak miejsca na dysku, przerwanie zapisu.}
		\implementation{Integracja z modułem bazy danych SQLCipher przy pomocy SQLAlchemy; funkcja importu pliku i generowania metadanych.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{W01, W02, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF03},caption={Wyszukiwanie dokumentów}]
		\id{WF03}
		\priority{M}
		\name{Wyszukiwanie dokumentów}
		\descr{System umożliwia wyszukiwanie dokumentów po nazwie, dacie lub treści rozpoznanej przez moduł OCR.}
		\acceptcrit{Wyniki wyświetlają się poprawnie zgodnie z zapytaniem użytkownika; czas wyszukiwania nie przekracza 2 sekund.}
		\inputdata{Fraza wyszukiwania, wybrane filtry(np. data, tagi)}
		\preconditions{Baza danych zawiera co najmniej 1 dokument.}
		\postconditions{Zwrócona lista dokumentów odpowiada zadanym kryteriom.}
		\exceptions{Brak wyników wyszukiwania; błędne dane wejściowe;}
		\implementation{Indeksowanie danych tekstowych i metadanych w bazie SQLite;}
		\sholder{UTK 01, UTK 02, UNP 01}
		\reqrelated{WF01, W04, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF03.1},caption={Semantyczne wyszukiwanie dokumentów}]
		\id{WF03.1}
		\priority{S}
		\name{Semantyczne wyszukiwanie dokumentów}
		\descr{System powinien oferować możliwość wyszukiwania dokumentów na podstawie ich kontekstu, a nie tylko dokładnych fraz wpisanych przez użytkownika. Wykorzystuje to lokalne modele embeddingowe do generowania wektorów zapisywanych w zaszyfrowanej bazie danych.}
		\acceptcrit{System zwraca dokumenty powiązane znaczeniowo.}
		\inputdata{Zapytanie użytkownika w języku naturalnym.}
		\preconditions{Baza danych zawiera co najmniej 1 element.}
		\postconditions{Wyświetlenie listy dokumentów posortowanych według stopnia podobieństwa semantycznego.}
		\exceptions{Uszkodzona baza danych, zbyt krótka fraza wyszukiwania.}
		\implementation{Wykorzystanie rozszerzenia wektorowego dla SQLite.}
		\sholder{UTK 01, UTK 02, ZPR 01}
		\reqrelated{WF02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF03.2},caption={Interaktywna analiza dokumentacji}]
		\id{WF03.2}
		\priority{C}
		\name{Interaktywna analiza dokumentacji}
		\descr{System może oferować funkcję rozmowy z lokalnym modelem językowy (LLM), który odpowiada na pytania użytkownika w oparciu o treść zgromadzoną w bazie danych, bez wysyłania danych na serwery zewnętrzne.}
		\acceptcrit{Użytkownik otrzymuje wygenerowaną odpowiedź tekstową, która bazuje wyłącznie na faktach zawartych w jego prywatnej bazie dokumentów.}
		\inputdata{Pytanie zadane przez użytkownika w oknie asystenta.}
		\preconditions{Aktywny moduł wektorowy (WF02.1). Aktywny lokalny model językowy.}
		\postconditions{Wyświetlenie wygenerowanej odpowiedzi wraz z odnośnikami do dokumentów źródłowych.}
		\exceptions{Niewystarczająca moc obliczeniowa do uruchomienia modelu, model nie znajduje odpowiedzi dla danego kontekstu.}
		\implementation{Integracja z lokalnym silnikiem LLM poprzez Python FastAPI.}
		\sholder{ZPR 01}
		\reqrelated{WF02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF04},caption={Szyfrowanie danych}]
		\id{WF04}
		\priority{M}
		\name{Szyfrowanie danych}
		\descr{System automatycznie szyfruje wszystkie dane użytkownika w lokalnej bazie danych przy użyciu biblioteki SQLCipher i klucza AES-256}
		\acceptcrit{Brak możliwości odczytu danych z pliku bazy danych bez hasła głównego.
			W ustawieniach aplikacji nie istnieje opcja wyłączenia szyfrowania bazy danych.}
		\inputdata{Dane użytkownika (np. pliki, opisy)}
		\preconditions{Baza danych utworzona z poprawnym kluczem szyfrującym.}
		\postconditions{Dane zapisane w postaci zaszyfrowanej w pliku bazy.}
		\exceptions{Utrata klucza szyfrującego; przerwanie procesu zapisu; błędny algorytm.}
		\implementation{Generowanie i zarządzanie kluczem szyfrującym.}
		\sholder{UTK 01, UTK 02, UNP 01}
		\reqrelated{ZPR 01, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF05},caption={Eksport dokumentów do PDF}]
		\id{WF05}
		\priority{M}
		\name{Eksport dokumentów do PDF}
		\descr{System umożliwia użytkownikowi eksport wybranego dokumentu do formatu pdf}
		\acceptcrit{Wyeksportowane pliki są poprawne i otwierają się w zewnętrznych programach.}
		\inputdata{Wybrane dokumenty w formacie PDF.}
		\preconditions{Baza danych zawiera dokumenty do raportu.}
		\postconditions{Plik PDF zapisany lokalnie na dysku użytkownika.}
		\exceptions{Brak miejsca na dysku, błąd podczas zapisu, przerwanie generowanie pliku.}
		\implementation{Zapis pliku w formacie PDF.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF01, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF06},caption={Kopia zapasowa danych}]
		\id{WF06}
		\priority{C}
		\name{Kopia zapasowa danych}
		\descr{Użytkownik może wykonać kopie zapasową zaszyfrowanej bazy  dannych w formacie ZIP lub TAR i odtworzyć ją w tym samym urządzeniu.}
		\acceptcrit{Po przywróceniu kopii zapasowej dane są w pełni dostępne po podaniu hasła głównego.}
		\inputdata{Plik bazy danych.}
		\preconditions{Aplikacja uruchomiona, dostęp do systemów plików}
		\postconditions{Kopia bazy zapisana w wybranej lokalizacji.}
		\exceptions{Brak dostępu do lokalizacji; przerwanie zapisu; błędny format zapisu.}
		\implementation{zapis kopii w zaszyfrowanym archiwum ZIP/TAR}
		\sholder{ZPR 01}
		\reqrelated{WF04, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF07},caption={System logowania}]
		\id{WF07}
		\priority{M}
		\name{System logowania}
		\descr{Użytkownik aby uzyskać dostęp do danych bazy musi podać hasło dostępu lub użyć klucza przywracania.}
		\acceptcrit{System blokuje dostęp dla użytkowników bez hasła; restart hasła wykonuje się prawidłowo.}
		\inputdata{Hasło dostępu do bazy danych; klucz przywracania.}
		\preconditions{Aplikacja uruchomiona, brak dostępu do bazy danych.}
		\postconditions{Uzyskanie dostępu do bazy; restart hasła.}
		\exceptions{Błędne hasło, błąd wczytywania bazy danych.}
		\implementation{Ograniczenie dostępu do danych wymogiem hasła lub klucza przywracania.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF03, W01, W04, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF08},caption={Obsługa funkcji “Przeciągnij i upuść” (Drag and Drop) }]
		\id{WF08}
		\priority{S}
		\name{Obsługa funkcji “Przeciągnij i upuść” (Drag and Drop) }
		\descr{System umożliwia dodawanie dokumentów poprzez przeciągnięcie pliku z poziomu systemu operacyjnego na okno aplikacji. Upuszczenie pliku automatycznie uruchamia procedurę dodawania dokumentu.}
		\acceptcrit{Użytkownik może przeciągnąć plik PDF lub jakikolwiek na obszar roboczy aplikacji, co skutkuje otwarciem okna edycji dla nowego dokumentu.}
		\inputdata{Drag and Drop, ścieżka do pliku źródłowego.}
		\preconditions{Aplikacja uruchomiona, użytkownik zalogowany, widoczne główne okno.}
		\postconditions{Rozpoczęcie procesu importu.}
		\exceptions{Upuszczenie pliku w nieobsługiwanym formacie lub w nieobjętym tym wyjątkiem obszarze. 
		\newline
		Brak uprawnień do odczytu pliku źródłowego.}
		\implementation{Obsługa zdarzeń GUI (dragEnterEvent, dropEvent).
			\newline
			Weryfikacja rozszerzenia pliku przed uruchomieniem procedury importu.}
		\sholder{Użytkownicy końcowi.}
		\reqrelated{WF01, I01, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF09},caption={Wersjonowanie dokumentów.}]
		\id{WF09}
		\priority{M}
		\name{Wersjonowanie dokumentów.}
		\descr{System automatycznie zarządza historią zmian w plikach, tworząc punkty przywracania w kluczowych momentach oraz na żądanie.}
		\acceptcrit{	
			\begin{itemize}
				\item (Opcjonalnie)Braku aktywności użytkownika po zadanym czasie.
				\item Zamknięcia edytowanego pliku.
				\item Ręcznego wymuszenia zapisu przez użytkownika (CTRL+S).
			\end{itemize}}
		\inputdata{Istniejący w programie dokument i jego poprzednie wersje.}
		\preconditions{Dokument istnieje w bazie danych. Użytkownik zalogowany
		}
		\postconditions{Nowa wersja pliku jest aktualna, stare wersje są dostępne w historii.}
		\exceptions{Brak miejsca na dysku. Uszkodzona baza danych}
		\implementation{Pliki dokumentów będą przechowywane w całości w bazie danych.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF01, WF03, I02}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF10},caption={Indeksowanie treści z obrazów (OCR)}]
		\id{WF10}
		\priority{S}
		\name{Indeksowanie treści z obrazów (OCR)}
		\descr{System automatycznie przetwarza obrazy wklejone lub zaimportowane do notatek, rozpoznając na nich tekst (technologia OCR) i indeksując go. Umożliwia to użytkownikowi wyszukiwanie notatek na podstawie słów kluczowych znajdujących się wewnątrz grafik (np. zrzutów ekranu, skanów dokumentów).}
		\acceptcrit{Po wklejeniu do notatki obrazka zawierającego czytelny tekst (np. fragment artykułu), system w tle przetwarza grafikę.
		\newline	
		Po wpisaniu w pole wyszukiwania frazy widocznej tylko na obrazku, system zwraca notatkę zawierającą ten obrazek na liście wyników.}
		\inputdata{Plik graficzny (PNG, JPG, WebP) umieszczony w treści notatki.}
		\preconditions{Użytkownik dodał grafikę do notatki; Proces Sidecar odpowiedzialny za OCR jest aktywny.}
		\postconditions{Tekst rozpoznany z grafiki został zapisany w indeksie wyszukiwania w bazie danych powiązanym z daną notatką.}
		\exceptions{Jakość obrazu jest zbyt niska do rozpoznania tekstu.
			\newline
			Błąd procesu Sidecar/Python (brak odpowiedzi silnika OCR) – operacja jest ponawiana lub logowana jako błąd, bez przerywania pracy edytora.}
		\implementation{Pliki dokumentów będą przechowywane w całości w bazie danych.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF02, WF01}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:WF11},caption={Tworzenie własnych formatek dokumentów}]
		\id{WF11}
		\priority{C}
		\name{Tworzenie własnych formatek dokumentów}
		\descr{System umożliwia użytkownikowi tworzenie własnych formatek dokumentów do uzupełnienia.}
		\acceptcrit{Działający kreator formatek.}
		\inputdata{Plik formatki dokumentu zapisany w bazie danych}
		\preconditions{Użytkownik zalogowany}
		\postconditions{Formatka dokumentu została poprawnie utworzona i zapisana w bazie danych}
		\exceptions{Brak miejsca na dysku. Uszkodzona baza danych}
		\implementation{Wykorzystanie edytora textbf{TipTap (React)}  do generowania struktury dokumentu. Formatki przechowywane są w bazie textbf{SQLite (archivium.db)} obsługiwanej przez textbf{SQLAlchemy ORM} w backendzie Pythonowym. 
		\newline
		Dodatkowo wytworzony format zapisu formatki i moduł do ich obsługi będzie kontrolować to czy wszystkie pola zostały uzupełnione.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF02, WF01}
	\end{requirementstab}	
	
	\FloatBarrier
	
	\subsection{Interfejs z otoczeniem}
	
	\begin{requirementstab}
		[label={tab:requirements:I01},caption={Interfejs użytkownika}]
		\id{I01}
		\priority{M}
		\name{Interfejs użytkownika}
		\descr{System musi udostępniać graficzny interfejs użytkownika umożliwiający dodawanie, wyszukiwanie, przeglądanie oraz eksport dokumentów. Interfejs powinien być responsywny, czytelny i spójny z konwencją systemową (ciemny i jasny tryb).}
		\acceptcrit{
				Użytkownik może przełączać się między trybem jasnym i ciemnym; ustawienie jest zapamiętywane.
				Nawigacja między głównymi modułami odbywa się za pomocą paska bocznego/menu i działa bez przeładowania aplikacji.
				Interfejs skaluje się poprawnie przy zmianie rozmiaru okna, nie ukrywając kluczowych przycisków.
				Wszystkie akcje (CRUD) są dostępne z poziomu UI (kliknięcia) bez konieczności używania konsoli.}
		\inputdata{Działania użytkownika (kliknięcia myszą, skróty klawiszowe, wprowadzanie tekstu), preferencje systemowe (motyw).}
		\preconditions{Aplikacja uruchomiona}
		\postconditions{Interfejs odzwierciedla stan systemu po wykonanej akcji (np. odświeżona lista dokumentów, komunikat o sukcesie zapisu).}
		\exceptions{"Zamrożenie" interfejsu (brak responsywności UI na akcje); błędy renderowania komponentów React; nieczytelność elementów przy ekstremalnie małym rozmiarze okna.}
		\implementation{Warstwa wizualna oparta na frameworku textbf{React}. Stylizacja realizowana za pomocą textbf{Tailwind CSS} (zapewnienie spójności i responsywności). Ikony interfejsu dostarczane przez bibliotekę textbf{Lucide React}. Całość renderowana w oknie natywnym dzięki textbf{Tauri}.}
		\sholder{UTK 01, UTK 02}
		\reqrelated{WF01, WF03, W02, WF07, W03}
	\end{requirementstab}
	
	\FloatBarrier
	
	\begin{requirementstab}[label={tab:requirements:I02},caption={Interfejs z systemem plików}]
		\id{I02}
		\priority{M}
		\name{Interfejs z systemem plików}
		\descr{System komunikuje się z lokalnym systemem plików użytkownika w celu realizacji operacji odczytu (import dokumentów, załączników) i zapisu (eksport do PDF, kopia zapasowa). Operacje wykorzystują natywne okna dialogowe systemu operacyjnego i odbywają się bez dostępu do internetu.}
		\acceptcrit{
				Wywołanie funkcji importu/eksportu otwiera natywne okno wyboru pliku/katalogu właściwe dla danego systemu operacyjnego (Windows/Linux).
				System poprawnie wczytuje pliki o obsługiwanych rozszerzeniach (.pdf, .jpg, .png) do pamięci aplikacji.
				Eksportowane pliki pojawiają się we wskazanej przez użytkownika lokalizacji z poprawną strukturą danych
				Próba dostępu do lokalizacji bez uprawnień zwraca czytelny komunikat błędu, a aplikacja nie ulega awarii.}
		\inputdata{Ścieżka do pliku/katalogu wybrana przez użytkownika, strumień danych pliku (binary stream), nazwa pliku docelowego.}
		\preconditions{Użytkownik ma dostęp do lokalnego systemu plików i uprawnienia do zapisu i odczytu.}
		\postconditions{Plik został zaimportowany do bazy danych (jako BLOB lub tekst po OCR) LUB plik wynikowy został zapisany w systemie plików hosta.}
		\exceptions{Brak uprawnień, brak miejsca na dysku, ścieżka nieprawidłowa.}
		\implementation{Walidacja ścieżek; kontrola błędów zapisu.}
		\sholder{UNP 01, UTK 02, UTK 01}
		\reqrelated{WF01, WF04, WF09, NF01}
	\end{requirementstab}

\FloatBarrier

\subsection{Wymagania pozafunkcjonalne}

\begin{requirementstab}[label={tab:requirements:NF01},caption={Stabilność działania aplikacji lokalnej}]
	\id{NF01}
	\priority{M}
	\name{Stabilność działania aplikacji lokalnej}
	\descr{Aplikacja uruchamiana jest lokalnie na komputerze użytkownika i musi zachować stabilność podczas sesji pracy, nie powodując utraty danych w wyniku błędów wewnętrznych.}
	\acceptcrit{Brak krytycznych błędów (zamknięcie aplikacji, zamrożenie interfejsu na > 5s) podczas 4-godzinnej sesji testowej ciągłej pracy z edytorem.
		\newline
		Podczas testu nie może dojść do wycieku pamięci.}
	\sholder{Użytkownicy końcowi}
	\reqrelated{W02}
\end{requirementstab}

\FloatBarrier

\begin{requirementstab}[label={tab:requirements:NF02},caption={Intuicyjność interfejsu}]
	\id{NF02}
	\priority{M}
	\name{Intuicyjność interfejsu}
	\descr{Interfejs powinien być prosty i intuicyjny w obsłudze, aby nowi użytkownicy mogli łatwo nawigować i korzystać z funkcji aplikacji bez potrzeby dodatkowego wsparcia.}
	\acceptcrit{Wykonanie scenariusza testowego "Tworzenie dokumentu i wyszukiwanie go" w czasie poniżej 30 sekund przez testera niebędącego autorem tego modułu (weryfikacja wewnątrz zespołu).}
	\sholder{Użytkownicy końcowi}
	\reqrelated{W03, I01}
\end{requirementstab}

\FloatBarrier

\begin{requirementstab}[label={tab:requirements:NF03},caption={Wydajność}]
	\id{NF03}
	\priority{M}
	\name{Wydajność}
	\descr{Czas uruchamiania systemu i wczytywania danych powinien być krótki, aby zapewnić płynne doświadczenie użytkownika.}
	\acceptcrit{Uruchomienie programu w mniej niż 10 sekund na wskazanym komputerze testowym.
	\newline
	Otwarcie dokumentu tekstowego o długości 5 stron A4 (z obrazkami) w czasie poniżej 2 sekund.}
	\sholder{Użytkownicy końcowi}
	\reqrelated{W02}
\end{requirementstab}

\FloatBarrier

\subsection{Wymagania na środowisko docelowe}

\begin{requirementstab}[label={tab:requirements:ŚD01},caption={Obsługa różnych systemów operacyjnych}]
	\id{ŚD01}
	\priority{M}
	\name{Obsługa różnych systemów operacyjnych}
	\descr{Aplikacja powinna działać na popularnych systemach operacyjnych Windows.}
	\acceptcrit{Płynne działanie na Windows 10 i nowszych.}
	\sholder{UNP 01, ZPR 01}
	\reqrelated{W03}
\end{requirementstab}

\FloatBarrier

\begin{requirementstab}[label={tab:requirements:ŚD02},caption={Obsługa różnych systemów operacyjnych}]
	\id{ŚD02}
	\priority{S}
	\name{Obsługa różnych systemów operacyjnych}
	\descr{Aplikacja powinna działać na popularnych systemach operacyjnych Linux.}
	\acceptcrit{Linux (testowane dla ubuntu 20.04.6 LTS)}
	\sholder{UNP 01, ZPR 01}
	\reqrelated{W03}
\end{requirementstab}

\FloatBarrier

\begin{requirementstab}[label={tab:requirements:ŚD03},caption={Kompatybilność z urządzeniami o średniej wydajności}]
	\id{ŚD03}
	\priority{M}
	\name{Kompatybilność z urządzeniami o średniej wydajności}
	\descr{Program musi działać płynnie na urządzeniach o średniej wydajności, takich jak komputery PC i laptopy.
	\newline
	Platforma testowa została opisana w DZW.}
	\acceptcrit{System działa płynnie na wskazanej platformie testowej}
	\sholder{UNP 01, ZPR 01}
	\reqrelated{ŚD01,W03}
\end{requirementstab}

\FloatBarrier

\begin{requirementstab}[label={tab:requirements:ŚD04},caption={Przenośność aplikacji (Portable)}]
	\id{ŚD04}
	\priority{S}
	\name{Przenośność aplikacji (Portable)}
	\descr{Aplikacja musi być dystrybuowana w formie niewymagającej instalacji w systemie operacyjnym (tzw. portable), umożliwiając uruchomienie bezpośrednio z nośnika zewnętrznego (np. pendrive) lub dowolnego katalogu użytkownika.}
	\acceptcrit{Aplikacja uruchamia się z pliku .exe (Windows) lub .AppImage (Linux) bez procesu instalacji.
	\newline
	Wszystkie dane tworzone są w katalogu roboczym aplikacji (lub podkatalogu), nie zaśmiecając rejestru systemowego ani katalogów systemowych.}
	\sholder{UNP 01, ZPR 01}
	\reqrelated{ŚD01,W03}
\end{requirementstab}

\FloatBarrier

\chapter{Załączniki}

\begin{itemize}
	\item Karta\_projektu-Gr73c(SCESF)-v0\_Archivium
	\item DZW-Gr73c(SCESF)-v0\_Archivium
\end{itemize}

\end{document}