Moja baza danych ma pomóc utrzymać studenta przy życiu przy minimum kosztów. Tabela products zawiera podstawowe informacje o produktach, które student może wybrać do swojej stołówki. Pogrupowane są na typy, która pomoże utrzymać zdrową zbilansowaną dietę (więcej informacji w tabeli types i opisie poszczególnych typów. W domyśle tabela products miała zawierać więcej informacji o wartości odżywczej, ale dla prostoty projektu ograniczyłem się do trzech podstawowych wartości. Jako, że zbilansowana dieta powinna zawierać odpowiednie proporcje energii pochodzącej z węglowodanów, tłuszczy i białka zawarłem właśnie te informacje w tabeli. Tabela users zawiera informacje o użytkownikach (czyli studentach, którzy docelowo mają przeżyć; śmierć studenta uznawana jest za niepowodzenie). Zawiera typowe dane potrzebne do logowania. W tabeli defaults znajdują się informacje o cenie (price) za określoną ilość produktu (value). Niezależnie od tego kolumna item_size zawiera informację o masie jednej sztuki/opakowania itp. Np. W przypadku bananów może być tak, że price wynosi 5 zł, za value 1 kg, gdzie item_size to 0,1 kg (bo tyle może ważyć jeden banan). Tabela dates przechowuje informacje o tym jakie dany użytkownik wybrał produkty i jak często chce je spożywać. Załóżmy, że mamy studenta (nazwijmy go Charles (czytaj, z francuska szarl)). Pierwsze, co powinien zrobić to wybrać produkty spośród których ma być dobierany jadłospis. Powiedzmy, że lubi twaróg półtłusty. W takim razie dodaje go do swoich produktów i ustawia przedział interwałów na małą ilość dni np. od 4 (interwal_min) do 14 (interval_max). Z tego przedziału skrypt będzie wybierał interwał główny (interval) tak, by zbilansować dietę. Im większe przedziały tym łatwiej będzie dobrać dietę, bo skrypt ma większą możliwość manewru. Jeśli z kolei nie lubi kiszonej kapusty, ale ze sprawdzonego źródła wie, że jest zdrowa więc chce jej jeść odpowiednio niewiele. W takim razie ustawia interwał od np. 80 do 200 dni. Powiedzmy, że skrypt wylosował interwał 100 dni. W takim razie średnio przybywa 0,01 kg na dzień. Gdy Charles kupi pół kilograma kapusty to dodaje ją do kupionych dzięki czemu dostaje informację czy może jeszcze jej kupić (zakładka Lista zakupów na stronie, kolumna stan).
//////////////////////////////////////////////////////////////////PHP//////////////////////////////////////////////////////////////////////////// conn.inc.php $dbconn3 = pg_connect("host=localhost port=5432 dbname=foodb user=postgres password=pass"); header1.inc.php session_start(); <!doctype html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="main.css" /> header2.inc.php </head> <body> <header> if(isset($_post['logout'])){ $_SESSION['logged']=0; unset($_session['user_name']); unset($_session['id']); if(isset($_session['logged']) && $_SESSION['logged']==1){ echo "Jesteś zalogowany jako ". $_SESSION['user_name']; echo "<form method='post' action='". $_SERVER['PHP_SELF']. "'>"; echo "<button type='submit' name='logout'>wyloguj</button>"; echo "</form>"; else { <form method="post" action="login.php"> <span>login: <input type="text" name="name" /></span> <span>hasło: <input type="password" name="pass" /></span> <span><button type="submit" name="login" />Zaloguj</button></span> </form> <span><a href="add_user1.php">zarejestruj się</a></span> </header> <nav> <span><a href="product_details.php">lista produktów</a></span> if($_session['logged']==1){ <span><a href='shopping_list.php'>lista zakupów</a></span> <span><a href="daily_stats.php">dzienne średnie</a></span> <span><a href="add_purchase.php">dodaj zakup</a></span> <span><a href='balance.php'>generuj zakupy</a></span>
</nav> footer.inc.php </body> </html> index.php header("location:product_details.php"); process.php require('conn.inc.php'); require('header1.inc.php'); require('functions.inc.php'); echo "<title></title>"; require('header2.inc.php'); if(isset($_post['butt'])){ if($_post['butt']=='edit'){ echo '<div class="info">nie mam już siły... ZIEEEW...</div>'; $query="select p.name, d.value, da.interval, da.interval_min, da.interval_max FROM products p, defaults d, dates da WHERE da.product_id=d.product_id AND d.product_id=p.product_id AND p.product_id=". $_POST['edit']. ";"; extract(pg_fetch_array($result)); <form method="post" action="process.php"><table> <tr><td colspan="2"> echo "Edytujesz produkt: ". $name;? ></td></tr> <input type="hidden" name="product_id" value=" echo $_POST['edit']; " /> <tr><td>interwał dla porcji echo $value; kg: </td><td><input type="number" name="interval" value=" echo $interval; " /></td></tr> <tr><td>interwał min.:</td><td> <input type="number" name="interval_min" value=" echo $interval_min; " /></td></tr> <tr><td>interwał maks.: </td><td><input type="number"
name="interval_max" value=" echo $interval_max; " /></td></tr> <tr><td><input type="submit" name="edit" value="zmień" /></td></tr> </table></form> elseif($_post['butt']=='del'){ $query = "DELETE FROM dates WHERE product_id=". $_POST['edit']. " AND user_id=". $_SESSION['id']. ";"; echo "<div class='info okinfo'>niegodny produkt został usunięty. Po co on komu w ogóle? Miałeś rację tak czyniąc Wasza Nikczemność!</div>"; else{ $query="select p.name, d.value FROM products p, defaults d WHERE d.product_id=p.product_id AND p.product_id=". $_POST['add']. ";"; extract(pg_fetch_array($result)); <form method="post" action="process.php"><table> <tr><td colspan="2"> echo "Dodajesz produkt:". $name;? ></td></tr> <input type="hidden" name="product_id" value=" echo $_POST['add']; " /> <tr><td>interwał dla porcji echo $value; kg: </td><td><input type="number" name="interval" /></td></tr> <tr><td>interwał min.:</td><td> <input type="number" name="interval_min" /></td></tr> <tr><td>interwał maks.: </td><td><input type="number" name="interval_max" /></td></tr> <tr><td><input type="submit" name="add" value="dodaj" /></td></tr> </table></form> if(isset($_post['add']) && $_POST['add']=='Dodaj'){ $query="insert INTO dates(product_id,user_id,interval,interval_min,interval_max) VALUES (". $_POST['product_id']. ",". $_SESSION['id']. ",". $_POST['interval']. ",". $_POST['interval_min']. ",". $_POST['interval_max']. ");"; if(isset($_post['edit']) && $_POST['edit']=='Zmień'){ $query="update dates SET interval=". $_POST['interval']. ", interval_min=". $_POST['interval_min']. ", interval_max=". $_POST['interval_max']. " WHERE product_id=". $_POST['product_id']. " AND user_id=". $_SESSION['id']. ";"; echo $query; require('footer.inc.php'); product_details.php require('conn.inc.php');
require('functions.inc.php'); require('header1.inc.php'); echo "<title>szczegóły produktów</title>"; require('header2.inc.php'); require('change_product.php'); if($_session['logged']==1){ <form action="process.php" method="post"><table class="center"> echo "<td><select name='edit'>"; $query = "SELECT product_id, name FROM products;"; while($row = pg_fetch_array($result)){ extract($row); if(is_listed($product_id)){ echo "<option value='". $product_id. "'>". $name. "</option>"; echo "</select></td>\n"; echo "<td><button type='submit' name='butt' value='edit'>edytuj</button></td>"; echo "<td><button type='submit' name='butt' value='del'>usuń</button></td>"; echo "<td><select name='add'>"; $query = "SELECT product_id, name FROM products;"; while($row = pg_fetch_array($result)){ extract($row); if(!is_listed($product_id)){ echo "<option value='". $product_id. "'>". $name. "</option>"; echo "</select></td>"; echo "<td><button type='submit' name='butt' value='add'>dodaj</button></td>"; echo "</table></form>"; list_view('product_data'); require('footer.inc'); shopping_list.php require('conn.inc.php'); require('functions.inc.php'); require('header1.inc.php'); echo "<title>lista zakupów</title>"; require('header2.inc.php'); personal_list_view('personal_to_buy_list', $_SESSION['id']); require('footer.inc');
login.php require('conn.inc.php'); require('header1.inc.php'); echo "<title>logowanie</title>"; require('header2.inc.php'); if($_session['logged']==1){ echo "<div class='badinfo info'>jesteś już zalogowany</div>"; else { $query = "SELECT user_name, user_id FROM users WHERE user_name='". $_POST['name']. "' AND user_pass='". $_POST['pass']. "';"; $row = pg_fetch_array($result); extract($row); if($row==""){ echo "<div class='badinfo info'>zły login lub hasło!</div>"; else { $_SESSION['logged'] = 1; $_SESSION['user_name']=$user_name; $_SESSION['id']=$user_id; echo "<div class='okinfo info'>zostałeś zalogowany jako ". $user_name. "</div>"; header( "refresh:3;url=product_details.php" ); require('footer.inc.php'); add_purchase.php require('conn.inc.php'); require('functions.inc.php'); require('header1.inc.php'); echo "<title>dodaj zakup</title>"; require('header2.inc.php'); <form id="add_purchase" action="add_purchase.php" method="post"> <table class="perslistview"> <tr> <th>fejk</th> <th class="coltext">nazwa</th> <th>data</th> <th>ilość (kg lub l)</th> <th>cena (zł)</th>
</tr> if(!isset($_post['step'])){ echo "<tr><td>fejk</td><td>"; echo "<select name='name'>"; $query = "SELECT p.product_id, p.name FROM products p, dates da WHERE da.product_id=p.product_id AND da.user_id=". $_SESSION['id']. " ORDER BY name;"; while($row = pg_fetch_array($result)){ extract($row); echo "<option value='". $product_id. "'>". $name. "</option>"; echo "</select>"; echo "</td><td colspan='3'>...wybierz produkt</td>"; echo "</td></tr>"; echo "<tr><td>fejk</td><td colspan='4'><button type='submit' name='step' value='1'>dalej</button></td></tr>"; elseif($_post['step']==1){ $query ="SELECT p.name, d.value, d.price, current_date FROM products p, defaults d WHERE p.product_id=". $_POST['name']. " AND d.product_id=p.product_id;"; extract(pg_fetch_array(pg_query($query))); <tr> <td>fejk</td> <td> echo $name; </td> <td><input type="date" name="purchase_date" value=" echo date('y-md'); " /></td> <td><input type="number" min="0" name="value" value=" echo $value; " /></td> <td><input type="number" min="0" name="price" value=" echo $price; " /></td> </tr> <tr> <td>fejk</td><td colspan="4"><button type="submit" form="add_purchase" name="step" value="2">dodaj zakup</button></td> </tr> <input type="hidden" name="product_id" value=" echo $_POST['name'];? >" /> elseif($_post['step']==2){ $query = "INSERT INTO shopping_list(purchase_date, product_id, value, price, user_id) VALUES ('". $_POST['purchase_date']. "', ". $_POST['product_id']. ", ". $_POST['value']. ", ". $_POST['price']. ", ". $_SESSION['id']. ");"; pg_query($query); header("location: add_purchase.php"); personal_view_without_heading('bought', $_SESSION['id']); </table> </form> add_user1.php
require('conn.inc.php'); require('header1.inc.php'); echo "<title>dodaj użytkownika</title>"; require('header2.inc.php'); <form action="add_user2.php" method="post"> <table> <tr><td>nazwa użytkownika</td><td><input type="text" name="name" /></td></tr> <tr><td>adres e-mail</td><td><input type="email" name="email" /></td></tr> <tr><td>hasło</td><td><input type="password" name="pass" /></td></tr> <tr><td colspan="2"><input class="submit" type="submit" name="add" value="dodaj"/></td></tr> </table> </form> require('footer.inc.php'); add_user2.php require('conn.inc.php'); require('header1.inc.php'); echo "<title>dodawanie użytkownika ". $_POST['name']. "</title>"; require('header2.inc.php'); if(!(isset($_post['name']) && isset($_post['pass']) && isset($_post['email']))){ echo "<a href='add_user1.php'>popraw dane</a>"; else { $query = "INSERT INTO users(user_name, user_pass, user_mail) VALUES ('". $_POST['name']. "', '". $_POST['pass']. "', '". $_POST['email']. "');"; <div class="okinfo info">użytkownik echo $_POST['name']; został dodany.</div> require('footer.inc.php'); balance.php require('conn.inc.php'); require('header1.inc.php'); require('functions.inc.php'); echo "<title></title>"; require('header2.inc.php'); <div class="info">teraz zmieniają się interwały. Jeśli proces będzie trwał zbyt długo (ponad minutę) zmień interwały, dodaj produkty lub poczytaj Szekspira</div>
function max_id(){ $query = "SELECT max(p.product_id) FROM products p, dates da WHERE p.product_id = da.product_id AND da.user_id=". $_SESSION['id'].";"; extract(pg_fetch_array(pg_query($query))); return $max; function get_rand_id(){ //zwraca id losowego produktu któregi is_listed jest true $max = max_id(); do{ $result=mt_rand(0,$max); while(!is_listed($result)); return $result; //chyba działa, ale jeszcze nie jestem pewien function change_interval($id){ $query = "UPDATE dates SET interval =". new_interval($id). " WHERE product_id= ". $id. " AND user_id=". $_SESSION['id']. ";"; function new_interval($id){ $query = "SELECT dsc.energia, da.interval, da.interval_max, da.interval_min FROM dates da, daily_stats_clean dsc WHERE da.user_id=dsc.user_id AND da.product_id=". $id. " AND da.user_id=". $_SESSION['id']. ";"; extract(pg_fetch_array(pg_query($query))); if(($energia-2200)<0){ return mt_rand($interval_min, $interval); else { return mt_rand($interval, $interval_max); function balance(){ $i=1; $query = "SELECT * FROM percentage_clean WHERE user_id=". $_SESSION['id']. ";"; extract(pg_fetch_array(pg_query($query))); while( ($prot_per<0.10) ($prot_per>0.15) ($carb_per<0.55) ($carb_per>0.65) ($fat_per<0.15) ($fat_per>0.30)){ change_interval(get_rand_id()); echo "a "; $query = "SELECT * FROM percentage_clean WHERE user_id=". $_SESSION['id']. ";"; extract(pg_fetch_array(pg_query($query))); $i++; flush(); ob_flush(); echo "<div class='info okinfo'>udało się! Jej!</div>"; balance(); require('footer.inc');
daily_stats.php require('conn.inc.php'); require('header1.inc.php'); echo "<title>dzienne średnie</title>"; require('header2.inc.php'); require('functions.inc.php'); personal_list_view('daily_stats', $_SESSION['id']); personal_list_view('percentage', $_SESSION['id']); <table> <tr> <th colspan="3">akceptowalne przedziały</th> </tr> <tr> <td>10% - 15%</td> <td>55% - 65%</td> <td>15% - 30%</td> </tr> </table> require('footer.inc'); functions.inc.php function is_listed($id){ $query = "SELECT product_id FROM dates WHERE product_id=". $id. " AND user_id=". $_SESSION['id'].";"; if(pg_num_rows(pg_query($query))!=0){ return true; else { return false; //echo tej funkcji nie wyświetla 0 dla false, ale dla true wyświetla 1!!?? function list_view($view_name){ // wyświetla tabelarycznie $query= "SELECT column_name FROM information_schema.columns WHERE table_name = '". $view_name. "'"; echo "<table>"; echo "<tr>"; while($row = pg_fetch_array($result)){ extract($row); echo "<th>". $column_name. "</th>"; echo "</tr>"; $query = "SELECT * FROM ". $view_name.";"; $length = pg_num_fields($result); //zwraca ilość kolumn while($row = pg_fetch_row($result)){ echo "<tr>"; for($i=0; $i<$length; $i++){ echo "<td>". $row[$i]. "</td>";
echo "</tr>"; echo "</tr>"; echo "</table>"; function personal_list_view($view_name, $pers_id){ // wyświetla tabelarycznie $query= "SELECT column_name FROM information_schema.columns WHERE table_name = '". $view_name. "'"; echo "<table class='perslistview'>"; echo "<tr>"; while($row = pg_fetch_array($result)){ extract($row); echo "<th>". $column_name. "</th>"; echo "</tr>"; $query = "SELECT * FROM ". $view_name." WHERE user_id=". $pers_id. ";"; $length = pg_num_fields($result); //zwraca ilość kolumn while($row = pg_fetch_row($result)){ echo "<tr>"; for($i=0; $i<$length; $i++){ echo "<td>". $row[$i]. "</td>"; echo "</tr>"; echo "</table>"; function view_without_heading($view_name){ // wyświetla tabelarycznie $query = "SELECT * FROM ". $view_name.";"; $length = pg_num_fields($result); //zwraca ilość kolumn while($row = pg_fetch_row($result)){ echo "<tr>"; for($i=0; $i<$length; $i++){ echo "<td>". $row[$i]. "</td>"; echo "</tr>"; echo "</tr>"; echo "</table>"; function personal_view_without_heading($view_name, $pers_id){ // wyświetla tabelarycznie $query = "SELECT * FROM ". $view_name. " WHERE user_id=". $pers_id. ";"; $length = pg_num_fields($result); //zwraca ilość kolumn while($row = pg_fetch_row($result)){ echo "<tr>"; for($i=0; $i<$length; $i++){ echo "<td>". $row[$i]. "</td>";
echo "</tr>"; echo "</tr>"; echo "</table>"; main.css @charset "utf-8";.val{ text-align:right;.col1{ width: 100px;.coltext{ width: 150px; table.center td{ text-align:center; td, th { border-width:0px; border-color: #000; border-style: solid; padding-left:5px; padding-right: 5px; height:28px; width: 120px; text-align:right; th{ background-color:#bbb; text-align:center; tr:nth-child(odd) { background-color:#eee; input { text-align:right; width:120px; input.submit { width:70px; text-align:center; td.unit{ width:120px; text-align:left;
input.text{ width: 140px; text-align:left;.center{ text-align: center;.add td { border-color:#999; color:#999; nav span{ padding:10px; nav{ padding:10px; button { background-color:#f5f5f5; -moz-border-radius:1px; -webkit-border-radius:1px; border-radius:1px; border:1px solid #000000; display:inline-block; cursor:pointer; color:#000; font-family:serif; font-size:15px; padding:2px 10px; text-decoration:none; button:hover { background-color:#fff; button:active { position:relative; top:1px;.date button{ display: none;.date:hover button{ display:inline;.date:hover span{ display:none; header{ text-align: right; table.perslistview tr td:first-child, table.perslistview tr th:first-child { display: none;
.info{ text-align:center; color:#fff; font-weight:bold; font-size:18px; padding:3px; background-color:#fc0;.okinfo{ background-color:#090;.badinfo{ background-color:#f00;
///////////////////////////////////SQL////////////////////////////////////////// CREATE TABLE products ( product_id SERIAL, type_id INTEGER, name VARCHAR(50), protein NUMERIC(4,1), carb NUMERIC(4,1), fat NUMERIC(4,1) ); CREATE TABLE defaults ( product_id INTEGER, value NUMERIC(10,3), price NUMERIC(10,2), item_size NUMERIC(10,3) ); CREATE TABLE types ( type_id SERIAL, type_name VARCHAR(40), type_descr VARCHAR(500) ); CREATE TABLE dates ( product_id INTEGER, user_id INTEGER, zero_date DATE, interval INTEGER, interval_min INTEGER, interval_max INTEGER ); CREATE TABLE users ( user_id SERIAL, user_name VARCHAR(30), user_pass VARCHAR(50), user_mail VARCHAR(50) ); CREATE TABLE shopping_list ( purchase_id SERIAL, purchase_date DATE, user_id INTEGER, product_id INTEGER, value NUMERIC(10,3), price NUMERIC(10,2) ); ALTER TABLE dates ALTER COLUMN product_id SET NOT NULL; ALTER TABLE dates ALTER COLUMN zero_date SET NOT NULL; ALTER TABLE dates ALTER COLUMN interval SET NOT NULL; ALTER TABLE dates ALTER COLUMN interval_min SET NOT NULL; ALTER TABLE dates ALTER COLUMN interval_max SET NOT NULL; ALTER TABLE defaults ALTER COLUMN product_id SET NOT NULL; ALTER TABLE defaults ALTER COLUMN value SET NOT NULL; ALTER TABLE defaults ALTER COLUMN price SET NOT NULL;
ALTER TABLE shopping_list ALTER COLUMN purchase_id SET NOT NULL; ALTER TABLE shopping_list ALTER COLUMN product_id SET NOT NULL; ALTER TABLE shopping_list ALTER COLUMN user_id SET NOT NULL; ALTER TABLE shopping_list ALTER COLUMN purchase_date SET NOT NULL; ALTER TABLE shopping_list ALTER COLUMN value SET NOT NULL; ALTER TABLE shopping_list ALTER COLUMN price SET NOT NULL; ALTER TABLE types ALTER COLUMN type_id SET NOT NULL; ALTER TABLE types ALTER COLUMN type_name SET NOT NULL; ALTER TABLE users ALTER COLUMN user_id SET NOT NULL; ALTER TABLE users ALTER COLUMN user_name SET NOT NULL; ALTER TABLE users ALTER COLUMN user_pass SET NOT NULL; ALTER TABLE users ALTER COLUMN user_mail SET NOT NULL; ALTER TABLE products ALTER COLUMN product_id SET NOT NULL; ALTER TABLE products ALTER COLUMN type_id SET NOT NULL; ALTER TABLE products ALTER COLUMN name SET NOT NULL; ALTER TABLE products ALTER COLUMN protein SET NOT NULL; ALTER TABLE products ALTER COLUMN carb SET NOT NULL; ALTER TABLE products ALTER COLUMN fat SET NOT NULL; ALTER TABLE types ADD PRIMARY KEY (type_id); ALTER TABLE products ADD PRIMARY KEY (product_id); ALTER TABLE users ADD PRIMARY KEY (user_id); ALTER TABLE dates ADD PRIMARY KEY (product_id, user_id); ALTER TABLE shopping_list ADD PRIMARY KEY (purchase_id); ALTER TABLE products ADD FOREIGN KEY (type_id) REFERENCES types(type_id) ON UPDATE CASCADE ON DELETE RESTRICT; ALTER TABLE defaults ADD FOREIGN KEY (product_id) REFERENCES products(product_id)on UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE dates ADD FOREIGN KEY (product_id) REFERENCES products(product_id) ON UPDATE CASCADE ON DELETE RESTRICT; ALTER TABLE dates ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE shopping_list ADD FOREIGN KEY (product_id) REFERENCES products(product_id) ON UPDATE CASCADE ON DELETE RESTRICT; ALTER TABLE shopping_list ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE CASCADE ON DELETE RESTRICT; ALTER TABLE types ADD UNIQUE (type_name); ALTER TABLE products ADD UNIQUE (name); ALTER TABLE defaults ADD UNIQUE (product_id); ALTER TABLE dates ADD UNIQUE (user_id, product_id); ALTER TABLE users ADD UNIQUE (user_name); ALTER TABLE users ADD UNIQUE (user_mail); ALTER TABLE dates ALTER COLUMN zero_date SET DEFAULT current_date; ALTER TABLE dates ADD CHECK (interval BETWEEN interval_min AND interval_max); ALTER TABLE dates ADD CHECK (interval_min>0 AND interval_min<=interval_max); ALTER TABLE dates ADD CHECK (zero_date<=current_date); ALTER TABLE products ADD CHECK (protein+fat+carb<=100); ALTER TABLE shopping_list ADD CHECK (purchase_date<=current_date); INSERT INTO types(type_id, type_name, type_descr) VALUES (1, 'warzywa', 'Należy sporzywać pięć porcji warzyw dziennie'), (2, 'owoce', 'Należy sporzywać 2-3 porcje owoców dziennie'),
(3, 'bobowate/mięso', 'Jedna porcja mięsa lub bobowatych (bób, cieciorka, groch, fasola, soczewica) dziennie wystarczy'), (4, 'oleje', 'Jedna porcja olejów dziennie. Np. półtora łyżki masła'), (5, 'orzechy', 'Garść orzechów jakichkolwiek dziennie'), (6, 'nabiał', 'Dwie porcje nabiału na dzień'), (7, 'produkty zbożowe', 'Do każdego posiłku, czyli 5 porcji dziennie. Zaliczają się tu wszelkie kasze, chleb, ziemniaki, ryż.'), (8, 'suszone owoce', 'Garść dziennie.'); INSERT INTO products(product_id,type_id,name,protein,carb,fat) VALUES (1,7,'amarantus',14.5,66.2,6.5), (2,2,'banan',1,23.5,0.3), (3,3,'biała fasola',21.4,61.6,1.6), (4,1,'burak',1.8,9.5,0.1), (5,3,'cieciorka',19.3,60.6,6), (6,3,'groch',23.8,60.2,1.4), (7,3,'groszek',4.9,15.8,0.2), (8,2,'jabłko',0.3,13.8,0.2), (9,3,'jajo',12.5,0.6,9.7), (10,6,'jogurt naturalny',4.3,6.2,2), (11,3,'kakao',27,16,10), (12,1,'kapusta biała',1.7,7.4,0.2), (13,1,'kapusta kiszona',1.1,3.4,0.2), (14,7,'kasza gryczana',12.6,69.3,3.1), (15,7,'kasza jaglana',10.5,71.6,2.9), (16,7,'kasza jęczmienna',6.9,68.8,2.2), (17,1,'marchew',1,8.7,0.2), (18,6,'maślanka',3.4,4.5,1.5), (19,7,'mąka żytnia 2000',8.5,74,2.2), (20,7,'mąka żytnia 720',6.5,77,1.7), (21,5,'migdały',20,20.5,42), (22,6,'mleko 3,2%',3.2,4.7,3.2), (23,5,'nasiona dyni',24.5,18,45.8), (24,5,'orzechy laskowe',15,17,61), (25,5,'orzechy włoskie',16,18,60.3), (26,5,'orzeszki ziemne',26,14,50), (27,3,'otręby pszenne',16.5,20.1,4.7), (28,1,'papryka',1.3,6.6,0.5), (29,3,'pieczarki',2.7,2.6,0.4), (30,7,'płatki owsiane',11.9,69.3,7.2), (31,8,'rodzynki',2.3,71.2,0.5), (32,7,'ryż brązowy',7.1,76.8,1.9), (33,1,'rzodkiewka',1,4.4,0.2), (34,1,'seler korzeniowy',1.6,7.7,0.3), (35,6,'ser żółty',24.9,27.4,2.2), (36,6,'serek wiejski',11,2,5), (37,5,'sezam',23.2,2.1,59.9), (38,5,'siemie lniane',19.8,1,41.9), (39,5,'słonecznik',24.4,24.6,43.7), (40,3,'soczewica czerwona',25.4,48.6,3), (41,3,'soczewica zielona',24.2,60.8,0.6), (42,3,'soja',34.3,17,19.6), (43,8,'suszone śliwki',3.5,68.9,1.2), (44,6,'twaróg półtłusty',18.7,3.7,4.7), (45,3,'wątróbka z indyka',17.8,2.3,16.4), (46,3,'wątróbka z kury',19.1,0.6,6.3), (47,3,'zarodki pszenne',27.5,31.5,9.4), (48,7,'ziemniak',1.9,18.3,0.1);
INSERT INTO defaults(product_id,value,price,item_size) VALUES (1,0.5,7,0.4), (2,1,5,0.12), (3,1,10,0.4), (4,1,1.5,0.1), (5,1,8,0.4), (6,1,4,0.4), (7,0.2,2,0.24), (8,1,2.5,0.18), (9,0.5,7,0.5), (10,0.2,1.5,0.2), (11,0.2,5,0.2), (12,1,3,4.5), (13,1,2.5,0.3), (14,0.4,4,0.4), (15,1,7,0.4), (16,0.4,2.5,0.4), (17,1,2,0.05), (18,1,3.5,1), (19,0.9,2.5,1), (20,0.9,2.5,1), (21,1,35,0.2), (22,1,3.01,1), (23,1,35,0.2), (24,1,35,0.2), (25,1,40,0.2), (26,1,10,0.2), (27,0.15,1.3,0.15), (28,1,5,0.15), (29,1,10,0.02), (30,0.5,2.2,0.5), (31,1,15,0.2), (32,0.4,3.5,0.4), (33,0.1,1.5,0.115), (34,1,3.5,0.3), (35,1,20,0.4), (36,0.2,2.5,0.2), (37,0.3,5.4,0.2), (38,0.4,3.35,0.35), (39,1,20,0.2), (40,1,10,0.4), (41,1,7,0.4), (42,0.35,2.8,0.4), (43,1,20,0.2), (44,0.2,3.5,0.2), (45,1,10,0.3), (46,1,7,0.3), (47,0.15,1.7,0.15), (48,1,1.5,1); INSERT INTO users(user_id, user_name, user_pass, user_mail) VALUES (1, 'testuser', 'pass', 'test@test.pl'), (2, 'another', 'pass', 'another@test.pl'); INSERT INTO dates(product_id,user_id,zero_date,interval,interval_min,interval_max) VALUES (1,1,'2014-01-14',398,25,399), (2,1,'2014-01-14',30,7,30), (3,1,'2014-01-14',380,1,400),
(4,1,'2014-01-14',400,1,400), (5,1,'2014-01-14',400,1,400), (6,1,'2014-01-14',200,1,200), (7,1,'2014-01-14',384,1,400), (8,1,'2014-01-14',30,1,30), (9,1,'2014-01-14',19,10,20), (10,1,'2014-01-14',14,7,14), (11,1,'2014-01-14',20,7,20), (12,1,'2014-01-14',33,15,200), (13,1,'2014-01-14',35,1,40), (14,1,'2014-01-14',99,30,100), (15,1,'2014-01-14',8,1,400), (16,1,'2014-01-14',355,1,400), (17,1,'2014-01-14',14,5,15), (18,1,'2014-01-14',368,1,400), (19,1,'2014-01-14',15,7,20), (20,1,'2014-01-14',9,7,20), (21,1,'2014-01-14',492,50,500), (22,1,'2014-01-14',3,2,3), (23,1,'2014-01-14',386,1,400), (24,1,'2014-01-14',398,1,400), (25,1,'2014-01-14',400,1,400), (26,1,'2014-01-14',86,1,400), (27,1,'2014-01-14',20,5,20), (28,1,'2014-01-14',242,1,400), (29,1,'2014-01-14',100,10,100), (30,1,'2014-01-14',7,4,7), (31,1,'2014-01-14',394,1,400), (32,1,'2014-01-14',131,1,200), (33,1,'2014-01-14',392,1,400), (34,1,'2014-01-14',400,1,400), (35,1,'2014-01-14',399,1,400), (36,1,'2014-01-14',106,1,400), (37,1,'2014-01-14',400,1,400), (38,1,'2014-01-14',50,10,50), (39,1,'2014-01-14',396,1,400), (40,1,'2014-01-14',400,1,400), (41,1,'2014-01-14',169,1,400), (42,1,'2014-01-14',396,1,400), (43,1,'2014-01-14',58,1,400), (44,1,'2014-01-14',40,1,40), (45,1,'2014-01-14',39,10,40), (46,1,'2014-01-14',40,10,40), (47,1,'2014-01-14',46,10,50), (48,1,'2014-01-14',395,1,400), (1,2,'2014-01-14',398,25,399), (2,2,'2014-01-14',30,7,30); CREATE OR REPLACE FUNCTION energy(id INTEGER) RETURNS NUMERIC(4,1) AS $$ DECLARE protein NUMERIC(4,1); carb NUMERIC(4,1); fat NUMERIC(4,1); BEGIN SELECT p.protein INTO protein FROM products p WHERE p.product_id=id; SELECT p.carb INTO carb FROM products p WHERE p.product_id=id; SELECT p.fat INTO fat FROM products p WHERE p.product_id=id; RETURN protein*4 + carb*4 + fat*9; END;
$$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION sum_cost(id INTEGER) RETURNS DECIMAL(10,2) AS $$ DECLARE res DECIMAL(10,2); BEGIN SELECT sum(sl.value) INTO res FROM shopping_list sl WHERE sl.product_id = id; IF res IS NOT NULL THEN RETURN res; ELSE RETURN 0; END IF; END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION days_passed(day DATE) RETURNS INTEGER AS $$ DECLARE gap INTEGER; BEGIN SELECT (current_date-day) INTO gap; RETURN gap; END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION buyable(id INTEGER) RETURNS DECIMAL(10,3) AS $$ DECLARE res DECIMAL(10,3); sum DECIMAL(10,2); gap INTEGER; inter INTEGER; zdate DATE; val DECIMAL(10,2); BEGIN SELECT sum_cost(id) INTO sum; SELECT zero_date INTO zdate FROM dates WHERE product_id = id; SELECT days_passed(zdate) INTO gap; SELECT interval INTO inter FROM dates WHERE product_id = id; SELECT value INTO val FROM defaults WHERE product_id = id; RETURN round((((gap*val)/inter) - sum), 3); END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE VIEW product_data AS SELECT p.name AS "nazwa", t.type_name AS "rodzaj", energy(p.product_id) ' kcal' AS "energia", p.protein ' g' AS "białko", p.carb ' g' AS "węglowodany", p.fat ' g' AS "tłuszcze" FROM products p, types t WHERE t.type_id=p.type_id; CREATE OR REPLACE VIEW to_buy_list AS SELECT p.product_id,
FROM p.name AS "nazwa", buyable(p.product_id) ' kg' AS "stan", '+' round(d.value/da.interval, 2) ' kg' AS "przyrost", d.item_size ' kg' AS "w paczce", d.price ' zł' AS "domyślna cena", d.value ' kg' AS "domyślna ilość", da.interval ' dni' AS "interwał", da.interval_min ' dni' AS "interwał min.", da.interval_max ' dni' AS "interwał maks.", da.zero_date AS "data pocz." products p, defaults d, dates da WHERE p.product_id=d.product_id AND p.product_id=da.product_id ORDER BY buyable(p.product_id) DESC; CREATE OR REPLACE VIEW personal_to_buy_list AS SELECT u.user_id, p.name AS "nazwa", buyable(p.product_id) ' kg' AS "stan", '+' round(d.value/da.interval, 2) 'kg' AS "przyrost", d.item_size ' kg' AS "w paczce", d.price ' zł' AS "domyślna cena", d.value ' kg' AS "domyślna ilość", da.interval ' dni' AS "interwał", da.interval_min ' dni' AS "interwał min.", da.interval_max ' dni' AS "interwał maks.", da.zero_date AS "data pocz." FROM products p, defaults d, dates da, users u WHERE p.product_id=d.product_id AND p.product_id=da.product_id AND u.user_id=da.user_id ORDER BY buyable(p.product_id) DESC; CREATE OR REPLACE VIEW daily_stats AS SELECT da.user_id, round(sum(d.price/da.interval), 2) ' zł' AS "wydatki", round(sum((d.value/da.interval)*10*energy(p.product_id)), 0) ' kcal' AS "energia", round(sum((d.value/da.interval)*10*p.protein), 0) ' g' AS "białko", round(sum((d.value/da.interval)*10*p.carb), 0) ' g' AS "węglowodany", round(sum((d.value/da.interval)*10*p.fat), 0) ' g' AS "tłuszcze" FROM products p, defaults d, dates da
WHERE p.product_id = d.product_id AND p.product_id = da.product_id GROUP BY da.user_id; CREATE OR REPLACE VIEW daily_stats_clean AS SELECT da.user_id, round(sum(d.price/da.interval), 2) AS "wydatki", round(sum((d.value/da.interval)*10*energy(p.product_id)), 0) AS "energia", round(sum((d.value/da.interval)*10*p.protein), 0) AS "białko", round(sum((d.value/da.interval)*10*p.carb), 0) AS "węglowodany", round(sum((d.value/da.interval)*10*p.fat), 0) AS "tłuszcze" FROM products p, defaults d, dates da WHERE p.product_id = d.product_id AND p.product_id = da.product_id GROUP BY da.user_id; CREATE OR REPLACE VIEW percentage AS SELECT user_id, round((białko/energia)*4*100,0) '%' AS "energia z białka", round((węglowodany/energia)*4*100,0) '%' AS "energia z węglowodanów", round((tłuszcze/energia)*9*100,0) '%' AS "energia z tłuszczy" FROM daily_stats_clean; CREATE OR REPLACE VIEW percentage_clean AS SELECT user_id, round(białko*4/energia, 2) AS "prot_per", round(węglowodany*4/energia, 2) AS "carb_per", round(tłuszcze*9/energia, 2) AS "fat_per" FROM daily_stats_clean; CREATE OR REPLACE VIEW bought AS SELECT sl.user_id, p.name, sl.purchase_date, sl.value, sl.price FROM shopping_list sl INNER JOIN products p USING (product_id) ORDER BY purchase_date DESC;
Rys 1. Rejestracja użytkownika Rys 2. Logownie Rys 3. Dodawanie zakupu.
Rys 5. Generowanie listy jadłospisu. Rys 4. Edytownie produktu