expenses.new_credit_card_expense
1import mysql.connector 2import streamlit as st 3from datetime import timedelta 4from dictionary.db_config import db_config 5from dictionary.vars import expense_categories, to_remove_list 6from dictionary.sql import last_credit_card_expense_id_query, owner_cards_query 7from functions.credit_card import Credit_Card 8from functions.get_actual_time import GetActualTime 9from functions.query_executor import QueryExecutor 10from functions.variable import Variable 11from functions.login import Login 12from screens.reports.receipts import Receipts 13from time import sleep 14 15 16class NewCreditCardExpense: 17 """ 18 Classe que representa uma nova despesa de cartão de crédito. 19 """ 20 21 def get_last_credit_card_expense_id(self): 22 """ 23 Obtém o último ID de despesas de cartão. 24 """ 25 26 try: 27 connection = mysql.connector.connect(**db_config) 28 cursor = connection.cursor() 29 cursor.execute(last_credit_card_expense_id_query) 30 31 result = cursor.fetchone() 32 33 if result is not None: 34 id = result[0] 35 return id 36 else: 37 return 0 38 39 except mysql.connector.Error as err: 40 st.toast( 41 f"Erro ao consultar o id da última despesa de cartão: {err}") 42 finally: 43 if connection.is_connected(): 44 connection.close() 45 46 def insert_new_credit_card_expense(self, query: str, values: tuple): 47 """ 48 Insere no banco de dados uma nova despesa de cartão. 49 50 Parameters 51 ---------- 52 query : str 53 A consulta de inserção. 54 values : tuple 55 A tupla com os valores da nova despesa. 56 """ 57 58 try: 59 connection = mysql.connector.connect(**db_config) 60 cursor = connection.cursor() 61 cursor.execute(query, values) 62 connection.commit() 63 cursor.close() 64 st.toast("Despesa registrada com sucesso.") 65 except mysql.connector.Error as err: 66 st.toast(f"Erro ao inserir despesa de cartão de crédito: {err}") 67 finally: 68 if connection.is_connected(): 69 connection.close() 70 71 def main_menu(self): 72 """ 73 Obtém os dados da nova despesa de cartão. 74 """ 75 user_name, user_document = Login().get_user_data(return_option="user_doc_name") 76 logged_user, logged_user_password = Login().get_user_data( 77 return_option="user_login_password") 78 79 user_cards = QueryExecutor().complex_consult_query( 80 query=owner_cards_query, params=(user_name, user_document)) 81 user_cards = QueryExecutor().treat_numerous_simple_result(user_cards, to_remove_list) 82 83 col1, col2, col3 = st.columns(3) 84 85 if len(user_cards) == 0: 86 87 with col2: 88 st.info("Você ainda não possui cartões cadastrados.") 89 90 elif len(user_cards) >= 1 and user_cards[0] != "Selecione uma opção": 91 92 with col1: 93 st.subheader(body=":computer: Entrada de Dados") 94 95 with st.expander(label="Dados da despesa", expanded=True): 96 97 input_id = int(self.get_last_credit_card_expense_id()) + 1 98 description = st.text_input(label=":lower_left_ballpoint_pen: Descrição", 99 placeholder="Informe uma descrição", max_chars=25, help="Descrição simples para a despesa.") 100 value = st.number_input( 101 label=":dollar: Valor", 102 step=0.01, 103 min_value=0.01 104 ) 105 date = st.date_input(label=":date: Data") 106 category = st.selectbox( 107 label=":card_index_dividers: Categoria", 108 options=expense_categories 109 ) 110 card = st.selectbox( 111 label=":credit_card: Cartão", 112 options=user_cards 113 ) 114 remaining_limit = Credit_Card().card_remaining_limit(selected_card=card) 115 remaining_limit = round(remaining_limit, 2) 116 117 str_remaining_limit = Variable().treat_complex_string(remaining_limit) 118 119 parcel = st.number_input( 120 label=":pencil: Parcelas", min_value=1, step=1) 121 inputed_credit_card_code = st.text_input( 122 label=":credit_card: Informe o código do cartão", 123 max_chars=3, 124 type="password", 125 help="Código CVV do cartão." 126 ) 127 128 credit_card_number, credit_card_owner, credit_card_owner_document, credit_card_code = Credit_Card( 129 ).get_credit_card_key(card=card) 130 131 confirm_values_checkbox = st.checkbox( 132 label="Confirmar Dados" 133 ) 134 135 generate_receipt_button = st.button( 136 label=":pencil: Gerar Comprovante", key="generate_receipt_button") 137 138 with col3: 139 if confirm_values_checkbox and generate_receipt_button: 140 141 card_associated_account_query = """ 142 SELECT 143 contas.nome_conta 144 FROM 145 contas 146 INNER JOIN 147 cartao_credito AS cc ON contas.nome_conta = cc.conta_associada 148 AND contas.proprietario_conta = cc.proprietario_cartao 149 AND contas.documento_proprietario_conta = cc.documento_titular 150 WHERE 151 cc.proprietario_cartao = %s 152 AND cc.documento_titular = %s 153 AND cc.nome_cartao = %s; 154 """ 155 card_associated_account = QueryExecutor().simple_consult_query( 156 query=card_associated_account_query, 157 params=(user_name, user_document, card) 158 ) 159 card_associated_account = QueryExecutor().treat_simple_result(card_associated_account, to_remove_list) 160 161 with col2: 162 163 with st.spinner("Aguarde..."): 164 sleep(2.5) 165 166 st.subheader( 167 body=":white_check_mark: Validação de Dados") 168 169 data_expander = st.expander( 170 label="Avisos", expanded=True) 171 172 with data_expander: 173 st.info(body="Limite restante do cartão: R$ {}".format( 174 str_remaining_limit)) 175 176 if ( 177 description != "" 178 and value >= 0.01 and value <= remaining_limit 179 and date 180 and category != "Selecione uma opção" 181 and card != "Selecione uma opção" 182 and inputed_credit_card_code == credit_card_code 183 ): 184 with data_expander: 185 st.success(body="Dados válidos.") 186 187 st.subheader( 188 body=":pencil: Comprovante de Despesa") 189 with st.spinner("Aguarde..."): 190 sleep(2.5) 191 192 for i in range(0, parcel): 193 if i >= 1: 194 date += timedelta(days=30) 195 196 actual_horary = GetActualTime().get_actual_time() 197 198 credit_card_expense_query = "INSERT INTO despesas_cartao_credito (descricao, valor, data, horario, categoria, cartao, numero_cartao, proprietario_despesa_cartao, doc_proprietario_cartao, parcela, pago) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" 199 values = ( 200 description, 201 (value / parcel), 202 date, 203 actual_horary, 204 category, 205 card, 206 credit_card_number, 207 credit_card_owner, 208 credit_card_owner_document, 209 i + 1, 210 "N", 211 ) 212 self.insert_new_credit_card_expense( 213 credit_card_expense_query, values) 214 215 str_value = Variable().treat_complex_string(value) 216 217 log_query = '''INSERT INTO financas.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES ( %s, %s, %s);''' 218 log_values = (logged_user, "Registro", "Registrou uma despesa de cartão no valor de R$ {} associada a conta {}.".format( 219 str_value, card)) 220 QueryExecutor().insert_query( 221 log_query, 222 log_values, 223 "Log gravado.", 224 "Erro ao gravar log:" 225 ) 226 227 Receipts().generate_receipt( 228 'despesas_cartao_credito', 229 input_id, 230 description, 231 value, 232 str(date), 233 category, 234 card_associated_account 235 ) 236 237 else: 238 with data_expander: 239 if value > remaining_limit: 240 st.error( 241 body="O valor da despesa é maior que o limite restante.") 242 if description == "": 243 st.error(body="A descrição está vazia.") 244 if category == "Selecione uma opção": 245 st.error(body="Selecione uma categoria.") 246 if inputed_credit_card_code != credit_card_code: 247 st.error(body="Código do cartão inválido.")
class
NewCreditCardExpense:
17class NewCreditCardExpense: 18 """ 19 Classe que representa uma nova despesa de cartão de crédito. 20 """ 21 22 def get_last_credit_card_expense_id(self): 23 """ 24 Obtém o último ID de despesas de cartão. 25 """ 26 27 try: 28 connection = mysql.connector.connect(**db_config) 29 cursor = connection.cursor() 30 cursor.execute(last_credit_card_expense_id_query) 31 32 result = cursor.fetchone() 33 34 if result is not None: 35 id = result[0] 36 return id 37 else: 38 return 0 39 40 except mysql.connector.Error as err: 41 st.toast( 42 f"Erro ao consultar o id da última despesa de cartão: {err}") 43 finally: 44 if connection.is_connected(): 45 connection.close() 46 47 def insert_new_credit_card_expense(self, query: str, values: tuple): 48 """ 49 Insere no banco de dados uma nova despesa de cartão. 50 51 Parameters 52 ---------- 53 query : str 54 A consulta de inserção. 55 values : tuple 56 A tupla com os valores da nova despesa. 57 """ 58 59 try: 60 connection = mysql.connector.connect(**db_config) 61 cursor = connection.cursor() 62 cursor.execute(query, values) 63 connection.commit() 64 cursor.close() 65 st.toast("Despesa registrada com sucesso.") 66 except mysql.connector.Error as err: 67 st.toast(f"Erro ao inserir despesa de cartão de crédito: {err}") 68 finally: 69 if connection.is_connected(): 70 connection.close() 71 72 def main_menu(self): 73 """ 74 Obtém os dados da nova despesa de cartão. 75 """ 76 user_name, user_document = Login().get_user_data(return_option="user_doc_name") 77 logged_user, logged_user_password = Login().get_user_data( 78 return_option="user_login_password") 79 80 user_cards = QueryExecutor().complex_consult_query( 81 query=owner_cards_query, params=(user_name, user_document)) 82 user_cards = QueryExecutor().treat_numerous_simple_result(user_cards, to_remove_list) 83 84 col1, col2, col3 = st.columns(3) 85 86 if len(user_cards) == 0: 87 88 with col2: 89 st.info("Você ainda não possui cartões cadastrados.") 90 91 elif len(user_cards) >= 1 and user_cards[0] != "Selecione uma opção": 92 93 with col1: 94 st.subheader(body=":computer: Entrada de Dados") 95 96 with st.expander(label="Dados da despesa", expanded=True): 97 98 input_id = int(self.get_last_credit_card_expense_id()) + 1 99 description = st.text_input(label=":lower_left_ballpoint_pen: Descrição", 100 placeholder="Informe uma descrição", max_chars=25, help="Descrição simples para a despesa.") 101 value = st.number_input( 102 label=":dollar: Valor", 103 step=0.01, 104 min_value=0.01 105 ) 106 date = st.date_input(label=":date: Data") 107 category = st.selectbox( 108 label=":card_index_dividers: Categoria", 109 options=expense_categories 110 ) 111 card = st.selectbox( 112 label=":credit_card: Cartão", 113 options=user_cards 114 ) 115 remaining_limit = Credit_Card().card_remaining_limit(selected_card=card) 116 remaining_limit = round(remaining_limit, 2) 117 118 str_remaining_limit = Variable().treat_complex_string(remaining_limit) 119 120 parcel = st.number_input( 121 label=":pencil: Parcelas", min_value=1, step=1) 122 inputed_credit_card_code = st.text_input( 123 label=":credit_card: Informe o código do cartão", 124 max_chars=3, 125 type="password", 126 help="Código CVV do cartão." 127 ) 128 129 credit_card_number, credit_card_owner, credit_card_owner_document, credit_card_code = Credit_Card( 130 ).get_credit_card_key(card=card) 131 132 confirm_values_checkbox = st.checkbox( 133 label="Confirmar Dados" 134 ) 135 136 generate_receipt_button = st.button( 137 label=":pencil: Gerar Comprovante", key="generate_receipt_button") 138 139 with col3: 140 if confirm_values_checkbox and generate_receipt_button: 141 142 card_associated_account_query = """ 143 SELECT 144 contas.nome_conta 145 FROM 146 contas 147 INNER JOIN 148 cartao_credito AS cc ON contas.nome_conta = cc.conta_associada 149 AND contas.proprietario_conta = cc.proprietario_cartao 150 AND contas.documento_proprietario_conta = cc.documento_titular 151 WHERE 152 cc.proprietario_cartao = %s 153 AND cc.documento_titular = %s 154 AND cc.nome_cartao = %s; 155 """ 156 card_associated_account = QueryExecutor().simple_consult_query( 157 query=card_associated_account_query, 158 params=(user_name, user_document, card) 159 ) 160 card_associated_account = QueryExecutor().treat_simple_result(card_associated_account, to_remove_list) 161 162 with col2: 163 164 with st.spinner("Aguarde..."): 165 sleep(2.5) 166 167 st.subheader( 168 body=":white_check_mark: Validação de Dados") 169 170 data_expander = st.expander( 171 label="Avisos", expanded=True) 172 173 with data_expander: 174 st.info(body="Limite restante do cartão: R$ {}".format( 175 str_remaining_limit)) 176 177 if ( 178 description != "" 179 and value >= 0.01 and value <= remaining_limit 180 and date 181 and category != "Selecione uma opção" 182 and card != "Selecione uma opção" 183 and inputed_credit_card_code == credit_card_code 184 ): 185 with data_expander: 186 st.success(body="Dados válidos.") 187 188 st.subheader( 189 body=":pencil: Comprovante de Despesa") 190 with st.spinner("Aguarde..."): 191 sleep(2.5) 192 193 for i in range(0, parcel): 194 if i >= 1: 195 date += timedelta(days=30) 196 197 actual_horary = GetActualTime().get_actual_time() 198 199 credit_card_expense_query = "INSERT INTO despesas_cartao_credito (descricao, valor, data, horario, categoria, cartao, numero_cartao, proprietario_despesa_cartao, doc_proprietario_cartao, parcela, pago) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" 200 values = ( 201 description, 202 (value / parcel), 203 date, 204 actual_horary, 205 category, 206 card, 207 credit_card_number, 208 credit_card_owner, 209 credit_card_owner_document, 210 i + 1, 211 "N", 212 ) 213 self.insert_new_credit_card_expense( 214 credit_card_expense_query, values) 215 216 str_value = Variable().treat_complex_string(value) 217 218 log_query = '''INSERT INTO financas.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES ( %s, %s, %s);''' 219 log_values = (logged_user, "Registro", "Registrou uma despesa de cartão no valor de R$ {} associada a conta {}.".format( 220 str_value, card)) 221 QueryExecutor().insert_query( 222 log_query, 223 log_values, 224 "Log gravado.", 225 "Erro ao gravar log:" 226 ) 227 228 Receipts().generate_receipt( 229 'despesas_cartao_credito', 230 input_id, 231 description, 232 value, 233 str(date), 234 category, 235 card_associated_account 236 ) 237 238 else: 239 with data_expander: 240 if value > remaining_limit: 241 st.error( 242 body="O valor da despesa é maior que o limite restante.") 243 if description == "": 244 st.error(body="A descrição está vazia.") 245 if category == "Selecione uma opção": 246 st.error(body="Selecione uma categoria.") 247 if inputed_credit_card_code != credit_card_code: 248 st.error(body="Código do cartão inválido.")
Classe que representa uma nova despesa de cartão de crédito.
def
get_last_credit_card_expense_id(self):
22 def get_last_credit_card_expense_id(self): 23 """ 24 Obtém o último ID de despesas de cartão. 25 """ 26 27 try: 28 connection = mysql.connector.connect(**db_config) 29 cursor = connection.cursor() 30 cursor.execute(last_credit_card_expense_id_query) 31 32 result = cursor.fetchone() 33 34 if result is not None: 35 id = result[0] 36 return id 37 else: 38 return 0 39 40 except mysql.connector.Error as err: 41 st.toast( 42 f"Erro ao consultar o id da última despesa de cartão: {err}") 43 finally: 44 if connection.is_connected(): 45 connection.close()
Obtém o último ID de despesas de cartão.
def
insert_new_credit_card_expense(self, query: str, values: tuple):
47 def insert_new_credit_card_expense(self, query: str, values: tuple): 48 """ 49 Insere no banco de dados uma nova despesa de cartão. 50 51 Parameters 52 ---------- 53 query : str 54 A consulta de inserção. 55 values : tuple 56 A tupla com os valores da nova despesa. 57 """ 58 59 try: 60 connection = mysql.connector.connect(**db_config) 61 cursor = connection.cursor() 62 cursor.execute(query, values) 63 connection.commit() 64 cursor.close() 65 st.toast("Despesa registrada com sucesso.") 66 except mysql.connector.Error as err: 67 st.toast(f"Erro ao inserir despesa de cartão de crédito: {err}") 68 finally: 69 if connection.is_connected(): 70 connection.close()
Insere no banco de dados uma nova despesa de cartão.
Parameters
- query (str): A consulta de inserção.
- values (tuple): A tupla com os valores da nova despesa.