package name.abuchen.portfolio.datatransfer.csv;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.csv.CSVPrinter;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.model.Transaction.Unit;
import name.abuchen.portfolio.money.Values;
/**
* Special exporter for Axtienfreunde.net
*/
public class AktienfreundeNetExporter
{
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); //$NON-NLS-1$
/**
* Export all transactions in 'aktienfreunde.net' Format
*/
public void exportAllTransactions(File file, Client client) throws IOException
{
// collect transactions
List<? extends Transaction> transactions = Stream
.concat(client.getAccounts().stream(), client.getPortfolios().stream())
.flatMap(l -> l.getTransactions().stream()) //
.sorted(new Transaction.ByDate()) //
.collect(Collectors.toList());
// write to file
try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))
{
CSVPrinter printer = new CSVPrinter(writer);
printer.setStrategy(CSVExporter.STRATEGY);
writeHeader(printer);
// only buy/sell/dividend transactions
for (Transaction t : transactions)
{
if (t instanceof AccountTransaction)
writeDividend(printer, (AccountTransaction) t);
else if (t instanceof PortfolioTransaction)
writeBuySell(printer, (PortfolioTransaction) t);
}
}
}
@SuppressWarnings("nls")
private void writeDividend(CSVPrinter printer, AccountTransaction transaction)
{
if (transaction.getSecurity() == null)
return;
if (transaction.getType() != AccountTransaction.Type.INTEREST
&& transaction.getType() != AccountTransaction.Type.DIVIDENDS)
return;
printer.print(DATE_FORMAT.format(transaction.getDate()));
printer.print(CSVExporter.escapeNull(transaction.getSecurity().getIsin()));
printer.print(CSVExporter.escapeNull(transaction.getSecurity().getName()));
printer.print("Aktie");
printer.print("Dividende");
printer.print(Values.Amount.format(transaction.getAmount()));
printer.print("1");
printer.print("");
printer.print("");
printer.println();
}
@SuppressWarnings("nls")
private void writeBuySell(CSVPrinter printer, PortfolioTransaction transaction)
{
String type;
switch (transaction.getType())
{
case BUY:
case DELIVERY_INBOUND:
type = "Kauf"; //$NON-NLS-1$
break;
case SELL:
case DELIVERY_OUTBOUND:
type = "Verkauf"; //$NON-NLS-1$
break;
default:
// ignore all other transactions
return;
}
printer.print(DATE_FORMAT.format(transaction.getDate()));
printer.print(CSVExporter.escapeNull(transaction.getSecurity().getIsin()));
printer.print(CSVExporter.escapeNull(transaction.getSecurity().getName()));
printer.print("Aktie");
printer.print(type);
printer.print(Values.Quote.format(transaction.getGrossPricePerShare().getAmount()));
printer.print(Values.Share.format(transaction.getShares()));
printer.print(Values.Amount.format(transaction.getUnitSum(Unit.Type.FEE).getAmount()));
printer.print(Values.Amount.format(transaction.getUnitSum(Unit.Type.TAX).getAmount()));
printer.println();
}
@SuppressWarnings("nls")
private void writeHeader(CSVPrinter printer)
{
printer.print("Datum");
printer.print("ISIN");
printer.print("Name");
printer.print("Typ");
printer.print("Transaktion");
printer.print("Preis");
printer.print("Anzahl");
printer.print("Kommission");
printer.print("Steuern");
printer.println();
}
}