001 package market;
002
003 import java.util.Iterator;
004
005 import market.statistics.CICustomerStats;
006 import sale.SalesPoint;
007 import sale.Shop;
008 import users.User;
009 import users.UserManager;
010 import users.UserManagerFilter;
011 import users.swing.UserFilter;
012 import data.events.VetoException;
013
014 /**
015 * The market's UserManager.
016 */
017 public class UMUserBase extends UserManager {
018
019 /**
020 * ID for serialization.
021 */
022 private static final long serialVersionUID = 8476169105291116432L;
023
024 public static final int CUSTOMER = 1;
025 public static final int WAREHOUSE_WORKER = 2;
026 public static final int SELLER = 3;
027 public static final int MANAGER = 4;
028
029 /**
030 * Filters market's customers.
031 */
032 private UserFilter ufCustomers = new UserFilter(){
033 private static final long serialVersionUID = -190142240082722787L;
034
035 public boolean match(User user) {
036 return UCustomer.class.isInstance(user);
037 }
038 };
039
040 /**
041 * Filters market's warehouse workers.
042 */
043 private UserFilter ufWarehouseWorker = new UserFilter(){
044 private static final long serialVersionUID = -7344603246615314557L;
045
046 public boolean match(User user) {
047 if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().
048 equals(UStaffer.WAREHOUSE_WORKER)){
049 return true;
050 }
051 return false;
052 }
053 };
054
055 /**
056 * Filters market's sellers.
057 */
058 private UserFilter ufSellers = new UserFilter(){
059 private static final long serialVersionUID = -2081936239256484026L;
060
061 public boolean match(User user) {
062 if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().
063 equals(UStaffer.SELLER)){
064 return true;
065 }
066 return false;
067 }
068 };
069
070 /**
071 * Filters the market's manager(s)
072 */
073 private UserFilter ufManager = new UserFilter(){
074 private static final long serialVersionUID = 545767415085896502L;
075
076 public boolean match(User user) {
077 if(UStaffer.class.isInstance(user) && ((UStaffer)user).getQualification().equals(UStaffer.MANAGER)){
078 return true;
079 }
080 return false;
081 }
082 };
083
084 /**
085 * Filters the market's staff (warehouse-worker, seller, manager)
086 */
087 private UserFilter ufStaff = new UserFilter() {
088 private static final long serialVersionUID = -7102053036151507300L;
089 public boolean match(User user) {
090 return user instanceof UStaffer;
091 }
092 };
093
094
095 /**
096 * A UserManagerFilter containing all managers of the market.
097 */
098 private UserManagerFilter umfManager = new UserManagerFilter(this, ufManager);
099
100
101 /**
102 * Static method that gets the {@link UserManager#getGlobalUM() global user manager}.
103 * @return the global user manager.
104 */
105 public static UMUserBase getGlobalBase() {
106 return (UMUserBase)getGlobalUM();
107 }
108
109 /**
110 * creates a new User with given name, type and qualification
111 *
112 * @param sName the User's ID
113 * @param type the User's type: 1 for customer, other numbers for employees.
114 * @param qualification the employee's qualification (manager, seller, warehouse worker)
115 */
116 public static User createUser(String sName, int type, String qualification) {
117 if(isUser(sName)) return null;
118 User user;
119 switch(type){
120 case CUSTOMER: user = new UCustomer(sName);
121 //add to customer catalog (base for queues)
122 SMarket.getCustomers().add(Conversions.customerToCI((UCustomer)user), null);
123 //add to customer statistics catalog
124 SMarket.getCustomerStats().add(new CICustomerStats(user.getName()), null);
125 break;
126 default: user = new UStaffer(sName, qualification);
127 }
128 UserManager.getGlobalUM().addUser(user);
129 return user;
130 }
131
132 /**
133 * Checks the global UserManager for a String.
134 *
135 * @param userName the name of the user
136 * @return <code>true</code> if a User could be identified by <code>userName</code>, otherwise
137 * <code>false</code>.
138 */
139 public static boolean isUser(String userName) {
140 if(UserManager.getGlobalUM().getUser(userName)==null){
141 return false;
142 }
143 return true;
144 }
145
146 /**
147 * Gets the {@link #ufCustomers customer filter}.
148 * @return the customer filter.
149 */
150 public UserFilter getCustomers() {
151 return ufCustomers;
152 }
153
154 /**
155 * Gets the {@link #ufWarehouseWorker warehouse worker filter}.
156 * @return the warehouse worker filter.
157 */
158 public UserFilter getWarehouseWorker() {
159 return ufWarehouseWorker;
160 }
161
162 /**
163 * Gets the {@link #ufSellers sellers filter}.
164 * @return the sellers filter.
165 */
166 public UserFilter getSeller() {
167 return ufSellers;
168 }
169
170 /**
171 * Gets the {@link #ufManager mangaer filter}.
172 * @return the manager filter.
173 */
174 public UserFilter getManager() {
175 return ufManager;
176 }
177
178 /**
179 * Gets the {@link #ufStaff staff filter}.
180 * @return the staff filter.
181 */
182 public UserFilter getStaff() {
183 return ufStaff;
184 }
185
186 /**
187 * Counts and returns the number of Users that are managers.
188 * @return the number of the market's managers.
189 */
190 public static int getNumberOfManagers() {
191 return ((UMUserBase)getGlobalUM()).umfManager.getUsers().size();
192 }
193
194 /**
195 * Checks whether there is a SalesPoint with the searched User logged on.
196 *
197 * @param user the searched user.
198 * @return <code>true</code> if the user is logged on on any open SalesPoint,
199 * otherwise <code>false</code>.
200 */
201 public static boolean isLoggedOn(User user){
202 Iterator it = Shop.getTheShop().getSalesPoints().iterator();
203 while(it.hasNext()){
204 if(((SalesPoint)it.next()).getUser()==user) return true;
205 }
206 return false;
207 }
208
209 /**
210 * Removes a User from market.
211 *
212 * @param user the user to be removed.
213 * @throws VetoException if user to be removed is currently logged on.
214 */
215 public static void deleteUser(UPerson user) throws VetoException{
216 if(!isLoggedOn(user)){
217 String key = user.getName();
218 if(user instanceof UCustomer) {
219 SMarket.getOffer().addStock(((UCustomer)user).getShoppingBasket(), null, true);
220 SSListenable orderQueue = SMarket.getWarehouseQueue();
221 SSListenable tillQueue = SMarket.getTillQueue();
222 if(orderQueue.contains(key, null)) orderQueue.remove(key, null);
223 Iterator it = tillQueue.get(key, null, false);
224 while(it.hasNext()){
225 if(((SICustomer)it.next()).getOrderCount(false)==0){
226 tillQueue.remove(key, null);
227 }
228 }
229 if(!tillQueue.contains(key, null)) SMarket.getCustomers().remove(key, null);
230 SMarket.getCustomerStats().remove(key);
231 }
232 UserManager.getGlobalUM().deleteUser(key);
233 }
234 else {
235 throw new VetoException("Nutzer " + user.getFullName() + " ist noch am System angemeldet.");
236 }
237 }
238
239 /**
240 * Sums up and returns wages of all currently employed persons.
241 * @return the sum of all employee's wages.
242 */
243 public int getCurrentWages() {
244 UserFilter staff = UMUserBase.getGlobalBase().getStaff();
245 Iterator it = new UserManagerFilter(staff).getUsers().iterator();
246 int sum = 0;
247 while (it.hasNext()) {
248 UStaffer us = (UStaffer)it.next();
249 sum += Conversions.valueToInt(us.getSalary());
250 }
251 return sum;
252 }
253 }
254