Search in sources :

Example 31 with Money

use of name.abuchen.portfolio.money.Money in project portfolio by buchen.

the class CSVPortfolioTransactionExtractor method createGrossValueIfNecessary.

private void createGrossValueIfNecessary(String[] rawValues, Map<String, Column> field2column, PortfolioTransaction transaction) throws ParseException {
    if (transaction.getSecurity().getCurrencyCode().equals(transaction.getCurrencyCode()))
        return;
    BigDecimal exchangeRate = getBigDecimal(Messages.CSVColumn_ExchangeRate, rawValues, field2column);
    if (exchangeRate != null && exchangeRate.compareTo(BigDecimal.ZERO) != 0) {
        Money grossValue = transaction.getGrossValue();
        Money forex = Money.of(transaction.getSecurity().getCurrencyCode(), Math.round(exchangeRate.multiply(BigDecimal.valueOf(grossValue.getAmount())).doubleValue()));
        exchangeRate = BigDecimal.ONE.divide(exchangeRate, 10, BigDecimal.ROUND_HALF_DOWN);
        transaction.addUnit(new Unit(Unit.Type.GROSS_VALUE, grossValue, forex, exchangeRate));
    }
}
Also used : Money(name.abuchen.portfolio.money.Money) CurrencyUnit(name.abuchen.portfolio.money.CurrencyUnit) Unit(name.abuchen.portfolio.model.Transaction.Unit) BigDecimal(java.math.BigDecimal)

Example 32 with Money

use of name.abuchen.portfolio.money.Money in project portfolio by buchen.

the class BankSLMPDFExtractor method addDividendTransaction.

@SuppressWarnings("nls")
private void addDividendTransaction() {
    DocumentType type = new DocumentType("Dividende");
    this.addDocumentTyp(type);
    Block block = new Block("Dividende");
    type.addBlock(block);
    Transaction<AccountTransaction> extractor = new Transaction<AccountTransaction>().subject(() -> {
        AccountTransaction transaction = new AccountTransaction();
        transaction.setType(AccountTransaction.Type.DIVIDENDS);
        return transaction;
    }).section("date", "shares", "name", "wkn", "currency").match(// 
    "Am (?<date>\\d+.\\d+.\\d{4}+) wurde folgende Dividende gutgeschrieben:").match(// 
    "^.*$").match(// 
    "^(?<name>.*)$").match(// 
    "^Valor: (?<wkn>[^ ]*)$").match(// 
    "Brutto \\((?<shares>[\\d.']+) \\* ... ([\\d.']+)\\) (?<currency>\\w{3}+) ([\\d.']+)").assign((t, v) -> {
        t.setDateTime(asDate(v.get("date")));
        t.setShares(asShares(v.get("shares")));
        t.setSecurity(getOrCreateSecurity(v));
    }).section("amount", // 
    "currency").match(// 
    "Netto (?<currency>\\w{3}+) (?<amount>[\\d.']+)").assign((t, v) -> {
        t.setAmount(asAmount(v.get("amount")));
        t.setCurrencyCode(v.get("currency"));
    }).section("fees", "currency").optional().match(// 
    ".* Verrechnungssteuer (?<currency>\\w{3}+) -(?<fees>[\\d.']+)").assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fees")))))).section("fees", "currency").optional().match(// 
    ".* Quellensteuer (?<currency>\\w{3}+) -(?<fees>[\\d.']+)").assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fees")))))).section("fees", "currency").optional().match(// 
    ".* Nicht r.ckforderbare Steuern (?<currency>\\w{3}+) -(?<fees>[\\d.']+)").assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fees")))))).section("grossValue", "forexSum", "forexCurrency", "totalValue", "currency", // 
    "exchangeRate").optional().match(// 
    "Brutto \\(([\\d.']+) \\* ... ([\\d.']+)\\) (\\w{3}+) (?<grossValue>[\\d.']+)").match(// 
    "Netto (?<forexCurrency>\\w{3}+) (?<forexSum>[\\d.']+)").match(// 
    "Change ... / ... (?<exchangeRate>[\\d.']+) (?<currency>\\w{3}+) (?<totalValue>[\\d.'-]+)").assign((t, v) -> {
        // NOSONAR
        // if we end up in the branch, then we have forex
        // dividends and must convert taxes in local
        // currency
        Money totalValue = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("totalValue")));
        t.setMonetaryAmount(totalValue);
        // keep tax units in case we need to convert them
        List<Unit> tax = t.getUnits().collect(Collectors.toList());
        t.clearUnits();
        Money forexGrossValue = Money.of(asCurrencyCode(v.get("forexCurrency")), asAmount(v.get("grossValue")));
        BigDecimal exchangeRate = asExchangeRate(v.get("exchangeRate"));
        Money grossValue = Money.of(totalValue.getCurrencyCode(), Math.round(exchangeRate.doubleValue() * forexGrossValue.getAmount()));
        Unit unit = new Unit(Unit.Type.GROSS_VALUE, grossValue, forexGrossValue, exchangeRate);
        t.addUnit(unit);
        // convert tax units
        tax.stream().forEach(u -> {
            if (u.getAmount().getCurrencyCode().equals(t.getCurrencyCode())) {
                t.addUnit(u);
            } else {
                Money txm = Money.of(t.getCurrencyCode(), Math.round(exchangeRate.doubleValue() * u.getAmount().getAmount()));
                Unit fu = new Unit(Unit.Type.TAX, txm, u.getAmount(), exchangeRate);
                t.addUnit(fu);
            }
        });
    }).wrap(t -> new TransactionItem(t));
    block.set(extractor);
}
Also used : PortfolioTransaction(name.abuchen.portfolio.model.PortfolioTransaction) Money(name.abuchen.portfolio.money.Money) Values(name.abuchen.portfolio.money.Values) Client(name.abuchen.portfolio.model.Client) Block(name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) DocumentType(name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) NumberFormat(java.text.NumberFormat) BigDecimal(java.math.BigDecimal) List(java.util.List) Transaction(name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction) Unit(name.abuchen.portfolio.model.Transaction.Unit) Locale(java.util.Locale) BuySellEntry(name.abuchen.portfolio.model.BuySellEntry) ParseException(java.text.ParseException) Money(name.abuchen.portfolio.money.Money) PortfolioTransaction(name.abuchen.portfolio.model.PortfolioTransaction) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) Transaction(name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction) DocumentType(name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType) Block(name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block) List(java.util.List) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) Unit(name.abuchen.portfolio.model.Transaction.Unit) BigDecimal(java.math.BigDecimal)

