Source code for app.portfolio.models.transaction.transaction_impl

# SPDX-License-Identifier: GPLv3-or-later
# Copyright © 2025 pygaindalf Rui Pinheiro

from abc import ABCMeta
from typing import TYPE_CHECKING

from ....util.helpers.empty_class import empty_class
from ..entity import EntityImpl
from .transaction_schema import TransactionSchema


if TYPE_CHECKING:
    from decimal import Decimal

    from iso4217 import Currency

    from ..instrument import Instrument


[docs] class TransactionImpl( EntityImpl, TransactionSchema if TYPE_CHECKING else empty_class(), metaclass=ABCMeta, ): # MARK: Instrument @property def instrument(self) -> Instrument: from ..ledger import Ledger parent = self.entity.instance_parent if parent is None or not isinstance(parent, Ledger): msg = f"Transaction.instrument requires parent to be a Ledger, got {type(parent)}" raise TypeError(msg) return parent.instrument # MARK: Currency @property def currency(self) -> Currency: if (currency := self.txn_currency) is not None: return currency elif self.is_journal: return self.instrument.get_journal_field("currency", create=False) else: return self.instrument.currency # MARK: Forex
[docs] def get_consideration_in_currency(self, currency: Currency, *, use_forex_annotation: bool = True) -> Decimal: if use_forex_annotation: from ..annotation.forex import ForexAnnotation if (annotation := self.get_annotation(ForexAnnotation)) is not None: return annotation.get_consideration_in_currency(currency) return self.forex_provider.convert_currency(amount=self.consideration, source=self.currency, target=currency, date=self.date)