Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Programa para gestionar los datos de clientes de una empresa
#1
Escribir un programa que permita gestionar los datos de clientes de una empresa. Los clientes se guardarán en un diccionario en el que la clave de cada cliente será su NIF.
El valor asociado a cada cliente será otro diccionario o una lista, con los datos del cliente (apellidos y nombre, dirección, teléfono, correo electrónico, cliente habitual, fecha de la operación), donde “cliente habitual” tendrá el valor True si se trata de un cliente no esporádico. Se valorará que se realicen dos versiones: con campo de valor diccionario y lista.
El carácter de cliente habitual lo introducirá el empleado de la empresa que utilizar el programa (si/no). La fecha se introducirá entre comillas en la forma: ‘12/01/2020’.
El programa debe preguntar al usuario por una opción del siguiente menú:
(1) Añadir cliente.
(2) Eliminar cliente.
(3) Mostrar cliente.
(4) Listar todos los clientes.
(5) Listar clientes habituales.
(6) Salir.
En función de la opción elegida el programa tendrá que hacer lo siguiente:
1. Preguntar los datos del cliente, crear un diccionario (o lista) con los datos y añadirlo al contenido del campo valor del cliente.
2. Preguntar por el NIF del cliente y eliminar sus datos de la variable que contiene los datos.
3. Preguntar por el NIF del cliente y mostrar todos sus datos.
4. Mostrar lista de todos los clientes de la base datos con su NIF y nombre.
5. Mostrar la lista de clientes habituales de la base de datos con su NIF y nombre.
6. Terminar la ejecución del programa.
En su resolución se deberá programar el menú de forma que cada opción se realice implementando una función. Caso de introducir una opción fuera del rango de 1 a 6, no debe terminar el programa, sino que debe advertirlo para que se vuelva a seleccionar otro punto del menú. El programa sólo terminará cuando se seleccione la opción 6. Se comprobará que el NIF contiene 9 caracteres, los 8 primeros numéricos. A su vez, el teléfono debe contener 9 dígitos. También se puede comprobar la fecha. Estas comprobaciones no se deben gestionar mediante excepciones.

CODIGO:

Código:
from datetime import datetime
import re

listadoClientes={}
opción=''

fecha=re.compile(r'(\d{2})/(\d{2})/(\d{4})')
tel=re.compile(r'(\d{9})')
nif=re.compile(r'(\d{8})([A-Z])')

def validarEmail(email):
    """
    Devuelve False si el correo electrónico no es válido y True si lo es.
   
    :param email: La dirección de correo electrónico que desea validar
    :return: un valor booleano.
    """
 
    validar=False
    if re.match('^[(a-z0-9\_\-\.)]+@[(a-z0-9\_\-\.)]+\.[(a-z)]{2,15}$',email.lower()):
        validar=True                           
    else:
        print("El email introducido no es correcto")
    validar=False
    return validar

def emailCorrecto(email):   
    """
    Si la dirección de correo electrónico no contiene un símbolo @, imprima un mensaje y devuelva Falso. De lo contrario,
    volver verdadero
   
    :param email: La dirección de correo electrónico para validar
    :return: un valor booleano.
    """
    if '@' not in email:
        print("La direccion de email no tiene arroba")
        return False
    return True     

def validarNif():
    """
    Devuelve True si la entrada es un DNI válido, y False en caso contrario
    :return: un valor booleano.
    """
 
    tabla="TRWAGMYFPDXBNJZSQVHLCKE"
    numeros="1234567890"
   
    nif=input("Introduzca el Nif: ")
    respuesta="No ha introducido un Nif valido"
   
    if len(nif)==9:
        letraControl=nif[8].upper()   
        dni=nif[:8]
        if (len(dni) == len([n for n in dni if n in numeros])):
            if tabla[(int(dni)%23)]== letraControl:
                respuesta="El NIf introducido es correcto"
        print(respuesta)
