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();
}
}
}
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);
}
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());
}
}
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;
}
}
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());
}
Aggregations