class LancamentoListCommand(object): def __init__(self): self._dao = Inject('lancamento dao') def lancamento_parser_created_handler(self, lancamento_parser): parser = lancamento_parser.add_parser( 'list', aliases=['ls'], help='Lista os lançamentos existentes') parser.set_defaults(event='lancamento_list_command') # TODO # parser.add_argument('-f', '--filter', type=str, help='Filter to be applied') # parser.add_argument('-b', '--balance', action='store_true', help='Calculate the balances for each line') def lancamento_list_command_handler(self, args): lancamentos = self._dao.list_with_contas() return 'ok', {'lancamentos': lancamentos} def lancamento_list_command_ok_handler(self, lancamentos): factory = TablePrinterFactory() factory.date_column().of_attr('data').add() factory.string_column().of_attr('origem.nome').add() factory.string_column().of_attr('destino.nome').add() factory.currency_column().of_attr('valor').add() factory.string_column().of_attr('observacao').title('Observação').add() printer = factory.create() printer.print(lancamentos)
class LancamentoBalanceHandler(object): def __init__(self): self._lancamento_dao = Inject('lancamento dao') def lancamento_balance_command_handler(self, args): # TODO Limit this by date lancamentos = self._lancamento_dao.list_with_contas() lancamentos_per_day = self._group_lancamentos_per_day(lancamentos) saldos = dict() balance = dict() for data, lancamentos in lancamentos_per_day.items(): for lancamento in lancamentos: self._update_balance(balance, lancamento.origem, -lancamento.valor) self._update_balance(balance, lancamento.destino, lancamento.valor) saldos[data] = dict(balance) contas = list(set(balance.keys())) contas.sort() return 'ok', {'saldos': saldos, 'contas': contas} def _group_lancamentos_per_day(self, lancamentos): lancamentos_per_day = {} for lancamento in lancamentos: day_lancamentos = lancamentos_per_day.setdefault( lancamento.data, []) day_lancamentos.append(lancamento) return lancamentos_per_day def _update_balance(self, diario, conta, valor): if 'contabilizável' in conta.propriedades: saldo = diario.setdefault(conta.nome, Decimal(0)) saldo += Decimal(valor) / Decimal(100) diario[conta.nome] = saldo