def nifCorrecto(nif):
    """
    Si la longitud del NIF no es 9, o los 8 primeros caracteres no son dígitos, o el último carácter
    no es mayúscula, entonces el NIF no es válido
   
    :param nif: El NIF a validar
    :return: Verdadero o Falso
    """
    if len(nif)!=9:
        print("El nif debe de contener 9 caracteres")
        return False
    if not nif[0:8].isdigit():
        print("Los primeros 8 caracteres deben de ser numeros")
        return False
    if not 'A' <=nif[8]<='Z':
        print("El ultimo caracter debe de ser una letra mayuscula")
        return False
    return True
def telefonoCorrecto(telefono):
    """
    Devuelve True si el número de teléfono tiene 9 dígitos y solo contiene dígitos; de lo contrario, devuelve
    Falso
   
    :param telefono: El número de teléfono a validar
    :return: un valor booleano.
    """
    if len(telefono)!=9:
        print("El telefono debe de contener 9 caracteres")
        return False
    if not telefono.isdigit():
        print("El telefono debe de contener solo numeros")
        return False
    return True                       

def nifNoRepetido():
    """
    Pide NIF, y si ya está en el diccionario vuelve a preguntar
    :return: el valor de la variable num.
    """
   
    correcto=False
    num=0
    while(not correcto):
        try:
            num=input("Introduce un nif correcto: ")
            correcto=True
        except KeyError:
            print("Error,Nif introducido repetido.Introduzca el nif correctamente,por favor:")
    return num 

 
def fechaAltaCorrecta(fAlta):
    """
    Comprueba si la fecha está en el formato correcto y, si lo está, devuelve True, de lo contrario, devuelve
    Falso
   
    :param fAlta: La fecha que ingresa el usuario
    :return: un valor booleano.
    """
   
    if len(fAlta)!=10:
        print("La fecha debe de contener 10 caracteres")
        return False
   
    if fAlta[2]!='/' or fAlta[5]!='/':
        print("Formato incorrecto:faltan las barras") 
        return False
 
    for x in range(0,10):
        if x==2 or x==5:
            continue
        elif not fAlta[x].isdigit():
            print("La fecha debe de contener solo numeros")
            return False
   
    día=int(fAlta[0:2])
    mes=int(fAlta[3:5])
    anyo=int(fAlta[6:10])
   
    if día>31:
        print("Formato dia erroneo(>31)")
        print("El dia ha de comprender desde 1 hasta 31.Excepto Febrero que tiene 28")
        return False
   
    if mes<1 or mes >12:
        print("Formato de mes erroneo[1-12]")
        print("Introduce el mes correcto")
        return False
   
    if año > 2022 or anyo <1900:
        print("Año debe de ser 2022")
        return False
    return True

while opción !='6':
    if opcion == '1':
             
        while True:
            fecha_str=input("Introduzca la fecha de operacion 'dd/mm/aaa':")
            try:
                fecha=datetime.strptime(fecha_str,'%d/%m/%Y')
            except ValueError:
                print("No ha ingresado una fecha valida ")
            else:
                break
           
        nif=input("Introduce NIF del cliente:")   
        nombre=input("Introduce el nombre del cliente: ")
        apellidos=input("Introduce los apellidos del cliente: ")
        direccion=input("Introduce la dirección del cliente: ")
        telefono=input("Introduce el teléfono del cliente: ")
        email=input("Introduce el correo electrónico del cliente: ")
        clienteHabitual=input("¿Es un cliente habitual (S/N)?: ")
       
        lista={'Nombre':nombre,'Apellidos':apellidos,'Direccion':direccion,'Telefono':telefono,'Email':email,'Cliente Habitual':clienteHabitual=='S'}
        listadoClientes[nif]=lista
     
   
    elif opción == '2':
        nif=input("Introduce tu NIF: ")
        if nif in listadoClientes:
            del listadoClientes[nif]
        else:
            print("Ha introducido un nif incorrecto ", nif)
       
 
    elif opción =='3':
        nif=input("Introduce NIF del cliente: ")     
        if nif in listadoClientes:
            print('NIF:', nif)
            for clave,valor in listadoClientes[nif].items():
                print(clave.title() + ':', valor)
        else:
            print("No existe el Nif introducido ", nif)
   
    elif opción == '4':
        print("------Listado de clientes ------")
        for clave,valor in listadoClientes.items():
            print(clave,':',valor['Nombre'])
   
   
    elif opción=='5':
      print("---Listado de clientes habituales---")   
      for clave,valor in listadoClientes.items():
            if valor['Cliente Habitual']:
                print(clave,':',valor['Nombre'])
   
     
 
    opción=input('--------Menu--------\n(1) Añadir cliente\n(2) Eliminar cliente\n(3) Mostrar cliente\n(4) Listar todos los clientes\n(5) Listar clientes habituales\n(6) Salir\n Debe seleccionar una opcion del 1 a 6:')                     

