[ Foro de Python ]

ayuda con gestionar los datos de clientes de una empresa

20-Sep-2022 21:29
paco ventura
4 Respuestas

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:
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])')# Llamamos a la función `comprobar` con los argumentos `nif`, `tel` y `fecha`.

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.


21-Sep-2022 23:03
Invitado (adolfo)

hola paco

veo raro que dentro de fechaAltaCorrecta hagas la comprobación de la opción elegida y la pides despues de comprobarla ¿¿??

suerte ;-)


24-Sep-2022 20:49
Invitado (adolfo)

hola paco

te paso una posible solución:

https://www.online-ide.com/QML9uPVfhd

saludos ;-)


25-Sep-2022 19:48
paco ventura

hola adolfo,lo pide el ejercicio,que a la hora de elegir la opción 1 ,se introduzca  las fecha de operación(fecha de alta).
gracias


28-Sep-2022 19:31
paco ventura

Hola adolfo,muchas gracias por tu ayuda

un saludo cordial,






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)