Menu
Coddy logo textTech

Añadir un nuevo artículo

Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 47 de 68.

challenge icon

Desafío

Fácil

Amplía tu sistema de gestión de inventario implementando una funcionalidad para añadir nuevos productos de forma segura. Este desafío se basa en el sistema anterior de comprobación de existencias y añade la posibilidad de ampliar tu inventario mientras se evitan entradas duplicadas mediante un manejo adecuado de errores.

Recibirás dos entradas:

  • Una cadena que contiene los datos del inventario existente con el formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (por ejemplo, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Una cadena que contiene los nuevos productos que se añadirán con el formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (por ejemplo, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Tu tarea consiste en:

  1. Usar la misma estructura Product de las lecciones anteriores, con los campos Price (float64) y Quantity (int)
  2. Analizar la primera entrada dividiéndola por comas para obtener las entradas individuales de los productos existentes
  3. Para cada entrada de producto existente, dividirla por dos puntos para obtener el nombre, el precio y la cantidad del producto
  4. Convertir la cadena del precio a float64 y la cadena de la cantidad a int
  5. Crear y rellenar el mapa inventory con los datos de los productos existentes
  6. Crear una función llamada addNewItem que reciba como parámetros el mapa de inventario, el nombre del producto, el precio y la cantidad, y devuelva un error:
    • Si el producto ya existe en el inventario, devolver un error con el mensaje "product already exists: [product_name]"
    • Si el producto no existe, añadirlo al inventario y devolver nil
  7. Analizar la segunda entrada dividiéndola por comas para obtener la lista de nuevos productos que se añadirán
  8. Para cada entrada de producto nuevo, dividirla por dos puntos para obtener el nombre, el precio y la cantidad del producto
  9. Convertir la cadena del precio a float64 y la cadena de la cantidad a int
  10. Mostrar el encabezado del proceso de adición: "Adding New Items:"
  11. Para cada producto nuevo, llamar a la función addNewItem y mostrar los resultados:
    • Si no hay ningún error: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Si hay un error: "[product_name]: Failed to add - [error_message]"
  12. Contar y mostrar las estadísticas de adición:
    • "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. Mostrar el inventario actualizado en orden alfabético por nombre del producto:
    • "Updated Inventory:"
    • Para cada producto: "- [product_name]: $[price] (Stock: [quantity])"
  14. Calcular y mostrar las estadísticas finales del inventario:
    • "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. Enumerar los productos rechazados:
    • Si hay productos rechazados: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Si no hay productos rechazados: "All new products were added successfully"

Usa el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a números, el paquete errors para crear mensajes de error, el paquete fmt para la salida con formato y el paquete sort para ordenar alfabéticamente los nombres de los productos. Da formato a todos los precios con 2 decimales y al valor total del inventario con 2 decimales. Este desafío demuestra cómo ampliar colecciones de datos de forma segura mientras se evitan entradas duplicadas mediante un manejo y una validación adecuados de errores.

Pruébalo tú mismo

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 las lecciones de Lógica y Flujo

Practica por tu cuenta: Compilador de Go online