Search in sources :

Example 16 with Money

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

the class CSVExporter method exportPortfolioTransactions.

public void exportPortfolioTransactions(File file, Portfolio portfolio) throws IOException {
    try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)) {
        CSVPrinter printer = new CSVPrinter(writer);
        printer.setStrategy(STRATEGY);
        printer.println(new String[] { // 
        Messages.CSVColumn_Date, // 
        Messages.CSVColumn_Type, // 
        Messages.CSVColumn_Value, // 
        Messages.CSVColumn_TransactionCurrency, // 
        Messages.CSVColumn_GrossAmount, // 
        Messages.CSVColumn_CurrencyGrossAmount, // 
        Messages.CSVColumn_ExchangeRate, // 
        Messages.CSVColumn_Fees, // 
        Messages.CSVColumn_Taxes, // 
        Messages.CSVColumn_Shares, // 
        Messages.CSVColumn_ISIN, // 
        Messages.CSVColumn_WKN, // 
        Messages.CSVColumn_TickerSymbol, // 
        Messages.CSVColumn_SecurityName, Messages.CSVColumn_Note });
        for (PortfolioTransaction t : portfolio.getTransactions()) {
            printer.print(t.getDateTime().toString());
            printer.print(t.getType().toString());
            printer.print(Values.Amount.format(t.getType().isLiquidation() ? -t.getAmount() : t.getAmount()));
            printer.print(t.getCurrencyCode());
            // gross amount
            Optional<Unit> grossAmount = t.getUnit(Unit.Type.GROSS_VALUE);
            if (grossAmount.isPresent()) {
                Money forex = grossAmount.get().getForex();
                printer.print(Values.Amount.format(forex.getAmount()));
                printer.print(forex.getCurrencyCode());
                printer.print(Values.ExchangeRate.format(grossAmount.get().getExchangeRate()));
            } else {
                // $NON-NLS-1$
                printer.print("");
                // $NON-NLS-1$
                printer.print("");
                // $NON-NLS-1$
                printer.print("");
            }
            printer.print(Values.Amount.format(t.getUnitSum(Unit.Type.FEE).getAmount()));
            printer.print(Values.Amount.format(t.getUnitSum(Unit.Type.TAX).getAmount()));
            printer.print(Values.Share.format(t.getShares()));
            printSecurityInfo(printer, t);
            printer.print(escapeNull(t.getNote()));
            printer.println();
        }
    }
}
Also used : CSVPrinter(org.apache.commons.csv.CSVPrinter) Money(name.abuchen.portfolio.money.Money) PortfolioTransaction(name.abuchen.portfolio.model.PortfolioTransaction) FileOutputStream(java.io.FileOutputStream) OutputStreamWriter(java.io.OutputStreamWriter) Unit(name.abuchen.portfolio.model.Transaction.Unit) Writer(java.io.Writer) OutputStreamWriter(java.io.OutputStreamWriter)

Example 17 with Money

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

the class CSVPortfolioTransactionExtractor method extractGrossAmount.

