Zadání za bod na cvičení
Počínaje tímto cvičením budeme vytvářet aplikaci - primitivní eshop. Cílem je vytvořit datový model eshopové aplikace dle instrukcí níže.
Je důležité respektovat pravidla pro psaní kódu. Jinak nevznikne kód, který půjde dlouhodobě udržovat. V rámci cvičení respektujte alespoň následující:
- Jména tříd se zapisují camel-case a s prvním velkým písmenem (např.
ClassName). - Každá třída je uložena v samostatném souboru. Název souboru je tvořen názvem třídy a příponou
.php(např.ClassName.php). - Jména konstant jsou psána velkými písmeny, podtržítko odděluje slova (např.
MY_CONSTANT). - Názvy metod jsou psány camel-case a začínají malým písmenem (např.
myMethod()). - Pro jména vlastností je vhodné zvolit konvenci, která bude ve vašem kódu jednotně dodržována (např.
$myProperty,$my_property).
Datový model (0.75 B)
Vytvořte definice tříd reprezentující datový model aplikace (vytvořené třídy umístěte do jmenného prostoru Eshop\Model; vytvořte pro něj i samostatnou složku).
Seznam atributů je následující:
Productid(int)name(string)price(float)vatRate(int, procento z rozsahu 0 až 100)
Customerid(int)name(string)
UnregisteredCustomer: zvláštní typCustomer; navíc nemá žádné atributyRegisteredCustomer: zvláštní typCustomer; navíc má následující atributy:loyaltyPoints(int)
Orderid(int)created(Date)ordered(Date)customer(Customer)items(Product[])
Každá třída musí mít alespoň výše uvedené atributy. Pro ně musí být poskytnuty gettery/settery (použijte IDE pro jejich vytvoření). Pokud je atribut typu kolekce (nebo pole), místo setteru poskytněte metody addElement a removeElement (nahraďte slovo Element názvem odpovídajícího atributu).
Dále implementujte následující funkcionality:
- Vytvořte trait pro generování unikátního ID – včetně atributu
id, metodygetId. Tento trait použijte ve všech modelových třídách. - Vytvořte metodu
getPriceVat(), která spočítá cenu včetně daně (atributpriceobsahuje cenu bez DPH). - Implementujte metodu
UnregisteredCustomer::register(), pomocí které se může neregistrovaný zákazník stát registrovaným. Počáteční stav věrnostních bodů nastavte na vámi zvolenou hodnotu (tu uložte do konstantyRegisteredCustomer::REGISTRATION_LOYALTY_POINTS), ostatní atributy se přenesou beze změny z původní instance. - Ve třídě
Ordervytvořte metodudoOrder(), která dokončí objednávku, tj.:- nastaví datum dokončení objednávky (
ordered) a - pokud je zákazník registrovaný, zvýší počet věrnostních bodů podle vzorce celková cena objednávky vč. daně * koeficient (koeficient odpovídá konstantě
RegisteredCustomer::LOYALTY_POINTS_COEF, kterou vytvořte a nastavte na vhodnou hodnotu)
- nastaví datum dokončení objednávky (
Autoloading (0.25 B)
- Napište a zaregistrujte funkci, která zajišťuje autoloading potřebných souborů. Předpokládejte, že zdrojové soubory jsou umístěny v adresáři
srca jejich další umístění respektuje standard PSR-4.
Testy
Tato část slouží k dokázání, že zpracované řešení skutečně funguje (v budoucnu může být nahrazeno opravdovými testy). Způsob otestování je na vás, doporučit můžeme například vytvoření samostatného souboru, který bude využívat vytvořených modulů a:
- vytvoří několik instancí reprezentující produkty,
- vytvoří několik instancí reprezentující zákazníky,
- vytvoří několik objednávek zákazníků a
- struktury vypíše pomocí příkazu
print_r(), příp.var_dump()