Commit 0f7efc83 authored by M3156's avatar M3156
Browse files
parents 2c166106 7af5e979
......@@ -9,20 +9,30 @@
## Sisällysluettelo
* [Sovelluksen yleiskuvaus](#sovelluksen-yleiskuvaus)
* [Kohdeyleisö](#kohdeyleisö)
* [Käyttöympäristö ja käytetyt teknologiat](#käyttöympäristö-ja-käytetyt-teknologiat)
* [Käyttäjäroolit](#käyttäjäroolit)
* [Ominaisuudet](#ominaisuudet)
* [Käyttötapaukset](#käyttötapaukset)
* [Hyväksyntätestit](#hyväksyntätestit)
* [Käsitemalli](#käsitemalli)
* [Luokkakaavio](#luokkamalli)
* [Työnjako](#työnjako)
* [Työaikasuunnitelma](#työaika-suunnitelma)
# Sovelluksen yleiskuvaus
* [Vaatimusmäärittely](#vaatimusmäärittely)
* [Sovelluksen yleiskuvaus](#sovelluksen-yleiskuvaus)
* [Kohdeyleisö](#kohdeyleisö)
* [Käyttöympäristö ja käytetyt teknologiat](#käyttöympäristö-ja-käytetyt-teknologiat)
* [Käyttäjäroolit](#käyttäjäroolit)
* [Ominaisuudet](#ominaisuudet)
* [Käyttötapaukset](#käyttötapaukset)
* [Hyväksyntätestit](#hyväksyntätestit)
* [Käsitemalli](#käsitemalli)
* [Luokkakaavio](#luokkamalli)
* [Työnjako](#työnjako)
* [Työaikasuunnitelma](#työaika-suunnitelma)
* [Loppuraportti](#loppuraportti)
* [Asennus](#asennus)
* [Tetoa ohjelmasta](#tietoa-ohjelmasta)
* [Kuvaruutukaappaukset](#kuvaruutukaappaukset)
* [Mukana tulevat tiedostot](#)
* [Tietokanta](#tietokanta)
* [Ongelmat, jatkokehitysideat](#)
* [Yhteenveto](#yhteenveto)
# Vaatimusmäärittely
## Sovelluksen yleiskuvaus
Tarkoituksena on suunnitella ja toteuttaa työkaluvuokraussovelluksen prototyyppi,
joka aluksi toimisi vain paikallisesti. Vuokrausmenetelmä toimisi samalla periaatteella kun
......@@ -30,12 +40,12 @@ joka aluksi toimisi vain paikallisesti. Vuokrausmenetelmä toimisi samalla peria
asettamat työkalut, työkalun omistajan hintapyynnön mukaan. Käyttäjät pystyy kommentoimaan työkaluja
ja antaa 1-5 arvion käyttäjistä, joiden kanssa on suorittanut transaction.
# Kohdeyleisö
## Kohdeyleisö
Kohdeyleisö on kaikki henkilöt, joilla ei ole monipuolista työkalukokoelmaa. Eli todennäköisesti
kaupungeissa asuvat ihmiset.
# Käyttöympäristö ja käytetyt teknologiat
## Käyttöympäristö ja käytetyt teknologiat
* Microsoft Windows (Käyttöympäristö)
* Visual Studio 2017
......@@ -43,18 +53,18 @@ kaupungeissa asuvat ihmiset.
* C#
* MySql
# Käyttäjäroolit
## Käyttäjäroolit
## Asiakas
### Asiakas
Asiakas käyttää sovellusta vuoratakseen tai laittakseen vuokralle työkaluja.
## Ylläpitäjä
### Ylläpitäjä
Ylläpitäjä ylläpitää palvelua ja pitää huolta siitä, että työkaluja myöhässä palauttaneiden käyttäjätilit
laitetaan joko jäähylle tai jäädytetään kokonaan.
# Ominaisuudet
## Ominaisuudet
| Tunnus | Ominaisuus | Prioriteetti | Muuta |
| :-: | :-: | :-: | :-: |
......@@ -68,9 +78,9 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
| FT08 | [ Työkalujen poistaminen ](../liitteet/f8_deletetool.md) | Pakollinen | |
# Käyttötapaukset
## Käyttötapaukset
## Tunnusten luominen ja kirjautuminen
### Tunnusten luominen ja kirjautuminen
```plantuml
@startuml
......@@ -97,7 +107,7 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
* Tunnusten luominen: Kerran per sähköposti
* Kirjautuminen: rajaton
## Työkalujen selailu, vuokraus, palautus ja poistaminen
### Työkalujen selailu, vuokraus, palautus ja poistaminen
```plantuml
@startuml
......@@ -131,7 +141,7 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
* Palautus: kerran per transaction
* Poistaminen: kerran per työkalu
## Työkalujen kommentointi
### Työkalujen kommentointi
```plantuml
@startuml
......@@ -158,7 +168,7 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
* Kommenttointi: rajaton
* Vastaaminen kommentteihin: rajaton
# Hyväksyntätestit
## Hyväksyntätestit
| TestiID | Kuvaus |
|:-:|:-:|
......@@ -169,7 +179,7 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
| AT05 | [Kommentointi](../liitteet/at6_comments.md) |
| AT06 | [Työkalun palautus](../liitteet/at7_returnatool.md) |
# Käsitemalli
## Käsitemalli
### Käsitteet
......@@ -192,7 +202,7 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
Rating --|> Transaction
@enduml
```
# Luokkamalli
## Luokkamalli
```plantuml
@startuml
......@@ -319,12 +329,12 @@ laitetaan joko jäähylle tai jäädytetään kokonaan.
@enduml
```
# Työnjako
## Työnjako
Samson Azizyan
Suunnittelu, XAML toteutus, code in behind, testit, Mysql database (Tietokannat kurssi)
# Työaika suunnitelma
## Työaika suunnitelma
* Viikko 11: MainWindow ja RegisterWindow sekä XAML että code in behind. User, Tool luokat, Mysql tietokanta (15h)
* Viikko 12: DB, MainPage XAML ja code in behind, DB, Mysql (10h)
......@@ -333,4 +343,43 @@ Suunnittelu, XAML toteutus, code in behind, testit, Mysql database (Tietokannat
* Viikko 15: Kaikkien ikkunoiden toimintojen parantamista, DB, CommentWindow XAML, Mysql näkymät (20h)
* Viikko 16: Rating Window, Testaaminen, debuggaaminen (10h)
Pakko myöntää etää aloin koodaamaan jo viikolla 11 ja tein tämän suunnitelman vasta viikolla 14.
\ No newline at end of file
Pakko myöntää etää aloin koodaamaan jo viikolla 11 ja tein tämän suunnitelman vasta viikolla 14.
# Loppuraportti
## Asennus
## Tietoa ohjelmasta
## Kuvaruutukaappaukset
## Mukana tulevat tiedostot
## Tietokanta
Tietokannan suunnittelin tietokannat opintojakson harjoitustyönä. Tietokannasta on luotu 2 versitota prosessin aikana.
### iTool tietokanta versio 1
<img src="liitteet/iTool.JPG" alt="iTool v1" width="900">
Tässä versiossa tietokannassa oli tr_completion taulu, se taulu oli työkalun palautusta varten. Käyttäjä palauuttaa työkalun, samalla palautustapahtuma tallentuisi
tr_completion tauluun, johon kirjautuu palautus PVM, palautus kunto ja arvio kaupan toisesta osapuolesta. Transaction ja tr_completion taulujen välissä oli
yksi yhteen liitos, joten tr_completion on jätetty kokonaan pois ja transaction tauluun on lisätty palautusPVM (actualEndDate) kenttä, joka transaction käynnistyessä olisi null.
### iTool tietokanta lopullinen versio 2
<img src="liitteet/iTool_v3_no_captions.JPG" alt="iTool v2" width="900">
Tässä on lopullinen versio iTool tietokannasta, tr_completion taulu on jätetty pois ja tietokantaan on lisätty rating taulu arvioita varten. Rating taululle on tehty [trigger](liitteet/trigger.md),
joka pitää huolta siitä, että käyttäjä joka jättää arvion voi vain ainoastaan arvioida kyseisen transaktion toista osapuolta yhden kerran. Comment taulussa on itseensä liitos,
koska vastaukset kommenteihin vaatii parentID.<br>
[Täältä löytyy tietokannan luontiskripti](liitteet/database_script.md)
[Queryhistoriasta](liitteet/queryhistory.md) löytyy näkymien luonti, testidatan lisäys ja erilaisia hakuja. Piti luoda 2 isoa näkymää (all_tools ja rented_tools) käyttöliittymän
toiminnallisuutta varten.
## Ongelmat, jatkokehitysideat
## Yhteenveto
\ No newline at end of file
# Tietokannanluontiskripti
```sql
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema M3156_3
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema M3156_3
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `M3156_3` DEFAULT CHARACTER SET utf8 ;
USE `M3156_3` ;
-- -----------------------------------------------------
-- Table `M3156_3`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`user` (
`userID` INT NOT NULL AUTO_INCREMENT,
`userName` VARCHAR(45) NOT NULL,
`userSurname` VARCHAR(45) NOT NULL,
`userAddress` VARCHAR(128) NOT NULL,
`userEmail` VARCHAR(128) NOT NULL,
`userLocation` VARCHAR(128) NOT NULL,
`paymentMethod` VARCHAR(128) NOT NULL,
`userMobile` VARCHAR(45) NOT NULL,
`userPassword` VARCHAR(45) NOT NULL,
`userPicture` VARCHAR(128) NULL,
PRIMARY KEY (`userID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `M3156_3`.`toolCategory`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`toolCategory` (
`toolCategoryID` INT NOT NULL AUTO_INCREMENT,
`toolCategoryName` VARCHAR(128) NOT NULL,
`toolCategoryDescription` VARCHAR(1000) NOT NULL,
PRIMARY KEY (`toolCategoryID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `M3156_3`.`tool`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`tool` (
`toolID` INT NOT NULL AUTO_INCREMENT,
`toolName` VARCHAR(128) NOT NULL,
`toolDescription` VARCHAR(1000) NOT NULL,
`toolPrice` DECIMAL(10,2) NOT NULL,
`toolCondition` VARCHAR(45) NOT NULL,
`toolCategoryID` INT NOT NULL,
`userOwnerID` INT NOT NULL,
`toolPicture` VARCHAR(128) NULL,
PRIMARY KEY (`toolID`),
INDEX `fk_tool_toolCategory1_idx` (`toolCategoryID` ASC),
INDEX `fk_tool_user1_idx` (`userOwnerID` ASC),
CONSTRAINT `fk_tool_toolCategory1`
FOREIGN KEY (`toolCategoryID`)
REFERENCES `M3156_3`.`toolCategory` (`toolCategoryID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tool_user1`
FOREIGN KEY (`userOwnerID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `M3156_3`.`transaction`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`transaction` (
`transactionID` INT NOT NULL AUTO_INCREMENT,
`transactionStartDate` DATETIME NOT NULL,
`transactionPlannedEndDate` DATETIME NOT NULL,
`userOwnerID` INT NOT NULL,
`userLesseeID` INT NOT NULL,
`toolID` INT NOT NULL,
`actualEndDate` DATETIME NULL,
PRIMARY KEY (`transactionID`),
INDEX `fk_transaction_user1_idx` (`userOwnerID` ASC),
INDEX `fk_transaction_user2_idx` (`userLesseeID` ASC),
INDEX `fk_transaction_tool1_idx` (`toolID` ASC),
CONSTRAINT `fk_transaction_user1`
FOREIGN KEY (`userOwnerID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_transaction_user2`
FOREIGN KEY (`userLesseeID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_transaction_tool1`
FOREIGN KEY (`toolID`)
REFERENCES `M3156_3`.`tool` (`toolID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `M3156_3`.`comment`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`comment` (
`commentID` INT NOT NULL AUTO_INCREMENT,
`commentDate` DATETIME NOT NULL,
`commentText` VARCHAR(1000) NULL,
`userID` INT NOT NULL,
`commentParentID` INT NULL,
`toolID` INT NOT NULL,
PRIMARY KEY (`commentID`),
INDEX `fk_return_tr_user1_idx` (`userID` ASC),
INDEX `fk_return_tr_return_tr1_idx` (`commentParentID` ASC),
INDEX `fk_comment_tool1_idx` (`toolID` ASC),
CONSTRAINT `fk_return_tr_user1`
FOREIGN KEY (`userID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_return_tr_return_tr1`
FOREIGN KEY (`commentParentID`)
REFERENCES `M3156_3`.`comment` (`commentID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_comment_tool1`
FOREIGN KEY (`toolID`)
REFERENCES `M3156_3`.`tool` (`toolID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `M3156_3`.`rating`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M3156_3`.`rating` (
`ratingID` INT NOT NULL AUTO_INCREMENT,
`rating` INT(1) NOT NULL,
`ratingFeedback` VARCHAR(1000) NULL,
`raterID` INT NOT NULL,
`ratedID` INT NOT NULL,
`transactionID` INT NOT NULL,
PRIMARY KEY (`ratingID`),
INDEX `fk_rating_user1_idx` (`raterID` ASC),
INDEX `fk_rating_user2_idx` (`ratedID` ASC),
INDEX `fk_rating_transaction1_idx` (`transactionID` ASC),
CONSTRAINT `fk_rating_user1`
FOREIGN KEY (`raterID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_rating_user2`
FOREIGN KEY (`ratedID`)
REFERENCES `M3156_3`.`user` (`userID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_rating_transaction1`
FOREIGN KEY (`transactionID`)
REFERENCES `M3156_3`.`transaction` (`transactionID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
```
\ No newline at end of file
This diff is collapsed.
### Luodaan triggeri rating-talululle sitä varten, että arvioija ei voisi arvioida itsensä, eikä voi antaa arvioita enemmän kuin kerran/transaktio ja arvio pitää olla asteikolla 1-5
```sql
DELIMITER $$
create trigger ratingTrigger before insert on rating for each row
begin
if new.rating> 5 || new.rating < 1 || (new.raterID = ( select raterID from rating) and new.transactionID = (select transactionID from rating)) || new.raterID = new.ratedID
then
CALL `'Only 1-5! One rating per transaction! Can't rate yourself!'`;
end if;
end;
$$
```
# Testit
## Negatiiviset testit
### Annettu arvio: 8 (ei pitäisi mennä läpi)
```sql
INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating)
VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,8);
```
TULOS: 15:10:36 INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating) VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,8) Error Code: 1305. PROCEDURE M3156_3.'Only 1-5! One rating per transaction! Can't rate yourself!' does not exist 0.015 sec
### Annetaan arvio itselle (ei pitäisi mennä läpi)
```sql
INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating)
VALUES ('iajdsfoisajhfoisajhfd', 1,1,5,4);
```
TULOS: 15:12:44 INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating) VALUES ('iajdsfoisajhfoisajhfd', 1,1,5,4) Error Code: 1305. PROCEDURE M3156_3.'Only 1-5! One rating per transaction! Can't rate yourself!' does not exist 0.015 sec
### Annetaan arvio toisen kerran samalle henkilölle (ei pitäisi mennä läpi)
```sql
INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating)
VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,5);
```
TULOS: 15:20:39 INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating) VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,5) Error Code: 1242. Subquery returns more than 1 row 0.000 sec
## Positiivistet testit
### Annetaan arvio 5 transaktion vastapulelle (pitää mennä läpi)
```sql
INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating)
VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,5);
```
TULOS: 15:18:14 INSERT INTO rating (ratingFeedback, raterID, ratedID, transactionID, rating) VALUES ('iajdsfoisajhfoisajhfd', 1,2,5,5) 1 row(s) affected 0.000 sec
### Näiden testien jälkeen löysimme ongelmie triggerissä (Error Code: 1242. Subquery returns more than 1 row).
# Uusi trigger (toimii)
```sql
DELIMITER $$
create trigger ratingTrigger before insert on rating for each row
begin
if new.rating> 5 || new.rating < 1 || (new.raterID IN ( select raterID from rating) and new.transactionID IN (select transactionID from rating)) || new.raterID = new.ratedID
then
CALL `'Only 1-5! One rating per transaction! Can't rate yourself!'`;
end if;
end;
$$
```
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment