source.bank_accounts

  1from dictionary.sql import check_user_bank_accounts_query, search_bank_accounts_query
  2from dictionary.vars import financial_institution_list, to_remove_list, bank_account_field_names
  3from functions.query_executor import QueryExecutor
  4from functions.login import Login
  5from time import sleep
  6import streamlit as st
  7
  8
  9class BankAccount:
 10    """
 11    Classe que representa as contas bancárias, com as quatro funções básicas de um CRUD.
 12    """
 13    def check_if_bank_account_name_already_exists(self, bank_account_name: str):
 14        """
 15        Verifica se o nome da conta bancária já foi utilizado anteriormente.
 16
 17        Returns
 18        -------
 19        is_bank_account_name_available : bool
 20            Se o nome de conta bancária está disponível ou não.
 21        """
 22        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
 23
 24        is_bank_account_name_available: bool
 25
 26        bank_accounts_with_parameter_name_query = """SELECT COUNT(id_conta) FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;"""
 27        query_values = (bank_account_name, logged_user_name, logged_user_document)
 28
 29        bank_accounts_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=bank_accounts_with_parameter_name_query, params=query_values)
 30        bank_accounts_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=bank_accounts_with_parameter_name_quantity, values_to_remove=to_remove_list)
 31        bank_accounts_with_parameter_name_quantity = int(bank_accounts_with_parameter_name_quantity)
 32
 33        if bank_accounts_with_parameter_name_quantity == 0:
 34            is_bank_account_name_available = True
 35        else:
 36            is_bank_account_name_available = False
 37
 38        return is_bank_account_name_available
 39
 40    def get_user_accounts_quantity(self):
 41        """
 42        Consulta a quantidade de contas registradas pelo usuário.
 43
 44        Returns
 45        -------
 46        user_accounts_quantity : int
 47            Quantidade de contas registradas pelo usuário.
 48        """
 49        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 50
 51        user_accounts_quantity = QueryExecutor().simple_consult_query(check_user_bank_accounts_query, params=(logged_user_name, logged_user_document))
 52        user_accounts_quantity = QueryExecutor().treat_simple_result(user_accounts_quantity, to_remove_list)
 53        user_accounts_quantity = int(user_accounts_quantity)
 54
 55        return user_accounts_quantity
 56
 57    def get_user_bank_accounts(self):
 58        """
 59        Consulta o nome das contas bancárias do usuário.
 60
 61        Returns
 62        -------
 63        bank_accounts : list
 64            Lista com os nomes das contas bancárias.
 65        """
 66        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 67
 68        user_bank_accounts = []
 69
 70        bank_accounts = QueryExecutor().complex_consult_query(query=search_bank_accounts_query, params=(logged_user_name, logged_user_document))
 71        bank_accounts = QueryExecutor().treat_numerous_simple_result(bank_accounts, to_remove_list)
 72
 73        for i in range(0, len(bank_accounts)):
 74            user_bank_accounts.append(bank_accounts[i])
 75
 76        return bank_accounts
 77
 78    def create_new_bank_account(self):
 79        """
 80        Função para criação de uma nova conta.
 81        """
 82        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 83        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 84
 85        col1, col2, col3 = st.columns(3)
 86
 87        with col1:
 88            with st.expander(label="Dados da Conta", expanded=True):
 89                account_name = st.text_input(label="Nome", max_chars=100, placeholder='Conta',help="Necessário para identificação. A sugestão é informar algo direto e descritivo, como por exemplo 'Conta Corrente BB'.")
 90                financial_institution = st.selectbox(label='Instituição', options=financial_institution_list, help='Insituição financeira a qual pertence a conta.')
 91                financial_institution_code = st.text_input(label="Código da instituição", max_chars=5, help="Código da insituição financiera no SPB (Sistemas de Pagamentos Brasileiro).")
 92                agency = st.text_input(label="Agência", max_chars=10, help="Número da agência.")
 93
 94            confirm_data = st.checkbox(label="Confirmar dados")
 95
 96        with col2:
 97            with st.expander(label="Dados da Conta", expanded=True):
 98                account_number = st.text_input(label="Número da conta", max_chars=15, help="Número de identificação da conta.")
 99                account_digit = st.text_input(label="Dígito", max_chars=1, placeholder='0', help='Dígito identificador da conta. Caso não haja, preencha como 0.')