Example 33 with Money

use of name.abuchen.portfolio.money.Money in project portfolio by buchen.

the class ClientPerformanceSnapshot method addCurrencyGains.

private void addCurrencyGains() {
    Map<String, MutableMoney> currency2money = new HashMap<>();
    for (AccountSnapshot snapshot : snapshotStart.getAccounts()) {
        if (converter.getTermCurrency().equals(snapshot.getAccount().getCurrencyCode()))
            continue;
        MutableMoney value = currency2money.computeIfAbsent(snapshot.getAccount().getCurrencyCode(), c -> MutableMoney.of(converter.getTermCurrency()));
        // subtract initial values
        value.subtract(snapshot.getFunds());
        // add and subtract transactions
        for (AccountTransaction t : snapshot.getAccount().getTransactions()) {
            if (!period.containsTransaction().test(t))
                continue;
            switch(t.getType()) {
                case DIVIDENDS:
                case INTEREST:
                case DEPOSIT:
                case TAX_REFUND:
                case SELL:
                case FEES_REFUND:
                    value.subtract(t.getMonetaryAmount().with(converter.at(t.getDateTime())));
                    break;
                case REMOVAL:
                case FEES:
                case INTEREST_CHARGE:
                case TAXES:
                case BUY:
                    value.add(t.getMonetaryAmount().with(converter.at(t.getDateTime())));
                    break;
                case TRANSFER_IN:
                    value.subtract(determineTransferAmount(t));
                    break;
                case TRANSFER_OUT:
                    value.add(determineTransferAmount(t));
                    break;
                default:
                    throw new UnsupportedOperationException();
            }
        }
    }
    // add final values (if in foreign currency)
    for (AccountSnapshot snapshot : snapshotEnd.getAccounts()) {
        if (converter.getTermCurrency().equals(snapshot.getAccount().getCurrencyCode()))
            continue;
        currency2money.computeIfAbsent(snapshot.getAccount().getCurrencyCode(), // 
        c -> MutableMoney.of(converter.getTermCurrency())).add(snapshot.getFunds());
    }
    Category currencyGains = categories.get(CategoryType.CURRENCY_GAINS);
    currency2money.forEach((currency, money) -> {
        currencyGains.valuation = currencyGains.valuation.add(money.toMoney());
        currencyGains.positions.add(new Position(currency, money.toMoney()));
    });
    Collections.sort(currencyGains.positions, (p1, p2) -> p1.getLabel().compareTo(p2.getLabel()));
}
Also used : PortfolioTransaction(name.abuchen.portfolio.model.PortfolioTransaction) Money(name.abuchen.portfolio.money.Money) Client(name.abuchen.portfolio.model.Client) Transaction(name.abuchen.portfolio.model.Transaction) Account(name.abuchen.portfolio.model.Account) EnumMap(java.util.EnumMap) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) TransactionPair(name.abuchen.portfolio.model.TransactionPair) HashMap(java.util.HashMap) Security(name.abuchen.portfolio.model.Security) Messages(name.abuchen.portfolio.Messages) MutableMoney(name.abuchen.portfolio.money.MutableMoney) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) List(java.util.List) Unit(name.abuchen.portfolio.model.Transaction.Unit) CurrencyConverter(name.abuchen.portfolio.money.CurrencyConverter) MoneyCollectors(name.abuchen.portfolio.money.MoneyCollectors) LocalDate(java.time.LocalDate) Map(java.util.Map) Collections(java.util.Collections) Portfolio(name.abuchen.portfolio.model.Portfolio) MutableMoney(name.abuchen.portfolio.money.MutableMoney) HashMap(java.util.HashMap) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction)

