Menu
Coddy logo textTech

Actualizar la cantidad de stock

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 48 de 68.

challenge icon

Desafío

Fácil

Mejore su sistema de gestión de inventario implementando actualizaciones de cantidad de stock con validación exhaustiva y manejo de errores. Este desafío se basa en la funcionalidad anterior y añade la capacidad de modificar las cantidades de productos existentes, evitando al mismo tiempo operaciones no válidas que podrían dar lugar a niveles de stock negativos.

Recibirá 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 las solicitudes de actualización de stock en el formato "product1:change1,product2:change2,product3:change3" donde los cambios pueden ser números enteros positivos o negativos (por ejemplo, "Mouse:10,Tablet:-5,Keyboard:-3")

Su tarea es:

  1. Utilizar 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 los 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 updateStock que reciba el mapa de inventario, el nombre del producto y el cambio de cantidad como parámetros y devuelva un error:
    • Si el producto no existe en el inventario, devolver un error con el mensaje "product not found: [product_name]"
    • Si el cambio de cantidad resultara en un stock negativo (cantidad actual + cambio < 0), devolver un error con el mensaje "insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available"
    • Si la actualización es válida, modificar la cantidad del producto en el inventario y devolver nil
  7. Analizar la segunda entrada dividiéndola por comas para obtener la lista de solicitudes de actualización de stock
  8. Para cada solicitud de actualización, dividir por dos puntos para obtener el nombre del producto y el cambio de cantidad
  9. Convertir la cadena de cambio de cantidad a int
  10. Mostrar el encabezado del proceso de actualización: "Processing Stock Updates:"
  11. Para cada solicitud de actualización, llamar a la función updateStock y mostrar los resultados:
    • Si no hay error y el cambio es positivo: "[product_name]: Added [change] units - New stock: [new_quantity]"
    • Si no hay error y el cambio es negativo: "[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]"
    • Si no hay error y el cambio es cero: "[product_name]: No change - Current stock: [current_quantity]"
    • Si hay error: "[product_name]: Update failed - [error_message]"
  12. Contar y mostrar las estadísticas de actualización:
    • "Update Summary:"
    • "Updates processed: [total_number_of_updates_processed]"
    • "Updates successful: [number_of_successful_updates]"
    • "Updates failed: [number_of_failed_updates]"
  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 actualización fallida:
    • Si hay actualizaciones fallidas: "Failed updates: [comma_separated_list_of_failed_product_names]"
    • Si no hay actualizaciones fallidas: "All stock updates were processed successfully"

Utilice 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. Formatee todos los precios a 2 decimales y el valor total del inventario a 2 decimales. Este desafío demuestra cómo modificar datos existentes de forma segura, evitando operaciones no válidas mediante una validación exhaustiva y el manejo de errores.

Pruébalo tú mismo

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func addNewItem(inventory map[string]Product, productName string, price float64, quantity int) error {
	if _, exists := inventory[productName]; exists {
		return errors.New("product already exists: " + productName)
	}
	inventory[productName] = Product{Price: price, Quantity: quantity}
	return nil
}

func main() {
	var existingInventory string
	var newProducts string
	fmt.Scanln(&existingInventory)
	fmt.Scanln(&newProducts)

	inventory := make(map[string]Product)

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

	// Parse new products to add
	newItems := strings.Split(newProducts, ",")
	
	fmt.Println("Adding New Items:")
	
	itemsProcessed := 0
	itemsAdded := 0
	itemsRejected := 0
	var rejectedProducts []string

	for _, item := range newItems {
		parts := strings.Split(item, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		
		itemsProcessed++
		
		err := addNewItem(inventory, name, price, quantity)
		if err != nil {
			fmt.Printf("%s: Failed to add - %s\n", name, err.Error())
			itemsRejected++
			rejectedProducts = append(rejectedProducts, name)
		} else {
			fmt.Printf("%s: Successfully added - $%.2f (Stock: %d)\n", name, price, quantity)
			itemsAdded++
		}
	}

	// Addition summary
	fmt.Println("Addition Summary:")
	fmt.Printf("Items processed: %d\n", itemsProcessed)
	fmt.Printf("Items added: %d\n", itemsAdded)
	fmt.Printf("Items rejected: %d\n", itemsRejected)

	// Display updated inventory in alphabetical order
	fmt.Println("Updated Inventory:")
	var productNames []string
	for name := range inventory {
		productNames = append(productNames, name)
	}
	sort.Strings(productNames)

	totalProducts := 0
	totalItems := 0
	totalValue := 0.0

	for _, name := range productNames {
		product := inventory[name]
		fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
		totalProducts++
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}

	// Final inventory statistics
	fmt.Println("Final Inventory Statistics:")
	fmt.Printf("Total Products: %d\n", totalProducts)
	fmt.Printf("Total Items in Stock: %d\n", totalItems)
	fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)

	// List rejected products
	if len(rejectedProducts) > 0 {
		fmt.Printf("Rejected products: %s\n", strings.Join(rejectedProducts, ","))
	} else {
		fmt.Println("All new products were added successfully")
	}
}

Todas las lecciones de Lógica y Flujo