Exemple #1
0
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)
Exemple #2
0
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