Example 34 with Money

use of name.abuchen.portfolio.money.Money in project portfolio by buchen.

the class ClientPerformanceSnapshot method addEarningTransaction.

private void addEarningTransaction(Account account, AccountTransaction transaction, MutableMoney mEarnings, MutableMoney mOtherEarnings, MutableMoney mTaxes, Map<Security, MutableMoney> earningsBySecurity) {
    this.earnings.add(new TransactionPair<AccountTransaction>(account, transaction));
    Money tax = transaction.getUnitSum(Unit.Type.TAX, converter).with(converter.at(transaction.getDateTime()));
    Money earned = transaction.getGrossValue().with(converter.at(transaction.getDateTime()));
    mEarnings.add(earned);
    if (!tax.isZero()) {
        mTaxes.add(tax);
        taxes.add(new TransactionPair<AccountTransaction>(account, transaction));
    }
    if (transaction.getSecurity() != null)
        earningsBySecurity.computeIfAbsent(transaction.getSecurity(), k -> MutableMoney.of(converter.getTermCurrency())).add(earned);
    else
        mOtherEarnings.add(earned);
}
Also used : Money(name.abuchen.portfolio.money.Money) MutableMoney(name.abuchen.portfolio.money.MutableMoney) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction)

Example 35 with Money

use of name.abuchen.portfolio.money.Money in project portfolio by buchen.

the class PerformanceIndex method calculateAbsoluteInvestedCapital.

/**
 * Calculates the absolute invested capital, i.e. starting with the first
 * transaction recorded for the client.
 */
