ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická Katedra počítačů
Ekonomický model firem a jejich interakce Economic model of companies and their interactions
BAKALÁŘSKÁ PRÁCE Bakalářský program: Softwarové technologie a management Obor: Softwarové inženýrství
Autor: Lukáš Kališ Vedoucí práce: Doc. Ing. Ivan Jelínek CSc.
2010 1
2
P ROHLÁŠENÍ Prohlašuji, že jsem bakalářskou práci vypracoval samostatně na základě uvedených pramenů a uvedené literatury. Nemám námitky proti použití tohoto školního díla ve smyslu §60 zákona č. 121/2000 Sb., o autorských právech a právech souvisejících, ve smyslu pozdějších znění tohoto zákona.
V Praze dne
3
4
P ODĚKOVÁNÍ Zde bych rád poděkoval svému vedoucímu bakalářské práce Doc. Ing. Ivanu Jelínkovi kandidátu věd, za jeho vstřícnost, užitečné rady a za to, že si i ve svém nabitém programu vždy našel čas na konzultaci. Také bych rád poděkoval vedoucímu bakalářské práce mého kolegy se kterým jsme téma zpracovávali profesoru Ing. Oldřichu Starému kandidátu věd, za velmi inspirující konzultace, jeho optimismus a velké nadšení pro věc. V neposlední řadě bych rád poděkoval svému kolegovi/kamarádovi Danielu Hrazdilovi za skvělý nápad na téma práce, které jsme spolu poté mohli rozvinout a za pomocnou ruku kterou podá vždy když je třeba.
5
OBSAH Slovníček pojmů....................................................................................................................................... 7 Abstrakt ................................................................................................................................................... 8 1. Úvod - motivace................................................................................................................................... 9 2. Specifikace zadání.............................................................................................................................. 11 2.1. Obecně........................................................................................................................................ 11 2.2. Herní možnosti ........................................................................................................................... 11 3. Srovnání s podobnými aplikacemi ..................................................................................................... 13 3.1. Webgame ................................................................................................................................... 13 3.2. MarketiX ..................................................................................................................................... 13 4. Technologie ....................................................................................................................................... 15 5. Návrh modelu .................................................................................................................................... 17 6. Implementace .................................................................................................................................... 19 6.1. Jednotlivé stránky ....................................................................................................................... 19 6.2. Popis funkcí................................................................................................................................. 22 6.3 objektový přístup......................................................................................................................... 24 7. Testování ........................................................................................................................................... 25 7.1. Funkcionální testování................................................................................................................ 25 7.2. Unit testing ................................................................................................................................. 25 7.3. Výkon .......................................................................................................................................... 25 8. Rozšiřitelnost ..................................................................................................................................... 27 8.1. Zvýšení interakce mezi firmami .................................................................................................. 27 8.2. Přidání dalších obchodních odvětví ............................................................................................ 27 8.3. Rozdělení typů firem podle jejich velikosti................................................................................. 27 9. Závěr .................................................................................................................................................. 29 Seznam použité literatury ..................................................................................................................... 30 citace ................................................................................................................................................. 30 Zdroje................................................................................................................................................. 30 Seznam obrázků a grafů ........................................................................................................................ 31 9.1 Přílohy .............................................................................................................................................. 32 9.2. Manuál instalace......................................................................................................................... 32 9.3. Obsah CD .................................................................................................................................... 32 9.4. SQL script na vytvoření databáze ............................................................................................... 32
6
Slovníček pojmů Přesto, že nepředpokládám neznalost termínů použitých v této práci, přikládám slovníček vysvělující zkratky a nejasné pojmy použité v této práci. Kolo = Tah
jedna jednotka simulující čas ve hře, jedno kolo odpovídá zhruba týdnu
CSS
Cascade Style Sheets - kaskádové styly pro web umožňující úpravu vzhledu HTML stránky
XHTML
eXtended HyperText Markup Language - značkovací jazyk webových stránek
PHP
Hypertext PreProcesor - jazyk pro tvorbu dynamického webu
Firefox
Jeden z nejrozšířenějších webových prohlížečů, podporující různé doplňky vývojářského i uživatelského zaměření.
doplněk
Rozšíření existujícího programu přidáním modulu s novou funkčností.
Selenium
Program na funkcionální testování webových aplikací implementovaný formou doplňku do Firefox.
XML
eXtensible Markup Language - je univerzální značkovací jazyk umožňující vytváření vlastních dokumentů, zpracovatelných pomocí dodatečných programů nad XML
XPath
Dotazovací jazyk na dokumenty XML, který vrací popsaný element. Použitelné nad XHTML, protože to je také XML dokument.
7
ABSTRAKT Tato práce má za cíl vytvořit na základě ekonomického modelu online herní aplikaci. Heslem této práce je „Škola hrou“, hra by měla mít vzdělávací efekt. Naučit hráče, jakým způsobem myslet, jak optimalizovat procesy ve firmě, starat se o své zaměstnance a celkově udržet firmu prosperující. V této práci jde o to implementovat hru s jistou mírou abstrakce aplikovat finanční toky a procesy ve firmě. Podle firemního modelu jsem vytvořil datový model, který odráží vztahy existující ve firmách a je základem celé práce. Dalším cílem je implementovat hodnotící kritérium. Toto kritérium je zcela originální - vytvořené kolegou Danielem Hrazdilem v jeho bakalářské práci.
ABSTRACT Main goals of this project are to create online game played in browser based on economic model of companies. Motto of this project is "Schola Ludus". This game should teach its players ways to think , optimize company processes, take care of employees and generaly keep the company profitable. With a little abstraction, main points of company were described and based on these points database model was created. This model is core of the application and should reflect relations in company. Another important goal is to implement ranking criteria based on which company ladder is created. This criteria is entirely authentic and was created by my colleague Daniel Hrazdil in his bachelors project.
8
EKONOMICKÝ MODEL FIREM A JEJICH INTERAKCE K APITOLA 1
1. ÚVOD - MOTIVACE Tato práce se zabývá převzetím analýzy ekonomického modelu firem, které je tématem bakalářské práce kolegy Daniela Hrazdila, a převedením jeho řešení do praxe vytvořením webové hry, na této analýze založené. Téma Ekonomický model firem a jejich interakce (e-game), jsme vymysleli s kolegou Danielem Hrazdilem. Jeho cílem je vytvořit fungující prostředí pro simulaci chování výrobních firem v ČR. Toto téma má velký potenciál a rozsah a proto jsme se rozhodli ho zpracovat společně. Téma jsme rozdělili na dvě části. Analýzu ekonomických pravidel v ČR, vytvoření rozumného poměru abstrakce a reálného základu, kterou zpracoval můj kolega Daniel Hrazdil. Druhá část se skládá z implementování dané problematiky formou webové hry, která má sloužit jako vzdělávací program zábavnou formou. Formu webové hry jsme zvolili z důvodu vysoké dostupnosti většímu počtu lidí, kteří se mohou zaregistrovat a hru si zahrát. Jako částečná inspirace pro tento nápad nám posloužila již 9 let běžící online strategická hra www.webgame.cz. Z této hry jsme převzali především systém odehrávání po kolech a způsob hodnocení hráče jedním komplexně vypočítaným číslem - u e-game prosperita, u webgame prestiž. V této hře se hráč seznámí se zjednodušenou verzí vedení firmy, kde se bude muset starat o různé aspekty spravování firmy - výběru odvětví podnikatelské činnosti, najímání zaměstnanců, stavění výrobních a skladovacích budov, půjčování peněz a jejich splácení, vytváření dlouhodobých závazků, plnění těchto závazků v plné výši a pořizování vylepšení pro svojí firmu, což je nejstěžejnější částí projektu v této fázi.
9
10
K APITOLA 2
2. SPECIFIKACE ZADÁNÍ 2.1. OBECNĚ E-game je ekonomická webová hra. Je tvořena s částečnou abstrakcí, která je založena na reálných ekonomických pravidlech. Hra je hratelná v internetovém prohlížeči, tedy dostupná prakticky všem kdo mají zájem si ji zahrát. Hra je schopná obsluhovat desítky hráčů najednou pomocí php klienta.
2.2. HERNÍ MOŽNOSTI Hráč se zaregistruje, určí si heslo a zadá emailovou adresu. Poté se již může přihlásit a vybrat si jméno svojí firmy. Po založení nové firmy je hráč postaven před volbu odvětví jeho podnikatelské činnosti v rámci hry a výběru produktu, který chce v daném odvětví produkovat. Hráč dále ovládá tyto aspekty firmy: najímání a propouštění zaměstnanců. Zaměstnanci mají dále zajištěn automatický postup do vyšších pozic, odvíjející se od počtu zaměstnanců ve firmě a to do pozic nižšího nebo vyššího managementu. Takto ohodnocení zaměstnanci získávají vyšší platové zařazení. Firma získáním zaměstnanců na vyšších pozicích v zaměstnanecké hierarchii získává bonusy a to do zvýšení produktivity práce zaměstnanců v případě nižšího managementu a snížení nároků v případě vyššího managementu. Dalším aspektem je stavba produkčních a skladových prostor, které umožňují zapojit do práce více zaměstnanců a mít větší prostory pro uskladnění výrobků firmy a surovin, ze kterých jsou produkty vyráběny. Stěžejní částí hry je také pořizování jednotlivých vylepšení, které podle matematických propočtů zvyšují efektivitu firmy v mnoha ohledech. Firma také uzavírá dlouhodobé smlouvy s odběrateli jeho produktu a dodavateli surovin, které potřebuje pro výrobu svého produktu. Pokud potřebuje nebo chce, může také nakupovat na trhu, kde je prodej i nákup okamžitý, ale za nevýhodných podmínek. Zatím jedinou možností interakce s ostatními hráči je ingame pošta ve které si mezi sebou mohou posílat zprávy. Hlavním kritériem úspěchu je prosperita vytvořené firmy, jejímž výpočtem se zabývá se své části Daniel Hrazdil. Podle prosperity a efektivity hospodaření firem se vytvoří žebříček s cílem každého hráče dosáhnout co nejvyššího umístění.
11
12
K APITOLA 3
3. SROVNÁNÍ S PODOBNÝMI APLIKACEMI 3.1. WEBGAME V českém prostředí nemá hra srovnatelnou aplikaci s podobným cílem. Jednou z možností srovnání je hra www.webgame.cz, která nám posloužila jako inspirace. Ve webgame si hráč zakládá vlastní zemi, ve které si vybere vládu podle propracovaných tabulek s bonusy do různých odvětví ve hře. Největším kladem webgame je vysoká možnost interakce s ostatními hráči, ti se seskupují v aliancích a ty proti sobě následně bojují nebo mohou uzavřít spojenectví. Webgame je ve srovnání s e-game mnohem propracovanější s velkou možností interakce, důvodem je však to, že vývoj webgame probíhá již 9 let, pracuje a pracovalo na něm velké množství vývojářů. Na druhou stranu e-game má možnost, kterou webgame nemá a to stát se vzdělávacím programem ve stylu škola hrou a to je také naším cílem do budoucna. Co je ale zajímavé je to, že webgame na svém počátku začal také jako bakalářská práce. Proto naše cíle nejsou o nic menší, jsme si také vědomi toho, že, aby naše aplikace dosáhla podobného úspěchu (tisíce aktivních hráčů), bude zapotřebí dalšího vývoje i po dokončení bakalářské práce. Téma e-game má totiž také velký potenciál. Už nyní máme množství nápadů na rozšíření, které však nejsou v rámci bakalářské práce realizovatelné a budou vyžadovat se vývojem hry nadále zabývat. Tato rozšíření máme v plánu aplikovat do diplomové práce, která by měla e-game dále rozšiřovat.
3.2. MARKETIX Citace hlavních rysů hry (marketix.cz/rysy.php, 2005 - 2009)
na začátku hry si hráč jako dělník hledá práci koncové výrobky může hráč nakupovat pro zvýšení pracovního výkonu hráč musí nakupovat jídlo, aby neonemocněl hráč se může vzdělávat, aby mohl pracovat v lepší práci za vyšší mzdu po vydělání peněz může začít podnikat hráč se snaží vydělat prodejem výrobků jiným hráčům každý hráč může postavit neomezeně podniků podnik může vyrábět jen jeden výrobek při výrobě se spotřebovávají suroviny - komodity, které zaniknou koncové výrobky může hráč nakupovat pro svoje podniky, tím se zlepší pracovní podmínky a zvýší se výkon podniku, což se projeví v rychlejší produkci výrobky stárnou, pokud se jejich životnost naplní, zaniknou hra probíhá na kola, kolo je každou hodinu, v každém kole se vyrábí a spotřebovává na výběr je 30 obličejů pro hráče
Když jsem hledal hru na podobném základě, kterou bych mohl použít pro srovnání, narazil jsme na ekonomickou online hru MarketiX. Podle informací v helpu se zdála být celkem propracovaná. Její vývoj trvá již 5 let a ačkoli jsou možnosti celkem robustní i při krátkém 13
vyzkoušení hry jsem narazil na množství chyb. Systém hry se také počítá na kola ty ale zde nikam nepřibývají, ale každou hodinu se odehraje jedno kolo všem hráčům. Když se v MarketiXu zaregistrujete a poprvé přihlásíte začínáte jako člověk - dělník. Po prvním přihlášení začínáte úplně bez peněz bez čehokoli a máte prakticky dvě možnosti výběru. Jít studovat nebo jít do práce. Poté co jsem se podíval na nabídky práce a zjistil, že není žádná práce, do které by mě vzali a tak mi nezbylo nic jiného než jít studovat. Musím uznat, oborů na studium je tu na výběr víc než dost ale informace o´tom, co s tím mohu dělat nebo jaký je vlastně praktický rozdíl mezi jednotlivými obory jsem se nedozvěděl. Přihlásil jsem se tedy ke studiu a k mému velkému překvapení to bylo opravdu vše co se dalo v tomto bodě se hrou dělat, protože studium trvá 20 kol (hodin!). A tady dle mého názoru autoři udělali základní chybu. Když se totiž přihlásí nový hráč tak si jednou "klikne" a pak aby na další akci čekal 20 hodin ? Dle mého odhadu 99% lidí, co na hru narazí a zaregistrují se a přihlásí tam po těch 20 hodinách už neuvidíme. Pro srovnání našimi hráči v systému se toto stát nemůže, protože jsou již od prvního přihlášení schopni a nuceni se rozhodovat, jakým způsobem svou firmu povedou. Přesto jsem si z hlavních rysů, uvedených výše, něco odnesl. Hra nemá špatný námět, jen ten způsob hraní je na začátku velice odrazující. Co v tom vidím, je inspirace pro budoucí další rozšíření e-game. Dva z těchto principů již v e-game máme a to výroba produktu z několika surovin a vzdělávání zaměstnanců. Z těch, co obsaženy nemáme mě nejvíc zaujala vlastnost výrobků, které mají omezenou životnost a po jejím skončení zaniknou. Tento princip by byl vhodný i do naší hry - pokud by hráč měl na skladech svoje výrobky příliš dlouho prostě by mu propadly. Další vlastnost, kterou máme v plánu do budoucna implementovat je obchodování mezi firmami.1
1
je podrobněji rozebráno v kapitole 8 - rozšíření
14
K APITOLA 4
4. TECHNOLOGIE Hra e-game používá technologie webu a využívá XHTML, CSS, JavaScript, php a MySQL. Dále se budu věnovat důvodům, proč jsem zvolil zrovna tyto technologie a stručně popíši jejich vlastnosti. Základem každého webu je HTML jazyk, já zvolil jeho novější a upravenou verzi XHTML, která je mimo jiné kompatibilní s XML což do budoucna může umožnit další rozšíření pomocí této technologie. Druhým důvodem je také vyšší kompatibilita XHTML s různými webovými prohlížeči. Další použitou technologií je CSS což jsou kaskádové styly, které ve spolupráci s XHTML umožňují flexibilní ladění vzhledu stránek. Důvodem je rozlišení obsahu od formy. Pro úlohy, na které nestačí jazyk php (změna obsahu stránky bez znovunačtení, kontrola správnosti zadání emailové adresy nebo na dialogové okno alert), používám jazyk javascript. Jazyk php je dynamický skriptovací jazyk pro web, stále se vyvíjí a v dnešní době je nejpoužívanější technologií pro tvorbu dynamického webu, který aplikace jako je e-game vyžaduje. Pomocí php lze z webových stránek dostat maximum, nyní ve verzi php5 obsahuje kromě běžných programovacích konstruktů (cykly, podmínky, funkce, proměnné) také podporu pro objektové programování. MySQL stojí pod tímto vším a poskytuje datovou základnu, se kterou php pracuje. MySQL je volně šiřitelný databázový stroj, který bez větších problémů zvládne jak menší, tak i větší databáze s velkým množstvím přístupů. V dnešní době je MySQL jedna z nejrozšířenějších databází vůbec. K získávání dat z databáze používá standardní jazyk SQL s několika specifickými příkazy. Tyto technologie hostí webový server Apache. Kombinací těchto technologií získáme dostatečně silný nástroj pro implementace hry jakou je e-game. Jejich největší výhodou je, že jsou všechny distribuovány s otevřenou licencí a tudíž jsou dostupné každému, kdo je potřebuje.
15
16
K APITOLA 5
5. NÁVRH MODELU Použitá databáze je MySQL, model jsem vytvářel v programu ER modelář. Podle modelu jsem vytvořil SQL skript na vytvoření databáze a vložení potřebných hodnot.
OBRÁZEK 1- DATOVÝ MODEL EGAME V následujícím odstavci jsou v hranatých závorkách uvedeny datové typy atributů.
Hlavní entitou je firma, která je identifikačně závislá na entitě hrac. Ostatní entity jsou buď identifikačně závislé na entitě firma nebo s ní mají definovaný vztah. Entita hrac má svoje unikátní id, dále s povinným výskytem evidujeme nick [varchar], email [varchar], heslo [varchar] a volitelně číslo ICQ [int]. Entita firma má také svoje unikátní id. Toto id identifikuje firmu a s ní i všechny ostatní entity na ní závislé. Dále evidujeme jmeno [varchar], které hráč zadává při prvním přihlášení do hry. Povinný atribut typ [tinyint] je v rozmezí 1 - 3 a určuje obor, kterému se firma věnuje (potravinářský, stavební, strojírenský). Dalšími důležitými atributy jsou penize [int] a zasoby [int], do nich se při každém čtvrtém odehrání kola ukládají aktuální stav financí firmy a množství naskladněného produktu. Do atributů zisk [int] a vydaje [int] se každé kolo ukládají průběžné hodnoty peněz které firma obdržela a zaplatila. Tyto hodnoty se jednou za měsíc (4kola) přičtou/odečtou k/od celkovým penězům na účtu firmy. Atributy odehrano [int] a dost_kola [int] obsahují hodnoty množství kol, které má hráč v zásobě a odehrané. Prosperita [int] je hlavní 17
hodnotící prvek v žebříčku firem a určuje jak moc dobře si hráč vede. Akt_xp [int] je atribut obsahující hodnotu aktuálních zkušeností zaměstnanců ve firmě. Ten dává bonus do produkce a je v rozmezí 100 - 200 %. Hodnota je spočítaná jako průměr bonusů všech vylepšení zaměstnanců a při najímání nových zaměstnanců se poměrově snižuje pod hranici maximálních zkušeností. Atribut bankrot [tinyint] indikuje, zda firma zbankrotovala tzn. došly jí všechny peníze, suroviny i produkty. Dále má firma množství atributů na ekonomické ukazatele (EVA, CF, likvidita, DE, EBT, ROS) [int]. Entita pujcka obsahuje všechny půjčky, které si firma vzala od banky, její atributy jsou: id [int], castka [int], urok [int], doba [int] a nakladove_uroky [int]. Další entitou jsou kontrakty. Kontrakty jsou generovány hrou a představují simulaci dlouhodobé dodavatelské smlouvy. Má atributy id [int], vyrobek[tinyint] - obsahuje číslo referující na typ výrobku (1 - 9) , delka [int] - doba na kterou je kontrakt uzavřen hodnota je 48 nebo 96 kol (1 nebo 2 roky) , dodavka [int] obsahuje množství produktu, který je třeba každé kolo dodávat, logistika [int] určuje minimální potřebnou logistiku pro uzavření tohoto kontraktu. Cena [int] obsahuje číslo co znamená hodnotu jedné jednotky produktu. Obecně platí čím větší logistika tím větší dodávka i cena. Entita vylepseni je v relačním vztahu s entitou firma. Tuto relaci představuje relační tabulka pořídí která navíc obsahuje uroven [int] a bonus [int] z daného vylepšení, což umožňuje snadno přidávat nová vylepšení. Vylepšení obsahuje názvy jednotlivých vylepšení v atributech typ [varchar] a podtyp [varchar] a id [int] atribut, který každé vylepšení identifikuje. Entita budovy je identifikačně závislá na firmě a obsahuje budovy, které má firma postavené. Atribut stavba [int] určuje, zda se daná budova zrovna staví, pokud ne obsahuje 0, pokud ano obsahuje hodnotu, kolik procent z budovy je již postaveno. Entita suroviny je také identifikačně závislá na entitě firma a obsahuje typy surovin, ze kterých firma vyrábí svůj produkt, jejich množství a cenu na prodej a nákup na okamžitém trhu. Poslední entitou ve vztahu s entitou firmy je produkt. Ten obsahuje id a typ[varchar] produktu. Při výběru produktu se do relační tabulky produkce zapíše id firmy která si tento produkt vybrala. Ostatní entity nejsou v žádném vztahu s jinou entitou. Zakony obsahují konstanty dané zákonem a používané v aplikaci. Například minimální plat jednoho zaměstnance, daně. Ceny obsahují také základní konstantní ceny surovin, se kterými se v aplikaci počítá. Entita zpravy obsahuje data používaná na interní herní poštu mezi hráči. Jednotlivým hráčům se zobrazují podle atributů odesilatel a adresat, dále obsahuje atribut ts [timestamp], což je časový otisk, který se zapíše v době odeslání zprávy. Podle tohoto atributu se v poště zprávy řadí. Atribut precteno [tinyint] nabývá hodnot 1 pro přečtenou zprávu a 0 pro nepřečtenou.
18
K APITOLA 6
6. IMPLEMENTACE 6.1. JEDNOTLIVÉ STRÁNKY Základní layout stránek je vytvořen pomocí zahrnování jiných php souborů. Soubor defaultlayout.php obsahuje kód pro zobrazení loga, horní informační lišty a levého navigačního menu. To zaručuje jednoduchou rozšířitelnost o další informace do lišty a stejně tak o nové odkazy do navigačního menu, které se pak automaticky zobrazí na všech relevantích stránkách. Soubory pro připojení databáze a autorizaci uživatele se rovněž zahrnují. Většina formulářů obsažených ve hře odesílá data na stránky, na které jsou umístěny, k tomu používá metodu POST, kterou php detekuje funkcí isset(). Ihned po přihlášení je z databáze načteno identifikační číslo firmy a uloženo do proměnné $_SESSION, díky které je pak přístupné ze všech stránek aplikace. Na stránce Pošta je implemetovaný interní systém pošty. Php načte všechny zprávy kde se v adresátovi nebo odesílateli objevuje číslo hráčovy firmy a seřadí je podle časového otisku. Pomocí podmínek v php a definice kaskádových stylů přímo v tagu tabulky jsou zprávy různě obarveny pro lehčí odlišení - odeslané, přijaté, nové. U výpisu jména hráče a jeho firmy, který je i zároveň odkazem na detaily o firmě, jsou ikonky dopisu, které po kliknutí vepíšou číslo firmy do řádku pro adresáta. Tohle zařizuje JavaScript. Na stránce Produkty si hráč vybírá, v jakém oboru bude jeho firma podnikat a co bude vyrábět. JavaScript umožňuje podle označení oboru zviditelnit pouze relevantní výrobky. Hráč zde také vidí tabulku rozložení firem na e-game a to i se základními cenami výrobků. Toto mu umožňuje lépe se rozhodnout co začít vyrábět.
OBRÁZEK 2 - TABULKA ZAPLNĚNOSTI TRHU
19
Na stránce Výroba se nachází tabulka pro stavbu budov, která se postupně rozšiřuje o budovy zpřístupněné přes související vylepšení. Řeším to podmíněným příkazem v php, který do sebe uzavírá celý blok XHTML - pokud hráč má potřebné vylepšení, řádek tabulky se mu zobrazí. Druhá tabulka je pouze informační a ukazuje, jak probíhá výrobní proces tzn., kolik z dostupných zaměstnanců firma momentálně využívá, kolika směnný provoz firma provozuje a bonus do
OBRÁZEK 3 - VÝROBA
výroby spočítaný z vylepšení automatizace a zkušeností zaměstnanců. Na stráce Vylepšení jsou dvě tabulky (OBRÁZEK 3) - vylepšení pro zaměstnance a technologická vylepšení. U vylepšení školení, logistiky skladů a automatizace výroby je implementován výpočet přes upravenou funkci arcus tangens (OBRÁZEK 5) do nějž vstupuje číslo úrovně vylepšení a funkce vrací procentuální bonus na daném vylepšení. Koupě vylepšení je okamžitá a změny se projeví ihned.
OBRÁZEK 4 - VYLEPŠENÍ
20
Procentuálni efekt 100 90 80 70 60 50 Procentuálni efekt
40 30 20 10 0 1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16
OBRÁZEK 5 - GRAF EFEKTU, 80*ARCTAN(X/6)
Stránka Finance zobrazuje informace o platech zaměstnanců, možnost pořídit si půjčku a informace o nesplacených půjčkách. Na zjištění, zda firma může dostat půjčku používám funkci getMaxPujcku($fa_id), která buď vrátí maximální možnou částku jakou si firma v aktuálním stavu může půjčit nebo vrátí záporné číslo. Pokud funkce vrátí záporné číslo znamená to, že půjčka nemůže být poskytnuta. Pokud funkce vrátí maximální půjčku, systém hráči nabídne výběr ze 4 půjček, výše každé půjčky je o 25% nižší než ta předchozí. každá o odvozených z maximální půjčky snižováním o 25%, které . Hodnota maximální půjčky se počítá jako hodnota firmy přepočítaná na peníze, tedy aktuální peníze v hotovosti + peníze v nemovitostech + peníze ve vylepšeních. Od této hodnoty se pak odečítá dvojnásobek hodnoty již půjčených peněz a to celé vynásobené 1.5. Pod tabulkou s pořizováním půjček je tabulka s informacemi o aktuálních závazcích vůči bance. V tabulce se dozvíte jakou částku zbývá splatit, na jaký úrok má firma půjčeno, zbývající kola do splacení půjčky a hodnotu jedné splátky. Tyto hodnoty počítají a získávají další funkce, kterým se budu věnovat dále.
OBRÁZEK 6 - FINANCE
21
Na stránce Kontrakty se nachází kontrakty, které jsou vygenerované podle informací z celého e-game. Kontrakty se generují každých 15 min, stejně jako přibývá 1 kolo. Toto se děje v souboru timer.php, který je nastaven na automatický spouštěč scriptů cronjob běžícím pod systémem Linux.
OBRÁZEK 7 - KONTRAKTY
6.2. POPIS FUNKCÍ Na generování kontraktů je použita procedura generujProdejniKontrakty(). V této proceduře používám dvě pole o devíti prvcích, pole_poctu_vyrobku a mod_cena ve kterém jsou uloženy základní ceny výrobků tak, že index pole je zároveň id produktu. Do $pole_poctu_vyrobku se zapisují hodnoty nejvyššího přírůstku pro každý produkt tak, že index pole je zároveň id produktu. Ve stejném cyklu se do proměnné $maxlog uloží nejvyšší úroveň vylepšení logistiky, od které se pak odvíjí generování kontraktů. Dále obsahuje dva vnořené cykly for každý běžící 9 iterací. Řídící proměnná vnitřního cyklu představuje id výrobku - index v poli počtu výrobků. Nejdříve se však zkontroluje kolik kontraktů je vygenerovaných a nepodepsaných a vždy je doplní na maximální počet 10 kontraktů jednoho druhu produktu, pokud je kontraktů víc než 9 přeruší se aktuální průchod cyklem a jde se na další výrobek. Pokud je tedy třeba vygenerovat nové kontrakty tělo cyklu pokračuje dál. Nedřív se do proměnné $mod uloží náhodný modifikátor který generuje hodhoty od 0.5 do 1.5 a do proměnné $mod_vyr hodnoty od 0.2 do 1. Další náhodně přidělenou hodnotou je délka kontraktu (48 nebo 90kol) je náhodné číslo mezi 1 - 2 vynásobené 48. Poté se spočítá jedna dodávka násobkem nejvyššího množství vyrobeného produktu na e-game vynásobeného $mod_vyr. Na základě hodnoty modifikátoru se rozhodne jakou logistiku bude kontrakt požadovat - pro hodnoty <1.3,1.5> je to hodnota nejvyšší logistiky na e-game, pro (1.3,1> je to hodnota 80% nejvyšší logistiky, (1, 0.8> 60% a (0.8,0.5> 40%. Hodnota požadované logistiky se pak použije jako modifikátor ceny za jeden výrobek a to tak, že každá úroveň logistiky znamená +10% k ceně. Po vytvoření všech těchto proměnných se kontrakt zapíše do databáze a zobrazí relevantním hráčům podle jejich produkce. Další zajímavou funkcí je getFullFirmName($fa_id), která získá celé jméno firmy i hráče spolu s jejich id a vrátí XHTML kód odkazující na detaily o firmě, kde se id firmy posílá přes 22
adresní řádku. Soubor detaily.php zobrazuje veřejné detaily o každé firmě. Data o firmě získám vytvořením nové instance objektu firmy s id dané firmy jako parametr. Z této instance se získají potřebné údaje. Instance je po použití uvolněna. Ve funkci getProduktName($fa_id) jsem použil zatím nejsložitější SQL dotaz v aplikaci. Funkce vrací jméno produkovaného výrobku přímo z databáze. SELECT produkt.typ FROM produkt JOIN ( produkce JOIN firma ON produkce.fa_id = firma.id ) ON produkt.id = produkce.pr_id WHERE firma.id = $fa_id Dotaz vybírá atribut typ z tabulky produkt, ale abychom se k němu dostali, musíme nejdřív spojit tabulky firma a produkce podle atributu id firmy a tento výsledek pak spojit s tabulkou produkt podle id produktu a zadaného id firmy. Funkce zobrazFirmy($od, $do) zobrazuje firmy v žebříčku, podle parametrů v daném rozmezí, seřazené podle prosperity. Funkce spoctiPrirustek($fa_id) počítá jaké množství produktu dokáže firma za kolo vyrobit. V tomto výpočtu se zohledňují bonusy automatizace, směnný provoz a pracující zaměstnanci. Tento výsledek se upravuje v konstruktu switch řízeného pomocí id produktu a jde o modifikátor výroby (pečiva vyrobí firma za kolo mnohem víc než např. autosoučástek). Funkce poté vrací hodnotu přírůstku zaokrouhlenou dolů. Funkce spoctiPracujici($fa_id) má za úkol určit, kolik z hráčem najatých zaměstnanců pracuje. Pokud jejich počet přesahuje kapacity výrobních prostor, vrátí hodnotu kapacity všech výrobních prostor dohromady, pokud ne, vrátí hodnotu aktuálního množství najatých zaměstnanců. Funkce rozdeleniZamestnancu($fa_id) určuje automatické povyšování zaměstnanců do manažerských pozic. Podle vstupní proměnné typ (0-2) určí, jaké zaměstnance chce spočítat a vrátí počet zaměstnanců. Funkce getKapacitaSkladu($fa_id, $typ) obsahuje rozhodovací strom, který vrací kapacitu skladu podle velikosti skladu a oboru podnikání. Vnitřně je realizována dvěmi vnořenými příkazy switch. Funkce getSplatkyPujcek($fa_id) počítá celkovou splátku za všechny pořízené půjčky. Vybere si všechny půjčky dané firmy a pomocí cyklu while prochází jednotlivé řádky a počítá jednotlivé splátky, které přičítá do proměnné, kterou po skončení cyklu vrací. Ve funkci odehrajKolo($firma) se děje největší část změn, funkce přijímá jako parametr instanci objektu firmy. Kombinací napsaných funkcí vypočítá mzdy, které platíte svým zaměstnancům. S pomocí výše uvedené funkce si spočítá kolik firma vyrobí výrobků. Zjistí si také kolik musí splácet ze svých půjček. Podle těchto hodnot upraví položky v databázi vydaje a zisk. Také zkontroluje, zda maximální zkušenost zaměstnanců odpovídá jejich aktuální zkušenosti, pokud ne tak každé kolo přičítá po 5% až do maximální hodnoty. Pokud zjistí, že firma nemá dostatečné množství peněz na pokrytí svých výdajů kolo neodehraje a upozorní hráče. V dalším větvení zjišťuje, zda jsou odehraná kola beze zbytku dělitelná čtyřmi (konec měsíce). Pokud ano, pak odečte výdaje, přičte zisky a začne obsluhovat podepsané kontrakty. Pokud na to má firma dostatečné zásoby, odečte dodávku od kontraktu a přičte peníze podle 23
hodnot v daném kontraktu. Pokud na splnění závazku nemá dostatek zásob, je naúčtováno penále v hodnotě poloviny nasmlouvaného zboží. Funkce dále obsluhuje stavbu budov, tam kde se parametr stavba nerovná nule přičítá procenta do stavby a pokud zjistí, že některá z nich je již kompletní, vynuluje parametr stavba a přičte budovu. Na stránce trh má hráč možnost okamžitého obchodování za znevýhodněné ceny. Hodí se, pokud hráči docházejí suroviny nebo mu schází několik výrobků. Pokud hráč něco koupí nebo prodá, načte se cena výrobku z databáze. Typ suroviny je určen funkcí getSurFirmy($fa_id, $poradi).
OBRÁZEK 8 - TRH
6.3 OBJEKTOVÝ PŘÍSTUP Hlavní část aplikace e-game je napsána v php5 s využitím objektového přístupu. Kód hlavní třídy firma je uložen v souboru classfirma.php. Objekt firma vytváří konstruktor, který má za parametr číslo firmy. Objekt má třídní proměnné odpovídající důležitým a často používaným datům z databáze. Ke každé třídní proměnné patří jedna privátní metoda get, která načítá tuto hodnotu z databáze. Tyto metody také volá konstruktor při vytváření instance. Tyto proměnné zůstávají uložené v objektu nezměněny do té doby než je zavolána veřejná metoda refresh(), která zavolá všechny privátní metody a obnoví hodnoty proměnných tak, aby odpovídali hodnotám v databázi. Tento způsob snižuje množství přístupů do databáze, protože dokud se hodnoty nemění a hráč "překlikává" mezi odkazy aplikace nemusí přistupovat do databáze, aby znovu zobrazila stejné hodnoty, pouze pokud se hodnoty změní, zavolá se metoda refresh() a hodnoty v instanci se aktualizují. Aplikace dále obsahuje řadu funkcí a procedur, které většinou získávají data z databáze, nebo provádí jednoduché výpočty.
24
K APITOLA 7
7. TESTOVÁNÍ Na větší testování aplikace nezbylo příliš času, proto zde uvádím systém testů, který aplikaci v php dokáže otestovat. Těmito způsoby budu aplikaci v průběhu následného vývoje testovat. Základními způsoby testování jsou funkcionální testování a unit testování.
7.1. FUNKCIONÁLNÍ TESTOVÁNÍ Funkcionální testování je způsob testování aplikace z pohledu uživatele. Uživatel se naloguje do hry, může někomu poslat zprávu atd. Tento způsob testování rozdělí aplikaci do několika scénářů, které může uživatel provádět. Každý scénář může mít podscénáře, které mají vlastní testovací postup. Na takový způsob testování se používá program Selenium, který je vytvořen formou Firefox doplňku. Selenium umožňuje zapamatovat si scénáře uživatelského použití a poté automaticky tyto scénáře spouštět a tím aplikaci otestovat. Vstup HTML elementu se nastavuje použitím XPath výrazu nad dokumentem. Databáze MySQL je v tuto chvíli nastavená na obsluhu do 50 současně připojených uživatelů, což pro naše účely stačí. V první fázi jsme testovali integritní omezení. Je důležité, aby se uživatelé nemohli dostat do nepovolených hodnot. Omezení jsou oznámeny javascriptovým příkazem alert do jehož popisu vkládám zprávu o chybě. Pokud vyskočí alert stav aplikace se vrací a nejsou provedeny žádné změny. Pokud hráč dosáhne na všechna omezení nastaví se indikátor bankrotu na 1 a systém už nedovolí žádné akce.
7.2. UNIT TESTING Unit testing je způsob testování, kdy se program rozdělí na samostatně testovatelné a fungující části (units), které v rámci programu mohou být různé velikosti. Od velkých modulů, přes třídy, metody, funkce a procedury. Na unit testing php se používá program PHPUnit který poskytuje nástroje pro testování. Program obsahuje assertion methods (hodnotící metody), které automaticky testují hodnoty a hlásí nesrovnalosti. TestResult (výsledky testů) pak řídí testy a shromažďuje výsledky. Jednotlivé testy se dělí do TestCase (testovací případ) ty se skládají do TestSuite (testovací balíček), který pak lze nad aplikací spustit.
7.3. VÝKON Výkonově je aplikace rychlá díky mojí optimalizaci přes objektový přístup. Vzhledem k rozsahu práce a prozatím malému množství testerů, jsem bohužel z důvodu nedostatku času nestihl udělat výkonnostní test. Při běžném použití je každá akce téměř okamžitá a skripty nikdy nepřesáhly maximální dobu pro zpracování.
25
26
K APITOLA 8
8. ROZŠIŘITELNOST E-game je hratelný v aktuální formě, přesto máme množství nápadů na budoucí rozšíření.
8.1. ZVÝŠENÍ INTERAKCE MEZI FIRMAMI Přidání možnosti obchodování mezi firmami, uzavírání dlouhodobějších smluv i jednorázových nákupů, vytváření partnerství mezi firmami, které by za zvýhodněných podmínek spolu obchodovali, přidání vylepšení pro spolupráci firem, případně ve větším měřítku vytváření korporací čítajících více firem navzájem spolupracujících -> osamostatnění veškeré zdroje dostupné uvnitř korporace.
8.2. PŘIDÁNÍ DALŠÍCH OBCHODNÍCH ODVĚTVÍ Například firem obchodujících ve sféře služeb a finančnictví a dalších firem -snižování celkové abstrakce aplikace. Firmy poskytující služby závislé pouze na zaměstnancích, firmy obchodující s penězi - možnosti investic do firem jiných hráčů nebo na základě levného nákupu a dražšího prodeje.
8.3. ROZDĚLENÍ TYPŮ FIREM PODLE JEJICH VELIKOSTI Možnost při zvětšování vlastní firmy, změnit typ na vyšší - začátek firma v osobním vlastnictví -> obchodní společnosti (veřejná obchodní společnost, komanditní společnost, společnost s ručením omezeným)-> akciová společnost . U a.s. možnost prodat část svojí firmy pomocí akcií.
27
28
K APITOLA 9
9. ZÁVĚR E-game i přes svou rozsáhlost rozšiřitelnost splnil moje očekávání. Všechny prvky obsažené v práci kolegy Daniela Hrazdila byly implementovány a fungují. Aby hra měla úspěch, musí se o ní lidé dovědět, takže, v co nejkratším čase po bakalářské práci provedu SEO (Search Engine Optimisation). Poté už jen čas a následná práce na projektu ukáže, zda může být úspěšný, já v to pevně věřím.
29
;SEZNAM POUŽITÉ LITERATURY CITACE [1] marketix.cz - hlavní rysy hry http://marketix.cz/rysy.php , 2005 - 2009
ZDROJE [2] Daniel Hrazdil - Bakalářská práce - Ekonomický model firmy [3] webgame.cz - www.webgame.cz - Online hra [4] php.net - php.net/manual/en - Manuál k php5 [5] Sebastian Bergmann - PHPUnit - An Introduction to Unit Testing PHP Applications
30
SEZNAM OBRÁZKŮ A GRAFŮ Obrázek 1- datový model egame .............................................................................................................................. 17 Obrázek 2 - tabulka zaplněnosti trhu ..................................................................................................................... 19 Obrázek 3 - vylepšení .................................................................................................................................................... 20 Obrázek 4 - výroba ......................................................................................................................................................... 20 Obrázek 5 - graf efektu, 80*arctan(x/6)................................................................................................................ 21 Obrázek 6 - FINANCE .................................................................................................................................................... 21 Obrázek 7 - KONTRAKTY............................................................................................................................................. 22 Obrázek 8 - trh ................................................................................................................................................................. 24
31
9.1 PŘÍLOHY 9.2. MANUÁL INSTALACE Pro zprovoznění serveru na vlastním počítači budete potřebovat instalační programy pro Apache, php a MySQL, které jsou volně ke stažení. Pro nejmenší množství konfigurace je nainstalovat v pořadí Apache, PHP, MySQL. Poté buď v MySQL konzoli nebo pomocí phpmyadmina vytvořit databázi skriptem který je v příloze. Po nahrání práce do defaultního adresáře pro www Apache spustit prohlížeč na localhost. Mnohem jednodušší verzí je otevření stránky http://egame.buk.cvut.cz ve Vašem internetovém prohlížeči.
9.3. OBSAH CD Na CD naleznete všechno potřebné pro zprovoznění na lokálním počítači. Ve složce egame jsou samotné zdrojové soubory aplikace. Ve složce zdroje jsou všechny obrázky z BP a script na vytvoření potřebné databáze. V kořenovém adresáři pak najdete instalační soubory pro Apache, PHP, MySQL.
9.4. SQL SCRIPT NA VYTVOŘENÍ DATABÁZE CREATE DATABASE egame; CREATE TABLE hrac ( id INT NOT NULL AUTO_INCREMENT, fa_id INT NULL, nick VARCHAR(20) NOT NULL, email VARCHAR(50) NOT NULL, passwd VARCHAR(20) NOT NULL, icq INT, UNIQUE(nick), UNIQUE(email), PRIMARY KEY(id) ) ENGINE=INNODB; CREATE TABLE zpravy ( id INT NOT NULL AUTO_INCREMENT, adresat INT NOT NULL, obsah TExT NOT NULL, PRIMARY KEY(id) ); CREATE TABLE posta ( hr_id INT NULL, zp_id INT NULL ); CREATE TABLE firma ( id INT NOT NULL AUTO_INCREMENT, hr_id INT NOT NULL, jmeno VARCHAR(30), typ INT NOT NULL, pocet_zam INT NOT NULL, penize INT NOT NULL, zasoby INT, zisk INT NOT NULL,
32
vydaje INT NOT NULL, CF INT NOT NULL, trzby INT NOT NULL, EBT INT NOT NULL, ROS INT NOT NULL, EVA INT NOT NULL, likvidita INT NOT NULL, dost_kola INT, DE INT NOT NULL, UNIQUE(jmeno), PRIMARY KEY(id) ); CREATE TABLE produkt ( id INT NOT NULL AUTO_INCREMENT, typ VARCHAR(20) NOT NULL, PRIMARY KEY(id) ); CREATE TABLE produkce ( pr_id INT NOT NULL, fa_id INT NOT NULL, kvalita INT NOT NULL ); CREATE TABLE vylepseni ( id INT NOT NULL AUTO_INCREMENT, typ VARCHAR(20) NOT NULL, PRIMARY KEY(id) ); CREATE TABLE poridi ( fa_id INT NULL, vyl_id INT NULL, uroven INT NOT NULL ); CREATE TABLE zakony ( id INT NOT NULL AUTO_INCREMENT, nazev VARCHAR(30) NOT NULL, hodnota INT NOT NULL, PRIMARY KEY(id) ); CREATE TABLE pujcka ( id INT NOT NULL AUTO_INCREMENT, urok FLOAT NOT NULL, castka INT NOT NULL, doba INT NOT NULL, nakladove_uroky FLOAT NOT NULL, PRIMARY KEY(id) ); CREATE TABLE vlastni_kap ( fa_id INT NOT NULL, vyse INT NOT NULL ); CREATE TABLE naklady ( fa_id INT NOT NULL, plat1zam INT NOT NULL, prostory INT NOT NULL, suroviny INT NOT NULL, doprava INT NOT NULL, energie INT NOT NULL ); ALTER TABLE hrac ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id) ); ALTER TABLE posta ADD ( FOREIGN KEY (hr_id) REFERENCES hrac(id), FOREIGN KEY (zp_id) REFERENCES zpravy(id) ); ALTER TABLE firma ADD (
33
FOREIGN KEY (hr_id) REFERENCES hrac(id) ); ALTER TABLE produkce ADD ( FOREIGN KEY (pr_id) REFERENCES produkt(id), FOREIGN KEY (fa_id) REFERENCES firma(id) ); ALTER TABLE poridi ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id), FOREIGN KEY (vyl_id) REFERENCES vylepseni(id) ); ALTER TABLE zamestnava ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id), FOREIGN KEY (zam_id) REFERENCES zamestnanec(id) ); ALTER TABLE prodava ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id), FOREIGN KEY (pol_id) REFERENCES polozka(id) ); ALTER TABLE obsahuje ADD ( FOREIGN KEY (pol_id) REFERENCES polozka(id), FOREIGN KEY (trh_id) REFERENCES trh(id) ); ALTER TABLE financovani ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id), FOREIGN KEY (puj_id) REFERENCES pujcka(id) ); ALTER TABLE vlastni_kap ADD ( FOREIGN KEY(fa_id) REFERENCES firma(id) ); ALTER TABLE naklady ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id) ); ALTER TABLE vynosy ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id) ); ALTER TABLE vyse_dane ADD ( FOREIGN KEY (fa_id) REFERENCES firma(id), FOREIGN KEY (dan_id) REFERENCES dane(id) ); ALTER TABLE zpravy ADD precteno INT NOT NULL DEFAULT 0; ALTER TABLE zpravy ADD odesilatel int not null; ALTER TABLE zpravy ADD ts timestamp not null; ALTER TABLE vylepseni ADD podtyp varchar(40); ALTER TABLE poridi ADD bonus INT NOT NULL DEFAULT 0; ALTER TABLE naklady ADD sklady INT NOT NULL DEFAULT 0; ALTER TABLE pujcka ADD fa_id INT NOT NULL; ALTER TABLE vynosy ADD(FOREIGN KEY (fa_id) REFERENCES firma(id)); CREATE TABLE budovy ( id INT NOT NULL AUTO_INCREMENT, fa_id INT NOT NULL, typ SMALLINT NOT NULL, pocet INT NOT NULL DEFAULT 0, PRIMARY KEY(id) ); CREATE TABLE kontrakty ( id INT NOT NULL AUTO_INCREMENT, fa_id INT DEFAULT 0, delka INT NOT NULL, dodavka INT NOT NULL, vyrobek TINYINT NOT NULL, logistika TINYINT NOT NULL, cena INT NOT NULL, PRIMARY KEY(id) ); ALTER TABLE firma ADD (odehrano INT NOT NULL DEFAULT 0);
34
ALTER TABLE firma ADD prosperita FLOAT NOT NULL DEFAULT 0; ALTER TABLE budovy ADD stavba INT NOT NULL DEFAULT 0; ALTER TABLE kontrakty ADD typ SMALLINT NOT NULL DEFAULT 0; CREATE TABLE suroviny ( fa_id INT NOT NULL, mnozstvi INT NOT NULL DEFAULT 0, typ SMALLINT); ALTER TABLE suroviny ADD (FOREIGN KEY (fa_id) REFERENCES firma(id)); CREATE TABLE ceny (sur_id INT NOT NULL, cena INT NOT NULL);
INSERT INTO vylepseni INSERT INTO vylepseni managementu'); INSERT INTO vylepseni managementu'); INSERT INTO vylepseni INSERT INTO vylepseni INSERT INTO vylepseni INSERT INTO vylepseni INSERT INTO vylepseni INSERT INTO vylepseni INSERT INTO vylepseni skladu');
(id, typ, podtyp) VALUES (2, 'Skoleni', 'Delniku'); (id, typ, podtyp) VALUES (3, 'Skoleni', 'Nizsiho (id, typ, podtyp) VALUES (4, 'Skoleni', 'Vyssiho (id, (id, (id, (id, (id, (id, (id,
(id, (id, (id, (id, (id, (id, (id,
typ, typ, typ, typ, typ, typ, typ,
typ) typ) typ) typ) typ) typ) typ)
podtyp) podtyp) podtyp) podtyp) podtyp) podtyp) podtyp)
VALUES VALUES VALUES VALUES VALUES VALUES VALUES
VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1, (2, (3, (4, (5, (6, (7,
(5, 'Logistika', 'Doprava'); (6, 'Logistika', 'Sklady'); (7, 'Smeny', ''); (8, 'Vyroba', 'Prostory'); (9, 'Skoleni', 'E-learning'); (10, 'Vyroba', 'Automatizace'); (11, 'Logistika', 'Velikost
INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO
produkt produkt produkt produkt produkt produkt produkt
'pecivo'); 'Mlecne vyrobky'); 'Masne vyrobky'); 'Cihly'); 'Stresni krytiny'); 'Ocelove konstrukce'); 'Naradi');
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
ceny (sur_id, cena) VALUES (0, 5); ceny (sur_id, cena) VALUES (1, 15); ceny (sur_id, cena) VALUES (2, 20); ceny (sur_id, cena) VALUES (3, 5); ceny (sur_id, cena) VALUES (4, 25); ceny (sur_id, cena) VALUES (5, 15); ceny (sur_id, cena) VALUES (6, 5); ceny (sur_id, cena) VALUES (7, 10); ceny (sur_id, cena) VALUES (8, 25); ceny (sur_id, cena) VALUES (9, 30); ceny (sur_id, cena) VALUES (10, 20); ceny (sur_id, cena) VALUES (11, 50); produkt (id, typ) VALUES (8, 'Autosoucastky'); produkt (id, typ) VALUES (9, 'Kuchynske nacini');
ALTER TABLE firma ADD (akt_xp INT NOT NULL DEFAULT 100); ALTER TABLE firma ADD bankrot SMALLINT DEFAULT 0; ALTER TABLE suroviny ADD cena_nakup INT NOT NULL; ALTER TABLE suroviny ADD cena_prodej INT NOT NULL;
35