Reklama jest kluczowym zagadnieniem dla każdego przedsiębiorstwa. Jednym z popularniejszych mediów przekazuw obecnych czasach staje się Internet. Dla przedsiębiorstw z liczną ofertą produktów ogłoszenia detaliczne, zamieszczane w dedykowanych serwisach internetowych, stają się niezbędnym elementem kampanii reklamowej. Podczas pracy natknąłem się na deficyt programów które umożliwiają zamieszczanie ogłoszeń na kilku portalach jednocześnie. Powstał pomysł na stworzenie oprogramowania które wypełniało by lukę na rynku programów do zarządzania reklamą. Program AdTamer ma za zadanie kompleksowe zarządzanie ogłoszeniami zamieszczonymi w serwisach internetowych. Sparowany z bazą danych klienta będzie reagował na zmiany w ofercie. Ogłoszenia nie aktywne będą usuwane a nowe towary będą proponowane do wystawienia. Głównym celem programu jest zminimalizowanie czasu potrzebnego do zarządzania ogłoszeniami oraz wprowadzenie ścisłej kontroli nad nimi. Takie rozwiązanie pozwoli uzyskać klientowi znaczącą przewagę jeśli chodzi o rynek internetowy nad konkurencją ponieważ jego oferta będzie doskonale widoczna i zawsze aktualna przy minimalnym nakładzie sił.
Analiza stanu wyjściowego
Z uwagi na znaczną ilość istniejących portali ogłoszeniowych oraz wstępne zainteresowanie ze strony klienta podobnym rozwiązaniem projekt został ograniczony do portali w branży maszyn budowlanych. Jednocześnie na chwile obecną przewidziane jest sparowanie z już istniejącym oprogramowaniem Integra ( Opis programu: http://www.integra.info.pl/info.php?page=integrafirma) . Program nie udostępnia żadnego interfejsu komunikacyjnego z zewnętrznymi programami. Oprogramowanie Integra korzysta z serwera SQL Server 2000 dzięki czemu możliwe jest pobieranie danych wprowadzonych przez użytkownika. Dodatkowo wykorzystywany jest na serwerze klienta serwer FTP do zarządzania zdjęciami dodanymi w programie. Z uwagi na poufność informacji biznesowych, dostęp do serwera w tym bazy danych i serwera FTP jest możliwy jedynie z wewnątrz sieci klienta. Program docelowo ma zamieszczać ogłoszenia na portalu ogłoszeniowym klienta, na którym znajduje się baza danych MySQL 5.0 oraz w zewnętrznych serwisach internetowych za pośrednictwem mechanizmu Web Services. Należy dodać, że program Integra jest dedykowany dla branży samochodowej gdzie jeden produkt pasuje do kilku pojazdów lub jest stosowany jako zamiennik. Cecha ta musi zostać uwzględniona podczas tworzenia programu AdTamer tak by ten korzystała z bazy wiedzy klienta o zamiennikach.
Analiza wymagań użytkownika
Do podstawowych funkcjonalności systemu należą:
Zarządzanie ogłoszeniami w tym dodawania, edycja, usuwanie w serwisach internetowych
Mechanizm przeszukiwania towarów pod kątem nie zamieszczonych lub nieaktualnych ogłoszeń. Z dodatkowym mechanizmem filtracji po Kategorii, pod kategorii, cenie, ilości sztuk
Mechanizm przeszukiwania ogłoszeń pod kątem nieaktualnych ogłoszeń. Z dodatkowym mechanizmem filtracji po polach: Czas zamieszczenia, czas edycji, zmiany na magazynie
Sygnalizacja zmian w towarach na magazynie pod kątem nieaktualności informacji w ogłoszeniach.
Wymagania związane z bezpieczeństwem systemu:
Zachowanie bezpieczeństwa danych po przez system identyfikacji i autoryzacji użytkowników
Zachowanie bezpieczeństwa poprzez brak przechowywania jakichkolwiek danych wrażliwych w źródle programu
Zachowanie wszystkich zmian wprowadzonych przez użytkowników z możliwością odtworzenia historii operacji.
Łatwe dodawanie obsługi kolejnych serwisów internetowych przez mechanizm plug in
Dodatkowe wymagania:
Brak przestojów w czasie pracy programu podczas operacji wejścia-wyjścia
Program AdT amer w żaden sposób nie może ingerować w baze danych programu Integra
Możliwie jak największe zautomatyzowanie procesu tworzenia ogłoszenia po przez przepisanie z Towaru do ogłoszenia danych, generacja tytułów oraz automatyczny wybór kategorii i pod kategorii w serwisie.
Przyśpieszenie wyszukiwania powtarzalnych typów ogłoszeń jak i towarów.
Program umożliwia prace w trybie offline
Możliwie łatwe dobudowanie obsługi nowych serwisów
Określenie przypadków oraz scenariuszy użycia
Ordered List Item
Logowanie do systemu - Użytkownik podaje swój login oraz hasło, na podstawie tych informacji wyświetlane w programie są opcje do których jest dopuszczony.
Zmiana ustawień konta – Użytkownik zmienia swoje hasło dostępu do programu.
Dodawanie nowego użytkownika – Po wybraniu opcji nowego użytkownika administrator nadaje login oraz hasło, ponadto przydziela prawa dostępu do funkcji w programie.
Tworzenie ogłoszenia – użytkownik po wybraniu Towaru przechodzi do panelu tworzenia nowego ogłoszenia gdzie wybiera serwis/serwisy w jakim ma być zamieszczone ogłoszenie, wybiera wzorcowy tytuł oraz treść ogłoszenia, wybiera zdjęcia a następnie generuje ogłoszenia na podstawie wcześniej wybranych opcji. Po zatwierdzeniu ogłoszenie jest zamieszczane w wybranych serwisach. [ Scenariusz użycia: Użytkownik wybiera silnik spalinowy Deutz 913, ogłoszenie ma być zamieszczone w serwisie
www.maszynybudowlane-czesci.pl oraz
www.tabor24.pl, wybrany towar pasuje do 35 maszyn m. in. Liebher 564, Liebher 912, Cat 320 z czego użytkownik wybiera Liebherra 564 oraz Cat 320 do generowania ogłoszeń. Podaje tytuł w szablonie: „Silnik spalinowy do [marka][typ]”, w treści : „W doskonałym stanie używany silnik spalinowy do [marka][typ]”, dodatkowo wybiera 2 zdjęcia z 5 które mają być zamieszczone, następnie generowane są 4 ogłoszenia z odpowiednio wpisanymi markami i typami. Podczas generacji z szablonu kategorii maszyn budowlanych dla strony
www.maszynybudowlane-czesci.pl zaznaczona zostaje kategoria: silniki spalinowe, podkategoria: Perkins, z kolei na stronie
www.tabor24.pl, kategoria: maszyny budowlane, podkategoria: części, użytkownik zmienia podkategorie dla strony
www.tabor24.pl na podzespoły i zatwierdza wszystkie ogłoszenia. Następnie ogłoszenia zostają wgrane na odpowiednie serwisy]
Przeszukiwanie towarów – użytkownik otwiera panel wyszukiwania, zostaje mu wyświetlona lista pierwszych kilkudziesięciu najnowszych pozycji na magazynie, wyszukuje m. in. Po polach: kategoria, podkategoria, marka, typ oraz innych, jeżeli odnajdzie poszukiwany towar, może kliknąć na niego dwa razy aby przeglądnąć szczegółowe informacje na jego temat. [Scenariusz użycia: Użytkownik postanawia znaleźć Silnik spalinowy Cummins v5, pasujący do marki Liebherr, z przebiegiem nie większym jak 5000 moto godzin. Wybiera kategorie silniki spalinowe, podkategorie Cummins, z rozwijanej listy marke Liebherr, w polu odpowiadającym motogodziną wpisuje <5000. Wyświetlona zostaje lista 3 silników pasujących do danego kryterium wyszukiwania, użytkownik klika na pierwszy na liście po czym klika na przycisk cofnij by zobaczyć inne silniki w tym samym wyszukiwaniu, klika na drugi z kolei po czym wyłącza okienko]
Przeglądanie towarów – po wybraniu towaru zostają wyświetlone informacje o ogłoszeniach związanych z danym towarem. Użytkownik może zobaczyć takie dane jak ilość ogłoszeń ogółem, ilość ogłoszeń zamieszczonych w danym serwisie, ogłoszeń które wymagają jego uwagi. Pojawiaj się lista ogłoszeń z której można przejść do konkretnego ogłoszenia oraz opcja dodania nowego ogłoszenia do towaru.
Przeglądanie ogłoszeń – użytkownik otwiera panel wyszukiwania ogłoszeń, gdzie zostaje mu wyświetlona lista kilkudziesięciu ostatnio zamieszczonych ogłoszeń. Może przeszukiwać ogłoszenia po takich polach jak Tytuł ogłoszenia, Kategorii i podkategorii w programie Integra, Dacie zamieszczenia w serwisie, serwisie w jakim zostało zamieszczone, ilość sztuk na magazynie towaru, osobie która go edytowała, numeru katalogowego, numeru identyfikacyjnego ogłoszenia.
Zaaplikowanie predefiniowanego filtru przeglądania ogłoszeń i towarów– użytkownik może wybrać z listy filtrów filtr wypełniający pola wyszukiwania według podanych wcześniej parametrów [Scenariusz użycia: Użytkownik podczas przeglądania ogłoszeń chciał wyświetlić wszystkie ogłoszenia dla których liczba sztuk towarów na magazynie wynosi 0. W tym celu wybrał z listy filtrów : Puste stany magazynowe. Po wybraniu filtru pole związane ze stanem magazynowym zostało wypełnione i następnie lista wyświetlanych ogłoszeń została uzupełniona]
Dodanie nowego filtru – użytkownik podał dane do wyszukiwania, następnie wybrał opcje zapisu jako nowy filtr, po podaniu nazwy dla filtru zostaje zapisany
Edycja ogłoszenia – Użytkownik po wyborze ogłoszenia może zmienić jego tytuł, treść, kategorie, podkategorie, wyróżnienie w serwisie. Dodatkowo może zostać dodana notatka do ogłoszenia lub zaznaczony tag np. uwaga, nieaktualne. Po zatwierdzeniu zmian ogłoszenia zostają wgrane na wybrane serwisy. [Scenariusz użycia: Użytkownik znalazł podczas przeglądania zewnętrznego serwisu internetowego ogłoszenie które może być nieaktualne, przeszedł do panelu przeglądania ogłoszeń, w mejsce filtru dla identyfikatora ogłoszeń przepisał znaleziony identyfikator w serwisie. Na liście ogłoszeń pojawiło się jedno ogłoszenie. Po wybraniu go został wyświetlony panel edycji. Ogłoszenie zostało oznaczone jako nieaktywne, następnie po zatwierdzeniu zmian uaktualnione(skasowane) w serwisie]
Analiza hierarchii funkcji projektowanej aplikacji
Budowa i analiza diagramu przepływu danych
Data Context Diagram
DFD 0 Level
DFD 1
DFD 2
DFD3
Wybór encji (obiektów) i ich atrybutów.
Wybrane encje dla programu AdTamer:
Advertisments
AdvertismentsPhotos
Articles
Services
CategoriesTranslations
ServiceCategories
Tags
Users
UserTypes
UserTypesPrivilages
Privilages
Ponadto program AdTamer będzie pośrednio przez widoki łączył się z bazą danych programu Integra i wykorzystywał encje:
Towary
TowaryPojazdy
StanyTowarow
GrupyTowarow
PodgrupyTowarow
Wylisotowane encje bedą udostępnione w bazie danych jako ich okrojone widoki:
Towary → ArticlesIntegra
TowaryPojazdy → ArticlesMachinesIntegra
StanyTowarow → ArticlesQuantitiesIntegra
GrupyTowarow → ArticlesGroupsIntegra
PodgrupyTowarow → ArticlesSubgroupsIntegra
Projektowanie powiązań (relacji) pomiędzy encjami.
Projekt diagramów STD
Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ERD
Z uwagi na wykorzystanie dwóch baz danych w których jedna jest odpowiedzialna za przechowywanie danych programu AdTamer (nazywaną AdTamerDB) a druga z kolei za ich dostarczanie z programu integra (nazywaną IntegraDB). Została podjęta decyzja by dane pobierane z bazy IntegraDB były udostępnione jako widoki dla bazy AdTamerDB. Głównym powodem dla którego została podjęta taka decyzja było by przy wykorzystaniu obiektowo-relacyjnego mapowania w docelowym programie było ono możliwie najprostsze. Minusem tej metody jest z kolei brak możliwości ustawienia kluczy pomiędzy widokami z bazy IntegraDB a tabelami z bazy AdTamerDB. Tego typu niejednoznaczność występuje w dwóch tabelach: Articles (pole id), ServiceCategories (pole idCategoryIntegra, idSubCategoryIntegra). Rozwiązaniem jeszcze nie zaimplementowanym w bazie było by dodanie trigerów, który sprawdzały by istnienie danego pola w odpowiednim widoku. Poniżej znajduje się diagram tabel dla bazy AdTamerDb.
Słowniki danych
Advertisments - przechowuje informacje dotyczące pojedynczego ogłoszenia przynależącego do artykułu i zamieszczonego w konkretnym serwisie
id - Large Unsigned Number, Req'd, PK, identyfikator główny reklamy
version - Large Signed Number, Req'd, PK, wersja danego ogłoszenia
idCategory - Large Signed Number, Req'd, FK, kategoria/podkategoria do jakiego przynależy dane ogłoszenie w serwisie
idEditedBy - Large Signed Number, Req'd, FK, przez kogo zostało edytowane do nowej wersji ogłoszenie
idArticle - Large Signed Number, Req'd, FK, do jakiego ogłoszenia odności się dane ogłoszenie
idTag - Large Signed Number, FK, dodatkowy znacznik, opis ogłoszenia
recentCheckOut - Small Time stamp (auto), Req'd, kiedy dany element był zapisany
removed - Small True/False, Req'd, opisuje czy dany element jest usunięty
comments - SBCS VarChar(max), Req'd, komentarze do danego ogłoszenia
title - SBCS VarChar(300), Req'd, tytuł ogłoszenia zamieszczany w zewnętrznym serwisie
description - SBCS Large VarChar, Req'd, opis ogłoszenia zamieszczany w zewnętrznym serwisie
AdvertismentsPhotos - łączy zdjęcia zapisane na serwerze ftp z ogłoszeniami
idAdvertisment - Large Signed Number, Req'd, PK, FK, id ogłoszenia do którego ma być powiązane zdjęcie
version - Large Signed Number, Req'd, PK, FK, wersja ogłoszenia do którego ma być powiązane zdjęcie
photoName - SBCS VarChar(300), Req'd, PK, nazwa zdjęcia na serwerze ftp
Articles - zawiera dodatkowe informacje, nie zamieszczone w bazie integra odnośnie towarów
id - Large Signed Number, Req'd, PK, klucz główny odnoszący się do pojedynczego artykułu w bazie integra
idTag - Large Signed Number, dodatkowy znacznik
recentCheckOut - Small Time stamp (auto), Req'd, data ostatniej modyfikacji
noticeable - Small True/False, Req'd, znacznik opisu czy dany artykuł powinien być brany pod uwage w bardziej zawansowanych wyszukiwaniach
comments - SBCS VarChar(max), dodatkowy komentarz odnoszący się do artykułu
ArticlesGroupsIntegra - zbiór kategorii występujących w programie Integra
id - Large Signed Number, Req'd, PK, klucz główny dla kategorii
active - Small True/False, Req'd, odpowiada za to czy dana kategoria jest aktywna(wyświetlana)
timestamp - Small Time stamp (auto), Req'd, czas modyfikacji
name - SBCS VarChar(45), Req'd, mazwa kategorii
ArticlesIntegra - Towary zamieszczone w bazie Integra
id - Large Signed Number, Req'd, PK, identyfikator główny towaru
idSubgroup - Large Signed Number, FK, pod kategoria do jakiej nalezy towar
idGroup - Large Signed Number, FK, kategoria do jakiej nalezy towar
active - Small True/False, odpowiada za to czy dany towar jest widoczny dla użytkownika(w programie równoważne z usunięciem)
timestamp - Small Time stamp(auto), czas ostatniej modyfikacji
catalogNumber - SBCS VarChar(100), numer katalogowy występujący na towarze
otherNumber - SBCS VarChar(100), dodatkowe oznakowanie
name - SBCS VarChar(128), pełna nazwa towaru
shortCut - SBCS VarChar(30), skrócona nazwa towaru
comments - SBCS VarChar(100), komentarze dodatkowe
frozen - Small True/False, odpowiada czy dany element może być modyfikowany
remind - Small True/False, dodatkowa informacja czy dany towar powinien być wyróżniony
comments2 - SBCS VarChar(100), dodatkowe komentarze
nameGroup - SBCS VarChar(45), nazwa kategorii do jakiej należy dany towar
nameSubgroup - SBCS VarChar(45), nazwa pod kategorii do jakiej należy dany towar
nameProducent - SBCS VarChar(50), nazwa producenta
descriptionShort - SBCS VarChar(300), krótki opis towaru
fullDecription - SBCS VarChar(1000), pełny opis towaru
photo - Small True/False, czy dany towar posiada zdjęcie
photoName - SBCS VarChar(100), poczatkowa nazwa zdjecia ( przechowywane sa na ftp photoName_number)
ArticlesMachinesIntegra - przypisanie informacji do której maszyny podchodzi * id - Large Signed Number, Req'd, PK, identyfikator główny
id - Large Signed Number, id maszyny
active - Small True/False,Req'd, czy dana maszyna powinna być pokazywana(równoznaczne z usunięciem jeżeli False)
timestamp - Large Time stamp(auto), czas ostatniej modyfikacji
idArticle - Large Signed Number, Req'd, towar który pasuje do danej maszyny
idMark - Large Signed Number, marka maszyny
idModel - Large Signed Number, model maszyny
idVersion - Large Signed Number, dodatkowe informacje o wersji
ArticlesQuantitiesIntegra - stany magazynowe
id - Large Signed Number, Req'd, PK, identyfikator danego stanu
idArticle - Large Signed Number, Req'd, Towar
idMagazine - Large Signed Number, magazyn na jakim znajduje się dana ilość
state - Large Floating point, stan magazynowy
priceGroupNetto - Large Floating point, cena za jednostke netto
priceGroupBrutto - Large Floating point, cena za jednostke brutto
ArticlesSubgroupsIntegra - pod kategorie występujące w programie integra
id - Large Signed Number, Req'd, identyfikator główny podkategorii
idSubgroupArticle - Large Signed Number, podległa pod grupa
active - Small True/False, Req'd, czy jest aktywna
timestamp - Small Time stamp (auto), Req'd, czas ostatniej modyfikacji
name - SBCS VarChar(45), nazwa danej podkategorii
CategoriesTranslations - tabela tłumacząca
id - Large Signed Number, Req'd, PK, identyfikator kategorii
idService - Large Signed Number, Req'd, PK, serwis do którego odnosi się dane tłumaczenie
idParentCategory - Large Signed Number, opcjonalna kategoria główna dla podkategorii
idCategoryIntegra - Large Signed Number, Req'd, FK, kategoria z bazy integra do ktorej odnosi sie tlumaczenie
idSubacategory - Large Signed Number, Req'd, FK, pod kategoria z bazy integra do ktorej odnosi sie tlumaczenie
Privilages - prawa dostępu występujące w systemie
id - Large Signed Number, Req'd, PK, identyfikator główny uprawnienia
name - SBCS VarChar(100), Req'd, wyświetlana nazwa uprawnienia
description - SBCS VarChar(100), Req'd, dodatkowy opis uprawnienia
ServiceCategories - kategorie występujące w zewnętrznych serwisach, odpowiada za stworzenie struktury drzewiastej kategori występujących w zewnętrznych serwisach
id - Large Singed Number, Req'd, PK, identyfikator główny
idService - Large Signed Number, Req'd, FK, serwis do ktorego odnosi sie dane połączenie
idParentCategory - Large Signed Number, kategoria nadrzędna w stosunku do obecnej
name - SBCS VarChar(100), Req'd, nazwa kategorii
Services - obsługiwane serwisy zewnętrzne
id - Large Signed Number, Req'd, PK, identyfikator główny serwisu
identyfier - SBCS VarChar(250), Req'd, specjalny klucz/odcisk biblioteki obsługujacej
login - SBCS Varchar(100), login wykorzystywany w serwisie
password - SBCS Varchar(250), hasło wykorzysytwane w serwisie
name - SBCS Varchar(25), nazwa danego serwisu
description - SBCS Varchar(300), opis serwisu
added - Datetime, Req'd, czas dodania serwisu
Tags - dodatkowe znaczniki opisu
id - Large Signed Number, Req'd, PK, identyfikator główny
name - SBCS Varchar(100), Req'd, nazwa danego tagu
color - SBCS Varchar(100), Req'd, kolor zestawiony z danym znacznikiem
priority - Large Signed Number, Req'd, priorytet danego tagu interpretowany na poziomie programu
type - Large Signed Number, typ zastosowania danego tagu
Users - uzytkownicy wystepujący w systemie
id - Large Signed Number, Req'd, PK, identyfikator główny uzytkownika
login - SBCS Varchar(50), Req'd, login użytkownika
password - SBCS Varchar(250), Req'd, zahaszowane hasło uzytkownika
idUserType - Large Signed Integer, FK, typ konta użytkownika
inactive - True/False Small, Req'd, czy dany użytkownik może korzystać z systemu(równoważne z usunięciem)
UserTypes - typy użytkowników występujących w systemie
id - Large Signed Number, Req'd, PK, identyfikator główny typu użytkownika
name - SBCS Varchar(100), Req'd, nazwa typu użytkownika
description - SBCS Varchar(200), Req'd, opis typu użytkownika
UserTypesPrivilages - łączy typ użytkownika z prawami dostepu
idUserType - Large Signed Number, Req'd, PK, FK, typ użytkownika do którego odnosi się relacja
idPrivilage - Large Signed Number, Req'd, PK, FK, typ uprawnienia do którego odnosi się relacja
Raport końcowy
Implementacja bazy danych
Z uwagi na wykorzystywany przez klienta program Integra system bazodanowy został odgórnie narzucony był to Microsoft SQL Server 2000. Z uwagi na łączenie informacji występujących w dwóch oddzielnych bazach danych (programu Integra i oddzielnej programu AdTamer) zostały wykorzystane widoki do mapowania potrzebnych danych z bazy Integra ponadto już podczas tworzenia oprogramowania mapowania do ORM - NHibernate było wykonywane ręcznie. Na serwerze www na którym zamieszczane są ogłoszenia zainstalowany jest MySQL 5.0.
Zdefiniowanie interfejsów do prezentacji, edycji i obsługi danych
Użytkownik podstawowy posiadający prawa do edytowania ogłoszeń może przeglądać ogłoszenia występujące w programie dzięki panelowi z opcją filtrowania po kliknięciu na przycisk - Towary - w głównym menu.
W tym panelu użytkownik może znaleźć interesujące go Towary które chce edytować.
Następny interfejs odpowiada za przeglądanie danych detalicznych oraz wyświetlanie zdjęć związanych z danym towarem.
Po lewo znajdują się już dodane ogłoszenia. Po kliknięciu na dane ogłoszenie zostaje otworzony panel edycji ogłoszeń.
Użytkownik może w tym miejscu edytować, usunąć i synchronizować ogłoszenie w serwisie.
Dodatkowo dla administratora systemu zostały dodane dodatkowe interfejsy związane z zarządzaniem kontami użytkowników oraz dostępnymi serwisami.
Powyższy interfejs został przygotowany pod kątem dodawania oraz usuwania użytkowników.
Każdy serwis może posiadać indywidualny system związany z kategoryzacją ogłoszeń. Aby uniknąć sytuacji gdzie użytkownik musi za każdym razem przechodzić przez proces wyboru kategorii został utworzony szablon automatycznej konwersji kategorii z programu Integra do wybranego serwisu.
Zdefiniowanie panelu sterowania aplikacji
Menu aplikacji opiera się na dualnym podziale - funkcjonalności związane z zarządzania reklamą oraz ustawienia. Jednym z celów programu było uproszczenie interfejsu. Wszystkie przyciski funkcjonalne znajdują się na danym formularzu bez globalnego panelu sterowania.
Zdefiniowanie makropoleceń dla realizacji typowych operacji
Do makropoleceń można zaliczyć synchronizacje z serwisem. Podczas synchronizacji z każdym serwisem są wykonywane następujące czynności.
Uruchamianie i testowanie aplikacji
Aplikacja do poprawnego działania potrzebuje specyficznego środowiska. Korzysta ona z bazy danych SQL Serwer 2000 - podczas testowania była ona umieszczona na wirtualnej maszynie. Z zewnętrznego serwisu internetowego - z uwagi na brak bezpośredniego dostępu do bazy - w sensie możliwości jej fizycznych zmian, jedynie zarządzanie danymi - testy były wykonywane bezpośrednio na działającym serwisie. Jako dodatkowe utrudnienie podczas testowania było udostępnianie bazy danych jedynie dla określonej puli adresów. Program pobiera zdjęcia z programu Integra poprzez wirtualny dysk, z kolei z strony internetowej poprzez serwer ftp. Po zestawieniu wszystkich potrzebnych wymagań systemowych program był testowany pod kątem wydajności oraz odporności na błędy. Błędy związane z błędami wykonania podczas normalnej pracy nie występują jednak w końcowej fazie projektu zapomniano o zabezpieczeniu przed błędami występującymi poza programem jak zerwanie połączenia, restart wirtualnego dysku co prowadziło do przerwania pracy i restartu programu.
Wprowadzanie danych
Wprowadzone dane należą częściowo do programu Integra. Stanowią one podstawę do tworzenia ogłoszeń. Podczas testowania zostały wprowadzone dodatkowe ogłoszenia, zdjęcia. Został dodany jeden serwis oraz związana z nim kategoryzacja.
Wdrażanie systemu do użytkowania
System został przedstawiony klientowi jednak nie jest jeszcze w fazie kiedy można go wprowadzić do firmy na pełną skalę. Na chwilę obecną znajduje się na pojedynczym stanowisku testowym.
Rozwijanie i modyfikowanie aplikacji
Aplikacja ma znaczny potencjał była ona tworzona pod kątem rozwoju i łatwego dodawania nowych serwisów. Z uwagi właśnie na te cechy początkowy czas poświęcony aplikacji nie jest do końca widoczny w obecnym stanie aplikacji. Aplikacja docelowo ma za zadanie udostępnić zunifikowany interfejs do obsługi wielu serwisów jednocześnie z możliwością łatwej modyfikacji konfiguracji używanych serwerów. Pierwszym celem rozwoju jest dokończenie podstawowego interfejsu użytkownika. Później stopniowe dodawanie kolejnych modułów obsługujących.
Opracowanie doświadczeń wynikających z realizacji projektu
Podczas tworzenia projektu większość wykorzystanych technologii była mi nieznana. Jest to moja pierwsza aplikacja wykorzystująca Windows Presentation Fundation, ORM - NHibernate, nakładka Fluent NHibernate. Podczas tworzenia aplikacji wykorzystywałem również nowy dla mnie wzorzec ModelViewViewModel. Niestety nauka bezpośrednio na projekcie wpłynęła negatywnie na jego jakość. W końcowej fazie tego projektu - gdy już dostatecznie poznałem nowe technologie - mogłem zauważyć znaczny wpływ na szybkość wykonania takich mechanizmów jak Bindowanie danych czy mechanizmu ORM. Dodatkowo wprowadzenie wzorca ModelViewViewModel usprawniło zarządzanie aplikacją poprzez sprowadzenie całej logiki do jednej warstwy ułatwiając przy tym ich ponowne wykorzystanie.
Głównym problemem jaki miałem podczas tworzenia aplikacji było pobieranie danych asynchronicznie przy wykorzystaniu NHibernate. Podstawowy mechanizm sesji nie wspomaga wielowątkowości co prowadziło do licznych błędów wykonania. Podczas pracy nad projektem został zdefiniowany interfejs do zrównoleglania wątków odpowiedzialnych za pobieranie danych dla Nhibernate. Jednak w przyszłości przy tworzeniu aplikacji dużo lepszym podejście było by wykorzystanie pojedynczego wątku odpowiedzialnego za całość komunikacji.