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