Spis treści

Wersje PDF dokumentów: Projekt konceptualny Projekt logiczny Raport końcowy Aplikacja android

Źródła aplikacji

Projekt konceptualny

1. Sformułowanie zadania projektowego.

Celem projektu jest stworzenie aplikacji do ewidencji środków trwałych umożliwiającą wprowadzanie oraz edycję środków trwałych oraz możliwość przypisania sprzętu do pracowników oraz lokalizacji co ułatwia zarządzanie tym sprzętem.

2. Analiza stanu wyjściowego.

Obecnie na rynku istnieje wiele aplikacji do ewidencji środków trwałych, jednak zdecydowana większość z nich to aplikacje płatne. Nasza aplikacja nie tylko będzie aplikacją darmową, w dodatku będzie umożliwiała wprowadzanie danych poprzez popularne w dzisiejszych czasach smartfony z systemem operacyjnym Android, nie wymagając przy tym żadnych dodatkowych, dedykowanych w tym celu, urządzeń.

3. Analiza wymagań użytkownika (wstępna).

W projekcie wyróżniamy cztery grupy użytkowników:

Administrator będzie miał prawo wykonywać wszystkie czynności w aplikacji tj. dodawanie nowych użytkowników do systemu, dodawanie ich do odpowiednich grup użytkowników oraz wszystkie uprawnienia administratora aplikacji.

Księgowy będzie miał prawo dodawać/edytować/usuwać wpisy do ewidencji środków trwałych, sprzęt, pracowników oraz lokalizacje.

Kierownik będzie miał dostępy w trybie 'read only' do ewidencji środków trwałych, list: sprzętu, pracowników oraz lokalizacji, a także do raportów.

Natomiast użytkownik będzie miał prawo tylko i wyłącznie do przeglądania mapowań pomiędzy sprzętem, użytkownikiem a lokalizacją.

Aplikacja będzie posiadała dwa interfejsy: webowy oraz mobilny przeznaczony na platformę Android.

4. Określenie scenariuszy użycia.

1. Użytkownik
1.1. Przeglądanie mapowań.
2. Kierownik
2.1. Przeglądanie listy pracowników.
2.2. Przeglądanie listy sprzętu.
2.3. Przeglądanie listy lokalizacji.
2.4. Przeglądanie Ewidencji środków trwałych.
2.5. Przeglądanie raportów.
2.6. Przeglądanie mapowań.
3. Księgowy
3.1. Możliwość dodawania/edytowania/usuwania pracowników.
3.2. Możliwość dodawania/edytowania/usuwania sprzętu.
3.3. Możliwość dodawania/edytowania/usuwania lokalizacji.
3.4. Możliwość dodawania/edycji wpisów w Ewidencji środków trwałych.
3.5. Przeglądanie mapowań.
4. Administrator systemu
4.1. Możliwość dodawania/edytowania/usuwania użytkowników.
4.2. Możliwość dodawania/edytowania/usuwania użytkowników do/z grup.
4.3. Możliwość dodawania/edytowania/usuwania pracowników.
4.4. Możliwość dodawania/edytowania/usuwania sprzętu.
4.5. Możliwość dodawania/edytowania/usuwania lokalizacji.
4.6. Możliwość dodawania/edycji/usuwanie wpisów w Ewidencji środków trwałych.
4.7. Przeglądanie mapowań.

Wprowadzanie mapowań sprzęt-pracownik-lokalizacja będzie możliwa tylko poprzez aplikację mobilną. Zmiana haseł do kont będzie możliwa tylko po skontaktowaniu się z administratorem systemu.

5. Identyfikacja funkcji. Określenie podstawowych funkcji realizowanych w bazie danych.

1. Dodanie użytkownika
2. Przypisanie użytkownika do grupy.
3. Dodanie sprzętu.
4. Usunięcie sprzętu.
5. Edycja sprzętu.
6. Dodanie pracownika.
7. Usunięcie pracownika.
8. Edycja pracownika.
9. Dodanie lokalizacji.
10. Usunięcie lokalizacji.
11. Edycja lokalizacji.
12. Generowanie raportu.
13. Dodanie wpisu do Ewidencji środków trwałych.
14. Edycja wpisu w Ewidencji środków trwałych.
15. Dodanie/edycja mapowania sprzęt – pracownik – lokalizacja (tylko klient mobilny).

6. Analiza hierarchii funkcji projektowanej aplikacji (FHD – Function Hierarchy Diagram).
Rys.1. Diagram FHD.

7. Budowa i analiza diagramu przepływu danych (DFD – Data Flow Diagram).


Rys.2. Diagram kontekstowy.


Rys.3. Diagram główny.


Rys.4. Diagram DFD dla użytkownika.


Rys.5. Diagram DFD dla kierownika.


