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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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
(25-09-2022, 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
#5
Hola, ¿cuál es el código que estás usando y cuál es el error?
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#6
Hola francisco,

este es el codigo:

Código:
nif=input("Introduce NIF del cliente:")
        while not validarNif() and not nifCorrecto(nif) and not nifNoRepetido():
            print("El Nif es incorrecto.Vuelve a intentarlo.")
            email=input("Introduce el 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: ")
        while not telefonoCorrecto(telefono):
            print("El telefono es incorrecto.Vuelve a intentarlo.")
            email=input("Introduce el telefono correctamente del cliente: ")
        email=input("Introduce el correo electrónico del cliente: ")
        while not validarEmail(email) and not emailCorrecto(email):
            print("El email es incorrecto.Vuelve a intentarlo.")
            email=input("Introduce el correo electrónico del cliente: ")

y la salida que esta dando en visual studio code:
--------Menu--------
(1) Añadir cliente
(2) Eliminar cliente
(3) Mostrar cliente
(4) Listar todos los clientes
(5) Listar clientes habituales
(6) Salir
Debe seleccionar una opcion del 1 a 6:1
Introduzca la fecha de operacion 'dd/mm/aaa':27/09/2024
Introduce NIF del cliente:7777777a
Introduzca el Nif: 777A
El nif debe de contener 9 caracteres
Introduce un nif correcto: jhjhjhjhjjh
Introduce el nombre del cliente:

como podrás ver no valida correctamente las funciones de validar el nif mencionados arriba
Responder
#7
¿Para qué vuelve a solicitar el dato la función nifNoRepetido()? Ahí se pierden todas las validaciones que venías haciendo. Esa función debería recibir como argumento el dato a validar, del mismo modo que nifCorrecto().
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#8
hola francisco,estoy empezando a programar y mi intención es que todas las funciones validen los datos de entradas,para que el usuario cuando introduzca los datos,no lo haga mediante garabatos y salga un error de mensaje si lo hace.No se aun si es la forma correcta,aun tengo mucho camino por aprender.

un saludo cordial,
Responder
#9
Hola. Creo que deberías dar algunos pasos hacia atrás y repasar varios conceptos que estás usando en tu código: funciones, argumentos, valores de retorno, excepciones. Además, tenés tres funciones distintas para validar el NIF: ¿por qué no hacer todo en una misma función? Te sugiero que partas de un código más simple como este para tratar de comprender mejor el procedimiento:

Código:
def dniCorrecto(nif):
    """
    Devuelve True si la entrada es un DNI válido, y False en caso contrario
    :return: un valor booleano.
    """
    tabla="TRWAGMYFPDXBNJZSQVHLCKE"
    numeros="1234567890"
    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:
                return True
    return False

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           

nif = input("Introduce NIF del cliente:")
while not dniCorrecto(nif) or not nifCorrecto(nif):
    print("El Nif es incorrecto.Vuelve a intentarlo.")
    nif = input("Introduce NIF del cliente:")

Fijate que el objetivo de ambas funciones (dniCorrecto y nifCorrecto) es simplemente retornar True o False según el dato que recibieron como argumento. No es su responsabilidad volver a pedir el dato. Eso lo hace el bucle más abajo, son tareas diferentes. Esas dos tareas (validar el dato y volver a pedirlo) estaban mezcladas en tu código anterior, por lo cual la validación fallaba.

En cuanto a las validaciones en sí mismas, el código de la función nifCorrecto() lo veo bastante bien. La función dniCorrecto() sinceramente no entiendo qué es lo que hace, más allá de que no conozco las reglas de formación de un NIF, parece más bien que hay algo mal en el código.

Espero que te sirva de orientación para seguir avanzando. Avisame cómo te fue.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#10
Hola francisco,

He seguido tus indicaciones pero me salta este error cuando introduces garabatos pero cuando vuelves a introducir el nif te vuelve a saltar,en plan bucle infinito,no sé si es fallo de algo en el código o fallo del editor de texto:

Este es el mensaje que sale:
--------Menu--------
(1) Añadir cliente
(2) Eliminar cliente
(3) Mostrar cliente
(4) Listar todos los clientes
(5) Listar clientes habituales
(6) Salir
Debe seleccionar una opcion del 1 a 6:1
Introduzca la fecha de operacion 'dd/mm/aaa':29/09/2022
Introduce NIF del cliente:jjhjhjh
El Nif es incorrecto.Vuelve a intentarlo.
Introduce el nif del cliente: 77777777A
El Nif es incorrecto.Vuelve a intentarlo.
Introduce el nif del cliente:

Quedo a la espera de tu respuesya.


saludos cordiales,
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)