2
respostas

Como utilizar o ID do usuário logado para finalizar o pedido 2

Tenho a mesma dúvida. Seguem os códigos

@Entity
public class Compra {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne(cascade = CascadeType.PERSIST)
    private Usuario usuario;

    private String itens;

    private String uuid;

    private BigDecimal total;

    @PrePersist
    public void createUUID() {
        this.uuid = UUID.randomUUID().toString();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getItens() {
        return itens;
    }

    public void setItens(String itens) {
        this.itens = itens;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }
}
@Model
public class CheckoutBean {

    private Usuario usuario = new Usuario();

    @Inject
    private CarrinhoCompras carrinho;

    @Inject
    private FacesContext facesContext;

    @Transactional
    public void finalizar() {
        Compra compra = new Compra();
        compra.setUsuario(usuario);
        carrinho.finalizar(compra);

        String contextName = facesContext.getExternalContext().getRequestContextPath();
        HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
        response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
        response.setHeader("Location", contextName + "/services/pagamento?uuid=" + compra.getUuid());

    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

}
@Named
@SessionScoped
public class CarrinhoCompras implements Serializable {

    private static final long serialVersionUID = 1L;

    private Set<CarrinhoItem> itens = 
            new HashSet<>();

    @Inject
    private CompraDao compraDao;

    public void add(CarrinhoItem item) {
        itens.add(item);
    }

    public List<CarrinhoItem> getItens() {
        return new ArrayList<CarrinhoItem>(itens);
    }

    public BigDecimal getTotal(CarrinhoItem item) {
        return item.getLivro().getPreco().multiply(new BigDecimal(item.getQuantidade()));
    }

    public BigDecimal  getTotal() {
        BigDecimal total = BigDecimal.ZERO;
        for (CarrinhoItem carrinhoItem : itens) {
            total = total.add(carrinhoItem.getLivro().getPreco()
                    .multiply(new BigDecimal(carrinhoItem.getQuantidade())));
        }

        return total;
    }

    public Integer getQuantidadeTotal() {
        return itens.stream().mapToInt(item -> item.getQuantidade()).sum();
    }

    public void remover(CarrinhoItem item) {
        this.itens.remove(item);        
    }

    public void finalizar(Compra compra) {
        compra.setItens(toJson());
        compra.setTotal(getTotal());
        compraDao.salvar(compra);


//        String resultado = pagamentoGateway.pagar(getTotal());
//        System.out.println(resultado);
    }


    public String toJson() {
        JsonArrayBuilder builder = Json.createArrayBuilder();
        for (CarrinhoItem item : itens) {
            builder.add(Json.createObjectBuilder()
                    .add("titulo", item.getLivro().getTitulo())
                    .add("preco", item.getLivro().getPreco())
                    .add("quantidade", item.getQuantidade())
                    .add("total", getTotal(item)));
        }
        //return builder.build().toString();
        String json = builder.build().toString();
        System.out.println(json);

        return json;
    }

}

Estou com a mesma dúvida porque a resposta anterior foi só pra postar o frontend. No aguardo.

2 respostas

Complementando...

No carrinho.xhtml eu coloquei:

                        <tr>
                            <th></th>
                            <th class="formularioDoCarrinho-cabecalho-item">Item</th>
                            <th
                                class="formularioDoCarrinho-cabecalho-item formularioDoCarrinho-cabecalho-preco">Preço</th>
                            <th class="formularioDoCarrinho-cabecalho-item">Qtd</th>
                            <th class="formularioDoCarrinho-cabecalho-item">Total</th>
                            <th class="formularioDoCarrinho-cabecalho-item">UserId</th>
                            <th></th>
                        </tr>

...

                        <ui:repeat value="#{carrinhoComprasBean.itens}" var="carrinhoItem"
                            varStatus="loop">
                            <tr>
                                <td class="formularioDoCarrinho-item"><a
                                    href="#{request.contextPath}/livro-detalhe.xhtml?id=#{carrinhoItem.livro.id}">
                                        <img class="formularioDoCarrinho-item-imagem"
                                        src="#{request.contextPath}/file/#{carrinhoItem.livro.capaPath}" />
                                </a></td>
                                <td class="formularioDoCarrinho-item">
                                    <h2 class="formularioDoCarrinho-item-titulo">#{carrinhoItem.livro.titulo}</h2>
                                </td>
                                <td
                                    class="formularioDoCarrinho-item formularioDoCarrinho-item-preco">R$
                                    #{carrinhoItem.livro.preco}</td>
                                <td class="formularioDoCarrinho-item"><input
                                    class="formularioDoCarrinho-item-quantidade" type="number"
                                    min="0"
                                    jsf:value="#{carrinhoCompras.itens[loop.index].quantidade}" />
                                </td>
                                <td
                                    class="formularioDoCarrinho-item formularioDoCarrinho-item-precoTotal"
                                    title="Preço unitário: R$ #{carrinhoItem.livro.preco}">
                                    #{carrinhoCompras.getTotal(carrinhoItem)}</td>


                                <td
                                    class="formularioDoCarrinho-item formularioDoCarrinho-item-precoTotal"
                                    title="ID:  #{currentUser.get().id}">
                                    #{currentUser.get().id}</td>


                                <td class="formularioDoCarrinho-item"><a
                                    jsf:action="#{carrinhoComprasBean.remover(carrinhoItem)}">
                                        <img class="formularioDoCarrinho-item-remover-imagem"
                                        src="#{request.contextPath}/resources/imagens/trash.png"
                                        alt="X" title="Remover" />
                                </a></td>
                            </tr>
                        </ui:repeat>

No CheckoutBean eu tenho:

@Model
public class CheckoutBean {

    private Usuario usuario = new Usuario();

    private SystemUser systemUser = new SystemUser();


    @Inject
    private CarrinhoCompras carrinho;

    @Inject
    private FacesContext facesContext;

    @Transactional
    public void finalizar() {
        Compra compra = new Compra();
        compra.setUsuario(usuario);
        compra.getSystemUser();
        carrinho.finalizar(compra);

        String contextName = facesContext.getExternalContext().getRequestContextPath();
        HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
        response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
        response.setHeader("Location", contextName + "/services/pagamento?uuid=" + compra.getUuid());

    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public SystemUser getSystemUser() {
        return systemUser;
    }

    public void setSystemUser(SystemUser systemUser) {
        this.systemUser = systemUser;
    }


Na tela do carrinho eu consigo visualizar o Id do usuário logado, porém, o Id não é persistido no banco.

O post foi fechado por inatividade. Para continuar o assunto, recomendamos criar um novo tópico. Bons Estudos!