PROBLEMA:

El código funciona pero no valida las entradas de telefono,email,dni,etc(es decir,si introduzco garabatos,no lo valida y sigue con la ejecución del programa).El proceso sigue su curso.He usado las funciones utilitarias pero no funcionan y no entiendo por que no funcionan.Espero haberme explicado correctamente.Muchas gracias  por todo.
Responder
#2
Hola, bienvenido.

Definiste las funciones de validación, pero no las llamaste en ningún momento. Deberías hacer algo como esto para cada uno de los datos solicitados:

Código:
email = input("Introduce el correo electrónico del cliente: ")
while not validarEmail(email):
    print("El mail es incorrecto. Vuelve a intentarlo.")
    email = input("Introduce el correo electrónico del cliente: ")

Por cierto, no te conviene usar acentos en los nombres de variables, ya que Python distingue entre "opción" y "opcion" (sin tilde), que es lo que está pasando en tu código.

Saludos
Responder
#3
(21-09-2022, 02:03 AM)Francisco escribió: Hola, bienvenido.

Definiste las funciones de validación, pero no las llamaste en ningún momento. Deberías hacer algo como esto para cada uno de los datos solicitados:

Código:
email = input("Introduce el correo electrónico del cliente: ")
while not validarEmail(email):
    print("El mail es incorrecto. Vuelve a intentarlo.")
    email = input("Introduce el correo electrónico del cliente: ")

Por cierto, no te conviene usar acentos en los nombres de variables, ya que Python distingue entre "opción" y "opcion" (sin tilde), que es lo que está pasando en tu código.

Saludos

hola francisco,
muchas gracias por tu ayuda,lo probare y vere si resulta o no.Estoy aprendiendo Python y soy nuevo,pero con muchas ganas de aprender.

saludos
Responder
#4
(, 03:56 PM)paco7333 escribió:
(21-09-2022, 02:03 AM)Francisco escribió: Hola, bienvenido.

Definiste las funciones de validación, pero no las llamaste en ningún momento. Deberías hacer algo como esto para cada uno de los datos solicitados:

Código:
email = input("Introduce el correo electrónico del cliente: ")
while not validarEmail(email):
    print("El mail es incorrecto. Vuelve a intentarlo.")
    email = input("Introduce el correo electrónico del cliente: ")

Por cierto, no te conviene usar acentos en los nombres de variables, ya que Python distingue entre "opción" y "opcion" (sin tilde), que es lo que está pasando en tu código.

Saludos

hola francisco,
muchas gracias por tu ayuda,lo probare y vere si resulta o no.Estoy aprendiendo Python y soy nuevo,pero con muchas ganas de aprender.

saludos
   -
He intentando combinar las 3 funciones validarnif(),nifcorrecto() y nifnorepetido() con el bucle while junto con los operadores and y or para validar las 3 funciones juntas y no termina de funcionar.
¿que es lo que falla?
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)