package name.abuchen.portfolio;
import java.time.LocalDate;
import java.util.UUID;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.PortfolioTransaction.Type;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction.Unit;
import name.abuchen.portfolio.money.CurrencyUnit;
import name.abuchen.portfolio.money.Money;
public class PortfolioBuilder
{
private Portfolio portfolio;
private Account account;
public PortfolioBuilder()
{
this.portfolio = new Portfolio();
this.portfolio.setName(UUID.randomUUID().toString());
}
public PortfolioBuilder(Account referenceAccount)
{
this();
this.portfolio.setReferenceAccount(referenceAccount);
}
public PortfolioBuilder inbound_delivery(Security security, String date, long shares, long amount)
{
return inbound_delivery(security, LocalDate.parse(date), shares, amount);
}
public PortfolioBuilder inbound_delivery(Security security, LocalDate date, long shares, long amount)
{
portfolio.addTransaction(new PortfolioTransaction(date, CurrencyUnit.EUR, amount, security, shares,
Type.DELIVERY_INBOUND, 0, 0));
return this;
}
public Portfolio addTo(Client client)
{
client.addPortfolio(portfolio);
if (account != null)
client.addAccount(account);
return portfolio;
}
public PortfolioBuilder buy(Security security, String date, long shares, long amount)
{
return buysell(Type.BUY, security, date, shares, amount, 0);
}
public PortfolioBuilder sell(Security security, String date, long shares, long amount)
{
return buysell(Type.SELL, security, date, shares, amount, 0);
}
public PortfolioBuilder sell(Security security, String date, long shares, long amount, int fees)
{
return buysell(Type.SELL, security, date, shares, amount, fees);
}
private PortfolioBuilder buysell(Type type, Security security, String date, long shares, long amount, int fees)
{
if (portfolio.getReferenceAccount() == null)
{
account = new Account(UUID.randomUUID().toString());
portfolio.setReferenceAccount(account);
}
BuySellEntry entry = new BuySellEntry(portfolio, portfolio.getReferenceAccount());
entry.setType(type);
entry.setDate(LocalDate.parse(date));
entry.setSecurity(security);
entry.setShares(shares);
entry.setCurrencyCode(CurrencyUnit.EUR);
entry.setAmount(amount);
entry.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(CurrencyUnit.EUR, fees)));
entry.insert();
return this;
}
}