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.

def main_menu(self):
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()

Menu Principal.