Olá amigos!
Implementei a classe DescontoPorVendaCasada, mas na hora do teste ela não funciona. Já tentei descobrir onde está o erro, mas ainda não consegui. Poderiam me ajudar?
Segue meu código:
class DescontoPorVendaCasada implements Desconto {
private $proximoDesconto;
public function desconto(Orcamento $orcamento) {
if ($this->aconteceuVendaCasadaEm($orcamento)) {
return $orcamento->getValor() * 0.05;
} else {
return $this->proximoDesconto->desconto($orcamento);
}
}
private function aconteceuVendaCasadaEm(Orcamento $orcamento) {
return $this->existe("caneta", $orcamento) && $this->existe("lapis", $orcamento);
}
private function existe($nomeDoItem, Orcamento $orcamento) {
foreach ($orcamento->getItens() as $item) {
if ($item->getNome() == $nomeDoItem) {
return true;
}
return false;
}
}
public function setProximo(Desconto $desconto) {
$this->proximoDesconto = $desconto;
}
}
require_once "Desconto.php";
require_once "Desconto500Reais.php";
require_once "Desconto5Itens.php";
require_once "DescontoPorVendaCasada.php";
require_once "SemDesconto.php";
class CalculadorDeDescontos {
public function calcula(Orcamento $orcamento) {
$d1 = new Desconto5Itens();
$d2 = new Desconto500Reais();
$d3 = new DescontoPorVendaCasada();
$dfim = new SemDesconto();
$d1->setProximo($d2);
$d2->setProximo($d3);
$d3->setProximo($dfim);
$valorDoDesconto = $d1->desconto($orcamento);
return $valorDoDesconto;
}
}
require_once "Orcamento.php";
require_once "Item.php";
require_once "CalculadorDeDescontos.php";
$orcamento = new Orcamento(300);
$item1 = new Item('sapato', 100);
$item2 = new Item('bone', 50);
$item3 = new Item('bermuda', 50);
$item4 = new Item('caneta', 50);
$item5 = new Item('lapis', 50);
//$item6 = new Item('caderno', 10);
$orcamento->addItem($item1);
$orcamento->addItem($item2);
$orcamento->addItem($item3);
$orcamento->addItem($item4);
$orcamento->addItem($item5);
//$orcamento->addItem($item6);
$calculadora = new CalculadorDeDescontos();
echo "Valor: " . $orcamento->getValor() . "<br />";
echo "Desconto: R$ " . $calculadora->calcula($orcamento);
interface Desconto {
public function desconto(Orcamento $orcamento);
public function setProximo(Desconto $desconto);
}
class Orcamento {
private $valor;
private $itens;
function __construct($novoValor) {
$this->valor = $novoValor;
$this->itens = array();
}
public function getValor() {
return $this->valor;
}
public function getItens() {
return $this->itens;
}
public function addItem(Item $item) {
$this->itens[] = $item;
}
}
class Item {
private $nome;
private $valor;
public function __construct($nome, $valor) {
$this->nome = $nome;
$this->valor = $valor;
}
public function getNome() {
return $this->nome;
}
public function getValor() {
return $this->valor;
}
}