VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor Aplikovaná informatika
A p l i k a c e p ro s p r á v u p o j i s t n ý c h s m l u v bakalářská práce
Autor: Josef Hron Vedoucí práce: Ing. Marek Musil Jihlava 2014
Abstrakt Tato bakalářská práce se zabývá návrhem a realizací databázové aplikace pro správu pojistných smluv. Aplikace je vytvořena v .NET Framework 4.5 a jazyce C#. Aplikace řeší realizaci výpočtu provize obchodníka podle hierarchie obchodníků, umožňuje správu potřebných subjektů a export faktur do pdf dokumentu. V první části práce je popsána problematika správy pojistných smluv a proveden návrh vytvářené aplikace. Druhá část se zabývá detailní implementací aplikace.
Klíčová slova .NET, C#, PDF, pojistná smlouva, provize, singleton
Abstract This bachelor thesis describes the design and implementation of database application used for administration of insurance contracts. Application is realized using by .NET Framework 4.5 and programming language C#. The application performs calculation of the merchant’s comission according to the hierarchy of merchants, allows to manage the required subjects and to export invoices to PDF document.The first part is devoted to describing current state, analysis and used technologies. The second part deals with a detailed development of application.
Key words .NET, C#, comission, PDF, insurance contracts, singleton
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutí licence. V Jihlavě dne
............................................... Podpis
Poděkování Na tomto místě bych rád poděkoval svému vedoucímu práce Ing. Marku Musilovi za poskytnutí tématu a možnost vytvářet ho pod jeho vedením.
Obsah 1
Úvod.......................................................................................................................... 7
2
Současný stav ............................................................................................................ 8
3
Analýza požadavků ................................................................................................... 9
4
5
3.1
Požadavky na aplikaci, programové funkce....................................................... 9
3.2
Popis jednotlivých částí.................................................................................... 13
Použité technologie ................................................................................................. 17 4.1
Jazyk C# ........................................................................................................... 17
4.2
Microsoft SQL server ....................................................................................... 17
4.3
Vývojové prostředí ........................................................................................... 17
Implementace .......................................................................................................... 19 5.1
Databáze ........................................................................................................... 19
5.2
Návrh databáze, ER model ............................................................................... 21
5.3
Připojení k databázi .......................................................................................... 26
5.4
Datové třídy...................................................................................................... 28
5.5
Databázové operace ......................................................................................... 28
5.6
Zajímavé algoritmy .......................................................................................... 31
5.7
Výpočet provize ............................................................................................... 35
5.8
DataGriView .................................................................................................... 36
5.9
Uživatelské rozhraní......................................................................................... 39
5.10 6
Tisk do PDF .................................................................................................. 43
Závěr ....................................................................................................................... 44
Seznam použité literatury ............................................................................................... 45 Seznam obrázků .............................................................................................................. 46 Seznam použitých zkratek .............................................................................................. 47 Přílohy............................................................................................................................. 48 1
Obsah přiloženého CD ............................................................................................ 48
2
Uživatelská manuál ................................................................................................. 49
3
2.1
Spuštění aplikace .............................................................................................. 49
2.2
Smlouva............................................................................................................ 49
2.3
Entity vystupující ve smlouvě .......................................................................... 51
2.4
Tisk ................................................................................................................... 53
Faktura .................................................................................................................... 54
1 Úvod V dnešním světě se vše točí okolo peněz a majetku, proto je segment financí sledován a rychle rozvíjen. Finanční segment se dělí na spoustu oblastí a každá má svá specifika a odlišnosti od ostatních. Já se budu zabývat pouze oblastí týkající se pojišťovnictví, která je jednou z nejdynamičtěji se rozvíjejících oblastí ve finančním segmentu. Na trhu neustále stoupá počet finančních institucí a s nimi logicky i počet produktů, které jsou těmito institucemi nabízeny. Uzavírání smluv pak ve většině případů provádí externí firmy prostřednictvím obchodníků. Pro tyto externí firmy je důležitý detailní přehled o práci jednotlivých obchodníků, tedy počet, finanční objem a druh uzavíraných smluv. Na základě těchto údajů pak vyhodnocují úspěšnost jednotlivých obchodníků a výši konkrétních odměn za jejich práci. Další důležitým prvkem ve sledování jsou pak rozbory jednotlivých institucí a jejich produktů z hlediska prodejnosti, objemu, apod. Byl jsem osloven firmou Sovaconsult s.r.o., ve které jsem si v minulosti mimojiné zkusil i práci obchodníka, abych provedl analýzu a navrhl řešení, které bude umět zpracovat zadaná data, vyhodnotit je a podat výsledek. Dostal jsem tedy ideální možnost vyzkoušet si, jak uzavírání pojistných smluv chodí v praxi. Tématem bakalářské práce je desktopová aplikace pro správu pojistných smluv, která bude umět zpracovat zadaná data, vyhodnotit je a následně generovat tiskové reporty. Výsledné řešení bude vytvořeno v prostředí .NET a impletována v jazyce C#, protože kombinace těchto dvou prvků přináší spoustu výhod. Jedním z důvodů je, že aplikace bude nasazena v operačním systému MS Windows, kde je zaručena kompatibilita a podpora na vysoké úrovni. Dalším důvodem byl také programovací jazyk C#, který je výborným nástrojem pro tvorbu formulářových aplikací, které jsou uživatelsky velice příjemné s vykosou odolností vůči možným chybám vstupovaných dat. Aplikace bude fungovat lokálně bez síťového připojení. Jádro budou tvořit uživatelské funkce, které budou číst, zpracovávat a zapisovat data do databáze, která bude implementována podle předem navrženého logického datového modelu a bude evidovat klienty, peněžní ústavy a produkty, které jsou nabízeny právě peněžními ústavy. Dále budeme evidovat obchodníky a jimi uzavřené smlouvy, ze kterých budeme počítat provize a následně generovat výstupy. 7
2 Současný stav Aktuální stav na trhu V současné době existuje mnoho způsobů jak sledovat, evidovat a vyhodnocovat jednotlivé výsledky. Neexistuje však ucelené řešení tohoto systému. Peněžní ústavy řeší pouze metodiku výpočtu jednotlivých produktů, tzv. produktové kalkulátory, případně pak poskytují zpětnou vazbu o přijetí / nepřijetí konkrétní pojistné smlouvy. Tato informace bývá poskytována nejčastěji ve formě XLS tabulky nebo PDF dokumentu. Pro účely sledování je tato informace nedostatečná. Zejména proto, že externí firmy zpravidla zastupují více peněžních ústavů. Ty pak poskytují informace v různých formátech. Mají rozdílné číslování produktů, rozdílnou identifikaci obchodníků, navíc informace přichází s časovým zpožděním. Typy řešení používané v současné praxi Papírová forma – je realizována pomocí různých výkazů a formulářů. Výhodou jsou relativně nízké počáteční finanční náklady. Jedná se o velmi neefektivní řešení, které je časově při větším množství smluv obrovsky náročné a velmi málo flexibilní Tabulkové kalkulátory – lze využít program Excel od Microsoft. V současné době asi nejrozšířenější typ. Umožňuje za relativně nízké náklady poměrně efektivně sledovat požadované údaje. Má však i své zřejmé nevýhody – nevhodné ke zpracování velkých objemů dat, provazování údajů více entit se složitějšími vazbami, těžkopádnější obsluha při složitějších vstupech. Speciální software – odstraňuje všechny nevýhody předchozího řešení. Je rychlý i při zpracování velkých objemů dat, nabízí pohodlné řešení vazeb mezi entitami, provazování údajů, přehledná obsluha. Avšak počáteční investice do tohoto SW je daleko větší než u předchozích variant. Pro komplexnější řešení tohoto problému se tedy vytváří software na míru pro každou společnost.
8
3 Analýza požadavků 3.1 Požadavky na aplikaci, programové funkce Uživatelské funkce slouží k vstupu a údržbě údajů o klientech a smlouvách, vytváření různých výběrů, přehledů a výstupů. Požadavky na aplikaci z hlediska uživatele jsou následující. Aplikace lze provozovat na libovolném PC s platformou Windows ve verzi XP a vyšší. Z uživatelského hlediska se předpokládá, že uživatel má základní znalosti práce s PC. K aplikaci bude vytvořen stručný manuál, který v základních krocích popíše jednotlivé funkce programu a způsob jejich ovládání. Použité termíny a výrazy použité v aplikaci korespondují s termíny běžně používanými v prostředí, pro které je aplikace určena (pojišťovnictví). Celá aplikace je koncipována tak, aby byla intuitivní a uživatel se po krátkém zaškolení rychle v aplikaci orientoval. Data jsou zobrazována pomocí DataGridView, pro větší přehlednost jsou barevně rozlišena. Detalní údaje a vstupy jsou řešeny pomocí speciálních formulářů. Funkce Vyhledávání Funkce pro vyhledávání zajišťují nalezení požadováných údajů konkrétního záznamu podle předem definovaných kritérií. Jedná se zejména o vyhledání dle čísla smlouvy, čísla návrhu, popřípadě jména nebo rodného čísla. Funkce vyhledávání umožňují vyhledávat i částečným (neúplným) výrazem a nalezené relevatní výsledky jsou zobrazeny v DataGridView. Funkce Editace Funkce editace slouží ke vstupu údajů do databáze. V zásadě lze tyto údaje rozlišit na hlavní, které obsahují konrétní data (údaje o smluvách) a pomocné sloužící např. k nabídkám (peněžní ústavy, klienti). Editační funkce jsou navrženy s důrazem na uživatelský komfort zadávání s využitím možností daného programového prostředku (rozbalovací nabídky, datumové objekty atd.). Vlastní vstup a editace údajů je zabezpečena řadou validních funkcí, které minimalizují možné chybové stavy při vstupu (duplicita dat, neúplné a chybné údaje atd.), případně nastavují specální pravidla pro 9
editaci (např. na základě stavu smlouvy povolují či zakazují opravy vybraných údajů, popřípadě umožňují nebo naopak zakazují vybrané akce nad konkrétní smlouvou). Editační formuláře jsou navrženy s důrazem na jednoduchost a přehlednost, tak aby vlastní vstup dat byl intuitivní a uživatele při zadávání údajů „vedl“. Logika ovládaní pak vychází z logiky jiných běžně používaných komerčních programů jako je například MS Office. Funkce filtrace Funkce filtrace slouží k rychlému a jednoduchému výběru množiny dat podle uživatelem stanovených kritérií. Jedná se například o sledování počtu smluv dle jejich stavů (schválené, neschválené, stornované), sledování dle produktů (počet uzavřených smluv pro jednotlivé produkty, jejich finační objem), rozbor činnosti jednotlivých makléřů (počty a objemy smluv, jejich úspěšnost). Zásadní význam mají filtrační funkce pro vlastní firmu, pro kterou jsou tyto souhrnné údaje nesmírně cenné pro vyhodnocování činnosti makléřů i pro plánování činnosti a pro nastavování parametrů pro další období (stanovení nosných produktů, úpravy provizí, atd.) Nejcenější údaje pro firmu jsou uloženy tabulce smlouvy a provize. Smlouvy proto bude možno filtrovat dle obchodníka, který smlouvu sjednal smlouvu, dle stavu stavu, peněžních ústavů, produktů a počtu let na které byly sjednány. Provize pak bude možné podle jména obchodníka a podle toho stavu provize (proplaceno = ANO/NE). Systém provizí Systém stanovení provizí je dvoustupňový. Prvním stupňem je provize, kterou poskytuje peněžní ústav zprostředkovatelské firmě. Výše této provize se vypočte na základě kalkulačního vzorce, který zadal peněžní ústav. Tento kalkulační vzorec je závislý na konkrétním produktu. Ve vzorci jsou zohledněny různé parametry, jako je výše pojistné častky, délka smlouvy apod. Výsledná částka je pak ještě ponížena nebo povýšena s ohledem na objem uzavřených smluv danou zprostředkovatelskou firmou. Toto navýšení – ponížení má mít motivační chrakter. Součástí těchto podmínek bývají i storno poplatky, tj. provize, kterou musí zprostředkovatelská firma vrátit peněžnímu ústavu v případě předčasného vypovězení smlouvy ze strany pojistníka.
10
Druhým stupněm je pak provize, kterou poskytuje zprostředkovatelská firma obchodníkům. Model pro její výpočet jsou stanoveny interními pravidly firmy a je závislý na dosažené pozici obchodníka v rámci firmy. Tato pozice se stanovuje na základě objemu uzavřených smluv za určité období. Z provize vyplácené obchodníkovi si firma zadržuje určitou poměrnou část, která slouží ke krytí případných stornopoplatků. Obchodníci s vyšší pozicí mohou být v rámci stromové struktury nadřízenými obchodníkům s nižší pozicí. V tomto případě makléř může získat také tzv. meziprovize. Jedná se o rozdíl mezi výši jeho případné provize a výší provize jemu podřízeného makléře, který smlouvu uzavřel. Uživatelské programové funkce Stručný popis operací, které může uživatel vykonávat v rámci aplikace. Záznam peněžní ústav -
vygenerováni unikátního ID
-
umožnění vstupu nebo opravy názvu peněžního ústavu
-
umožnění vstupu nebo opravy zkratky peněžního ústavu
-
umožnění vstupu nebo opravy platnosti záznamu
Záznam produkt -
vygenerováni unikátního ID
-
vstup ID peněžního ústavu – výběrem z nabídky
-
umožnění vstupu nebo opravy názvu produktu
-
umožnění vstupu nebo opravy zkratky produktu
-
umožnění vstupu nebo opravy platnosti záznamu
-
umožnění vstupu nebo opravy koeficientu
-
umožnění vstupu nebo opravy druhu produktu
Záznam obchodník -
vygenerováni unikátního ID
-
umožnění vstupu nebo opravy jména a příjmení obchodníka
-
umožnění vstupu nebo opravy registračního čísla obchodníka, kontrola duplicity
-
umožnění vstupu nebo opravy pozice obchodníka
-
umožnění vstupu nebo opravy stornorezervy obchodníka
-
umožnění vstupu nebo opravy nadřízeného obchodníka
-
umožnění vstupu nebo opravy adresy obchodníka 11
-
umožnění vstupu nebo opravy banky obchodníka
-
umožnění vstupu nebo opravy čísla účtu obchodníka
Záznam klient -
vygenerování unikátního ID
-
umožnění vstupu nebo opravy jména a příjmení klienta
-
umožnění vstupu nebo opravy data narození klienta
-
umožnění vstupu nebo opravy rodného čísla klienta, kontrola duplicity
-
umožnění vstupu nebo opravy adresy a telefonu klienta
Záznam smlouva -
vygenerováni unikátního ID
-
vstup ID peněžního ústavu – výběrem z nabídky
-
vstup ID produktu – výběrem z nabídky
-
vstup ID obchodníka – výběrem z nabídky
-
vstup ID klienta – výběrem z nabídky
-
možnost vstupu nebo opravy čísla návrhu smlouvy, kontrola duplicity
-
možnost vstupu nebo opravy čísla smlouvy, kontrola duplicity
-
možnost vstupu nebo opravy stavu smlouvy
-
umožnění vstupu nebo opravy data uzavření smlouvy
-
umožnění vstupu nebo opravy doby trvání smlouvy
-
umožnění vstupu nebo opravy výše pojistné částky
-
umožnění vstupu nebo opravy dat ukončení / storna smlouvy
Záznam provize -
vygenerováni unikátního ID
-
možnost vstupu data schválení
-
možnost vstupu stavu proplaceno
Tisk -
možnost vygenerování faktury ve formátu pdf za zvolené období
12
3.2 Popis jednotlivých částí Vstoupení uzavřené smllouvy do aplikace je poměrně složitá opera, které skrývá spoustu úskalí, a proto požadavky rozložíme na menší části pro snažší analýzu požadavků na aplikaci. Klient Pro peněžní ústavy, ale i pro samotné obchodníky jsou klienti zdrojem jejich obživy. Klienti platí za sjednané smlouvy peněžním ústavům, které pak odměňují obchodníky, respektive makléře (firmy), kteří následně přerozdělují peníze mezi obchodníky. Dalo by se tedy říci, že klient je stěžejní článek tohoto procesu, ale pro aplikaci je tento údaj spíše symbolický. Bližší informace o klientovi (věk, zdravotní stav, atd) zajímají „pouze“ peněžní ústav a obchodníka, který podle těchto bližších informací vybere pro klienta vhodný produkt a sepíše s ním návrh. Peněžní ústav pak podle informačního dotazníku vyplněným klientem, návrh buďto přijme nebo klienta vyrozumí o nějaké doplňující, ale má možnost i klienta nepřijmout. V databázi ukládáme jméno, příjmení, rodné číslo, datum narození, telefonní číslo a případně i adresu. Obchodník Obchodník je základním stavebním kamenem firmy. Sjednává návrhy pojistných smluv s klienty, ze kterých se po schválení peněžního ústavu, jehož produkt byl na návrh použit, stává pojistná smlouva. Právě za tyto smlouvy je obchodník po tomto schválení odměňován. Avšak není to úplně tak jednoduché, jak to na první pohled vypadá. Pojistná smlouva se v aplikaci musí nejprve podle bližších specifikací přepočítat na body, a posléze jsou tyto body vynásobeny bodovým koeficientem obchodníka. To znamená, že ve společnosti existuje několik různých pozic a je tu možnost postupovat na vyšší pozice. Každá pozice je ohodnocena bodovým koeficientem a to tak, že čím vyšší pozice je dosažena, tím je vyšší bodový koeficient, což samozřejmě přináší vyšší odměny za sjednané smlouvy. Ve společnosti Sovaconsult s.r.o. funguje tzv. stromová struktura obchodníků, což znamená, že pokud přivede do firmy spolupracovníka, tak bude v hierarchii patřit pod Vás. Pokud Vámi přivedený spolupracovník sepíše smlouvu, tak automaticky obdržíte meziprovizi, což je bodový rozdíl Vašich pozic. 13
Do databáze tedy ukládáme jméno a příjmení obchodníka, jeho registrační číslo, rodné číslo, pozici, stornorezervu, nadřízeného. Pro vystavení faktury uchováváme ještě adresu, banka a číslo bankovního účtu. Peněžní ústav Peněžní ústavy nabízejí produkty, které jsou obchodníky využívány na sepisování návrhů pojistných smluv. Ale jak jsem již psal v úvodu, tak konkurence v této oblasti je veliká a většina peněžních ústavů Vám bude schopna nabídnout více či méně obdobné produkty jako jejich konkurence. Každá společnost musí mít řádně uzavřenou smlouvu s peněžním ústavem, aby mohla nabízet jejich jednotlivé produkty. V databázi tedy najdeme název, zkratku a platnost. Produkt Produkty jsou nabízeny peněžními ústavy a lze je dělit do skupin vícero způsoby, ale ve vytvořené aplikaci se dělí na 2 skupiny: Životní pojištění: rizikové, důchodové, investiční Neživotní pojištění: pojištění majetku, odpovědnosti Každý každý peněžní ústav uzavírá smlouvu na určitou bodu, po kterou Vám za jednotlivé produkty nabídne jistý koeficient, který určuje, jak vysoká odměna přijde z peněžního ústavu na firmu, při sjednání onoho produktu. Po uplynutí této doby, se musí sepsat nová nová smlouva v té je možno koeficient zvýšit, ale naopak i snížit. U produktu toho musíme uchovávat oproti peněžnímu ústavu daleko víc. Je to název, zkratka, platnost, peněžní ústav, koeficient a druh produktu. Smlouva Pojištění ať už životní nebo neživotní definuje vztah mezi klientem a peněžním ústavem, které bylo zprostředkováno obchodníkem či přímo zaměstnancem daného peněžního ústavu. Nás bude zajímat pouze první případ, kdy je vztah zprostředkován pomocí obchodníka pracujícího pro naši společnost. Každý papírový návrh smlouvy může obsahovat údaje o více osobách. Ty rozlišujeme na pojištěné a pojistníky:
14
-
Pojištěný „je fyzická nebo právnická osoba, na jejíž život, zdraví, majetek, odpovědnost za škodu nebo jiné hodnoty se vztahuje pojistný produkt (pojištění) ustavený pojistnou smlouvou. To se týká soukromého pojištění. V případě, že pojištěný uzavřel smlouvu a platí pojistné, je tento zároveň i pojistníkem.“
-
Pojistník „je chápán jako osoba, která uzavřela pojistnou smlouvu, a to bez ohledu na to, vztahuje-li se pojistné krytí k ní, nebo k jiné osobě, která je v roli pojištěného.“ (Česká národní banka, 2003-2014)
Pro aplikaci je důležitý pouze pojistník, který vystupuje jako klient. Dále obsahuje spousty a spousty pro nás absolutně nepotřebných údajů o pojištěném i pojistníkovi. Počínaje tím, jestli je pojištěný levák nebo pravák, jaké vykonává zaměstnání a v neposlední řadě třeba i to, kolik vykouří deně cigaret a kolikrát měl zlomenou levou lýtkovou kost. Důležité informace, které můžeme ze smlouvy vyčíst a následně je uložit do databáze jsou číslo návrhu a číslo pojistné smlouvy, peněžní ústav a produkt, který byl zvolen obchodníkem a klient (pojistník), který smlouvu sjednal. Poté musíme brát v potaz na jak dlouhou dobu je smouva sjednána a kolik je roční pojistné. Pro přehlednost a dobrou orientaci při generování výstupů uchováváme ještě několik různých datumů, které značí důležité události v životě smlouvy – datum sjednání návrhu, počátek smlouvy a předpokládané datum ukončení. V aplikaci má pak smlouva samotná má pak ještě jeden důležitý ukazatel, kterým je stav smlouvy. Stavy smlouvy jsou: Založeno – je sepsán návrh, který se odešle na příslušný peněžní ústav, kde zkoumají, zda li návrh splňuje všechny podmínky přijetí Přijato – z peněžního ústavu přišlo potvrzení o přijetí smlouvy a s ním i číslo smlouvy, to znamená, že smlouva běží a nic nebrání tomu vyplatit obchodníkům provize Nepřijato – peněžní ústav shledal návrh jako nepřijatelný, tím pádem zaniká jak návrh smlouvy, tak i nárok obchodníků na nějakou provizi za sjednání Stornováno – pokud je smlouva přijata, může dojít k jejímu zrušení a to jak ze strany pojistníka (klient), tak i peněžního ústavu
15
Provize Pokud jsou v aplikaci vyplněný všechny potřebné náležitosti, tak aplikace umí vypočítat, jakou provizi zašle peněžní ústav na firmu. Tato provize se následně na dva díly – jeden díl je provize firmy a druhý díl je provize obchodníka a jemu nadřízené obchodníky a to tak, že se díl provize pro obchodníky vydělí 180, čímž vznikne pomyslná část provize. Ta je u obchodníka, který smlouvu sepsal vynásobena koeficientem jeho dosažené pozice a tím vznikne provize pro obchodníka. U jeho nadřízených to pak funguje tak, že se část provize násobí rozdílem koeficientů pozic nadřízeného a jemu podřízeného obchodníka, což se děje tak dlouho, dokud nedojdeme k obchodníkovi, který již nemá nadřízeného nebo je mu nadřízena přímo firma. Ve společnosti Sovaconsult s.r.o. je pravidlo, že pokud je obchodníkovi stornována smlouva dříve jak 2 roky od jejího počátku, tak vrací provizi, kterou obdržel za její sjednání. Proto se po vypočtení provize obchodníka odečte 15% na stornorezervu, která slouží k tomu, když dojde ke stornování smlouvy dříve jak za 2 roky jejího trvání, tak se mu peníze odečtou ze stornorezervy. Po odečtení stornorezervy od provize dostáváme čistou provizi, která je pak za daný měsíc vyplacena.
16
4 Použité technologie Po sepsání funkčních požadavků na aplikaci od zadavatele a následné analýze, jsem se rozhodl sestavit výsledné řešení ve vývojovém prostředí Microsft Visual Studio 2012. Databáze bude řešena interním nástrojem VS MS SQL, celá aplikace implementována na platformě .NET Framework 4.5 v jazyce C#.
4.1 Jazyk C# Jazyk C# je moderní objektově orientovaný jazyk, který vznikl spojením jazyků C++ a Java. Je typově bezpečný, neexistuje v něm vícenásobná dědičnost a je case sensitive – rozlišuje mezi malými a velkými písmeny. Z vlastní zkušenosti mohu říci, že je to výborný nástroj pro vytváření formulářových aplikací pro operační systém MS Windows. Nejedná se jen o databázové typy aplikací, ale i typ klient-server, webové služby a další. C# nabízí spoustu nástrojů, které podporují platformu .NET Framwork, která usnadňuje tvorbu aplikací formulářových aplikací a možná, i proto se stává čím dál vice populární i mezi začínajícími programátory.[2][3]
4.2 Microsoft SQL server „Microsoft SQL Server je relační databázový a analytický systém pro e-obchody, byznys a řešení datových skladů vyvinutý společností Microsoft. Pomáhá snižovat celkové náklady na vlastnictví a zvyšovat efektivitu vaší organizace prostřednictvím správy podnikových dat a práce s obchodními informacemi (business intelligence).“ [4] Svoji navrženou databázi jsem zrealizoval právě pomocí MS SQL, který momentálně převyšuje svoje konkurenty v mnoha směrech (rychlost, dostupnost a zabezpečení dat), dále je přímou součástí vývojového prostředí Visual Studio a navíc je zde zaručena výborná kompatibila s vývojovým prostředím Visual Studio.
4.3 Vývojové prostředí Vývoje prostředí Microsoft Visual Studio je výborný nástroj pro vývoj aplikací určených pro prostředí MS Windows. Nabízí širokou škálu nástrojů služeb, kterými jsou například editor kódu s podporou IntelliSense, refaktoring, integrovaný debugger, který 17
pracuje jak na úrovni kódu, tak na úrovni stroje. Další výbornou pomůckou pro vývoj aplikací s GUI je designer formulářových apliací. Pro nové nástroje a rozšíření funkčností je možné přidávat rozšíření. Stupeň základní výbavy VS se odvíjí podle jeho licence. Toto vývojové prostředí má několik integrovaných programovacích jazyků, což nám usnaďnuje práci při tvorbě komplexních aplikací. [5] Pro realizace navrženého řešení jsem využil vývojové prostředí Microsft Visual Studio 2012 Premium, které je úrovní své vybavenosti plně dostačující pro tvorbu komplexních aplikací, viz obrázek
Obrázek 1: Visual Studio Camparison
18
5 Implementace 5.1 Databáze Dalo by se říci, že databáze je pouze určité úložiště dat. Pro používání databází máme třeba tyto důvody: - Rychlý přístup k souborům. - K datům přistupujeme napřímo. - Využitím SQL příkazů můžeme vybírat uložená data.
Základem každé relační databáze je tabulka, která obsahuje data. Některé databázové systémy mají pouze jednu tabulku, ale u relačních databází jich můžeme mít více. Tabulka se skládá ze sloupců a řádků.
Obrázek 2: Tabulka databáze
Sloupce Každý sloupec musí mít unikátní název a určitý datový typ podle dat, která chceme ukládat. Datových typů je mnoho a je dobré si rozmyslet, jaký datový typ zvolíte. Řádky Můžeme nazývat také záznamy, protože oba pojmy jsou identické, jelikož jeden řádek reprezentuje jeden záznam. Každý řádek by měl mít unikátní identifikátor, který jednoznačně určí příslušný záznam. Tento problém řeší primární klíče.
19
Klíče Každý záznam v tabulce by měl mít alespoň jeden unikátní identifikátor neboli primární klíč. Osobně doporučuji používat číselný indentifikátor (int), pro větší přehlednost a jeho rychlé vyhledávání napříč tabulkou oproti stringu. Novější databázové programy umějí automaticky inkrementovat číselné unikátní klíče, což značně usnadňuje práci s uloženými daty a umožňuje jednoznačně určit příslušný záznam. Dalším velmi důležitým pojmem jsou nevlastní klíče. Nevlastní klíče reprezentují vztah mezi více tabulkami.
Obrázek 3: Cizí klíče
Na obrázku můžeme vidět 2 tabulky a to peněžní ústavy a produkty. Zde máme jasně ukázáno, že ID a PenUstav_ID vytvářejí propojení (relaci) jednotlivých záznamů k sobě. V praxi je tématika propojování tabulek dosti obtížná a způsobů, jak propojit více tabulek, je mnoho ( join, inner join, right join, left join…). [6]
20
5.2 Návrh databáze, ER model ER model
Obrázek 4: ER model aplikace
V další části se budeme zabývat samotnými tabulkami, kde si uvedeme, jaký má daná tabulka význam pro aplikaci a dále podrobně popíšeme jejich atributy, k čemu slouží a jak s nimi bude v aplikaci nakládáno. Peněžní ústav Banka, pojišťovna nebo jiná finanční instituce, která nabízí pojišťovací služby (produkty). V aplikaci je tato tabulka vedena jen z informačních důvodů.
Obrázek 5: Tabulka peněžní ústav
ID – interní unikátní klíč záznamu v aplikaci Název – úplný název konkrétního peněžního ústavu Zkratka – zkratka názvu peněžního ústavu, užívaná v přehledech Platnost – platnost smlouvy makléřské firmy uzavřené s peněžním ústavem. Může nastat stav, že peněžní ústav neprodlouží makléřské firmě smlouvu. Obchodníci této 21
firmy pak nemohou nabízet produkty toho peněžního ústavu. V aplikaci bude právě tento údaj použit pro zjištění tohoto stavu. Produkt Pojišťovací služba nabízená peněžním ústavem. Každá smlouva sjednaná s klientem je vlastně produktem některého z peněžních ústavů. Peněžní ústavu ohodnocují produkty koeficientem, který pak hraje roli ve výši provize, která za sjednání přijde na firmu.
Obrázek 6: Tabulka produkt
ID – interní unikátní klíč záznamu v aplikaci Název – úplný název konkrétního produktu Zkratka – zkratka názvu produktu, užívaná v přehledech Platnost – platnost produktu, datum do kdy platí smlouva s peněžním ústavem na konkrétní produkt. Po vypršení platnosti se sjednáná s pěněžním ústavem nová smlouva (platnost). V aplikaci se podle toho údaje vyberou pouze právě platné produkty. ID_pen_ústav – interní cizí klíč peněžního ústavu, zajišťuje vazbu na tabulku peněžních ústavů Koeficient – ohodnocení produktu peněžním ústavem, určený pro výpočet provize. Výpočet provize je popsáno v kapitole 5.7. Druh – výčtová hodnota určená pro výpočet provize, je na něm závislá doba trvání smlouvy Klient Fyzická osoba (pojistník), která si sjednává pojišťovací službu (produkt). Klienti mají v aplikaci výhradně informační roli.
22
Obrázek 7: Tabulka klient
ID – interní unikátní klíč záznamu v aplikaci Jméno + Příjmení – jméno a příjmení Telefon – kontakt na klienta Adresa – kontaktní adresa Rodné_číslo – rodné číslo (unikátní) Datum narození – datum narození
Obchodník Osoba, která v zastoupení společnosti nabízí klientům produkty peněžních ústavů, za jejich sjednání je následně odměňován podle dosažené pozice, která je řešena další tabulkou.
Obrázek 8: Tabulka obchodník
ID – interní unikátní klíč záznamu v aplikaci Registrační_číslo – registrační číslo obchodníka (unikátní) přidělené firmou, slouží k vyhledávání a k jasnému určení obchodníka v přehledech 23
Jméno + Příjmení – jméno a příjmení ID_pozice – interní cizí klíč pozice, zajišťuje vazbu na tabulku pozice = udává obchodníkovu dosaženou pozici Stornorezerva – zobrazuje aktuální hodnotu stornorezervy, která je finanční polštář obchodníka, pokud je mu stornováno smlouva ID_obchodník – interní cizí klíč obchodníka, který zajišťuje vazbu na tabulku obchodník a udává obchodníkova nadřízeného Adresa – kontaktní adresa Banka + Číslo_účtu – bankovní konto pro vyplacení faktury Smlouva Smlouva uzavřena obchodníkem.
Obrázek 9: Tabulka smlouva
ID – interní unikátní klíč záznamu v aplikaci ID_produkt – interní cizí klíč peněžního ústavu, zajišťuje vazbu na tabulku produkt ID_pen_ústav – interní cizí klíč peněžního ústavu, zajišťuje vazbu na tabulku peněžních ústavů ID_klient – interní cizí klíč obchodníka, zajišťuje vazbu na tabulku klient ID_obchodník – interní cizí klíč obchodníka, zajišťuje vazbu na tabulku obchodník Sjednáno – datum sjednání papírového návrhu smlouvy Doba_trvání – předpokládaná doba trvání 24
Výše pojistného – výše ročního pojistného Ukončení – předpokládané datum ukončení smlouvy Číslo_smlouvy – číslo smlouvy Číslo_návrhu – číslo návrhu smlouvy Počátek – počátek pojistné smlouvy Status – aktuální stav smlouvy (výčtový typ) Provize_celkem – provize, která by měla přijít na firmu z peněžního ústavu Stornorezerva_celkem – celková stornorezerva, která zůstane na firmě Provize_firmy – provize, která zůstane na firmě Provize_obchodníků – provize, která bude rozdělena mezi obchodníky Stornorezerva – stornorezerva obchodníka, který sespsal smlouvu Provize – provize obchodníka, který sespsal smlouvu Schváleno – schválení provizí, které plynou ze smlouvy Provize Provize náleží obchodníkům z uzavřené a schválené smlouvy.
Obrázek 10: Tabulka provize
ID – interní unikátní klíč záznamu v aplikaci ID_smlouva – interní cizí klíč smlouvy, zajišťuje vazbu na tabulku smlouva ID_obchodník – interní cizí klíč obchodníka, zajišťuje vazbu na tabulku obchodník Registrační_číslo – registrační číslo obchodníka, kterému náleží provize Obchodník – jménoa příjmení obchodníka Provize – provize, která náleží obchodníkovi Stornorezerva – částka o kterou se zvýší stornorezerva obchodníka 25
Faktura – peníze, které budou po odečtení stornorezervy obchodníkovi vyplaceny Pozice – aktuální pozice obchodníka Počátek – datum počátku smlouvy, tj. od kdy smlouvy vstoupí v platnost Schváleno – datum schválení smlouvy, tj. kdy obchodníkovi schválím provizi za smlouvu Proplaceno – stav, zda li už je proplaceno, aby nedošlo k tomu, že je smlouva proplacena vícenásobně Pozice Tabulka pozice je ve své podstatě výčtový typ, která udává zásadní informace o dosažené pozici obchodníka.
Obrázek 11: Tabulka pozice
ID – interní unikátní klíč záznamu v aplikaci Název – název pozice, užívaný v přehledech nebo výběrových menu Koeficient – bodový koeficient, který ovlivňuje výši provize za sjednanou smlouvu Stornorezerva – maximální výše stornorezervy na dané pozici
5.3 Připojení k databázi Cesta k databázi je nastavení jako relativní, to znamená, že si program najde databázi sám. V aplikaci jsem pro připojení k databázi využil návrhového vzoru „Singleton“ neboli jedináček. Návrhové vzory Pojďme si přiblížit, co si máme pod pojmem návrhové vzory představit. Jsou to vlastně ověřené způsoby elegantních programových postupů, které nám při jejich užití pomohu vyhnout se chybám. [7]
26
Singleton Je jedním z nejpoužívanějších návrhových vzorů. Singleton je třída, jejíž cílem je vytvoření jedinné instance této třídy ke které bude možno přistupovat globálně. [8][9]
Obrázek 12: Singleton Pattern
Uvádím příkladnou ukázku, jak je v aplikaci využito instanční proměnné singletonu pro připojení do databáze. public class DbSingleton { private static DbSingleton instance = null; static SqlConnection connection = null; private DbSingleton() { } public SqlConnection connect() { try { connection = new SqlConnection(@"Data SourcAttachDbFilename=" + Path.GetFullPath(@"..\..\Database1.mdf;Integrated Security=True")); connection.Open(); } catch (Exception) { throw; } return connection; } public static DbSingleton GetInstance() { if (instance == null) instance = new DbSingleton(); return instance; } }
Samotné připojení k databázi je pak dostupné napříč aplikací, a volá se jednoduchým příkazem.
Do
Sqlconnection
přiřadím
třídu
DbSingleton,
zavolám
metodu
GetInstance(), která vytvoří instanci singletonu. Posléze zavolám ještě metodu 27
connect(), která má návratovou hodnotu connection. Tato hodnota bude nastavena na stav Open(). SqlConnection connection = DbSingleton.GetInstance().connect();
5.4 Datové třídy Pro snadnou práci s daty a jejich práci na úrovni databáze jsem vytvořil datové třídy. Každou entitu popisuje vlastní datová třída, která říká, jaký datový typ se bude vkládat do atributů jednotlivých entit. Tyto třídy můžeme vytvořit ručně nebo si je můžeme nechat vygenerovat Visual Studiem. Datové třídy obsahují property, které obsahují konstruktor. Ten nám říká, jaké operace můžeme s danými property provádět. V našem případě máme v konstruktoru get a set. Get nám umožní číst data z databáze a set nám zase v případě potřeby umožní data upravit. Dále si můžeme nastavit přístupnust k metodě set tím, že ji označíme jako „private“. Následující ukázka kódu demonstruje definici datové třídy Produkt. public class Produkt { public int Id { get; set; } public string Nazev { get; set; } public string Zkratka { get; set; } public DateTime Platnost { get; set; } public int Id_PU { get; set; } public decimal Koeficient { get; set; } public string DruhProduktu { get; set; } public Produkt(string Nazev, string Zkratka, DateTime Platnost, int Id_PU, decimal Koeficient, string DruhProduktu) { this.Nazev = Nazev; this.Zkratka = Zkratka; this.Platnost = Platnost; this.Id_PU = Id_PU; this.Koeficient = Koeficient; this.DruhProduktu = DruhProduktu; } }
Můžeme si všimnout, že objektu nám chybí Id. Není to chyba, nýbrž je to z toho důvodu, že Id se k záznamu přidává automaticky jako primární klíč každého obchodníka při ukládání záznamu do databáze.
5.5 Databázové operace Pro operace s databází jsem vytvořil speciální třídu, která se zabývá pouze přidáváním, upravováním, mazáním a všemožnými selecty. Tato třída využívá instance Singletonu pro styk s databází, takže pokud nahlédneme do přiloženého kódu, tak uvidíme, že za 28
SQL příkazem opravdu využíváme instaci Singletonu, kterou jsme si v hlavičce třídy přiřadily do connection. Názorná ukázka v kódu níže. public static class OperaceDB { static static static static
SqlConnection connection = DbSingleton.GetInstance().connect(); SqlDataAdapter da; DataTable dt; SqlCommand cmd;
public static DataTable refreshZobrazSmlouvaDGV() { cmd = new SqlCommand("SELECT * from [tbSmlouva]", connection); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); return dt; } }
Přidávání Přidávání probíhá tím způsobem, že si nejprve ve formuláři vyplním všechny potřebné komponenty, které jsou přiřazeny jednotlivým atributům objektu definovaných v datových třídách. Naplním tedy již připravený objekt a poté ho „předhodím“ metodě ve tříde OperaceDB.cs, která komunikuje s databází. Pomocí SQL příkazu následně provede zápis dat do databáze. public static void pridejObchodnika(Obchodnik o) { try { cmd = new SqlCommand("INSERT INTO [tbObchodnik] (RegistracniCislo, Jmeno, Prijmeni, Pozice, Stornorezerva, Nadrizeny, Adresa, Banka, CisloUctu, RodneCislo) VALUES (@RegistracniCislo, @Jmeno, @Prijmeni, @Pozice, @Stornorezerva, @Nadrizeny, @Adresa, @Banka, @CisloUctu, @RodneCislo)", connection); cmd.Parameters.AddWithValue("@RegistracniCislo", o.RegistracniCislo); cmd.Parameters.AddWithValue("@Jmeno", o.Jmeno); cmd.Parameters.AddWithValue("@Prijmeni", o.Prijmeni); cmd.Parameters.AddWithValue("@Pozice", o.Pozice); cmd.Parameters.AddWithValue("@Stornorezerva", o.Stornorezerva); cmd.Parameters.AddWithValue("@Nadrizeny", o.Nadrizeny); cmd.Parameters.AddWithValue("@Adresa", o.Adresa); cmd.Parameters.AddWithValue("@Banka", o.Banka); cmd.Parameters.AddWithValue("@CisloUctu", o.CisloUctu); cmd.Parameters.AddWithValue("@RodneCislo", o.RodneCislo); cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } }
Select Pro výběr dat používáme klíčové slovo SELECT, které vybere zvolené záznamy ze zvolené tabulky. Za příkazem SELECT se nachází záznamy, které chceme vybrat nebo 29
můžeme použít znak „*“ pro výpis včech záznamů z příslušné tabulky. Pro výběr všech záznamů z tabulky Obchodník používáme například tento příkaz: SqlCommand cmd = new SqlCommand("SELECT * from [tbObchodnik]", connection);
Pomocí příkazu WHERE můžeme používat podmíněné výběry z databáze, což znamená, že za definici výběru vložíme podmínku, která omezí kritérium výběru pouze na záznamy, které vyhovují zvolené podmínce. Pro výběr obchodníka s ID = 1, používáme následující příkaz: SqlCommand cmd = new SqlCommand("Select * from [tbObchodnik] Where Id=" + 1, connection);
Úprava Ve vytvořené aplikaci zobrazuji 99% informací pomocí komponenty DataGridView a proto je tomu přizpůsobena úprava dat. Výběrem položky z komponentu DataGridView si zjistím jeho ID a potom volám metodu, která mi najde záznam s příslušným ID a jeho atributy naplní objekt. SqlDataAdapter da = new SqlDataAdapter("SELECT * from [tbObchodnik] where Id=" + Id.ToString(), connection);
Tímto objektem poté naplním jednotlivé komponenty ve formuláři, kde následně provedu opravy. Poté upravená data znovu uložím do objektu a ten předhodím metodě ve tříde OperaceDB.cs, která komunikuje s databází. Tato metoda zajistí příkazem SET, aby se záznam s příslušným ID aktualizoval. Pro provedení db-dotazu používám parametry (property třídy Command), kterými lze naplnit celý dotaz konkrétními hodnotami. Programová realizace je ukázána na následující ukázce. public static void UpravObchodnik(Obchodnik o) { try { cmd = new SqlCommand("UPDATE [tbObchodnik] SET RegistracniCislo=@RegistracniCislo,Jmeno=@Jmeno,Prijmeni=@Prijmeni, Pozice=@Pozice,Stornorezerva=@Stornorezerva,Nadrizeny=@Nadrizeny, Adresa=@Adresa, Banka=@Banka, CisloUctu=@CisloUctu, RodneCislo=@RodneCislo WHERE Id=" + o.Id, connection); cmd.Parameters.AddWithValue("@RegistracniCislo", o.RegistracniCislo); cmd.Parameters.AddWithValue("@Jmeno", o.Jmeno); cmd.Parameters.AddWithValue("@Prijmeni", o.Prijmeni); cmd.Parameters.AddWithValue("@Pozice", o.Pozice); cmd.Parameters.AddWithValue("@Stornorezerva", o.Stornorezerva); cmd.Parameters.AddWithValue("@Nadrizeny", o.Nadrizeny); cmd.Parameters.AddWithValue("@Adresa", o.Adresa); cmd.Parameters.AddWithValue("@Banka", o.Banka); cmd.Parameters.AddWithValue("@CisloUctu", o.CisloUctu); cmd.Parameters.AddWithValue("@RodneCislo", o.RodneCislo); cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } }
30
Mazání Mazání provádím opět pomocí unikátního klíče záznamu. Počáteční postup je stejný jako při úpravě, ale po získání ID z Datagriview rovnou volám metodu, které předám získané ID. Potom pomocí příkazu DELETE vymažu z příslušné tabulky záznam, který je označen získaným ID. SqlCommand cmd = new SqlCommand("DELETE FROM [tbObchodnik] WHERE Id =" + Id.ToString(), connection);
5.6 Zajímavé algoritmy V této podkapitole uvedu několik zajímávých algoritmů, bez kterých by se aplikace neobešla. Nejprve bude algoritmus slovně popsán a následně bude uvedena programová verze. Převod rodného čísla na datum Při realizaci aplikaci jsem se setkal s tím, že při přídávání nového klienta, zadávám jeho rodné číslo a posléze musím zadat ještě jeho datum narození. Tak mě napadlo, co takhle tyto dva procesy dát do jednoho, protože z rodného čísla přece můžu zjistit celé datum narození. Napsal jsem tedy funkci, která po zadání validního rodného čísla, převede toto číslo na datum narození. Rodné číslo občana České republiky má s lomítkem 11 znaků a z toho prvních 6 znaků jsou údaje o datu narození ve formátu “RRMMDD” (rok, měsíc, den). Není problem odstřihnout tyto znaky od zbytku rodného čísla, které už pro nás v tuto chvíli nenese žádnou důležitou informaci. Těchto 6 znaků znovu rozdělím po 2, čímž dostanu číselné označení roku, měsíce a dne narození dotyčného, které si uložím do stringové proměné. Poté už nám zbývá vyřešit jediný zádrhel a to ten, že u žen se k měsíci příčítá 50, což vyřešíme jednoduchou podmínkou a poté už nám nic nebrání překonvertovat na datum.
31
string rc = tbRodneCisloKlient.Text; string[] rc2 = rc.Split('/'); string rok = rc2[0].Substring(0, 2); string mes = rc2[0].Substring(2, 2); string den = rc2[0].Substring(4, 2); if (Convert.ToInt32(mes) > 50) mes = (Convert.ToInt32(mes) - 50).ToString("00"); if (Convert.ToInt32(mes) > 12 || (Convert.ToInt32(mes) < 1)) { } //chyba else { rc2[0] = rok + mes + den; DateTime dt; DateTime.TryParseExact(rc2[0], "yyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); dtpKlient.Value = dt; }
Stornorezerva Když je smlouva přijata, a schválena firmou, tak se obchodníkům navyšuje jejich stornorezerva o určitou část (z každé provize, kterou firma obchodníkovi odsouhlasí, se odečítá 15% do stornorezervy), kterou si nazveme stornoSmlouva. Probíhá to tak, že se nejprve podívám jaký je aktuální stav obchodníkovi stornorezervy a na jaké je pozici. Poté si přes cizí klíč zjistím, jaká je maximální výše stornorezervy na této pozici. Poté nám mohou nastat dva případy. a) Aktuální stav stornorezervy je menší než nula Pokud je stornorezerva záporná, tak si z databáze vytáhnu údaj o tom, kolik má být obchodníkovi vyplaceno na fakturu. Sečtu tedy aktuální výši stornorezervy s fakturou a zjisťuji jestli je stornorezerva stále záporná nebo je kladná. Pokud je stále záporná, tak ke stornorezervě přičtu i stornoSmlouva. Obchodníkovi se do faktury uloží nula, protože celá byla využita na snížení stavu jeho záporné stornorezervy a tím pádem mu nemá být co vyplaceno. Pokud by ale po sečtení byla stornorezerva kladná, tak musím zjistit, o kolik je třeba ponížit fakturu, abych dorovnal stornorezerva na nulu. Poté ke stornorezervě, která je v současné době na nule, přičtu stornoSmlouva a zbytek faktury vyplatím obchodníkovi. b) Aktuální stav stornorezervy je větší nebo roven nule Pokud je stornorezerva větší než nula, tak je postup celkem jednoduchý. Vezmu aktuální hodnotu obchodníkovi stornorezervy a přičtu k ní stornoSmlouva, o kterou by se měla stornorezerva navýšit. Porovnám, jestli jejich součet není vyší než maximální výše stornorezervy na dané pozici. Pokud není, tak automaticky navýším stornorezervu.
32
V opačném případě odečtu od stornoSmlouva takovou část, aby po přičtení k aktuální nebyla větší maximální a tu část, kterou jsem odečetl od stornoSmlouva přičtu k faktuře. Ukázka kódové řešení je uvedena níže. for (int i = 0; i < Variables.infoProv.Count; i++) { Storno = OperaceDB.ObchodnikStornoRezerva(Variables.infoProv[i].Id); // aktualni stornorezerva obchodnika pozice = OperaceDB.ObchodnikPozice(Variables.infoProv[i].Id); // id pozice stornoPozice = OperaceDB.PoziceStornorezerva(pozice); // max stornorezerva pozice if (Storno < 0) // pokud je stornorezerva záporná { Soucet = Variables.infoProv[i].faktura + Storno; // přičtu peníze z faktury a posléze se rozhoduji zdali jsem dostal stornorezervu do + nebo je stále if (Soucet < 0) // je stále { Variables.infoProv[i].faktura = 0; OperaceDB.updateStronorezerva(Variables.infoProv[i].Id, Variables.infoProv[i].stornorezerva + Soucet); } else // překlopila se do + { OperaceDB.updateStronorezerva(Variables.infoProv[i].Id, 0 + Variables.infoProv[i].stornorezerva); Variables.infoProv[i].faktura = Soucet; } } else // přičítám stornorezervu { if( Storno + Variables.infoProv[i].stornorezerva > stornoPozice) // pokud je aktuální storno + přičítané větší jak maximální { Soucet = (Storno + Variables.infoProv[i].stornorezerva) - stornoPozice; // zjistím o kolik přeteče stornorezerva OperaceDB.updateStronorezerva(Variables.infoProv[i].Id, Variables.infoProv[i].stornorezerva - Soucet); // odečetu od ukládané stornorezervy Variables.infoProv[i].faktura = Variables.infoProv[i].faktura + Soucet; // přičtu k provizi } else { OperaceDB.updateStronorezerva(Variables.infoProv[i].Id, Variables.infoProv[i].stornorezerva + Storno); } } }
33
Vyhledávání Aplikace bude jednou uchovávat desítky nebo i stovky záznamů v každé tabulce a proto je dobré mít nástroj, kterým je možné data filtrovat nebo vyhledat konkrétní záznam. K tomuto účelu nám slouží filtry, které umí filtrovat podle částí údajů nebo dle neunikátních údajů (jméno, stav smlouvy atp.) nebo vyhledat konkrétní záznam pokud hledáme podle unikátního kritéria (číslo smlouvy, rodné číslo, atp.). Filtry je možné kombinovat, tedy použít pro účel vyhledávání více údajů zároveň avšak pro nás je tato možnost nezajímavá. Uvedu názornou ukázku kódu filtru a následně, jak to vypadá v praxi. DataView view = new DataView(OperaceDB.refreshKlientDGV()); if (!String.IsNullOrEmpty(textBox1.Text)) { view.RowFilter += string.Format("Jmeno LIKE '%{0}%'", textBox1.Text); } view.RowFilter = view.RowFilter == "" ? string.Format("Prijmeni LIKE '%{0}%'", textBox2.Text) : view.RowFilter + string.Format("AND Prijmeni LIKE '%{0}%'", textBox2.Text); dgvKlient.DataSource = view;
Ukázku kódu reprezentuje filtrování dat v DataGridView pomocí dat zadaných do TextBoxu. Jedná se o vícenásobnou filtraci za pomocí jména a příjmení. Do DataView si uložím zdroj dat, což zajístí to, že se nám vytvoří obraz tabulky. V té pak vyhledávám pomocí údajů, které přijímám z TextBoxu. Příkaz LIKE umí pracovat pouze s daty typu
string
a
umí
vyhledávat
shodu
od
začátku
řetězce
nebo
kdekoli
v zadaných řetěžcích.
Obrázek 13: Jednoduchý filtr
34
Obrázek 14: Dvojnásobný filtr
5.7 Výpočet provize Výpočet provize je rozdělen na několik dílčích kroků, protože je to operace značně složitá. Prvním krokem je výpočet celkové provize, která přijde na firmu. Zde musíme rozlišit, zda li produkt nese příznak životní nebo neživotní. Životní Vypočítáme tak, že výnásobíme dobu trvání na jakou je smlouva sepsána, s koeficientem daného produktu a ročním pojistným. Neživotní Výpočet je obdobný jako u životní, ale nebereme v potaz dobu trvání smlouvy. Zde se tedy vynásobí pouze koefiecient produktu s ročním pojistným Tímto jsme získali provizi, která přijde na firmu z peněžního ústavu. Z této provize odečteme 1/3, což je provize pro jako takovou firmy a zbylé 2/3 jsou určeny pro obchodníky. Teď nastává problém, protože obchodník, který sepsal smlouvu, může mít nadřízené, kteří mají nárok na tzv. meziprovizi. Pokračujeme tedy tak, že zbylé 2/3 rozdělíme na 180 částí a tím získáme údaj, kterému budeme říkat třeba částProvize. Vezmeme obchodníka, který sespsal smlouvu a najdeme v databázi jeho aktuální pozici (tato pozice jak jsem uvedl již dříve má bodové ohodnocení), kterým vynásobíme částProvize a dostane částku neboli provizi obchodníka. Nyní se začínají řešit 35
zmiňované meziprovize. Podívám se do databáze a hledám, jestli obchodník, který sepsal smlouvu, má nadřízeného. Pokud ano, tak si opět z databáze dohledám jeho aktuální pozici a poté udělám rozdíl bodových ohodnocení pozic a to tak, že vezmu bodové ohodnocení nadřízeného a od něj odečtu ohodcení jemu podřízeného obchodníka. Rozdíl těchto bodových ohodnocení opět vynásobím s částíProvize a získám meziprovizi nadřízeného obchodníka. A poté znovu nahlížím do databáze a hledám, zda li i tento obchodník má nadřízeného. Tento cyklus se bude opakovat do té doby, než dojdu k obchodníkovi, který již nemá nadřízeného. Níže uvádím příkladnou ukázku kódového řešení tohoto problému. do // procházím nadřízené obchodníky a hledám jejich nadřízené a zaznamenávám je do listu infoProv dokud m !=0, což znamená, že už nemá nadřízeného { if (id == 0) { break; } obchodnikDetails = OperaceDB.getObchodnikDeatilsById(id); // id nadřízeného obchodníka obchodnikSplit = obchodnikDetails.Split('$'); //rozděluji údaje obchodníka podle znaku $ Variables.infoProv.Add(new InfoProvize(id, obchodnikSplit[1], obchodnikSplit[0], 0, 0, 0, Convert.ToInt32(obchodnikSplit[2]))); nadrizeny = Convert.ToInt32(obchodnikSplit[3]); if(nadrizeny == 0) { break; } id = nadrizeny; } while (nadrizeny != 0); VypocetProvize p; p = Vypocet(); //výpis všech obchodníků, kteří obdrží nějakou provizi ze smlouvy do datagriduSmlouva for (int i = 0; i < Variables.infoProv.Count - 1; i++) { //vytahuji jednotlivé záznamy obchodníků z listu infoProvize //podřízený InfoProvize pozNizsi = new InfoProvize((Variables.infoProv[i])); int poziceNizsi = Convert.ToInt32(OperaceDB.getPoziceByObchodnikId(pozNizsi.Id)); int koeficientNizsi = OperaceDB.getHodnotaPoziceById(poziceNizsi); //nadřízený InfoProvize pozVyssi = new InfoProvize((Variables.infoProv[i + 1])); int poziceVyssi = Convert.ToInt32(OperaceDB.getPoziceByObchodnikId(pozVyssi.Id)); int koeficientVyssi = OperaceDB.getHodnotaPoziceById(poziceVyssi); int koeficient = koeficientVyssi - koeficientNizsi; Variables.infoProv[i + 1].provize = Convert.ToDecimal(p.castProvize() * koeficient); stornorezerva = (Variables.infoProv[i + 1].provize * decimal.Divide(15, 100)); Variables.infoProv[i + 1].stornorezerva = stornorezerva; Variables.infoProv[i + 1].faktura = Variables.infoProv[i + 1].provize - stornorezerva; }
5.8 DataGriView Jednou z nejdůležitějších komponent v aplikaci je DataGridView (dále už jen grid). Může sloužit pouze k zobrazování tabulkových hodnot, ale lze ho použít i práci se zobrazovanými daty (přidávání, editace a mazání).
36
Předtím než vůbec něco zobrazíme, tak musíme gridu říct, co bude zobrazováno neboli přiřadit nějaký Data Source. To je možné udělat 2 způsoby – ručně napsat kód, kterým gridu jasně určíme co je zdroj a co má zobrazovat nebo nám vývojové prostředí dovolí si tento zdroj naklikat v grafickém prostředí. Já osobně jsem zvolil metodu menšího odporu a klikal jsem, co to jen šlo. Popíši tedy postup jak do gridu dostat data přes tzv. „klikačku“ a zároveň uvedu příklad, jak jsem vyřešil problém s propojováním tabulek, kdy jsem potřeboval skrze cizí klíč zobrazit jiný údaj v tabulce. Pro tento účel jsem použil vestavěnou službu View, což je nástroj na bázi jazyka SQL, kde si můžete pomocí právě SQL pohodlně propojit tabulky a Visual Studio za Vás poté vytvoří DataSet. View je propojeno s databází a má i celkem slušný IntelliSense. Barevně rozlišuje části kódu, označuje syntaxtické chyby v kódu a umožní Vám prohlédnout si výsledek Vašeho snažení. Takže pomocí jednoduchého SQL příkazu JOIN propojíme tabulku Smlouva s ostatními pomocí cizích klíčů, které jsou v tabulce uloženy. CREATE VIEW [dbo].[ViewZobrazSmlouvy] AS SELECT s.* ,CONCAT(o.Jmeno, ' ', o.Prijmeni) AS Obchodnik, p.Nazev AS Produkt, pu.Nazev AS PenUstav, CONCAT(k.Jmeno, ' ', k.Prijmeni) AS Klient FROM [tbSmlouva] s JOIN [tbObchodnik] o ON s.IdObchodnik = o.Id JOIN [tbPenezniUstav] pu ON s.IdPenezniUstav = pu.Id JOIN [tbProdukt] p ON p.Id = s.IdProdukt JOIN [tbKlient] k ON s.IdKlient = k.Id;
Změníme jméno našeho View tak, aby jeho název co nejlépe popisoval to, co bude zobrazovat a poté pomocí tlačítka Update vytvoříme View, který jsme si pojmenovali ViewZobrazSmlouvy, který pak můžeme libolvolně používat. Máme tedy vytvořený View, kterým budeme chtít naplnit náš grid. Přejdeme
do
designeru
formulářového
okna,
ve
kterém
je
grid
umístěn.
Grafické rozhraní přehledné, intuitivní a vede nás pěkně krok po kroku. Kliknutím na šipečku v pravém horním růžku se nám zobrazí nabídka akcí. Zde zvolíme přidat nový Data Source.
37
Obrázek 15: DataGridView Tasks
Pokračujeme výběrem zdroje dat, který je v našem případě interní databáze a poté se nás průvodce zeptá, zda li chceme vytvořit DataSet.
Obrázek 16: DataGridView DataSet Configuration
Tímto krokem už jsme skoro hotovi a zbývá nám pouze vybrat, kterám objektem naplníme náš DataSet a dát mu opět jméno, které bude nejlépe vystihovat jeho účel.
38
Obrázek 17: DataGridView DataSet Configuration 2
Stiknutím tlačítka finish se gridu přiřadí náš DatasSource a pokud jsme provedli v pořádku, tak se nám po spuštění programu v datagridu zobrazí všechna data, které obsahuje ViewZobrazSmlouvy. Je pak jen na našem uvážení, která data považujeme za důležitá a budeme je zobrazovat.
5.9 Uživatelské rozhraní Při tvorbě živatelského rozhraní jsem dbal nejvíce na přehlednost a jednoduchost. Snažil jsem se udělat rozložení formulářových komponent tak, aby ovládání bylo co nejvíce jednoduché a intuitivní. Na pozadí hlavního formuláře jsem vložil tapetu s logem firmy aplikace, která zatraktivňuje vzhled hlavního formuláře. V hlavním menu najdeme lištu s menu, odkud se můžeme dostat do funkčních bloků (formulářů) vytvořené aplikace.
39
Obrázek 18: Hlavní formulář
Bezpečnost Pod položkou Nastavení se skrývá tzv. bezpečný mód, který upraví funkčnost aplikace tak, že se Vám při každém pokusu o změny údajů v databázi (editace a mazání) bude zobrazovat dotaz, zda li tuto akci chcete skutečně provést. I přesto, že jsem se aplikaci snažil vytvořit co nejsnáze ovladatelnou, tak mohou nastat chvíle, kdy uživatel nebude vědět, co přesně má do zadého pole zadat. Z tohoto důvodu jsem vstupy do určitých problematických polí omezil pouze na vybrané znaky a přidal k nim nápovědou, která se zobrazí vždy, když na ono problematické místo najedeme kurzorem myši.
Obrázek 19: Tooltip
40
Když byla aplikace testována, tak se největší kvantum chyb stávalo při vytváření nové smlouvy. Vyjmenuji zde pár nejdůležítejších úkonů, které jsem provedl, abych minimalizoval výskyt možné chyby. - Uživateli se po vyplnění jedné položky postupně zpřístupňuji další. - Do výběrových komponent, kde se nepočítá s vysokým počtem záznamů, nelze psát. - Podle zvoleného peněžního ústavu můžeme zvolit pouze ty produkty, které mají cizí klíč zvoleného peněžního ústavu. - Akce počítej (po stisknutí tlačítka Počítej) se provede až tehdy, pokud jsou vyplněny všechny potřebné údaje. - Smlouvu lze uložit až po stisknutí tlačítka Počítej - Pokud změníte procento provize firmy, budete dotázán, zda li opravdu chcete změnit na zadanou hodnotu - Uživatel nemůže psát nebo upravit informace v komponentách, které mají pouze informační účely
Obrázek 20: Bezpečnost smlouvy
Přehlednost Všechna důležitá data jsou zobrazována pomocí DataGridView, což ho s rostoucím počtem zobrazových údajů a záznamu činí nepřehledným. Prvním krokem bylo nastavení FullRowSelect, což nám zajistí, aby se po kliknutí na příslušnou buňku záznamu neoznačila pouze samotná buňka, nýbrž celý záznam (řádek). Zadruhé jsem vytvořil algoritmus, který mění barvu pozadí každého druhého řádku, čímž je mnohonásobně zvýšena přehlednost i při velkém počtu záznamů. Dále je umožněno 41
řazení záznamů podle hodnot ve sloupcích. Řazení se provede po kliknutí na hlavičku sloupce, na první kliknutí se záznamy seřadí vzestupně, na druhé zase sestupně. Dalšími možnostmi jsou filtrace a vyhledávání, které jsou popsány v kapitole 5.6. Uvádím příkladnou ukázku, kde vidět sestupné seřažení záznamu dle Registračního čísla, obarvení řádků i označení celého řádku.
Obrázek 21: Přehlednost DataGridView
42
5.10 Tisk do PDF Jedním z hlavních požadavků na aplikaci byla možnost generování faktur ve formátu pdf. Bohužel, Visual Studio zatím nedisponuje žádným nástrojem ani knihovnou, které by umožňovaly vytváření pdf dokumentů. Protože je však tento formát dokumentů ve světe počítačů natolik rozšířen, existuje i široká škála knihoven vytvořených třetí stranou, které Vám pomohou tento problém vyřešit. Máte na výběr z knihoven, za které musíte pro jejich užívání zaplatit nebo máte možnost použít „opensource“ knihovny neboli zdarma k užití. Pro svoji práci jsem zvolil opensource knihovnu PDFsharp, se kterou jsem se již setkal při vykonávání školní praxe, kde jsem ji využíval pro generování 2D kódů. Nejedná se však o jednu jedinou knihovnu, ale o soubor knihoven a každá slouží pro trochu jiné účely, ale já zde vyjmenuji pouze 2 nejdůležitější. Samotná knihovna PDFsharp umožňuje vytvářet pdf dokumenty, ve kterých budou textová pole, jednoduché formuláře nebo obrázky. Její rozšíření MigraDoc Vám umožní přidávat složitější grafické prvky. Práce s knihovnou je vcelku snadná a intuitivní, ale jelikož se jedná o opensource knihovnu je dosažení uspokojivého výsledku poměrně pracné, protože si všechno musíte ručně napsat. Pro ukázku uvedu kousek kódu, který je součástí třídy, která tvoří šablonu pro generování faktury ve formátu pdf. Ten kousek kódu vytvoří rameček a v něm text. gfx.DrawRectangle(blackPen, left, top, (page.Width - (left * 2)), fontSize + 14); left = left + 10; top = top + 5; gfx.DrawString("Daňový doklad -", font, XBrushes.Black, new XRect(left, top, page.Width.Point, page.Height.Point), XStringFormats.TopLeft); gfx.DrawString("FAKTURA", font, XBrushes.Black, new XRect(left + 90, top, page.Width.Point, page.Height.Point), XStringFormats.TopLeft); font = new XFont("Arial", fontSize, XFontStyle.Regular, options); gfx.DrawString("Faktura číslo : ", font, XBrushes.Black, new XRect(page.Width - left - 180, top + 2, page.Width.Point, page.Height.Point), XStringFormats.TopLeft); font = new XFont("Arial Black", fontSize, XFontStyle.Regular, options); gfx.DrawString(InvNumber.ToString(), font, XBrushes.Black, new XRect(page.Width - left - 90, top, page.Width.Point, page.Height.Point), XStringFormats.TopLeft);
43
6 Závěr Provedl jsem rozbor všech údajů a parametrů, které mi byly zadány firmou Sovaconsult s.r.o. Na základě této analýzy jsem vypracoval dva návrhy aplikace a vytvořil jsem datový model. Dále jsem navrhl funkční vlastnosti a metody vytvářené aplikace, které by měly naplnit očekávání firmy na výsledek mého snažení. Vytvořená aplikace byla vytvořena s důrazem na jednoduchost a intuitivnost ovládání pro uživatele. Aplikace usnadňuje vkládání smluv, výpočet provizních sestav, generování faktur a zajišťuje lepší přehled o smlouvách uzavřených obchodníky, což může být umocněno při využití filtrů, které byly dodělány nad rámec původního zadání. Aplikace bude nasazena ve firmě. Může se zdát, že se jedná o relativně jednoduchou databázovou aplikaci, která umí uchovávat a pracovat s daty o peněžních ústavech, produktech, klientech, obchodnících, smlouvách a provizích. Musím tedy podotknout, že při vývoji musely být vyřešeny složité algoritmy pro výpočet provize a aktualizace stavu obchodníkovi stornorezervy. Aplikace umí automatizovat některé kroky při vkládání nových smluv a vytváření nových klientů. Je ošetřen vstup rodného čísla tak, že uživateli je povoleno zadávat pouze čísla a jedno lomítko. Posledním přírůstkem do funkčnosti bylo generování faktur ve pdf pro jednotlivé obchodníky. Při realizaci bakalářské práce jsem rozšířil svoji znalost práce s databázemi a vyzkoušel jsem si práci nástrojem na propojování tabulek View, který se mi pro jeho velice snadné používání velice zalíbil. Osvojil jsem si znalost návrhových vzorů, které při jejich správném užití usnadňují programátorům jejich práci. Aplikace může být rozšířena o další funkce, které zde uvádím. Pro víceuživatelský režim pak budou řešena uživatelská práva pomocí systémových tabulek uživatelů. Uživatel se do programu přihlásí unikátním uživatelským jménem a heslem. Následně mu budou na základě přihlašovacích údajů přidělena jeho práva. Jednotlivé přístupy budou ošetřeny na úrovni uživatelských funkcí. Každému uživateli tak lze nastavit, zda danou informaci vidí či nevidí, případě zda ji má pouze ke čtení nebo ji může i editovat.
44
Seznam použité literatury 1.
Česká národní banka: Slovník pojmů. [online]. 2003-2014. [cit. 2014-05-03]. Dostupné z: http://www.cnb.cz/cs/obecne/slovnik/p.html
2.
MSDN: Úvod do jazyka C# a rozhraní .NET Framework. [online]. 2014. Dostupné z: http://msdn.microsoft.com/cs-cz/library/z1zx9t92.aspx
3.
Wikipedia: C Sharp. [online]. 2014. Dostupné z: http://cs.wikipedia.org/wiki/C_Sharp
4.
Wikipedia: Microsoft SQL server. [online]. 1.4.2014 [cit. 2014-05-14]. Dostupné z: http://cs.wikipedia.org/wiki/Microsoft_SQL_Server
5.
Wikipedia: Visual Studio. [online]. 2014. vyd. Dostupné z: http://cs.wikipedia.org/wiki/Microsoft_Visual_Studio
6.
Programujte.com: Teoretický úvod do relačních databází. [online]. 2003–2014. Dostupné z: http://programujte.com/clanek/2007110801-teoreticky-uvod-dorelacnich-databazi/
7.
Programujte.com: Seriál návrhových vzoru. [online]. 2003–2014. Dostupné z: http://programujte.com/clanek/2012032900-serial-navrhovych-vzoru-1dil/
8.
Algoritmy.net: Singleton. [online]. 2014. Dostupné z: http://www.algoritmy.net/article/1326/Singleton
9.
Bjbaskar: Singleton Pattern. [online]. 2014. Dostupné z: http://bjbaskar.com/tanuj/singleton-pattern/
10.
Mareš, Amadeo, 1001 tipů a triků pro C#, 1.vydání, Brno: Computer Press, 2008, 360, 978-80-251-2125-2.
11.
Virius, Miroslav. C# Hotová řešení, Computer Press, Brno, 2006, ISBN 80-2511084-2
45
Seznam obrázků Obrázek 1: Visual Studio Camparison............................................................................ 18 Obrázek 2: Tabulka databáze .......................................................................................... 19 Obrázek 3: Cizí klíče ...................................................................................................... 20 Obrázek 4: ER model aplikace ....................................................................................... 21 Obrázek 5: Tabulka peněžní ústav .................................................................................. 21 Obrázek 6: Tabulka produkt ........................................................................................... 22 Obrázek 7: Tabulka klient............................................................................................... 23 Obrázek 8: Tabulka obchodník ....................................................................................... 23 Obrázek 9: Tabulka smlouva .......................................................................................... 24 Obrázek 10: Tabulka provize .......................................................................................... 25 Obrázek 11: Tabulka pozice ........................................................................................... 26 Obrázek 12: Singleton Pattern ........................................................................................ 27 Obrázek 13: Jednoduchý filtr .......................................................................................... 34 Obrázek 14: Dvojnásobný filtr ....................................................................................... 35 Obrázek 15: DataGridView Tasks .................................................................................. 38 Obrázek 16: DataGridView DataSet Configuration ....................................................... 38 Obrázek 17: DataGridView DataSet Configuration 2 .................................................... 39 Obrázek 18: Hlavní formulář .......................................................................................... 40 Obrázek 19: Tooltip ........................................................................................................ 40 Obrázek 20: Bezpečnost smlouvy................................................................................... 41 Obrázek 21: Přehlednost DataGridView ........................................................................ 42 Obrázek 22: Hlavní formulář .......................................................................................... 49 Obrázek 23: Formulář zobraz smlouvy .......................................................................... 50 Obrázek 24: Nová smlouva / editace smlouvy ............................................................... 50 Obrázek 25: Editace/smazání záznamu .......................................................................... 51 Obrázek 26: Nový záznam .............................................................................................. 52 Obrázek 27: Tisk ............................................................................................................. 53 Obrázek 28: Faktura........................................................................................................ 54
46
Seznam použitých zkratek CLR – Common Language Runtime IDE - Integrated Development Environment GUI – Graphic User Interface HTML – HyperText Markup Language MS SQL – Microsoft Structured Query Language VS MSSQL – Visual Studio Microsoft Structured Query Language
47
Přílohy 1 Obsah přiloženého CD Na přiloženém CD se v kořenovém adresáři nachází tato bakalářská práce ve formátu bakalarska_prace.pdf s jednoduchým návodem navod.txt pro obsluhu programu.
48
2 Uživatelská manuál 2.1 Spuštění aplikace Po spuštění aplikace se zobrazí hlavní okno s nabídkovou lištou, která je startovacím bodem do všech ostatních formulářů.
Obrázek 22: Hlavní formulář
2.2 Smlouva Položka smlouvy pod sebou skrýva položky nová smloua a zobraz vytvořené. Zobraz smlouvy V tomto formuláři můžeme vidět vytvořené smlouvy. Dvojklikem na záznam se nám otevře okno se smlouvou, kde ji můžeme upravovat.
49
Obrázek 23: Formulář zobraz smlouvy
Nová smlouva / editace smlouvy V obou případech se nám zobrazí stejně vypadající formulář. Odlišují se v titulku okna a že u nové smlouvy bude formulář prázdný, kdežto při editaci bude formulář vyplněn daty vybraného záznamu smlouvy.
Obrázek 24: Nová smlouva / editace smlouvy
Postup při vyplňování je na chlup stejný u obou případů. Po vyplnění všech potřebných údajů stiskneme tlačíko Počítej, které spočítá provize, a poté stiskneme tlačítko „Uložit“, které uloží záznam do databáze.
50
2.3 Entity vystupující ve smlouvě Entitami jsou myšleni obchodníci, klienti, produkty a peněžní ústavy. Ovladání těchto formulářových oken popíši pouze na jednom případu, protože obsahují pouze jiné údaje, ale ovládání je identické. Pro ukázku použiji třeba entitu Produkt. Přehled / mazání / editace Po výběru položky Produkt v menu hlavního formuláře se nám zobrazí další formulář, který nese titulek „Produkty“. Můžeme v něm vidět přehled produktů, tlačítka „Nový“, „Ulož“ a „Smaž“, pole s informace o vybraném produktu a pole, které slouží pro vyhledávání a filtraci. Pokud chceme zobrazit informace o produktu, tak stačí kliknout na příslušný záznam v DataGridView. Zobrazený záznam můžeme upravovat nebo smazat stisknem tlačítka „Smazat“. Upravovat můžeme tím způsobem, že změníme hodnoty v poli informace o produktu a stiskneme tlačítko „Ulož“.
Obrázek 25: Editace/smazání záznamu
Pokud chceme přidat nový záznam, klikneme na tlačítko „Nový” a poté se nám zobrazí nový formulár s titulkem „Nový produkt“, kde po vyplnění údajů můžete přidat záznam stisknutím tlačítka „Ulož“.
51
Obrázek 26: Nový záznam
52
2.4 Tisk Poslední funkčnost programu je tisk faktur. Po zobrazení formuláře můžeme vidět 2 funkční tlačítka a pole, kde volíme kritéria tisku. Po zvolení obchodníka, nastavíme rok a měsíc, za který chceme obchodníkovi vytisknout fakturu. Poté můžeme zvolit náhled již proplacených faktur nebo proplatit faktury, které obchodníkovi za vybrané odbodí ještě nebyly vyplaceny. Po stisku jakéhokoli tlačítka se pak zobrazí souhrn, vyhovující zadaným kritériím ve formátu pdf.
Obrázek 27: Tisk
53
3 Faktura Aplikace umí generovat takovéto faktury.
Obrázek 28: Faktura
54