loans.pay_loan
1import streamlit as st 2import pandas as pd 3from dictionary.sql import not_payed_loans_query, user_current_accounts_query, last_expense_id_query 4from dictionary.vars import to_remove_list, today 5from functions.query_executor import QueryExecutor 6from functions.get_actual_time import GetActualTime 7from functions.login import Login 8from functions.variable import Variable 9from screens.reports.receipts import Receipts 10from time import sleep 11 12 13class PayLoan: 14 """ 15 Classe que representa o pagamento dos empréstimos tomados pelo usuário. 16 """ 17 18 def main_menu(self): 19 """ 20 Exibe os empréstimos tomados pelo usuário. 21 """ 22 user_name, user_document = Login().get_user_data(return_option="user_doc_name") 23 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 24 25 not_payed_loans = QueryExecutor().complex_compund_query(query=not_payed_loans_query, list_quantity=9, params=(user_name, user_document)) 26 27 if len(not_payed_loans[0]) >= 1: 28 29 col4, col5, col6 = st.columns(3) 30 31 with col4: 32 33 id, description, total_value, payed_value, remaining_value, date, category, account, creditor = not_payed_loans 34 35 loan_data_df = pd.DataFrame( 36 { 37 "Descrição": description, 38 "Valor Total": total_value, 39 "Valor Pago": payed_value, 40 "Valor a Pagar": remaining_value, 41 "Data": date, 42 "Categoria": category, 43 "Conta": account, 44 "Credor": creditor 45 } 46 ) 47 48 loan_data_df["Valor Total"] = loan_data_df["Valor Total"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 49 loan_data_df["Valor Pago"] = loan_data_df["Valor Pago"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 50 loan_data_df["Valor a Pagar"] = loan_data_df["Valor a Pagar"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 51 loan_data_df["Data"] = pd.to_datetime(loan_data_df["Data"]).dt.strftime("%d/%m/%Y") 52 53 st.subheader(body=":computer: Entrada de Dados") 54 55 with st.expander(label="Valores", expanded=True): 56 57 st.dataframe(loan_data_df, hide_index=True,use_container_width=True) 58 59 total_loan_value = 0 60 for i in range(0, len(remaining_value)): 61 total_loan_value += remaining_value[i] 62 63 total_loan_value = str(total_loan_value) 64 total_loan_value = total_loan_value.replace(".", ",") 65 66 st.info(body="Valor total: :heavy_dollar_sign: {}".format(total_loan_value)) 67 68 user_accounts = QueryExecutor().complex_consult_query(user_current_accounts_query, params=(user_name, user_document)) 69 user_accounts = QueryExecutor().treat_numerous_simple_result(user_accounts, to_remove_list) 70 71 debt = st.selectbox(label="Selecionar dívida", options=description) 72 73 paying_max_value_query = ''' 74 SELECT 75 DISTINCT(emprestimos.valor - \ 76 emprestimos.valor_pago) 77 FROM 78 emprestimos 79 INNER JOIN 80 contas ON contas.proprietario_conta = emprestimos.devedor 81 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 82 INNER JOIN 83 usuarios ON usuarios.nome = emprestimos.devedor 84 AND usuarios.documento = emprestimos.documento_devedor 85 WHERE 86 emprestimos.pago = 'N' 87 AND emprestimos.descricao = '{}' 88 '''.format(debt) 89 90 payed_actual_value_query = ''' 91 SELECT 92 DISTINCT(emprestimos.valor_pago) 93 FROM 94 emprestimos 95 INNER JOIN 96 contas ON contas.proprietario_conta = emprestimos.devedor 97 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 98 INNER JOIN 99 usuarios ON usuarios.nome = emprestimos.devedor 100 AND usuarios.documento = emprestimos.documento_devedor 101 WHERE 102 emprestimos.pago = 'N' 103 AND emprestimos.descricao = '{}' 104 '''.format(debt) 105 106 total_actual_value_query = ''' 107 SELECT 108 DISTINCT(emprestimos.valor) 109 FROM 110 emprestimos 111 INNER JOIN 112 contas ON contas.proprietario_conta = emprestimos.devedor 113 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 114 INNER JOIN 115 usuarios ON usuarios.nome = emprestimos.devedor 116 AND usuarios.documento = emprestimos.documento_devedor 117 WHERE 118 emprestimos.pago = 'N' 119 AND emprestimos.descricao = '{}' 120 '''.format(debt) 121 122 benefited_name, benefited_document = Login().get_user_data(return_option="user_doc_name") 123 124 paying_max_value = QueryExecutor().simple_consult_brute_query(paying_max_value_query) 125 paying_max_value = QueryExecutor().treat_simple_result(paying_max_value, to_remove_list) 126 paying_max_value = float(paying_max_value) 127 128 payed_actual_value = QueryExecutor().simple_consult_brute_query(payed_actual_value_query) 129 payed_actual_value = QueryExecutor().treat_simple_result(payed_actual_value, to_remove_list) 130 payed_actual_value = float(payed_actual_value) 131 132 total_actual_value = QueryExecutor().simple_consult_brute_query(total_actual_value_query) 133 total_actual_value = QueryExecutor().treat_simple_result(total_actual_value, to_remove_list) 134 total_actual_value = float(total_actual_value) 135 136 paying_value = st.number_input(label="Valor", min_value=0.00, max_value=paying_max_value, step=0.01) 137 selected_account = st.selectbox(label="Conta", options=user_accounts) 138 139 confirm_values = st.checkbox(label="Confirmar valores") 140 141 pay_button = st.button(label=":floppy_disk: Pagar valor de empréstimo") 142 143 with col5: 144 145 if confirm_values: 146 147 with st.spinner(text="Aguarde..."): 148 sleep(2.5) 149 150 st.subheader(body=":white_check_mark: Validação de Dados") 151 152 if paying_value > 0: 153 154 with col5: 155 156 with st.expander(label="Dados", expanded=True): 157 158 to_pay_value = (paying_value + payed_actual_value) 159 str_paying_value = Variable().treat_complex_string(paying_value) 160 161 st.info(body="Valor sendo pago: :heavy_dollar_sign: {}".format(str_paying_value)) 162 163 str_to_pay_value = Variable().treat_complex_string(to_pay_value) 164 165 st.info(body="Valor pago atualizado: :heavy_dollar_sign: {}".format(str_to_pay_value)) 166 167 remaining_to_pay_value = total_actual_value - \ 168 (paying_value + payed_actual_value) 169 str_remaining_to_pay_value = Variable().treat_complex_string(remaining_to_pay_value) 170 171 st.info('Valor restante a pagar: :heavy_dollar_sign: {}'.format(str_remaining_to_pay_value)) 172 173 loan_payed = 'N' 174 175 if remaining_to_pay_value == 0: 176 loan_payed = 'S' 177 178 elif paying_value == 0: 179 180 with st.spinner(text="Aguarde..."): 181 sleep(2.5) 182 183 with col5: 184 with st.expander(label="Aviso", expanded=True): 185 st.warning(body="O valor pago precisa ser maior do que 0.") 186 187 if confirm_values and pay_button: 188 189 actual_horary = GetActualTime().get_actual_time() 190 191 if paying_value > 0: 192 193 expense_query = '''INSERT INTO despesas (descricao, valor, data, horario, categoria, conta, proprietario_despesa, documento_proprietario_despesa, pago) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)''' 194 values = ( 195 'Pagamento de empréstimo - {}'.format(debt), 196 paying_value, 197 today, 198 actual_horary, 199 'Pagamento de Empréstimo', 200 selected_account, 201 benefited_name, 202 benefited_document, 203 'S' 204 ) 205 206 QueryExecutor().insert_query(expense_query, values, "Valor de empréstimo pago com sucesso!", "Erro ao pagar valor do empréstimo:") 207 208 update_loan_query = '''UPDATE emprestimos SET valor_pago = {}, pago = "{}" WHERE descricao = "{}" AND pago = "{}" AND devedor = "{}" AND documento_devedor = {}'''.format(to_pay_value, loan_payed, debt, 'N', benefited_name, benefited_document) 209 QueryExecutor().update_table_unique_register(update_loan_query, "Empréstimo atualizado com sucesso!", "Erro ao atualizar valores do empréstimo:") 210 211 last_expense_id = QueryExecutor().simple_consult_brute_query(last_expense_id_query) 212 last_expense_id = QueryExecutor().treat_simple_result(last_expense_id, to_remove_list) 213 last_expense_id = int(last_expense_id) 214 215 with col6: 216 with st.spinner(text="Aguarde..."): 217 sleep(2.5) 218 219 st.subheader(body=":pencil: Comprovante de Pagamento de Empréstimo") 220 221 Receipts().generate_receipt(table="despesas", id=last_expense_id, description=debt, value=paying_value, date=today, category='Pagamento de Empréstimo', account=selected_account) 222 223 log_query = '''INSERT INTO financas.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES ( %s, %s, %s);''' 224 log_values = (logged_user, "Registro", "Pagou R$ {} de um empréstimo tomado na conta {}.".format(str_paying_value, account)) 225 QueryExecutor().insert_query(log_query, log_values, "Log gravado.", "Erro ao gravar log:") 226 227 elif len(not_payed_loans[0]) == 0: 228 229 col4, col5, col6 = st.columns(3) 230 231 with col5: 232 233 st.info(body="Você não tem valores a pagar.")
class
PayLoan:
14class PayLoan: 15 """ 16 Classe que representa o pagamento dos empréstimos tomados pelo usuário. 17 """ 18 19 def main_menu(self): 20 """ 21 Exibe os empréstimos tomados pelo usuário. 22 """ 23 user_name, user_document = Login().get_user_data(return_option="user_doc_name") 24 logged_user, logged_user_password = Login().get_user_data(return_option="user_login_password") 25 26 not_payed_loans = QueryExecutor().complex_compund_query(query=not_payed_loans_query, list_quantity=9, params=(user_name, user_document)) 27 28 if len(not_payed_loans[0]) >= 1: 29 30 col4, col5, col6 = st.columns(3) 31 32 with col4: 33 34 id, description, total_value, payed_value, remaining_value, date, category, account, creditor = not_payed_loans 35 36 loan_data_df = pd.DataFrame( 37 { 38 "Descrição": description, 39 "Valor Total": total_value, 40 "Valor Pago": payed_value, 41 "Valor a Pagar": remaining_value, 42 "Data": date, 43 "Categoria": category, 44 "Conta": account, 45 "Credor": creditor 46 } 47 ) 48 49 loan_data_df["Valor Total"] = loan_data_df["Valor Total"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 50 loan_data_df["Valor Pago"] = loan_data_df["Valor Pago"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 51 loan_data_df["Valor a Pagar"] = loan_data_df["Valor a Pagar"].apply(lambda x: f"R$ {x:.2f}".replace(".", ",")) 52 loan_data_df["Data"] = pd.to_datetime(loan_data_df["Data"]).dt.strftime("%d/%m/%Y") 53 54 st.subheader(body=":computer: Entrada de Dados") 55 56 with st.expander(label="Valores", expanded=True): 57 58 st.dataframe(loan_data_df, hide_index=True,use_container_width=True) 59 60 total_loan_value = 0 61 for i in range(0, len(remaining_value)): 62 total_loan_value += remaining_value[i] 63 64 total_loan_value = str(total_loan_value) 65 total_loan_value = total_loan_value.replace(".", ",") 66 67 st.info(body="Valor total: :heavy_dollar_sign: {}".format(total_loan_value)) 68 69 user_accounts = QueryExecutor().complex_consult_query(user_current_accounts_query, params=(user_name, user_document)) 70 user_accounts = QueryExecutor().treat_numerous_simple_result(user_accounts, to_remove_list) 71 72 debt = st.selectbox(label="Selecionar dívida", options=description) 73 74 paying_max_value_query = ''' 75 SELECT 76 DISTINCT(emprestimos.valor - \ 77 emprestimos.valor_pago) 78 FROM 79 emprestimos 80 INNER JOIN 81 contas ON contas.proprietario_conta = emprestimos.devedor 82 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 83 INNER JOIN 84 usuarios ON usuarios.nome = emprestimos.devedor 85 AND usuarios.documento = emprestimos.documento_devedor 86 WHERE 87 emprestimos.pago = 'N' 88 AND emprestimos.descricao = '{}' 89 '''.format(debt) 90 91 payed_actual_value_query = ''' 92 SELECT 93 DISTINCT(emprestimos.valor_pago) 94 FROM 95 emprestimos 96 INNER JOIN 97 contas ON contas.proprietario_conta = emprestimos.devedor 98 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 99 INNER JOIN 100 usuarios ON usuarios.nome = emprestimos.devedor 101 AND usuarios.documento = emprestimos.documento_devedor 102 WHERE 103 emprestimos.pago = 'N' 104 AND emprestimos.descricao = '{}' 105 '''.format(debt) 106 107 total_actual_value_query = ''' 108 SELECT 109 DISTINCT(emprestimos.valor) 110 FROM 111 emprestimos 112 INNER JOIN 113 contas ON contas.proprietario_conta = emprestimos.devedor 114 AND contas.documento_proprietario_conta = emprestimos.documento_devedor 115 INNER JOIN 116 usuarios ON usuarios.nome = emprestimos.devedor 117 AND usuarios.documento = emprestimos.documento_devedor 118 WHERE 119 emprestimos.pago = 'N' 120 AND emprestimos.descricao = '{}' 121 '''.format(debt) 122 123 benefited_name, benefited_document = Login().get_user_data(return_option="user_doc_name") 124 125 paying_max_value = QueryExecutor().simple_consult_brute_query(paying_max_value_query) 126 paying_max_value = QueryExecutor().treat_simple_result(paying_max_value, to_remove_list) 127 paying_max_value = float(paying_max_value) 128 129 payed_actual_value = QueryExecutor().simple_consult_brute_query(payed_actual_value_query) 130 payed_actual_value = QueryExecutor().treat_simple_result(payed_actual_value, to_remove_list) 131 payed_actual_value = float(payed_actual_value) 132 133 total_actual_value = QueryExecutor().simple_consult_brute_query(total_actual_value_query) 134 total_actual_value = QueryExecutor().treat_simple_result(total_actual_value, to_remove_list) 135 total_actual_value = float(total_actual_value) 136 137 paying_value = st.number_input(label="Valor", min_value=0.00, max_value=paying_max_value, step=0.01) 138 selected_account = st.selectbox(label="Conta", options=user_accounts) 139 140 confirm_values = st.checkbox(label="Confirmar valores") 141 142 pay_button = st.button(label=":floppy_disk: Pagar valor de empréstimo") 143 144 with col5: 145 146 if confirm_values: 147 148 with st.spinner(text="Aguarde..."): 149 sleep(2.5) 150 151 st.subheader(body=":white_check_mark: Validação de Dados") 152 153 if paying_value > 0: 154 155 with col5: 156 157 with st.expander(label="Dados", expanded=True): 158 159 to_pay_value = (paying_value + payed_actual_value) 160 str_paying_value = Variable().treat_complex_string(paying_value) 161 162 st.info(body="Valor sendo pago: :heavy_dollar_sign: {}".format(str_paying_value)) 163 164 str_to_pay_value = Variable().treat_complex_string(to_pay_value) 165 166 st.info(body="Valor pago atualizado: :heavy_dollar_sign: {}".format(str_to_pay_value)) 167 168 remaining_to_pay_value = total_actual_value - \ 169 (paying_value + payed_actual_value) 170 str_remaining_to_pay_value = Variable().treat_complex_string(remaining_to_pay_value) 171 172 st.info('Valor restante a pagar: :heavy_dollar_sign: {}'.format(str_remaining_to_pay_value)) 173 174 loan_payed = 'N' 175 176 if remaining_to_pay_value == 0: 177 loan_payed = 'S' 178 179 elif paying_value == 0: 180 181 with st.spinner(text="Aguarde..."): 182 sleep(2.5) 183 184 with col5: 185 with st.expander(label="Aviso", expanded=True): 186 st.warning(body="O valor pago precisa ser maior do que 0.") 187 188 if confirm_values and pay_button: 189 190 actual_horary = GetActualTime().get_actual_time() 191 192 if paying_value > 0: 193 194 expense_query = '''INSERT INTO despesas (descricao, valor, data, horario, categoria, conta, proprietario_despesa, documento_proprietario_despesa, pago) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)''' 195 values = ( 196 'Pagamento de empréstimo - {}'.format(debt), 197 paying_value, 198 today, 199 actual_horary, 200 'Pagamento de Empréstimo', 201 selected_account, 202 benefited_name, 203 benefited_document, 204 'S' 205 ) 206 207 QueryExecutor().insert_query(expense_query, values, "Valor de empréstimo pago com sucesso!", "Erro ao pagar valor do empréstimo:") 208 209 update_loan_query = '''UPDATE emprestimos SET valor_pago = {}, pago = "{}" WHERE descricao = "{}" AND pago = "{}" AND devedor = "{}" AND documento_devedor = {}'''.format(to_pay_value, loan_payed, debt, 'N', benefited_name, benefited_document) 210 QueryExecutor().update_table_unique_register(update_loan_query, "Empréstimo atualizado com sucesso!", "Erro ao atualizar valores do empréstimo:") 211 212 last_expense_id = QueryExecutor().simple_consult_brute_query(last_expense_id_query) 213 last_expense_id = QueryExecutor().treat_simple_result(last_expense_id, to_remove_list) 214 last_expense_id = int(last_expense_id) 215 216 with col6: 217 with st.spinner(text="Aguarde..."): 218 sleep(2.5) 219 220 st.subheader(body=":pencil: Comprovante de Pagamento de Empréstimo") 221 222 Receipts().generate_receipt(table="despesas", id=last_expense_id, description=debt, value=paying_value, date=today, category='Pagamento de Empréstimo', account=selected_account) 223 224 log_query = '''INSERT INTO financas.logs_atividades (usuario_log, tipo_log, conteudo_log) VALUES ( %s, %s, %s);''' 225 log_values = (logged_user, "Registro", "Pagou R$ {} de um empréstimo tomado na conta {}.".format(str_paying_value, account)) 226 QueryExecutor().insert_query(log_query, log_values, "Log gravado.", "Erro ao gravar log:") 227 228 elif len(not_payed_loans[0]) == 0: 229 230 col4, col5, col6 = st.columns(3) 231 232 with col5: 233 234 st.info(body="Você não tem valores a pagar.")
Classe que representa o pagamento dos empréstimos tomados pelo usuário.