001 package market; 002 003 import java.util.Calendar; 004 005 import market.statistics.CISalesStats; 006 import market.statistics.Statistics; 007 import market.stdform.ButtonIDs; 008 import market.stdform.FSCheckable; 009 import market.stdform.FSEditPersonData; 010 import market.stdform.FSManagerArticleStatsDetail; 011 import market.stdform.FSManagerArticleStatsMain; 012 import market.stdform.FSManagerCustomerOverview; 013 import market.stdform.FSManagerCustomerStatsDetail; 014 import market.stdform.FSManagerCustomerStatsMain; 015 import market.stdform.FSManagerEmployeeOverview; 016 import market.stdform.FSManagerOffer; 017 import market.stdform.FSManagerOpenClose; 018 import market.stdform.FSManagerOpenPurchaseOrderDetail; 019 import market.stdform.FSManagerOpenPurchaseOrderMain; 020 import market.stdform.FSManagerOptions; 021 import market.stdform.FSManagerOverallStats; 022 import market.stdform.FSManagerPurchase; 023 import market.stdform.FSManagerPurchaseConfirm; 024 import market.stdform.MSLogOff; 025 import market.swing.JCTimeRangeBoxes; 026 import sale.Action; 027 import sale.FormSheet; 028 import sale.FormSheetContentCreator; 029 import sale.Gate; 030 import sale.GateChangeTransition; 031 import sale.JDisplayDialog; 032 import sale.MenuSheet; 033 import sale.MenuSheetItem; 034 import sale.SaleProcess; 035 import sale.SalesPoint; 036 import sale.Shop; 037 import sale.Transition; 038 import sale.UIGate; 039 import data.CatalogItemValue; 040 import data.CountingStock; 041 import data.DataBasket; 042 import data.DataBasketConditionImpl; 043 import data.DoubleValue; 044 import data.IntegerValue; 045 import data.Value; 046 import data.events.VetoException; 047 import data.ooimpl.CountingStockImpl; 048 import data.ooimpl.DataBasketImpl; 049 import data.stdforms.SingleTableFormSheet; 050 import data.stdforms.TwoTableFormSheet; 051 052 /** 053 * The manager process. This process handles all interaction with the manager's {@link SalesPoint}. 054 */ 055 public class SProcessManager extends SProcessMarket { 056 057 /** 058 * ID for serialization. 059 */ 060 private static final long serialVersionUID = -4347833144592036577L; 061 062 /** 063 * Gate for opening and closing the market. 064 */ 065 private UIGate gateOpenClose = new UIGate(null, null); 066 067 /** 068 * Gate for setting some calculation variables. 069 */ 070 private UIGate gateOptions = new UIGate(null, null); 071 072 /** 073 * Gate for purchasing some articles for the market. 074 */ 075 private UIGate gatePurchaseMain = new UIGate(null, null); 076 077 /** 078 * Gate for confirming a purchase. 079 */ 080 private UIGate gatePurchaseConfirm = new UIGate(null, null); 081 082 /** 083 * Gate for displaying an overview of orders that have not yet arrived. 084 */ 085 private UIGate gateOpoMain = new UIGate(null, null); 086 087 /** 088 * Gate for displaying details of an that has not yet arrived. 089 */ 090 private UIGate gateOpoDetail = new UIGate(null, null); 091 092 /** 093 * Gate for displaying the market's articles and their amount. 094 */ 095 private UIGate gateStockMain = new UIGate(null, null); 096 097 /** 098 * Gate for viewing, selecting, adding and removing employees. 099 */ 100 private UIGate gateEmplEditMain = new UIGate(null, null); 101 102 /** 103 * Gate for editing an employee's data. 104 */ 105 private UIGate gateEmplEditDetail = new UIGate(null, null); 106 107 /** 108 * Gate for viewing, selecting and removing customers. 109 */ 110 private UIGate gateCustEditMain = new UIGate(null, null); 111 112 /** 113 * Gate for viewing a customer's personal data. 114 */ 115 private UIGate gateCustEditDetail = new UIGate(null, null); 116 117 /** 118 * Gate for selecting an article and a range of time for statistics. 119 */ 120 private UIGate gateArticleStatsMain = new UIGate(null, null); 121 122 /** 123 * Gate for viewing detailed article statistics. 124 */ 125 private UIGate gateArticleStatsDetail = new UIGate(null, null); 126 127 /** 128 * Gate for selecting a customer whose statistics should be displayed. 129 */ 130 private UIGate gateCustomerStatsMain = new UIGate(null, null); 131 132 /** 133 * Gate for viewing a customer's statistics. 134 */ 135 private UIGate gateCustomerStatsDetail = new UIGate(null, null); 136 137 /** 138 * Gate for the overall statistics. 139 */ 140 private UIGate gateOverallStats = new UIGate(null, null); 141 private MenuSheet menu = createManagerMenuSheet(); 142 private DataBasket dbPurchase; 143 private CountingStock csPurchase; 144 145 /** 146 * The last date the manger ordered something. This variable necessary for creating the indexes of 147 * the open purchase orders. 148 */ 149 private Calendar dateLastOrder; 150 151 /** 152 * A counting variable for open purchase orders. If there are more than one orders a day, they are 153 * distinguished by a running number which is created with the help of this variable. 154 */ 155 private int intLastOrder = 0; 156 157 public SProcessManager() { 158 super("Manager"); 159 } 160 161 /** 162 * This method is needed by {@link SaleProcess} to know on which gate to start. 163 * @return the initial gate, i.e. the {@link Gate} where the process starts. 164 */ 165 public Gate getInitialGate() { 166 return getStockMainGate(); 167 } 168 169 /** 170 * Attaches {@link FSManagerOpenClose}, its actions and the menu to {@link #gateOpenClose}. 171 * @return the set up {@link #gateOpenClose}. 172 */ 173 private UIGate getOpenCloseGate() { 174 final FormSheet fsmoc = new FSManagerOpenClose(); 175 fsmoc.addContentCreator(new FormSheetContentCreator() { 176 private static final long serialVersionUID = 4884514784532918550L; 177 public void createFormSheetContent(final FormSheet fs) { 178 //open market 179 fs.getButton(ButtonIDs.BTN_START).setAction(new Action() { 180 private static final long serialVersionUID = 1268405891376688950L; 181 public void doAction(SaleProcess p, SalesPoint sp) { 182 SMarket.getTheMarket().setOpen(0); 183 SMarket.fireMarketOpened(); 184 } 185 }); 186 //close market (end of day) 187 fs.getButton(ButtonIDs.BTN_END).setAction(new Action() { 188 private static final long serialVersionUID = 2846974728815438079L; 189 public void doAction(SaleProcess p, SalesPoint sp) { 190 int error = 0; 191 if (Shop.getTheShop().getSalesPoints().size() > 1) error = 1; 192 if (SMarket.getTillQueue().size(null) > 0) error = 2; 193 switch (error) { 194 case 1: 195 JDDShowMessage.showMessageDialog(fs, 196 "Es sind noch nicht alle SalesPoints geschlossen", "Fehler"); 197 break; 198 199 case 2: 200 JDDShowMessage.showMessageDialog(fs, 201 "Es wurden noch nicht alle Kunden bedient.", "Fehler"); 202 break; 203 default: 204 SMarket.getTheMarket().setOpen(2); 205 } 206 } 207 }); 208 //next day 209 fs.getButton(ButtonIDs.BTN_NEXT).setAction( 210 new Action() { 211 private static final long serialVersionUID = 2642215322790503688L; 212 213 public void doAction(SaleProcess p, SalesPoint sp) { 214 SMarket.setNextDay(); 215 } 216 }); 217 } 218 }); 219 220 //open market 221 setAction(fsmoc, new Action() { 222 private static final long serialVersionUID = -326553716575268919L; 223 224 public void doAction(SaleProcess p, SalesPoint sp) { 225 SMarket.getTheMarket().setOpen(0); 226 SMarket.fireMarketOpened(); 227 }}, ButtonIDs.BTN_START); 228 //close market 229 setAction(fsmoc, new Action() { 230 private static final long serialVersionUID = 5402506224408132908L; 231 232 public void doAction(SaleProcess p, SalesPoint sp) { 233 int error = 0; 234 if (Shop.getTheShop().getSalesPoints().size() > 1) error = 1; 235 if (SMarket.getTheMarket().getStock(SMarket.STK_TILLQUEUE).size(null) > 0) error = 2; 236 switch (error) { 237 case 1: 238 JDDShowMessage.showMessageDialog(fsmoc, 239 "Es sind noch nicht alle SalesPoints geschlossen", "Fehler"); 240 break; 241 242 case 2: 243 JDDShowMessage.showMessageDialog(fsmoc, 244 "Es wurden noch nicht alle Kunden bedient.", "Fehler"); 245 break; 246 default: 247 SMarket.getTheMarket().setOpen(2); 248 } 249 }}, ButtonIDs.BTN_END); 250 //advance time 251 setAction(fsmoc, new Action() { 252 private static final long serialVersionUID = -2416121507610947291L; 253 254 public void doAction(SaleProcess p, SalesPoint sp) { 255 SMarket.setNextDay(); 256 }}, ButtonIDs.BTN_NEXT); 257 258 gateOpenClose.setFormSheet(fsmoc); 259 gateOpenClose.setMenuSheet(menu); 260 return gateOpenClose; 261 } 262 263 /** 264 * Attaches {@link FSManagerOptions}, its actions and the menu to {@link #gateOptions}. 265 * @return the set up {@link #gateOptions}. 266 */ 267 private UIGate getOptionsGate() { 268 final FSCheckable fsc = new FSCheckable(new FSManagerOptions()); 269 //accept settings 270 setAction(fsc, new Action() { 271 private static final long serialVersionUID = 7905381581546545985L; 272 273 public void doAction(SaleProcess p, SalesPoint sp) { 274 if (fsc.checkTextFields(FSCheckable.ALL_ERRORMESSAGES_AT_ONCE, false)) { 275 Options options = SMarket.getOptions(); 276 int error = 0; 277 if (Double.valueOf(Conversions.convertComma( 278 fsc.getEntry(FSManagerOptions.JTFC_MAX_DISCOUNT))).doubleValue() > 100) 279 error = 1; 280 switch (error) { 281 case 1: 282 JDDShowMessage.showMessageDialog(fsc, "Es können nicht mehr als " + 283 "100% Rabatt gewährt werden.", "Zu viel Rabatt"); 284 default: 285 options.setDiscountRange(Integer.valueOf( 286 fsc.getEntry(FSManagerOptions.JTFC_DISCOUNT_RANGE)).intValue()); 287 options.setDiscountValue(Integer.valueOf( 288 fsc.getEntry(FSManagerOptions.JTFC_DISCOUNT_VALUE)).intValue()); 289 options.setMaxDiscount(Double.valueOf(Conversions.convertComma( 290 fsc.getEntry(FSManagerOptions.JTFC_MAX_DISCOUNT))). 291 doubleValue() / 100); 292 options.setFractionOfWages(Double.valueOf(Conversions.convertComma( 293 fsc.getEntry(FSManagerOptions.JTFC_FRACTION_OF_WAGES))). 294 doubleValue() / 100); 295 options.setTimeOfEmployment(Double.valueOf(Conversions.convertComma( 296 fsc.getEntry(FSManagerOptions.JTFC_SENIORITY))). 297 doubleValue() / 100); 298 SMarket.getMonthlySalesStats().setCosts(Conversions.currencyToInt( 299 fsc.getEntry(FSManagerOptions.JTFC_COSTS), true)); 300 } 301 } 302 }}, ButtonIDs.BTN_ACCEPT); 303 gateOptions.setFormSheet(fsc); 304 gateOptions.setMenuSheet(menu); 305 return gateOptions; 306 } 307 308 /** 309 * Attaches {@link FSManagerOffer} and the menu to {@link #gateStockMain}. 310 * @return the set up {@link #gateStockMain}. 311 */ 312 private UIGate getStockMainGate() { 313 final SingleTableFormSheet stfs = FSManagerOffer.create(); 314 gateStockMain.setFormSheet(stfs); 315 gateStockMain.setMenuSheet(menu); 316 return gateStockMain; 317 } 318 319 /** 320 * Attaches {@link FSManagerPurchase}, its actions and the menu to {@link #gatePurchaseMain}. 321 * @param cs the manager's "shopping basket", it can be empty or already filled with articles. 322 * @param db the transaction's DataBasket. 323 * @return the set up {@link #gatePurchaseMain}. 324 */ 325 private UIGate getPurchaseMainGate(CountingStock cs, DataBasket db) { 326 //Create FormSheet with saved DataBasket and CountingStock if needed. If not, create new ones. 327 final TwoTableFormSheet ttfs = FSManagerPurchase.create(gatePurchaseMain, 328 cs == null ? new CountingStockImpl("Einkauf", SMarket.getArticleCatalog()) : cs, 329 db == null ? new DataBasketImpl() : db); 330 //Buy 331 setAction(ttfs, new Action() { 332 private static final long serialVersionUID = -6576606907692825570L; 333 334 public void doAction(SaleProcess p, SalesPoint sp) { 335 csPurchase = (CountingStock)ttfs.getRightTableSource(); 336 dbPurchase = ttfs.getDataBasket(); 337 //if no items bought, print error message 338 if (!dbPurchase.contains(DataBasketConditionImpl.ALL_ENTRIES)) { 339 JDDShowMessage.showMessageDialog(ttfs, "Bitte wählen sie Artikel zum Kauf aus.", 340 "Keine Auswahl getroffen"); 341 } else { 342 //sum up prices of all selected Articles 343 DoubleValue dv = new DoubleValue(0); 344 csPurchase.sumStock(dbPurchase, CatalogItemValue.EVALUATE_OFFER, dv); 345 int toPay = Conversions.currencyToInt(dv.toString(), false); 346 //Transition to gate purchaseConfirm 347 gatePurchaseMain.setNextTransition(new GateChangeTransition( 348 getPurchaseConfirmGate(toPay))); 349 } 350 }}, ButtonIDs.BTN_BUY); 351 gatePurchaseMain.setFormSheet(ttfs); 352 gatePurchaseMain.setMenuSheet(menu); 353 return gatePurchaseMain; 354 } 355 356 /** 357 * Attaches {@link FSManagerPurchaseConfirm} and its actions to {@link #gatePurchaseConfirm}. 358 * @param toPay the money to pay for the manager's purchase. 359 * @return the set up {@link #gatePurchaseConfirm}. 360 */ 361 private UIGate getPurchaseConfirmGate(final int toPay) { 362 final FormSheet fsmpc = new FSManagerPurchaseConfirm(toPay); 363 //buy (commit db, add cs to offerStock) and go back to purchaseMain with right table being empty 364 setAction(fsmpc, new Action() { 365 private static final long serialVersionUID = -3925328238480326071L; 366 367 public void doAction(SaleProcess p, SalesPoint sp) { 368 dbPurchase.commit(); 369 //create id for new order (current date and consecutive number) 370 Calendar now = SMarket.getTime(); 371 if (dateLastOrder == null) { 372 dateLastOrder = (Calendar)now.clone(); 373 } 374 if (dateLastOrder.before(now)) { 375 dateLastOrder = (Calendar)now.clone(); 376 intLastOrder = 1; 377 } else { 378 intLastOrder++; 379 } 380 String newIDDate = dateLastOrder.toString(); 381 CIOpenPurchaseOrders opo = new CIOpenPurchaseOrders(newIDDate, intLastOrder, 382 csPurchase); 383 SMarket.getOpenPurchaseOrder().add(opo, null); 384 //add this order to statistics 385 SMarket.getMonthlySalesStats().updateOrderHistory(opo.getOrders()); 386 gatePurchaseConfirm.setNextTransition(new GateChangeTransition( 387 getPurchaseMainGate(null, null))); 388 //subtract purchase from account 389 SMarket.subtractFromAccount(new IntegerValue(toPay)); 390 }}, ButtonIDs.BTN_OK); 391 //go back to purchaseMain and find right table as it has been left so one can edit his purchase 392 setAction(fsmpc, new Action() { 393 private static final long serialVersionUID = 6591343498920717093L; 394 395 public void doAction(SaleProcess p, SalesPoint sp) { 396 ((UIGate)p.getCurrentGate()).setNextTransition( 397 new GateChangeTransition(getPurchaseMainGate(csPurchase, dbPurchase))); 398 }}, ButtonIDs.BTN_BACK); 399 //cancel purchase and go back to purchaseMain with right table being empty 400 setAction(fsmpc, new Action() { 401 private static final long serialVersionUID = -7467089028432871913L; 402 403 public void doAction(SaleProcess p, SalesPoint sp) { 404 dbPurchase.rollback(); 405 gatePurchaseConfirm.setNextTransition(new GateChangeTransition( 406 getPurchaseMainGate(csPurchase, dbPurchase))); 407 }}, ButtonIDs.BTN_CANCEL); 408 gatePurchaseConfirm.setFormSheet(fsmpc); 409 return gatePurchaseConfirm; 410 } 411 412 /** 413 * Attaches {@link FSManagerOpenPurchaseOrderMain}, its actions and the menu to {@link #gateOpoMain}. 414 * @return the set up {@link #gateOpoMain}. 415 */ 416 private UIGate getOpoMainGate() { 417 final SingleTableFormSheet stfs = FSManagerOpenPurchaseOrderMain.create(); 418 //view details of the selected order 419 setAction(stfs, new Action() { 420 private static final long serialVersionUID = -5902015261140571571L; 421 422 public void doAction(SaleProcess p, SalesPoint sp) { 423 CIOpenPurchaseOrders selRec = (CIOpenPurchaseOrders)stfs.getSelectedRecord(); 424 if (selRec == null) 425 JDDShowMessage.showMessageDialog(stfs, "Bitte wählen sie eine Lieferung aus.", 426 "Auswahl treffen"); 427 else 428 ((UIGate)p.getCurrentGate()).setNextTransition(new GateChangeTransition( 429 getOpoDetailGate(selRec))); 430 }}, ButtonIDs.BTN_DETAIL); 431 gateOpoMain.setFormSheet(stfs); 432 gateOpoMain.setMenuSheet(menu); 433 return gateOpoMain; 434 } 435 436 /** 437 * Attaches {@link FSManagerOpenPurchaseOrderDetail}, its actions and the menu to {@link #gateOpoDetail}. 438 * @param opo the open purchase order to be viewed. 439 * @return the set up {@link #gateOpoDetail}. 440 */ 441 private UIGate getOpoDetailGate(CIOpenPurchaseOrders opo) { 442 FormSheet fsmopod = FSManagerOpenPurchaseOrderDetail.create(opo); 443 //go back to overview 444 setTransition(fsmopod, new GateChangeTransition(getOpoMainGate()), ButtonIDs.BTN_BACK); 445 gateOpoDetail.setFormSheet(fsmopod); 446 gateOpoDetail.setMenuSheet(menu); 447 return gateOpoDetail; 448 } 449 450 451 /** 452 * Attaches {@link FSManagerEmployeeOverview}, its actions and the menu to {@link #gateEmplEditMain}. 453 * @return the set up {@link #gateEmplEditMain}. 454 */ 455 private UIGate getEmplEditMainGate() { 456 final FSManagerEmployeeOverview fsmeo = new FSManagerEmployeeOverview(); 457 //button add (merely a transition, but defined as action because of circular reference) 458 setAction(fsmeo, new Action() { 459 private static final long serialVersionUID = -7508914767137733399L; 460 461 public void doAction(SaleProcess p, SalesPoint sp) { 462 ((UIGate)p.getCurrentGate()).setNextTransition( 463 new GateChangeTransition(getEmplEditDetailGate(null))); 464 }}, ButtonIDs.BTN_ADD); 465 //button edit 466 setAction(fsmeo, new Action() { 467 private static final long serialVersionUID = -4309811559983074122L; 468 469 public void doAction(SaleProcess p, SalesPoint sp) { 470 UStaffer usr = (UStaffer)fsmeo.getSelectedRecord(); 471 if (usr == null) { 472 JDDShowMessage.showMessageDialog(fsmeo, "Bitte wählen sie einen Mitarbeiter aus.", 473 "Auswahl treffen"); 474 } else { 475 ((UIGate)p.getCurrentGate()).setNextTransition( 476 new GateChangeTransition(getEmplEditDetailGate(usr))); 477 } 478 }}, ButtonIDs.BTN_EDIT); 479 //button delete 480 setAction(fsmeo, new Action() { 481 private static final long serialVersionUID = 6270963383149695340L; 482 483 public void doAction(SaleProcess p, SalesPoint sp) { 484 final UStaffer usr = (UStaffer)fsmeo.getSelectedRecord(); 485 if (usr == null) { 486 JDDShowMessage.showMessageDialog(fsmeo, "Bitte wählen sie einen Mitarbeiter aus.", 487 "Auswahl treffen"); 488 } else { 489 final Value dismissalCompensation = usr.computeDismissalCompensation(); 490 JDisplayDialog jdd = JDDShowMessage.showMessageDialog(fsmeo, 491 "Soll " + usr.getFullName() + " ein Entlassungsgeld in Höhe von " + 492 Conversions.valueToCurrency(dismissalCompensation, " Euro") + 493 " gezahlt werden?", "Entlassungsgeld"); 494 jdd.getFormSheet().addContentCreator(new FormSheetContentCreator() { 495 private static final long serialVersionUID = -8313982518926665256L; 496 497 protected void createFormSheetContent(final FormSheet fs) { 498 fs.removeAllButtons(); 499 fs.addButton("Ja", 1, new Action() { 500 private static final long serialVersionUID = -6861684870677239529L; 501 502 public void doAction(SaleProcess p, SalesPoint sp) { 503 try { 504 UMUserBase.deleteUser(usr); 505 SMarket.subtractFromAccount(dismissalCompensation); 506 } 507 catch (VetoException ex) { 508 JDDShowMessage.showMessageDialog(fsmeo, ex.getMessage(), 509 "Eingeloggt"); 510 } 511 fs.cancel(); 512 } 513 }); 514 fs.addButton("Nein", 2, new Action() { 515 private static final long serialVersionUID = 4720070299004239655L; 516 517 public void doAction(SaleProcess p, SalesPoint sp) { 518 try { 519 UMUserBase.deleteUser(usr); 520 } 521 catch (VetoException ex) { 522 JDDShowMessage.showMessageDialog(fsmeo, ex.getMessage(), 523 "Eingeloggt"); 524 } 525 fs.cancel(); 526 } 527 }); 528 fs.addButton("Abbrechen", 3, new Action() { 529 private static final long serialVersionUID = 2705882733823499498L; 530 531 public void doAction(SaleProcess p, SalesPoint sp) { 532 fs.cancel(); 533 } 534 }); 535 536 } 537 538 }); 539 } 540 }}, ButtonIDs.BTN_DELETE); 541 gateEmplEditMain.setFormSheet(fsmeo); 542 gateEmplEditMain.setMenuSheet(menu); 543 544 return gateEmplEditMain; 545 } 546 547 /** 548 * Attaches {@link FSEditPersonData}, its actions and the menu to {@link #gateEmplEditDetail}. 549 * @param usr the employee whose details are to be viewed or edited. If <code>null</code> the 550 * FormSheet's fields will be empty and a new worker can be employed. 551 * @return the set up {@link #gateEmplEditDetail}. 552 */ 553 private UIGate getEmplEditDetailGate(final UStaffer usr) { 554 final FSCheckable fsc = FSEditPersonData.getStafferProfile(usr); 555 //button accept 556 setAction(fsc, new Action() { 557 private static final long serialVersionUID = -7702159208995691027L; 558 559 public void doAction(SaleProcess p, SalesPoint sp) { 560 if (fsc.checkTextFields(FSCheckable.ALL_ERRORMESSAGES_AT_ONCE, false)) { 561 FSEditPersonData fsepd = (FSEditPersonData)fsc.getFormSheet(); 562 char[] pwd = fsepd.getPassword(); 563 //check vor special errors 564 int error = 0; 565 if (usr == null) { //if new user is to be added 566 if (pwd == null) 567 error = 1; //the passwords must be set 568 } else { //if old user is to be edited 569 if (UMUserBase.getNumberOfManagers() == 1 //last manager mustn't be removed 570 && usr.getQualification().equals(UStaffer.MANAGER) 571 && !fsepd.getQualification().equals(UStaffer.MANAGER)) 572 error = 2; //password does not have to be set, but password and confirmation 573 //must at least match 574 if (!fsepd.passwordsEqual()) 575 error = 3; 576 } 577 switch (error) { 578 case 1: 579 JDDShowMessage.showMessageDialog(fsc, 580 "Die Passwörter stimmen nicht überein oder wurden nicht gesetzt.", 581 "Passwort überprüfen"); 582 break; 583 case 2: 584 JDDShowMessage.showMessageDialog(fsc, 585 "Dies ist der letzte Manager, er darf seines Postens nicht " + 586 "enthoben werden.", 587 "Letzter Manager"); 588 break; 589 case 3: 590 JDDShowMessage.showMessageDialog(fsc, 591 "Die Passwörter stimmen nicht überein.", 592 "Passwort überprüfen"); 593 break; 594 } 595 if (error == 0) { 596 UStaffer u = null; 597 if (usr == null) { //new user 598 u = (UStaffer)UMUserBase.createUser(fsc.getEntry(FSEditPersonData. 599 JTFC_LOGIN), 600 UMUserBase.SELLER, 601 fsepd.getQualification()); 602 } else { //existing user 603 u = usr; 604 } 605 if (u == null) { //new user, but chosen login already exists 606 JDDShowMessage.showMessageDialog(fsc, 607 "Dieses Login wurde bereits vergeben, wählen sie bitte ein anderes", 608 "Doppeltes Login"); 609 } else { 610 //both 611 u.setSalutation(fsepd.getSalutation()); 612 u.setSurname(fsc.getEntry(FSEditPersonData.JTFC_NAME)); 613 u.setFirstName(fsc.getEntry(FSEditPersonData.JTFC_FIRSTNAME)); 614 u.setTelephone(fsc.getEntry(FSEditPersonData.JTFC_TELEPHONE)); 615 u.setStreet(fsc.getEntry(FSEditPersonData.JTFC_STREET)); 616 u.setCity(fsc.getEntry(FSEditPersonData.JTFC_CITY)); 617 u.setPostcode(new Integer( 618 fsc.getEntry(FSEditPersonData.JTFC_POSTCODE)).intValue()); 619 if (fsepd.isPasswordSet()) 620 u.setPassWd(UStaffer.garblePassWD(pwd)); 621 u.setQualification(fsepd.getQualification()); 622 u.setSalary(Conversions.currencyToInt( 623 fsc.getEntry(FSEditPersonData.JTFC_SALARY), true)); 624 ((UIGate)p.getCurrentGate()).setNextTransition( 625 new GateChangeTransition(getEmplEditMainGate())); 626 } 627 } 628 } 629 }}, ButtonIDs.BTN_ACCEPT); 630 631 //button back (merely a transition, but defined as action because of circular reference) 632 setAction(fsc, new Action() { 633 private static final long serialVersionUID = 3552849914948625578L; 634 635 public void doAction(SaleProcess p, SalesPoint sp) { 636 ((UIGate)p.getCurrentGate()).setNextTransition( 637 new GateChangeTransition(getEmplEditMainGate())); 638 }}, ButtonIDs.BTN_BACK); 639 gateEmplEditDetail.setFormSheet(fsc); 640 gateEmplEditDetail.setMenuSheet(menu); 641 return gateEmplEditDetail; 642 } 643 644 /** 645 * Attaches {@link FSManagerCustomerOverview}, its actions and the menu to {@link #gateCustEditMain}. 646 * @return the set up {@link #gateCustEditMain}. 647 */ 648 private UIGate getCustEditMainGate() { 649 final FSManagerCustomerOverview fsmco = new FSManagerCustomerOverview(); 650 //button edit 651 setAction(fsmco, new Action() { 652 private static final long serialVersionUID = 2657646387282986673L; 653 654 public void doAction(SaleProcess p, SalesPoint sp) { 655 UCustomer usr = (UCustomer)fsmco.getSelectedRecord(); 656 if (usr == null) { 657 JDDShowMessage.showMessageDialog(fsmco, "Bitte wählen sie einen Kunden aus.", 658 "Auswahl treffen"); 659 } else { 660 ((UIGate)p.getCurrentGate()).setNextTransition( 661 new GateChangeTransition(getCustEditDetailGate(usr))); 662 } 663 }}, ButtonIDs.BTN_EDIT); 664 //button delete 665 setAction(fsmco, new Action() { 666 private static final long serialVersionUID = 6311464859876620531L; 667 668 public void doAction(SaleProcess p, SalesPoint sp) { 669 UCustomer usr = (UCustomer)fsmco.getSelectedRecord(); 670 if (usr == null) { 671 JDDShowMessage.showMessageDialog(fsmco, "Bitte wählen sie einen Kunden aus.", 672 "Auswahl treffen"); 673 } else { 674 try { 675 UMUserBase.deleteUser(usr); 676 } 677 catch (VetoException ex) { 678 JDDShowMessage.showMessageDialog(fsmco, 679 ex.getMessage(), "Eingeloggt"); 680 } 681 } 682 }}, ButtonIDs.BTN_DELETE); 683 gateCustEditMain.setFormSheet(fsmco); 684 gateCustEditMain.setMenuSheet(menu); 685 return gateCustEditMain; 686 } 687 688 /** 689 * Attaches {@link FSEditPersonData}, its actions and the menu to {@link #gateCustEditDetail}. 690 * @param usr the customer whose details are to be viewed. 691 * @return the set up {@link #gateCustEditDetail}. 692 */ 693 private UIGate getCustEditDetailGate(final UCustomer usr) { 694 final FSCheckable fsc = FSEditPersonData.getCustomerProfileForManager(usr); 695 //button accept 696 setAction(fsc, new Action() { 697 private static final long serialVersionUID = -4393247453410533947L; 698 699 public void doAction(SaleProcess p, SalesPoint sp) { 700 if (fsc.checkTextFields(FSCheckable.ALL_ERRORMESSAGES_AT_ONCE, false)) { 701 FSEditPersonData fsepd = (FSEditPersonData)fsc.getFormSheet(); 702 char[] pwd = fsepd.getPassword(); 703 //password and confirmation do not match 704 if (!fsepd.passwordsEqual()) { 705 JDDShowMessage.showMessageDialog(fsc, 706 "Die Passwörter stimmen nicht überein.", 707 "Passwort überprüfen"); 708 } else { 709 //save changes 710 if (fsepd.isPasswordSet()) usr.setPassWd(UStaffer.garblePassWD(pwd)); 711 ((UIGate)p.getCurrentGate()).setNextTransition( 712 new GateChangeTransition(getCustEditMainGate())); 713 } 714 } 715 }}, ButtonIDs.BTN_ACCEPT); 716 //button back 717 setTransition(fsc, new GateChangeTransition(getCustEditMainGate()), ButtonIDs.BTN_BACK); 718 fsc.getButton(ButtonIDs.BTN_BACK).setCaption("Kundenübersicht"); 719 //button to stats 720 fsc.addContentCreator(new FormSheetContentCreator() { 721 private static final long serialVersionUID = -3973025365345685863L; 722 723 public void createFormSheetContent(final FormSheet fs) { 724 fsc.addButton("Zur Statistik", 1, new Action() { 725 private static final long serialVersionUID = 652971860704594604L; 726 727 public void doAction(SaleProcess p, SalesPoint sp) { 728 ((UIGate)p.getCurrentGate()).setNextTransition( 729 new GateChangeTransition(getCustomerStatsDetailGate(usr))); 730 } 731 }); 732 } 733 }); 734 gateCustEditDetail.setFormSheet(fsc); 735 gateCustEditDetail.setMenuSheet(menu); 736 return gateCustEditDetail; 737 } 738 739 /** 740 * Attaches {@link FSManagerArticleStatsMain}, its actions and the menu to {@link #gateArticleStatsMain}. 741 * @return the set up {@link #gateArticleStatsMain}. 742 */ 743 private UIGate getArticleStatsMainGate(){ 744 //instantiation necessary to query ComboBoxes 745 FSManagerArticleStatsMain fsmasm = new FSManagerArticleStatsMain(); 746 final JCTimeRangeBoxes jctrb = fsmasm.getTimeRangeBoxes(); 747 final SingleTableFormSheet stfs = FSManagerArticleStatsMain.create(); 748 //button detail 749 setAction(stfs, new Action() { 750 private static final long serialVersionUID = 7798602215852724946L; 751 752 public void doAction(SaleProcess p, SalesPoint sp) { 753 int error = 0; 754 CIArticle selRec = (CIArticle)stfs.getSelectedRecord(); 755 if (selRec == null) error = 1; 756 if (!jctrb.isValidTimeRange()) error = 2; 757 switch (error) { 758 case 1: 759 JDDShowMessage.showMessageDialog(stfs, "Bitte wählen sie einen Artikel aus.", 760 "Auswahl treffen"); 761 break; 762 case 2: 763 JDDShowMessage.showMessageDialog(stfs, "Ungültiger Zeitraum.", 764 "Ungültiger Zeitraum"); 765 break; 766 default: 767 int mFrom = jctrb.getFromMonth(); 768 int mTo = jctrb.getToMonth(); 769 int yFrom = jctrb.getFromYear(); 770 int yTo = jctrb.getToYear(); 771 ((UIGate)p.getCurrentGate()).setNextTransition(new GateChangeTransition( 772 getArticleStatsDetailGate(Statistics.getArticleStats( 773 selRec.getName(), mFrom, yFrom, mTo, yTo)))); 774 } 775 }}, ButtonIDs.BTN_DETAIL); 776 gateArticleStatsMain.setFormSheet(stfs); 777 gateArticleStatsMain.setMenuSheet(menu); 778 return gateArticleStatsMain; 779 } 780 781 /** 782 * Attaches {@link FSManagerArticleStatsDetail}, its actions and the menu to 783 * {@link #gateArticleStatsDetail}. 784 * @param ciss the precomputed statistics to be displayed. 785 * @return the set up {@link #gateArticleStatsDetail}. 786 */ 787 public Gate getArticleStatsDetailGate(CISalesStats ciss) { 788 FormSheet fsasd = new FSManagerArticleStatsDetail(ciss); 789 //button back 790 setTransition(fsasd, new GateChangeTransition(getArticleStatsMainGate()), ButtonIDs.BTN_BACK); 791 gateArticleStatsDetail.setFormSheet(fsasd); 792 gateArticleStatsDetail.setMenuSheet(menu); 793 return gateArticleStatsDetail; 794 } 795 796 /** 797 * Attaches {@link FSManagerCustomerStatsMain}, its actions and the menu to {@link #gateCustomerStatsMain}. 798 * @return the set up {@link #gateCustomerStatsMain}. 799 */ 800 private UIGate getCustomerStatsMainGate() { 801 final FSManagerCustomerStatsMain fsmcsm = new FSManagerCustomerStatsMain(); 802 //button detail 803 setAction(fsmcsm, new Action() { 804 private static final long serialVersionUID = 8565675342446688220L; 805 806 public void doAction(SaleProcess p, SalesPoint sp) { 807 UCustomer selRec = (UCustomer)fsmcsm.getSelectedRecord(); 808 int error = 0; 809 if (selRec == null) error = 1; 810 switch (error) { 811 case 1: 812 JDDShowMessage.showMessageDialog(fsmcsm, "Bitte wählen sie einen Kunden aus.", 813 "Auswahl treffen"); 814 break; 815 default: 816 ((UIGate)p.getCurrentGate()).setNextTransition(new GateChangeTransition( 817 getCustomerStatsDetailGate(selRec))); 818 } 819 }}, ButtonIDs.BTN_DETAIL); 820 gateCustomerStatsMain.setFormSheet(fsmcsm); 821 gateCustomerStatsMain.setMenuSheet(menu); 822 return gateCustomerStatsMain; 823 } 824 825 /** 826 * Attaches {@link FSManagerCustomerStatsDetail}, its actions and the menu to 827 * {@link #gateCustomerStatsDetail}. 828 * @param uc the customer whose statistics are to be viewed. 829 * @return the set up {@link #gateCustomerStatsDetail}. 830 */ 831 private UIGate getCustomerStatsDetailGate(final UCustomer uc) { 832 final FormSheet fscsd = new FSManagerCustomerStatsDetail(uc); 833 fscsd.addContentCreator(new FormSheetContentCreator() { 834 private static final long serialVersionUID = -7071697946191121850L; 835 836 public void createFormSheetContent(final FormSheet fs) { 837 //button to customer data 838 fs.addButton("Kundendaten", 1, new Action() { 839 private static final long serialVersionUID = 6385271347247870972L; 840 841 public void doAction(SaleProcess p, SalesPoint sp) { 842 ((UIGate)p.getCurrentGate()).setNextTransition( 843 new GateChangeTransition(getCustEditDetailGate(uc))); 844 } 845 }); 846 } 847 }); 848 setTransition(fscsd, new GateChangeTransition(getCustomerStatsMainGate()), ButtonIDs.BTN_BACK); 849 fscsd.getButton(ButtonIDs.BTN_BACK).setCaption("Statistikübersicht"); 850 gateCustomerStatsDetail.setFormSheet(fscsd); 851 gateCustomerStatsDetail.setMenuSheet(menu); 852 return gateCustomerStatsDetail; 853 } 854 855 /** 856 * Attaches {@link FSManagerOverallStats} and the menu to {@link #gateOverallStats}. 857 * @return the set up {@link #gateOverallStats}. 858 */ 859 private UIGate getOverallStatsGate() { 860 FormSheet fsmos = new FSManagerOverallStats(); 861 gateOverallStats.setFormSheet(fsmos); 862 gateOverallStats.setMenuSheet(menu); 863 return gateOverallStats; 864 } 865 866 /** 867 * Creates the {@link MenuSheet} for the manager process. 868 * 869 * @return the created MenuSheet. 870 */ 871 private MenuSheet createManagerMenuSheet() { 872 MenuSheet msMenuBar = new MenuSheet("Bar"); 873 MenuSheet msLogOff = new MSLogOff(); 874 MenuSheet msWares = new MenuSheet("Waren", null, 'W'); 875 MenuSheet msPersons = new MenuSheet("Personen", null, 'P'); 876 MenuSheet msStatistics = new MenuSheet("Statistiken", null, 'k'); 877 MenuSheetItem msiOpenClose = new MenuSheetItem("Öffnen/Schließen", null, new Action() { 878 private static final long serialVersionUID = -3633366968919656335L; 879 880 public void doAction(SaleProcess p, SalesPoint sp) { 881 ((UIGate)p.getCurrentGate()).setNextTransition( 882 new GateChangeTransition(getOpenCloseGate())); 883 }}, 'f'); 884 MenuSheetItem msiOptions = new MenuSheetItem("Einstellungen", null, new Action() { 885 private static final long serialVersionUID = 6197839271249196109L; 886 887 public void doAction(SaleProcess p, SalesPoint sp) { 888 ((UIGate)p.getCurrentGate()).setNextTransition( 889 new GateChangeTransition(getOptionsGate())); 890 }}, 'E'); 891 MenuSheetItem msiStockOverview = new MenuSheetItem("Bestand und Preis", null, new Action() { 892 private static final long serialVersionUID = -3376000007429832195L; 893 894 public void doAction(SaleProcess p, SalesPoint sp) { 895 ((UIGate)p.getCurrentGate()).setNextTransition(new GateChangeTransition(getStockMainGate())); 896 }}, 'B'); 897 MenuSheetItem msiPurchase = new MenuSheetItem("Einkaufen", null, new Action() { 898 private static final long serialVersionUID = -5953129796586047918L; 899 900 public void doAction(SaleProcess p, SalesPoint sp) { 901 ((UIGate)p.getCurrentGate()).setNextTransition(getToPurchaseMain(null, null)); 902 }}, 'E'); 903 MenuSheetItem msiOpoMain = new MenuSheetItem("Erwartete Lieferungen", null, new Action() { 904 private static final long serialVersionUID = -733348375476747534L; 905 906 public void doAction(SaleProcess p, SalesPoint sp) { 907 ((UIGate)p.getCurrentGate()).setNextTransition( 908 new GateChangeTransition(getOpoMainGate())); 909 }}, 'L'); 910 MenuSheetItem msiEmplEdit = new MenuSheetItem("Angestellte", null, new Action() { 911 private static final long serialVersionUID = 2712700798229090841L; 912 913 public void doAction(SaleProcess p, SalesPoint sp) { 914 ((UIGate)p.getCurrentGate()).setNextTransition( 915 new GateChangeTransition(getEmplEditMainGate())); 916 }}, 'A'); 917 MenuSheetItem msiCustEdit = new MenuSheetItem("Kunden", null, new Action() { 918 private static final long serialVersionUID = -3002846725606683316L; 919 920 public void doAction(SaleProcess p, SalesPoint sp) { 921 ((UIGate)p.getCurrentGate()).setNextTransition( 922 new GateChangeTransition(getCustEditMainGate())); 923 }}, 'K'); 924 MenuSheetItem msiArticleStats = new MenuSheetItem("Artikelstatistik", null, new Action() { 925 private static final long serialVersionUID = -3919724847608738679L; 926 927 public void doAction(SaleProcess p, SalesPoint sp) { 928 ((UIGate)p.getCurrentGate()).setNextTransition( 929 new GateChangeTransition(getArticleStatsMainGate())); 930 }}, 'A'); 931 MenuSheetItem msiCustomerStats = new MenuSheetItem("Kundenstatistik", null, new Action() { 932 private static final long serialVersionUID = -1953762444703803447L; 933 934 public void doAction(SaleProcess p, SalesPoint sp) { 935 ((UIGate)p.getCurrentGate()).setNextTransition( 936 new GateChangeTransition(getCustomerStatsMainGate())); 937 }}, 'K'); 938 MenuSheetItem msiOverallStats = new MenuSheetItem("Umsatzstatistik", null, new Action() { 939 private static final long serialVersionUID = -8766726499754454331L; 940 941 public void doAction(SaleProcess p, SalesPoint sp) { 942 ((UIGate)p.getCurrentGate()).setNextTransition( 943 new GateChangeTransition(getOverallStatsGate())); 944 }}, 'U'); 945 946 msMenuBar.add(msLogOff); 947 msLogOff.add(msiOpenClose); 948 msLogOff.add(msiOptions); 949 msLogOff.add(msLogOff.remove("exit")); 950 msMenuBar.add(msWares); 951 msWares.add(msiStockOverview); 952 msWares.add(msiPurchase); 953 msWares.add(msiOpoMain); 954 msMenuBar.add(msPersons); 955 msPersons.add(msiEmplEdit); 956 msPersons.add(msiCustEdit); 957 msMenuBar.add(msStatistics); 958 msStatistics.add(msiArticleStats); 959 msStatistics.add(msiCustomerStats); 960 msStatistics.add(msiOverallStats); 961 return msMenuBar; 962 } 963 964 /** 965 * Helper Transition to {@link #gatePurchaseMain}.<br> 966 * <br> 967 * This transition cannot be implemented as a GateChangeTransition.<br> 968 * The reason is that getPurchaseMainGate contains a TTFS-creation method that passes 969 * gatePurchaseMain as necessary parameter for the TTFS.<br> 970 * When a user's current Gate is gatePurchaseMain and he invokes a GateChangeTransition 971 * to gatePurchaseMain via the menu, an exception would occur.<br> 972 * This is because for a GateChangeTransition the setup method for gatePurchaseMain 973 * (and therefore the TTFS-creation method) would be called while gatePurchaseMain 974 * is still active and displaying a TTFS. 975 * This method creates the TTFS after the gatePurchaseMain has already been 976 * left, thus causing no conflicts. 977 * 978 * @param cs the CountingStock containing the manager's purchase. 979 * @param db the transaction's DataBasket. 980 * 981 * @return a Transition to {@link #getPurchaseMainGate(CountingStock, DataBasket)}. 982 */ 983 private Transition getToPurchaseMain(final CountingStock cs, final DataBasket db) { 984 return new Transition() { 985 private static final long serialVersionUID = -4677517203995850904L; 986 987 public Gate perform(SaleProcess pOwner, users.User usr) { 988 return getPurchaseMainGate(cs, db); 989 } 990 }; 991 } 992 }