100                account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
101                digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
102
103            register_new_account = st.button(
104                label=":floppy_disk: Cadastrar conta")
105
106            if confirm_data == True and register_new_account:
107                with col3:
108                    with st.spinner(text='Aguarde...'):
109                        sleep(2.5)
110
111                is_bank_account_name_available = self.check_if_bank_account_name_already_exists(
112                    bank_account_name=account_name)
113
114                if is_bank_account_name_available:
115                    with col3:
116                        with st.expander(label="Validação de dados", expanded=True):
117                            st.success(body="Nome de conta válida.")
118
119                    insert_password_query = "INSERT INTO contas_bancarias(nome_conta, instituicao_financeira, codigo_instituicao_financeira, agencia, numero_conta, digito_conta, senha_bancaria_conta, senha_digital_conta, nome_proprietario_conta, documento_proprietario_conta) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
120                    query_values = (account_name, financial_institution, financial_institution_code, agency, account_number, account_digit, account_password, digital_account_password, logged_user_name, logged_user_document)
121
122                    QueryExecutor().insert_query(insert_password_query, query_values, 'Conta cadastrada com sucesso!', 'Erro ao cadastrar conta:')
123
124                    log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
125                    log_query_values = (logged_user, 'Cadastro', 'Cadastrou a conta {}'.format(query_values[0]))
126                    QueryExecutor().insert_query(query=log_query, values=log_query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
127
128                else:
129                    with col3:
130                        with st.expander(label="Validação de dados", expanded=True):
131                            st.error(body="O nome da conta já está sendo utilizado.")
132
133            elif register_new_account and confirm_data == False:
134                with col3:
135                    with st.spinner(text="Aguarde..."):
136                        sleep(0.5)
137                    with st.expander(label="Validação de dados", expanded=True):
138                        st.warning(body="Você deve confirmar os dados antes de prosseguir.")
139
140    def read_bank_accounts(self):
141        """
142        Função para a consulta de uma conta bancária.
143        """
144        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
145        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
146
147        user_accounts_quantity = self.get_user_accounts_quantity()
148
149        if user_accounts_quantity == 0:
150            col1, col2, col3 = st.columns(3)
151            with col2:
152                st.warning(body="Você ainda não possui contas cadastradas.")
153
154        elif user_accounts_quantity >= 1:
155            col1, col2 = st.columns(2)
156            user_bank_accounts = self.get_user_bank_accounts()
157
158            with col1:
159                with st.expander(label="Dados", expanded=True):
160                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
161                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
162                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
163                    confirm_password_selection = st.checkbox(label="Confirmar seleção")
164
165                consult_button = st.button(label=":file_folder: Consultar conta")
166
167            account_details_query = '''
168            SELECT 
169                CONCAT('Conta: ',
170                        contas_bancarias.nome_conta,
171                        ' - Instituição: ',
172                        contas_bancarias.instituicao_financeira),
173                contas_bancarias.agencia,
174                CONCAT('',
175                        contas_bancarias.numero_conta,
176                        '-',
177                        contas_bancarias.digito_conta),
178                contas_bancarias.senha_bancaria_conta,
179                contas_bancarias.senha_digital_conta
180            FROM
181                contas_bancarias
182            WHERE
183                contas_bancarias.nome_conta = %s
184                    AND contas_bancarias.nome_proprietario_conta = %s
185                    AND contas_bancarias.documento_proprietario_conta = %s;'''
186
187            result_list = QueryExecutor().complex_consult_query(query=account_details_query,params=(selected_option, logged_user_name, logged_user_document))
188            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
189
190            if confirm_password_selection and consult_button:
191
192                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
193
194                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
195
196                    with col2:
197                        with st.spinner(text="Aguarde..."):
198                            sleep(2.5)
199
200                        with st.expander(label="Dados", expanded=True):
201
202                            aux_string = ''
203
204                            for i in range(0, len(result_list)):
205
206                                st.write(bank_account_field_names[i])
207                                aux_string = str(result_list[i])
208                                aux_string = aux_string.replace('"', '')
209                                if aux_string.startswith('b'):
210                                    aux_string = aux_string[1:]
211                                st.code(body="{}".format(aux_string))
212
213                            log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
214                            query_values = (logged_user, 'Consulta', 'Consultou a conta bancária {}'.format(selected_option))
215                            QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
216
217                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
218
219                    with col2:
220                        with st.spinner(text="Aguarde..."):
221                            sleep(0.5)
222                        with st.expander(label="Validação dos dados", expanded=True):
223                            st.error(body="A senha informada é inválida.")
224
225                elif safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password:
226                    with col2:
227                        with st.spinner(text="Aguarde..."):
228                            sleep(0.5)
229                        with st.expander(label="Validação dos dados", expanded=True):
230                            st.error(body="As senhas informadas não coincidem.")
231
232            elif confirm_password_selection == False and consult_button:
233                with col2:
234                    st.warning(body="Confirme a seleção da conta.")
235
236    def update_bank_account(self):
237        """
238        Função para a atualização de uma conta bancária.
239        """
240        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
241        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
242
243        user_accounts_quantity = self.get_user_accounts_quantity()
244
245        if user_accounts_quantity == 0:
246            col1, col2, col3 = st.columns(3)
247            with col2:
248                st.warning(body="Você ainda não possui contas cadastradas.")
249
250        elif user_accounts_quantity >= 1:
251            col1, col2 = st.columns(2)
252            user_bank_accounts = self.get_user_bank_accounts()
253
254            with col1:
255                with st.expander(label="Dados", expanded=True):
256                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
257                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
258                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
259                    confirm_selection = st.checkbox(label="Confirmar seleção")
260
261            account_details_query = '''
262            SELECT 
263                CONCAT('Conta: ',
264                        contas_bancarias.nome_conta,
265                        ' - Instituição: ',
266                        contas_bancarias.instituicao_financeira),
267                contas_bancarias.agencia,
268                CONCAT('',
269                        contas_bancarias.numero_conta,
270                        '-',
271                        contas_bancarias.digito_conta),
272                contas_bancarias.senha_bancaria_conta,
273                contas_bancarias.senha_digital_conta
274            FROM
275                contas_bancarias
276            WHERE
277                contas_bancarias.nome_conta = %s
278                    AND contas_bancarias.nome_proprietario_conta = %s
279                    AND contas_bancarias.documento_proprietario_conta = %s;'''
280
281            result_list = QueryExecutor().complex_consult_query(query=account_details_query, params=(selected_option, logged_user_name, logged_user_document))
282            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
283
284            if confirm_selection:
285
286                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
287
288                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
289
290                    with col2:
291                        with st.spinner(text="Aguarde..."):
292                            sleep(0.5)
293
294                        with st.expander(label="Novos Dados", expanded=True):
295
296                            aux_string = ''
297
298                            for i in range(0, 3):
299
300                                st.write(bank_account_field_names[i])
301                                aux_string = str(result_list[i])
302                                aux_string = aux_string.replace('"', '')
303                                if aux_string.startswith('b'):
304                                    aux_string = aux_string[1:]
305                                st.code(body="{}".format(aux_string))
306
307                            account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
308                            digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
309
310                            confirm_new_bank_account_data = st.checkbox(label="Confirmar novos dados")
311
312                        update_bank_account_button = st.button(label=":arrows_counterclockwise: Atualizar dados da conta")
313
314                    if confirm_new_bank_account_data and update_bank_account_button and account_password != "" and digital_account_password != "":
315                        with col1:
316                            with st.spinner(text="Aguarde..."):
317                                sleep(2.5)
318
319                        update_account_query = '''UPDATE contas_bancarias SET senha_bancaria_conta = %s, senha_digital_conta = %s WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
320                        update_account_values = (account_password, digital_account_password, selected_option, logged_user_name, logged_user_document)
321
322                        QueryExecutor().insert_query(query=update_account_query, values=update_account_values, success_message="Conta atualizada com sucesso!", error_message="Erro ao atualizar conta:")
323
324                        log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
325                        query_values = (logged_user, 'Atualização', 'Atualizou a conta bancária {}'.format(selected_option))
326                        QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
327
328                    elif confirm_new_bank_account_data == False and update_bank_account_button and account_password != "" and digital_account_password != "":
329                        with col2:
330                            with st.expander(label="Validação dos dados", expanded=True):
331                                st.warning(body="Confirme os novos dados da conta.")
332
333                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
334                    with col2:
335                        with st.spinner(text="Aguarde..."):
336                            sleep(0.5)
337                        with st.expander(label="Validação dos dados", expanded=True):
338                            st.error(body="A senha informada é inválida.")
339
340                elif safe_password != confirm_safe_password:
341                    with col2:
342                        with st.spinner(text="Aguarde..."):
343                            sleep(0.5)
344                        with st.expander(label="Validação dos dados", expanded=True):
345                            st.error(body="As senhas informadas não coincidem.")
346
347    def delete_bank_account(self):
348        """
349        Função para a exclusão de uma conta bancária.
350        """
351        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
352        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
353
354        user_accounts_quantity = self.get_user_accounts_quantity()
355
356        if user_accounts_quantity == 0:
357            col1, col2, col3 = st.columns(3)
358            with col2:
359                st.warning(body="Você ainda não possui contas cadastradas.")
360
361        elif user_accounts_quantity >= 1:
362            col1, col2 = st.columns(2)
363            user_bank_accounts = self.get_user_bank_accounts()
364
365            with col1:
366                with st.expander(label="Dados", expanded=True):
367                    selected_option = st.selectbox(
368                        label="Selecione a conta", options=user_bank_accounts)
369                    safe_password = st.text_input(
370                        label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
371                    confirm_safe_password = st.text_input(
372                        label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
373                    confirm_password_selection = st.checkbox(
374                        label="Confirmar seleção")
375
376            account_details_query = '''
377            SELECT 
378                CONCAT('Conta: ',
379                        contas_bancarias.nome_conta,
380                        ' - Instituição: ',
381                        contas_bancarias.instituicao_financeira),
382                contas_bancarias.agencia,
383                CONCAT('',
384                        contas_bancarias.numero_conta,
385                        '-',
386                        contas_bancarias.digito_conta),
387                contas_bancarias.senha_bancaria_conta,
388                contas_bancarias.senha_digital_conta
389            FROM
390                contas_bancarias
391            WHERE
392                contas_bancarias.nome_conta = %s
393                    AND contas_bancarias.nome_proprietario_conta = %s
394                    AND contas_bancarias.documento_proprietario_conta = %s;'''
395
396            result_list = QueryExecutor().complex_consult_query(query=account_details_query,
397                                                                params=(selected_option, logged_user_name, logged_user_document))
398            result_list = QueryExecutor().treat_complex_result(
399                values_to_treat=result_list, values_to_remove=to_remove_list)
400
401            if confirm_password_selection:
402
403                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
404
405                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
406
407                    with col2:
408                        with st.spinner(text="Aguarde..."):
409                            sleep(0.5)
410
411                        with st.expander(label="Dados", expanded=True):
412
413                            aux_string = ''
414
415                            for i in range(0, len(result_list)):
416
417                                st.write(bank_account_field_names[i])
418                                aux_string = str(result_list[i])
419                                aux_string = aux_string.replace('"', '')
420                                if aux_string.startswith('b'):
421                                    aux_string = aux_string[1:]
422                                st.code(body="{}".format(aux_string))
423
424                            confirm_account_deletion = st.checkbox(
425                                label="Confirmar exclusão da conta")
426
427                        delete_account_button = st.button(
428                            label=":wastebasket: Deletar conta")
429
430                        if delete_account_button and confirm_account_deletion:
431
432                            with col2:
433                                with st.spinner(text="Aguarde..."):
434                                    sleep(2.5)
435
436                                delete_account_query = '''DELETE contas_bancarias FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
437                                delete_account_values = (
438                                    selected_option, logged_user_name, logged_user_document)
439
440                                QueryExecutor().insert_query(query=delete_account_query, values=delete_account_values,
441                                                             success_message="Conta excluída com sucesso!", error_message="Erro ao excluir conta:")
442
443                                log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
444                                query_values = (
445                                    logged_user, 'Exclusão', 'Excluiu a conta bancária {}'.format(selected_option))
446                                QueryExecutor().insert_query(query=log_query, values=query_values,
447                                                             success_message='Log gravado.', error_message='Erro ao gravar log:')
448
449                        elif delete_account_button and confirm_account_deletion == False:
450                            with col2:
451                                with st.expander(label="Validação dos dados", expanded=True):
452                                    st.warning(
453                                        body="Confirme a exclusão da conta.")
454
455                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
456                    with col2:
457                        with st.spinner(text="Aguarde..."):
458                            sleep(0.5)
459                        with st.expander(label="Validação dos dados", expanded=True):
460                            st.error(body="A senha informada é inválida.")
461
462                elif safe_password != confirm_safe_password:
463                    with col2:
464                        with st.spinner(text="Aguarde..."):
465                            sleep(0.5)
466                        with st.expander(label="Validação dos dados", expanded=True):
467                            st.error(
468                                body="As senhas informadas não coincidem.")
469
470    def main_menu(self):
471        """
472        Menu Principal.
473        """
474
475        col1, col2, col3 = st.columns(3)
476
477        with col1:
478            st.header(body=":bank: Contas Bancárias")
479
480        with col2:
481            menu_options = ["Cadastrar conta", "Consultar conta",
482                            "Atualizar conta", "Deletar conta"]
483            selected_option = st.selectbox(label="Menu", options=menu_options)
484
485        st.divider()
486
487        if selected_option == menu_options[0]:
488            self.create_new_bank_account()
489
490        if selected_option == menu_options[1]:
491            self.read_bank_accounts()
492
493        if selected_option == menu_options[2]:
494            self.update_bank_account()
495
496        if selected_option == menu_options[3]:
497            self.delete_bank_account()
class BankAccount:
 10class BankAccount:
 11    """
 12    Classe que representa as contas bancárias, com as quatro funções básicas de um CRUD.
 13    """
 14    def check_if_bank_account_name_already_exists(self, bank_account_name: str):
 15        """
 16        Verifica se o nome da conta bancária já foi utilizado anteriormente.
 17
 18        Returns
 19        -------
 20        is_bank_account_name_available : bool
 21            Se o nome de conta bancária está disponível ou não.
 22        """
 23        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
 24
 25        is_bank_account_name_available: bool
 26
 27        bank_accounts_with_parameter_name_query = """SELECT COUNT(id_conta) FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;"""
 28        query_values = (bank_account_name, logged_user_name, logged_user_document)
 29
 30        bank_accounts_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=bank_accounts_with_parameter_name_query, params=query_values)
 31        bank_accounts_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=bank_accounts_with_parameter_name_quantity, values_to_remove=to_remove_list)
 32        bank_accounts_with_parameter_name_quantity = int(bank_accounts_with_parameter_name_quantity)
 33
 34        if bank_accounts_with_parameter_name_quantity == 0:
 35            is_bank_account_name_available = True
 36        else:
 37            is_bank_account_name_available = False
 38
 39        return is_bank_account_name_available
 40
 41    def get_user_accounts_quantity(self):
 42        """
 43        Consulta a quantidade de contas registradas pelo usuário.
 44
 45        Returns
 46        -------
 47        user_accounts_quantity : int
 48            Quantidade de contas registradas pelo usuário.
 49        """
 50        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 51
 52        user_accounts_quantity = QueryExecutor().simple_consult_query(check_user_bank_accounts_query, params=(logged_user_name, logged_user_document))
 53        user_accounts_quantity = QueryExecutor().treat_simple_result(user_accounts_quantity, to_remove_list)
 54        user_accounts_quantity = int(user_accounts_quantity)
 55
 56        return user_accounts_quantity
 57
 58    def get_user_bank_accounts(self):
 59        """
 60        Consulta o nome das contas bancárias do usuário.
 61
 62        Returns
 63        -------
 64        bank_accounts : list
 65            Lista com os nomes das contas bancárias.
 66        """
 67        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 68
 69        user_bank_accounts = []
 70
 71        bank_accounts = QueryExecutor().complex_consult_query(query=search_bank_accounts_query, params=(logged_user_name, logged_user_document))
 72        bank_accounts = QueryExecutor().treat_numerous_simple_result(bank_accounts, to_remove_list)
 73
 74        for i in range(0, len(bank_accounts)):
 75            user_bank_accounts.append(bank_accounts[i])
 76
 77        return bank_accounts
 78
 79    def create_new_bank_account(self):
 80        """
 81        Função para criação de uma nova conta.
 82        """
 83        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 84        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 85
 86        col1, col2, col3 = st.columns(3)
 87
 88        with col1:
 89            with st.expander(label="Dados da Conta", expanded=True):
 90                account_name = st.text_input(label="Nome", max_chars=100, placeholder='Conta',help="Necessário para identificação. A sugestão é informar algo direto e descritivo, como por exemplo 'Conta Corrente BB'.")
 91                financial_institution = st.selectbox(label='Instituição', options=financial_institution_list, help='Insituição financeira a qual pertence a conta.')
 92                financial_institution_code = st.text_input(label="Código da instituição", max_chars=5, help="Código da insituição financiera no SPB (Sistemas de Pagamentos Brasileiro).")
 93                agency = st.text_input(label="Agência", max_chars=10, help="Número da agência.")
 94
 95            confirm_data = st.checkbox(label="Confirmar dados")
 96
 97        with col2:
 98            with st.expander(label="Dados da Conta", expanded=True):
 99                account_number = st.text_input(label="Número da conta", max_chars=15, help="Número de identificação da conta.")
