def test_opcao_deve_ter_percentual_de_15_perc(self): assert calcula_ir_a_pagar(25000, TipoTicker.OPCAO) == 3750.0
def test_tipos_isentos_devem_ter_imposto_zero(self): assert calcula_ir_a_pagar(25000, TipoTicker.FIPIE) == 0.0
def test_etf_deve_ter_percentual_de_15_perc(self): assert calcula_ir_a_pagar(25000, TipoTicker.ETF) == 3750.0
def test_futuro_deve_ter_percentual_de_15_perc(self): assert calcula_ir_a_pagar(25000, TipoTicker.FUTURO) == 3750.0
def test_fipe_deve_ter_percentual_de_20_perc(self): assert calcula_ir_a_pagar(25000, TipoTicker.FIP) == 5000.0
def test_deve_ser_zero_se_nao_tiver_lucro(self, tipo_ticker): assert calcula_ir_a_pagar(0, tipo_ticker) == 0.0
def test_apenas_acoes_possuem_isencao_de_vendas_ate_20_mil(self, tipo_ticker): assert calcula_ir_a_pagar(10000, tipo_ticker, 15000) > 0.0
def test_acoes_isencao_ate_20_mil_de_vendas_no_mes(self): assert calcula_ir_a_pagar(15000, TipoTicker.ACAO, 15000) == 0.0 assert calcula_ir_a_pagar(15000, TipoTicker.ACAO, 30000) == 2250.0
def test_acoes_deve_ter_percentual_de_15_perc(self): assert calcula_ir_a_pagar(25000, TipoTicker.ACAO, 100000) == 3750.0
def relatorio_txt(ir): relatorio = [] relatorio.append('RELATORIO') relatorio.append('') relatorio.append('Custódia') custodia = calcula_custodia(ir.df, datetime.datetime.now().date()) columns = [ 'ticker', 'qtd', 'valor', 'preco_atual', 'preco_medio_compra', 'valorizacao', 'ultimo_yield', 'tipo', 'data_primeira_compra' ] headers = [ 'ticker', 'qtd', 'valor (R$)', 'Preco Atual (R$)', 'Preco Medio Compra (R$)', 'valorizacao (%)', 'Ultimo Yield [%]', 'tipo', 'Dt.Compra' ] custodia = custodia[columns] custodia = custodia[custodia.valor > 0] total_na_carteira = custodia['valor'].sum() custodia['valorizacao'] = custodia.apply( lambda row: '{:.2f}'.format(float(row.valorizacao)), axis=1) custodia['valor'] = custodia.apply(lambda row: '{:.2f}'.format(row.valor), axis=1) custodia['preco_atual'] = custodia.apply( lambda row: '{:.2f}'.format(row.preco_atual), axis=1) custodia['preco_medio_compra'] = custodia.apply( lambda row: '{:.2f}'.format(row.preco_medio_compra), axis=1) custodia['ultimo_yield'] = custodia.apply( lambda row: '' if row.ultimo_yield is None else '{:.2f}'.format(row.ultimo_yield), axis=1) relatorio.append( tabulate(custodia, showindex=False, headers=headers, tablefmt='psql')) relatorio.append('Total na carteira : ' + __format(total_na_carteira)) for data in ir.datas: if ir.possui_vendas_no_mes(data): relatorio.append('') relatorio.append( __tab(1) + 'MES : ' + str(data.month) + '/' + str(data.year)) relatorio.append(__tab(1) + 'Vendas:') vendas_no_mes_por_tipo = ir.vendas_no_mes_por_tipo(data) for tipo in TipoTicker: if len(vendas_no_mes_por_tipo[tipo]): relatorio.append(__tab(2) + tipo.name + ':') df_mes_por_tipo = pd.DataFrame(columns=[ 'ticker', 'Qtd Vendida [#]', 'Preco Médio de Compra [R$]', 'Preco Médio de Venda [R$]', 'Resultado Apurado [R$]' ]) for venda in vendas_no_mes_por_tipo[tipo]: df_mes_por_tipo.loc[len(df_mes_por_tipo)] = [ venda['ticker'], str(int(venda['qtd_vendida'])), __format(venda['preco_medio_compra']), __format(venda['preco_medio_venda']), __format(venda['resultado_apurado']) ] relatorio.append( __tab(3) + tabulate(df_mes_por_tipo, headers=df_mes_por_tipo.columns, showindex=False, tablefmt='psql').replace( '\n', '\n' + __tab(3))) relatorio.append( __tab(3) + 'Lucro/Prejuizo no mês: ' + __format(ir.calcula_prejuizo_por_tipo(data, tipo))) relatorio.append( __tab(3) + 'Lucro/Prejuizo acumulado: ' + __format(ir.calcula_prejuizo_acumulado(data, tipo))) relatorio.append( __tab(3) + 'IR no mês para ' + tipo.name + ': ' + __format( calcula_ir_a_pagar( ir.calcula_prejuizo_acumulado(data, tipo), tipo, ir.total_vendido_no_mes_por_tipo(data)[ TipoTicker.ACAO]))) relatorio.append( __tab(2) + 'Dedo-Duro TOTAL no mês: ' + __format(ir.calcula_dedo_duro_no_mes(data))) relatorio.append( __tab(2) + 'IR a pagar TOTAL no mês: ' + __format(ir.calcula_ir_a_pagar_no_mes(data))) return '\n'.join(relatorio)
def relatorio_html(ir, numero_de_meses=None): relatorio = '<html>' relatorio += __h1('RELATORIO') relatorio += __p('') relatorio += __h2('Custódia') custodia = calcula_custodia(ir.df, datetime.datetime.now().date()) custodia = custodia[custodia.valor > 0] total_na_carteira = custodia['valor'].sum() custodia['valorizacao'] = custodia.apply( lambda row: '{:.2f}'.format(float(row.valorizacao)), axis=1) custodia['valor'] = custodia.apply(lambda row: '{:.2f}'.format(row.valor), axis=1) custodia['preco_atual'] = custodia.apply( lambda row: '{:.2f}'.format(row.preco_atual), axis=1) custodia['preco_medio_compra'] = custodia.apply( lambda row: '{:.2f}'.format(row.preco_medio_compra), axis=1) custodia['ultimo_yield'] = custodia.apply( lambda row: '' if row.ultimo_yield is None else '{:.2f}'.format(row.ultimo_yield), axis=1) headers = [ 'ticker', 'qtd', 'valor (R$)', 'Preco Atual (R$)', 'Preco Medio Compra (R$)', 'valorizacao (%)', 'Ultimo Yield [%]', 'tipo', 'Dt.Compra' ] columns = [ 'ticker', 'qtd', 'valor', 'preco_atual', 'preco_medio_compra', 'valorizacao', 'ultimo_yield', 'tipo', 'data_primeira_compra' ] custodia = custodia[columns] custodia.columns = headers relatorio += build_table(custodia, __cor_tabela()) relatorio += __p('Total na carteira : ' + __format(total_na_carteira)) relatorio += __hr() relatorio_meses = [] for data in ir.datas: if ir.possui_vendas_no_mes(data): relatorio_mes = '' relatorio_mes += __p('') relatorio_mes += __h3('MES : ' + str(f'{data.month:02}') + '/' + str(data.year)) relatorio_mes += __p('Vendas:', tab=1) vendas_no_mes_por_tipo = ir.vendas_no_mes_por_tipo(data) for tipo in TipoTicker: if len(vendas_no_mes_por_tipo[tipo]): relatorio_mes += __p(tipo.name + ':', tab=2) df_mes_por_tipo = pd.DataFrame(columns=[ 'ticker', 'Qtd Vendida [#]', 'Preco Médio de Compra [R$]', 'Preco Médio de Venda [R$]', 'Resultado Apurado [R$]' ]) for venda in vendas_no_mes_por_tipo[tipo]: df_mes_por_tipo.loc[len(df_mes_por_tipo)] = [ venda['ticker'], str(int(venda['qtd_vendida'])), __format(venda['preco_medio_compra']), __format(venda['preco_medio_venda']), __format(venda['resultado_apurado']) ] relatorio_mes += __p(build_table(df_mes_por_tipo, __cor_tabela(tipo)), tab=3) relatorio_mes += __p( 'Lucro/Prejuizo no mês: ' + __format(ir.calcula_prejuizo_por_tipo(data, tipo)), tab=3) relatorio_mes += __p( 'Lucro/Prejuizo acumulado: ' + __format(ir.calcula_prejuizo_acumulado(data, tipo)), tab=3) relatorio_mes += __p( 'IR no mês para ' + tipo.name + ': ' + __format( calcula_ir_a_pagar( ir.calcula_prejuizo_acumulado(data, tipo), tipo, ir.total_vendido_no_mes_por_tipo(data)[ TipoTicker.ACAO])), tab=3) relatorio_mes += __p('Dedo-Duro TOTAL no mês: ' + __format(ir.calcula_dedo_duro_no_mes(data)), tab=2) relatorio_mes += __p('IR a pagar TOTAL no mês: ' + __format(ir.calcula_ir_a_pagar_no_mes(data)), tab=2) relatorio_mes += __hr() relatorio_meses.append(relatorio_mes) if numero_de_meses and numero_de_meses > 0: for relatorio_mes in relatorio_meses[-numero_de_meses:]: relatorio += relatorio_mes else: for relatorio_mes in relatorio_meses: relatorio += relatorio_mes relatorio += __close_html() return ''.join(relatorio)