Menu
Coddy logo textTech

Adicionando um Novo Item

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 47 de 68.

challenge icon

Desafio

Fácil

Estenda seu sistema de gerenciamento de inventário implementando a funcionalidade de adicionar novos produtos com segurança. Este desafio baseia-se no sistema de verificação de estoque anterior e adiciona a capacidade de expandir seu inventário, evitando entradas duplicadas por meio de um tratamento de erros adequado.

Você receberá duas entradas:

  • Uma string contendo os dados do inventário existente no formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (ex: "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Uma string contendo os novos produtos a serem adicionados no formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (ex: "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Sua tarefa é:

  1. Usar a mesma struct Product das lições anteriores com os campos Price (float64) e Quantity (int)
  2. Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas individuais de produtos existentes
  3. Para cada entrada de produto existente, dividir por dois pontos para obter o nome do produto, preço e quantidade
  4. Converter a string de preço para float64 e a string de quantidade para int
  5. Criar e preencher o mapa inventory com os dados dos produtos existentes
  6. Criar uma função chamada addNewItem que recebe o mapa de inventário, o nome do produto, o preço e a quantidade como parâmetros e retorna um erro:
    • Se o produto já existir no inventário, retorne um erro com a mensagem "product already exists: [product_name]"
    • Se o produto não existir, adicione-o ao inventário e retorne nil
  7. Analisar a segunda entrada dividindo-a por vírgulas para obter a lista de novos produtos a serem adicionados
  8. Para cada nova entrada de produto, dividir por dois pontos para obter o nome do produto, preço e quantidade
  9. Converter a string de preço para float64 e a string de quantidade para int
  10. Exibir o cabeçalho do processo de adição: "Adding New Items:"
  11. Para cada novo produto, chamar a função addNewItem e exibir os resultados:
    • Se não houver erro: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Se houver erro: "[product_name]: Failed to add - [error_message]"
  12. Contar e exibir as estatísticas de adição:
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  13. Exibir o inventário atualizado em ordem alfabética pelo nome do produto:
    • "Updated Inventory:"
    • Para cada produto: "- [product_name]: $[price] (Stock: [quantity])"
  14. Calcular e exibir as estatísticas finais do inventário:
    • "Final Inventory Statistics:"
    • "Total Products: [total_number_of_products_in_inventory]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
  15. Listar quaisquer produtos rejeitados:
    • Se houver produtos rejeitados: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Se não houver produtos rejeitados: "All new products were added successfully"

Use o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em números, o pacote errors para criar mensagens de erro, o pacote fmt para saída formatada e o pacote sort para ordenar os nomes dos produtos alfabeticamente. Formate todos os preços com 2 casas decimais e o valor total do inventário com 2 casas decimais. Este desafio demonstra como expandir coleções de dados com segurança, evitando entradas duplicadas por meio de tratamento de erros e validação adequados.

Experimente você mesmo

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

func main() {
	var inventoryData string
	var checkRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&checkRequests)

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		inventory[name] = Product{Price: price, Quantity: quantity}
	}

	// Parse check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

Todas as lições de Lógica & Fluxo