public long[] calculateAbsoluteInvestedCapital() {
    ToLongBiFunction<Money, LocalDateTime> convertIfNecessary = (amount, date) -> {
        if (amount.getCurrencyCode().equals(getCurrencyConverter().getTermCurrency()))
            return amount.getAmount();
        else
            return getCurrencyConverter().convert(date, amount).getAmount();
    };
    long startValue = 0;
    Interval interval = getActualInterval();
    LocalDateTime intervalStart = interval.getStart().atStartOfDay();
    for (Account account : getClient().getAccounts()) startValue += // 
    account.getTransactions().stream().filter(t -> t.getType() == AccountTransaction.Type.DEPOSIT || t.getType() == AccountTransaction.Type.REMOVAL).filter(// 
    t -> t.getDateTime().isBefore(intervalStart)).mapToLong(t -> {
        if (t.getType() == AccountTransaction.Type.DEPOSIT)
            return convertIfNecessary.applyAsLong(t.getMonetaryAmount(), t.getDateTime());
        else if (t.getType() == AccountTransaction.Type.REMOVAL)
            return -convertIfNecessary.applyAsLong(t.getMonetaryAmount(), t.getDateTime());
        else
            return 0;
    }).sum();
    for (Portfolio portfolio : getClient().getPortfolios()) startValue += // 
    portfolio.getTransactions().stream().filter(t -> t.getType() == PortfolioTransaction.Type.DELIVERY_INBOUND || t.getType() == PortfolioTransaction.Type.DELIVERY_OUTBOUND).filter(// 
    t -> t.getDateTime().isBefore(intervalStart)).mapToLong(t -> {
        if (t.getType() == PortfolioTransaction.Type.DELIVERY_INBOUND)
            return convertIfNecessary.applyAsLong(t.getMonetaryAmount(), t.getDateTime());
        else if (t.getType() == PortfolioTransaction.Type.DELIVERY_OUTBOUND)
            return -convertIfNecessary.applyAsLong(t.getMonetaryAmount(), t.getDateTime());
        else
            return 0;
    }).sum();
    return calculateInvestedCapital(startValue);
}
Also used : LocalDateTime(java.time.LocalDateTime) PortfolioTransaction(name.abuchen.portfolio.model.PortfolioTransaction) Arrays(java.util.Arrays) Money(name.abuchen.portfolio.money.Money) Values(name.abuchen.portfolio.money.Values) Client(name.abuchen.portfolio.model.Client) LocalDateTime(java.time.LocalDateTime) Messages(name.abuchen.portfolio.Messages) Classification(name.abuchen.portfolio.model.Classification) ToLongBiFunction(java.util.function.ToLongBiFunction) ClientClassificationFilter(name.abuchen.portfolio.snapshot.filter.ClientClassificationFilter) OutputStreamWriter(java.io.OutputStreamWriter) Interval(name.abuchen.portfolio.util.Interval) TradeCalendar(name.abuchen.portfolio.util.TradeCalendar) Portfolio(name.abuchen.portfolio.model.Portfolio) Account(name.abuchen.portfolio.model.Account) Predicate(java.util.function.Predicate) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) Volatility(name.abuchen.portfolio.math.Risk.Volatility) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) Drawdown(name.abuchen.portfolio.math.Risk.Drawdown) Security(name.abuchen.portfolio.model.Security) PortfolioClientFilter(name.abuchen.portfolio.snapshot.filter.PortfolioClientFilter) File(java.io.File) StandardCharsets(java.nio.charset.StandardCharsets) List(java.util.List) CurrencyConverter(name.abuchen.portfolio.money.CurrencyConverter) LocalDate(java.time.LocalDate) ClientSecurityFilter(name.abuchen.portfolio.snapshot.filter.ClientSecurityFilter) Writer(java.io.Writer) Optional(java.util.Optional) Collections(java.util.Collections) CSVStrategy(org.apache.commons.csv.CSVStrategy) CSVPrinter(org.apache.commons.csv.CSVPrinter) Money(name.abuchen.portfolio.money.Money) Account(name.abuchen.portfolio.model.Account) Portfolio(name.abuchen.portfolio.model.Portfolio) Interval(name.abuchen.portfolio.util.Interval)

Aggregations

Money (name.abuchen.portfolio.money.Money)38 Unit (name.abuchen.portfolio.model.Transaction.Unit)19 AccountTransaction (name.abuchen.portfolio.model.AccountTransaction)18 PortfolioTransaction (name.abuchen.portfolio.model.PortfolioTransaction)16 Client (name.abuchen.portfolio.model.Client)15 BigDecimal (java.math.BigDecimal)13 BuySellEntry (name.abuchen.portfolio.model.BuySellEntry)13 MutableMoney (name.abuchen.portfolio.money.MutableMoney)12 IOException (java.io.IOException)10 Security (name.abuchen.portfolio.model.Security)10 Block (name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block)9 DocumentType (name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType)9 Transaction (name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction)9 Map (java.util.Map)8 Account (name.abuchen.portfolio.model.Account)7 AssetPosition (name.abuchen.portfolio.snapshot.AssetPosition)7 LocalDate (java.time.LocalDate)6 ArrayList (java.util.ArrayList)6 List (java.util.List)6 Portfolio (name.abuchen.portfolio.model.Portfolio)6