private Unit extractGrossAmount(String[] rawValues, Map<String, Column> field2column, Money amount) throws ParseException {
    Long grossAmount = getAmount(Messages.CSVColumn_GrossAmount, rawValues, field2column);
    String currencyCode = getCurrencyCode(Messages.CSVColumn_CurrencyGrossAmount, rawValues, field2column);
    BigDecimal exchangeRate = getBigDecimal(Messages.CSVColumn_ExchangeRate, rawValues, field2column);
    // amount currency equals the transaction currency, no unit is created
    if (currencyCode == null || amount.getCurrencyCode().equals(currencyCode))
        return null;
    // if no gross amount is given at all, no unit
    if (grossAmount == null || grossAmount.longValue() == 0)
        return null;
    // if no exchange rate is available, not unit to create
    if (exchangeRate == null || exchangeRate.compareTo(BigDecimal.ZERO) == 0)
        return null;
    Money forex = Money.of(currencyCode, Math.abs(grossAmount.longValue()));
    BigDecimal grossAmountConverted = exchangeRate.multiply(BigDecimal.valueOf(grossAmount));
    Money converted = Money.of(amount.getCurrencyCode(), Math.round(grossAmountConverted.doubleValue()));
    return new Unit(Unit.Type.GROSS_VALUE, converted, 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 18 with Money

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

the class CSVPortfolioTransactionExtractor method extract.

@Override
void extract(List<Item> items, String[] rawValues, Map<String, Column> field2column) throws ParseException {
    // if forex gross amount is available then assume that is the currency
    // of the security to be created
    // check if we have a security
    Security security = getSecurity(rawValues, field2column, s -> {
        String currency = getText(Messages.CSVColumn_CurrencyGrossAmount, rawValues, field2column);
        if (currency == null || currency.isEmpty())
            currency = getText(Messages.CSVColumn_TransactionCurrency, rawValues, field2column);
        if (currency != null) {
            CurrencyUnit unit = CurrencyUnit.getInstance(currency.trim());
            s.setCurrencyCode(unit == null ? getClient().getBaseCurrency() : unit.getCurrencyCode());
        }
    });
    if (security == null)
        throw new ParseException(MessageFormat.format(Messages.CSVImportMissingSecurity, // $NON-NLS-1$
        new StringJoiner(", ").add(Messages.CSVColumn_ISIN).add(Messages.CSVColumn_TickerSymbol).add(Messages.CSVColumn_WKN).toString()), 0);
    // check for the transaction amount
    Money amount = getMoney(rawValues, field2column);
    // determine type (if not explicitly given by import)
    Type type = inferType(rawValues, field2column, amount);
    // determine remaining fields
    LocalDateTime date = getDate(Messages.CSVColumn_Date, rawValues, field2column);
    if (date == null)
        throw new ParseException(MessageFormat.format(Messages.CSVImportMissingField, Messages.CSVColumn_Date), 0);
    Long shares = getShares(Messages.CSVColumn_Shares, rawValues, field2column);
    Long fees = getAmount(Messages.CSVColumn_Fees, rawValues, field2column);
    Long taxes = getAmount(Messages.CSVColumn_Taxes, rawValues, field2column);
    String note = getText(Messages.CSVColumn_Note, rawValues, field2column);
    Unit grossAmount = extractGrossAmount(rawValues, field2column, amount);
    switch(type) {
        case BUY:
        case SELL:
            items.add(createBuySell(rawValues, field2column, type, security, amount, fees, taxes, date, note, shares, grossAmount));
            break;
        case TRANSFER_IN:
        case TRANSFER_OUT:
            items.add(createTransfer(security, amount, fees, taxes, date, note, shares, grossAmount));
            break;
        case DELIVERY_INBOUND:
        case DELIVERY_OUTBOUND:
            items.add(createDelivery(rawValues, field2column, type, security, amount, fees, taxes, date, note, shares, grossAmount));
            break;
        default:
            throw new IllegalArgumentException(type.toString());
    }
}
Also used : LocalDateTime(java.time.LocalDateTime) Money(name.abuchen.portfolio.money.Money) CurrencyUnit(name.abuchen.portfolio.money.CurrencyUnit) Type(name.abuchen.portfolio.model.PortfolioTransaction.Type) ParseException(java.text.ParseException) Security(name.abuchen.portfolio.model.Security) CurrencyUnit(name.abuchen.portfolio.money.CurrencyUnit) Unit(name.abuchen.portfolio.model.Transaction.Unit) StringJoiner(java.util.StringJoiner)

Example 19 with Money

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

the class InvestmentPlan method createTransaction.

private PortfolioTransaction createTransaction(CurrencyConverter converter, LocalDate tDate) {
    String targetCurrencyCode = getCurrencyCode();
    boolean needsCurrencyConversion = !targetCurrencyCode.equals(security.getCurrencyCode());
    Transaction.Unit forex = null;
    long price = getSecurity().getSecurityPrice(tDate).getValue();
    long availableAmount = amount - fees;
    if (needsCurrencyConversion) {
        Money availableMoney = Money.of(targetCurrencyCode, amount - fees);
        availableAmount = converter.with(security.getCurrencyCode()).convert(tDate, availableMoney).getAmount();
        forex = new // 
        Transaction.Unit(// 
        Unit.Type.GROSS_VALUE, // 
        availableMoney, // 
        Money.of(security.getCurrencyCode(), availableAmount), converter.with(targetCurrencyCode).getRate(tDate, security.getCurrencyCode()).getValue());
    }
    long shares = Math.round(availableAmount * Values.Share.factor() * Values.Quote.factorToMoney() / (double) price);
    if (account != null) {
        // create buy transaction
        BuySellEntry entry = new BuySellEntry(portfolio, account);
        entry.setType(PortfolioTransaction.Type.BUY);
        entry.setDate(tDate.atStartOfDay());
        entry.setShares(shares);
        entry.setCurrencyCode(targetCurrencyCode);
        entry.setAmount(amount);
        entry.setSecurity(getSecurity());
        if (fees != 0)
            entry.getPortfolioTransaction().addUnit(new Transaction.Unit(Unit.Type.FEE, Money.of(targetCurrencyCode, fees)));
        if (forex != null)
            entry.getPortfolioTransaction().addUnit(forex);
        entry.insert();
        return entry.getPortfolioTransaction();
    } else {
        // create inbound delivery
        PortfolioTransaction transaction = new PortfolioTransaction();
        transaction.setDateTime(tDate.atStartOfDay());
        transaction.setType(PortfolioTransaction.Type.DELIVERY_INBOUND);
        transaction.setSecurity(security);
        transaction.setCurrencyCode(targetCurrencyCode);
        transaction.setAmount(amount);
        transaction.setShares(shares);
        if (fees != 0)
            transaction.addUnit(new Transaction.Unit(Unit.Type.FEE, Money.of(targetCurrencyCode, fees)));
        if (forex != null)
            transaction.addUnit(forex);
        portfolio.addTransaction(transaction);
        return transaction;
    }
}
Also used : Money(name.abuchen.portfolio.money.Money) Unit(name.abuchen.portfolio.model.Transaction.Unit) Unit(name.abuchen.portfolio.model.Transaction.Unit)

Example 20 with Money

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

the class DividendsViewModel method calculate.

private void calculate() {
    // determine the number of full months within period
    LocalDate now = LocalDate.now();
    if (startYear > now.getYear())
        throw new IllegalArgumentException();
    this.noOfmonths = (now.getYear() - startYear) * 12 + now.getMonthValue();
    Predicate<Transaction> predicate = new ReportingPeriod.FromXtoY(LocalDate.of(startYear - 1, Month.DECEMBER, 31), now).containsTransaction();
    Map<InvestmentVehicle, Line> vehicle2line = new HashMap<>();
    this.sum = new Line(null, this.noOfmonths);
    this.transactions = new ArrayList<>();
    Client filteredClient = clientFilter.getSelectedFilter().filter(client);
    for (Account account : filteredClient.getAccounts()) {
        for (AccountTransaction t : account.getTransactions()) {
            if (t.getType() != AccountTransaction.Type.DIVIDENDS)
                continue;
            if (!predicate.test(t))
                continue;
            transactions.add(new TransactionPair<>(account, t));
            Money dividendValue = useGrossValue ? t.getGrossValue() : t.getMonetaryAmount();
            long value = dividendValue.with(converter.at(t.getDateTime())).getAmount();
            int index = (t.getDateTime().getYear() - startYear) * 12 + t.getDateTime().getMonthValue() - 1;
            Line line = vehicle2line.computeIfAbsent(t.getSecurity(), s -> new Line(s, noOfmonths));
            line.values[index] += value;
            line.sum += value;
            sum.values[index] += value;
            sum.sum += value;
        }
    }
    this.lines = new ArrayList<>(vehicle2line.values());
}
Also used : Account(name.abuchen.portfolio.model.Account) HashMap(java.util.HashMap) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) LocalDate(java.time.LocalDate) ReportingPeriod(name.abuchen.portfolio.snapshot.ReportingPeriod) Money(name.abuchen.portfolio.money.Money) Transaction(name.abuchen.portfolio.model.Transaction) AccountTransaction(name.abuchen.portfolio.model.AccountTransaction) InvestmentVehicle(name.abuchen.portfolio.model.InvestmentVehicle) Client(name.abuchen.portfolio.model.Client)

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