100                account_digit = st.text_input(label="Dígito", max_chars=1, placeholder='0', help='Dígito identificador da conta. Caso não haja, preencha como 0.')
101                account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
102                digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
103
104            register_new_account = st.button(
105                label=":floppy_disk: Cadastrar conta")
106
107            if confirm_data == True and register_new_account:
108                with col3:
109                    with st.spinner(text='Aguarde...'):
110                        sleep(2.5)
111
112                is_bank_account_name_available = self.check_if_bank_account_name_already_exists(
113                    bank_account_name=account_name)
114
115                if is_bank_account_name_available:
116                    with col3:
117                        with st.expander(label="Validação de dados", expanded=True):
118                            st.success(body="Nome de conta válida.")
119
120                    insert_password_query = "INSERT INTO contas_bancarias(nome_conta, instituicao_financeira, codigo_instituicao_financeira, agencia, numero_conta, digito_conta, senha_bancaria_conta, senha_digital_conta, nome_proprietario_conta, documento_proprietario_conta) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
121                    query_values = (account_name, financial_institution, financial_institution_code, agency, account_number, account_digit, account_password, digital_account_password, logged_user_name, logged_user_document)
122
123                    QueryExecutor().insert_query(insert_password_query, query_values, 'Conta cadastrada com sucesso!', 'Erro ao cadastrar conta:')
124
125                    log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
126                    log_query_values = (logged_user, 'Cadastro', 'Cadastrou a conta {}'.format(query_values[0]))
127                    QueryExecutor().insert_query(query=log_query, values=log_query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
128
129                else:
130                    with col3:
131                        with st.expander(label="Validação de dados", expanded=True):
132                            st.error(body="O nome da conta já está sendo utilizado.")
133
134            elif register_new_account and confirm_data == False:
135                with col3:
136                    with st.spinner(text="Aguarde..."):
137                        sleep(0.5)
138                    with st.expander(label="Validação de dados", expanded=True):
139                        st.warning(body="Você deve confirmar os dados antes de prosseguir.")
140
141    def read_bank_accounts(self):
142        """
143        Função para a consulta de uma conta bancária.
144        """
145        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
146        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
147
148        user_accounts_quantity = self.get_user_accounts_quantity()
149
150        if user_accounts_quantity == 0:
151            col1, col2, col3 = st.columns(3)
152            with col2:
153                st.warning(body="Você ainda não possui contas cadastradas.")
154
155        elif user_accounts_quantity >= 1:
156            col1, col2 = st.columns(2)
157            user_bank_accounts = self.get_user_bank_accounts()
158
159            with col1:
160                with st.expander(label="Dados", expanded=True):
161                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
162                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
163                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
164                    confirm_password_selection = st.checkbox(label="Confirmar seleção")
165
166                consult_button = st.button(label=":file_folder: Consultar conta")
167
168            account_details_query = '''
169            SELECT 
170                CONCAT('Conta: ',
171                        contas_bancarias.nome_conta,
172                        ' - Instituição: ',
173                        contas_bancarias.instituicao_financeira),
174                contas_bancarias.agencia,
175                CONCAT('',
176                        contas_bancarias.numero_conta,
177                        '-',
178                        contas_bancarias.digito_conta),
179                contas_bancarias.senha_bancaria_conta,
180                contas_bancarias.senha_digital_conta
181            FROM
182                contas_bancarias
183            WHERE
184                contas_bancarias.nome_conta = %s
185                    AND contas_bancarias.nome_proprietario_conta = %s
186                    AND contas_bancarias.documento_proprietario_conta = %s;'''
187
188            result_list = QueryExecutor().complex_consult_query(query=account_details_query,params=(selected_option, logged_user_name, logged_user_document))
189            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
190
191            if confirm_password_selection and consult_button:
192
193                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
194
195                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
196
197                    with col2:
198                        with st.spinner(text="Aguarde..."):
199                            sleep(2.5)
200
201                        with st.expander(label="Dados", expanded=True):
202
203                            aux_string = ''
204
205                            for i in range(0, len(result_list)):
206
207                                st.write(bank_account_field_names[i])
208                                aux_string = str(result_list[i])
209                                aux_string = aux_string.replace('"', '')
210                                if aux_string.startswith('b'):
211                                    aux_string = aux_string[1:]
212                                st.code(body="{}".format(aux_string))
213
214                            log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
215                            query_values = (logged_user, 'Consulta', 'Consultou a conta bancária {}'.format(selected_option))
216                            QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
217
218                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
219
220                    with col2:
221                        with st.spinner(text="Aguarde..."):
222                            sleep(0.5)
223                        with st.expander(label="Validação dos dados", expanded=True):
224                            st.error(body="A senha informada é inválida.")
225
226                elif safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password:
227                    with col2:
228                        with st.spinner(text="Aguarde..."):
229                            sleep(0.5)
230                        with st.expander(label="Validação dos dados", expanded=True):
231                            st.error(body="As senhas informadas não coincidem.")
232
233            elif confirm_password_selection == False and consult_button:
234                with col2:
235                    st.warning(body="Confirme a seleção da conta.")
236
237    def update_bank_account(self):
238        """
239        Função para a atualização de uma conta bancária.
240        """
241        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
242        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
243
244        user_accounts_quantity = self.get_user_accounts_quantity()
245
246        if user_accounts_quantity == 0:
247            col1, col2, col3 = st.columns(3)
248            with col2:
249                st.warning(body="Você ainda não possui contas cadastradas.")
250
251        elif user_accounts_quantity >= 1:
252            col1, col2 = st.columns(2)
253            user_bank_accounts = self.get_user_bank_accounts()
254
255            with col1:
256                with st.expander(label="Dados", expanded=True):
257                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
258                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
259                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
260                    confirm_selection = st.checkbox(label="Confirmar seleção")
261
262            account_details_query = '''
263            SELECT 
264                CONCAT('Conta: ',
265                        contas_bancarias.nome_conta,
266                        ' - Instituição: ',
267                        contas_bancarias.instituicao_financeira),
268                contas_bancarias.agencia,
269                CONCAT('',
270                        contas_bancarias.numero_conta,
271                        '-',
272                        contas_bancarias.digito_conta),
273                contas_bancarias.senha_bancaria_conta,
274                contas_bancarias.senha_digital_conta
275            FROM
276                contas_bancarias
277            WHERE
278                contas_bancarias.nome_conta = %s
279                    AND contas_bancarias.nome_proprietario_conta = %s
280                    AND contas_bancarias.documento_proprietario_conta = %s;'''
281
282            result_list = QueryExecutor().complex_consult_query(query=account_details_query, params=(selected_option, logged_user_name, logged_user_document))
283            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
284
285            if confirm_selection:
286
287                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
288
289                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
290
291                    with col2:
292                        with st.spinner(text="Aguarde..."):
293                            sleep(0.5)
294
295                        with st.expander(label="Novos Dados", expanded=True):
296
297                            aux_string = ''
298
299                            for i in range(0, 3):
300
301                                st.write(bank_account_field_names[i])
302                                aux_string = str(result_list[i])
303                                aux_string = aux_string.replace('"', '')
304                                if aux_string.startswith('b'):
305                                    aux_string = aux_string[1:]
306                                st.code(body="{}".format(aux_string))
307
308                            account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
309                            digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
310
311                            confirm_new_bank_account_data = st.checkbox(label="Confirmar novos dados")
312
313                        update_bank_account_button = st.button(label=":arrows_counterclockwise: Atualizar dados da conta")
314
315                    if confirm_new_bank_account_data and update_bank_account_button and account_password != "" and digital_account_password != "":
316                        with col1:
317                            with st.spinner(text="Aguarde..."):
318                                sleep(2.5)
319
320                        update_account_query = '''UPDATE contas_bancarias SET senha_bancaria_conta = %s, senha_digital_conta = %s WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
321                        update_account_values = (account_password, digital_account_password, selected_option, logged_user_name, logged_user_document)
322
323                        QueryExecutor().insert_query(query=update_account_query, values=update_account_values, success_message="Conta atualizada com sucesso!", error_message="Erro ao atualizar conta:")
324
325                        log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
326                        query_values = (logged_user, 'Atualização', 'Atualizou a conta bancária {}'.format(selected_option))
327                        QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
328
329                    elif confirm_new_bank_account_data == False and update_bank_account_button and account_password != "" and digital_account_password != "":
330                        with col2:
331                            with st.expander(label="Validação dos dados", expanded=True):
332                                st.warning(body="Confirme os novos dados da conta.")
333
334                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
335                    with col2:
336                        with st.spinner(text="Aguarde..."):
337                            sleep(0.5)
338                        with st.expander(label="Validação dos dados", expanded=True):
339                            st.error(body="A senha informada é inválida.")
340
341                elif safe_password != confirm_safe_password:
342                    with col2:
343                        with st.spinner(text="Aguarde..."):
344                            sleep(0.5)
345                        with st.expander(label="Validação dos dados", expanded=True):
346                            st.error(body="As senhas informadas não coincidem.")
347
348    def delete_bank_account(self):
349        """
350        Função para a exclusão de uma conta bancária.
351        """
352        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
353        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
354
355        user_accounts_quantity = self.get_user_accounts_quantity()
356
357        if user_accounts_quantity == 0:
358            col1, col2, col3 = st.columns(3)
359            with col2:
360                st.warning(body="Você ainda não possui contas cadastradas.")
361
362        elif user_accounts_quantity >= 1:
363            col1, col2 = st.columns(2)
364            user_bank_accounts = self.get_user_bank_accounts()
365
366            with col1:
367                with st.expander(label="Dados", expanded=True):
368                    selected_option = st.selectbox(
369                        label="Selecione a conta", options=user_bank_accounts)
370                    safe_password = st.text_input(
371                        label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
372                    confirm_safe_password = st.text_input(
373                        label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
374                    confirm_password_selection = st.checkbox(
375                        label="Confirmar seleção")
376
377            account_details_query = '''
378            SELECT 
379                CONCAT('Conta: ',
380                        contas_bancarias.nome_conta,
381                        ' - Instituição: ',
382                        contas_bancarias.instituicao_financeira),
383                contas_bancarias.agencia,
384                CONCAT('',
385                        contas_bancarias.numero_conta,
386                        '-',
387                        contas_bancarias.digito_conta),
388                contas_bancarias.senha_bancaria_conta,
389                contas_bancarias.senha_digital_conta
390            FROM
391                contas_bancarias
392            WHERE
393                contas_bancarias.nome_conta = %s
394                    AND contas_bancarias.nome_proprietario_conta = %s
395                    AND contas_bancarias.documento_proprietario_conta = %s;'''
396
397            result_list = QueryExecutor().complex_consult_query(query=account_details_query,
398                                                                params=(selected_option, logged_user_name, logged_user_document))
399            result_list = QueryExecutor().treat_complex_result(
400                values_to_treat=result_list, values_to_remove=to_remove_list)
401
402            if confirm_password_selection:
403
404                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
405
406                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
407
408                    with col2:
409                        with st.spinner(text="Aguarde..."):
410                            sleep(0.5)
411
412                        with st.expander(label="Dados", expanded=True):
413
414                            aux_string = ''
415
416                            for i in range(0, len(result_list)):
417
418                                st.write(bank_account_field_names[i])
419                                aux_string = str(result_list[i])
420                                aux_string = aux_string.replace('"', '')
421                                if aux_string.startswith('b'):
422                                    aux_string = aux_string[1:]
423                                st.code(body="{}".format(aux_string))
424
425                            confirm_account_deletion = st.checkbox(
426                                label="Confirmar exclusão da conta")
427
428                        delete_account_button = st.button(
429                            label=":wastebasket: Deletar conta")
430
431                        if delete_account_button and confirm_account_deletion:
432
433                            with col2:
434                                with st.spinner(text="Aguarde..."):
435                                    sleep(2.5)
436
437                                delete_account_query = '''DELETE contas_bancarias FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
438                                delete_account_values = (
439                                    selected_option, logged_user_name, logged_user_document)
440
441                                QueryExecutor().insert_query(query=delete_account_query, values=delete_account_values,
442                                                             success_message="Conta excluída com sucesso!", error_message="Erro ao excluir conta:")
443
444                                log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
445                                query_values = (
446                                    logged_user, 'Exclusão', 'Excluiu a conta bancária {}'.format(selected_option))
447                                QueryExecutor().insert_query(query=log_query, values=query_values,
448                                                             success_message='Log gravado.', error_message='Erro ao gravar log:')
449
450                        elif delete_account_button and confirm_account_deletion == False:
451                            with col2:
452                                with st.expander(label="Validação dos dados", expanded=True):
453                                    st.warning(
454                                        body="Confirme a exclusão da conta.")
455
456                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
457                    with col2:
458                        with st.spinner(text="Aguarde..."):
459                            sleep(0.5)
460                        with st.expander(label="Validação dos dados", expanded=True):
461                            st.error(body="A senha informada é inválida.")
462
463                elif safe_password != confirm_safe_password:
464                    with col2:
465                        with st.spinner(text="Aguarde..."):
466                            sleep(0.5)
467                        with st.expander(label="Validação dos dados", expanded=True):
468                            st.error(
469                                body="As senhas informadas não coincidem.")
470
471    def main_menu(self):
472        """
473        Menu Principal.
474        """
475
476        col1, col2, col3 = st.columns(3)
477
478        with col1:
479            st.header(body=":bank: Contas Bancárias")
480
481        with col2:
482            menu_options = ["Cadastrar conta", "Consultar conta",
483                            "Atualizar conta", "Deletar conta"]
484            selected_option = st.selectbox(label="Menu", options=menu_options)
485
486        st.divider()
487
488        if selected_option == menu_options[0]:
489            self.create_new_bank_account()
490
491        if selected_option == menu_options[1]:
492            self.read_bank_accounts()
493
494        if selected_option == menu_options[2]:
495            self.update_bank_account()
496
497        if selected_option == menu_options[3]:
498            self.delete_bank_account()

Classe que representa as contas bancárias, com as quatro funções básicas de um CRUD.

def check_if_bank_account_name_already_exists(self, bank_account_name: str):
14    def check_if_bank_account_name_already_exists(self, bank_account_name: str):
15        """
16        Verifica se o nome da conta bancária já foi utilizado anteriormente.
17
18        Returns
19        -------
20        is_bank_account_name_available : bool
21            Se o nome de conta bancária está disponível ou não.
22        """
23        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_login_password")
24
25        is_bank_account_name_available: bool
26
27        bank_accounts_with_parameter_name_query = """SELECT COUNT(id_conta) FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;"""
28        query_values = (bank_account_name, logged_user_name, logged_user_document)
29
30        bank_accounts_with_parameter_name_quantity = QueryExecutor().simple_consult_query(query=bank_accounts_with_parameter_name_query, params=query_values)
31        bank_accounts_with_parameter_name_quantity = QueryExecutor().treat_simple_result(value_to_treat=bank_accounts_with_parameter_name_quantity, values_to_remove=to_remove_list)
32        bank_accounts_with_parameter_name_quantity = int(bank_accounts_with_parameter_name_quantity)
33
34        if bank_accounts_with_parameter_name_quantity == 0:
35            is_bank_account_name_available = True
36        else:
37            is_bank_account_name_available = False
38
39        return is_bank_account_name_available

Verifica se o nome da conta bancária já foi utilizado anteriormente.

Returns
  • is_bank_account_name_available (bool): Se o nome de conta bancária está disponível ou não.
def get_user_accounts_quantity(self):
41    def get_user_accounts_quantity(self):
42        """
43        Consulta a quantidade de contas registradas pelo usuário.
44
45        Returns
46        -------
47        user_accounts_quantity : int
48            Quantidade de contas registradas pelo usuário.
49        """
50        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
51
52        user_accounts_quantity = QueryExecutor().simple_consult_query(check_user_bank_accounts_query, params=(logged_user_name, logged_user_document))
53        user_accounts_quantity = QueryExecutor().treat_simple_result(user_accounts_quantity, to_remove_list)
54        user_accounts_quantity = int(user_accounts_quantity)
55
56        return user_accounts_quantity

Consulta a quantidade de contas registradas pelo usuário.

Returns
  • user_accounts_quantity (int): Quantidade de contas registradas pelo usuário.
def get_user_bank_accounts(self):
58    def get_user_bank_accounts(self):
59        """
60        Consulta o nome das contas bancárias do usuário.
61
62        Returns
63        -------
64        bank_accounts : list
65            Lista com os nomes das contas bancárias.
66        """
67        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
68
69        user_bank_accounts = []
70
71        bank_accounts = QueryExecutor().complex_consult_query(query=search_bank_accounts_query, params=(logged_user_name, logged_user_document))
72        bank_accounts = QueryExecutor().treat_numerous_simple_result(bank_accounts, to_remove_list)
73
74        for i in range(0, len(bank_accounts)):
75            user_bank_accounts.append(bank_accounts[i])
76
77        return bank_accounts

Consulta o nome das contas bancárias do usuário.

Returns
  • bank_accounts (list): Lista com os nomes das contas bancárias.
def create_new_bank_account(self):
 79    def create_new_bank_account(self):
 80        """
 81        Função para criação de uma nova conta.
 82        """
 83        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
 84        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
 85
 86        col1, col2, col3 = st.columns(3)
 87
 88        with col1:
 89            with st.expander(label="Dados da Conta", expanded=True):
 90                account_name = st.text_input(label="Nome", max_chars=100, placeholder='Conta',help="Necessário para identificação. A sugestão é informar algo direto e descritivo, como por exemplo 'Conta Corrente BB'.")
 91                financial_institution = st.selectbox(label='Instituição', options=financial_institution_list, help='Insituição financeira a qual pertence a conta.')
 92                financial_institution_code = st.text_input(label="Código da instituição", max_chars=5, help="Código da insituição financiera no SPB (Sistemas de Pagamentos Brasileiro).")
 93                agency = st.text_input(label="Agência", max_chars=10, help="Número da agência.")
 94
 95            confirm_data = st.checkbox(label="Confirmar dados")
 96
 97        with col2:
 98            with st.expander(label="Dados da Conta", expanded=True):
 99                account_number = st.text_input(label="Número da conta", max_chars=15, help="Número de identificação da conta.")
100                account_digit = st.text_input(label="Dígito", max_chars=1, placeholder='0', help='Dígito identificador da conta. Caso não haja, preencha como 0.')
101                account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
102                digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
103
104            register_new_account = st.button(
105                label=":floppy_disk: Cadastrar conta")
106
107            if confirm_data == True and register_new_account:
108                with col3:
109                    with st.spinner(text='Aguarde...'):
110                        sleep(2.5)
111
112                is_bank_account_name_available = self.check_if_bank_account_name_already_exists(
113                    bank_account_name=account_name)
114
115                if is_bank_account_name_available:
116                    with col3:
117                        with st.expander(label="Validação de dados", expanded=True):
118                            st.success(body="Nome de conta válida.")
119
120                    insert_password_query = "INSERT INTO contas_bancarias(nome_conta, instituicao_financeira, codigo_instituicao_financeira, agencia, numero_conta, digito_conta, senha_bancaria_conta, senha_digital_conta, nome_proprietario_conta, documento_proprietario_conta) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
121                    query_values = (account_name, financial_institution, financial_institution_code, agency, account_number, account_digit, account_password, digital_account_password, logged_user_name, logged_user_document)
122
123                    QueryExecutor().insert_query(insert_password_query, query_values, 'Conta cadastrada com sucesso!', 'Erro ao cadastrar conta:')
124
125                    log_query = '''INSERT INTO logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
126                    log_query_values = (logged_user, 'Cadastro', 'Cadastrou a conta {}'.format(query_values[0]))
127                    QueryExecutor().insert_query(query=log_query, values=log_query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
128
129                else:
130                    with col3:
131                        with st.expander(label="Validação de dados", expanded=True):
132                            st.error(body="O nome da conta já está sendo utilizado.")
133
134            elif register_new_account and confirm_data == False:
135                with col3:
136                    with st.spinner(text="Aguarde..."):
137                        sleep(0.5)
138                    with st.expander(label="Validação de dados", expanded=True):
139                        st.warning(body="Você deve confirmar os dados antes de prosseguir.")

Função para criação de uma nova conta.

def read_bank_accounts(self):
141    def read_bank_accounts(self):
142        """
143        Função para a consulta de uma conta bancária.
144        """
145        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
146        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
147
148        user_accounts_quantity = self.get_user_accounts_quantity()
149
150        if user_accounts_quantity == 0:
151            col1, col2, col3 = st.columns(3)
152            with col2:
153                st.warning(body="Você ainda não possui contas cadastradas.")
154
155        elif user_accounts_quantity >= 1:
156            col1, col2 = st.columns(2)
157            user_bank_accounts = self.get_user_bank_accounts()
158
159            with col1:
160                with st.expander(label="Dados", expanded=True):
161                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
162                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
163                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
164                    confirm_password_selection = st.checkbox(label="Confirmar seleção")
165
166                consult_button = st.button(label=":file_folder: Consultar conta")
167
168            account_details_query = '''
169            SELECT 
170                CONCAT('Conta: ',
171                        contas_bancarias.nome_conta,
172                        ' - Instituição: ',
173                        contas_bancarias.instituicao_financeira),
174                contas_bancarias.agencia,
175                CONCAT('',
176                        contas_bancarias.numero_conta,
177                        '-',
178                        contas_bancarias.digito_conta),
179                contas_bancarias.senha_bancaria_conta,
180                contas_bancarias.senha_digital_conta
181            FROM
182                contas_bancarias
183            WHERE
184                contas_bancarias.nome_conta = %s
185                    AND contas_bancarias.nome_proprietario_conta = %s
186                    AND contas_bancarias.documento_proprietario_conta = %s;'''
187
188            result_list = QueryExecutor().complex_consult_query(query=account_details_query,params=(selected_option, logged_user_name, logged_user_document))
189            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
190
191            if confirm_password_selection and consult_button:
192
193                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
194
195                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
196
197                    with col2:
198                        with st.spinner(text="Aguarde..."):
199                            sleep(2.5)
200
201                        with st.expander(label="Dados", expanded=True):
202
203                            aux_string = ''
204
205                            for i in range(0, len(result_list)):
206
207                                st.write(bank_account_field_names[i])
208                                aux_string = str(result_list[i])
209                                aux_string = aux_string.replace('"', '')
210                                if aux_string.startswith('b'):
211                                    aux_string = aux_string[1:]
212                                st.code(body="{}".format(aux_string))
213
214                            log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
215                            query_values = (logged_user, 'Consulta', 'Consultou a conta bancária {}'.format(selected_option))
216                            QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
217
218                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
219
220                    with col2:
221                        with st.spinner(text="Aguarde..."):
222                            sleep(0.5)
223                        with st.expander(label="Validação dos dados", expanded=True):
224                            st.error(body="A senha informada é inválida.")
225
226                elif safe_password != "" and confirm_safe_password != "" and safe_password != confirm_safe_password:
227                    with col2:
228                        with st.spinner(text="Aguarde..."):
229                            sleep(0.5)
230                        with st.expander(label="Validação dos dados", expanded=True):
231                            st.error(body="As senhas informadas não coincidem.")
232
233            elif confirm_password_selection == False and consult_button:
234                with col2:
235                    st.warning(body="Confirme a seleção da conta.")

Função para a consulta de uma conta bancária.

def update_bank_account(self):
237    def update_bank_account(self):
238        """
239        Função para a atualização de uma conta bancária.
240        """
241        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
242        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
243
244        user_accounts_quantity = self.get_user_accounts_quantity()
245
246        if user_accounts_quantity == 0:
247            col1, col2, col3 = st.columns(3)
248            with col2:
249                st.warning(body="Você ainda não possui contas cadastradas.")
250
251        elif user_accounts_quantity >= 1:
252            col1, col2 = st.columns(2)
253            user_bank_accounts = self.get_user_bank_accounts()
254
255            with col1:
256                with st.expander(label="Dados", expanded=True):
257                    selected_option = st.selectbox(label="Selecione a conta", options=user_bank_accounts)
258                    safe_password = st.text_input(label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
259                    confirm_safe_password = st.text_input(label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
260                    confirm_selection = st.checkbox(label="Confirmar seleção")
261
262            account_details_query = '''
263            SELECT 
264                CONCAT('Conta: ',
265                        contas_bancarias.nome_conta,
266                        ' - Instituição: ',
267                        contas_bancarias.instituicao_financeira),
268                contas_bancarias.agencia,
269                CONCAT('',
270                        contas_bancarias.numero_conta,
271                        '-',
272                        contas_bancarias.digito_conta),
273                contas_bancarias.senha_bancaria_conta,
274                contas_bancarias.senha_digital_conta
275            FROM
276                contas_bancarias
277            WHERE
278                contas_bancarias.nome_conta = %s
279                    AND contas_bancarias.nome_proprietario_conta = %s
280                    AND contas_bancarias.documento_proprietario_conta = %s;'''
281
282            result_list = QueryExecutor().complex_consult_query(query=account_details_query, params=(selected_option, logged_user_name, logged_user_document))
283            result_list = QueryExecutor().treat_complex_result(values_to_treat=result_list, values_to_remove=to_remove_list)
284
285            if confirm_selection:
286
287                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
288
289                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
290
291                    with col2:
292                        with st.spinner(text="Aguarde..."):
293                            sleep(0.5)
294
295                        with st.expander(label="Novos Dados", expanded=True):
296
297                            aux_string = ''
298
299                            for i in range(0, 3):
300
301                                st.write(bank_account_field_names[i])
302                                aux_string = str(result_list[i])
303                                aux_string = aux_string.replace('"', '')
304                                if aux_string.startswith('b'):
305                                    aux_string = aux_string[1:]
306                                st.code(body="{}".format(aux_string))
307
308                            account_password = st.text_input(label="Senha da conta", max_chars=30, type='password', help='Senha utilizada para saques e demais operações em terminais físicos.')
309                            digital_account_password = st.text_input(label="Senha digital da conta", max_chars=30, type='password', help='Senha digital da conta, utilizada para operações virtuais como Pix.')
310
311                            confirm_new_bank_account_data = st.checkbox(label="Confirmar novos dados")
312
313                        update_bank_account_button = st.button(label=":arrows_counterclockwise: Atualizar dados da conta")
314
315                    if confirm_new_bank_account_data and update_bank_account_button and account_password != "" and digital_account_password != "":
316                        with col1:
317                            with st.spinner(text="Aguarde..."):
318                                sleep(2.5)
319
320                        update_account_query = '''UPDATE contas_bancarias SET senha_bancaria_conta = %s, senha_digital_conta = %s WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
321                        update_account_values = (account_password, digital_account_password, selected_option, logged_user_name, logged_user_document)
322
323                        QueryExecutor().insert_query(query=update_account_query, values=update_account_values, success_message="Conta atualizada com sucesso!", error_message="Erro ao atualizar conta:")
324
325                        log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
326                        query_values = (logged_user, 'Atualização', 'Atualizou a conta bancária {}'.format(selected_option))
327                        QueryExecutor().insert_query(query=log_query, values=query_values, success_message='Log gravado.', error_message='Erro ao gravar log:')
328
329                    elif confirm_new_bank_account_data == False and update_bank_account_button and account_password != "" and digital_account_password != "":
330                        with col2:
331                            with st.expander(label="Validação dos dados", expanded=True):
332                                st.warning(body="Confirme os novos dados da conta.")
333
334                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
335                    with col2:
336                        with st.spinner(text="Aguarde..."):
337                            sleep(0.5)
338                        with st.expander(label="Validação dos dados", expanded=True):
339                            st.error(body="A senha informada é inválida.")
340
341                elif safe_password != confirm_safe_password:
342                    with col2:
343                        with st.spinner(text="Aguarde..."):
344                            sleep(0.5)
345                        with st.expander(label="Validação dos dados", expanded=True):
346                            st.error(body="As senhas informadas não coincidem.")

Função para a atualização de uma conta bancária.

def delete_bank_account(self):
348    def delete_bank_account(self):
349        """
350        Função para a exclusão de uma conta bancária.
351        """
352        logged_user_name, logged_user_document = Login().get_user_data(return_option="user_doc_name")
353        logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password")
354
355        user_accounts_quantity = self.get_user_accounts_quantity()
356
357        if user_accounts_quantity == 0:
358            col1, col2, col3 = st.columns(3)
359            with col2:
360                st.warning(body="Você ainda não possui contas cadastradas.")
361
362        elif user_accounts_quantity >= 1:
363            col1, col2 = st.columns(2)
364            user_bank_accounts = self.get_user_bank_accounts()
365
366            with col1:
367                with st.expander(label="Dados", expanded=True):
368                    selected_option = st.selectbox(
369                        label="Selecione a conta", options=user_bank_accounts)
370                    safe_password = st.text_input(
371                        label="Informe sua senha", type="password", help="Corresponde a senha utilizada para acessar a aplicação.")
372                    confirm_safe_password = st.text_input(
373                        label="Confirme sua senha", type="password", help="Deve ser idêntica a senha informada acima.")
374                    confirm_password_selection = st.checkbox(
375                        label="Confirmar seleção")
376
377            account_details_query = '''
378            SELECT 
379                CONCAT('Conta: ',
380                        contas_bancarias.nome_conta,
381                        ' - Instituição: ',
382                        contas_bancarias.instituicao_financeira),
383                contas_bancarias.agencia,
384                CONCAT('',
385                        contas_bancarias.numero_conta,
386                        '-',
387                        contas_bancarias.digito_conta),
388                contas_bancarias.senha_bancaria_conta,
389                contas_bancarias.senha_digital_conta
390            FROM
391                contas_bancarias
392            WHERE
393                contas_bancarias.nome_conta = %s
394                    AND contas_bancarias.nome_proprietario_conta = %s
395                    AND contas_bancarias.documento_proprietario_conta = %s;'''
396
397            result_list = QueryExecutor().complex_consult_query(query=account_details_query,
398                                                                params=(selected_option, logged_user_name, logged_user_document))
399            result_list = QueryExecutor().treat_complex_result(
400                values_to_treat=result_list, values_to_remove=to_remove_list)
401
402            if confirm_password_selection:
403
404                is_password_valid, hashed_password = Login().check_login(logged_user, safe_password)
405
406                if safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == True:
407
408                    with col2:
409                        with st.spinner(text="Aguarde..."):
410                            sleep(0.5)
411
412                        with st.expander(label="Dados", expanded=True):
413
414                            aux_string = ''
415
416                            for i in range(0, len(result_list)):
417
418                                st.write(bank_account_field_names[i])
419                                aux_string = str(result_list[i])
420                                aux_string = aux_string.replace('"', '')
421                                if aux_string.startswith('b'):
422                                    aux_string = aux_string[1:]
423                                st.code(body="{}".format(aux_string))
424
425                            confirm_account_deletion = st.checkbox(
426                                label="Confirmar exclusão da conta")
427
428                        delete_account_button = st.button(
429                            label=":wastebasket: Deletar conta")
430
431                        if delete_account_button and confirm_account_deletion:
432
433                            with col2:
434                                with st.spinner(text="Aguarde..."):
435                                    sleep(2.5)
436
437                                delete_account_query = '''DELETE contas_bancarias FROM contas_bancarias WHERE nome_conta = %s AND nome_proprietario_conta = %s AND documento_proprietario_conta = %s;'''
438                                delete_account_values = (
439                                    selected_option, logged_user_name, logged_user_document)
440
441                                QueryExecutor().insert_query(query=delete_account_query, values=delete_account_values,
442                                                             success_message="Conta excluída com sucesso!", error_message="Erro ao excluir conta:")
443
444                                log_query = '''INSERT into logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES(%s, %s, %s)'''
445                                query_values = (
446                                    logged_user, 'Exclusão', 'Excluiu a conta bancária {}'.format(selected_option))
447                                QueryExecutor().insert_query(query=log_query, values=query_values,
448                                                             success_message='Log gravado.', error_message='Erro ao gravar log:')
449
450                        elif delete_account_button and confirm_account_deletion == False:
451                            with col2:
452                                with st.expander(label="Validação dos dados", expanded=True):
453                                    st.warning(
454                                        body="Confirme a exclusão da conta.")
455
456                elif safe_password != "" and confirm_safe_password != "" and safe_password == confirm_safe_password and is_password_valid == False:
457                    with col2:
458                        with st.spinner(text="Aguarde..."):
459                            sleep(0.5)
460                        with st.expander(label="Validação dos dados", expanded=True):
461                            st.error(body="A senha informada é inválida.")
462
463                elif safe_password != confirm_safe_password:
464                    with col2:
465                        with st.spinner(text="Aguarde..."):
466                            sleep(0.5)
467                        with st.expander(label="Validação dos dados", expanded=True):
468                            st.error(
469                                body="As senhas informadas não coincidem.")

Função para a exclusão de uma conta bancária.

def main_menu(self):
471    def main_menu(self):
472        """
473        Menu Principal.
474        """
475
476        col1, col2, col3 = st.columns(3)
477
478        with col1:
479            st.header(body=":bank: Contas Bancárias")
480
481        with col2:
482            menu_options = ["Cadastrar conta", "Consultar conta",
483                            "Atualizar conta", "Deletar conta"]
484            selected_option = st.selectbox(label="Menu", options=menu_options)
485
486        st.divider()
487
488        if selected_option == menu_options[0]:
489            self.create_new_bank_account()
490
491        if selected_option == menu_options[1]:
492            self.read_bank_accounts()
493
494        if selected_option == menu_options[2]:
495            self.update_bank_account()
496
497        if selected_option == menu_options[3]:
498            self.delete_bank_account()

Menu Principal.