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

Obtém os dados da nova despesa de cartão.