source.credit_cards
1from dictionary.sql import search_user_credit_cards_number, search_user_credit_cards_names 2from dictionary.vars import to_remove_list, today 3from functions.get_actual_time import GetActualTime 4from functions.login import Login 5from functions.query_executor import QueryExecutor 6from functions.validate_document import Documents 7from time import sleep 8import streamlit as st 9 10 11class CreditCards: 12 """ 13 Classe que representa os cartões de crédito, com as quatro funções básicas de um CRUD. 14 """ 15 16 def check_if_card_name_already_exists(self, credit_card_name: str): 17 """ 18 Verifica se o nome do cartão já foi utilizado anteriormente. 19 20 Returns 21 ------- 22 is_card_name_available : bool 23 Se o nome do cartão está disponível ou não. 24 """ 25 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password") 26 27 is_card_name_available: bool 28 29 cards_with_parameter_name_query = """SELECT COUNT(id_cartao) FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;""" 30 query_values = (credit_card_name, logged_user_name, logged_user_document) 31 32 cards_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values) 33 cards_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=cards_with_parameter_name_quantity, values_to_remove=to_remove_list) 34 cards_with_parameter_name_quantity = int(cards_with_parameter_name_quantity) 35 36 if cards_with_parameter_name_quantity == 0: 37 is_card_name_available = True 38 else: 39 is_card_name_available = False 40 41 return is_card_name_available 42 43 def get_user_credit_cards_number(self): 44 """ 45 Consulta a quantidade de cartões de crédito registrados pelo usuário. 46 47 Returns 48 ------- 49 user_credit_cards_number : int 50 Número de cartões registrados pelo cliente. 51 """ 52 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 53 54 user_credit_cards_number = QueryExecutor().simple_consult_query(search_user_credit_cards_number, params=(logged_user_name, logged_user_document)) 55 user_credit_cards_number = QueryExecutor().treat_simple_result(user_credit_cards_number, to_remove_list) 56 user_credit_cards_number = int(user_credit_cards_number) 57 58 return user_credit_cards_number 59 60 def get_credit_cards_names(self): 61 """ 62 Consulta o nome dos cartões de crédito do usuário. 63 64 Returns 65 ------- 66 credit_cards_options : list 67 Lista com o nome dos cartões. 68 """ 69 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 70 71 credit_cards_options = [] 72 73 user_credit_cards_names = QueryExecutor().complex_consult_query(search_user_credit_cards_names, params=(logged_user_name, logged_user_document)) 74 user_credit_cards_names = QueryExecutor().treat_numerous_simple_result(user_credit_cards_names, to_remove_list) 75 76 for i in range(0, len(user_credit_cards_names)): 77 credit_cards_options.append(user_credit_cards_names[i]) 78 79 return credit_cards_options 80 81 def create_new_credit_card(self): 82 """ 83 Função para criação de um novo cartão de cŕedito. 84 """ 85 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 86 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 87 88 st.divider() 89 90 def validate_card_values(card_name: str, card_number: str, owner_on_card_name: str, expiration_date: str, actual_date: str, security_code: str): 91 92 if card_name == '': 93 st.error("Informe o nome do cartão.") 94 if card_number == '': 95 st.error("Informe o número do cartão.") 96 if " " in card_number: 97 st.error(body="Não pode haver espaços vazios no número do cartão.") 98 if owner_on_card_name == '': 99 st.error("Informe o nome do titular no cartão.") 100 if expiration_date <= actual_date: 101 st.error(body="A data de validade do cartão deve ser maior que a data atual.") 102 if security_code == '': 103 st.error(body="Informe o código de segurança do cartão.") 104 105 col1, col2 = st.columns(2) 106 107 with col1: 108 109 with st.expander(label="Dados do Cartão", expanded=True): 110 111 card_name = st.text_input(label="Nome do cartão", max_chars=100, help="Informe um nome representativo, por exemplo, 'Cartão Virtual Nubank'.") 112 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 113 last_card_numbers = card_number[-4:] 114 owner_on_card_name = st.text_input(label="Nome do titular", max_chars=100, help="Nome do titular que está impresso no cartão.") 115 expiration_date = st.date_input(label="Data de validade", help="Data de validade impressa no cartão.") 116 str_expiration_date = str(expiration_date) 117 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 118 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 119 confirm_data = st.checkbox(label="Confirmar dados", value=False) 120 121 actual_date = GetActualTime().get_actual_data() 122 123 register_button = st.button(label=":floppy_disk: Cadastrar cartão") 124 125 if register_button and confirm_data == True: 126 with col2: 127 with st.spinner(text="Aguarde..."): 128 sleep(2.5) 129 130 if card_name != '' and card_number != '' and owner_on_card_name != '' and security_code != '' and confirm_security_code != '' and (security_code == confirm_security_code): 131 132 with col2: 133 with st.expander(label="Validação dos dados", expanded=True): 134 valid_card = Documents().validate_credit_card(card_number) 135 136 if valid_card == False: 137 st.error(body="O número do cartão é inválido.") 138 validate_card_values(card_name, card_number, owner_on_card_name, str_expiration_date, actual_date, security_code) 139 140 elif valid_card == True: 141 st.success(body="Número de cartão válido.") 142 143 if owner_on_card_name != '' and card_name != '' and security_code != '' and security_code == confirm_security_code: 144 145 is_card_name_available = self.check_if_card_name_already_exists(card_name) 146 147 if is_card_name_available: 148 with col2: 149 with st.expander(label="Validação dos dados", expanded=True): 150 st.success(body="Nome de cartão válido.") 151 152 card_insert_query = """ 153 INSERT 154 INTO seguranca.cartao_credito (nome_cartao, numero_cartao, nome_titular, proprietario_cartao, documento_titular, data_validade, codigo_seguranca) 155 VALUES (%s, %s, %s, %s, %s, %s, %s);""" 156 card_insert_values = (card_name, card_number, owner_on_card_name, logged_user_name, logged_user_document, expiration_date, security_code) 157 QueryExecutor().insert_query(query=card_insert_query, values=card_insert_values,success_message="Cartão cadastrado com sucesso!", error_message="Erro ao cadastrar cartão:") 158 159 log_query = '''INSERT INTO seguranca.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES (%s, %s, %s);''' 160 log_values = (logged_user, 'Cadastro', 'Cadastrou o cartão {} com o final {}.'.format(card_name, last_card_numbers)) 161 162 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 163 164 else: 165 with col2: 166 with st.expander(label="Validação dos dados", expanded=True): 167 st.error(body="O nome do cartão já edtá sendo utilizado.") 168 169 elif expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '' or security_code != confirm_security_code: 170 if expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '': 171 validate_card_values(card_name, owner_on_card_name, expiration_date, actual_date, security_code) 172 if security_code != confirm_security_code: 173 with col2: 174 with st.expander(label="Validação dos dados", expanded=True): 175 st.error(body='Os códigos informados não coincidem.') 176 177 elif card_name == '' or card_number == '' or owner_on_card_name == '' or security_code == '' or confirm_security_code == '': 178 with col2: 179 with st.spinner(text="Aguarde..."): 180 sleep(0.5) 181 with st.expander(label="Validação dos dados", expanded=True): 182 st.error(body="Há um ou mais campos vazios.") 183 184 elif register_button and confirm_data == False: 185 with col2: 186 with st.spinner(text="Aguarde..."): 187 sleep(0.5) 188 with st.expander(label="Aviso", expanded=True): 189 st.warning(body="Confirme os dados do cartão para prosseguir.") 190 191 def read_credit_cards(self): 192 """ 193 Função para a consulta de um cartão de crédito. 194 """ 195 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 196 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 197 198 user_credit_cards_number = self.get_user_credit_cards_number() 199 200 st.divider() 201 202 if user_credit_cards_number > 0: 203 col1, col2 = st.columns(2) 204 credit_cards_options = self.get_credit_cards_names() 205 206 with col1: 207 208 with st.expander(label="Consulta", expanded=True): 209 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 210 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 211 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 212 confirm_selection = st.checkbox(label="Confirmar seleção") 213 214 consult_button = st.button(label=":file_folder: Consultar cartão") 215 216 if confirm_selection and consult_button: 217 218 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 219 220 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 221 222 card_field_names = ["Nome do cartão", "Número do cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 223 224 credit_card_data_query = ''' 225 SELECT 226 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 227 cartao_credito.nome_titular, 228 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 229 cartao_credito.codigo_seguranca 230 FROM 231 cartao_credito 232 INNER JOIN 233 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 234 AND cartao_credito.documento_titular = usuarios.documento_usuario 235 WHERE 236 cartao_credito.proprietario_cartao = %s 237 AND cartao_credito.documento_titular = %s 238 AND cartao_credito.nome_cartao = %s;''' 239 240 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 241 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 242 243 with col2: 244 245 with st.spinner(text="Aguarde..."): 246 sleep(2.5) 247 248 with st.expander(label="Dados do cartão", expanded=True): 249 for i in range(0, len(credit_card_data)): 250 st.write(card_field_names[i]) 251 st.code(credit_card_data[i]) 252 253 last_card_numbers = str( 254 credit_card_data[1])[-4:] 255 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 256 log_values = (logged_user, "Consulta", "Consultou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 257 QueryExecutor().insert_query(log_query, log_values, "Log gravado.", "Erro ao gravar log:") 258 259 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 260 with col2: 261 with st.spinner(text="Aguarde..."): 262 sleep(0.5) 263 with st.expander(label="Validação dos dados", expanded=True): 264 st.error(body="A senha informada é inválida.") 265 266 elif safe_password != confirm_safe_password: 267 with col2: 268 with st.spinner(text="Aguarde..."): 269 sleep(0.5) 270 with st.expander(label="Validação dos dados", expanded=True): 271 st.error(body="As senhas informadas não coincidem.") 272 273 else: 274 col1, col2, col3 = st.columns(3) 275 276 with col2: 277 with st.spinner(text="Aguarde..."): 278 sleep(0.5) 279 st.warning(body="Você ainda não possui cartões cadastrados.") 280 281 def update_credit_card(self): 282 """ 283 Função para a atualização de um cartão de crédito. 284 """ 285 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 286 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 287 288 user_credit_cards_number = self.get_user_credit_cards_number() 289 290 st.divider() 291 292 if user_credit_cards_number > 0: 293 col1, col2 = st.columns(2) 294 credit_cards_options = self.get_credit_cards_names() 295 296 with col1: 297 298 with st.expander(label="Consulta", expanded=True): 299 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 300 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 301 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 302 confirm_selection = st.checkbox(label="Confirmar seleção") 303 304 if confirm_selection: 305 306 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 307 308 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 309 310 credit_card_data_query = ''' 311 SELECT 312 cartao_credito.nome_cartao, 313 cartao_credito.numero_cartao, 314 cartao_credito.nome_titular, 315 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 316 cartao_credito.codigo_seguranca 317 FROM 318 cartao_credito 319 INNER JOIN 320 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 321 AND cartao_credito.documento_titular = usuarios.documento_usuario 322 WHERE 323 cartao_credito.proprietario_cartao = %s 324 AND cartao_credito.documento_titular = %s 325 AND cartao_credito.nome_cartao = %s;''' 326 327 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=5, params=(logged_user_name, logged_user_document, selected_user_card)) 328 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 329 330 with col2: 331 332 with st.spinner(text="Aguarde..."): 333 sleep(0.5) 334 335 with st.expander(label="Novos dados do cartão", expanded=True): 336 st.info(body="Nome do cartão: {}".format(selected_user_card)) 337 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 338 last_card_numbers = card_number[-4:] 339 expiration_date = str(st.date_input(label="Data de validade", help="Data de validade impressa no cartão.")) 340 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 341 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 342 confirm_data = st.checkbox(label="Confirmar dados", value=False) 343 344 update_card_button = st.button(label=":arrows_counterclockwise: Atualizar dados do cartão") 345 346 if confirm_data and update_card_button and security_code == confirm_security_code and card_number != "" and expiration_date > today: 347 348 with col2: 349 with st.spinner(text="Aguarde..."): 350 sleep(2.5) 351 with st.expander(label="Validação dos dados", expanded=True): 352 is_card_valid = Documents().validate_credit_card(card_number) 353 354 if is_card_valid == True: 355 356 with col2: 357 with st.spinner(text="Aguarde..."): 358 sleep(0.5) 359 with st.expander(label="Validação dos dados", expanded=True): 360 st.success(body="Número de cartão válido.") 361 362 update_card_query = '''UPDATE cartao_credito SET numero_cartao = %s, data_validade = %s, codigo_seguranca = %s WHERE nome_cartao = %s;''' 363 update_card_values = (card_number, expiration_date, security_code, selected_user_card) 364 365 QueryExecutor().insert_query(query=update_card_query, values=update_card_values, success_message="Cartão atualizado com sucesso!", error_message="Erro ao atualizar cartão:") 366 367 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 368 log_values = (logged_user, "Atualização", "Atualizou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 369 370 QueryExecutor().insert_query(query=log_query, values=log_values, success_message="Log gravado.", error_message="Erro ao gravar log:") 371 372 elif is_card_valid == False: 373 with col2: 374 with st.spinner(text="Aguarde..."): 375 sleep(0.5) 376 with st.expander(label="Validação dos dados", expanded=True): 377 st.error(body="Número de cartão inválido.") 378 379 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 380 with col2: 381 with st.spinner(text="Aguarde..."): 382 sleep(0.5) 383 with st.expander(label="Validação dos dados", expanded=True): 384 st.error(body="A senha informada é inválida.") 385 386 elif safe_password != confirm_safe_password: 387 with col2: 388 with st.spinner(text="Aguarde..."): 389 sleep(0.5) 390 with st.expander(label="Validação dos dados", expanded=True): 391 st.error(body="As senhas informadas não coincidem.") 392 393 else: 394 col1, col2, col3 = st.columns(3) 395 with col2: 396 st.warning(body="Você ainda não possui cartões cadastrados.") 397 398 def delete_credit_card(self): 399 """ 400 Função para a exclusão de um cartão de crédito. 401 """ 402 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 403 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 404 405 user_credit_cards_number = self.get_user_credit_cards_number() 406 407 st.divider() 408 409 if user_credit_cards_number > 0: 410 col1, col2 = st.columns(2) 411 credit_cards_options = self.get_credit_cards_names() 412 413 with col1: 414 415 with st.expander(label="Consulta", expanded=True): 416 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 417 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 418 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 419 confirm_selection = st.checkbox(label="Confirmar seleção") 420 421 if confirm_selection: 422 423 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 424 425 if confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True: 426 card_field_names = ["Cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 427 428 credit_card_data_query = ''' 429 SELECT 430 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 431 cartao_credito.nome_titular, 432 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 433 cartao_credito.codigo_seguranca 434 FROM 435 cartao_credito 436 INNER JOIN 437 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 438 AND cartao_credito.documento_titular = usuarios.documento_usuario 439 WHERE 440 cartao_credito.proprietario_cartao = %s 441 AND cartao_credito.documento_titular = %s 442 AND cartao_credito.nome_cartao = %s;''' 443 444 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 445 credit_card_data = QueryExecutor().treat_numerous_simple_result(values_to_treat=credit_card_data, values_to_remove=to_remove_list) 446 447 with col2: 448 with st.spinner(text="Aguarde..."): 449 sleep(0.5) 450 451 with st.expander(label="Dados do cartão", expanded=True): 452 for i in range(0, len(credit_card_data)): 453 st.write(card_field_names[i]) 454 st.code(credit_card_data[i]) 455 confirm_card_exclusion = st.checkbox(label="Confirmar exclusão") 456 457 delete_credit_card_button = st.button(label=":wastebasket: Deletar cartão") 458 459 if confirm_card_exclusion and delete_credit_card_button: 460 461 with col2: 462 with st.spinner(text="Aguarde..."): 463 sleep(2.5) 464 465 delete_card_query = '''DELETE cartao_credito FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;''' 466 delete_card_values = (selected_user_card, logged_user_name, logged_user_document) 467 468 QueryExecutor().insert_query(query=delete_card_query, values=delete_card_values, success_message="Cartão excluído com sucesso!", error_message="Erro ao excluir cartão:") 469 470 last_card_numbers = str(credit_card_data[1])[-4:] 471 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 472 log_values = (logged_user, "Exclusão", "Excluiu cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 473 474 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 475 476 elif delete_credit_card_button and confirm_card_exclusion == False: 477 with col1: 478 with st.expander(label="Aviso", expanded=True): 479 st.warning(body="Confirme a exclusão da senha antes de prosseguir.") 480 481 elif confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False: 482 with col2: 483 with st.spinner(text="Aguarde..."): 484 sleep(0.5) 485 with st.expander(label="Validação dos dados", expanded=True): 486 st.error(body="A senha informada é inválida.") 487 488 if safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password: 489 with col2: 490 with st.spinner(text="Aguarde..."): 491 sleep(0.5) 492 with st.expander(label="Validação dos dados", expanded=True): 493 st.error(body="As senhas informadas não coincidem.") 494 495 else: 496 col1, col2, col3 = st.columns(3) 497 498 with col2: 499 st.warning(body="Você ainda não possui cartões cadastrados.") 500 501 def main_menu(self): 502 """ 503 Menu Principal. 504 """ 505 506 col1, col2, col3 = st.columns(3) 507 508 with col1: 509 st.header(body=":credit_card: Cartões") 510 511 with col2: 512 menu_options = ["Cadastrar cartão", "Consultar cartão", "Atualizar cartão", "Deletar cartão"] 513 selected_option = st.selectbox(label="Menu", options=menu_options) 514 515 if selected_option == menu_options[0]: 516 self.create_new_credit_card() 517 if selected_option == menu_options[1]: 518 self.read_credit_cards() 519 if selected_option == menu_options[2]: 520 self.update_credit_card() 521 if selected_option == menu_options[3]: 522 self.delete_credit_card()
class
CreditCards:
12class CreditCards: 13 """ 14 Classe que representa os cartões de crédito, com as quatro funções básicas de um CRUD. 15 """ 16 17 def check_if_card_name_already_exists(self, credit_card_name: str): 18 """ 19 Verifica se o nome do cartão já foi utilizado anteriormente. 20 21 Returns 22 ------- 23 is_card_name_available : bool 24 Se o nome do cartão está disponível ou não. 25 """ 26 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password") 27 28 is_card_name_available: bool 29 30 cards_with_parameter_name_query = """SELECT COUNT(id_cartao) FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;""" 31 query_values = (credit_card_name, logged_user_name, logged_user_document) 32 33 cards_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values) 34 cards_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=cards_with_parameter_name_quantity, values_to_remove=to_remove_list) 35 cards_with_parameter_name_quantity = int(cards_with_parameter_name_quantity) 36 37 if cards_with_parameter_name_quantity == 0: 38 is_card_name_available = True 39 else: 40 is_card_name_available = False 41 42 return is_card_name_available 43 44 def get_user_credit_cards_number(self): 45 """ 46 Consulta a quantidade de cartões de crédito registrados pelo usuário. 47 48 Returns 49 ------- 50 user_credit_cards_number : int 51 Número de cartões registrados pelo cliente. 52 """ 53 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 54 55 user_credit_cards_number = QueryExecutor().simple_consult_query(search_user_credit_cards_number, params=(logged_user_name, logged_user_document)) 56 user_credit_cards_number = QueryExecutor().treat_simple_result(user_credit_cards_number, to_remove_list) 57 user_credit_cards_number = int(user_credit_cards_number) 58 59 return user_credit_cards_number 60 61 def get_credit_cards_names(self): 62 """ 63 Consulta o nome dos cartões de crédito do usuário. 64 65 Returns 66 ------- 67 credit_cards_options : list 68 Lista com o nome dos cartões. 69 """ 70 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 71 72 credit_cards_options = [] 73 74 user_credit_cards_names = QueryExecutor().complex_consult_query(search_user_credit_cards_names, params=(logged_user_name, logged_user_document)) 75 user_credit_cards_names = QueryExecutor().treat_numerous_simple_result(user_credit_cards_names, to_remove_list) 76 77 for i in range(0, len(user_credit_cards_names)): 78 credit_cards_options.append(user_credit_cards_names[i]) 79 80 return credit_cards_options 81 82 def create_new_credit_card(self): 83 """ 84 Função para criação de um novo cartão de cŕedito. 85 """ 86 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 87 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 88 89 st.divider() 90 91 def validate_card_values(card_name: str, card_number: str, owner_on_card_name: str, expiration_date: str, actual_date: str, security_code: str): 92 93 if card_name == '': 94 st.error("Informe o nome do cartão.") 95 if card_number == '': 96 st.error("Informe o número do cartão.") 97 if " " in card_number: 98 st.error(body="Não pode haver espaços vazios no número do cartão.") 99 if owner_on_card_name == '': 100 st.error("Informe o nome do titular no cartão.") 101 if expiration_date <= actual_date: 102 st.error(body="A data de validade do cartão deve ser maior que a data atual.") 103 if security_code == '': 104 st.error(body="Informe o código de segurança do cartão.") 105 106 col1, col2 = st.columns(2) 107 108 with col1: 109 110 with st.expander(label="Dados do Cartão", expanded=True): 111 112 card_name = st.text_input(label="Nome do cartão", max_chars=100, help="Informe um nome representativo, por exemplo, 'Cartão Virtual Nubank'.") 113 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 114 last_card_numbers = card_number[-4:] 115 owner_on_card_name = st.text_input(label="Nome do titular", max_chars=100, help="Nome do titular que está impresso no cartão.") 116 expiration_date = st.date_input(label="Data de validade", help="Data de validade impressa no cartão.") 117 str_expiration_date = str(expiration_date) 118 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 119 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 120 confirm_data = st.checkbox(label="Confirmar dados", value=False) 121 122 actual_date = GetActualTime().get_actual_data() 123 124 register_button = st.button(label=":floppy_disk: Cadastrar cartão") 125 126 if register_button and confirm_data == True: 127 with col2: 128 with st.spinner(text="Aguarde..."): 129 sleep(2.5) 130 131 if card_name != '' and card_number != '' and owner_on_card_name != '' and security_code != '' and confirm_security_code != '' and (security_code == confirm_security_code): 132 133 with col2: 134 with st.expander(label="Validação dos dados", expanded=True): 135 valid_card = Documents().validate_credit_card(card_number) 136 137 if valid_card == False: 138 st.error(body="O número do cartão é inválido.") 139 validate_card_values(card_name, card_number, owner_on_card_name, str_expiration_date, actual_date, security_code) 140 141 elif valid_card == True: 142 st.success(body="Número de cartão válido.") 143 144 if owner_on_card_name != '' and card_name != '' and security_code != '' and security_code == confirm_security_code: 145 146 is_card_name_available = self.check_if_card_name_already_exists(card_name) 147 148 if is_card_name_available: 149 with col2: 150 with st.expander(label="Validação dos dados", expanded=True): 151 st.success(body="Nome de cartão válido.") 152 153 card_insert_query = """ 154 INSERT 155 INTO seguranca.cartao_credito (nome_cartao, numero_cartao, nome_titular, proprietario_cartao, documento_titular, data_validade, codigo_seguranca) 156 VALUES (%s, %s, %s, %s, %s, %s, %s);""" 157 card_insert_values = (card_name, card_number, owner_on_card_name, logged_user_name, logged_user_document, expiration_date, security_code) 158 QueryExecutor().insert_query(query=card_insert_query, values=card_insert_values,success_message="Cartão cadastrado com sucesso!", error_message="Erro ao cadastrar cartão:") 159 160 log_query = '''INSERT INTO seguranca.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES (%s, %s, %s);''' 161 log_values = (logged_user, 'Cadastro', 'Cadastrou o cartão {} com o final {}.'.format(card_name, last_card_numbers)) 162 163 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 164 165 else: 166 with col2: 167 with st.expander(label="Validação dos dados", expanded=True): 168 st.error(body="O nome do cartão já edtá sendo utilizado.") 169 170 elif expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '' or security_code != confirm_security_code: 171 if expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '': 172 validate_card_values(card_name, owner_on_card_name, expiration_date, actual_date, security_code) 173 if security_code != confirm_security_code: 174 with col2: 175 with st.expander(label="Validação dos dados", expanded=True): 176 st.error(body='Os códigos informados não coincidem.') 177 178 elif card_name == '' or card_number == '' or owner_on_card_name == '' or security_code == '' or confirm_security_code == '': 179 with col2: 180 with st.spinner(text="Aguarde..."): 181 sleep(0.5) 182 with st.expander(label="Validação dos dados", expanded=True): 183 st.error(body="Há um ou mais campos vazios.") 184 185 elif register_button and confirm_data == False: 186 with col2: 187 with st.spinner(text="Aguarde..."): 188 sleep(0.5) 189 with st.expander(label="Aviso", expanded=True): 190 st.warning(body="Confirme os dados do cartão para prosseguir.") 191 192 def read_credit_cards(self): 193 """ 194 Função para a consulta de um cartão de crédito. 195 """ 196 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 197 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 198 199 user_credit_cards_number = self.get_user_credit_cards_number() 200 201 st.divider() 202 203 if user_credit_cards_number > 0: 204 col1, col2 = st.columns(2) 205 credit_cards_options = self.get_credit_cards_names() 206 207 with col1: 208 209 with st.expander(label="Consulta", expanded=True): 210 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 211 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 212 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 213 confirm_selection = st.checkbox(label="Confirmar seleção") 214 215 consult_button = st.button(label=":file_folder: Consultar cartão") 216 217 if confirm_selection and consult_button: 218 219 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 220 221 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 222 223 card_field_names = ["Nome do cartão", "Número do cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 224 225 credit_card_data_query = ''' 226 SELECT 227 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 228 cartao_credito.nome_titular, 229 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 230 cartao_credito.codigo_seguranca 231 FROM 232 cartao_credito 233 INNER JOIN 234 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 235 AND cartao_credito.documento_titular = usuarios.documento_usuario 236 WHERE 237 cartao_credito.proprietario_cartao = %s 238 AND cartao_credito.documento_titular = %s 239 AND cartao_credito.nome_cartao = %s;''' 240 241 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 242 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 243 244 with col2: 245 246 with st.spinner(text="Aguarde..."): 247 sleep(2.5) 248 249 with st.expander(label="Dados do cartão", expanded=True): 250 for i in range(0, len(credit_card_data)): 251 st.write(card_field_names[i]) 252 st.code(credit_card_data[i]) 253 254 last_card_numbers = str( 255 credit_card_data[1])[-4:] 256 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 257 log_values = (logged_user, "Consulta", "Consultou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 258 QueryExecutor().insert_query(log_query, log_values, "Log gravado.", "Erro ao gravar log:") 259 260 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 261 with col2: 262 with st.spinner(text="Aguarde..."): 263 sleep(0.5) 264 with st.expander(label="Validação dos dados", expanded=True): 265 st.error(body="A senha informada é inválida.") 266 267 elif safe_password != confirm_safe_password: 268 with col2: 269 with st.spinner(text="Aguarde..."): 270 sleep(0.5) 271 with st.expander(label="Validação dos dados", expanded=True): 272 st.error(body="As senhas informadas não coincidem.") 273 274 else: 275 col1, col2, col3 = st.columns(3) 276 277 with col2: 278 with st.spinner(text="Aguarde..."): 279 sleep(0.5) 280 st.warning(body="Você ainda não possui cartões cadastrados.") 281 282 def update_credit_card(self): 283 """ 284 Função para a atualização de um cartão de crédito. 285 """ 286 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 287 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 288 289 user_credit_cards_number = self.get_user_credit_cards_number() 290 291 st.divider() 292 293 if user_credit_cards_number > 0: 294 col1, col2 = st.columns(2) 295 credit_cards_options = self.get_credit_cards_names() 296 297 with col1: 298 299 with st.expander(label="Consulta", expanded=True): 300 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 301 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 302 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 303 confirm_selection = st.checkbox(label="Confirmar seleção") 304 305 if confirm_selection: 306 307 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 308 309 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 310 311 credit_card_data_query = ''' 312 SELECT 313 cartao_credito.nome_cartao, 314 cartao_credito.numero_cartao, 315 cartao_credito.nome_titular, 316 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 317 cartao_credito.codigo_seguranca 318 FROM 319 cartao_credito 320 INNER JOIN 321 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 322 AND cartao_credito.documento_titular = usuarios.documento_usuario 323 WHERE 324 cartao_credito.proprietario_cartao = %s 325 AND cartao_credito.documento_titular = %s 326 AND cartao_credito.nome_cartao = %s;''' 327 328 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=5, params=(logged_user_name, logged_user_document, selected_user_card)) 329 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 330 331 with col2: 332 333 with st.spinner(text="Aguarde..."): 334 sleep(0.5) 335 336 with st.expander(label="Novos dados do cartão", expanded=True): 337 st.info(body="Nome do cartão: {}".format(selected_user_card)) 338 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 339 last_card_numbers = card_number[-4:] 340 expiration_date = str(st.date_input(label="Data de validade", help="Data de validade impressa no cartão.")) 341 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 342 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 343 confirm_data = st.checkbox(label="Confirmar dados", value=False) 344 345 update_card_button = st.button(label=":arrows_counterclockwise: Atualizar dados do cartão") 346 347 if confirm_data and update_card_button and security_code == confirm_security_code and card_number != "" and expiration_date > today: 348 349 with col2: 350 with st.spinner(text="Aguarde..."): 351 sleep(2.5) 352 with st.expander(label="Validação dos dados", expanded=True): 353 is_card_valid = Documents().validate_credit_card(card_number) 354 355 if is_card_valid == True: 356 357 with col2: 358 with st.spinner(text="Aguarde..."): 359 sleep(0.5) 360 with st.expander(label="Validação dos dados", expanded=True): 361 st.success(body="Número de cartão válido.") 362 363 update_card_query = '''UPDATE cartao_credito SET numero_cartao = %s, data_validade = %s, codigo_seguranca = %s WHERE nome_cartao = %s;''' 364 update_card_values = (card_number, expiration_date, security_code, selected_user_card) 365 366 QueryExecutor().insert_query(query=update_card_query, values=update_card_values, success_message="Cartão atualizado com sucesso!", error_message="Erro ao atualizar cartão:") 367 368 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 369 log_values = (logged_user, "Atualização", "Atualizou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 370 371 QueryExecutor().insert_query(query=log_query, values=log_values, success_message="Log gravado.", error_message="Erro ao gravar log:") 372 373 elif is_card_valid == False: 374 with col2: 375 with st.spinner(text="Aguarde..."): 376 sleep(0.5) 377 with st.expander(label="Validação dos dados", expanded=True): 378 st.error(body="Número de cartão inválido.") 379 380 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 381 with col2: 382 with st.spinner(text="Aguarde..."): 383 sleep(0.5) 384 with st.expander(label="Validação dos dados", expanded=True): 385 st.error(body="A senha informada é inválida.") 386 387 elif safe_password != confirm_safe_password: 388 with col2: 389 with st.spinner(text="Aguarde..."): 390 sleep(0.5) 391 with st.expander(label="Validação dos dados", expanded=True): 392 st.error(body="As senhas informadas não coincidem.") 393 394 else: 395 col1, col2, col3 = st.columns(3) 396 with col2: 397 st.warning(body="Você ainda não possui cartões cadastrados.") 398 399 def delete_credit_card(self): 400 """ 401 Função para a exclusão de um cartão de crédito. 402 """ 403 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 404 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 405 406 user_credit_cards_number = self.get_user_credit_cards_number() 407 408 st.divider() 409 410 if user_credit_cards_number > 0: 411 col1, col2 = st.columns(2) 412 credit_cards_options = self.get_credit_cards_names() 413 414 with col1: 415 416 with st.expander(label="Consulta", expanded=True): 417 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 418 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 419 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 420 confirm_selection = st.checkbox(label="Confirmar seleção") 421 422 if confirm_selection: 423 424 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 425 426 if confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True: 427 card_field_names = ["Cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 428 429 credit_card_data_query = ''' 430 SELECT 431 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 432 cartao_credito.nome_titular, 433 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 434 cartao_credito.codigo_seguranca 435 FROM 436 cartao_credito 437 INNER JOIN 438 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 439 AND cartao_credito.documento_titular = usuarios.documento_usuario 440 WHERE 441 cartao_credito.proprietario_cartao = %s 442 AND cartao_credito.documento_titular = %s 443 AND cartao_credito.nome_cartao = %s;''' 444 445 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 446 credit_card_data = QueryExecutor().treat_numerous_simple_result(values_to_treat=credit_card_data, values_to_remove=to_remove_list) 447 448 with col2: 449 with st.spinner(text="Aguarde..."): 450 sleep(0.5) 451 452 with st.expander(label="Dados do cartão", expanded=True): 453 for i in range(0, len(credit_card_data)): 454 st.write(card_field_names[i]) 455 st.code(credit_card_data[i]) 456 confirm_card_exclusion = st.checkbox(label="Confirmar exclusão") 457 458 delete_credit_card_button = st.button(label=":wastebasket: Deletar cartão") 459 460 if confirm_card_exclusion and delete_credit_card_button: 461 462 with col2: 463 with st.spinner(text="Aguarde..."): 464 sleep(2.5) 465 466 delete_card_query = '''DELETE cartao_credito FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;''' 467 delete_card_values = (selected_user_card, logged_user_name, logged_user_document) 468 469 QueryExecutor().insert_query(query=delete_card_query, values=delete_card_values, success_message="Cartão excluído com sucesso!", error_message="Erro ao excluir cartão:") 470 471 last_card_numbers = str(credit_card_data[1])[-4:] 472 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 473 log_values = (logged_user, "Exclusão", "Excluiu cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 474 475 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 476 477 elif delete_credit_card_button and confirm_card_exclusion == False: 478 with col1: 479 with st.expander(label="Aviso", expanded=True): 480 st.warning(body="Confirme a exclusão da senha antes de prosseguir.") 481 482 elif confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False: 483 with col2: 484 with st.spinner(text="Aguarde..."): 485 sleep(0.5) 486 with st.expander(label="Validação dos dados", expanded=True): 487 st.error(body="A senha informada é inválida.") 488 489 if safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password: 490 with col2: 491 with st.spinner(text="Aguarde..."): 492 sleep(0.5) 493 with st.expander(label="Validação dos dados", expanded=True): 494 st.error(body="As senhas informadas não coincidem.") 495 496 else: 497 col1, col2, col3 = st.columns(3) 498 499 with col2: 500 st.warning(body="Você ainda não possui cartões cadastrados.") 501 502 def main_menu(self): 503 """ 504 Menu Principal. 505 """ 506 507 col1, col2, col3 = st.columns(3) 508 509 with col1: 510 st.header(body=":credit_card: Cartões") 511 512 with col2: 513 menu_options = ["Cadastrar cartão", "Consultar cartão", "Atualizar cartão", "Deletar cartão"] 514 selected_option = st.selectbox(label="Menu", options=menu_options) 515 516 if selected_option == menu_options[0]: 517 self.create_new_credit_card() 518 if selected_option == menu_options[1]: 519 self.read_credit_cards() 520 if selected_option == menu_options[2]: 521 self.update_credit_card() 522 if selected_option == menu_options[3]: 523 self.delete_credit_card()
Classe que representa os cartões de crédito, com as quatro funções básicas de um CRUD.
def
check_if_card_name_already_exists(self, credit_card_name: str):
17 def check_if_card_name_already_exists(self, credit_card_name: str): 18 """ 19 Verifica se o nome do cartão já foi utilizado anteriormente. 20 21 Returns 22 ------- 23 is_card_name_available : bool 24 Se o nome do cartão está disponível ou não. 25 """ 26 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password") 27 28 is_card_name_available: bool 29 30 cards_with_parameter_name_query = """SELECT COUNT(id_cartao) FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;""" 31 query_values = (credit_card_name, logged_user_name, logged_user_document) 32 33 cards_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=cards_with_parameter_name_query, params=query_values) 34 cards_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=cards_with_parameter_name_quantity, values_to_remove=to_remove_list) 35 cards_with_parameter_name_quantity = int(cards_with_parameter_name_quantity) 36 37 if cards_with_parameter_name_quantity == 0: 38 is_card_name_available = True 39 else: 40 is_card_name_available = False 41 42 return is_card_name_available
Verifica se o nome do cartão já foi utilizado anteriormente.
Returns
- is_card_name_available (bool): Se o nome do cartão está disponível ou não.
def
get_user_credit_cards_number(self):
44 def get_user_credit_cards_number(self): 45 """ 46 Consulta a quantidade de cartões de crédito registrados pelo usuário. 47 48 Returns 49 ------- 50 user_credit_cards_number : int 51 Número de cartões registrados pelo cliente. 52 """ 53 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 54 55 user_credit_cards_number = QueryExecutor().simple_consult_query(search_user_credit_cards_number, params=(logged_user_name, logged_user_document)) 56 user_credit_cards_number = QueryExecutor().treat_simple_result(user_credit_cards_number, to_remove_list) 57 user_credit_cards_number = int(user_credit_cards_number) 58 59 return user_credit_cards_number
Consulta a quantidade de cartões de crédito registrados pelo usuário.
Returns
- user_credit_cards_number (int): Número de cartões registrados pelo cliente.
def
get_credit_cards_names(self):
61 def get_credit_cards_names(self): 62 """ 63 Consulta o nome dos cartões de crédito do usuário. 64 65 Returns 66 ------- 67 credit_cards_options : list 68 Lista com o nome dos cartões. 69 """ 70 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 71 72 credit_cards_options = [] 73 74 user_credit_cards_names = QueryExecutor().complex_consult_query(search_user_credit_cards_names, params=(logged_user_name, logged_user_document)) 75 user_credit_cards_names = QueryExecutor().treat_numerous_simple_result(user_credit_cards_names, to_remove_list) 76 77 for i in range(0, len(user_credit_cards_names)): 78 credit_cards_options.append(user_credit_cards_names[i]) 79 80 return credit_cards_options
Consulta o nome dos cartões de crédito do usuário.
Returns
- credit_cards_options (list): Lista com o nome dos cartões.
def
create_new_credit_card(self):
82 def create_new_credit_card(self): 83 """ 84 Função para criação de um novo cartão de cŕedito. 85 """ 86 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 87 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 88 89 st.divider() 90 91 def validate_card_values(card_name: str, card_number: str, owner_on_card_name: str, expiration_date: str, actual_date: str, security_code: str): 92 93 if card_name == '': 94 st.error("Informe o nome do cartão.") 95 if card_number == '': 96 st.error("Informe o número do cartão.") 97 if " " in card_number: 98 st.error(body="Não pode haver espaços vazios no número do cartão.") 99 if owner_on_card_name == '': 100 st.error("Informe o nome do titular no cartão.") 101 if expiration_date <= actual_date: 102 st.error(body="A data de validade do cartão deve ser maior que a data atual.") 103 if security_code == '': 104 st.error(body="Informe o código de segurança do cartão.") 105 106 col1, col2 = st.columns(2) 107 108 with col1: 109 110 with st.expander(label="Dados do Cartão", expanded=True): 111 112 card_name = st.text_input(label="Nome do cartão", max_chars=100, help="Informe um nome representativo, por exemplo, 'Cartão Virtual Nubank'.") 113 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 114 last_card_numbers = card_number[-4:] 115 owner_on_card_name = st.text_input(label="Nome do titular", max_chars=100, help="Nome do titular que está impresso no cartão.") 116 expiration_date = st.date_input(label="Data de validade", help="Data de validade impressa no cartão.") 117 str_expiration_date = str(expiration_date) 118 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 119 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 120 confirm_data = st.checkbox(label="Confirmar dados", value=False) 121 122 actual_date = GetActualTime().get_actual_data() 123 124 register_button = st.button(label=":floppy_disk: Cadastrar cartão") 125 126 if register_button and confirm_data == True: 127 with col2: 128 with st.spinner(text="Aguarde..."): 129 sleep(2.5) 130 131 if card_name != '' and card_number != '' and owner_on_card_name != '' and security_code != '' and confirm_security_code != '' and (security_code == confirm_security_code): 132 133 with col2: 134 with st.expander(label="Validação dos dados", expanded=True): 135 valid_card = Documents().validate_credit_card(card_number) 136 137 if valid_card == False: 138 st.error(body="O número do cartão é inválido.") 139 validate_card_values(card_name, card_number, owner_on_card_name, str_expiration_date, actual_date, security_code) 140 141 elif valid_card == True: 142 st.success(body="Número de cartão válido.") 143 144 if owner_on_card_name != '' and card_name != '' and security_code != '' and security_code == confirm_security_code: 145 146 is_card_name_available = self.check_if_card_name_already_exists(card_name) 147 148 if is_card_name_available: 149 with col2: 150 with st.expander(label="Validação dos dados", expanded=True): 151 st.success(body="Nome de cartão válido.") 152 153 card_insert_query = """ 154 INSERT 155 INTO seguranca.cartao_credito (nome_cartao, numero_cartao, nome_titular, proprietario_cartao, documento_titular, data_validade, codigo_seguranca) 156 VALUES (%s, %s, %s, %s, %s, %s, %s);""" 157 card_insert_values = (card_name, card_number, owner_on_card_name, logged_user_name, logged_user_document, expiration_date, security_code) 158 QueryExecutor().insert_query(query=card_insert_query, values=card_insert_values,success_message="Cartão cadastrado com sucesso!", error_message="Erro ao cadastrar cartão:") 159 160 log_query = '''INSERT INTO seguranca.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES (%s, %s, %s);''' 161 log_values = (logged_user, 'Cadastro', 'Cadastrou o cartão {} com o final {}.'.format(card_name, last_card_numbers)) 162 163 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 164 165 else: 166 with col2: 167 with st.expander(label="Validação dos dados", expanded=True): 168 st.error(body="O nome do cartão já edtá sendo utilizado.") 169 170 elif expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '' or security_code != confirm_security_code: 171 if expiration_date <= actual_date or owner_on_card_name == '' or card_name == '' or security_code == '': 172 validate_card_values(card_name, owner_on_card_name, expiration_date, actual_date, security_code) 173 if security_code != confirm_security_code: 174 with col2: 175 with st.expander(label="Validação dos dados", expanded=True): 176 st.error(body='Os códigos informados não coincidem.') 177 178 elif card_name == '' or card_number == '' or owner_on_card_name == '' or security_code == '' or confirm_security_code == '': 179 with col2: 180 with st.spinner(text="Aguarde..."): 181 sleep(0.5) 182 with st.expander(label="Validação dos dados", expanded=True): 183 st.error(body="Há um ou mais campos vazios.") 184 185 elif register_button and confirm_data == False: 186 with col2: 187 with st.spinner(text="Aguarde..."): 188 sleep(0.5) 189 with st.expander(label="Aviso", expanded=True): 190 st.warning(body="Confirme os dados do cartão para prosseguir.")
Função para criação de um novo cartão de cŕedito.
def
read_credit_cards(self):
192 def read_credit_cards(self): 193 """ 194 Função para a consulta de um cartão de crédito. 195 """ 196 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 197 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 198 199 user_credit_cards_number = self.get_user_credit_cards_number() 200 201 st.divider() 202 203 if user_credit_cards_number > 0: 204 col1, col2 = st.columns(2) 205 credit_cards_options = self.get_credit_cards_names() 206 207 with col1: 208 209 with st.expander(label="Consulta", expanded=True): 210 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 211 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 212 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 213 confirm_selection = st.checkbox(label="Confirmar seleção") 214 215 consult_button = st.button(label=":file_folder: Consultar cartão") 216 217 if confirm_selection and consult_button: 218 219 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 220 221 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 222 223 card_field_names = ["Nome do cartão", "Número do cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 224 225 credit_card_data_query = ''' 226 SELECT 227 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 228 cartao_credito.nome_titular, 229 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 230 cartao_credito.codigo_seguranca 231 FROM 232 cartao_credito 233 INNER JOIN 234 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 235 AND cartao_credito.documento_titular = usuarios.documento_usuario 236 WHERE 237 cartao_credito.proprietario_cartao = %s 238 AND cartao_credito.documento_titular = %s 239 AND cartao_credito.nome_cartao = %s;''' 240 241 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 242 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 243 244 with col2: 245 246 with st.spinner(text="Aguarde..."): 247 sleep(2.5) 248 249 with st.expander(label="Dados do cartão", expanded=True): 250 for i in range(0, len(credit_card_data)): 251 st.write(card_field_names[i]) 252 st.code(credit_card_data[i]) 253 254 last_card_numbers = str( 255 credit_card_data[1])[-4:] 256 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 257 log_values = (logged_user, "Consulta", "Consultou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 258 QueryExecutor().insert_query(log_query, log_values, "Log gravado.", "Erro ao gravar log:") 259 260 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 261 with col2: 262 with st.spinner(text="Aguarde..."): 263 sleep(0.5) 264 with st.expander(label="Validação dos dados", expanded=True): 265 st.error(body="A senha informada é inválida.") 266 267 elif safe_password != confirm_safe_password: 268 with col2: 269 with st.spinner(text="Aguarde..."): 270 sleep(0.5) 271 with st.expander(label="Validação dos dados", expanded=True): 272 st.error(body="As senhas informadas não coincidem.") 273 274 else: 275 col1, col2, col3 = st.columns(3) 276 277 with col2: 278 with st.spinner(text="Aguarde..."): 279 sleep(0.5) 280 st.warning(body="Você ainda não possui cartões cadastrados.")
Função para a consulta de um cartão de crédito.
def
update_credit_card(self):
282 def update_credit_card(self): 283 """ 284 Função para a atualização de um cartão de crédito. 285 """ 286 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 287 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 288 289 user_credit_cards_number = self.get_user_credit_cards_number() 290 291 st.divider() 292 293 if user_credit_cards_number > 0: 294 col1, col2 = st.columns(2) 295 credit_cards_options = self.get_credit_cards_names() 296 297 with col1: 298 299 with st.expander(label="Consulta", expanded=True): 300 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 301 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 302 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 303 confirm_selection = st.checkbox(label="Confirmar seleção") 304 305 if confirm_selection: 306 307 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 308 309 if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True: 310 311 credit_card_data_query = ''' 312 SELECT 313 cartao_credito.nome_cartao, 314 cartao_credito.numero_cartao, 315 cartao_credito.nome_titular, 316 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 317 cartao_credito.codigo_seguranca 318 FROM 319 cartao_credito 320 INNER JOIN 321 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 322 AND cartao_credito.documento_titular = usuarios.documento_usuario 323 WHERE 324 cartao_credito.proprietario_cartao = %s 325 AND cartao_credito.documento_titular = %s 326 AND cartao_credito.nome_cartao = %s;''' 327 328 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=5, params=(logged_user_name, logged_user_document, selected_user_card)) 329 credit_card_data = QueryExecutor().treat_numerous_simple_result(credit_card_data, to_remove_list) 330 331 with col2: 332 333 with st.spinner(text="Aguarde..."): 334 sleep(0.5) 335 336 with st.expander(label="Novos dados do cartão", expanded=True): 337 st.info(body="Nome do cartão: {}".format(selected_user_card)) 338 card_number = st.text_input(label="Número do cartão", max_chars=16, help="Informe o número do cartão sem espaços vazios.") 339 last_card_numbers = card_number[-4:] 340 expiration_date = str(st.date_input(label="Data de validade", help="Data de validade impressa no cartão.")) 341 security_code = st.text_input(label="Código de segurança", max_chars=3, type="password", key="security_code", help="Código de segurança do cartão, identificado como CVV ou CCV.") 342 confirm_security_code = st.text_input(label="Confirmação de código", max_chars=3, type="password", key="confirm_security_code", help="Deve corresponder ao código informado acima.") 343 confirm_data = st.checkbox(label="Confirmar dados", value=False) 344 345 update_card_button = st.button(label=":arrows_counterclockwise: Atualizar dados do cartão") 346 347 if confirm_data and update_card_button and security_code == confirm_security_code and card_number != "" and expiration_date > today: 348 349 with col2: 350 with st.spinner(text="Aguarde..."): 351 sleep(2.5) 352 with st.expander(label="Validação dos dados", expanded=True): 353 is_card_valid = Documents().validate_credit_card(card_number) 354 355 if is_card_valid == True: 356 357 with col2: 358 with st.spinner(text="Aguarde..."): 359 sleep(0.5) 360 with st.expander(label="Validação dos dados", expanded=True): 361 st.success(body="Número de cartão válido.") 362 363 update_card_query = '''UPDATE cartao_credito SET numero_cartao = %s, data_validade = %s, codigo_seguranca = %s WHERE nome_cartao = %s;''' 364 update_card_values = (card_number, expiration_date, security_code, selected_user_card) 365 366 QueryExecutor().insert_query(query=update_card_query, values=update_card_values, success_message="Cartão atualizado com sucesso!", error_message="Erro ao atualizar cartão:") 367 368 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 369 log_values = (logged_user, "Atualização", "Atualizou os dados do cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 370 371 QueryExecutor().insert_query(query=log_query, values=log_values, success_message="Log gravado.", error_message="Erro ao gravar log:") 372 373 elif is_card_valid == False: 374 with col2: 375 with st.spinner(text="Aguarde..."): 376 sleep(0.5) 377 with st.expander(label="Validação dos dados", expanded=True): 378 st.error(body="Número de cartão inválido.") 379 380 elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False: 381 with col2: 382 with st.spinner(text="Aguarde..."): 383 sleep(0.5) 384 with st.expander(label="Validação dos dados", expanded=True): 385 st.error(body="A senha informada é inválida.") 386 387 elif safe_password != confirm_safe_password: 388 with col2: 389 with st.spinner(text="Aguarde..."): 390 sleep(0.5) 391 with st.expander(label="Validação dos dados", expanded=True): 392 st.error(body="As senhas informadas não coincidem.") 393 394 else: 395 col1, col2, col3 = st.columns(3) 396 with col2: 397 st.warning(body="Você ainda não possui cartões cadastrados.")
Função para a atualização de um cartão de crédito.
def
delete_credit_card(self):
399 def delete_credit_card(self): 400 """ 401 Função para a exclusão de um cartão de crédito. 402 """ 403 logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name") 404 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 405 406 user_credit_cards_number = self.get_user_credit_cards_number() 407 408 st.divider() 409 410 if user_credit_cards_number > 0: 411 col1, col2 = st.columns(2) 412 credit_cards_options = self.get_credit_cards_names() 413 414 with col1: 415 416 with st.expander(label="Consulta", expanded=True): 417 selected_user_card = st.selectbox(label="Selecione o cartão", options=credit_cards_options) 418 safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.") 419 confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.") 420 confirm_selection = st.checkbox(label="Confirmar seleção") 421 422 if confirm_selection: 423 424 is_password_valid, hashed_password = Login().check_login(logged_user, safe_password) 425 426 if confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == True: 427 card_field_names = ["Cartão", "Nome do titular no cartão", "Data da validade", "Código de segurança"] 428 429 credit_card_data_query = ''' 430 SELECT 431 CONCAT(cartao_credito.numero_cartao, ' - ', cartao_credito.nome_cartao), 432 cartao_credito.nome_titular, 433 DATE_FORMAT(cartao_credito.data_validade, '%d/%m/%Y'), 434 cartao_credito.codigo_seguranca 435 FROM 436 cartao_credito 437 INNER JOIN 438 usuarios ON cartao_credito.proprietario_cartao = usuarios.nome 439 AND cartao_credito.documento_titular = usuarios.documento_usuario 440 WHERE 441 cartao_credito.proprietario_cartao = %s 442 AND cartao_credito.documento_titular = %s 443 AND cartao_credito.nome_cartao = %s;''' 444 445 credit_card_data = QueryExecutor().complex_compund_query(query=credit_card_data_query, list_quantity=4, params=(logged_user_name, logged_user_document, selected_user_card)) 446 credit_card_data = QueryExecutor().treat_numerous_simple_result(values_to_treat=credit_card_data, values_to_remove=to_remove_list) 447 448 with col2: 449 with st.spinner(text="Aguarde..."): 450 sleep(0.5) 451 452 with st.expander(label="Dados do cartão", expanded=True): 453 for i in range(0, len(credit_card_data)): 454 st.write(card_field_names[i]) 455 st.code(credit_card_data[i]) 456 confirm_card_exclusion = st.checkbox(label="Confirmar exclusão") 457 458 delete_credit_card_button = st.button(label=":wastebasket: Deletar cartão") 459 460 if confirm_card_exclusion and delete_credit_card_button: 461 462 with col2: 463 with st.spinner(text="Aguarde..."): 464 sleep(2.5) 465 466 delete_card_query = '''DELETE cartao_credito FROM cartao_credito WHERE nome_cartao = %s AND proprietario_cartao = %s AND documento_titular = %s;''' 467 delete_card_values = (selected_user_card, logged_user_name, logged_user_document) 468 469 QueryExecutor().insert_query(query=delete_card_query, values=delete_card_values, success_message="Cartão excluído com sucesso!", error_message="Erro ao excluir cartão:") 470 471 last_card_numbers = str(credit_card_data[1])[-4:] 472 log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)''' 473 log_values = (logged_user, "Exclusão", "Excluiu cartão {} com o final {}.".format(credit_card_data[0], last_card_numbers)) 474 475 QueryExecutor().insert_query(log_query, log_values,"Log gravado.", "Erro ao gravar log:") 476 477 elif delete_credit_card_button and confirm_card_exclusion == False: 478 with col1: 479 with st.expander(label="Aviso", expanded=True): 480 st.warning(body="Confirme a exclusão da senha antes de prosseguir.") 481 482 elif confirm_safe_password != "" and safe_password != "" and confirm_safe_password == safe_password and is_password_valid == False: 483 with col2: 484 with st.spinner(text="Aguarde..."): 485 sleep(0.5) 486 with st.expander(label="Validação dos dados", expanded=True): 487 st.error(body="A senha informada é inválida.") 488 489 if safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password: 490 with col2: 491 with st.spinner(text="Aguarde..."): 492 sleep(0.5) 493 with st.expander(label="Validação dos dados", expanded=True): 494 st.error(body="As senhas informadas não coincidem.") 495 496 else: 497 col1, col2, col3 = st.columns(3) 498 499 with col2: 500 st.warning(body="Você ainda não possui cartões cadastrados.")
Função para a exclusão de um cartão de crédito.