Rys.6. Diagram DFD dla księgowego.


Rys.7. Diagram DFD dla administratora.

8. Wybór encji (obiektów) i ich atrybutów.

W systemie będą istnieć następujące encje:
Ewidencja środków trwałych (FixedAssets),
Dokumenty zakupu (BuyDocument),
Klasyfikacja Środków Trwałych (FixedAssetsClassification),
Sprzęt (Equipment),
Lokalizacje (Place),
Pracownicy (Employee),
Mapowania (Mapping)
oraz encje związane z dostępem do aplikacji:
Użytkownik (User),
Grupa (Group),
Rola (Role).

9. Projektowanie powiązań (relacji) pomiędzy encjami. Konstrukcja diagramu ERD (Entity-Relationship Diagram).


Rys.8. Diagram ERD.

10. Projekt diagramów STD (State Transition Diagram – diagramy przejść pomiędzy stanami).


Rys. 9. Diagram STD.

Projekt logiczny

1. Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ERD;

1.1. Utworzenie bazy danych.

create database if not exists Ewidencja default character set = utf8;

1.2. Utworzenie tabel.

use Ewidencja;

create table fixed_assets
(
	id integer auto_increment,
	equipment_id integer,
	purchase_date datetime,
	first_use_date datetime,
	purchase_document_id integer,
	description varchar(128),
	fixed_assets_classification_symbol_id integer,
	initial_value decimal(10,2),
	amortization_rate decimal(3,2),
	deduction_amount decimal(10,2),
	updated_initial_value decimal(10,2),
	updated_deduction_amount char(10),
	liquidation_date datetime,
	liquidation_couse varchar(128),
	creation_date datetime,
	created_by integer,
	last_modify datetime,
	modify_by integer,
	primary key (id)	
)ENGINE=INNODB;

create table fixed_assets_classification_symbols
(
	id integer auto_increment,
	name varchar(32),
	primary key (id)
)ENGINE=INNODB;


create table purchase_documents
(
	id integer auto_increment,
	name varchar(32),
	primary key (id)
)ENGINE=INNODB;

create table places
(
	id integer auto_increment,
	country varchar(32),
	province varchar(32),
	city varchar(32),
	postal_code char(12),
	street varchar(32),
	building varchar(16),
	floor integer,
	room_number varchar(16),
	synchronized boolean,
	primary key (id)
)ENGINE=INNODB;

create table employees
(
	id integer auto_increment,
	name varchar(16),
	surname varchar(32),
	date_of_birth date,
	place_of_birth varchar(32),
	pesel char(11),
	email varchar(255),
	msisdn numeric(15),
	synchronized boolean,
	primary key (id)
)ENGINE=INNODB;

create table mappings
(
	id integer auto_increment,
	equipment_id integer,
	employee_id integer,
	place_id integer,
	creation_date datetime,
	created_by integer,
	last_modify datetime,
	modify_by integer,
	synchronized boolean,
	primary key (id)
)ENGINE=INNODB;



create table equipment
(
	id integer auto_increment,
	brand varchar(32),
	model varchar(32),
	serial_number varchar(32),
	synchronized boolean,
	primary key (id)
)ENGINE=INNODB;

create table users
(
	id integer auto_increment,
	login varchar(32),
	name varchar(16),
	surname varchar(32),
	creation_date datetime,
	active boolean,
	password varchar(40),
	group_id integer,
	synchronized boolean,
	primary key (id)
)ENGINE=INNODB;

create table groups
(
	id integer auto_increment,
	name varchar(16),
	active boolean,
	create_time datetime,
	primary key (id)
)ENGINE=INNODB;

create table groups_roles
(
	group_id integer,
	role varchar(32)
)ENGINE=INNODB;

create table roles
(
	role varchar(32),
	description varchar(128)
)ENGINE=INNODB;

create table events 
(
	id integer auto_increment,
	object_type_id integer,
	action_id integer,
	event_date datetime,
	primary key (id)
)ENGINE=INNODB;

create table object_types 
(
	id integer auto_increment,
	name varchar(16),
	primary key (id)
)ENGINE=INNODB;

create table actions 
(
	id integer auto_increment,
	name varchar(16),
	primary key (id)
)ENGINE=INNODB;

1.3. Utworzenie widoków raportowych:

