Umístění funkce pro výpočet sazby DPH

Rodney
Člen | 7
+
0
-

Zdravím,

prosím o radu správného umístění funkce pro výpočet sazby a zaokrouhlení, pokud se bude jednat o platbu v hotovosti.

Jelikož chci mít přehled o zaokrouhlení před vytvořením objednávky jak v košíku, tak i v jejím přehledu (Sledování stavu.). Tak bych rád věděl, kde by bylo ideální dle Vás ji umístit abych mohl aplikovat jak, dejme tomu v CartPresenter či OrderPresenter.

  1. Hlavní model
  2. Base presenter
  3. Statická třída ⇒ ‚Helper‘? Ideální řešení?

?

Děkuji.

David Matějka
Moderator | 6445
+
+4
-

Tohle je vec modelove vrstvy aplikace.

  • base presenter neni vhodny – neni to prezentacni vec, ale business vec. muzes to chtit treba propisovat do api atd.
  • staticky helpery nejsou vhodne – nejsou konfigurovatelne apod.
Rodney
Člen | 7
+
0
-

David Matějka napsal(a):

Tohle je vec modelove vrstvy aplikace.

  • base presenter neni vhodny – neni to prezentacni vec, ale business vec. muzes to chtit treba propisovat do api atd.
  • staticky helpery nejsou vhodne – nejsou konfigurovatelne apod.

Ahoj,

děkuji ti za reakci.

Takže je správné použití například, že dostanu data itemů/produktů do presenteru, zpracuji do pole pro onu metodu, která je vlastně podědená z ‚hlavního‘ modelu?

V praxi myšleno asi takto:

$this->orderItems = $this->orderItemManager->getOrderItems($order->id);
// Nějaká magie ..
$calculatedPrices = $this->orderItemManager->calVat($prices);  // Chtěl bych použít i v modelu pro itemy košíku, například.

?

Šaman
Člen | 2634
+
+1
-

Daň bude počítat nějaká třída (resp. funkce ve třídě). Každé místo, kde budeš chtít počítat daň si onu třídu musí injectovat a použít onu funkci.
V vše by mělo být v modelech. Presentery by měly ideálně sloužit jen jako prostředník mezi modelem a šablonami. Samy nic počitat nemají, jejich práce je zpracovat požadavek – request, načíst z modelu data a předat je správné šabloně a výsledek vrátit jako response.

Rodney
Člen | 7
+
0
-

Šaman napsal(a):

Daň bude počítat nějaká třída (resp. funkce ve třídě). Každé místo, kde budeš chtít počítat daň si onu třídu musí injectovat a použít onu funkci.
V vše by mělo být v modelech. Presentery by měly ideálně sloužit jen jako prostředník mezi modelem a šablonami. Samy nic počitat nemají, jejich práce je zpracovat požadavek – request, načíst z modelu data a předat je správné šabloně a výsledek vrátit jako response.

Ahoj,

takže z mého příkladu je špatně to, že chci po presenteru aby oné metodě dal data, které má zpracovat když jsem je získal z totožného modelu?

Resp. chápu správně, že ten výpočet by se měl již stát v getOrderItems(), který metodu calVat() získá například od svého rodiče?

Editoval Rodney (5. 2. 2020 17:40)

CZechBoY
Člen | 3608
+
0
-

Jo, getOrderOtems by uz melo vratit ceny s dph. Pripadne si muzes udelat latte filtr na pocitani ceny s dph.

Rodney
Člen | 7
+
0
-

CZechBoY napsal(a):

Jo, getOrderOtems by uz melo vratit ceny s dph. Pripadne si muzes udelat latte filtr na pocitani ceny s dph.

Ahoj,

určitě by to šlo řešit i filtrem, ale bohužel jelikož to chci propisovat i do emailu s informací o vytvoření objednávky, tak to musím vyřešit ještě v tý modelový části.

U většiny metod modelů se snažím docílit toho, abych jako návratový typ dostával Nette\Database\Table\Selection pro pozdější používání například při stránkování či pro využití jiných výhod.

Takže myslíš, že je v pořádku když mi getOrderItems() bude vracet například takové pole:

[
  'items' => Nette\Database\Table\Selection,  // Položky/Produkty objednávky.
  'calculated_prices' => [
    ..  // Návratová hodnota z **calVat()**.
  ],
]

Ještě třeba napadá tam uvést rovnou počet itemů, apod..

Kakaku
Člen | 27
+
+1
-

Obecně se snažím nepojmenovávat třídy obecnými jmény, jako PriceManager, OrderManager atp.

Hrozně to svádí k porušení principu single-responsibility. Zaokrouhlení a počítání ceny jsou dvě různé věci. Udělal bych si třídu PriceCalculator, která by mi počítala cenu a PriceRounder, která by mi cenu zaokrouhlovala.

Nevím, co přesně má být vstup, ale ideálně něco na způsob:
PriceCalculator:countPriceByOrderItemsList(OrderItemsList $orderItemsList): int

V konstruktoru třídy PriceCalculator si přes DI předáš PriceRounder, který ti tu cenu zaokrouhlí.
No a nebo si uděláš třídu Price která to roundování bude mít přímo na sobě

Kamil Valenta
Člen | 758
+
+1
-

Rodney napsal(a):

U většiny metod modelů se snažím docílit toho, abych jako návratový typ dostával Nette\Database\Table\Selection pro pozdější používání například při stránkování či pro využití jiných výhod.

Můžeš si DPH spočítat na úrovni DB a mít v Selectioně obě ceny, jak bez, tak i s DPH…

Rodney
Člen | 7
+
0
-

kamil_v napsal(a):

Rodney napsal(a):

U většiny metod modelů se snažím docílit toho, abych jako návratový typ dostával Nette\Database\Table\Selection pro pozdější používání například při stránkování či pro využití jiných výhod.

Můžeš si DPH spočítat na úrovni DB a mít v Selectioně obě ceny, jak bez, tak i s DPH…

Ahoj,

ano to je pravda a tak to vlastně ve skutečnosti mám.

DPH, které počítám je ze zaokrouhlení.

Omlouvám se, možná jsem se v dřívějších příspěvcích špatně vyjádřil a vyznělo to jako, že to dopočítávám extra mimo.. :/

Rodney
Člen | 7
+
0
-

Kakaku napsal(a):

Obecně se snažím nepojmenovávat třídy obecnými jmény, jako PriceManager, OrderManager atp.

Hrozně to svádí k porušení principu single-responsibility. Zaokrouhlení a počítání ceny jsou dvě různé věci. Udělal bych si třídu PriceCalculator, která by mi počítala cenu a PriceRounder, která by mi cenu zaokrouhlovala.

Nevím, co přesně má být vstup, ale ideálně něco na způsob:
PriceCalculator:countPriceByOrderItemsList(OrderItemsList $orderItemsList): int

V konstruktoru třídy PriceCalculator si přes DI předáš PriceRounder, který ti tu cenu zaokrouhlí.
No a nebo si uděláš třídu Price která to roundování bude mít přímo na sobě

Ahoj,

a je tedy správné to použít tak, jak jsem uvedl v příspěvku nad tebou?

Editoval Rodney (6. 2. 2020 14:33)

Rodney
Člen | 7
+
0
-

Ještě si projíždím historii fóra a je také možné, že by se na toto mohla použít třída *Service, která by vlastně dostala data z *Repository a předala jej presenteru?

Pochopil jsem z logiky této věci správně tedy, že:

ProductRepository obstará data pro ProductService, který je připraví pro presenter?

Editoval Rodney (6. 2. 2020 15:00)