Example #1
0
def balance_sheet_table(context, ledger_or_entity, end_date):
    user_model = context['user']
    activity = context['request'].GET.get('activity')
    activity = validate_activity(activity, raise_404=True)
    return ledger_or_entity.digest(activity=activity,
                                   user_model=user_model,
                                   equity_only=False,
                                   to_date=end_date,
                                   process_groups=True)
Example #2
0
def income_statement_table(context, ledger_or_entity, start_date, end_date):
    user_model = context['user']
    activity = context['request'].GET.get('activity')
    activity = validate_activity(activity, raise_404=True)
    return ledger_or_entity.digest(activity=activity,
                                   user_model=user_model,
                                   from_date=start_date,
                                   to_date=end_date,
                                   equity_only=True,
                                   process_groups=True)
Example #3
0
def balance_sheet_table(context, io_model, end_date):
    user_model = context['user']
    activity = context['request'].GET.get('activity')
    activity = validate_activity(activity, raise_404=True)
    entity_slug = context['view'].kwargs.get('entity_slug')
    unit_slug = context['view'].kwargs.get('unit')
    if not unit_slug:
        unit_slug = context['request'].GET.get('unit')
    return io_model.digest(activity=activity,
                           user_model=user_model,
                           equity_only=False,
                           entity_slug=entity_slug,
                           unit_slug=unit_slug,
                           to_date=end_date,
                           process_groups=True)
Example #4
0
def balance_sheet_table(context, io_model, to_date):
    user_model = context['user']
    activity = context['request'].GET.get('activity')
    activity = validate_activity(activity, raise_404=True)
    entity_slug = context['view'].kwargs.get('entity_slug')

    prepare_context_by_unit(context)

    digest = io_model.digest(activity=activity,
                             user_model=user_model,
                             equity_only=False,
                             entity_slug=entity_slug,
                             unit_slug=context['unit_slug'],
                             by_unit=context['by_unit'],
                             to_date=to_date,
                             process_groups=True)

    digest['by_unit'] = context['by_unit']
    digest['unit_model'] = context['unit_model']
    digest['unit_slug'] = context['unit_slug']
    return digest
Example #5
0
    def get_txs_queryset(self,
                         user_model: UserModel,
                         to_date: str or datetime = None,
                         from_date: str or datetime = None,
                         activity: str = None,
                         role: str = None,
                         entity_slug: str = None,
                         unit_slug: str = None,
                         accounts: str or List[str] or Set[str] = None,
                         posted: bool = True,
                         exclude_zero_bal: bool = True,
                         by_period: bool = False):

        activity = validate_activity(activity)
        role = roles.validate_roles(role)
        from_date, to_date = validate_dates(from_date, to_date)

        TransactionModel = lazy_importer.get_txs_model()

        # If IO is on entity model....
        if isinstance(self, lazy_importer.get_entity_model()):
            if unit_slug:
                txs_qs = TransactionModel.objects.for_unit(
                    user_model=user_model,
                    entity_slug=entity_slug or self.slug,
                    unit_slug=unit_slug)
            else:
                txs_qs = TransactionModel.objects.for_entity(
                    user_model=user_model, entity_model=self)

        # If IO is on ledger model....
        elif isinstance(self, lazy_importer.get_ledger_model()):
            txs_qs = TransactionModel.objects.for_ledger(user_model=user_model,
                                                         ledger_model=self)
        elif isinstance(self, lazy_importer.get_unit_model()):
            if not entity_slug:
                raise ValidationError(
                    'Calling digest from Entity Unit requires entity_slug')
            txs_qs = TransactionModel.objects.for_unit(user_model=user_model,
                                                       entity_slug=entity_slug,
                                                       unit_model=self)
        else:
            txs_qs = TransactionModel.objects.none()

        if exclude_zero_bal:
            txs_qs = txs_qs.filter(amount__gt=0)

        if posted:
            txs_qs = txs_qs.posted()

        if from_date:
            txs_qs = txs_qs.from_date(from_date=from_date)

        if to_date:
            txs_qs = txs_qs.to_date(to_date=to_date)

        if accounts:
            if not isinstance(accounts, str):
                accounts = [accounts]
            txs_qs = txs_qs.for_accounts(account_list=accounts)

        if activity:
            if isinstance(activity, str):
                activity = [activity]
            txs_qs = txs_qs.for_activity(activity_list=activity)

        if role:
            if isinstance(role, str):
                role = [role]
            txs_qs = txs_qs.for_roles(role_list=role)

        txs_qs = txs_qs.values(
            'account__uuid',
            'account__balance_type',
            'tx_type',
            'account__code',
            'account__name',
            'account__role',
        )

        if by_period:
            txs_qs = txs_qs.annotate(
                balance=Sum('amount'),
                dt_idx=TruncMonth('journal_entry__date'),
            ).order_by('journal_entry__date', 'account__uuid')
        else:
            txs_qs = txs_qs.annotate(
                balance=Sum('amount'), ).order_by('account__uuid')

        return txs_qs
Example #6
0
    def commit_txs(self,
                   je_date: str or datetime,
                   je_txs: list,
                   je_activity: str,
                   je_posted: bool = False,
                   je_ledger=None,
                   je_desc=None,
                   je_origin=None,
                   je_parent=None):
        """
        Creates JE from TXS list using provided account_id.

        TXS = List[{
            'account_id': Account Database UUID
            'tx_type': credit/debit,
            'amount': Decimal/Float/Integer,
            'description': string,
            'staged_tx_model': StagedTransactionModel or None
        }]

        :param je_date:
        :param je_txs:
        :param je_activity:
        :param je_posted:
        :param je_ledger:
        :param je_desc:
        :param je_origin:
        :param je_parent:
        :return:
        """
        # Validates that credits/debits balance.
        validate_tx_data(je_txs)

        # Validates that the activity is valid.
        je_activity = validate_activity(je_activity)

        if all([
                isinstance(self, lazy_importer.get_entity_model()),
                not je_ledger
        ]):
            raise ValidationError('Must pass an instance of LedgerModel')

        if not je_ledger:
            je_ledger = self

        je_model = JournalEntryModel.objects.create(ledger=je_ledger,
                                                    description=je_desc,
                                                    date=je_date,
                                                    origin=je_origin,
                                                    activity=je_activity,
                                                    posted=je_posted,
                                                    parent=je_parent)

        TransactionModel = lazy_importer.get_txs_model()
        txs_models = [
            TransactionModel(account_id=tx['account_id'],
                             tx_type=tx['tx_type'],
                             amount=tx['amount'],
                             description=tx['description'],
                             journal_entry=je_model,
                             stagedtransactionmodel=tx.get('staged_tx_model'))
            for tx in je_txs
        ]
        txs_models = TransactionModel.objects.bulk_create(txs_models)
        return je_model, txs_models