CREATE VIEW last_month_report AS
select 
sum(case when object_type_id=1 and action_id=1 then 1 else 0 end) as user_add,
sum(case when object_type_id=1 and action_id=2 then 1 else 0 end) as user_edit,
sum(case when object_type_id=1 and action_id=3 then 1 else 0 end) as user_delete,
sum(case when object_type_id=2 and action_id=1 then 1 else 0 end) as employee_add,
sum(case when object_type_id=2 and action_id=2 then 1 else 0 end) as employee_edit,
sum(case when object_type_id=2 and action_id=3 then 1 else 0 end) as employee_delete,
sum(case when object_type_id=3 and action_id=1 then 1 else 0 end) as equipment_add,
sum(case when object_type_id=3 and action_id=2 then 1 else 0 end) as equipment_edit,
sum(case when object_type_id=3 and action_id=3 then 1 else 0 end) as equipment_delete,
sum(case when object_type_id=4 and action_id=1 then 1 else 0 end) as localization_add,
sum(case when object_type_id=4 and action_id=2 then 1 else 0 end) as localization_edit,
sum(case when object_type_id=4 and action_id=3 then 1 else 0 end) as localization_delete,
sum(case when object_type_id=5 and action_id=1 then 1 else 0 end) as mapping_add,
sum(case when object_type_id=5 and action_id=2 then 1 else 0 end) as mapping_edit,
sum(case when object_type_id=5 and action_id=3 then 1 else 0 end) as mapping_delete,
sum(case when object_type_id=6 and action_id=1 then 1 else 0 end) as fixed_asset_add,
sum(case when object_type_id=6 and action_id=2 then 1 else 0 end) as fixed_asset_edit,
sum(case when object_type_id=6 and action_id=3 then 1 else 0 end) as fixed_asset_delete
from events WHERE YEAR(event_date) = YEAR(CURDATE()) AND MONTH(event_date) = MONTH(CURDATE());

CREATE VIEW last_year_report AS
select 
sum(case when object_type_id=1 and action_id=1 then 1 else 0 end) as user_add,
sum(case when object_type_id=1 and action_id=2 then 1 else 0 end) as user_edit,
sum(case when object_type_id=1 and action_id=3 then 1 else 0 end) as user_delete,
sum(case when object_type_id=2 and action_id=1 then 1 else 0 end) as employee_add,
sum(case when object_type_id=2 and action_id=2 then 1 else 0 end) as employee_edit,
sum(case when object_type_id=2 and action_id=3 then 1 else 0 end) as employee_delete,
sum(case when object_type_id=3 and action_id=1 then 1 else 0 end) as equipment_add,
sum(case when object_type_id=3 and action_id=2 then 1 else 0 end) as equipment_edit,
sum(case when object_type_id=3 and action_id=3 then 1 else 0 end) as equipment_delete,
sum(case when object_type_id=4 and action_id=1 then 1 else 0 end) as localization_add,
sum(case when object_type_id=4 and action_id=2 then 1 else 0 end) as localization_edit,
sum(case when object_type_id=4 and action_id=3 then 1 else 0 end) as localization_delete,
sum(case when object_type_id=5 and action_id=1 then 1 else 0 end) as mapping_add,
sum(case when object_type_id=5 and action_id=2 then 1 else 0 end) as mapping_edit,
sum(case when object_type_id=5 and action_id=3 then 1 else 0 end) as mapping_delete,
sum(case when object_type_id=6 and action_id=1 then 1 else 0 end) as fixed_asset_add,
sum(case when object_type_id=6 and action_id=2 then 1 else 0 end) as fixed_asset_edit,
sum(case when object_type_id=6 and action_id=3 then 1 else 0 end) as fixed_asset_delete
from events WHERE YEAR(event_date) = YEAR(CURDATE());

CREATE VIEW summary_report AS
select 
sum(case when object_type_id=1 and action_id=1 then 1 else 0 end) as user_add,
sum(case when object_type_id=1 and action_id=2 then 1 else 0 end) as user_edit,
sum(case when object_type_id=1 and action_id=3 then 1 else 0 end) as user_delete,
sum(case when object_type_id=2 and action_id=1 then 1 else 0 end) as employee_add,
sum(case when object_type_id=2 and action_id=2 then 1 else 0 end) as employee_edit,
sum(case when object_type_id=2 and action_id=3 then 1 else 0 end) as employee_delete,
sum(case when object_type_id=3 and action_id=1 then 1 else 0 end) as equipment_add,
sum(case when object_type_id=3 and action_id=2 then 1 else 0 end) as equipment_edit,
sum(case when object_type_id=3 and action_id=3 then 1 else 0 end) as equipment_delete,
sum(case when object_type_id=4 and action_id=1 then 1 else 0 end) as localization_add,
sum(case when object_type_id=4 and action_id=2 then 1 else 0 end) as localization_edit,
sum(case when object_type_id=4 and action_id=3 then 1 else 0 end) as localization_delete,
sum(case when object_type_id=5 and action_id=1 then 1 else 0 end) as mapping_add,
sum(case when object_type_id=5 and action_id=2 then 1 else 0 end) as mapping_edit,
sum(case when object_type_id=5 and action_id=3 then 1 else 0 end) as mapping_delete,
sum(case when object_type_id=6 and action_id=1 then 1 else 0 end) as fixed_asset_add,
sum(case when object_type_id=6 and action_id=2 then 1 else 0 end) as fixed_asset_edit,
sum(case when object_type_id=6 and action_id=3 then 1 else 0 end) as fixed_asset_delete
from events;

