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