1 Sem vložte zadání Vaší práce.2 3 České vysoké učení technické v Praze Fakulta informačních technologií Katedra softwarového inženýrství Bakalářská p...
České vysoké učení technické v Praze Fakulta informačních technologií Katedra softwarového inženýrství
Bakalářská práce
Moje lékárna: webové rozhraní Michal Kopp
Vedoucí práce: Ing. Zdeněk Troníček, Ph.D.
17. května 2013
Poděkování Tímto bych chtěl poděkovat vedoucímu této práce Ing. Zdeňku Troníčkovi, Ph.D., za odborné vedení, za jeho trpělivost a pomoc při tvorbě tohoto díla.
Prohlášení Prohlašuji, že jsem předloženou práci vypracoval samostatně a že jsem uvedl veškeré použité informační zdroje v souladu s Metodickým pokynem o etické přípravě vysokoškolských závěrečných prací. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění pozdějších předpisů, zejména skutečnost, že České vysoké učení technické v Praze má právo na uzavření licenční smlouvy o užití této práce jako školního díla podle § 60 odst. 1 autorského zákona.
V Praze dne 17. května 2013
.....................
České vysoké učení technické v Praze Fakulta informačních technologií c 2013 Michal Kopp. Všechna práva vyhrazena.
Tato práce vznikla jako školní dílo na Českém vysokém učení technickém v Praze, Fakultě informačních technologií. Práce je chráněna právními předpisy a mezinárodními úmluvami o právu autorském a právech souvisejících s právem autorským. K jejímu užití, s výjimkou bezúplatných zákonných licencí, je nezbytný souhlas autora.
Odkaz na tuto práci Kopp, Michal. Moje lékárna: webové rozhraní. Bakalářská práce. Praha: České vysoké učení technické v Praze, Fakulta informačních technologií, 2013.
Abstract The aim of this work is to create a web interface for the application Mobilní lékárna. This application allows users to search for pharmacies with the lowest price of the medicine or with the minimal contribution to the medicine in the selected area. Described are the most important technologies used in the development, primarily JSP, Twitter Bootstrap framework and Google Maps API v3. The work also includes a brief introduction to health care in the Czech Republic. Keywords Mobilní lékárna, health care, JSP, Bootstrap, Google Maps API.
Abstrakt Cílem této práce je tvorba webového rozhraní pro aplikaci Moje lékárna. Tato aplikace umožňuje uživatelům vyhledat lékárny s nejmenší cenou léku nebo nejmenším doplatkem na lék ve vybraném okolí. Popsány jsou nejdůležitější technologie použité při vývoji, především JSP, Twitter Bootstrap ix
framework a Google Maps API v3. Součástí práce je také stručný úvod do zdravotnictví v České republice. Klíčová slova Mobilní lékárna, zdravotnictví, JSP, Bootstrap, Google Maps API.
x
Obsah Úvod Zdravotnictví v České republice Ochranný limit . . . . . . . . . Započitatelná částka z doplatku Moje lékárna . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 1 2 3 3
a řešené problémy Vytvoření předpisu . . . . . . . . . Vytvoření nákupního košíku . . . . Platby . . . . . . . . . . . . . . . . Zjištění cen a doplatků . . . . . . . Výpočet částky v ochranném limitu Přihlášení a registrace uživatele . . Vyhledání substitutů . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
5 5 5 6 6 7 7 8
2 Analýza existujících řešení 2.1 Vyhledávač léků Ministerstva zdravotnictví České republiky . 2.2 Heureka.cz – porovnání cen a srovnání produktů . . . . . . . 2.3 Projekt Doplatky.eu . . . . . . . . . . . . . . . . . . . . . .
9 9 11 12
3 Implementace 3.1 Google App Engine . . . . . . . . . . 3.2 Lokální server Google App Engine . . 3.3 Deploy aplikace na App Engine . . . 3.4 JavaServer Pages . . . . . . . . . . . 3.5 JSP – Standard Tag Library (JSTL) 3.6 Šablony JSP stránek . . . . . . . . .
Úvod Zdravotnictví v České republice V České republice existují dva hlavní způsoby, jak nemocný může získat požadovaný lék. Prvním je, že si lék zakoupí v některé lékárně či internetovém obchodu. To může provést kdokoliv, bez ohledu na jeho zdravotní stav či skutečnou potřebu léku. Takto zakoupit lze však jen takové léky, které nevyžadují lékařský předpis. Druhým způsobem je koupě léku na Lékařský předpis. Lékařský předpis je speciální druh dokumentu, na který může lékař předepsat lék, který bez tohoto předpisu není možné jinak zakoupit. Tyto léky mají specifické vlastnosti a jejich užívání je proto kontrolováno přímo lékaři, neboť lék nelze získat jinak než na předpis vydaný lékařem. Zatímco u léků, které jsou volně v prodeji a lze je získat bez lékařského předpisu, si pacient hradí plnou výši ceny léku, u léků na předpis může být část ceny, případně celá cena (plně hrazený léčivý přípravek), hrazena ze zdravotního pojištění. V případě, že je léčivý přípravek částečně hrazený, pacient zaplatí pouze doplatek, což je rozdíl mezi cenou léku a částkou, kterou hradí zdravotní pojišťovna. Ministerstvo zdravotnictví České republiky ve spolupráci se Státním ústavem pro kontrolu léčiv stanoví pro daný léčivý přípravek „nejvyšší možnou cenu v lékárně při výdeji na recept“, „maximální úhradu pojišťovny“ a z rozdílu těchto dvou částek se spočítá „nejvyšší možný doplatek pacienta“. Dle [22] je „nejvyšší možná cena v lékárně při výdeji na recept„ stanovena ve správním řízení následovně: • Léčivý přípravek podléhá regulaci maximální cenou (Cenový předpis MZ 1/2012/FAR ze dne 12. 12. 2011). Nejvyšší možná cena léčivého 1
Úvod přípravku v lékárně vychází z maximální ceny původce stanovené Státním ústavem pro kontrolu léčiv a je navýšena o maximální obchodní přirážku (čl. V. Cenového předpisu MZ 1/2012/FAR) a o daň z přidané hodnoty. • Léčivý přípravek nepodléhá regulaci maximální cenou. Nejvyšší možná cena léčivého přípravku v lékárně vychází z ceny oznámené výrobcem a je navýšena o maximální obchodní přirážku (čl. V. Cenového předpisu MZ 1/2012/FAR) a o daň z přidané hodnoty. Cenové rozhodnutí MZ 1/12-FAR stanovuje seznam ATC skupin léčivých přípravků a potravin pro zvláštní lékařské účely nepodléhajících regulaci ceny původce. Zároveň s „nejvyšší možnou cenou při výdeji na recept“ se ve správním řízení také stanoví „maximální úhrada zdravotní pojišťovny“. „Nejvyšší možný doplatek pacienta“ je rozdílem těchto dvou částek. Protože se však jedná o cenu maximální, může se stát, že běžná prodejní cena léčivého přípravku v lékárně bude nižší než „maximální úhrada pojišťovny“ a v takovém případě bude lék plně hrazený, neboť doplatek bude nulový.
Ochranný limit Roční „ochranný limit“ [29] pojištěnce reprezentuje finanční částku, která se stanovuje dle věku pojištěnce následujícím způsobem: • Pro osoby mladší 18 let, včetně kalendářního roku, ve kterém dovršili 18. rok, a pro osoby starší 65 let, včetně kalendářního roku, ve kterém dovršili 65. rok je částka ročního ochranného limitu stanovena na 2 500 Kč. • Pro ostatní pojištěnce je stanovena částka ročního ochranného limitu na 5 000 Kč. Pokud pojištěnec zaplatí na poplatcích započítávaných do ochranného limitu v jednom kalendářním roce více, než je částka ochranného limitu jemu stanovená, všechny tyto poplatky nad rámec ochranného limitu je pojišťovna povinna pojištěnci vrátit. Pojišťovny provádějí kontrolu započítané částky v ochranném limitu čtvrtletně a jakmile zjistí, že pojištěnec překročil stanovenou částku, musí mu nadlimitní přeplatek zaslat do 60 dnů na účet nebo složenkou. 2
Započitatelná částka z doplatku Do ochranného limitu se započítávají všechny regulační poplatky zaplacené za návštěvu u lékaře (stanoveno na 30 Kč), regulační poplatky zaplacené za lékařské předpisy (v současnosti 30 Kč za celý předpis) a doplatky na léčivé přípravky předepsané na předpis.
Započitatelná částka z doplatku V některých případech nemusí být doplatek na léčivý přípravek předepsaný na předpis započítán do ochranného limitu celý, nýbrž pouze jeho část. V takovém případě se jedná o léčivý přípravek, ke kterému existuje jiný léčivý přípravek s ním zaměnitelný, se stejnou léčivou látkou, stejnou formou a stejným způsobem podání, který má menší doplatek než předepsaný léčivý přípravek. Pokud k předepsaném léčivému přípravku existuje jeden či více těchto zaměnitelných léčivých přípravků (dále jen „substitutů“), vybere se ten s nejmenším doplatkem a tento doplatek se započítá do ochranného limitu i přes to, že byl ve skutečnosti zakoupen jiný léčivý přípravek. Toto pravidlo má však také výjimku. Pokud lékař na předpisu vyznačí, že léčivý přípravek nesmí být zaměněn za jiný, pak se do ochranného limitu započítá skutečný doplatek na předepsaný léčivý přípravek.
Moje lékárna Moje lékárna je informační systém, jehož hlavním cílem je zprovoznění mobilní a webové aplikace, která umožní uživatelům vyhledat lékárny v požadované lokalitě, jenž nabízejí nejnižší doplatky na uživatelem vybrané léčivé přípravky předepsané na lékařský předpis nebo nejnižší ceny volně dostupných léčivých přípravků. Další funkcionalita, na kterou je systém zaměřen, je započítávání částek uhrazených za doplatky na léky a za regulační poplatky do ročního ochranného limitu pojištěnce. Tento limit je důležitým faktorem rozhodujícím o případné ceně léčivých přípravků nebo potravin pro zvláštní účely, neboť pokud pojištěnec v jednom kalendářním roce zaplatí za doplatky, regulační poplatky u lékaře a regulační poplatky za předpis více, než je částka ochranného limitu pojištěnce, pojišťovna mu peníze zaplacené za doplatky a regulační poplatky nad rámec limitu vrátí. Aplikace je rozdělena do tří základních částí – jádra systému, běžícího na platformě Google App Engine, webové části, komunikující s jádrem systému a mobilní aplikací pro platformu Android. Zaměřením této bakalářské práce je webová část aplikace.
3
Kapitola
Cíle a řešené problémy Jako první jsou uvedeny požadavky na systém, které nejsou hlavními cíli či hlavními požadavky na systém, ale protože jsou hlavní požadavky a hlavní cíle systému na ně vázány a jsou na nich založeny, rozhodl jsem se je uvést dříve, než hlavní požadavky na systém.
1.1
Vytvoření předpisu
Předpis v systému reprezentuje lékařský předpis (nebo též „recept“), na němž jsou předepsané léky. Na klasickém papírovém předpisu mohou být ze zákona uvedeny dvě položky (dva léčivé přípravky, u nichž může být uveden i počet balení, pokud je větší než jedno balení), proto i v systému je tato možnost dostupná. Předpis v systému vzniká tehdy, když uživatel vybere léčivý přípravek (musí to být léčivý přípravek s doplatkem, který lze předepsat na předpis), zadá počet kusů a případně zvolí některé z možností „zvýšená úhrada“, „nezaměňovat“, nebo „hradí nemocný“. Takto může vyplnit obě položky na předpisu. Důležité pro vznik předpisu v systému je, aby byla správně vyplněna alespoň jedna položka, nebo byly správně vyplněny obě.
1.2
Vytvoření nákupního košíku
Cílem této funkce systému je vytvoření nákupního košíku, který slouží jako seznam vybraných léčivých přípravků. Nejedná se o klasický nákupní košík v konkrétním obchodě, jehož cena je předem určena jeho obsahem, nýbrž zde zastupuje sestavený seznam léčivých přípravků a potravin pro zvláštní 5
1
1. Cíle a řešené problémy účely, jehož nejnižší cena se bude teprve vyhledávat v lékárnách nacházejících se ve vybrané zeměpisné lokalitě. Do nákupního košíku lze přidat volně dostupný léčivý přípravek ve zvoleném množství, nebo do něj lze přidat v systému již vytvořený lékařský předpis. V druhém případě se do nákupního košíku přidají všechny (maximálně dvě) položky, které se nacházejí na zvoleném předpisu. Tímto způsobem lze do košíku přidávat léčivé přípravky, které nejsou volně dostupné a lze je zakoupit pouze na lékařský předpis.
1.3
Platby
Přehled plateb a přidání platby jsou funkce, které uživateli umožňují evidovat záznamy o zakoupených léčivých přípravcích nebo provedených platbách za regulační poplatky. Tato evidence je velmi důležitá, pokud uživatel chce sledovat stav svého ročního ochranného limitu, neboť právě z položek nacházejících se v platbách se tento stav počítá. Platba se vytvoří buďto jako regulační poplatek, kde uživatel vyplní zaplacenou částku, datum, případně poznámku a vloží platbu do systému, nebo jako zakoupení léku, kde navíc vybere zakoupený lék a počet balení, které si pořídil. Pro správné počítání částky v ochranném limitu je nezbytné, aby veškeré zaplacené částky byly pravdivé a byly zde uvedeny všechny provedené platby.
1.4
Zjištění cen a doplatků
Prvním z hlavních cílů systému je nabídnout uživateli možnost zjistit nejen cenu, ale i doplatky na léčivé přípravky nebo potraviny pro zvláštní účely jak volně dostupné, tak předepsané na lékařský předpis, aniž by uživatel musel fyzicky navštívit lékárenské zařízení. V současné době lze na internetových stránkách Ministerstva zdravotnictví České republiky [20], nebo na internetových stránkách Státního útvaru pro kontrolu léčiv [28], zjistit maximální cenu, případně maximální doplatek léčivých přípravků nebo potravin pro zvláštní účely. Není zde však možnost, jak zjistit aktuální cenu léku nebo doplatek za lék na předpis, které zaplatíme v konkrétní lékárně. Cenu léčivého přípravku či potraviny pro zvláštní účely lze zjistit na internetových stránkách vybrané lékárny, pokud takové internetové stránky s touto funkcionalitou lékárna provozuje, avšak doplatek na léčivé přípravky předepsané na předpis nelze zjistit ani z internetových stránek lékárny. Tato aplikace umožní uživateli oboje, jak zjištění cen léčivých přípravků v lékárnách v jeho okolí či v okolí místa jím vybraným, tak také výši do6
1.5. Výpočet částky v ochranném limitu platků v těchto lékárnách na léčivé přípravky. Zároveň systém nalezne a zobrazí takové lékárny, ve kterých je sestavený nákupní košík nejlevnější a jejich zeměpisná poloha odpovídá uživatelem vybranému místu. Do výpočtu celkové ceny košíku se zahrnuje jak cena zvolených volně dostupných léčivých přípravků, tak doplatek na léčivé přípravky na předpisech, které byly do košíku přidány. Výsledná cena je tedy konečným součtem cen a doplatků a přímo udává částku, kterou bude muset uživatel v dané lékárně zaplatit za zvolený výběr léčivých přípravků.
1.5
Výpočet částky v ochranném limitu
Výpočet částky započítané do ochranného limitu provádí zdravotní pojišťovna. Zdravotnická zařízení a lékárny mají povinnost zdravotním pojišťovnám hlásit veškeré započitatelné regulační poplatky a započitatelné doplatky na léčivé přípravky. Pojištěnec tak nemá možnost jednoduše zjistit, jaká částka mu byla do limitu již započítána, neboť zejména částky za doplatky, díky zaměnitelnosti léků a jejich maximálních cen, nejsou snadno zjistitelné. Proto je jednou z dalších hlavních funkcí systému výpočet a sledování stavu ochranného limitu. Uživatel do systému přidá veškeré své provedené platby za léčivé přípravky předepsané na předpis i veškeré platby za regulační poplatky. Systém na základě těchto dat a dat o cenách léčivých přípravků poskytovaných Státním útvarem pro kontrolu léčiv spočítá výši započitatelné částky a přičte ji k částce započítané v ročním ochranném limitu.
1.6
Přihlášení a registrace uživatele
Pro využívání systému k hledání lékáren s nejlevnějšími cenami léků není registrace nutná. Uživatel si může vytvořit potřebné předpisy, košíky a nechat si vyhledat lékárny s nejnižší cenou košíku v okolí bez registrace. Aby však mohl plně využívat všech funkcí systému, musí se zaregistrovat. Registrace probíhá ve dvou krocích. Nejprve je nutné si vytvořit účet na internetovém portálu Google.com [6], v rámci kterého uživatel získá také emailovou schránku a k ní přiřazenou emailovou adresu. Poté je nutné v aplikaci zvolit možnost přihlášení a přihlásit se přes tento vytvořený účet. Po prvním přihlášení bude systém vyžadovat vyplnění místa, v jehož okolí budou lékárny běžně hledány, datum narození, které je nutné pro stanovení částky ročního ochranného limitu a souhlas s obecnými provozními podmínkami. 7
1. Cíle a řešené problémy Po registraci a přihlášení se uživateli zpřístupní další funkce systému – ukládání košíků, ukládání předpisů, vkládání a přehled plateb, výpočet částky v ochranném limitu a hodnocení lékáren.
1.7
Vyhledání substitutů
Vyhledání substitutů slouží uživateli k tomu, aby si mohl nezávazně na vytvoření košíku či předpisu zjistit, jestli jím vybraný léčivý přípravek lze nahradit nějakým jiným léčivým přípravkem, se stejnou léčivou látkou, stejnou formou a stejným způsobem podání. Uživatel vybere léčivý přípravek, ke kterému chce najít alternativu a systém mu zobrazí tabulku s možnými substituty, ze které lze zjistit, mimo jiných údajů, také velikost balení, množství léčivé látky v léčivém přípravku, či celkovou maximální cenu. Díky těmto údajům může nalezené substituty porovnat s původním léčivým přípravkem.
8
Kapitola
2
Analýza existujících řešení 2.1
Vyhledávač léků Ministerstva zdravotnictví České republiky
Pro vyhledávání cen léků existuje několik internetových aplikací. První z nich jsou stránky Ministerstva zdravotnictví České republiky [20], na kterých se nachází jak vyhledávač léčivých přípravků hrazených ze zdravotního pojištění [23] tak vyhledávač všech léčivých přípravků [21].
2.1.1
Vyhledávač léčivých přípravků hrazených ze zdravotního pojištění
Vyhledávač hrazených léčivých přípravků poskytuje k nalezeným lékům následující informace [22]: Kód identifikační číselný znak přidělovaný léčivému přípravku Státním ústavem pro kontrolu léčiv [28], Název název léčivého přípravku, Doplněk doplněk názvu léčivého přípravku (léková forma, síla/koncentrace, velikost balení), Maximální úhrada zdravotní pojišťovny výše úhrady léčivého přípravku zdravotními pojišťovnami z veřejného zdravotního pojištění při splnění preskripčních a indikačních omezení, Nejvyšší možná cena v lékárně při výdeji na recept 9
2. Analýza existujících řešení Nejvyšší možný doplatek pacienta nejvyšší možný doplatek při výdeji léčivého přípravku, který je rozdílem mezi nejvyšší možnou cenou v lékárně a maximální úhradou zdravotní pojišťovny, Průměrná aktuální cena v lékárně odpovídá průměrné ceně v uplynulém období na trhu v České republice (může se lišit v závislosti na jednotlivých lékárnách). Jedná se o orientační údaj vycházející z cen v distribuci navýšených o obchodní přirážku a DPH platné od 1. 1. 2013. Údaje jsou aktualizovány po 21. dni následujícího měsíce, Průměrný aktuální doplatek pacienta odpovídá průměrnému doplatku v uplynulém období na trhu v České republice (může se lišit v závislosti na jednotlivých lékárnách). Z uvedených informací lze zjistit maximální cenu nebo maximální doplatek, které za léčivý přípravek v kterékoliv lékárně pacient zaplatí. Přestože tyto informace mohou být užitečné pro kalkulaci nejvyšší možné ceny nebo doplatku skupiny léků, není předpokladem, že by uživatelé tyto informace často vyhledávali. Maximální výše doplatku a maximální cena nejsou rozhodující pro výši aktuální ceny či výši aktuálního doplatku v lékárně, které navíc mohou být rozdílné v každé lékárně. O něco významnější pro zjištění ceny léčivých přípravků či doplatku v lékárně jsou údaje o průměrné aktuální ceně v lékárně a průměrném aktuální doplatku pacienta. Ty, jak je uvedeno v legendě k vyhledávači na [23] po vyhledání konkrétních léků, poskytují uživateli informace o průměrných cenách a průměrných doplatcích k vyhledaným lékům v uplynulém období. Nicméně ani tyto informace neslouží k přímému zjištění aktuální ceny nebo doplatku za léčivý přípravek v konkrétní lékárně, nelze na jejich základě vybrat lékárny s nejlevnějšími léčivými přípravky ani nejnižšími doplatky, a proto to nelze považovat za obdobné existující řešení.
2.1.2
Vyhledávač všech léčivých přípravků
Informace poskytované vyhledávačem všech léčivých přípravků [21] po vyhledání konkrétního léčivého přípravku: Kód identifikační číselný znak přidělovaný léčivému přípravku Státním ústavem pro kontrolu léčiv [28], Název název léčivého přípravku, Doplněk doplněk názvu léčivého přípravku (léková forma, síla/koncentrace, velikost balení), 10
2.2. Heureka.cz – porovnání cen a srovnání produktů Průměrná aktuální cena v lékárně odpovídá průměrné ceně v uplynulém období na trhu v České republice (může se lišit v závislosti na jednotlivých lékárnách). Jedná se o orientační údaj vycházející z cen v distribuci navýšených o obchodní přirážku a DPH platné od 1. 1. 2013. Údaje jsou aktualizovány po 21. dni následujícího měsíce. V tomto vyhledávači je stejně jako ve vyhledávači hrazených léčivých přípravků uvedena průměrná cena léčivého přípravku. Ani zde se však, stejně jako v předchozím případě, nejedná o položku pro zjištění aktuální ceny léčivého přípravku v konkrétní lékárně.
2.2
Heureka.cz – porovnání cen a srovnání produktů
Internetový portál Heureka.cz [14] nabízí srovnání cen výrobků téměř z každého odvětví, takže ani srovnání cen léků zde nechybí [16]. Vyhledávač nalezne léčivé přípravky odpovídající zadanému názvu a poté, co si si uživatel některý z nich vybere, je zobrazen seznam lékáren, které léčivý přípravek nabízejí. Seznam je seřazen dle ceny léčivého přípravku a u každé lékárny je zobrazena dostupnost a v případě, že je léčivý přípravek k dostání ihned, tak i počet kusů léku na skladě. Vyhledávač pracuje však pouze s internetovými lékárnami, případně lékárnami, které své zboží (především léčivé přípravky) nabízejí i na internetu, ve svých vlastních internetových obchodech, jako například řetězec lékáren Dr.Max lékárna [4]. Ve výsledcích vyhledávání, na rozdíl od výsledků vyhledávání v aplikaci Moje lékárna, tedy nejsou uvedeny takové lékárny, které nemají své vlastní internetové obchody. Zároveň na Heureka.cz, ačkoliv je zde odkaz na košík a s ním předpoklad, že si uživatel může sestavit vlastní seznam léčivých přípravků a hledat obchod s nejmenší cenou za seznam se všemi vybranými léčivými přípravky, u většiny léčivých přípravků tuto možnost nelze využít. Dle oficiálního návodu, jak nakoupit na Heurece [15], lze do košíku přidávat pouze produkty, které je možné zakoupit přímo z portálu Heureka.cz a jsou označeny speciálním symbolem. Zdá se, že u většiny léčivých přípravků tato možnost není, neboť jsem na žádný takový léčivý přípravek nenarazil. Heureka.cz nenabízí možnost vyhledat doplatky na léčivé přípravky (částečně hrazené léčivé přípravky, léčivé přípravky na předpis), stejně jako to nenabízejí lékárny ve svých internetových obchodech. Pokud lékárna léčivé přípravky na předpis nabízí, pak je to většinou jen velmi omezený výběr nejčastějších léčivých přípravků, které však nenabízí k prodeji přes internet, 11
2. Analýza existujících řešení nýbrž mají jen informativní charakter a jejich cenu či doplatek si lze zjistit v lékárně, například zavoláním či zasláním emailu. Protože v aplikaci Moje lékárna předpokládáme, že uživatel bude chtít hledat cenu za košík, ve které budou zahrnuty všechny ceny volně prodejných léčivých přípravků a všechny doplatky na částečně hrazené léčivé přípravky v košíku, není ani Heureka.cz přímým řešením problému.
2.3
Projekt Doplatky.eu
Asi nejblíže k aplikaci Moje lékárna je svými funkcemi projekt Doplatky.eu [2]. Jedná se o internetový portál, který nabízí širokou škálu funkcí týkajících se jak vyhledávání cen a doplatků léčivých přípravků tak vyhledání cen v konkrétních lékárnách. Cíle projektu Doplatky.eu [3] jsou velmi podobné cílům aplikace Moje lékárna. Na základě zadaného názvu léčivého přípravku systém nabídne tabulku výsledků odpovídajících zadanému hledání. Po výběru konkrétního léčivého přípravku z tabulky se zobrazí další tabulka s přehledem informací poskytovaných Ministerstvem zdravotnictví (viz [23]) a s cenami a doplatky na léčivé přípravky v konkrétních nalezených lékárnách. Pokud při vyhledávání bylo zadáno město, v jehož okolí se mají lékárny hledat, jsou nalezené lékárny filtrovány podle tohoto města. Lékárnu lze zobrazit na mapě, zjistit na ní telefonní kontakt či přejít k jejím internetovým stránkám. Zároveň z tabulky s informacemi o léčivém přípravku lze zjistit substituty, které jsou vyhledány na základě shodné účinné látky. Systém tedy umí většinu z požadavků kladených na Mobilní lékárnu. Stejně jako v předchozích případech však neumí vyhledat cenu, případné doplatky, seznamu léčivých přípravků (košíku). Uživatel také nemůže ručně vybrat oblast hledání. Tu lze určit jen za pomoci PSČ nebo názvu města. Velkou nevýhodou projektu Doplatky.eu je, že informace o aktuálních cenách a doplatcích jsou do systému zadávány ručně, přičemž je tam může zadat kdokoliv. Z tohoto důvodu je u většiny lékáren v systému uvedeno, že u žádného z nabízených léčivých přípravků není cena ani doplatek uveden. Je to dáno tím, že všechny ceny musí být do systému vloženy ručně, což se děje jen v několika málo lékárnách, nacházejících se především v Praze. Zároveň tento systém také vede k neaktuálnosti dat, neboť ceny se mohou často měnit, lékárny mohou mít různé slevové akce, věrnostní programy či množstevní slevy. Žádný z uvedených systémů nenabízí možnost sledování ročního ochranného limitu pojištěnce. Z principu, popsaném výše, je toto možné jen při 12
2.3. Projekt Doplatky.eu znalosti doplatku na léčivý přípravek a možnosti zjistit k němu příslušné substituty. Tyto podmínky nabízí pouze projekt Doplatky.eu, ale ani ten si nevede databázi uživatelů, u kterých by se částka v ochranném limitu počítala.
13
Kapitola
Implementace Moje lékárna je projekt rozdělený na tři hlavní části. První z nich je jádro systému, druhou je webová aplikace napojená na jádro systému a třetí je aplikace pro mobilní telefony a tablety na platformě Android. Hlavním obsahem této práce je webová prezentace napojená na jádro aplikace.
3.1
Google App Engine
Jádro aplikace je implementováno v Google App Engine v programovacím jazyce Java. V Google App Engine je také aplikace nasazena a testována. Výhody tohoto prostředí, jak je uvedeno na [7], jsou jednoduchost zprovoznění aplikace, automatická škálovatelnost a spolehlivost, výkon a bezpečnost infrastruktury Google.
3.1.1
Výhody App Engine
Jednoduchost zprovoznění aplikace spočívá v tom, že pro uvedení aplikace na Google App Engine do provozu není zapotřebí žádné systémové administrace. Aplikace je vyvíjena lokálně a v okamžiku, kdy ji chce vývojář nasadit, stačí pouze spustit připravený script. Škálovatelnost Google App Engine je založená na technologiích používaných samotným Googlem. Při potřebě většího datového prostoru či většího výkonu je vše automaticky zařízeno, bez nutnosti kontaktu s administrátorem či správcem systému. Stejně jako škálovatelnost je i bezpečnost systému zajištěna ze strany Google. Pro bezpečnost aplikací na Google App Engine je použita stejná infrastruktura a platí stejná bezpečnostní pravidla a omezení, která používá Google pro své vlastní aplikace. 15
3
3. Implementace
3.1.2
Sandbox
Jak je uvedeno na [13], aplikace běží v chráněném prostředí (tzv. sandboxu), který omezuje aplikaci přístup k nižším vrstvám operačního systému, což umožňuje App Engine lépe distribuovat request požadavky na více serverů. Aplikace spuštěná v sandboxu je navíc plně nezávislá na hardware, operačním systému nebo fyzické lokaci webového serveru.
3.1.3
Aplikace na Google App Engine
Zprovoznění aplikace je zdarma. Každá aplikace může využívat až 1 GB datového prostoru a podle Google [13] má dostatečné kapacity linek a dostatečný procesorový výkon pro zobrazení až 5 milionů stránek za měsíc. Pokud dané kapacity nestačí, stačí povolit možnost nákupu dalších. Kapacity se pak automaticky navýší a Google si bude účtovat pouze to, co přesáhne limity volných kapacit. Pro implementaci aplikace je možné zvolit jedno z běhových prostředí – Java, Python nebo Go. Jádro aplikace Moje lékárna je napsáno v Javě, pro webové rozhraní je použita technologie JavaServer Pages (JSP).
3.2
Lokální server Google App Engine
Google pro vývoj aplikací pod App Engine vydává pro každé z uvedených běhových prostředí SDK, který obsahuje nejen všechny knihovny potřebné pro programování pro App Engine ve zvoleném běhovém prostředí, ale také lokální server s tímto běhovým prostředím, který simuluje chování skutečného běhového prostředí App Engine. Pro běhové prostředí Java je aktuální verze SDK 1.7.7.1. Pro ukládání dat při lokálním vývoji podporuje lokální běhové prostředí ukládání dat do databáze MySQL [27]. Aby připojení k databázi bylo funkční, musí být konektor k této databázi, pro příslušný programovací jazyk (v tomto případě Javu), vložen do adresáře appengine-java-sdk-x.x.x/lib/impl/ kde x.x.x je příslušná verze Google App Enginu. Adresář appengine-java-sdk-x.x.x/ bude dále uváděn jako appengine-java-sdk. 16
3.2. Lokální server Google App Engine
3.2.1
Spuštění lokálního serveru Google App Engine
Pro spuštění lokálního serveru App Engine v běhovém prostředí Java jsou v appengine-java-sdk připraveny spouštěcí scripty [8], které lze spustit z příkazového řádku: pro OS Windows appengine-java-sdk\bin\dev_appserver.cmd [options] <war-location> nebo pro Mac OS X či Linux appengine-java-sdk/bin/dev_appserver.sh [options] <war-location> kde options jsou přepínače a parametry a war-location je umístění war adresáře aplikace, která se má spustit. 3.2.1.1
Dostupné přepínače a parametry [9]
--port= číslo portu použité pro server, výchozí port je nastaven na 8080, --address= adresa použitá pro server, výchozí nastavení je localhost. Pokud má být server dostupný z jiného zařízení ve stejné síti, musí být přenastavena. Adresa 0.0.0.0 dovoluje jak přístup ze sítě, tak přístup z lokálního PC, --sdk_root= cesta k App Engine Java SDK, pokud je rozdílná od umístění dev_appserver.cmd (případně dev\_appserver.sh), --disable_update_check vypne ověřování a upozorňování na novější verzi App Engine, --help zobrazení nápovědy. Další přepínače a parametry, které mohou být použity, jsou přepínače a parametry pro JVM (Java Virtual Machine), které začínají řetězcem --jvm_flag=, za kterým následuje příslušný přepínač určený pro JVM. 17
3. Implementace 3.2.1.2
Použitá spouštěcí dávka
C:\appengine-java-sdk-1.7.7.1\bin\dev_appserver.cmd --jvm_flag=-Drdbms.server=local --jvm_flag=-Drdbms.driver=com.mysql.jdbc.Driver --jvm_flag=-Drdbms.url="jdbc:mysql://localhost:3306/PharmacyDB" --jvm_flag=-Drdbms.user=root --jvm_flag=-Drdbms.password=root --port=8888 war Při použití této dávky v OS Windows se předpokládá, že appengine-javasdk se nachází v adresáři C:\, že je spuštěna MySQL databáze s vytvořeným uživatelem root s heslem root, vytvořeným schématem PharmacyDB a soubor dávky se nachází ve stejném adresáři jako adresář war. Server bude spuštěn na adrese localhost a bude naslouchat na portu 8888.
3.3
Deploy aplikace na App Engine
Pro deploy aplikace jsou v App Engine SDK připraveny následující scripty [10], spustitelné z příkazového řádku: V OS Windows: \appengine-java-sdk\bin\appcfg.cmd update <war-location> V Mac OS X nebo Linux: ./appengine-java-sdk/bin/appcfg.sh update <war-location> Tyto scripty spustí Java třídu com.google.appengine.tools.admin.AppCfg v appengine-java-sdk/lib/appengine-tools-api.jar, která je určena ke komunikaci s rozhraním Google App Engine. Akce update zajistí, že adresář war uvedený ve war-location bude uploadován na server. Od verze appengine-java-sdk.1.7.4 je pro správnou funkčnost update nutné, aby se spuštěná třída spustila v JDK, nikoli v JRE. Ve scriptu \appengine-java-sdk\bin\appcfg.cmd je pro spuštění třídy použit příkaz „java“ a proto v případě, že na PC je nainstalováno jak JRE tak JDK je možné, že se třída spustí právě v JRE. Toto se dá vyřešit například nahrazením příkazu „java“ celou cestou k souboru java nacházejícím se v adresáři ..\JDK\bin. 18
3.4. JavaServer Pages
3.4
JavaServer Pages
JavaServer Pages (JSP) [25] je technologie určená pro vývojáře a designery webových stránek. Protože se jedná o součást technologie Java, jsou i JSP platformě nezávislé. Při požadavku na načtení JSP stránky je nejdříve stránka přeložena do servletu, což je Java class, která je poté spuštěna (překlad probíhá pouze při prvním dotázání se na stránku). V JSP se pomocí HTML a JSP značek sestavuje logika stránky, ze které je pak výsledná HTML stránka vygenerována. V JSP stránce může být kromě HTML značek také dynamicky vkládaný obsah. Ten je možné do JSP stránky vložit několika způsoby. Jedním ze způsobů je vložení pomocí Java expression, které se uzavírají mezi skupiny znaků <%= a %>. Výraz mezi značkami, napsaný v jazyce Java (při použití třídy nacházející se v jiném než standardním balíku je nutné tuto třídu importovat do JSP stránky pomocí <%@ page import="package.class"%>) se vyhodnotí a výsledek se vloží do sestavované stránky namísto značek. Dynamický obsah může být také vložen pomocí scripletů, což je Java kód uzavřený mezi značkami <% a %>. Na rozdíl od předchozího případu se standardně ze scripletu nic do sestavované HTML stránky netiskne, avšak může toho být dosaženo pomocí zapisování do proměnné out, například pomocí příkazu out.println(’text’), který vytiskne slovo „text“ na místo v JSP stránce, kde se scriplet nachází.
3.4.1
JSP Expression Language
JSP Expression Language (EL) [24] slouží k zjednodušení přístupu k datům uloženým v JavaBeans a implicitních objektech. Výraz v napsaný v EL se uzavírá mezi ${ a } a výsledek je vložen do JSP stránky na dané místo, kde je EL použit. V JSP je několik implicitních objektů, ke kterým lze pomocí EL přistupovat. Výhodně se dá použít například mapa parametrů param. Ta mapuje request parametry podle jejich jména, skrz které lze přistoupit k hodnotám těchto parametrů pomocí tečkové notace. Například pomocí ${param.id} získáme hodnotu request parametru s názvem „id“. Dalšími implicitními objekty jsou objekty mapující jednotlivé proměnné v závislosti na jejich rozsahu platnosti (scope): pageScope rozsah jedné stránky, requestScope rozsah požadavku, sessionScope rozsah jedné session, 19
3. Implementace applicationScope rozsah v rámci celé aplikace, nebo objekt pageContext, který dále obsahuje několik dalších objektu, mezi které patří například: servletContext context servletu do kterého je JSP přeložena, session session objekt, request request, který vedl k načtení stránky, response odpověď vrácená JSP stránkou. EL můžeme také použít při sestavování rozhodovací logiky JSP stránky, například s využitím některých z připravených JSP tagů ze standardní knihovny.
3.5
JSP – Standard Tag Library (JSTL)
JavaServer Pages Standard Tag Library [26] je soubor několika tagů, které zapouzdřují základní funkce používané ve většině webových aplikací. V JSTL nalezneme tagy pro podporu iterování skrze kolekce, tagy pro sestavování podmíněného větvení, pro práci s XML či tagy pro formátování textu (například data, času, čísel). Pro zprovoznění těchto tagů je nutné do JSP stránky nejdříve vložit directivu taglib s příslušnou uri pro danou skupinu tagů. Pokud chceme využít například tagy skupiny „core“, které tvoří jednu část JSTL, je nutná následující direktiva: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Tyto tagy začínají předponou „c:“ a patří mezi ně například tag , který slouží k podmíněnému větvení, tag , který je určen k cyklickému procházení kolekcí nebo tag , kterým se dá do JSP stránek vkládat obsah z externích zdrojů. Pro tagy určené k formátování textu slouží direktiva: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 20
3.6. Šablony JSP stránek U těchto tagů je předpona tvořena zkratkou „fmt:“ a patří mezi ně například tagy , který umí formátovat číslo v požadovaném formátu a na požadovaný počet desetinných míst, , kterým je možno formátovat datum do požadovaného tvaru, a mnoho dalších formátovacích tagů.
3.6
Šablony JSP stránek
Aby bylo možné udělat jednotlivé HTML stránky v rámci designu jednotné, se stejnou hlavičkou, stejným hlavním menu, stejnou patičkou, bylo nutné zavést systém šablon. Bez systému šablon by změna v designu jedné HTML stránky, v místě, které na všech stránkách má vypadat shodně, jako je například hlavní menu, znamenala přepsání i všech ostatních stránek. Protože na platformě Google App Engine není zavedena přímá podpora pro Java frameworky, jako je JavaServer Faces nebo Struts 2, které v základu umožňují použití šablon, rozhodli jsme se pro použití JSP a servletů. V JSP však systém šablon, podobně jako v HTML, není. Proto bylo nezbytné vytvoření techniky, která funkci šablon zastupuje.
3.6.1
Vkládání obsahu z externích zdrojů
Technologie JSP umožňuje do stránek vkládat obsah i z jiných stránek. Před příchodem JSTL byla možnost načítání obsahu z jiných zdrojů než stránky samotné, pomocí tagu <jsp:include>, omezena pouze na jiné JSP stránky (případně jiné zdroje) nacházející se ve stejném kontextu jako aktuální stránka. S příchodem JSTL a tagu [30] se tato funkce rozšířila o možnost vložení stránky (či její části) nejen z jiného kontextu, ale také ze zdroje specifikovaného pomocí URL. Navíc se neomezuje pouze na protokol HTTP, ale je možno importovat obsah i pomocí FTP. Při použití se importovaný obsah nemusí vkládat inline do JSP stránky, ale může být vložen do String objektu (pomocí atributu var) nebo do Reader objektu (pomocí atributu varReader).
3.6.2
Existující řešení systému šablon
Na vytvoření šablon do JSP existuje několik přístupů, například na [1] nebo na [17] jsou popsány různé postupy, ale většina z těchto postupů, stejně jako technika prezentovaná na [18], je založena na vkládání různých částí stránky do konečného celku a v čem se liší je, že mají pro tyto funkce vkládání zavedeny vlastní pojmenované tagy, pomocí nichž obsah vkládají. 21
3. Implementace
3.6.3
Volba systému šablon
Zvolil a implementoval jsem tedy systém, který je popisován na [18]. Ten je založen na několika souborech, které obsahují jednotlivé části stránky. Ty jsou postupně vkládány, na základě nastavených parametrů, do výsledné stránky. Tento systém skládání stránky vychází z návrhového vzoru „composite“. Jednotlivé části, které se do sebe postupně vkládají, si lze představit jako hierarchickou stromovou strukturu, v jejímž kořeni se nachází výsledná stránka a v každém nižším patře se nacházejí části, které se složí do větší části, která odpovídá patru vyššímu. V JSP je pro vkládání možno použít tag <jsp:include>, nebo při použití JSTL se nabízí tag , který má proti první možnosti několik výhod. 3.6.1
3.6.4
Struktura šablon
Základní struktura šablon vychází z návrhu popsaném na [18] a je upravena pro potřeby aplikace. 3.6.4.1
abstract_layout.jsp
Hlavní částí systému šablon je JSP stránka abstract_layout.jsp. Tato stránka obsahuje základní strukturu, která je shodná u každé HTML stránky. Samotná stránka však není nikde zobrazena, jedná se pouze o šablonu s vyplněnými společnými prvky, do které je postupně na požadovaná místa vkládán obsah konkrétní jedné stránky, která je nakonec vygenerována. Na začátku abstract_layout.jsp se nachází část, která je společná pro všechny stránky. Jako první je uvedena definice , která prohlížeči říká, jaký obsah dokumentu má očekávat. Poté následuje tag , který obaluje celý obsah stránky. První částí uvnitř bloku obaleného tagy a je hlavička (). V té se nachází meta tagy (<meta...>, které jsou určeny například k definování použitého kódování, typu dokumentu, mohou obsahovat data určená pro vyhledávací enginy. Meta tagy se na výsledné vygenerované stránce nezobrazují, pouze obsahují informace o datech na stránce zobrazených. Pod definicí metadat jsou uvedeny odkazy na CSS (Cascading Style Sheets) [43] soubory. V těchto souborech se nacházejí informace o tom, jak mají jednotlivé elementy, napsané v dokumentu stránky, vypadat, kde mají být umístěny a jaké chování v závislosti k ostatním elementům mají mít. Protože všechny stránky mají většinu stylů společných, jsou linky na soubory se styly uvedeny právě v abstract_layout.jsp, neboť je potřeba, 22
3.6. Šablony JSP stránek aby byly v každé vygenerované stránce. V případě, že konkrétní stránka vyžaduje konkrétní soubor se styly, je zde připraveno podmíněné vložení odkazu na tento soubor. To je provedeno tak, že pokud byl v některé ze stránek, do kterých je abstract_layout.jsp přímo či nepřímo includován, nastaven requestScope atribut css a byla do něj vložena cesta k souboru s CSS styly, bude odkaz na tento soubor do stránky automaticky přidán. Dále se v hlavičce zdrojového dokumentu stránky nachází titul webové stránky. Ten je načítán z requestScope atributu s názvem „title“, který musí být opět nastaven v některé ze stránek nebo vkládaných částí, které přímo či nepřímo vkládají abstract_layout.jsp. Pod hlavičkou (za koncovým tagem ) je hlavní obsah webové stránky, který bude zobrazen. Je uzavřen mezi tagy a . Zde se obsah stránek liší, a proto je většina obsahu v těle webové stránky vkládána v závislosti na nastavených parametrech. HTML 5 Všechny části v těle stránky se vkládají mezi HTML 5 tagy , <section>,