Komanda:
Ariadna Ivanova
Mihails Korčevskis
Marks Grišajevs
Andris Mačevskis
Marks Rozenbergs
# **Ievads**
## Problēmas nostādne
Uzturvērtību skaitīšana ir sarežģīts un laikietilpīgs process, it īpaši, ja to dara ar roku uz papīra lapas un ir nepieciešams ņemt vērā uzturvielu balansu, budžetu un katra cilvēka ēšanas paradumus. Reti kurš pieņem šādu izaicinājumu, lai gan sabalansēts un atbilstošs budžetam uzturs ir svarīgs ikvienam cilvēkam. Tapēc ir nepieciešams risinājums, kurš atvieglotu šo procesu un spētu apmierināt katra lietotāja ēšanas paradumus, īpatnības un prasības.
## Mērķis
Izveidot digitālu risinājumu, kurš spētu minimizēt ēdiena izmaksas, ņemot vērā cilvēku individuālās vēlmes, nepieciešamo ikdienas uzņemto uzturvielu daudzumu, produktu izmaksas un citus speciālos nosacījumus, kurus norāda pats lietotājs.
# **Līdzīgo risinājumu pārskats**
Meklējot risinājumus dotajai problēmai, tika konstatēts, ka ir samērā grūti atrast risinājumu, kurš atbilstu visām problēmas nostādnē definētām prasībām. Atrasto risinājumu mērķis ir izveidot pilnvērtīgu ēdienkarti, ņemot vērā kaloriju patēriņu un uzturvielu balansu, bet budžets tajos netiek ņemts vērā kā faktors; tas liecina, ka mūsu uzstādītajai problēmai šie risinājumi nav pilnībā derīgi, toties tie bija pietuvinātākie no iespējamiem. Turklāt daļa no atrastajiem risinājumiem ietver sevī maksas pakalpojumus pilnajai funkcionalitātei, kas liecina par to nepieejamību visiem lietotājiem.
## Teorētiskais pamatojums
### Algoritmu veidi
Tiešsaistē tika atrasti un izpētīti šādi raksti par izvēlēto problēmu:
* [Lineārā programmēšana](https://towardsdatascience.com/linear-programming-and-discrete-optimization-with-python-using-pulp-449f3c5f6e99);
* [Interfeiss *Python* programmēšanas valodā piekļūšanai pie *IBM ILOG CPLEX Optimization Studio* rīka](https://pypi.org/project/cplex);
* [Interfeiss *Python* programmēšanas valodā piekļūšanai pie dažādiem ārējiem rīkiem-risinātājiem](https://coin-or.github.io/pulp/index.html);
* [*Gurobi Optimizer* rīka izmantošana ar *Wolfram* valodas palīdzību](https://towardsdatascience.com/using-the-gurobi-optimizer-in-the-wolfram-language-939ce585ec64);
* [Bibliotēka *Python* programmēšanas valodā lineārās programmēšanas problēmu risināšanai](https://cvxopt.org/userguide/index.html).
### Novērtēšanas kritēriji
Lai turpmāk varētu salīdzināt risinājumus, tika izstrādāti šādi vērtēšanas kritēriji:
1. Vai risinājums ir mērķēts uz izdevumu mazināšanu;
2. Vai risinājumā ir iespēja pievienot sev patīkamus produktus (izveidot savu produktu sarakstu);
3. Vai risinājumā ir sniegts kāds sākotnējs produktu saraksts;
4. Vai risinājumā ir iespēja apskatīt piedāvātās ēdienkartes uzturvielu daudzumu;
5. Vai risinājums ņem vērā cilvēka individuālos parametrus;
6. Vai risinājumā ir iespēja atzīmēt sev nevēlamos produktus (zivs, medus, u.c.);
7. Cik liels ir uzturvielu sarakstu, ko risinājums ņem vērā, veidojot ēdienkarti;
8. Vai risinājumam ir patīkama un saprotama saskarne.
## Līdzīgie risinājumi
Līdzīgo risinājumu apskatei tika izvēlētas šādas lietotnes un tiešsaistes risinājumi:
* Lifesum (lietotne);
* Mealime (lietotne);
* FatSecret (lietotne);
* MyNetDiary (lietotne);
* Eat This Much (lietotne);
* [Calorie calculator](https://www.calculator.net/calorie-calculator.html) (tiešsaistes risinājums);
* [Diet Problem](https://www.zweigmedia.com/RealWorld/dietProblem/diet.html) (tiešsaistes risinājums);
* [Diet Problem Solver](https://neos-guide.org/content/diet-problem-solver) (tiešsaistes risinājums).
---
<p style="text-align: right;">1.1. tabula</p>
<div style="text-align: center;"><b>Līdzīgo risinājumu novērtējums atbilstoši izvirzītajiem kritērijiem</b></div>
Risinājums | Izdevumu mazināšana | Savu produktu pievienošana | Ir produktu saraksts | Produktu uzturvielu daudzums | Cilvēka parametri | Nevelāmo produktu saraksts | Ērta saskarne | Cik liels ir uzturvielu saraksts
-|-|-|-|-|-|-|-|-
Lifesum | - | - | + | + | + | - | + | 0.5<sup>*</sup>
Mealime | - | + | + | + | - | + | + | 0.3<sup>*</sup>
FatSecret | - | + | + | + | + | - | + | 0.9
MyNetDiary | - | + | + | + | + | - | - (grūti saprotama iesācējam) | 0.9
Eat This Much | +<sup>*</sup> | + | + | + | + | + | ± | 1
Calorie calculator | - |- | + | + | + | - | - | 0.1
Diet Problem | - | - | + | + | + | + | ± (diezgan novecojusi) | 0.2
Diet Problem Solver | - | - | + | + | - | + | - (rezultāts tiek izvadīts uznirstošā logā) | 0.3
\* – ir pieejams tikai tiem lietotājiem, kuriem ir *premium* abonēšana

<div style="text-align: center;">1.2. att. <b>Līdzīgo risinājumu vidējā atbilstība izvirzītajiem kritērijiem</b></div>

<div style="text-align: center;">1.3. att. <b>Uzturvielu saraksta izmēra relatīvais salīdzinājums dažādos risinājumos</b></div>
# **Konceptu modelis**
Tika izstrādāts risinājuma konceptuālais modelis, kas grafiski attēlo šādu risinājuma darbības shēmu: vispirms lietotājs apskata bāzes produktu sarakstu, tad, ja nepieciešams, atlasa nevajadzīgos produktus, kā arī pievieno savus produktus atbilstoši personiskajai gaumei. Katrs lietotājs izvēlas produktus no iepriekš izveidotā saraksta un ievada savas parametru vērtības: augums, svars, vecums, personīgās īpatnības u.tml., - kuras tiek ņemtas vērā dienas ēdienkartes izveidē. Izstrādāto konceptuālo modeli var apskatīt 2.1. attēlā.

<div style="text-align: center;">2.1. att. <b>Risinājuma konceptuālais modelis</b></div>
### Prasību dekompozīcija
Pēc modeļa izveides tika nodefinētas šādas prasības topošajam risinājumam:
* Virslietotājs var rediģēt sākotnēji pieejamo produktu sarakstu;
* Lietotāji var reģistrēties pakalpojumam, pieteikties kontā, izrakstīties no konta;
* Lietotāji var skatīt savu kontu, pēc vēlēšanās dzēst to, rediģēt tā datus (kontaktinformāciju, cilvēka ķermeņa parametrus);
* Lietotāji var pievienot savus produktus, rediģēt to datus (uzturvērtības);
* Lietotāji var skatīt un rediģēt iepriekš izveidotās dienas ēdienkartes.
# **Tehnoloģiju steks**
Paredzēts, ka risinājums tiks izveidots, izmantojot *Ruby on Rails* un *Python* (*psycopg* – draiveris darbam ar datu bazu vadības sistēmu, *CVXOPT* – bibliotēka lineārās programmēšanas problēmas risināšanai), savukārt kā datu bazu vadības sistēma tiks izmantota *PostgreSQL*.
# **Prototipēšana**
Pirmajos izstrādes soļos, apdomājot kā mūsu komanda vēlētos redzēt gala rezultātu, *Figma* rīkā tika izstrādāts mūsu lietojuma prototips, kuru ir iespējams apskatīt [pēc šīs saites](https://www.figma.com/file/aBive4eXn208deNT70dzOC/Untitled?node-id=0%3A1).
# **Risinājuma izstrāde**
Risinājuma izstrādes gaita un rezultāti skatāmi [šajā *GitHub* repozitorijā](https://github.com/DungeonMaster666/rails_rtu). Tajā ir redzamas pēdējās veiktās izmaiņas, kā arī šo izmaiņu raksturs un autori. Risinājums regulāri tiek papildināts ar jaunām opcijām, līdz ar ko funkcionalitāte tiek tikai vien paplašināta.
# **Risinājuma novērtēšana**
Risinājums novērtēts, balstoties uz ISO 9126 standartā minētajiem novērtēšanas kritērijiem:
* Funkcionalitāte;
* Uzticamība;
* Lietojamība;
* Efektivitāte;
* Uzturamība;
* Pārnesamība.
## Eksperimenta plāns
### Eksperimenta mērķi
* Noteikt, vai ēdienkartes izveidošanas laiks mainās atkarībā no ēdienkartē iekļaujamo produktu skaita un, ja mainās, tad kā;
* Noteikt, vai parastajam lietotājam izstrādātais risinājums ir ērts un lietojams ikdienas dzīvē.
### Eksperimenta ieejas parametri
* Ēdienkartē iekļaujamo produktu skaits (objektīvs parametrs);
* Lietotāju sniegtie viedokļi (subjektīvs parametrs).
### Eksperimenta novērtēšanas mēri
* Ēdienkartes izveidošanas laiks (milisekundēs);
* Cik vizuāli labi pārskatāmi tika izvadīti produkti;
* Cik kopumā risinājums ir ērts, pārskatāms un patīkami noformēts.
### Eksperimenta rezultāti
Risinājuma novērtēšanas nolūkos tika aptaujāti vairāki lietotāji, kuri izmēģināja risinājumu darbībā un novērtēja to. Eksperimenta, kas ir saistīts ar objektīva parametra izmaiņu, rezultāti ir aplūkojami 5.1. tabulā, savukārt tāda eksperimenta, kas saistīts ar subjektīvu parametru izmaiņu, rezultāti ir aplūkojami 5.1. un 5.2. attēlos.
<p style="text-align: right;">6.1. tabula</p>
<div style="text-align: center;"><b>Risinājuma novērtēšana</b></div>
Ēdienkartē iekļaujamo produktu skaits | Ēdienkartes izveidošanas laiks jeb *Python* optimizācijas skripta izpildes laiks, ms
|-|-|
|90|1660|
|84 (pēc noklusējuma)|1830|
|80|1230|
|70|1280|
|60|1060|
|50|456.12<sup>*</sup>|
\* – tika izvadīta tukša ēdienkarte

<div style="text-align: center;">5.1. att. <b>Novērtēšanas rezultāti, cik vizuāli labi pārskatāmi tika izvadīti produkti</b></div>

<div style="text-align: center;">5.2. att. <b>Novērtēšanas rezultāti, cik kopumā risinājums ir ērts, pārskatāms un patīkami noformēts</b></div>
### Eksperimenta rezultātu analīze
* Līdz ar iekļaujamo produktu skaita samazināšanos ēdienkartes izveidošanas laiks samazinās;
* Veids, kādā tiek izvadīti produkti, tika vidēji novērtēts 7.1 ballēs, savukārt tas, cik kopumā risinājums ir ērts, pārskatāms un patīkami noformēts, ‐ 7 ballēs.
# **Risinājuma izvietošana**
Risinājums ir izvietots *Heroku* lietojumprogrammu mākoņplatformā. To ir iespējams aplūkot un izmēģināt tiešsaistē, izmantojot [šo saiti](https://cool-nutrition.herokuapp.com).
# **Lietotāja ceļvedis**
Šajā nodaļā ir pieejamas instrukcijas risinājuma aplūkošanai.
## Nepieteikušos lietotāju iespējas
Lietotājiem, kas nav pieteikušies, ir pieejama reģistrācija, kuru var veikt, izmantojot savu e-pasta adresi un paroli, kā arī galvene jeb sākumlapa, kurā ir iespējams apskatīt risinājumā sākotnēji pieejamo produktu jeb bāzes produktu sarakstu.

<div style="text-align: center;">7.1.1. att. <b>Nepieteikušos lietotāju iespējas</b></div>
## Jauna lietotāja pieteikšanās
Uzreiz pēc reģistrācijas lietotājs nonāk lapā, kur viņam ir jāievada informācija par sevi: svars, augums, vecums, dzimums, dzīvesveids un vietnes lietošanas mērķis, turklāt pēdējo divu parametru gadījumā ir jāizvēlas visatbilstošākā vērtība no pieejamajām iespējām. Visa iegūtā informācija tiek lietota, lai izveidotu pēc iespējas konkrētam lietotājam atbilstošāku dienas ēdienkarti.
Pēc informācijas ievadīšanas jauns lietotājs nonāk galvenē, kurā ir iespējams rediģēt sniegto informāciju par sevi, veikt vairākas darbības ar produktiem, kā arī izveidot un apskatīt ēdienkarti.

<div style="text-align: center;">7.2.1. att. <b>Jauna lietotāja pieteikšanās</b></div>
## Profila rediģēšana
Nospiežot uz sava e-pasta uzraksta, atvēras izvēlne, kurā, nospiežot pogu *Rediģēt profilu*, var pāriet uz profila rediģēšanas lapu. Šajā lapā ir iespējams izdzēst profilu, kā arī nomainīt paroli. Pēdējā darbība ir jāapstiprina, ierakstot uz šo brīdi esošo paroli.

<div style="text-align: center;">7.3.1. att. <b>Profila iestatījumu rediģēšana</b></div>
## Darbības ar produktiem
### Produkta izslēgšana
Nevēlamo produktu saraksts ir nepieciešams, lai lietotājs spētu iepriekš izslēgt kādu produktu no turpmāk veidojamās ēdienkartes. Kad kāds produkts tiek pievienots šajā sarakstā, ēdienkartes izveides procesā visi produkti no šī saraksta netiek ņemti vērā un nebūs iekļauti izveidotajā ēdienkartē. Nospiežot uz pogas *Nevēlamie produkti*, lietotājam tiek parādīts viņa paša izveidotais nevēlamo produktu saraksts. Šajā paša lapā ir iespēja atrast nevēlamo produktu no piedāvāto produktu saraksta un uzreiz pievienot to nevēlamo produktu sarakstam. Kā arī ir iespēja pašam ierakstīt produkta nosaukumu, kurš tiks pievienots nevēlamo produktu sarakstam. Šī opcija ir domāta gadījumiem, kad lietotājs ir pievienojis produktu patstāvīgi, bet konkrētās dienas ēdienkartē nevēlas to iekļaut.

<div style="text-align: center;">7.4.1.1. att. <b>Nevēlamo produktu saraksta rediģēšana</b></div>
### Produkta pievienošana un rediģēšana
Pārejot uz produktu pievienošanas un rediģēšanas lapu, lietotājam ir redzami produkti, kuri tiks ņemti vērā ēdienkartes izveides procesā. Šajā lapā ir iespējams dzēst pievienotos produktus un rediģēt to uzturvērtības, kā arī pāriet uz jauna produkta pievienošanas lapu.

<div style="text-align: center;">7.4.1.2. att. <b>Produktu saraksta rediģēšana</b></div>
### Jauna produkta pievienošana
Kā redzams, produktu pievienošanas un rediģēšanas lapā atrodas arī poga *Pievienot savu produktu*, kuru nospiežot, lietotājs pāriet uz jauna produkta pievienošanas lapu. Tajā ir jānorāda pievienojamā produkta nosaukums, produkta uzturvielu daudzumus uz 100 gramiem, produkta cenu par 100 gramiem, kā arī produkta minimālo un maksimālo daudzumu ēdienkartē, turklāt minimālā un maksimālā vērtība ir jānorāda veselos gramos.
Kad visi lauki ir aizpildīti, ir jānospiež poga *Pievienot*, un produkts tiks pievienots sarakstam.

<div style="text-align: center;">7.4.1.3. att. <b>Jauna produkta pievienošana</b></div>
### Produkta uzturvērtību rediģēšana
Lietotāja pievienotie produkti tiek rediģēti, pievienoto produktu sarakstā nospiežot uz pogu *Rediģēt* pretī tam produktam, kura uzturvērtības ir jārediģē.
Lai labotu "iebūvēto" produktu, tad vispirms no produktu saraksta jāizvēlas šāds produkts un jāpievieno produktu sarakstam. Kad produkts atradīsies produktu sarakstā, tad lietotājs spēs to rediģēt.
Rediģēt ir iespējams visu informāciju par produktu, izņemot nosaukumu. Lai izmainītu to, ir jānodzēš produkts no produktu saraksta un jāpievieno jauns. "Iebūvēto" produktu nosaukumus izmainīt tāpat nav iespējams.

<div style="text-align: center;">7.4.1.4. att. <b>Pievienojamā produkta uzturvērtību iestatīšana</b></div>
## Ēdienkartes izveide un pārskatīšana
Ēdienkarti var izveidot no profila galvenās lapas, nospiežot pogu *Izveidot un apskatīt ēdienkarti*. Uzreiz pēc pogas nospiešanas tiek izveidota ēdienkarte, ņemot vērā visus vēlamos un nevēlamos produktus, kā arī lietotāja sniegto informāciju par sevi. Ēdienkarte izskatās kā tabula ar 2 kolonnām: produkta nosaukuma un šī produkta daudzuma gramos, cik ir nepieciešams apēst dienas laikā.
Ja lietotājs nav apmierināts ar kāda produkta piedāvāto daudzumu ēdienkartē, tad viņš var izmainīt šī produkta minimālo vai maksimālo vērtību pēc savas gaumes un pēc tam atkārtoti izveidot ēdienkarti pēc iepriekš minētajiem soļiem.

<div style="text-align: center;">7.5.1. att. <b>Izveidotās ēdienkartes pārskatīšana</b></div>
## Ēdienkartē iekļautā produkta sīkāka pārskatīšana
Kā redzams, izveidotajā ēdienkartē katrā rindā atrodas poga *Apskatīt*, uz kuru nospiežot, ir iespējams ne tikai vēlreiz apskatīt konkrētā produkta nepieciešamo daudzumu, bet arī rekomendāciju no *Barbora* tiešsaistes veikala ‐ konkrētā produkta piemēru un tā cenu. Nospiežot pogu *Pirkt*, var pāriet uz attēlotā produkta lapu *Barbora* tiešsaistes veikalā.

<div style="text-align: center;">7.6.1. att. <b>Ēdienkartē iekļautā produkta sīkāka pārskatīšana</b></div>
## Izrakstīšanās
Lai izrakstītos no sistēmas, izvēlnē, kura atvēras, uzspiežot uz e-pasta uzraksta, ir jānospiež poga *Iziet*. Lai pierakstītos sistēmai atkārtoti, ir jāievada savs e-pasts un parole.

<div style="text-align: center;">7.7.1. att. <b>Izrakstīšanās no sistēmas</b></div>
# **Risinājuma pabeigšana**
## Prezentācijas plakāts
Izstrādāto prezentācijas plakātu var apskatīt *Miro* vietnē pēc [šīs saites](https://miro.com/app/board/uXjVOYXIU_4=/?moveToWidget=3458764516177263306&cot=14), kā arī 8.1. attēlā.

<div style="text-align: center;">8.1. att. <b>Prezentācijas plakāts</b></div>
## Prezentācija
Pirmdien, 2022. gada 10. janvārī, studiju kursa "Projektēšanas laboratorija" lekciju laikā komandas kanālā *Microsoft Teams* platformā tika rādīta risinājuma prezentācija, kurā tika pastāstīts par risinājuma izstrādes procesu, izstrādē sastaptajiem šķēršļiem, risinājuma funkcionalitātēm un darba secinājumiem.
# **Secinājumi**
Risinājuma izstrāde ir ļoti ilgs un sarežģīts process. Lai tikt no pirmām idejām līdz taustāmam rezultātam ir jāiegulda smags un laikietilpīgs darbs. Izstrādes laikā nācās saskarties ar vairākiem izaicinājumiem, bet neviens no tiem neizrādījās nepārvarāms. Mēs sapratām ka pirms, veidot risinājumu kādai problēmai, ir maksimāli jāiedziļinās tās būtībā un jāizanalizē tā no visiem iespējamiem skatapunktiem.