This repository has been archived by the owner on Jun 19, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
135 lines (110 loc) · 5.73 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""Calcula o fluxo de caixa projetado para órgãos públicos.
O fluxo de caixa projetado é calculado a partir das informações contábeis e orçamentárias e é feito por fonte de
recursos.
"""
import sys
import fcproj.calc
import fcproj.output
import fcproj.data.load
import fcproj.ui.ask
import os
import configparser
import logging
import datetime
import locale
from fcproj.utils import currency, check_venv
try:
locale.setlocale(locale.LC_ALL, 'pt_BR')
except:
locale.setlocale(locale.LC_ALL, 'Portuguese_Brazil')
def main():
welcome = '''
======================================================================
Bem-vindo ao FCPROJ.
Programa calculador de fluxo de caixa projetado por fonte de recursos.
======================================================================
'''
print(welcome)
# Carrega configurações
config = configparser.ConfigParser()
config.read('config.ini')
print('Configurações carregadas')
# Configura o logger
logging.basicConfig(level=logging.NOTSET, format='%(asctime)s\t%(levelname)s\t%(message)s', datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger('fcproj')
logger.info('Logger pronto')
# Usuário entra com o ano e o mês
month = fcproj.ui.ask.month()
year = fcproj.ui.ask.year()
logger.info(f'O período escolhido foi {month}/{year}')
# Define o caminho base dos arquivos de dados
base_dir = os.path.join(config['SOURCE']['base_dir'], f"{year}-{month}")
logger.info(f'A base de dados está em {base_dir}')
# Carrega a lista de vínculos e anexa
data = fcproj.data.load.vinculos(os.path.join(base_dir, config['SOURCE']['fvinculos']))
logger.info(f'Foram encontrados {len(data)} fontes de recurso.')
# Calcula o saldo de caixa atual e anexa
balver = fcproj.data.load.balver(os.path.join(base_dir, config['SOURCE']['fbalver']))
data = fcproj.data.join(data, fcproj.calc.saldo_atual(balver))
logger.info(f'Foram processados {len(data)} saldos atuais para fontes de recurso.')
# Calcula a receita a arrecadar
balrec = fcproj.data.load.balrec(os.path.join(base_dir, config['SOURCE']['fbalrec']))
receita = fcproj.data.load.receita(os.path.join(base_dir, config['SOURCE']['freceita']))
data = fcproj.data.join(data, fcproj.calc.a_arrecadar(balrec, receita, int(month)))
logger.info(f'Foram processados {len(data)} valores a arrecadar para fontes de recurso.')
# Calcula a dotação a empenhar e anexa
baldesp = fcproj.data.load.baldesp(os.path.join(base_dir, config['SOURCE']['fbaldesp']))
data = fcproj.data.join(data, fcproj.calc.a_empenhar(baldesp))
logger.info(f'Foram processados {len(data)} valores a empenhar para fontes de recurso.')
# Calcula o empenhado a pagar e anexa
data = fcproj.data.join(data, fcproj.calc.a_pagar(baldesp))
logger.info(f'Foram processados {len(data)} valores a pagar para fontes de recurso.')
# Calcula o saldo de restos a pagar e anexa
rp = fcproj.data.load.rp(os.path.join(base_dir, config['SOURCE']['frp']))
data = fcproj.data.join(data, fcproj.calc.saldo_rp(rp))
logger.info(f'Foram processados {len(data)} saldos de restos a pagar para fontes de recurso.')
# Calcula a despesa extra a recolher e anexa
data = fcproj.data.join(data, fcproj.calc.extra_a_pagar(balver))
logger.info(f'Foram processados {len(data)} saldos extra-orçamentários a pagar para fontes de recurso.')
# Converte NaN para 0
data.fillna(0.0, inplace=True)
# Calcula o saldo final projetado e anexa
data = fcproj.calc.saldo_final(data)
logger.info(f'Foram processados {len(data)} saldos finais projetados para fontes de recurso.')
# Remove linhas sem valores
data = fcproj.data.purge(data)
logger.info(f'Restaram {len(data)} fontes de recurso com valores.')
# Agrupa algumas fontes em recurso próprio
data = fcproj.data.agrupa_recurso_proprio(data)
logger.info(f'Restaram {len(data)} fontes de recurso após agrupamento do recurso próprio.')
# Calcula outros valores
deficit_vinculados = fcproj.calc.deficit_vinculados(data)
logger.info(f'Os recursos vinculados apresentam déficit {deficit_vinculados}')
resultado_proprio = fcproj.calc.resultado_proprio(data, deficit_vinculados)
logger.info(f'Os recursos próprios apresentam resultado {resultado_proprio}')
# Calcula o total
data = fcproj.calc.total(data)
logger.info('Linha com totais adicionada.')
# Salva o relatório
destination = os.path.join(config['OUTPUT']['cache'], config['OUTPUT']['flatex'])
char_writed = fcproj.output.latex(data, destination)
logger.info(f'Foram escritos {char_writed} caracteres para {destination}')
destination = os.path.join(config['OUTPUT']['cache'], config['OUTPUT']['flatexrv'])
char_writed = fcproj.output.latex_vinculos(data, destination)
logger.info(f'Foram escritos {char_writed} caracteres para {destination}')
# Gerando dados auxiliares
logger.info('Gerando arquivos auxiliares')
with open(os.path.join(config['OUTPUT']['cache'], 'date.tex'), 'w', encoding='utf-8') as f:
dt = datetime.datetime(int(year), int(month), 1)
f.write('\\date{%s}' % (dt.strftime('%B de %Y')))
f.write('\\newcommand{\\thedate}{%s}' % (dt.strftime('%B de %Y')))
f.write('\\newcommand{\\deficitVinculado}{%s}' % (currency(deficit_vinculados)))
f.write('\\newcommand{\\resultadoProprio}{%s}' % (currency(resultado_proprio)))
with open(os.path.join(config['OUTPUT']['cache'], 'arquivo.txt'), 'w', encoding='utf-8') as f:
f.write('fcproj_report_%s.pdf' % (dt.strftime('%Y-%m')))
if __name__ == '__main__':
if check_venv() is True:
main()
else:
print('O programa não está executando em um ambiente virtual do Python!')
exit(1)