/
StockMarketYear.java
82 lines (63 loc) · 2.01 KB
/
StockMarketYear.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.jamesshore.finances.domain;
public class StockMarketYear {
private Year year;
private Dollars startingBalance;
private Dollars costBasis;
private GrowthRate growthRate;
private TaxRate capitalGainsTaxRate;
private Dollars totalSellOrders;
public StockMarketYear(Year year, Dollars startingBalance, Dollars costBasis, GrowthRate growthRate, TaxRate capitalGainsTaxRate) {
this.year = year;
this.startingBalance = startingBalance;
this.costBasis = costBasis;
this.growthRate = growthRate;
this.capitalGainsTaxRate = capitalGainsTaxRate;
this.totalSellOrders = new ValidDollars(0);
}
public Year year() {
return year;
}
public Dollars startingBalance() {
return startingBalance;
}
public Dollars startingCostBasis() {
return costBasis;
}
private Dollars startingCapitalGains() {
return startingBalance().minus(startingCostBasis());
}
public GrowthRate growthRate() {
return growthRate;
}
public TaxRate capitalGainsTaxRate() {
return capitalGainsTaxRate;
}
public void sell(Dollars amount) {
this.totalSellOrders = totalSellOrders.plus(amount);
}
private Dollars capitalGainsWithdrawn() {
return Dollars.min(startingCapitalGains(), totalSellOrders());
}
public Dollars capitalGainsTaxIncurred() {
return capitalGainsTaxRate.compoundTaxFor(capitalGainsWithdrawn());
}
public Dollars totalSellOrders() {
return totalSellOrders;
}
public Dollars totalSold() {
return totalSellOrders().plus(capitalGainsTaxIncurred());
}
public Dollars growth() {
return growthRate.growthFor(startingBalance.minus(totalSold()));
}
public Dollars endingBalance() {
return startingBalance.minus(totalSold()).plus(growth());
}
public Dollars endingCostBasis() {
Dollars purchasesSold = totalSold().subtractToZero(startingCapitalGains());
return startingCostBasis().minus(purchasesSold);
}
public StockMarketYear nextYear() {
return new StockMarketYear(year.nextYear(), this.endingBalance(), this.endingCostBasis(), this.growthRate(), this.capitalGainsTaxRate());
}
}