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