001 package market;
002
003 import market.stdform.ButtonIDs;
004 import market.stdform.FSCustomerConfirmSelection;
005 import market.stdform.FSCustomerOfferTable;
006 import market.stdform.MSLogOff;
007 import sale.FormSheet;
008 import sale.Gate;
009 import sale.GateChangeTransition;
010 import sale.SaleProcess;
011 import sale.SalesPoint;
012 import sale.Transition;
013 import sale.UIGate;
014 import sale.stdforms.MsgForm;
015 import users.User;
016 import data.CountingStock;
017 import data.IntegerValue;
018 import data.Value;
019
020 /**
021 * The customer process. This process handles a customer's purchase.
022 */
023 public class SProcessCustomer extends SProcessMarket{
024
025 /**
026 * The customer who interacts with this SaleProcess.
027 */
028 private UCustomer uc_customer;
029
030 /**
031 * Gate for selecting items to purchase.
032 */
033 private UIGate uig_selection = new UIGate(null, null);
034
035 /**
036 * Gate for affirming or canceling the purchase.
037 */
038 private UIGate uig_commit = new UIGate(null, null);
039
040 /**
041 * Gate for displaying the successful purchase.
042 */
043 private UIGate uig_ok = new UIGate(null, null);
044
045 /**
046 * @param user the customer who performs the purchase.
047 */
048 public SProcessCustomer(User user){
049 super("buy");
050 uc_customer = (UCustomer)(user);
051 }
052
053 // ################################## Gates ##########################################################
054
055 /**
056 * Attaches {@link FSCustomerOfferTable}, its actions and the menu to {@link #uig_selection}.
057 * @return the set up {@link #uig_selection}.
058 */
059 protected Gate getInitialGate() {
060
061 final FormSheet fs = FSCustomerOfferTable.getOfferFormSheet((CountingStock)SMarket.getOffer(),
062 uc_customer.getShoppingBasket(),
063 this.getBasket(),
064 uig_selection);
065 setAction(fs, new sale.Action(){
066 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
067 if(uc_customer.getShoppingBasket().size(getBasket())==0){
068 JDDShowMessage.showMessageDialog(fs, "Bitte wählen sie Artikel zum Kauf aus.",
069 "Keine Auswahl getroffen");
070 }
071 else uig_selection.setNextTransition(GateChangeTransition.CHANGE_TO_COMMIT_GATE);
072 }
073 }, ButtonIDs.BTN_BUY);
074 setTransition(fs, GateChangeTransition.CHANGE_TO_ROLLBACK_GATE, ButtonIDs.BTN_BACK);
075 uig_selection.setFormSheet(fs);
076 uig_selection.setMenuSheet(new MSLogOff());
077 return uig_selection;
078 }
079
080 /**
081 * Attaches {@link FSCustomerConfirmSelection}, its actions and the menu to {@link #uig_commit}.
082 * @return the set up {@link #uig_commit}.
083 */
084 public Gate getCommitGate() {
085 FormSheet fs = new FSCustomerConfirmSelection(getAmount());
086 setTransition(fs, commit(), ButtonIDs.BTN_BUY);
087 setTransition(fs, new GateChangeTransition(getInitialGate()), ButtonIDs.BTN_BACK);
088 uig_commit.setFormSheet(fs);
089 return uig_commit;
090 }
091
092 /**
093 * Attaches a {@link MsgForm} and its OK-action to {@link #uig_ok}.
094 * @return the set up {@link #uig_ok}.
095 */
096 public Gate getOkGate() {
097 FormSheet fs = new MsgForm("Auswahl bestätigt!", "Bitte begeben Sie sich zur Kasse!");
098 setTransition(fs, changeToStopGate(), FormSheet.BTNID_OK);
099 uig_ok.setFormSheet(fs);
100 return uig_ok;
101 }
102
103
104 // ############################ Transitions ###########################################################
105
106 /**
107 * @return a Transition that changes to the {@link #getStopGate()} and adds the customer to the global till-queue.
108 */
109 private Transition changeToStopGate(){
110 return new Transition(){
111 public Gate perform(SaleProcess pOwner, User usr) {
112 SICustomer.addToTillQueue(uc_customer);
113 return getStopGate();
114 }
115 };
116 }
117
118 /**
119 * @return a transition that commits the databasket and changes to the {@link #getOkGate()}.
120 */
121 private Transition commit(){
122 return new Transition(){
123 public Gate perform(SaleProcess pOwner, User usr) {
124 pOwner.getBasket().commit();
125 return getOkGate();
126 }
127 };
128 }
129
130 //################################# private methods ########################################################
131
132 /**
133 * @return the Value of the articles in the customers shoppingbasket.
134 */
135 private Value getAmount(){
136 return uc_customer.getShoppingBasket().sumStock(this.getBasket(), CIArticle.getCatalogItemValue(), new IntegerValue(0));
137 }
138 }