Jdi na navigaci předmětu

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í:

  • Product
    • id (int)
    • name (string)
    • price (float)
    • vatRate (int, procento z rozsahu 0 až 100)
  • Customer
    • id (int)
    • name (string)
  • UnregisteredCustomer: zvláštní typ Customer; navíc nemá žádné atributy
  • RegisteredCustomer: zvláštní typ Customer; navíc má následující atributy:
    • loyaltyPoints (int)
  • Order
    • id (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:

  1. Vytvořte trait pro generování unikátního ID – včetně atributu id, metody getId. Tento trait použijte ve všech modelových třídách.
  2. Vytvořte metodu getPriceVat(), která spočítá cenu včetně daně (atribut price obsahuje cenu bez DPH).
  3. 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 konstanty RegisteredCustomer::REGISTRATION_LOYALTY_POINTS), ostatní atributy se přenesou beze změny z původní instance.
  4. Ve třídě Order vytvořte metodu doOrder(), 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)

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 src a 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()