1.4. Utworzenie indeksów (indeksy będą zakładane po utworzeniu aplikacji, w fazie utrzymania, gdy system zostanie zasilony odpowiednią ilością danych, wtedy zostaną założone indeksy na kolumny, które tego wymagają).

	CREATE UNIQUE INDEX roles_role_idx ON roles (role(32));

1.5. Utworzenie kluczy obcych (klucze główne są tworzone podczas tworzenia tabel).

	alter table fixed_assets add constraint fixed_assets_equipment_fk 
	foreign key (equipment_id) references equipment(id);	

	alter table fixed_assets add constraint fixed_assets_purchase_document_fk 
	foreign key (purchase_document_id) references purchase_documents(id);

	alter table fixed_assets add constraint fixed_assets_fixed_assets_classification_fk 
	foreign key (fixed_assets_classification_symbol_id) references 	fixed_assets_classification_symbols(id);

	alter table fixed_assets add constraint fixed_assets_created_by_fk 
	foreign key (created_by) references users(id);

	alter table fixed_assets add constraint fixed_assets_modify_by_fk 
	foreign key (modify_by) references users(id);

	alter table mappings add constraint mappings_equipment_fk 
	foreign key (equipment_id) references equipment(id);
	
	alter table mappings add constraint mappings_employee_fk 
	foreign key (employee_id) references employees(id);

	alter table mappings add constraint mappings_place_fk 
	foreign key (place_id) references places(id);
	
	alter table mappings add constraint mappings_created_by_fk 
	foreign key (created_by) references users(id);

	alter table mappings add constraint mappings_modify_by_fk 
	foreign key (modify_by) references users(id);
	
	alter table users add constraint users_group_fk 
	foreign key (group_id) references groups(id);

	alter table groups_roles add constraint groups_roles_group_fk 
	foreign key (group_id) references groups(id);

	alter table groups_roles add constraint groups_roles_role_fk 
	foreign key (role) references roles(role);

	alter table events add constraint events_object_type_fk 
	foreign key (object_type_id) references object_types(id);

	alter table events add constraint events_action_fk 
	foreign key (action_id) references actions(id);

2. Słowniki danych.

Ewidencja środków trwałych – ewidencja, którą zgodnie z ustawą o rachunkowości jest zobowiązany prowadzić każdy przedsiębiorca.

Środek trwały - zgodnie z wytycznymi ustawy o podatku dochodowym od osób fizycznych, środek trwały to środek, którego wartość początkowa musi przekraczać 3500PLN. Dodatkowo środek taki musi być także własnością lub współwłasnością podatnika. Tańsze środki mogą zostać wpisane do ewidencji, ale nie jest to wymagane. KST (Symbol klasyfikacji środków trwałych) – to w jakiej grupie środek trwały jest sklasyfikowany implikuje wysokość stawki amortyzacyjnej danego środka trwałego.

Dokument zakupu – dokument stwierdzający zakup sprzętu, np. paragon, faktura, itp.

Lokalizacja – miejsce w którym może przebywać pracownik.

Pracownik – osoba zatrudniona w firmie, która może przebywać w pewnym miejscu oraz mieć przypisany sprzęt do siebie.

Sprzęt – urządzenie, mebel, pojazd, itp. które może być przypisane do danego pracownika oraz figuruje w ewidencji środków trwałych.

Mapowanie – zestawienie pracownika ze sprzętem oraz lokalizacją.

Użytkownik – osoba korzystająca z systemu. Jest przypisana do pewnej grupy co umożliwia jej wykonywanie określonych czynności w systemie.

Grupa – zbiór użytkowników do którego przypisywane mogą być role.

Rola – prawo dostępu do określonego zasobu. Data zakupu – data zakupu środka trwałego.

Data pierwszego użycia – data pierwszego użycia środka trwałego.

Wartość początkowa - to cena zakupu powiększona o koszty uzyskania danego środka. Chodzi tu o koszty transportu, załadunku i wyładunku, ubezpieczenia w drodze, montażu, instalacji i uruchomienia, opłat notarialnych, skarbowych i innych, odsetek oraz prowizji, pomniejszone o należny podatek od towarów i usług (VAT nie podlegający odliczeniu zwiększa wartość początkową środka trwałego). W przypadku importu cena nabycia zawiera cło i podatek akcyzowy od przywozu składników majątku.

