001 package market; 002 003 import market.stdform.ButtonIDs; 004 import market.stdform.FSCheckable; 005 import market.stdform.FSSellerBill; 006 import market.stdform.FSSellerCustomerTable; 007 import market.stdform.FSSellerOrderTable; 008 import market.stdform.MSLogOff; 009 import sale.FormSheet; 010 import sale.FormSheetContentCreator; 011 import sale.Gate; 012 import sale.GateChangeTransition; 013 import sale.SaleProcess; 014 import sale.SalesPoint; 015 import sale.Transition; 016 import sale.UIGate; 017 import sale.stdforms.MsgForm; 018 import users.User; 019 import data.IntegerValue; 020 import data.Value; 021 import data.events.VetoException; 022 import data.stdforms.SingleTableFormSheet; 023 024 025 /** 026 * The seller process. This process handles the payment of the orders. 027 */ 028 public class SProcessSeller extends SProcessMarket{ 029 030 /** 031 * Gate for selecting customers. 032 */ 033 private UIGate uig_customerSelection = new UIGate(null, null); 034 035 /** 036 * Gate for affirming the cancel of the order of the currently selected customer 037 * and for displaying lost articles in case of shortages. 038 */ 039 private UIGate uig_cancelBuy = new UIGate(null, null); 040 041 /** 042 * Gate for affirming the order of the currently selected customer. 043 */ 044 private UIGate uig_order = new UIGate(null, null); 045 046 /** 047 * Gate for selecting discount and mode of payment. 048 */ 049 private UIGate uig_commit = new UIGate(null, null); 050 051 /** 052 * Gate for displaying that no customer is selected. 053 */ 054 private UIGate uig_noCustomer = new UIGate(null, null); 055 056 /** 057 * Gate for displaying that the payment was successful. 058 */ 059 private UIGate uig_log = new UIGate(null, null); 060 061 /** 062 * Table that shows the queue of customers 063 */ 064 private SingleTableFormSheet stfs_customerQueue; 065 066 /** 067 * FormSheet that shows the bill 068 */ 069 private FSCheckable fs_sellerBill; 070 071 /** 072 * The UCustomer associated to the currently selected SICustomer 073 */ 074 private UCustomer uc_customer; 075 076 /** 077 * The currently selected SICustomer 078 */ 079 private SICustomer sic_customer; 080 081 082 /** 083 * @param name the name of the process. 084 */ 085 public SProcessSeller(String name){ 086 super(name); 087 } 088 089 090 // ############################ Gates ##################################### 091 092 /** 093 * Attaches {@link FSSellerCustomerTable}, its actions and the menu to {@link #uig_customerSelection}. 094 * @return the set up {@link #uig_customerSelection}. 095 */ 096 protected Gate getInitialGate() { 097 stfs_customerQueue = FSSellerCustomerTable.getCustomerTable(SMarket.getTillQueue()); 098 stfs_customerQueue.setGate(uig_customerSelection); 099 100 setTransition(stfs_customerQueue, changeToOrderGate(), ButtonIDs.BTN_OK); 101 setTransition(stfs_customerQueue, changeToCancelBuyGate(), ButtonIDs.BTN_CANCEL); 102 103 uig_customerSelection.setFormSheet(stfs_customerQueue); 104 uig_customerSelection.setMenuSheet(new MSLogOff()); 105 return uig_customerSelection; 106 } 107 108 /** 109 * Attaches a {@link MsgForm} and its ok-action to {@link #uig_cancelBuy}. 110 * @return the set up {@link #uig_cancelBuy}. 111 */ 112 protected Gate getCancelBuyGate(){ 113 FormSheet fs = new MsgForm("Auftrag stornieren?", 114 "Sind Sie sicher, dass sie den Auftrag von " 115 + uc_customer.getFullName() + 116 " stornieren wollen?"); 117 118 fs.addContentCreator(new FormSheetContentCreator(){ 119 protected void createFormSheetContent(FormSheet fs) { 120 fs.getButton(FormSheet.BTNID_OK).setAction(new sale.Action(){ 121 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable { 122 uig_cancelBuy.setNextTransition(cancelBuy()); 123 } 124 }); 125 fs.addButton("Zurück", FormSheet.BTNID_CANCEL, new sale.Action(){ 126 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable { 127 uig_cancelBuy.setNextTransition(GateChangeTransition.CHANGE_TO_ROLLBACK_GATE); 128 } 129 }); 130 } 131 }); 132 133 uig_cancelBuy.setFormSheet(fs); 134 return uig_cancelBuy; 135 } 136 137 /** 138 * Attaches a {@link MsgForm} and its ok-action to {@link #uig_noCustomer}. 139 * @return the set up {@link #uig_noCustomer}. 140 */ 141 protected Gate getNoCustomerGate(){ 142 FormSheet fs = new MsgForm("Kein Kunde selektiert", "Sie müssen zunächst einen Kunden auswählen!"); 143 setTransition(fs, GateChangeTransition.CHANGE_TO_ROLLBACK_GATE, FormSheet.BTNID_OK); 144 uig_noCustomer.setFormSheet(fs); 145 return uig_noCustomer; 146 } 147 148 /** 149 * Attaches {@link FSSellerOrderTable} and its actions to {@link #uig_order}. 150 * @return the set up {@link #uig_order}. 151 */ 152 protected Gate getOrderGate(){ 153 FormSheet fs = FSSellerOrderTable.getOrderTable(uc_customer.getShoppingBasket(), 154 sic_customer); 155 setTransition(fs, GateChangeTransition.CHANGE_TO_COMMIT_GATE, ButtonIDs.BTN_ACCEPT); 156 setTransition(fs, GateChangeTransition.CHANGE_TO_ROLLBACK_GATE, ButtonIDs.BTN_BACK); 157 uig_order.setFormSheet(fs); 158 return uig_order; 159 } 160 161 /** 162 * Attaches {@link FSSellerBill} and its actions to {@link #uig_commit}. 163 * @return the set up {@link #uig_commit}. 164 */ 165 public Gate getCommitGate() { 166 fs_sellerBill = FSSellerBill.create(uc_customer.getShoppingBasket().sumStock( 167 null, 168 CIArticle.getCatalogItemValue(), 169 new IntegerValue(0)), 170 uc_customer.getDiscount()); 171 172 setAction(fs_sellerBill, new sale.Action(){ 173 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable { 174 if(fs_sellerBill.checkTextFields(FSCheckable.ALL_ERRORMESSAGES_AT_ONCE, false)){ 175 uig_commit.setNextTransition(changeToConfirmationGate()); 176 } 177 } 178 }, ButtonIDs.BTN_ACCEPT); 179 setTransition(fs_sellerBill, new GateChangeTransition(getOrderGate()), ButtonIDs.BTN_BACK); 180 181 uig_commit.setFormSheet(fs_sellerBill); 182 return uig_commit; 183 } 184 185 /** 186 * @return the Gate to jump to if the selected customer has to be rolled back. 187 */ 188 public Gate getRollbackGate() { 189 return new Gate(){ 190 public Transition getNextTransition(SaleProcess pOwner, User usr) 191 throws InterruptedException { 192 return new Transition(){ 193 public Gate perform(SaleProcess pOwner, User usr) { 194 pOwner.getBasket().rollback(); 195 uc_customer = null; 196 sic_customer = null; 197 return getInitialGate(); 198 } 199 }; 200 } 201 }; 202 } 203 204 /** 205 * Attaches {@link MsgForm} and its ok-action to {@link #uig_log}. 206 * @return the set up {@link #uig_log}. 207 */ 208 public Gate getLogGate() { 209 FormSheet fs = new MsgForm("Bezahlung erfolgt!", 210 "Der Kaufvorgang wurde abgeschlossen, die Artikel werden so schnell wie möglich ausgeliefert!"); 211 setTransition(fs, changeToCustomerSelectionGate(), FormSheet.BTNID_OK); 212 uig_log.setFormSheet(fs); 213 return uig_log; 214 } 215 216 // ####################### Transitions ############################## 217 218 /** 219 * @return a Transition that changes to the {@link #getInitialGate()} and logs the process. 220 */ 221 private Transition changeToCustomerSelectionGate(){ 222 return new Transition(){ 223 public Gate perform(SaleProcess p, User usr) { 224 try { 225 p.log (p); 226 } 227 catch (java.io.IOException ioe) { 228 throw new Error ("Exception occurred while logging process: " + ioe); 229 } 230 return getInitialGate(); 231 } 232 }; 233 } 234 235 /** 236 * @return a Transition that changes to the {@link #getInitialGate()}, 237 * puts the articles of the selected customer back to the markets offer 238 * and removes the customer permanently from the till-queue. 239 */ 240 private Transition cancelBuy(){ 241 return new Transition(){ 242 public Gate perform(SaleProcess pOwner, User usr) { 243 SMarket.getOffer().addStock(uc_customer.getShoppingBasket(), null, true); 244 pOwner.getBasket().commit(); 245 return getInitialGate(); 246 } 247 }; 248 } 249 250 /** 251 * @return a Transition that changes to the {@link #getCancelBuyGate()}, if a customer is selected, 252 * otherwise it will change to the {@link #getNoCustomerGate()} 253 */ 254 private Transition changeToCancelBuyGate(){ 255 return new Transition(){ 256 public Gate perform(SaleProcess pOwner, User usr) { 257 if(stfs_customerQueue.getSelectedRecord()==null){ 258 return getNoCustomerGate(); 259 } 260 else{ 261 setCustomer(); 262 return getCancelBuyGate(); 263 } 264 } 265 }; 266 } 267 268 /** 269 * @return a Transition that changes to the {@link #getOrderGate()}, if a customer is selected, 270 * otherwise it will change to the {@link #getNoCustomerGate()} 271 */ 272 private Transition changeToOrderGate(){ 273 return new Transition(){ 274 public Gate perform(SaleProcess pOwner, User usr) { 275 if(stfs_customerQueue.getSelectedRecord()==null){ 276 return getNoCustomerGate(); 277 } 278 else{ 279 setCustomer(); 280 return getOrderGate(); 281 } 282 } 283 }; 284 } 285 286 /** 287 * @return a Transition that changes to {@link #getLogGate()}, 288 * adds the customers order to order-queue and 289 * adds the payed money to markets account 290 */ 291 private Transition changeToConfirmationGate(){ 292 return new Transition(){ 293 public Gate perform(SaleProcess pOwner, User usr) { 294 Value v = ((FSSellerBill)fs_sellerBill.getFormSheet()).getEndSum(); 295 double discount = Conversions.round( 296 Double.valueOf(Conversions.convertComma( 297 fs_sellerBill.getEntry(FSSellerBill.JTFC_DISCOUNT))).doubleValue(), 3); 298 //show statistics not until day-end closing, so store them im dailyStats 299 SMarket.getDailySalesStats().addSales(uc_customer, discount); 300 SMarket.getDailySalesStats().addRevenue(Conversions.valueToInt(v)); 301 SMarket.getCustomerStats().addSales(uc_customer, v); 302 SMarket.addToAccount(v); 303 if(uc_customer.getShoppingBasket().size(null)>0) SICustomer.addToOrderQueue(uc_customer); 304 pOwner.getBasket().commit(); 305 uc_customer = null; 306 sic_customer = null; 307 return getLogGate(); 308 } 309 }; 310 } 311 312 313 // ########################### private methods ######################################### 314 315 /** 316 * Sets customer from tableselection and remove it from customer-queue 317 */ 318 private void setCustomer(){ 319 sic_customer = (SICustomer)stfs_customerQueue.getSelectedRecord(); 320 uc_customer = sic_customer.getCustomer(); 321 try { 322 sic_customer.getStock().remove(sic_customer, this.getBasket()); 323 } catch (VetoException e) { 324 System.err.println(e.getMessage()); 325 } 326 } 327 }