3. Beadandó feladat dokumentáció Készítette: Giachetta Roberto E-mail: groberto@inf.elte.hu Feladat: Készítsünk adatbázis alapú, grafikus felületű alkalmazást egy apartmanokkal foglalkozó utazási ügynökség számára, amelyben a felhasználóknak lehetősége van apartmanok foglalására. Az adatbázisban városokra csoportosítva találunk épületeket, és épületen belül apartmanokat. Az apartmanok árazása a szezontól is függ. Továbbá adatbázisban tároljuk a felhasználók és az ügyfelek adatait is. A programba a felhasználóknak be kell előbb jelentkeznie, így kapnak lehetőséget az adatok megtekintésére és szerkesztésére. A felhasználók közül megkülönböztetjük az adminisztrátorokat, akik a felhasználók adatait is szerkeszthetik. A bejelentkezett felhasználó lehetőséget kap az egyes adatok (városok, épületek, apartmanok, szezonok, árak) megtekintésére és szerkesztésére, valamint apartmanok foglalására (ügyfél, apartman, valamint kezdő és vége dátumok megadásával). A foglalásokat utólag le lehet kérdezni, és ki lehet fizetni. Elemzés: Az alkalmazáshoz felépítünk egy MySQL adatbázist, amely tárolja a felhasználó, ügyfél, város, épület, apartman, szezon, ár és foglalás adatokat. Az alkalmazás két fő képernyőből áll. Elsőként a bejelentkező ablak jelenik meg, majd sikeres bejelentkezést követően a főablak. A főablakot egy MDI ablak keretében valósítjuk meg, így a felhasználó könnyen át tudja tekinteni párhuzamosan is a funkciókat. A főablakban biztosítunk egy adminisztrációs menüpontot, ahol az egyes táblák adatait tudja a felhasználó szerkeszteni, úgymint városok, épületek, apartmanok, szezonok, árak, vásárlók és felhasználók. Ezeket szabványos táblaszerkesztőből kezelheti a felhasználó, és lehetősége van a módosításokat elvégezni, vagy visszavonni. Itt az adatbázis azonosítókat elrejtjük, és könnyű kiválasztási funkciót szolgáltatunk helyette, továbbá ellenőrzünk néhány további kritikus értéket (pl. a tengerpart távolság nem lehet negatív). Külön menüpontot kap a foglalás, és azon belül a foglalások listázása, illetve új foglalás bejegyzése. Foglalások listázásakor biztosítunk lehetőséget a lista szűrésére ügyfélre, városra, illetve városon belül épületre legördülő menük segítségével. Egy foglalást kiválasztva lehetősége van a fizetést is elkönyvelni. Ügyelni kell arra, hogy már kifizetett foglalást ne lehessen újra kifizetni. 1
Új foglaláshoz a felhasználó szűrhet városra, épületnév(részlet)re, illetve ártartományokra, hogy könnyen lehessen a vevő elvárásainak eleget tenni. Az épületet kiválasztva tovább szűrhetjük az apartmanokat, majd dupla kattintással egy apartmanon kezdeményezhetünk foglalást az ügyfélnév, kezdő és befejező dátumok megadásával. Ügyelni kell arra, hogy a dátumok ne ütközzenek más foglalással arra az apartmanra, illetve ne adhassunk meg múltbeli, vagy rossz időpontokat. Foglalásoknál a teljes árat mindig a kezdőnapon érvényben lévő ár alapján számoljuk ki. A felhasználói esetek az 1. ábrán láthatóak. uc TravelAgency Bejelentkezés «precedes» Foglalás Foglalások listázása «precedes» Új foglalás Fizetés Felhasználó Adminisztráció Városok Szezonok Épületek Árak Apartmanok Felhasználók Ügyfelek 1. ábra: Felhasználói esetek diagramja 2
Adatbázisterv: Az adatbázis (appartmentdb) felépítése az alábbi (lásd 2. ábra): városok (city): azonosító, városnév; épületek (building): azonosító, név, város azonosító, utca, tengerpart távolság, tengerpart-típus (számként), jellemzők (binárisan összeillesztve), megjegyzés; apartmanok (appartment): azonosító, épület azonosító, szám, ágyak száma, pótágyak száma, felújítás alatt van-e; ügyfelek (customer): azonosító, név; foglalások (rent): azonosító, ügyfél azonosító, apartman azonosító, kezdődátum, befejező dátum, fizetett-e az ügyfél, összeg; szezon (season): azonosító, név, kezdődátum, befejező dátum; árak (price): apartman azonosító, szezon azonosító, ár; felhasználók (user): felhasználónév, teljes név, jelszó, felhasználói szint (0 az adminisztrátor). Rendszerterv: A program szerkezetét a Qt modell/nézet architektúrának megfelelően építjük fel, azaz az adatbázis kezelésére táblamodell osztályokat alkalmazunk, amelyek tartalmát megfelelő táblamegjelenítőkkel és egyéb vezérlőkkel jelenítjük meg. A beépített architektúrát több ponton kiegészítjük, ahol egyedi viselkedésre/megjelenésre van szükségünk, továbbá megvalósítjuk a megjelenítő ablakokat (3. ábra). A főprogram a bejelentő dialógusablakot jeleníti meg (LoginDialog), amely egy lekérdező modell (QSqlQueryModel) segítségével vizsgálja az egyezést a szövegdoboz értékek, valamint az adatbázis-tartalom között. Teljes egyezőség esetén betölti a főablakot. Amennyiben nincs adatbázis-kapcsolat, vagy nem megfelelőek az adatok, előugró ablakban (QMessageBox) figyelmeztet a hibára. A főablak (MainWindow) egy MDI megjelenítőt (QMdiArea) tartalmaz, valamint egy menüsort legyártott akciókkal. Ezen felül ő példányosítja a megfelelő táblamodelleket (setupmodels), illetve az épületek esetén egy egyedi megjelenítőt (BuildingTableDelegate). Az akciók végrehajtása a megfelelő beágyazott ablak megnyitását kezdeményezi. Minden ablak ekkor kapja a táblamodell mutatókat, amelyeket a szerkesztésre felhasznál, így a táblákat nem töltjük be többszörösen a memóriába. Általános táblaszerkesztést valósít meg a TableEditorWidget osztály, amelynek setmodel műveletével állíthatjuk be a szerkesztendő modellt, esetlegesen rejtett oszlopokat, illetve egyedi delegáltat. A RentListWidget osztály biztosítja a foglaláslistát, mely három legördülő menü (QComboBox) segítségével szűrhető. Amennyiben a városok kijelölése 3
változik, úgy az épületek listáját is újratöltjük. A vezérlők szűrését QSortFilterProxyModel példányokkal biztosítjuk, míg a táblaszűrést a modell setfilter eljárásával. A nézet csak olvasható, fizetés (paybutton_clicked) esetén a kódban adjuk meg a módosítandó értéket. 2. ábra: Adatbázis diagram 4
Az AppartmentListWidget ablak jeleníti meg mind az épületek, mind az apartmanok szűrt listáját. Az árszűrést egyedi osztállyal (PriceSortFilterProxyModel), a többi szűrést a beépített szűrő osztállyal végezzük. A duplakattintás esemény (appartmenttableview_doubleclicked) nyitja meg a foglalási ablakot. A foglalási ablak (AppartmentRentDialog) a foglalás végrehajtásakor (rentbutton_clicked) végez el minden ellenőrzést, úgymint a megfelelő dátumintervallum, valamint az időpontok ütközését, amelyhez egy további lekérdező modellt használ. A módosítást kódban történő beállításokkal hajtjuk végre. A modell oldaláról három egyedi táblamodellt definiáltunk: Az AppartmentTableModel specialitása, hogy az apartman állapotát kijelölő mezőn keresztül tudja kezelni. A BuildingTableModel új oszlopokat definiál az állapot, apartman szám, valamint minimum/maximum árak kezelésére, továbbá adatellenőrzéseket végez. A RentTableModel letiltja a nézetek számára a szerkesztést, valamint a fizetési állapotot kijelölést formájában adja vissza. class Class Model QDialog AppartmentRentDialog -rentwidget -pricesortfiltermodel QSortFilterProxyModel PriceSortFilterProxyModel RentListWidget -rentlistwidget AppartmentListWidget -appartmentlistwidget QSqlRelationalDelegate BuildingTableDelegate QListWidget FeatureEditorListWidget -buildingtabledelegate QMainWindow MainWindow -mainwindow 5 TableEditorWidget AppartmentTableModel -appartmenttablemodel QDialog LoginDialog -renttablemodel RentTableModel BuildingTableModel -buildingtablemodel 3. ábra: Osztálydiagram 5