package br.com.casadocodigo.loja.models;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION)
public class CarrinhoCompras implements Serializable {
private static final long serialVersionUID = 1L;
private Map itens = new LinkedHashMap<>();
public Collection getItens() {
return itens.keySet();
}
public void add(CarrinhoItem carrinhoItem) {
itens.put(carrinhoItem, getQuantidade(carrinhoItem) + 1);
}
private int getQuantidade(CarrinhoItem carrinhoItem) {
if (!itens.containsKey(carrinhoItem)) {
itens.put(carrinhoItem, 0);
}
return itens.get(carrinhoItem);
}
public int getQuantidade() {
return itens.values().stream().reduce(0, (proximo, acumulador) -> proximo + acumulador);
}
public BigDecimal getTotal(CarrinhoItem item) {
return item.getTotal(getQuantidade(item));
}
public BigDecimal getTotal() {
BigDecimal total = BigDecimal.ZERO;
for (CarrinhoItem item : itens.keySet()) {
total = total.add(getTotal(item));
}
return total;
}
}
package br.com.casadocodigo.loja.models;
import java.math.BigDecimal;
public class CarrinhoItem {
private Produto produto;
private TipoPreco tipoPreco;
public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
this.produto = produto;
this.tipoPreco = tipoPreco;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public TipoPreco getTipoPreco() {
return tipoPreco;
}
public void setTipoPreco(TipoPreco tipoPreco) {
this.tipoPreco = tipoPreco;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime result + ((produto == null) ? 0 : produto.hashCode());
result = prime result + ((tipoPreco == null) ? 0 : tipoPreco.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CarrinhoItem other = (CarrinhoItem) obj;
if (produto == null) {
if (other.produto != null)
return false;
} else if (!produto.equals(other.produto))
return false;
if (tipoPreco != other.tipoPreco)
return false;
return true;
}
public BigDecimal getPreco() {
return produto.precoPara(tipoPreco);
}
public BigDecimal getTotal(int quantidade) {
return this.getPreco().multiply(new BigDecimal(quantidade));
}
}
package br.com.casadocodigo.loja.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import br.com.casadocodigo.loja.daos.ProdutoDao;
import br.com.casadocodigo.loja.models.CarrinhoCompras;
import br.com.casadocodigo.loja.models.CarrinhoItem;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;
@Controller
@RequestMapping("/carrinho")
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class CarrinhoComprasController {
@Autowired
private CarrinhoCompras carrinho;
@Autowired
private ProdutoDao dao;
@RequestMapping("/add")
public ModelAndView add(Integer produtoId, TipoPreco tipo) {
ModelAndView model = new ModelAndView("redirect:/carrinho");
CarrinhoItem carrinhoItem = criaItem(produtoId, tipo);
carrinho.add(carrinhoItem);
return model;
}
private CarrinhoItem criaItem(Integer produtoId, TipoPreco tipo) {
Produto produto = dao.find(produtoId);
CarrinhoItem carrinhoItem = new CarrinhoItem(produto, tipo);
return carrinhoItem;
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView itens() {
ModelAndView model = new ModelAndView("carrinho/itens");
return model;
}
}
Links da Casa do Código
Redes Sociais