🏨 Sistema Prenotazioni Hotel con Dizionari Python

Gestisci prenotazioni, stanze e clienti con strutture dati avanzate

Introduzione

Benvenuto in questa esercitazione pratica sui dizionari Python! Costruiremo un sistema di prenotazione hotel completo che utilizza dizionari annidati, funzioni e logica intelligente per gestire stanze, clienti e prenotazioni.

Scenario Reale:
Lavorerai come sviluppatore per una catena hotel che ha bisogno di un sistema di prenotazione automatizzato. Userai dizionari per memorizzare dati complessi e funzioni per gestire le operazioni.

⚠️ ATTENZIONE: COPIA BLOCCATA

Il codice è protetto da sistema anti-copia. Dovrai SCRIVERE manualmente tutto il codice per imparare veramente! 🚫📋

Parte 1: Creazione Struttura Dati Hotel

▶ Dizionario delle Stanze

1
Crea una nuova cella su Google Colab e definisci le stanze:
PYTHON
# CREAZIONE DIZIONARIO STANZE HOTEL
stanze_hotel = {
    101: {"tipo": "Singola", "prezzo": 80, "disponibile": True, "servizi": ["TV", "WiFi"]},
    102: {"tipo": "Singola", "prezzo": 80, "disponibile": True, "servizi": ["TV", "WiFi"]},
    103: {"tipo": "Doppia", "prezzo": 120, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar"]},
    104: {"tipo": "Doppia", "prezzo": 120, "disponibile": False, "servizi": ["TV", "WiFi", "Minibar"]},
    201: {"tipo": "Suite", "prezzo": 200, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar", "Jacuzzi"]},
    202: {"tipo": "Suite", "prezzo": 200, "disponibile": True, "servizi": ["TV", "WiFi", "Minibar", "Jacuzzi"]},
    203: {"tipo": "Familiare", "prezzo": 180, "disponibile": True, "servizi": ["TV", "WiFi", "2 Letti Extra"]},
    204: {"tipo": "Familiare", "prezzo": 180, "disponibile": False, "servizi": ["TV", "WiFi", "2 Letti Extra"]}
}

print("🏨 CATALOGO STANZE HOTEL")
print("="*50)
for numero, info in stanze_hotel.items():
    stato = "✅ DISPONIBILE" if info["disponibile"] else "❌ OCCUPATA"
    print(f"Stanza {numero}: {info['tipo']} - €{info['prezzo']}/notte - {stato}")
    print(f"  Servizi: {', '.join(info['servizi'])}")
    print()

▶ Dizionario Clienti e Prenotazioni

2
Crea le strutture per clienti e prenotazioni:
PYTHON
# 2. DIZIONARI PER CLIENTI E PRENOTAZIONI
clienti = {
    1001: {"nome": "Mario Rossi", "email": "mario@email.com", "telefono": "3331234567"},
    1002: {"nome": "Laura Bianchi", "email": "laura@email.com", "telefono": "3347654321"},
    1003: {"nome": "Giuseppe Verdi", "email": "giuseppe@email.com", "telefono": "3359876543"}
}

prenotazioni = {
    5001: {"id_cliente": 1001, "stanza": 101, "notti": 3, "totale": 240},
    5002: {"id_cliente": 1002, "stanza": 103, "notti": 5, "totale": 600},
    5003: {"id_cliente": 1003, "stanza": 201, "notti": 2, "totale": 400}
}

print("\n📋 REGISTRO CLIENTI")
print("="*50)
for id_cliente, info in clienti.items():
    print(f"ID: {id_cliente} - Nome: {info['nome']}")
    print(f"  Email: {info['email']} - Tel: {info['telefono']}")
    print()

Parte 2: Funzioni per Gestione Intelligente

▶ Funzione per Cercare Stanze Disponibili

3
Crea funzioni per gestire l'hotel:
PYTHON
# 3. FUNZIONI PER GESTIONE HOTEL
def cerca_stanze_disponibili(tipo=None, prezzo_max=None):
    """
    Cerca stanze disponibili con filtri opzionali
    """
    print(f"\n🔍 CERCA STANZE DISPONIBILI" + "="*40)
    stanze_trovate = []
    
    for numero, info in stanze_hotel.items():
        if info["disponibile"]:
            # Applica filtri se specificati
            if tipo and info["tipo"] != tipo:
                continue
            if prezzo_max and info["prezzo"] > prezzo_max:
                continue
            
            stanze_trovate.append((numero, info))
    
    if stanze_trovate:
        for numero, info in stanze_trovate:
            print(f"Stanza {numero}: {info['tipo']} - €{info['prezzo']}/notte")
            print(f"  Servizi: {', '.join(info['servizi'])}")
        print(f"\n📊 Trovate {len(stanze_trovate)} stanze disponibili")
    else:
        print("❌ Nessuna stanza disponibile con i filtri selezionati")
    
    return stanze_trovate

# Test della funzione
print("Test 1 - Tutte le stanze disponibili:")
cerca_stanze_disponibili()

print("\nTest 2 - Solo Suite disponibili:")
cerca_stanze_disponibili(tipo="Suite")

print("\nTest 3 - Stanze sotto €150:")
cerca_stanze_disponibili(prezzo_max=150)

Parte 3: Sistema di Prenotazione

▶ Funzione per Prenotare una Stanza

4
Crea la funzione di prenotazione:
PYTHON
# 4. FUNZIONE PER PRENOTARE STANZA
def prenota_stanza(id_cliente, numero_stanza, notti):
    """
    Prenota una stanza per un cliente
    """
    print(f"\n📅 NUOVA PRENOTAZIONE" + "="*45)
    
    # Controlla se il cliente esiste
    if id_cliente not in clienti:
        print(f"❌ Cliente ID {id_cliente} non trovato!")
        return False
    
    # Controlla se la stanza esiste ed è disponibile
    if numero_stanza not in stanze_hotel:
        print(f"❌ Stanza {numero_stanza} non esiste!")
        return False
    
    if not stanze_hotel[numero_stanza]["disponibile"]:
        print(f"❌ Stanza {numero_stanza} non disponibile!")
        return False
    
    # Calcola totale
    prezzo_notte = stanze_hotel[numero_stanza]["prezzo"]
    totale = prezzo_notte * notti
    
    # Crea nuova prenotazione
    nuova_prenotazione_id = max(prenotazioni.keys()) + 1 if prenotazioni else 5001
    
    prenotazioni[nuova_prenotazione_id] = {
        "id_cliente": id_cliente,
        "stanza": numero_stanza,
        "notti": notti,
        "totale": totale
    }
    
    # Aggiorna stato stanza
    stanze_hotel[numero_stanza]["disponibile"] = False
    
    # Mostra conferma
    cliente = clienti[id_cliente]
    stanza = stanze_hotel[numero_stanza]
    
    print(f"✅ PRENOTAZIONE CONFERMATA!")
    print(f"   ID Prenotazione: {nuova_prenotazione_id}")
    print(f"   Cliente: {cliente['nome']}")
    print(f"   Stanza: {numero_stanza} ({stanza['tipo']})")
    print(f"   Notti: {notti}")
    print(f"   Prezzo per notte: €{prezzo_notte}")
    print(f"   TOTALE: €{totale}")
    print(f"   Servizi inclusi: {', '.join(stanza['servizi'])}")
    
    return nuova_prenotazione_id

# Test della funzione
print("Test prenotazione - Nuovo cliente nella stanza 203:")
id_nuovo_cliente = 1004
clienti[id_nuovo_cliente] = {"nome": "Anna Neri", "email": "anna@email.com", "telefono": "3361239876"}

prenota_stanza(id_nuovo_cliente, 203, 4)

▶ Funzione per Visualizzare Prenotazioni

5
Crea funzione per report prenotazioni:
PYTHON
# 5. FUNZIONE PER VISUALIZZARE PRENOTAZIONI
def visualizza_prenotazioni(filtro_cliente=None):
    """
    Visualizza tutte le prenotazioni o solo quelle di un cliente
    """
    print(f"\n📋 ELENCO PRENOTAZIONI" + "="*45)
    
    totale_incassi = 0
    prenotazioni_trovate = 0
    
    for id_pren, info in prenotazioni.items():
        if filtro_cliente and info["id_cliente"] != filtro_cliente:
            continue
        
        cliente = clienti[info["id_cliente"]]
        stanza = stanze_hotel[info["stanza"]]
        
        print(f"\nPrenotazione #{id_pren}:")
        print(f"  Cliente: {cliente['nome']} (ID: {info['id_cliente']})")
        print(f"  Stanza: {info['stanza']} ({stanza['tipo']})")
        print(f"  Notti: {info['notti']} - Totale: €{info['totale']}")
        
        totale_incassi += info["totale"]
        prenotazioni_trovate += 1
    
    if prenotazioni_trovate > 0:
        print(f"\n📊 RIEPILOGO:")
        print(f"  Prenotazioni trovate: {prenotazioni_trovate}")
        print(f"  Totale incassi: €{totale_incassi}")
    else:
        print("❌ Nessuna prenotazione trovata")

# Test delle funzioni
print("\nVisualizza tutte le prenotazioni:")
visualizza_prenotazioni()

print("\nVisualizza prenotazioni del cliente 1001:")
visualizza_prenotazioni(filtro_cliente=1001)

Parte 4: Funzioni Avanzate e Interfaccia

▶ Funzione per Check-out e Statistiche

6
Crea funzioni avanzate per gestione completa:
PYTHON
# 6. FUNZIONI AVANZATE PER GESTIONE HOTEL
def effettua_checkout(numero_stanza):
    """
    Libera una stanza dopo il checkout
    """
    if numero_stanza in stanze_hotel:
        if not stanze_hotel[numero_stanza]["disponibile"]:
            stanze_hotel[numero_stanza]["disponibile"] = True
            print(f"✅ Stanza {numero_stanza} liberata dopo checkout")
            return True
        else:
            print(f"⚠️  Stanza {numero_stanza} già disponibile")
            return False
    else:
        print(f"❌ Stanza {numero_stanza} non trovata")
        return False

def statistiche_hotel():
    """
    Mostra statistiche complete dell'hotel
    """
    print(f"\n📈 STATISTICHE HOTEL" + "="*45)
    
    # Calcola statistiche
    totale_stanze = len(stanze_hotel)
    stanze_disponibili = sum(1 for info in stanze_hotel.values() if info["disponibile"])
    stanze_occupate = totale_stanze - stanze_disponibili
    
    incasso_totale = sum(info["totale"] for info in prenotazioni.values())
    notti_totali = sum(info["notti"] for info in prenotazioni.values())
    
    # Calcola occupazione per tipo stanza
    occupazione_per_tipo = {}
    for info in stanze_hotel.values():
        tipo = info["tipo"]
        if tipo not in occupazione_per_tipo:
            occupazione_per_tipo[tipo] = {"totali": 0, "occupate": 0}
        
        occupazione_per_tipo[tipo]["totali"] += 1
        if not info["disponibile"]:
            occupazione_per_tipo[tipo]["occupate"] += 1
    
    # Mostra risultati
    print(f"Stanze totali: {totale_stanze}")
    print(f"Stanze disponibili: {stanze_disponibili} ({stanze_disponibili/totale_stanze*100:.1f}%)")
    print(f"Stanze occupate: {stanze_occupate} ({stanze_occupate/totale_stanze*100:.1f}%)")
    print(f"Prenotazioni attive: {len(prenotazioni)}")
    print(f"Notti prenotate totali: {notti_totali}")
    print(f"Incasso totale: €{incasso_totale}")
    
    print(f"\n📊 OCCUPAZIONE PER TIPO STANZA:")
    for tipo, stats in occupazione_per_tipo.items():
        perc_occupazione = (stats["occupate"] / stats["totali"] * 100) if stats["totali"] > 0 else 0
        print(f"  {tipo}: {stats['occupate']}/{stats['totali']} ({perc_occupazione:.1f}%)")

# Test delle funzioni avanzate
print("Test checkout stanza 104:")
effettua_checkout(104)

print("\nStatistiche complete hotel:")
statistiche_hotel()

Concetti di Python e Dizionari Appresi

Congratulazioni! Ora conosci:

  • Dizionari Annidati: Strutture dati complesse e organizzate
  • Funzioni Python: Creazione e utilizzo di funzioni personalizzate
  • Manipolazione Dati: Accesso e modifica di dati in dizionari complessi
  • Sistemi di Filtro: Ricerca e filtraggio di dati con criteri multipli
  • Validazione Dati: Controllo di validità e consistenza dei dati
  • Calcoli Automatici: Calcolo di totali, statistiche e metriche
  • Sistemi Reali: Applicazione di Python a scenari business reali

Prossimi Passi nella Programmazione

Nella prossima esercitazione imparerai:

  • 📈 Analisi dati avanzata con Pandas
  • 🗄️ Sistemi di database con SQLite
  • 🤖 Machine Learning per raccomandazioni
  • 🌐 API REST per sistemi distribuiti
  • 📊 Dashboard interattive con Streamlit

Hai costruito un sistema professionale di gestione hotel con Python!

Torna in alto