001 package market.statistics;
002
003 import java.util.Calendar;
004 import java.util.Iterator;
005 import java.util.LinkedList;
006 import java.util.List;
007
008 import market.SMarket;
009 import data.ooimpl.CatalogItemImpl;
010
011
012 /**
013 * Represents a statistics for one article of the market's offer.
014 */
015 public class CISalesStats extends CatalogItemImpl {
016
017 /**
018 * ID for serialization.
019 */
020 private static final long serialVersionUID = 6726604970161839177L;
021
022 private String articleID;
023 private int revenue;
024 private int amount;
025
026 /**
027 * Saves every change of the article's price. Both price and date of price change are recorded.
028 */
029 private List<HistoryEntry> priceHistory = new LinkedList<HistoryEntry>();
030
031 /**
032 * Saves the orders of the belonging item. Whenever an item is ordered, both the amount and the
033 * date are recorded.
034 */
035 private List<HistoryEntry> orderHistory = new LinkedList<HistoryEntry>();
036
037 /**
038 * @param articleID the ID of the article statistics. It must match the real article's ID.
039 * @param revenue the revenue made from this article.
040 * @param amount the amount of sold items.
041 */
042 public CISalesStats(String articleID, int revenue, int amount) {
043 super(articleID);
044 this.articleID = articleID;
045 this.revenue = revenue;
046 this.amount = amount;
047 }
048
049 public String getArticleID() {
050 return articleID;
051 }
052
053 public int getRevenue() {
054 return revenue;
055 }
056
057 public int getAmount() {
058 return amount;
059 }
060
061 /**
062 * Returns the price history. If the last history entry is provisional, it is removed from
063 * the returned list. It is, however, not removed from the internal {@link #priceHistory}.
064 * @return the price history.
065 */
066 public List<HistoryEntry> getPriceHistory() {
067 List<HistoryEntry> tmpPriceHistory = new LinkedList<HistoryEntry>(priceHistory);
068 if (isLastPriceChangeProvisional()) {
069 tmpPriceHistory.remove(tmpPriceHistory.size() - 1);
070 }
071 return tmpPriceHistory;
072 }
073
074 /**
075 * Checks if the last entry of the price history is provisional.
076 * @return <code>true</code> if the last entry is provisional, otherwise <code>false</code>.
077 */
078 private boolean isLastPriceChangeProvisional() {
079 int size = priceHistory.size();
080 if (size == 0) {
081 return false;
082 }
083 PriceHistoryEntry lastEntry = (PriceHistoryEntry)priceHistory.get(size-1);
084 return lastEntry.isProvisional();
085 }
086
087 public List<HistoryEntry> getOrderHistory() {
088 return orderHistory;
089 }
090
091 /**
092 * @param l the history ({@link #orderHistory} or {@link #priceHistory})list of which the
093 * last item is of interest.
094 * @return the last entry of a history list.
095 */
096 public HistoryEntry getLastEntry(List l) {
097 int size = l.size();
098 return size == 0 ? null : (HistoryEntry)l.get(size-1);
099 }
100
101 /**
102 * Increases the saved amount of sold items.
103 * @param amount the amount of itmes to add.
104 */
105 public void addAmount(int amount) {
106 this.amount += amount;
107 }
108
109 /**
110 * Increases the revenue made from this article.
111 * @param revenue the revenue to be added.
112 */
113 public void addRevenue(int revenue) {
114 this.revenue += revenue;
115 }
116
117 /**
118 * Appends a new entry to the {@link #priceHistory}.
119 * @param date the date of the price change.
120 * @param newPrice the new price.
121 */
122 public void newPriceSet(Calendar date, int newPrice) {
123 if (priceHistory.size() > 0) {
124 PriceHistoryEntry lastEntry = (PriceHistoryEntry)priceHistory.get(priceHistory.size() - 1);
125 if (lastEntry.isProvisional()) {
126 priceHistory.remove(lastEntry);
127 }
128 if (!SMarket.hasTimeAdvanced()) {
129 date.add(Calendar.DATE, 1);
130 }
131 }
132 priceHistory.add(new PriceHistoryEntry(date, newPrice));
133 }
134
135 /**
136 * Appends a new entry to the {@link #orderHistory}.
137 * @param date the date of the price change.
138 * @param amount the amount ordered
139 */
140 public void ordered(Calendar date, int amount) {
141 orderHistory.add(new HistoryEntry(date, amount));
142 }
143
144 /**
145 * Concatenates an external price history with this one.
146 * @param ph the price history to be added.
147 */
148 public void appendPriceHistory(List<HistoryEntry> ph) {
149 priceHistory.addAll(ph);
150 }
151
152 /**
153 * Concatenates an external order history with this one.
154 * @param oh the order history to be added.
155 */
156 public void appendOrderHistory(List<HistoryEntry> oh) {
157 orderHistory.addAll(oh);
158 }
159
160 /**
161 * Iterates over the order history and sums up the amount of bought items.
162 * @return the amount of items ordered by the manager.
163 */
164 public int getOrderAmount() {
165 int amount = 0;
166 Iterator it = orderHistory.iterator();
167 while (it.hasNext()) {
168 amount += ((HistoryEntry)it.next()).getValue();
169 }
170 return amount;
171 }
172
173 public CatalogItemImpl getShallowClone() {
174 CISalesStats ciss = new CISalesStats(articleID, revenue, amount);
175 ciss.appendOrderHistory(orderHistory);
176 ciss.appendPriceHistory(priceHistory);
177 return ciss;
178 }
179
180 public String toString() {
181 return "amount: " + amount + "; revenue: " + revenue + "; priceHistory: " +
182 priceHistory + "; orderHistory: " + orderHistory;
183 }
184 }