/**
   * Adiciona um novo produto ao carrinho.
   *
   * @param code é uma {@link String} que representa o código do produto.
   * @param description é uma {@link String} que representa a descrição do produto.
   * @param price é um {@link Double} com o preço do produto.
   * @param weight é um {@link Double} com o peso do produto.
   * @param quantity é um {@link Integer} com a quantidade comprada pelo cliente.
   * @return A instância de {@link Product} que foi adicionada ao carrinho.
   */
  public Product addProduct(
      String code, String description, Double price, Double weight, Integer quantity) {

    final Product product = addProduct(code, description, price, weight);
    product.setQuantity(quantity);

    return product;
  }
  /**
   * Adiciona um novo produto ao carrinho.
   *
   * @param code é uma {@link String} que representa o código do produto.
   * @param description é uma {@link String} que representa a descrição do produto.
   * @param price é um {@link Double} o preço do produto.
   * @param weight é um {@link Double} o peso do produto.
   * @return A instância de {@link Product} que foi adicionada ao carrinho.
   */
  public Product addProduct(String code, String description, Double price, Double weight) {

    final Product product = new Product();

    product.setCode(code);
    product.setDescription(description);
    product.setPrice(price);
    product.setWeight(weight);

    addProduct(product);

    return product;
  }
  /**
   * Adiciona um novo produto ao carrinho.
   *
   * @param code é uma {@link String} que representa o código do produto.
   * @param description é uma {@link String} que representa a descrição do produto.
   * @param price é um {@link Double} com o preço do produto.
   * @param weight é um {@link Double} com o peso do produto.
   * @param quantity é um {@link Integer} com a quantidade comprada pelo cliente.
   * @param shipping é um {@link Double} com o preço do frete do produto.
   * @return A instância de {@link Product} que foi adicionada ao carrinho.
   */
  public Product addProduct(
      String code,
      String description,
      Double price,
      Double weight,
      Integer quantity,
      Double shipping) {

    final Product product = addProduct(code, description, price, weight, quantity);

    product.setShipping(shipping);

    return product;
  }
  /**
   * Esse método recupera o objeto {@link Transaction} e já geraComissao os valores do carrinho.
   *
   * @return A instância de {@link Transaction}
   */
  public Transaction getTransaction() {
    Double discountAmount = 0.0;
    Double weight = 0.0;
    Double shippingAmount = 0.0;

    for (final Iterator<Product> productIterator = getProductIterator();
        productIterator.hasNext(); ) {
      final Product product = productIterator.next();

      discountAmount += product.getDiscount();
      weight += product.getWeight();
      shippingAmount += product.getShipping();
    }

    transaction.setDiscountAmount(discountAmount);
    transaction.setWeight(weight);
    transaction.setShippingAmount(shippingAmount);

    return transaction;
  }