use of name.abuchen.portfolio.model.PortfolioTransaction in project portfolio by buchen.
the class TransactionComparatorTest method testThatDatePreceedsType.
@Test
public void testThatDatePreceedsType() {
Portfolio portfolio = //
new PortfolioBuilder().sell(security, "2010-01-01", 100, //
100).buy(security, "2010-01-02", 100, //
100).addTo(client);
List<PortfolioTransaction> list = portfolio.getTransactions();
Collections.sort(list, new TransactionComparator());
assertThat(list.get(0).getType(), is(Type.SELL));
assertThat(list.get(1).getType(), is(Type.BUY));
}
use of name.abuchen.portfolio.model.PortfolioTransaction in project portfolio by buchen.
the class SecuritiesChart method setupTooltip.
private void setupTooltip() {
TimelineChartToolTip toolTip = chart.getToolTip();
toolTip.setValueFormat(new DecimalFormat(Values.Quote.pattern()));
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.LabelChartDetailClosingIndicator + "Positive");
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.LabelChartDetailClosingIndicator + "Negative");
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.LabelChartDetailClosingIndicator + "Zero");
toolTip.addSeriesExclude(Messages.SecurityMenuBuy);
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.SecurityMenuBuy + "1");
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.SecurityMenuBuy + "2");
toolTip.addSeriesExclude(Messages.SecurityMenuSell);
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.SecurityMenuSell + "1");
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.SecurityMenuSell + "2");
toolTip.addSeriesExclude(Messages.LabelChartDetailDividends);
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.LabelChartDetailDividends + "1");
// $NON-NLS-1$
toolTip.addSeriesExclude(Messages.LabelChartDetailDividends + "2");
toolTip.addSeriesExclude(Messages.LabelChartDetailBollingerBands);
toolTip.addExtraInfo((composite, focus) -> {
if (focus instanceof Date) {
Instant instant = ((Date) focus).toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();
Interval displayInterval = Interval.of(date.minusDays(5), date.plusDays(5));
//
customTooltipEvents.stream().filter(//
t -> displayInterval.contains(t.getDateTime())).forEach(t -> {
if (t instanceof AccountTransaction)
addDividendTooltip(composite, (AccountTransaction) t);
else if (t instanceof PortfolioTransaction)
addInvestmentTooltip(composite, (PortfolioTransaction) t);
});
}
});
}
use of name.abuchen.portfolio.model.PortfolioTransaction in project portfolio by buchen.
the class SecuritiesChart method addInvestmentMarkers.
private void addInvestmentMarkers(List<PortfolioTransaction> transactions, String seriesLabel, Color color) {
if (transactions.isEmpty())
return;
customTooltipEvents.addAll(transactions);
if (chartConfig.contains(ChartDetails.SHOW_MARKER_LINES)) {
transactions.forEach(t -> {
String label = Values.Share.format(t.getType().isPurchase() ? t.getShares() : -t.getShares());
double value = t.getGrossPricePerShare(converter.with(t.getSecurity().getCurrencyCode())).getAmount() / Values.Quote.divider();
chart.addMarkerLine(t.getDateTime().toLocalDate(), color, label, value);
});
} else {
Date[] dates = transactions.stream().map(PortfolioTransaction::getDateTime).map(d -> Date.from(d.atZone(ZoneId.systemDefault()).toInstant())).collect(Collectors.toList()).toArray(new Date[0]);
double[] values = transactions.stream().mapToDouble(t -> t.getGrossPricePerShare(converter.with(t.getSecurity().getCurrencyCode())).getAmount() / Values.Quote.divider()).toArray();
// $NON-NLS-1$
ILineSeries border = (ILineSeries) chart.getSeriesSet().createSeries(SeriesType.LINE, seriesLabel + "2");
border.setYAxisId(0);
border.setSymbolColor(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
border.setSymbolType(PlotSymbolType.DIAMOND);
border.setSymbolSize(7);
configureSeriesPainter(border, dates, values, null, 0, LineStyle.NONE, false, false);
ILineSeries background = (ILineSeries) chart.getSeriesSet().createSeries(SeriesType.LINE, // $NON-NLS-1$
seriesLabel + "1");
background.setYAxisId(0);
background.setSymbolType(PlotSymbolType.DIAMOND);
background.setSymbolSize(6);
background.setSymbolColor(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
configureSeriesPainter(background, dates, values, null, 0, LineStyle.NONE, false, false);
ILineSeries inner = (ILineSeries) chart.getSeriesSet().createSeries(SeriesType.LINE, seriesLabel);
inner.setYAxisId(0);
inner.setSymbolType(PlotSymbolType.DIAMOND);
inner.setSymbolSize(4);
inner.setSymbolColor(color);
configureSeriesPainter(inner, dates, values, color, 0, LineStyle.NONE, false, true);
if (chartConfig.contains(ChartDetails.SHOW_DATA_LABELS)) {
customPaintListeners.add(event -> {
IAxis xAxis = chart.getAxisSet().getXAxis(0);
IAxis yAxis = chart.getAxisSet().getYAxis(0);
for (int index = 0; index < dates.length; index++) {
int x = xAxis.getPixelCoordinate(dates[index].getTime());
int y = yAxis.getPixelCoordinate(values[index]);
PortfolioTransaction t = transactions.get(index);
String label = Values.Share.format(t.getType().isPurchase() ? t.getShares() : -t.getShares());
Point textExtent = event.gc.textExtent(label);
event.gc.setForeground(Colors.BLACK);
event.gc.drawText(label, x - (textExtent.x / 2), y + 10, true);
}
});
}
}
}
use of name.abuchen.portfolio.model.PortfolioTransaction in project portfolio by buchen.
the class SecuritiesPerformanceView method createBottomTable.
@Override
protected // NOSONAR
void createBottomTable(// NOSONAR
Composite parent) {
Composite sash = new Composite(parent, SWT.NONE);
sash.setLayout(new SashLayout(sash, SWT.HORIZONTAL | SWT.END));
// folder
CTabFolder folder = new CTabFolder(sash, SWT.BORDER);
CTabItem item = new CTabItem(folder, SWT.NONE);
item.setText(Messages.SecurityTabChart);
Composite chartComposite = new Composite(folder, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 0).applyTo(chartComposite);
item.setControl(chartComposite);
chart = new SecuritiesChart(chartComposite, getClient(), new CurrencyConverterImpl(factory, getClient().getBaseCurrency()));
latest = new SecurityDetailsViewer(sash, SWT.BORDER, getClient());
latest.getControl().setLayoutData(new SashLayoutData(SWTHelper.getPackedWidth(latest.getControl())));
item = new CTabItem(folder, SWT.NONE);
item.setText(Messages.SecurityTabTransactions);
Composite container = new Composite(folder, SWT.NONE);
item.setControl(container);
TableColumnLayout layout = new TableColumnLayout();
container.setLayout(layout);
folder.setSelection(0);
transactions = new TableViewer(container, SWT.FULL_SELECTION);
ShowHideColumnHelper support = new ShowHideColumnHelper(// $NON-NLS-1$
SecuritiesPerformanceView.class.getSimpleName() + "@bottom4", // $NON-NLS-1$
getPreferenceStore(), transactions, layout);
// date
Column column = new Column(Messages.ColumnDate, SWT.None, 80);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object e) {
Transaction t = (Transaction) e;
return Values.DateTime.format(t.getDateTime());
}
});
// $NON-NLS-1$
column.setSorter(ColumnViewerSorter.create(Transaction.class, "dateTime"), SWT.DOWN);
support.addColumn(column);
// transaction type
column = new Column(Messages.ColumnTransactionType, SWT.None, 80);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof PortfolioTransaction)
return ((PortfolioTransaction) t).getType().toString();
else if (t instanceof AccountTransaction)
return ((AccountTransaction) t).getType().toString();
else if (t instanceof DividendTransaction)
return AccountTransaction.Type.DIVIDENDS.toString();
else
return Messages.LabelQuote;
}
});
support.addColumn(column);
// shares
column = new Column(Messages.ColumnShares, SWT.None, 80);
column.setLabelProvider(new // NOSONAR
SharesLabelProvider() {
@Override
public // NOSONAR
Long getValue(// NOSONAR
Object t) {
if (t instanceof PortfolioTransaction)
return ((PortfolioTransaction) t).getShares();
else if (t instanceof DividendInitialTransaction)
return ((DividendInitialTransaction) t).getPosition().getShares();
else if (t instanceof DividendFinalTransaction)
return ((DividendFinalTransaction) t).getPosition().getShares();
else if (t instanceof DividendTransaction)
return ((DividendTransaction) t).getShares() != 0L ? ((DividendTransaction) t).getShares() : null;
else
return null;
}
});
support.addColumn(column);
// dividend amount
column = new Column(Messages.ColumnDividendPayment, SWT.RIGHT, 80);
column.setDescription(Messages.ColumnGrossDividend);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof DividendTransaction)
return Values.Money.format(((DividendTransaction) t).getGrossValue(), getClient().getBaseCurrency());
else
return null;
}
});
support.addColumn(column);
// dividend per share
column = new Column(Messages.ColumnDividendPerShare, SWT.RIGHT, 80);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof DividendTransaction)
return Values.AmountFraction.formatNonZero(((DividendTransaction) t).getDividendPerShare());
else
return null;
}
});
support.addColumn(column);
// dividend per share
column = new Column(Messages.ColumnPersonalDividendYield, SWT.RIGHT, 80);
column.setDescription(Messages.ColumnPersonalDividendYield_Description);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof DividendTransaction)
return Values.Percent2.formatNonZero(((DividendTransaction) t).getPersonalDividendYield());
else
return null;
}
});
support.addColumn(column);
// dividend per share (moving average)
column = new Column(Messages.ColumnPersonalDividendYieldMovingAverage, SWT.RIGHT, 80);
column.setDescription(Messages.ColumnPersonalDividendYieldMovingAverage_Description);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof DividendTransaction)
return Values.Percent2.formatNonZero(((DividendTransaction) t).getPersonalDividendYieldMovingAverage());
else
return null;
}
});
support.addColumn(column);
// einstandskurs / bewertung
column = new Column(Messages.ColumnAmount, SWT.RIGHT, 80);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof DividendTransaction)
return null;
else
return Values.Money.format(((Transaction) t).getMonetaryAmount(), getClient().getBaseCurrency());
}
});
support.addColumn(column);
// purchase quote
column = new Column(Messages.ColumnQuote, SWT.RIGHT, 80);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof PortfolioTransaction) {
PortfolioTransaction p = (PortfolioTransaction) t;
return Values.Quote.format(p.getGrossPricePerShare(), getClient().getBaseCurrency());
} else
return null;
}
});
support.addColumn(column);
// gegenkonto
column = new Column(Messages.ColumnAccount, SWT.None, 120);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object t) {
if (t instanceof PortfolioTransaction) {
PortfolioTransaction p = (PortfolioTransaction) t;
return p.getCrossEntry() != null ? p.getCrossEntry().getCrossOwner(p).toString() : null;
} else if (t instanceof DividendTransaction) {
return ((DividendTransaction) t).getAccount().getName();
} else {
return null;
}
}
});
support.addColumn(column);
// note
// $NON-NLS-1$
column = new Column("note", Messages.ColumnNote, SWT.LEFT, 22);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object r) {
return ((Transaction) r).getNote();
}
@Override
public Image getImage(Object r) {
String note = ((Transaction) r).getNote();
return note != null && note.length() > 0 ? Images.NOTE.image() : null;
}
});
// $NON-NLS-1$
column.setSorter(ColumnViewerSorter.create(Transaction.class, "note"));
support.addColumn(column);
support.createColumns();
transactions.getTable().setHeaderVisible(true);
transactions.getTable().setLinesVisible(true);
transactions.setContentProvider(ArrayContentProvider.getInstance());
}
use of name.abuchen.portfolio.model.PortfolioTransaction in project portfolio by buchen.
the class InvestmentPlanListView method fillPlansContextMenu.
private void fillPlansContextMenu(IMenuManager manager) {
final InvestmentPlan plan = (InvestmentPlan) ((IStructuredSelection) plans.getSelection()).getFirstElement();
if (plan == null)
return;
manager.add(new Action(Messages.InvestmentPlanMenuGenerateTransactions) {
@Override
public void run() {
CurrencyConverterImpl converter = new CurrencyConverterImpl(factory, getClient().getBaseCurrency());
List<PortfolioTransaction> latest = plan.generateTransactions(converter);
if (latest.isEmpty()) {
MessageDialog.openInformation(getActiveShell(), Messages.LabelInfo, MessageFormat.format(Messages.InvestmentPlanInfoNoTransactionsGenerated, Values.Date.format(plan.getDateOfNextTransactionToBeGenerated())));
} else {
markDirty();
plans.refresh();
transactions.markTransactions(latest);
transactions.setInput(plan.getPortfolio(), plan.getTransactions());
}
}
});
manager.add(new Separator());
//
new OpenDialogAction(this, Messages.MenuEditInvestmentPlan).type(InvestmentPlanDialog.class, //
d -> d.setPlan(plan)).onSuccess(d -> {
markDirty();
plans.setInput(getClient().getPlans());
}).addTo(manager);
manager.add(new Action(Messages.InvestmentPlanMenuDelete) {
@Override
public void run() {
getClient().removePlan(plan);
markDirty();
plans.setInput(getClient().getPlans());
transactions.setInput(null, null);
}
});
}
Aggregations