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.
„System przelewów do ZUS” będzie posiadał następujące funkcjonalności:
1. MUST:
2. SHOULD:
3. COULD:
4. WON'T:
1. Logowanie:
2. Przeglądanie listy własnych rachunków:
3. Przeglądanie szczegółów wybranego rachunku:
4. Przeglądanie historii przelewów:
5. Przeglądanie szczegółów wykonanych przelewów:
6. Realizacja przelewu:
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
W projekcie wyróżnione zostały następujące encje:
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; }
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 )
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')
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.
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 .
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.
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.
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.
Niniejsza dokumentacja spełnia wszystkie wymagania klienta pod względem wdrożenia oraz późniejszej obsługi aplikacji.
System jest samodzielną aplikacją i nie wymaga dodatkowej obsługi po wdrożeniu.
Aplikacja może być rozwijana i modyfikowana po wcześniejszym wykryciu jej niedoskonałości oraz w przypadku rozszerzenia funkcjonalności.