Amortyzacja - Firmy prowadzące małą księgowość mają prawo do zaliczenia w koszty wartości zakupionych, wytworzonych  lub otrzymanych składników majątku. Jednak w wypadku składników majątkowych kosztem nie jest  bezpośrednio  cena nabycia/wytworzenia lecz odpis amortyzacyjny. Amortyzacja to zaliczenie w koszty prowadzenia działalności gospodarczej wartości zakupionych lub posiadanych środków trwałych. Amortyzacji podlegają, stanowiące własność lub współwłasność podatnika, nabyte lub wytworzone we własnym zakresie, kompletne i zdatne do użytku w dniu przyjęcia do używania:
1. budowle, budynki oraz lokale będące odrębną własnością,
2. maszyny, urządzenia i środki transportu,
3. inne przedmioty.
o przewidywanym okresie używania dłuższym niż rok, wykorzystywane przez podatnika na potrzeby związane z prowadzoną przez niego działalnością gospodarczą, albo oddane do używania na podstawie umowy najmu, dzierżawy.

Kwota amortyzacji – kwota amortyzacji może być różna w zależności od wybranej metody amortyzacji (odpis jednorazowy, amortyzacja liniowa, amortyzacja degresywna, itp.).

Kwota umorzenia - za dany okres (np. kilku lat) jest sumą dokonanych odpisów amortyzacyjnych w poszczególnych podokresach.

Zaktualizowana wartość początkowa - wynika z rozporządzenia  Ministra Finansów . minister ogłasza  tryb i terminy aktualizacji wyceny środków trwałych. Z możliwości takiej Minister skorzystał ostatnio w 1995 r. i nic nie zapowiada nowego rozporządzenia.

Zaktualizowana wartość umorzenia – j.w.

Likwidacja - przedsiębiorstwo przestaje wykorzystywać dany środek trwały i nie jest on już zdatny do użytku ani do sprzedaży, przedsiębiorstwo dokonuje tzw. likwidacji środka trwałego. Z fizycznego punktu widzenia likwidacja może przebiegać w różny sposób - może to być złomowanie środka, demontaż na części, bądź inny rodzaj utylizacji. Z księgowego punktu widzenia operacja ta zawsze przebiega tak samo:
1. Wartość brutto środka trwałego wraz z naliczonym umorzeniem, czyli de facto wartość netto, zostają wyksięgowane w pozostałe koszty operacyjne.
2. Inne koszty związane z demontażem lub likwidacją środka trwałego również zostają zaliczone w pozostałe koszty operacyjne.

PESEL – numer identyfikujący osobę zawierający w sobie informację o dacie urodzenia, płci, a także liczbę porządkową i cyfrę kontrolną. Składa się z 11 cyfr. Ze względu na to iż w początkowym okresie nadawania numerów PESEL nie odbywało się to za pośrednictwem systemów informatycznych pojawiło się kilka przypadków nadania tego samego peselu kilku osobom. Z tego powodu nie zakładamy unikalności tego pola w naszym systemie.

email – ciąg maksymalnie 255 znaków służący identyfikacji uczestników biorących udział w przesyłaniu wiadomości elektronicznych poprzez sieć komputerową. Adres email składa się z identyfikatora użytkownika, znaku '@' oraz pełnej nazwy domenowej serwera poczty elektronicznej.

msisdn – numer abonenta sieci komórkowej (potocznie: numer telefonu). Składa się maksymalnie z 15 cyfr: 2 pierwsze to kod kraju, 3 następne to w zależności od standardu krajowy kod docelowy lub po prostu obszar, następne 10 cyfr to numer abonenta. Numer abonenta może składać się z mniejszej ilości cyfr. W naszym systemie przyjmujemy, że numery polskich sieci składają się tylko z 9 cyfr wyłączając kod kraju i kod obszaru. Dla numerów sieci zagranicznych podajemy pełny numer msisdn.

Hasło – hasła użytkowników są przechowywane w bazie danych w postaci hash'u wykonanego funkcją SHA1.

3. Analiza zależności funkcyjnych i normalizacja tabel (dekompozycja do 3NF, BCNF, 4NF, 5NF).

Jak widać na powyższym diagramie ERD wszystkie relacje są w 3NF. W każdej z powyższych relacji atrybuty nie będące częścią klucza głównego są wzajemnie niezależne oraz są nieredukowalnie zależne od klucza głównego.

4. Projektowanie operacji na danych. Logika biznesowa aplikacji będzie zrealizowana w całości w kodzie aplikacji, a nie w bazie danych. Takie podejście ułatwia znacznie proces znajdowania i analizy błędów poprzez mechanizm debugowania. Procedury i funkcje bazodanowe znacznie utrudniają znalezienie przyczyny problemu w razie jego wystąpienia.

4.1. Zapytania wykorzystywane w aplikacji.

