Repository navigation
Expand file tree
/
Copy pathclientes.py
More file actions
241 lines (216 loc) · 9.76 KB
/
Copy pathclientes.py
File metadata and controls
241 lines (216 loc) · 9.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
import re
ARQUIVO_CLIENTES = "clientes.txt"
__all__ = ["validaCpf", "criaCliente", "atualizaDados", "excluiCliente", "exibeCliente", "exibeTodosClientes"]
# Funções de validação
def validaCpf(cpf):
"""
-> Objetivo: Validar o CPF fornecido.
-> Descrição: A função validaCpf() tem como objetivo verificar se o CPF informado é válido, realizando a remoção de caracteres não numéricos e aplicando o algoritmo de verificação do CPF.
-> Parâmetros de entrada:
- cpf (str): O CPF a ser validado.
-> Retornos previstos:
- Retorna `True` se o CPF for válido, `False` caso contrário.
-> Assertivas de entrada:
- O parâmetro cpf deve ser uma string.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando a validade do CPF.
"""
cpf = ''.join(filter(str.isdigit, cpf))
if len(cpf) != 11:
return False
def calcula_dv(cpf, pesos):
soma = sum(int(digit) * peso for digit, peso in zip(cpf, pesos))
dv = 11 - (soma % 11)
return 0 if dv > 9 else dv
if cpf == cpf[0] * len(cpf):
return False
pesos_1 = [10, 9, 8, 7, 6, 5, 4, 3, 2]
pesos_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
dv1 = calcula_dv(cpf[:9], pesos_1)
dv2 = calcula_dv(cpf[:9] + str(dv1), pesos_2)
return cpf[-2:] == f'{dv1}{dv2}'
def validaTelefone(telefone):
"""
-> Objetivo: Validar o número de telefone fornecido.
-> Descrição: A função validaTelefone() tem como objetivo validar se o telefone informado possui o formato correto (10 ou 11 dígitos).
-> Parâmetros de entrada:
- telefone (str): O número de telefone a ser validado.
-> Retornos previstos:
- Retorna `True` se o telefone for válido, `False` caso contrário.
-> Assertivas de entrada:
- O parâmetro telefone deve ser uma string contendo apenas números.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando a validade do telefone.
"""
return re.fullmatch(r"\d{10,11}", telefone) is not None
def validaEmail(email):
"""
-> Objetivo: Validar o endereço de e-mail fornecido.
-> Descrição: A função validaEmail() tem como objetivo validar o formato de um e-mail, verificando se ele segue o padrão correto.
-> Parâmetros de entrada:
- email (str): O endereço de e-mail a ser validado.
-> Retornos previstos:
- Retorna `True` se o e-mail for válido, `False` caso contrário.
-> Assertivas de entrada:
- O parâmetro email deve ser uma string.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando a validade do e-mail.
"""
return re.fullmatch(r"[^@]+@[^@]+\.[^@]+", email) is not None
# Funções principais
def criaCliente(nome, cpf, endereco, telefone, email):
"""
-> Objetivo: Criar um novo cliente no sistema.
-> Descrição: A função criaCliente() tem como objetivo adicionar um novo cliente ao sistema, realizando a validação dos dados (CPF, telefone, e-mail) e verificando se o CPF já está cadastrado.
-> Parâmetros de entrada:
- nome (str): Nome do cliente.
- cpf (str): CPF do cliente.
- endereco (str): Endereço do cliente.
- telefone (str): Número de telefone do cliente.
- email (str): Endereço de e-mail do cliente.
-> Retornos previstos:
- Retorna `True` se o cliente for criado com sucesso, `False` caso contrário.
-> Assertivas de entrada:
- O nome, cpf, endereco, telefone e email devem ser strings.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando o sucesso da criação.
"""
if not validaCpf(cpf):
return False
if not validaTelefone(telefone):
return False
if not validaEmail(email):
return False
if buscaCliente(cpf) != "Cliente não encontrado.":
return False
with open(ARQUIVO_CLIENTES, "a") as arquivo:
arquivo.write(f"{nome};{cpf};{endereco};{telefone};{email}\n")
return True
def atualizaDados(cpf, endereco_novo=None, telefone_novo=None, email_novo=None):
"""
-> Objetivo: Atualizar os dados de um cliente existente.
-> Descrição: A função atualizaDados() tem como objetivo atualizar as informações de um cliente no sistema, validando os novos dados fornecidos (CPF, telefone, e-mail).
-> Parâmetros de entrada:
- cpf (str): O CPF do cliente a ser atualizado.
- endereco_novo (str, opcional): Novo endereço do cliente.
- telefone_novo (str, opcional): Novo telefone do cliente.
- email_novo (str, opcional): Novo e-mail do cliente.
-> Retornos previstos:
- Retorna `True` se os dados forem atualizados com sucesso, `False` caso contrário.
-> Assertivas de entrada:
- O cpf deve ser uma string e os novos dados (endereco_novo, telefone_novo, email_novo) devem ser strings ou None.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando o sucesso da atualização.
"""
if not validaCpf(cpf):
return False
if telefone_novo and not validaTelefone(telefone_novo):
return False
if email_novo and not validaEmail(email_novo):
return False
cliente = buscaCliente(cpf)
if cliente == "Cliente não encontrado.":
return False
linhas = []
atualizado = False
with open(ARQUIVO_CLIENTES, "r+") as arquivo:
linhas = arquivo.readlines()
arquivo.seek(0)
for linha in linhas:
dados = linha.strip().split(";")
if dados[1] == cpf:
if endereco_novo:
dados[2] = endereco_novo
if telefone_novo:
dados[3] = telefone_novo
if email_novo:
dados[4] = email_novo
atualizado = True
arquivo.write(";".join(dados) + "\n")
arquivo.truncate()
return atualizado
def excluiCliente(cpf):
"""
-> Objetivo: Excluir um cliente do sistema.
-> Descrição: A função excluiCliente() tem como objetivo remover um cliente do sistema com base no CPF fornecido, após validar o CPF.
-> Parâmetros de entrada:
- cpf (str): O CPF do cliente a ser excluído.
-> Retornos previstos:
- Retorna `True` se o cliente for excluído com sucesso, `False` caso contrário.
-> Assertivas de entrada:
- O parâmetro cpf deve ser uma string.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando o sucesso da exclusão.
"""
if not validaCpf(cpf):
return False
cliente = buscaCliente(cpf)
if cliente == "Cliente não encontrado.":
return False
with open(ARQUIVO_CLIENTES, "r+") as arquivo:
linhas = arquivo.readlines()
arquivo.seek(0)
for linha in linhas:
dados = linha.strip().split(";")
if dados[1] != cpf:
arquivo.write(linha)
arquivo.truncate()
return True
def exibeCliente(cpf):
"""
-> Objetivo: Exibir os dados de um cliente específico.
-> Descrição: A função exibeCliente() tem como objetivo mostrar as informações de um cliente, localizado pelo CPF fornecido.
-> Parâmetros de entrada:
- cpf (str): O CPF do cliente a ser exibido.
-> Retornos previstos:
- Retorna `True` se o cliente for encontrado e exibido com sucesso, `False` caso contrário.
-> Assertivas de entrada:
- O parâmetro cpf deve ser uma string.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando o sucesso da exibição.
"""
cliente = buscaCliente(cpf)
if cliente == "Cliente não encontrado.":
return False
return True
def exibeTodosClientes():
"""
-> Objetivo: Exibir todos os clientes cadastrados no sistema.
-> Descrição: A função exibeTodosClientes() tem como objetivo listar todos os clientes registrados no sistema.
-> Parâmetros de entrada: Nenhum.
-> Retornos previstos:
- Retorna `True` se todos os clientes forem exibidos com sucesso, `False` caso contrário.
-> Assertivas de entrada:
- Não há validação de entrada, pois a função não recebe parâmetros.
-> Assertivas de saída:
- Retorna um valor booleano (True ou False) indicando o sucesso da exibição.
"""
with open(ARQUIVO_CLIENTES, "r") as arquivo:
clientes = arquivo.readlines()
if not clientes:
return False
return True
def buscaCliente(cpf):
"""
-> Objetivo: Buscar um cliente pelo CPF.
-> Descrição: A função buscaCliente() tem como objetivo procurar um cliente no sistema utilizando o CPF fornecido. Se encontrado, retorna os dados do cliente.
-> Parâmetros de entrada:
- cpf (str): O CPF do cliente a ser buscado.
-> Retornos previstos:
- Retorna um dicionário com os dados do cliente, caso encontrado. Retorna uma string "Cliente não encontrado." caso não encontre o cliente.
-> Assertivas de entrada:
- O parâmetro cpf deve ser uma string.
-> Assertivas de saída:
- Retorna um dicionário ou uma string, dependendo se o cliente foi encontrado.
"""
with open(ARQUIVO_CLIENTES, "r") as arquivo:
for linha in arquivo:
dados = linha.strip().split(";")
if dados[1] == cpf:
return {
"cpf": dados[1],
"endereco": dados[2],
"telefone": dados[3],
"email": dados[4]
}
return "Cliente não encontrado."