Caffavo
Firma poświęcona parzeniu i dostarczaniu kawy.
https://kacperkapusciak.github.io/caffavo-fe/
Przykładowe konto użytkownika:
Login: user-2@caffavo.com
Hasło: 1234567890
Przykładowe konto administratora:
Login: admin@caffavo.com
Hasło: password
Założenia projektowe:
Ogólnie dla systemu:
- Każdy rodzaj kawy ma swój przepis.
- Po przygotowaniu kawy jest zużywana odpowiednia ilość składników.
System umozliwia zarządzanie:
- ilością składników dostępnych w magazynie (kilogramy kawy, cukru, litry mleka, syropów etc.)
- zamówieniami, użytkownikami, przepisami, rodzajami kawy oraz składnikami
- Kalkulować koszt danego zamówienia: koszt zamówenia = ilość kaw * (cena składników + marża) + ilość produktów * (cena + marża) + koszt dostawy. 'Produktem' jest np. sernik, szarlotka, ciastko itp.
- Blokować możliwość zamawiania kaw na które nie ma składników
- Na bieżąco kalkulować ilość kaw które mogą zostać zaparzone z danych składników oraz informować administratora o brakach.
Jako użytkownik mogę:
- zarejestrować się na stronie
- edytować swoje dane, również adresowe (imię, nazwisko, telefon, email, haslo, adres zamieszkania
- przeglądać menu dostępnych kaw oraz produktów wraz z ich cenami
- złożyć zamówienie na kawy/produkty przeze mnie wybrane, poznać koszt zamówienia i status jego realizacji w każdym z jego etapów (przyjęte do realizacji, w trakcie, anulowane, zrealizowane)
- anulować zamówienie (do 5 minut po złożeniu zamówienia)
- wyrazic swoje zadowolenie w postaci opinii do zrealizowanego zamówienia
- mieć podgląd na moje zamówienia, również przeszłe
- poznac moją ulubioną kawę - najczesciej przeze mnie zamawianą
Jako administator mogę:
- dodawać nowe rodzaje składników, przepisów, produktów i rodzajów kawy
- uzupełniać braki w magazynach tj. kupować składniki, produkty
- zarządzać finansami - bilans konta, pieniądze z zamówień, koszta składników, koszta dostawy, nadawanie marży na produkty oraz kawy
- zarządzać zamówieniami, znać ich stan, ilość, edytować, tworzyć, usuwać
- znać najpopularniejsze kawy zamawiane przez klientów
- mieć możliwość poznania opinii klientów i umieszczania na stronie głównej
Zaznaczone pola oznajmiają, które założenia udało się zrealizować.
Diagramy
Diagram Przepływu Danych
Diagram można znaleźć pod: diagrams/DFD.pdf
Diagram ERD
Diagram znajduje się pod: diagrams/ERD.pdf
Projekt logiczny
Tabele, typy oraz widoki wraz z komentarzami znajdują się w pliku sql/init.sql.
Triggery można znaleźć w pliku sql/triggers.sql.
Operacje na danych
Autoryzacja
routes/auth.js#L43
Logowanie użytkownika:SELECT id, email, admin
FROM uzytkownik
WHERE email=${email} AND haslo=${password};
Rejestracja/dodawanie użytkowników:
INSERT INTO uzytkownik (email, haslo)
VALUES (${email}, ${password})`);
INSERT INTO uzytkownik (email, haslo, imie, nazwisko, telefon)
VALUES (${email}, ${password}, ${firstName}, ${lastName}, ${phone})`);;
Użytkownicy
routes/users.js#L46
Wyświetlenie wszystkich użytkowników:SELECT * FROM uzytkownik;
routes/users.js#L99
Dane o użytkowniku przy podanym id:SELECT * FROM pelne_dane_uzytkownika
WHERE id=${req.params.id};
Edycja danych użytkownika
UPDATE uzytkownik
SET imie=${firstName}, nazwisko=${lastName}, telefon=${phone}
WHERE id=${req.params.id}
RETURNING adres_id;
UPDATE adres
SET ulica=${street}, nr_budynku=${building},
nr_lokalu=${apartment}, kod_pocztowy=${postal},
miasto=${city}
WHERE id=${rows[0].adres_id};
INSERT INTO adres (ulica, nr_budynku, nr_lokalu, kod_pocztowy, miasto)
VALUES (${street}, ${building}, ${apartment}, ${postal}, ${city})
RETURNING id;
UPDATE uzytkownik
SET adres_id=${id}
WHERE id=${req.params.id};
routes/users.js#L241
Usunięcie użytkownika:DELETE FROM uzytkownik
WHERE id=${req.params.id};
Składniki
routes/ingredients.js#L41
Wypisanie wszystkich składników:SELECT * FROM skladniki ORDER BY jednostka ASC, ilosc DESC;
routes/ingredients.js#L84
Dodawanie składnika:INSERT INTO skladniki (nazwa, ilosc, jednostka, cena)
VALUES (${name}, ${amount}, ${unit}, ${price})`);
routes/ingredients.js#L122
Edycja składnika:UPDATE skladniki
SET nazwa=${name}, ilosc=${amount}, jednostka=${unit}, cena=${price}
WHERE id=${req.params.id}`);
routes/ingredients.js#L141
Usunięcie składnika:DELETE FROM skladniki
WHERE id=${req.params.id}`);
Wyroby cukiernicze
routes/bakery.js#L45
Wypisanie wyrobów cukierniczych:SELECT * FROM wyroby_cukiernicze ORDER BY jednostka ASC, ilosc DESC;
routes/bakery.js#L94
Dodawanie wyrobu cukierniczego:INSERT INTO wyroby_cukiernicze (nazwa, porcja, ilosc, jednostka, cena, marza)
VALUES (${name}, ${portion}, ${amount}, ${unit}, ${price}, ${priceMargin});
routes/bakery.js#L137
Edycja wyrobu cukierniczego:UPDATE wyroby_cukiernicze
SET
nazwa=${name},
porcja=${portion},
ilosc=${amount},
jednostka=${unit},
cena=${price},
marza=${priceMargin}
WHERE id=${req.params.id};
routes/bakery.js#L163
Usunięcie wyrobu cukierniczego:DELETE FROM wyroby_cukiernicze
WHERE id=${req.params.id}`);
Zamówienia
routes/orders.js#L49
Wyświetlenie wszystkich zamówień:SELECT z.id, uzytkownik_id, email, z.adres_id, status, data_zlozenia,
data_realizacji, koszt, koszt_dostawy, oplacone, opinie_id
FROM zamowienia z
JOIN uzytkownik u
ON z.uzytkownik_id = u.id
ORDER BY data_zlozenia DESC;
routes/orders.js#112
Wyświetla zamówienia użytkownika o podanym id:SELECT id, status, data_zlozenia, data_realizacji,
koszt, koszt_dostawy, oplacone, opinie_id FROM zamowienia
WHERE uzytkownik_id=${req.params.id}
ORDER BY data_zlozenia DESC;
Wyświetla pełne dane o zamówieniu:
SELECT * FROM zamowienia
WHERE id=${req.params.id};
SELECT * FROM zamowione_produkty
WHERE zamowienie_id=${req.params.id}
SELECT * FROM pelne_dane_uzytkownika
WHERE id=${userId};
Dodawanie nowego zamówienia:
SELECT ${obj.amount} * cena as price
FROM oferta_kaw
WHERE rodzaj_kawy_id=${obj.coffeeTypeId};
SELECT ${obj.amount} * cena as price
FROM oferta_wyrobow_cukierniczych
WHERE wyrob_cukierniczy_id=${obj.bakeryId};
INSERT INTO zamowienia (uzytkownik_id, koszt)
VALUES (${userId}, ${totalOrderCost})
RETURNING id;
INSERT INTO zamowiony_produkt (zamowienie_id, ilosc)
VALUES (${orderId}, ${coffee.amount})
RETURNING id;
INSERT INTO zamowiona_kawa (zamowiony_produkt_id, rodzaj_kawy_id)
VALUES (${orderedItemId}, ${coffee.coffeeTypeId});
INSERT INTO zamowiony_produkt (zamowienie_id, ilosc)
VALUES (${orderId}, ${bakeryItem.amount})
RETURNING id;
INSERT INTO zamowiony_wyrob_cukierniczy (zamowiony_produkt_id, wyrob_cukierniczy_id)
VALUES (${orderedItemId}, ${bakeryItem.bakeryId});
Opłacenie zamówienia:
UPDATE zamowienia
SET oplacone='true'
WHERE id=${id}
RETURNING koszt, koszt_dostawy;
INSERT INTO transakcje (wartosc, tytul, zamowienie_id)
VALUES (${paymentValue}, ${paymentTitle}, ${id});
Anulowanie zamówienia:
SELECT data_zlozenia FROM zamowienia
WHERE id=${id};
UPDATE zamowienia
SET status='anulowane'
WHERE id=${id}
RETURNING oplacone, koszt, koszt_dostawy;
INSERT INTO transakcje (wartosc, tytul, zamowienie_id)
VALUES (${-(parseFloat(koszt) + parseFloat(koszt_dostawy))}, ${title}, ${id});
routes/orders.js#446
Usunięcie zamówienia o podanym id:DELETE FROM zamowienia
WHERE id=${req.params.id};
Oferta
Wyświetlenie dostępnej oferty:
SELECT * FROM oferta_kaw;
SELECT * FROM oferta_wyrobow_cukierniczych;
Najczęściej zamawiana kawa:
SELECT uk.rodzaj_kawy_id, nazwa, cena, SUM(ile_razy_zamowiona) as ile_razy_zamowiona
FROM ulubiona_kawa uk
INNER JOIN oferta_kaw ok
ON uk.rodzaj_kawy_id = ok.rodzaj_kawy_id
GROUP BY uk.rodzaj_kawy_id, nazwa, cena
ORDER BY ile_razy_zamowiona DESC
LIMIT 1;
Finanse
routes/finance.js#39
Wyświetlenie wszystkich transakcji:SELECT * FROM transakcje ORDER BY wykonana_o DESC;
routes/finance.js#84
Wyświetlenie wszystkich transakcji użytkownika o podanym id:SELECT
t.id, t.wykonana_o, t.wartosc, t.tytul, t.zamowienie_id
FROM transakcje t
INNER JOIN zamowienia z
ON t.zamowienie_id = z.id
WHERE z.uzytkownik_id=${req.params.id};
routes/finance.js#126
Informacje o stanie konta bankowego:SELECT * FROM konto_bankowe;
Kawy
Wyświetlenie kaw wraz z przepisami:
SELECT * FROM rodzaje_kawy;
SELECT rodzaj_kawy_id, skladnik_id, p.ilosc, nazwa, jednostka
FROM przepisy p
JOIN skladniki s
ON p.skladnik_id = s.id;
Dodawanie kawy wraz z przepisem:
INSERT INTO rodzaje_kawy (nazwa, marza)
VALUES (${name}, ${priceMargin})
RETURNING id;
INSERT INTO przepisy (rodzaj_kawy_id, skladnik_id, ilosc)
VALUES (${coffeeId}, ${item.id}, ${item.amount});
Usunięcie kawy:
DELETE FROM przepisy
WHERE rodzaj_kawy_id=${id};
DELETE FROM rodzaje_kawy
WHERE id=${id};
Interfejs graficzny
Ekran logowania
Ekran rejestracji
Oferta
Szczegóły konta
Ekran zamówień
Potwierdzenie zamówienia
Finanse
Składniki
Wyroby cukiernicze
Przepisy
Wprowadzanie danych
Inicjalizacja danych w bazie odbywa się poprzez import pliku sql/populate.sql. Następnie dane mogą być wprowadzane ręcznie przy pomocy formularzy. Niektóre dane takie jak cena kawy, status kawy, składnika, wyrobu cukierniczego bądź zamówienia aktualizowane są automatycznie poprzez triggery.
Dokumentacja kodu
Znajduje się w kodzie.