4.1.1. Autentykacja i autoryzacja
4.1.1.1. Sprawdzenie czy użytkownik o podanym loginie i haśle istnieje w systemie oraz czy jego konto jest aktywne:

select 1 from users where login = ? and password = ? and active = 1

4.1.1.2. Pobranie ról dla wskazanego użytkownika:

select r.role 
from users u 
inner join groups g 
on (u.group_id = g.id) 
inner join groups_roles g_r 
on (g.id = g_r.group_id) 
inner join roles r 
on (g_r.role = r.role) 
where u.login = ? and u.password = ?

4.1.2. Ewidencja środków trwałych
4.1.2.1. Pobranie listy środków trwałych

select f_a.id, e.id, e.brand, e.model, e.serial_number, f_a.purchase_date, f_a.first_use_date, f_a.purchase_document_id, f_a.description, 
f_a.fixed_assets_classification_symbol_id, f_a.initial_value, f_a.amortization_rate, f_a.deduction_amount, f_a.updated_initial_value, f_a.updated_deduction_amount, f_a.liquidation_date, f_a.liquidation_couse, f_a.creation_date, u.id, u.name, u.surname, u.login, f_a.last_modify, u2.id, u2.name, u2.surname, u2.login 
f_s.id, f_s.name, p_d.id, p_d.name 
from fixed_assets f_a 
inner join equipment e on (f_a.equipment_id=e.id) 
left outer join users u on (f_a.created_by=u.id) 
left outer join users u2 (f_a.modify_by=u2.id) 
left outer join fixed_assets_classification_symbols f_s on (f_a.fixed_assets_classification_symbol_id=f_s.id) 
left outer join purchase_documents p_d on (f_a.purchase_document_id=p_d.id)

4.1.2.2. Pobranie wpisu w ewidencji środków trwałych o określonym id

select f_a.id, e.id, e.brand, e.model, e.serial_number, f_a.purchase_date, f_a.first_use_date, f_a.purchase_document_id, f_a.description, f_a.fixed_assets_classification_symbol_id, f_a.initial_value, f_a.amortization_rate, f_a.deduction_amount, f_a.updated_initial_value,	f_a.updated_deduction_amount, f_a.liquidation_date, f_a.liquidation_couse, f_a.creation_date, u.id, u.name, u.surname, u.login, f_a.last_modify, u2.id, u2.name, u2.surname, u2.login f_s.id, f_s.name, p_d.id, p_d.name from fixed_assets f_a inner join equipment e on (f_a.equipment_id=e.id) left outer join users u on (f_a.created_by=u.id) left outer join users u2 (f_a.modify_by=u2.id) left outer join fixed_assets_classification_symbols f_s on (f_a.fixed_assets_classification_symbol_id=f_s.id) left outer join purchase_documents p_d on (f_a.purchase_document_id=p_d.id) where f_a.id = ?

4.1.2.3. Dodanie wpisu do ewidencji środków trwałych

insert into fixed_assets (equipment_id,purchase_date,first_use_date,purchase_document_id,description,
fixed_assets_classification_symbol_id,initial_value,amortization_rate,deduction_amount,updated_initial_value,  updated_deduction_amount, liquidation_date, liquidation_couse, creation_date, created_by, last_modify, modify_by) 
values (?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?)

4.1.2.4. Edycja wpisu w ewidencji środków trwałych

update fixed_assets set equipment_id=?, purchase_date=?, first_use_date=?, purchase_document_id=?, description=?, fixed_assets_classification_symbol_id=?, initial_value=?, amortization_rate=?, deduction_amount=?, updated_initial_value=?, updated_deduction_amount=?,liquidation_date=?, liquidation_couse=?, creation_date=?, created_by=?, last_modify=?, modify_by=? where id = ?

4.1.3. Mapowania
4.1.3.1. Dodanie mapowania:

insert into mappings (created_by, creation_date, modify_by, last_modify, synchronized employee_id, equipment_id, place_id) values (?,?,?,?, 0,?,?,?)

4.1.3.2. Edycja mapowania:

update mappings created_by=?, creation_date=?, modify_by=?, last_modify=?, synchronized=0  employee_id = ?, equipment_id = ?, place_id = ? where id = ?

4.1.3.3. Usunięcie mapowania:

delete from mappings where id = ?

4.1.3.4. Pobranie listy mapowań:

select m.id, m.creation_date, m.last_modify, m.synchronized, u.id, u.name, u.surname, u.login, u2.id, u2.name, u2.surname, u2.login, e.id, e.brand, e.model, e.serial_number, emp.id, emp.name, emp.surname, p.id, p.country, p.province, p.city 
from mappings m 
inner join equipment e on (m.equipment_id=e.id)  
inner join employees emp on (m.employee_id=emp.id) 
inner join places p (m.place_id=p.id) 
left outer join users u (m.created_by=u.id) 
left outer join users u2 (m.modify_by=u2.id)

