Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:sbd:2012:projekty:przeglady2:start [2012/11/22 18:16] sbd12 |
pl:dydaktyka:sbd:2012:projekty:przeglady2:start [2019/06/27 15:50] (aktualna) |
---- dataentry projekt ---- | ---- dataentry projekt ---- |
grupa : Kamil Chlebda, Wojciech Wilk, Dariusz Tarczyński, Filip Zachłód | grupa : Kamil Chlebda, Wojciech Wilk, Dariusz Tarczyński, Filip Zachłód |
konceptualny : | konceptualny : 3,5 |
logiczny : | logiczny : 10,0 |
koncowy : | koncowy : |
ocena : | ocena : |
---- | ---- |
| |
{{page>pl:dydaktyka:sbd:2012:projekty:przeglady2:start}} | ===== Etapy projektowania: ===== |
| |
---- | |
| |
| |
===== 1. Sformułowanie zadania projektowego ===== | |
| |
// | |
Aplikacja powinna pozwolić właścicielom samochodów na rejestrację czynności wykonywanych w serwisie. System powinien umożliwiać budowanie bazy modeli samochodów z wyszczególnieniem czynności oraz ich częstotliwości (według czasu i/lub przebiegu) z podziałem na „inspekcje” (z opcjonalną wymianą), „wymiany” (obowiązkowe) oraz „regulacje”. Użytkownicy definiują samochód (poprzez wybór modelu, oraz uzupełnienie atrybutów takich jak data produkcji, data rejestracji, VIN, kolor, nr rejestracyny), a następnie mogą definiować dla nich „zdarzenia” oznaczające przeprowadzenie przy określonej dacie i przy określonym przebiegu danej czynności. Dla każdej czynności powinna być możliwość dodania notatek oraz załączników w postaci plików JPG i PDF). System powinien obliczać pozostały czas i przebieg do kolejnych czynności | |
// | |
| |
| |
Aplikacja ma być wirtualnym odpowiednikiem książki przeglądów samochodu w której właściciel pojazdu ma możliwość rejestracji czynności wykonywanych w serwisie. | |
| |
Funkcjonalności: | |
* rejestracja użytkowników, | |
* rejestracja samochodu w bazie danych (marka, model, wersja, rok produkcji, VIN, kolor nr rejestracyjny, typ nadwozia, liczba drzwi, rodzaj silnika, pojemność, moc, rodzaj skrzyni biegów), | |
* rejestracja zdarzeń oznaczających czynności serwisowe przy określonej dacie i przebiegu oraz opcjonalnie notatki i załączniki, | |
* definiowanie okresowych czynności serwisowych z podziałem na inspekcje, wymiany i regulacje, | |
* obliczanie pozostałego czasu i przebiegu do kolejnych czynności serwisowych, | |
| |
---- | |
| |
| |
===== 2. Analiza stanu wyjściowego ===== | |
| |
Istniejące aplikacje posiadające zbliżoną funkcjonalność: | |
| |
* [[http://www.motostat.pl/]] – serwis internetowy pomagający w kalkulowaniu kosztów użytkowania pojazdów, Jest połączeniem kalkulatora zużycia paliwa z dziennikiem kosztów, pozwalającym na łatwiejsze panowanie nad wydatkami. Posiada moduł przypomnień w którym można stworzyć listę okresowo wykonywanych zadań zależnych od czasu i przebiegu samochodu. Dane wprowadzane do serwisu przez użytkowników umożliwiają publikacja statystyk dotyczący spalania oraz kosztów eksploatacji danego modelu pojazdu.\\ | |
* [[http://auteo.pl/]] – serwis internetowy umożliwiający skonfigurowanie przypomnień dotyczących posiadanego samochodu. Przypomnienie wysyłane jest przez e-mail lub SMS. Posiada gotowe usługi przypominania o przeglądzie samochodu, wymianie oleju, ważności gaśnicy, ważności apteczki, oraz oferty ubezpieczenia AC OC. Pozwala na wprowadzenie własnych przypomnień o czynnościach serwisowych.\\ | |
* [[http://motonotes.pl/]] - strona pomagająca w kontrolowaniu wydatków związanych z pojazdem. Umożliwia obliczanie średniego spalania a także ustawianie przypomnień o nadchodzących przeglądach i wymianach części eksploatacyjnych. | |
| |
| |
---- | |
| |
| |
===== 3. Analiza wymagań użytkownika (wstępna) ===== | |
| |
Wymagania funkcjonalne: | |
* rejestracja i logowanie do systemu użytkowników, | |
* rejestracja, usuwanie i modyfikowanie wprowadzonych prze użytkownika samochodów, | |
* rejestracja, modyfikowanie, usuwanie zdarzeń oznaczających czynności serwisowe przy określonej dacie i przebiegu oraz opcjonalnie notatki i załączniki dla danego samochodu przez użytkownika, | |
* definiowanie, modyfikowanie i usuwanie okresowych czynności serwisowych z podziałem na inspekcje, wymiany i regulacje, | |
* obliczanie pozostałego czasu i przebiegu do kolejnych czynności serwisowych, | |
| |
---- | |
| |
| |
===== 4. Określenie scenariuszy użycia ===== | |
| |
=== Rejestracja nowego użytkownika ==== | |
| |
Nowy użytkownik w specjalnym formularz wprowadza dane do pól tekstowych (login, hasło, e-mail), jeżeli login oraz e-mail nie znajdują się w bazie, dane użytkownika zostają wprowadzone do bazy, w przeciwnym razie wyświetlony zostaje komunikat o istnieniu użytkownika o podanym loginie lub adresie e-mail. | |
| |
=== Logowanie użytkownika === | |
Użytkownik po wprowadzaniu do pól tekstowych poprawnego loginu i hasła zostaje zalogowany do aplikacji gdzie ma możliwość dodawania, usuwania i modyfikacji samochodów oraz zdarzeń i czynności serwisowych. W razie gdy login lub hasło są niepoprawne, wyświetlony zostaje stosowny komunikat. | |
| |
=== Dodawanie samochodu do bazy === | |
| |
Zalogowany użytkownik poprzez specjalny formularz dodaje samochód do bazy podając dane. W pierwszej kolejności z listy wybiera markę samochodu, następnie z drugiej listy wybiera dostępny model dla danej marki i wersje. Z listy wybiera również rok produkcji. Do pól tekstowych wprowadza VIN, kolor, nr rejestracyjny, i moc. Z listy wybiera typ nadwozia i liczbę drzwi. Po kliknięcia w przycisk „Dodaj samochód” i poprawności wprowadzonych danych, pojazd zostaje dodany do bazy. W przeciwnym razie zostają wyświetlone informacje o ilości i rodzajach błędów w wprowadzanych danych. | |
| |
| |
=== Modyfikowanie danych samochodu === | |
| |
Użytkownik wprowadza zmiany danych samochodu w formularzu jak wyżej z uzupełnionymi danymi z bazy. | |
| |
| |
=== Usuwanie samochodu === | |
| |
Użytkownik klika przycisk TAK lub NIE na wyświetlone pytanie o usunięcie samochodu z bazy. | |
| |
=== Dodawanie okresowych czynności serwisowych === | |
| |
Zalogowany użytkownik poprzez specjalny formularz dodaje okresową czynność serwisową. Z listy wybiera rodzaj czynności serwisowej, następnie do pól tekstowych wprowadza opis, czas co ile należy wykonywać daną czynność w miesiącach, ilość cyklicznego przebiegu po którym należy wykonać czynność, oraz komentarz do czynności. Następnie z listy wybiera samochód którego ma dotyczyć ta czynność i zatwierdza podane dane klikając w przycisk „Dodaj”. | |
| |
=== Modyfikowanie okresowej czynności serwisowej === | |
| |
Użytkownik wprowadza zmiany danych okresowej czynności serwisowej w formularzu jak powyżej z uzupełnionymi danymi z bazy. | |
| |
| |
=== Usuwanie okresowej czynności serwisowej === | |
| |
Użytkownik klika przycisk TAK lub NIE na wyświetlone pytanie o usunięcie okresowej czynności serwisowej z bazy. | |
| |
| |
=== Dodawanie zdarzeń === | |
Zalogowany użytkownik poprzez specjalny formularz dodaje zdarzenia które mogą być powiązane z okresowymi czynnościami serwisowymi. Użytkownik wybiera z listy swoich samochodów, pojazd którego dotyczy zdarzenie, następnie wprowadza datę i przebieg przy którym wystąpiło zdarzenie i wybiera z listy rodzaj zdarzenia. Może wprowadzić również komentarz oraz dołączyć pliki JPG lub PDF. | |
| |
=== Modyfikowanie zdarzenia === | |
| |
Użytkownik wprowadza zmiany danych zdarzenia w formularzu jak powyżej z uzupełnionymi danymi z bazy. | |
| |
| |
=== Usuwanie zdarzenia === | |
| |
Użytkownik klika przycisk TAK lub NIE na wyświetlone pytanie o usunięcie zdarzenia z bazy. | |
| |
| |
=== Wylogowanie użytkownika === | |
| |
Użytkownik klika na link wyloguj. Zostaje wylogowany i przekierowany na stronę główna aplikacji. | |
| |
---- | |
| |
| |
===== 5. Identyfikacja funkcji: Określenie podstawowych funkcji realizowanych w bazie danych. ===== | |
| |
* Rejestracja użytkownika\\ | |
* Logowanie użytkownika\\ | |
* Dodawanie samochodu\\ | |
* Edycja samochodu\\ | |
* Usuwanie samochodu\\ | |
* Dodawanie czynności serwisowej\\ | |
* Edycja czynności serwisowej\\ | |
* Usuwanie czynności serwisowej\\ | |
* Dodawanie zdarzenia\\ | |
* Edycja zdarzenia\\ | |
* Usuwanie zdarzenia\\ | |
| |
| |
---- | |
| |
===== 6. Analiza hierarchii funkcji projektowanej aplikacji - FHD. ===== | |
| |
{{ :pl:dydaktyka:sbd:2012:projekty:fhd.png?800 }} | |
| |
| |
---- | |
| |
===== 7. DFD – opcjonalnie: Budowa i analiza diagramu przepływu danych: ===== | |
| |
---- | |
| |
| |
===== 8. Wybór encji(obiektów) i ich atrybutów ===== | |
| |
* Użytkownik : id, login, hasło, email, imię, nazwisko | |
* Samochód : id, id użytkownika, id modelu samochodu, rok produkcji, VIN, kolor, nr rejestracyjny, typ nadwozia, liczba drzwi, moc | |
* Model samochodu : id, marka, model , wersja, start produkcji, koniec produkcji, rodzaj silnika, pojemność, rodzaj skrzyni biegów | |
* Zdarzenie : id, id rodzaju zdarzenia, id samochodu, data, czas (długość trwania zdarzenia), przebieg, komentarz | |
* Rodzaj zdarzenia : id, nazwa, | |
* Plik( notatka/pdf) : id, id zdarzenia, nazwa, obiekt | |
* Czynność serwisowa : id, id samochodu/modelu(podwójny klucz obcy, zależny od atrybutu samochód/model), samochód/model, id rodzaju czynności serwisowej, opis, okres, przebieg, komentarz | |
* Rodzaj czynności serwisowej ( zależna od czasu lub przebiegu) : id, nazwa | |
* Skrzynia biegów : id , nazwa | |
* Marka : id, nazwa | |
* Model : id, nazwa | |
* Typ nadwozia : id, nazwa | |
| |
---- | |
| |
| |
===== 9. Projektowanie powiązań (relacji) pomiędzy encjami. ===== | |
| |
{{:pl:dydaktyka:sbd:2012:projekty:przeglady2:erd2.png?800}} | |
| |
---- | |
| |
===== 10. Projekt diagramów STD ===== | |
{{ :pl:dydaktyka:sbd:2012:projekty:przeglady2:std.png?800 }} | |
| |
| |
| |
| |
| |
| |
| |
| |
---- | |
| |
{{page>pl:dydaktyka:sbd:2012:projekty:przeglady2:logiczny}} | |
| |
PROJEKT LOGICZNY=======PROJEKT LOGICZNY======= | |
| |
===== 4. Projekt bazy w języku SQL===== | |
| |
CREATE SEQUENCE id_uzytkownika_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE UZYTKOWNIK( | |
id INTEGER DEFAULT | |
nextval('id_uzytkownika_seq') PRIMARY KEY, | |
imie VARCHAR(20) NOT NULL , | |
nazwisko VARCHAR(30) NOT NULL, | |
login VARCHAR(30) NOT NULL, | |
password VARCHAR(30) NOT NULL, | |
email VARCHAR(50) NOT NULL, | |
CHECK (email::text ~* '[a-zA-Z]{1}[a-zA-Z0-9.]{0,}@[a-z0-9A-Z]{1,}(.[a-z0-9A-Z]{1,}){1,}$'::text) | |
); | |
| |
CREATE SEQUENCE id_rodzaju_czynnosci_serwisowej_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE RODZAJ_CZYNNOSCI_SERWISOWEJ( | |
id INTEGER DEFAULT | |
nextval('id_rodzaju_czynnosci_serwisowej_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_modelu_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE MODEL( | |
id INTEGER DEFAULT | |
nextval('id_modelu_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_marki_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE MARKA( | |
id INTEGER DEFAULT | |
nextval('id_marki_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_skrzynii_biegow_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE SKRZYNIA_BIEGOW( | |
id INTEGER DEFAULT | |
nextval('id_skrzynii_biegow_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_typu_nadwozia_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE TYP_NADWOZIA( | |
id INTEGER DEFAULT | |
nextval('id_typu_nadwozia_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_rodzaju_zdarzenia_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE RODZAJ_ZDARZENIA( | |
id INTEGER DEFAULT | |
nextval('id_rodzaju_zdarzenia_seq') PRIMARY KEY, | |
nazwa VARCHAR(20) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_modelu_samochodu_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE MODEL_SAMOCHODU( | |
id INTEGER DEFAULT | |
nextval('id_modelu_samochodu_seq') PRIMARY KEY, | |
id_marki INTEGER NOT NULL REFERENCES MARKA(id), | |
id_modelu INTEGER NOT NULL REFERENCES MODEL(id), | |
id_skrzyni_biegow INTEGER NOT NULL REFERENCES SKRZYNIA_BIEGOW(id), | |
wersja VARCHAR(20) NOT NULL, | |
start_produkcji SMALLINT NOT NULL, | |
koniec_produkcji SMALLINT NOT NULL, | |
rodzaj_silnika VARCHAR(20) NOT NULL, | |
pojemnosc REAL NOT NULL, | |
CHECK(pojemnosc>0), | |
CHECK(start_produkcji>0), | |
CHECK(koniec_produkcji>0), | |
CHECK(koniec_produkcji>start_produkcji) | |
); | |
| |
CREATE SEQUENCE id_samochodu_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE SAMOCHOD( | |
id INTEGER DEFAULT | |
nextval('id_samochodu_seq') PRIMARY KEY, | |
id_uzytkownika INTEGER NOT NULL REFERENCES UZYTKOWNIK(id), | |
id_modelu_samochodu INTEGER NOT NULL REFERENCES MODEL_SAMOCHODU(id), | |
id_typu_nadwozia INTEGER NOT NULL REFERENCES TYP_NADWOZIA(id), | |
VIN CHAR(20) NOT NULL, | |
kolor VARCHAR(20), | |
nr_rejestracyjny VARCHAR(7), | |
liczba_drzwi SMALLINT, | |
moc SMALLINT, | |
CHECK(moc>0), | |
CHECK(liczba_drzwi>0) | |
); | |
| |
CREATE SEQUENCE id_zdarzenia_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE ZDARZENIE( | |
id INTEGER DEFAULT | |
nextval('id_zdarzenia_seq') PRIMARY KEY, | |
id_samochodu INTEGER NOT NULL REFERENCES SAMOCHOD(id), | |
id_rodzaju_zdarzenia INTEGER NOT NULL REFERENCES RODZAJ_ZDARZENIA(id), | |
data TIMESTAMP NOT NULL, | |
czas SMALLINT, | |
przebieg VARCHAR(300) NOT NULL, | |
komentarz VARCHAR(100) NOT NULL | |
); | |
| |
CREATE SEQUENCE id_pliku_seq | |
START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; | |
| |
CREATE TABLE PLIK( | |
id INTEGER DEFAULT | |
nextval('id_pliku_seq') PRIMARY KEY, | |
id_zdarzenia INTEGER NOT NULL REFERENCES ZDARZENIE(id), | |
nazwa VARCHAR(50) NOT NULL, | |
obiekt BYTEA NOT NULL | |
); | |
| |
CREATE TABLE CZYNNOSC_SERWISOWA( | |
id_modelu_samochodu INTEGER NOT NULL REFERENCES MODEL_SAMOCHODU(id), | |
id_samochodu INTEGER REFERENCES SAMOCHOD(id), | |
id_rodzaju_czynnosci_serwisowej INTEGER NOT NULL REFERENCES RODZAJ_CZYNNOSCI_SERWISOWEJ(id), | |
opis VARCHAR(200) NOT NULL, | |
okres SMALLINT, | |
przebieg INTEGER, | |
komentarz VARCHAR(200), | |
PRIMARY KEY(id_modelu_samochodu, id_samochodu), | |
CHECK(przebieg>0) | |
); | |
| |
===== 5. Słowniki danych ===== | |
| |
===rodzaj_skrzyni=== | |
*id | |
*nazwa(automatyczna/półautomatyczna/manualna) | |
| |
===skrzynia_biegow=== | |
*id | |
*id_rodzaju_skrzyni(klucz obcy do słownika rodzaj_skrzyni) | |
*ilosc_biegow - dodatnia liczba(np. 5) | |
| |
===model_samochodu=== | |
*id | |
*id_marki(klucz obcy do słownika marka) | |
*id_modelu(klucz obcy do słownika model) | |
*id_skrzyni_biegow(klucz obcy do słownika skrzynia_biegow) | |
*wersja | |
*start_produkcji | |
*koniec_produkcji | |
*rodzaj_silnika | |
*pojemnosc | |
| |
===model=== | |
*id | |
*nazwa - łańcuch znaków(np. Corsa) | |
| |
===marka=== | |
*id | |
*nazwa - łańcuch znaków(np. Opel) | |
| |
===typ_nadwozia=== | |
*id | |
*nazwa - łańcuch znaków(np. sedan) | |
| |
===rodzaj_zdarzenia=== | |
*id | |
*nazwa - łańcuch znaków(np | |
| |
===Skrzynia biegów=== | |
Słownik składający się z | |
| |
===== 8. Projektowanie operacji na danych ===== | |
| |
===Rejestracja użytkownika === | |
| |
INSERT INTO UZYTKOWNIK (id, imie, nazwisko, login, password, email) VALUES(DEFAULT, 'Wojciech', 'Wilk', 'wilk', 'haslo', 'wilk@gmail.com '); | |
| |
===Logowanie użytkownika === | |
| |
SELECT PASSWORD FROM UZYTKOWNIK WHERE login = 'wilk'; | |
| |
===Wyświetlenie wszystkich samochodów=== | |
| |
SELECT id, id_użytkownika, id_modelu_samochodu, id_typu_nadwozia, rok_produkcji, VIN, kolor, nr_rejestracyjny, liczba_drzwi, moc FROM UZYTKOWNIK | |
| |
===Dodawanie samochodu=== | |
| |
INSERT INTO SAMOCHOD(id, id_użytkownika, id_modelu_samochodu, id_typu_nadwozia, rok_produkcji, VIN, kolor, nr_rejestracyjny, liczba_drzwi, moc) VALUES(DEFAULT, 5, 4, 2, 2003, 'W0L0XCF0814000002', 'czarny', RNI-20MC, 5, 130); | |
| |
===Edycja samochodu=== | |
| |
UPDATE SAMOCHOD SET id użytkownika = 3, id_modelu_samochodu = 2, id_typu_nadwozia = 1, rok produkcji = 2000, VIN = 'W0L0TGF6915216555', kolor = 'czerwony', nr rejestracyjny = 'KR 34AM', liczba drzwi = 3, moc = 200 WHERE id = 5; | |
| |
===Usuwanie samochodu=== | |
| |
DELETE FROM SAMOCHOD WHERE id = 3; | |
| |
===Wyświetlenie wszystkich czynności serwisowych=== | |
| |
SELECT id, id_modelu_samochodu, id_samochodu, id_rodzaju_czynnosci_serwisowej, opis, okres, przebieg, komentarz FROM CZYNNOSC_SERWISOWA | |
| |
===Dodawanie czynności serwisowej=== | |
| |
INSERT INTO CZYNNOSC_SERWISOWA(id, id_modelu_samochodu, id_samochodu, id_rodzaju_czynnosci_serwisowej, opis, okres, przebieg, komentarz) VALUES(DEFAULT, 2, null, 1, 'Wymiana klocków hamulcowych', ######, 200000, 'Zalecane już przy 180000km'); | |
| |
===Edycja czynności serwisowej=== | |
| |
UPDATE CZYNNOSC_SERWISOWA SET id_modelu_samochodu = 3, id_samochodu = 2 , id_rodzaju_czynnosci_serwisowej = 2, opis = 'Przegląd', okres = #####, przebieg = null, komentarz = null WHERE id = 3; | |
| |
===Usuwanie czynności serwisowej=== | |
| |
DELETE FROM CZYNNOSC_SERWISOWA WHERE id = 4; | |
| |
===Wyświetlenie wszystkich zdarzeń=== | |
| |
SELECT id, id_rodzaju_zdarzenia, id_samochodu, data, czas, przebieg, komentarz FROM ZDARZENIE | |
| |
===Dodawanie zdarzenia=== | |
| |
INSERT INTO ZDARZENIE( id, id_rodzaju_zdarzenia, id_samochodu, data, czas, przebieg, komentarz) VALUES(DEFAULT, 2, 5, '2012-10-19 10:23:00', 5, 200000, 'Wymiana paska rozrządu'); | |
| |
===Edycja zdarzenia=== | |
| |
UPDATE ZDARZENIE SET id_rodzaju_zdarzenia = 2 , id_samochodu = 5, data = '2012-11-11 12:33:00', czas = 3, przebieg = 10000, komentarz = 'Przegląd techniczny' WHERE id = 5; | |
| |
===Usuwanie zdarzenia=== | |
| |
DELETE FROM ZDARZENIE WHERE id = 2; | |
| |
| * [[pl:dydaktyka:sbd:2012:projekty:przeglady2:konceptualny| Projekt konceptualny]] |
| * [[pl:dydaktyka:sbd:2012:projekty:przeglady2:logiczny| Projekt logiczny]] |
| * [[pl:dydaktyka:sbd:2012:projekty:przeglady2:koncowy| Raport końcowy]] |
---- | ---- |
| |
| |
| |