1. Projekt Konceptualny
Przedmiotem projektu jest opracowanie systemu przelewów do ZUS. W założeniach system ma udostępniać możliwość prowadzenia rachunku oraz dokonywanie z poziomu aplikacji web przelewu środków do ZUS. Ze względu na złożoną specyfikę zagadnienia nie ma możliwości pełnej implementacji systemu, umożliwiającą realizowanie tego typu operacji. W związku z tym główny nacisk położony został na dostarczenie użytkownikowi odpowiednio przygotowanego, intuicyjnego i funkcjonalnego interfejsu do realizacji tego typu operacji oraz przygotowanie logiki biznesowej zdolnej do przetwarzania danych, które następnie będą składowane w bazie.
1.2. Analiza wymagań użytkownika i wstępne określenie funkcjonalności.
„System przelewów do ZUS” będzie posiadał następujące funkcjonalności:
1. MUST:
Dwuetapowe logowanie do systemu
Dwuetapowy proces realizacji przelewu
Wyświetlanie listy wykonanych przelewów
Wyświetlanie szczegółów wykonanych przelewów
Wyświetlanie danych o dostępnych w systemie rachunkach
Wylogowanie z systemu
2. SHOULD:
3. COULD:
Rejestracja nowego użytkownika
Wysłanie wniosku o utworzenie konta w systemie
Wysyłanie wniosku o otworzenie nowego rachunku
4. WON'T:
1.3. Określenie scenariuszy użycia
1. Logowanie:
Użytkownik posiada konto w systemie, przydzielony numer Id oraz hasło.
Użytkownik nie jest zalogowany, przechodzi do pierwszej strony logowania.
Użytkownik wprowadza swój indywidualny numer ID i klika w przycisk zaloguj.
Następuje weryfikacja numeru ID i pobranie danych użytkownika.
Pojawia się drugie okno logowania, w którym użytkownik podaje swoje hasło.
Następuje weryfikacja podanych danych.
Jeśli wprowadzone dane są poprawne pojawia się okno główne systemu.
Jeśli wprowadzone dane nie są poprawne pojawia się informacja o błędnym logowaniu.
2. Przeglądanie listy własnych rachunków:
Użytkownik loguje się do systemu
Użytkownik przechodzi do zakładki Rachunki
Pojawia się lista dostępnych rachunków
3. Przeglądanie szczegółów wybranego rachunku:
Użytkownik loguje się do systemu
Użytkownik przechodzi do zakładki Rachunki
Pojawia się lista dostępnych rachunków
Użytkownik klika w zakładkę Szczegóły rachunku
Pojawiają się szczegóły pierwszego rachunku
Użytkownik ma możliwość zmiany rachunku z selektora
4. Przeglądanie historii przelewów:
Użytkownik loguje się do systemu
Użytkownik przechodzi do zakładki Historia
Pojawia się lista zrealizowanych przelewów
5. Przeglądanie szczegółów wykonanych przelewów:
Użytkownik loguje się do systemu
Użytkownik przechodzi do zakładki Historia
Pojawia się lista wykonanych przelewów
Użytkownik klika w zakładkę Szczegóły przelewów
Pojawiają się szczegóły ostatniego przelewu
Użytkownik ma możliwość zmiany przelewu z selektora
6. Realizacja przelewu:
Użytkownik loguje się do systemu
Użytkownik przechodzi do zakładki Przelew
Pojawia się formularz do wprowadzenia odpowiednich danych
Użytkownik wprowadza dana i klika przycisk Zatwierdź
System sprawdza poprawność danych
Jeśli dane okazały się poprawne wyświetlone zostają szczegóły przelewu
W celu zatwierdzenia przelewu użytkownik ponownie klika Zatwierdź
1.4. Identyfikacja funkcji
1. Przechowywanie danych o użytkownikach i danych do logowania
2. Składowanie i udostępnianie informacji o przelewach
3. Składowanie i udostępnianie informacji o rachunkach
1.5. Budowa i analiza diagramu przepływu danych
1. Logowanie
2. Przelew
3. Szczegóły wykonanych przelewów
4. Szczegóły rachunków
1.6. Wybór encji (obiektów) i ich atrybutów
W projekcie wyróżnione zostały następujące encje:
Rachunek:
Numer rachunku
Waluta
Saldo
Data otwarcia
Stan rachunku
Użytkownik:
Imię
Nazwisko
Telefon
Adres e-mail
Numer identyfikacyjny
Hasło
Stan użytkownika
Przelew:
Typ
Stan
Tytuł
Rachunek
Kwota
Waluta
Data
Dane beneficjenta
1.7. Projektowanie powiązań (relacji) pomiędzy encjami. Konstrukcja diagramu ERD (Entity-Relationship Diagram)
1.8. Projekt diagramów STD (State Transition Diagram – diagramy przejść pomiędzy stanami)
2. Projekt Logiczny
2.1. Projekt encji
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
private int acc_id;
private String acc_no = "";
private String acc_currency = "";
private double acc_balance;
private Date acc_open_date;
private String acc_closed = "";
public int getAcc_id() {
return acc_id;
}
public void setAcc_id(int acc_id) {
this.acc_id = acc_id;
}
public String getAcc_no() {
return acc_no;
}
public void setAcc_no(String acc_no) {
this.acc_no = acc_no;
}
public String getAcc_currency() {
return acc_currency;
}
public void setAcc_currency(String acc_currency) {
this.acc_currency = acc_currency;
}
public double getAcc_balance() {
return acc_balance;
}
public void setAcc_balance(double acc_balance) {
this.acc_balance = acc_balance;
}
public Date getAcc_open_date() {
return acc_open_date;
}
public void setAcc_open_date(Date acc_open_date) {
this.acc_open_date = acc_open_date;
}
public String getAcc_closed() {
return acc_closed;
}
public void setAcc_closed(String acc_closed) {
this.acc_closed = acc_closed;
}
public class Transfer implements Serializable {
private static final long serialVersionUID = 1L;
private int trn_id;
private String trn_state = "";
private String trn_acc_no = "";
private double trn_amount;
private String trn_benef_acc_no = "";
private String trn_currency = "";
private String trn_title = "";
private Date trn_date;
public int getTrn_id() {
return trn_id;
}
public void setTrn_id(int trn_id) {
this.trn_id = trn_id;
}
public String getTrn_state() {
return trn_state;
}
public void setTrn_state(String trn_state) {
this.trn_state = trn_state;
}
public String getTrn_acc_no() {
return trn_acc_no;
}
public void setTrn_acc_no(String trn_acc_no) {
this.trn_acc_no = trn_acc_no;
}
public double getTrn_amount() {
return trn_amount;
}
public void setTrn_amount(double trn_amount) {
this.trn_amount = trn_amount;
}
public String getTrn_benef_acc_no() {
return trn_benef_acc_no;
}
public void setTrn_benef_acc_no(String trn_benef_acc_no) {
this.trn_benef_acc_no = trn_benef_acc_no;
}
public String getTrn_currency() {
return trn_currency;
}
public void setTrn_currency(String trn_currency) {
this.trn_currency = trn_currency;
}
public String getTrn_title() {
return trn_title;
}
public void setTrn_title(String trn_title) {
this.trn_title = trn_title;
}
public Date getTrn_date() {
return trn_date;
}
public void setTrn_date(Date trn_date) {
this.trn_date = trn_date;
}
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int user_id;
private String usr_state = "";
private String usr_login_id = "";
private String usr_name = "";
private String usr_surname = "";
private Date usr_born_date;
private String usr_pesel = "";
private String usr_phone = "";
private String usr_mail = "";
private String usr_nip = "";
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUsr_state() {
return usr_state;
}
public void setUsr_state(String usr_state) {
this.usr_state = usr_state;
}
public String getUsr_login_id() {
return usr_login_id;
}
public void setUsr_login_id(String usr_login_id) {
this.usr_login_id = usr_login_id;
}
public String getUsr_name() {
return usr_name;
}
public void setUsr_name(String usr_name) {
this.usr_name = usr_name;
}
public String getUsr_surname() {
return usr_surname;
}
public void setUsr_surname(String usr_surname) {
this.usr_surname = usr_surname;
}
public Date getUsr_born_date() {
return usr_born_date;
}
public void setUsr_born_date(Date usr_born_date) {
this.usr_born_date = usr_born_date;
}
public String getUsr_pesel() {
return usr_pesel;
}
public void setUsr_pesel(String usr_pesel) {
this.usr_pesel = usr_pesel;
}
public String getUsr_phone() {
return usr_phone;
}
public void setUsr_phone(String usr_phone) {
this.usr_phone = usr_phone;
}
public String getUsr_mail() {
return usr_mail;
}
public void setUsr_mail(String usr_mail) {
this.usr_mail = usr_mail;
}
public String getUsr_nip() {
return usr_nip;
}
public void setUsr_nip(String usr_nip) {
this.usr_nip = usr_nip;
}
2.2. Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ERD
CREATE TABLE "ACCOUNTS"
(
"ACC_ID" serial NOT NULL, -- Identyfikator rachunku
"ACC_NO" character(30), -- Numer rachunku
"ACC_CURRENCY" character(3), -- Waluta rachunku
"ACC_BALANCE" double precision, -- Saldo księgowe rachunku
"ACC_OPEN_DATE" date, -- Data otwarcia rachunku
"ACC_CLOSED" character(1) DEFAULT 'N'::bpchar, -- Czy rachunek zamknięty
"ACC_BANK_ID" integer, -- Idenyfikator rachunku w systemie bankowym
CONSTRAINT "ACC_ID_PK" PRIMARY KEY ("ACC_ID" )
)
CREATE TABLE "DICTIONARIES_DEF"
(
"DICT_NAME" character(20), -- Nazwa słownika
"DICT_ID" serial NOT NULL, -- Identyfikator słownika
"DICT_CODE" character(20), -- Kod słownika
CONSTRAINT "DICT_ID_PK" PRIMARY KEY ("DICT_ID" )
)
CREATE TABLE "DICTIONARIES_VALUE"
(
"DICT_ID" integer, -- Identyfikator słownika
"DICT_CODE" character(10), -- Kod
"DICT_MEANING" character(100), -- Znaczenie
"DICT_LANG" character(10), -- Język rekordu
CONSTRAINT "DICT_ID_FK" FOREIGN KEY ("DICT_ID")
REFERENCES "DICTIONARIES_DEF" ("DICT_ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE "TRANSFER"
(
"TRN_STATE" character(2),
"TRN_TYPE" character(3),
"TRN_ACC_ID" integer,
"TRN_USR_ID" integer,
"TRN_AMOUNT" double precision, -- Kwota przelewu
"TRN_CURRENCY" character(3), -- Waluta przelewu
"TRN_TITLE" character(100), -- Tytuł przelewu
"TRN_DATE" date, -- Data przelewu
"TRN_CHANNEL" character(3), -- Kanał złożenia zlecenia (WWW, TEL)
"TRN_ID" serial NOT NULL,
"TRN_BNF_ACCOUNT" character(26),
"TRN_NIP" character(10),
"TRN_EID_TYPE" character(1),
"TRN_EID_VALUE" character(15),
"TRN_DEC_1" character(6),
"TRN_DEC_2" character(2),
"TRN_DEC_NO" character(20), -- Numer decyzji
"TRN_NOTE" character(100), -- Notatka
CONSTRAINT "TRN_ID_PK" PRIMARY KEY ("TRN_ID" ),
CONSTRAINT "TRN_ACC_ID_FK" FOREIGN KEY ("TRN_ACC_ID")
REFERENCES "ACCOUNTS" ("ACC_ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "TRN_USR_ID_FK" FOREIGN KEY ("TRN_USR_ID")
REFERENCES "USER" ("USR_ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE "USER"
(
"USR_ID" serial NOT NULL, -- Identyfikator użytkownika
"USR_STATE" character(1), -- Stan użytkownika
"USR_LOGIN_ID" character(8),
"USR_NAME" character(20),
"USR_SURNAME" character(20),
"USR_PASSWORD" character(15), -- Hasło
"USR_BORN" date, -- Data urodzenia
"USR_PHONE" character(10), -- Numer telefonu
"USR_EMAIL" character(20), -- Adres e-mail
"USR_PESEL" character(11), -- Numer pesel
"USR_NIP" character(10), -- Numer NIP
CONSTRAINT "USR_ID_PK" PRIMARY KEY ("USR_ID" )
)
CREATE TABLE "USER_ACCOUNTS"
(
"USR_ID" integer, -- Identyfikator użytkownika
"ACC_ID" integer, -- Identyfikator rachunku
"USR_ACC_TYPE" character(1) -- Typ przynależności
)
CREATE TABLE "ZUS_TRANSFER"
(
"ZTR_TRN_ID" integer, -- Identyfikator przelewu
"ZTR_DOC_TYPE" character(1), -- Typ dokumentu (1 - dowód os., 2 - paszport, P - PESEL, R - REGON)
"ZTR_NIP" character(10), -- NIP max. 10 znaków
"ZTR_PAYMENT_TYPE" character(1), -- Typ wpłaty: ...
"ZTR_USR_NAME" character(100), -- Nazwa płatnika
"ZTR_DECLARATION_NO" character(2), -- Nr deklaracji (kod 2-cyfrowy od 00 do 99)
"ZTR_AGREEMENT_NO" character(15), -- Nr decyzji / umowy / tytułu wykonawczego
"ZTR_DECLARATION_1" integer,
"ZTR_DOK_ID" integer, -- Identyfikator dokumentu
CONSTRAINT "TRN_ID_FK" FOREIGN KEY ("ZTR_TRN_ID")
REFERENCES "TRANSFER" ("TRN_ID") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
2.3. Projektowanie operacji na danych
pobranie danych użytkownika na podstawie ID:
SELECT "USR_ID","USR_STATE","USR_LOGIN_ID","USR_NAME","USR_SURNAME","USR_BORN","USR_PHONE","USR_EMAIL","USR_PESEL","USR_NIP" FROM "USER" WHERE "USR_LOGIN_ID" = 'P_ID';
pobranie listy rachunków dla klienta:
SELECT "ACCOUNTS"."ACC_ID","ACC_NO","ACC_CURRENCY","ACC_BALANCE","ACC_OPEN_DATE","ACC_CLOSED" FROM "ACCOUNTS","USER_ACCOUNTS" WHERE "USR_ID" = 'USR_ID';
pobranie historii przelewów dla klienta:
SELECT "TRN_STATE","TRN_AMOUNT","TRN_CURRENCY","TRN_DATE","TRN_ID","TRN_BNF_ACCOUNT","ACCOUNTS"."ACC_NO","TRN_NOTE" FROM "TRANSFER","ACCOUNTS" WHERE "TRN_USR_ID" = 'USR_ID';
dodanie nowego przelewu do bazy:
INSERT INTO "TRANSFER"("TRN_STATE","TRN_TYPE","TRN_ACC_ID","TRN_USR_ID","TRN_AMOUNT","TRN_CURRENCY","TRN_DATE","TRN_CHANNEL","TRN_BNF_ACCOUNT","TRN_NIP","TRN_EID_TYPE",
"TRN_EID_VALUE","TRN_DEC_1","TRN_DEC_2","TRN_DEC_NO","TRN_NOTE") VALUES ('TRN_STATE','TRN_ACC_ID','TRN_USR_ID','TRN_AMOUNT','TRN_CURRENCY','TRN_DATE','TRN_CHANNEL','TRN_BNF_ACCOUNT',
'TRN_NIP','TRN_EID_TYPE','TRN_EID_VALUE','TRN_DEC_1','TRN_DEC_2','TRN_DEC_NO','TRN_NOTE')
3. Raport końcowy
3.1. Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych
1. Logowanie
2. Przelew
3. Historia przelewów
4. Rachunki
3.2. Zdefiniowanie panelu sterowania aplikacji
W przypadku tej aplikacji nie było potrzeby tworzenia panelu sterowania. Jednak ciekawym rozwiązaniem może być opracowanie zewnętrznej aplikacji do zarządzania i realizowania przelewów.
3.3. Zdefiniowanie makropoleceń dla realizacji typowych operacji
3.4. Uruchamianie i testowanie aplikacji
Aplikacja była testowana w środowisku lokalnym. Testy aplikacji odbywały się z wykorzystaniem serwera aplikacji JBoss Application Server w wersji 7.1.1 oraz bazy danych PostgreSQL w wersji .
3.5. Wprowadzanie danych
W opracowanym projekcie nie istniała potrzeba migracji dotychczasowych danych, jednak ze względu na specyfikę systemu, ręcznie dodane zostały dane klientów. Wszystkie pozostałe dane wprowadzane są do systemu przy pomocy interfejsu WWW przez użytkowników.
3.6. Wdrażanie systemu do użytkowania
Wdrażanie aplikacji polega na instalacji serwera baz danych oraz serwera aplikacyjnego oraz serwera WWW. Aby utworzyć schemat bazy danych należy uruchomić odpowiedni skrypt. Następnie w konsoli administracyjnej serwera aplikacji należy odpowiedni DataSource oraz do katalogu deployments odpowiedni plik ear. W konfiguracji serwera WWW należy utworzyć dwa moduły login oraz app i podać w nich ścieżki do odpowiednich plików war. Aplikacji powinna być dostępna z poziomu przeglądarki WWW.
3.7. Przeprowadzenie szkolenia użytkowników
W przypadku opracowanej aplikacji nie ma potrzeby przeprowadzania szkolenia użytkowników. Aplikacja jest intuicyjna i podczas jej użytkowania nie powinny pojawić się żadne problemy.
3.8. Zapewnienie dokumentacji technicznej i użytkowej
Niniejsza dokumentacja spełnia wszystkie wymagania klienta pod względem wdrożenia oraz późniejszej obsługi aplikacji.
3.9. Zapewnienie obsługiwania systemu po wdrożeniu
System jest samodzielną aplikacją i nie wymaga dodatkowej obsługi po wdrożeniu.
3.10. Rozwijanie i modyfikowanie aplikacji
Aplikacja może być rozwijana i modyfikowana po wcześniejszym wykryciu jej niedoskonałości oraz w przypadku rozszerzenia funkcjonalności.
3.11. Opracowanie doświadczeń wynikających z realizacji projektu