4.1.3.5. Pobranie mapowania o podanym id:

select m.id, m.creation_date, m.last_modify, m.synchronized, u.id, u.name, u.surname, u.login, u2.id, u2.name, u2.surname, u2.login, e.id, e.brand, e.model, e.serial_number, emp.id, emp.name, emp.surname, p.id, p.country, p.province, p.city  
from mappings m 
inner join equipment e on (m.equipment_id=e.id)  
inner join employees emp on (m.employee_id=emp.id) 
inner join places p (m.place_id=p.id) 
left outer join users u (m.created_by=u.id)  
left outer join users u2 (m.modify_by=u2.id) 
where m.id = ?

4.1.4. Sprzęt
4.1.4.1. Pobranie listy sprzętu:

select id, brand, model, serial_number, synchronized from equipment

4.1.4.2. Pobranie sprzętu o wybranym id:

select id, brand, model, serial_number, synchronized from equipment where id = ?

4.1.4.3. Dodanie nowego sprzętu:

insert into equipment (brand, model, serial_number, synchronized) values (?,?,?,0)

4.1.4.4. Edycja wybranego sprzętu:

update equipment set brand = ?, model = ?, serial_number = ?, synchronized = 0 where id = ?

4.1.4.5. Usunięcie sprzętu:

delete from equipment where id = ?

4.1.5. Lokalizacje
4.1.5.1. Pobranie listy lokalizacji:

select id, country, province, city, postal_code, street, building, floor, room_number, synchronized from places

4.1.5.2. Pobranie lokalizacji o wybranym id:

select id, country, province, city, postal_code, street, building, floor, room_number, synchronized from places where id = ?

4.1.5.3. Dodanie lokalizacji:

insert into places (country, province, city, postal_code, street, building, floor, room_number, synchronized) values (?,?,?, ?,?,?, ?,?,?)

4.1.5.4. Usunięcie lokalizacji:

delete from places where id = ?

4.1.5.5. Edycja lokalizacji:

update places set country = ?, province = ?, city = ?, postal_code = ?, street = ?, building = ?, floor = ?, room_number = ?, synchronized = 0 where id = ?

4.1.6. Pracownicy
4.1.6.1. Pobranie listy pracowników:

select id, name, surname, date_of_birth, place_of_birth, pesel, email, msisdn, synchronized from employees;

4.1.6.2. Pobranie pracownika o wybranym id:

select id, name, surname, date_of_birth, place_of_birth, pesel, email, msisdn, synchronized from employees where id = ?

4.1.6.3. Dodanie pracownika:

insert into employees (name, surname, date_of_birth, place_of_birth, pesel, email, msisdn, synchronized) values (?,?,?,?, ?,?,?,0)\\

4.1.6.4. Edycja pracownika:

update employees set name=?, surname=?, date_of_birth=?, place_of_birth=?, pesel=?, email=?, msisdn=?, synchronized=0 where id = ?

4.1.6.5. Usunięcie pracownika:

delete from employees where id = ?

4.1.7. Raporty
Dane do raportów są pobierane do aplikacji z następujących widoków:

(definicje tych widoków w punkcie 1.3).
Zawierają one odpowiednio dane z ostatniego miesiąca, dane z ostatniego roku oraz sumaryczne dane. W każdym z tych widoków znajdują się informacje o:

Dane te pobierane są za pomocą zwykłego polecenia select, np.

select user_add, user_edit, user_delete, employee_add, employee_edit, employee_delete, equipment_add, equipment_edit, equipment_delete, localization_add, localization_edit, localization_delete, mapping_add, mapping_edit, mapping_delete, fixed_asset_add, fixed_asset_edit, fixed_asset_delete from last_year_report;

4.1.8. Administracja
4.1.8.1. Pobranie listy użytkowników:

select u.id as user_id, u.login as user_login, u.name as user_name, u.surname as user_surname, u.creation_date as user_creation_date, u.active as user_active, u.password as user_password, u.group_id , u.synchronized as user_synchronized, g.name as group_name, g.active as group_active 
from users u 
inner join groups g 
on (u.group_id = g.id)

4.1.8.2. Dodanie użytkownika:

insert into users 
(login, name, surname, creation_date, active, password, group_id, synchronized) 
values 
(?,?,?,now(), 1,?,?,0)

4.1.8.3. Usunięcie użytkownika:

delete from users where id = ?\\

4.1.8.4. Edycja użytkownika:

update users 
set login=?, name=?, surname=?, password=?, group_id=?, synchronized=0 
where id = ?

Raport końcowy

1. Implementacja bazy danych
Jako serwer bazy danych wybraliśmy MySQL w wersji 5.5. Utworzenie bazy danych oraz wszelkich bytów zostało wykonane poleceniami zawartymi w projekcie logicznym w punktach od 1.1 do 1.5.

2. Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych Na potrzeby projektu została wykonana aplikacja webowa w technologii Java EE z wykorzystaniem bibliotek i frameworków wymienionych w punkcie 8 niniejszego dokumentu.
Poniższe zrzuty ekranu prezentują ekrany do prezentacji, edycji oraz obsługi danych w naszej aplikacji:
a) logowanie do aplikacji:

Rys.1. Panel logowania.

b) wpisy do ewidencji środków trwałych:

Rys.2. Strona z ewidencją środków trwałych (otwarty panel dodawania nowego wpisu).

Rys.3. Edycja wpisu w ewidencji środków trwałych.

c) przeglądanie mapowań:

Rys.4. Strona z mapowaniami sprzęt-pracownik-lokalizacja.


Rys.5. Panel modalny ze szczegółami mapowania.

d) operacje na pracownikach:

Rys.6. Strona z operacjami na pracownikach.


Rys.7. Panel modalny z edycją pracownika.


Rys.8. Panel modalny prośbą potwierdzenia usunięcia pracownika.

e) operacje na sprzęcie:


Rys.9. Strona z operacjami na sprzęcie.


Rys.10. Panel modalny z edycją sprzętu.

f) operacje na lokalizacjach:


Rys.11. Strona z operacjami na lokalizacjach.

Rys.12. Panel modalny z edycją pracownika.

g) raporty:


Rys.13. Strona z raportami.

h) aplikacja android:

Rys.14. Menu główne aplikacji android.


Rys.15. Lista pokoi.


Rys.16. Lista pracowników.


Rys.17. Dodawanie usuwanie pracownika.


Rys.18. Lista środków trwałych.


Rys.19. Rozwiązywanie konfliktów.

3. Zdefiniowanie panelu sterowania aplikacji
Sterowanie aplikacją odbywa się za pomocą strony 'adminPanel' która umożliwia dodawanie użytkowników, ich edycję oraz usuwanie. Strona ta jest podzielona na kilka zakładek, w pierwszej z nich znajduje się wspomniane wcześniej zarządzanie użytkownikami, w drugiej zakładce możemy zarządzać rolami, które zostaną przypisane do grup. Grupy są wstępnie predefiniowane – mamy 4 grupy użytkowników. Nic nie stoi natomiast na przeszkodzie by w przyszłości wraz z rozwojem aplikacji dodać zakładkę, która umożliwi dodawanie nowych grup.


Rys.20. Strona z panelem administracyjnym, zawiera w sobie 3 zakładki.


Rys.21. Panel modalny z edycją użytkownika.


Rys.22. Strona z edycją ról przypisanych do poszczególnych grup.

4. Zdefiniowanie makropoleceń dla realizacji typowych operacji Dla wszelkich operacji CRUD na danych (wpisów do ewidencji środków trwałych, mapowań, użytkowników, pracowników, sprzętu i lokalizacji) zostały stworzone osobne ziarna bezstanowe EJB. Każda z metod operujących na danych rzuca odpowiednio utworzone w tym celu wyjątki, tak by administrator aplikacji był w stanie łatwo i szybko odnaleźć przyczynę błędu w aplikacji śledząc logi bądź komunikaty.

5. Uruchamianie i testowanie aplikacji Testy funkcjonalne aplikacji zostały wykonane przez nas samych. Testowaliśmy aplikację pod kątem spełnienia założeń zawartych we wcześniejszych dokumentach. Aplikacja pomyślnie przeszła testy.

6. Wprowadzanie danych Wprowadzanie danych odbywa się za pomocą formatek do tego przeznaczonych znajdują się one na każdej stronie naszej aplikacji pomiędzy menu aplikacji a tabelką wyświetlającą byty.

7. Opracowanie doświadczeń wynikających z realizacji projektu Praca nad aplikacją nauczyła nas współpracy oraz przyniosła nam wiele korzyści, m.in. poznanie nowych technologii klasy enterprise przydatnych w przyszłej pracy zawodowej, umiejętność tworzenia aplikacji mobilnych, które w obecnym czasie zdobywają rynek, a także integrację pomiędzy systemami, co również jest niezwykle przydatną umiejętnością. Pracując nad aplikacją niestety nie raportowaliśmy czasu pracy, który nad nią poświęciliśmy, więc trudnym jest oszacowanie kosztu aplikacji w mandays'ach. Podsumowując: cały proces tworzenia aplikacji był dla nas ciekawym doświadczeniem, które nas wiele nauczyło.

8. Wykaz literatury, załączniki
Wykorzystane technologie:

Przy opracowywaniu projektu korzystaliśmy z następującej dokumentacji w formie elektronicznej: