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

Extiende 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 de verificación de stock anterior y añade la capacidad de ampliar tu inventario mientras se evitan entradas duplicadas mediante un manejo de errores adecuado.

Recibirás dos entradas:

  • Una cadena que contiene los datos del inventario existente en 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 a añadir en 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 es:

  1. Usar la misma estructura Product de 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 productos existentes
  3. Para cada entrada de producto existente, dividir por dos puntos para obtener el nombre del producto, el precio y la cantidad
  4. Convertir la cadena de precio a float64 y la cadena de cantidad a int
  5. Crear y poblar el mapa inventory con los datos de los productos existentes
  6. Crear una función llamada addNewItem que reciba el mapa de inventario, el nombre del producto, el precio y la cantidad como parámetros 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 a añadir
  8. Para cada nueva entrada de producto, dividir por dos puntos para obtener el nombre del producto, el precio y la cantidad
  9. Convertir la cadena de precio a float64 y la cadena de cantidad a int
  10. Mostrar el encabezado del proceso de adición: "Adding New Items:"
  11. Para cada nuevo producto, llamar a la función addNewItem y mostrar los resultados:
    • Si no hay error: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Si hay 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 de 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. Listar cualquier producto rechazado:
    • 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 formateada y el paquete sort para ordenar los nombres de los productos alfabéticamente. Formatea todos los precios a 2 decimales y el valor total del inventario a 2 decimales. Este desafío demuestra cómo expandir colecciones de datos de forma segura mientras se evitan entradas duplicadas mediante el manejo de errores y la validación adecuados.

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