Menu
Coddy logo textTech

Mettre à jour la quantité en stock

Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 48 sur 68.

challenge icon

Défi

Facile

Améliorez votre système de gestion des stocks en implémentant la mise à jour des quantités en stock avec une validation complète et une gestion des erreurs. Ce défi s’appuie sur les fonctionnalités précédentes et ajoute la possibilité de modifier les quantités de produits existants tout en empêchant les opérations invalides susceptibles d’entraîner des niveaux de stock négatifs.

Vous recevrez deux entrées :

  • Une chaîne contenant les données d’inventaire existantes au format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (par exemple : "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Une chaîne contenant les demandes de mise à jour du stock au format "product1:change1,product2:change2,product3:change3", où les changements peuvent être des entiers positifs ou négatifs (par exemple : "Mouse:10,Tablet:-5,Keyboard:-3")

Votre tâche consiste à :

  1. Utiliser la même structure Product que dans les leçons précédentes, avec les champs Price (float64) et Quantity (int)
  2. Analyser la première entrée en la séparant sur les virgules afin d’obtenir les entrées individuelles des produits existants
  3. Pour chaque entrée de produit existant, la séparer sur les deux-points afin d’obtenir le nom du produit, son prix et sa quantité
  4. Convertir la chaîne représentant le prix en float64 et celle représentant la quantité en int
  5. Créer et remplir la map inventory avec les données des produits existants
  6. Créer une fonction appelée updateStock qui prend la map d’inventaire, le nom du produit et la variation de quantité en paramètres, et qui renvoie une erreur :
    • Si le produit n’existe pas dans l’inventaire, renvoyer une erreur avec le message "product not found: [product_name]"
    • Si la variation de quantité entraîne un stock négatif (quantité actuelle + variation < 0), renvoyer une erreur avec le message "insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available"
    • Si la mise à jour est valide, modifier la quantité du produit dans l’inventaire et renvoyer nil
  7. Analyser la deuxième entrée en la séparant sur les virgules afin d’obtenir la liste des demandes de mise à jour du stock
  8. Pour chaque demande de mise à jour, la séparer sur les deux-points afin d’obtenir le nom du produit et la variation de quantité
  9. Convertir la chaîne représentant la variation de quantité en int
  10. Afficher l’en-tête du processus de mise à jour : "Processing Stock Updates:"
  11. Pour chaque demande de mise à jour, appeler la fonction updateStock et afficher les résultats :
    • En l’absence d’erreur et si la variation est positive : "[product_name]: Added [change] units - New stock: [new_quantity]"
    • En l’absence d’erreur et si la variation est négative : "[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]"
    • En l’absence d’erreur et si la variation est nulle : "[product_name]: No change - Current stock: [current_quantity]"
    • En cas d’erreur : "[product_name]: Update failed - [error_message]"
  12. Compter et afficher les statistiques des mises à jour :
    • "Update Summary:"
    • "Updates processed: [total_number_of_updates_processed]"
    • "Updates successful: [number_of_successful_updates]"
    • "Updates failed: [number_of_failed_updates]"
  13. Afficher l’inventaire mis à jour par ordre alphabétique des noms de produits :
    • "Updated Inventory:"
    • Pour chaque produit : "- [product_name]: $[price] (Stock: [quantity])"
  14. Calculer et afficher les statistiques finales de l’inventaire :
    • "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. Répertorier les mises à jour ayant échoué :
    • Si des mises à jour ont échoué : "Failed updates: [comma_separated_list_of_failed_product_names]"
    • Si aucune mise à jour n’a échoué : "All stock updates were processed successfully"

Utilisez le package strings pour séparer les chaînes d’entrée, le package strconv pour convertir les chaînes en nombres, le package errors pour créer les messages d’erreur, le package fmt pour produire une sortie formatée et le package sort pour trier les noms de produits par ordre alphabétique. Formatez tous les prix avec 2 décimales et la valeur totale de l’inventaire avec 2 décimales. Ce défi montre comment modifier des données existantes en toute sécurité tout en empêchant les opérations invalides grâce à une validation complète et à une gestion des erreurs.

Essayez vous-même

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")
	}
}

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur Go en ligne