001 package videoautomat.transition; 002 003 import java.util.Iterator; 004 005 import data.CatalogItemValue; 006 import data.DataBasket; 007 import data.DataBasketConditionImpl; 008 import data.IntegerValue; 009 import data.MoneyBag; 010 import data.NotEnoughMoneyException; 011 import data.NumberValue; 012 import data.StoringStock; 013 import data.ooimpl.CountingStockItemDBEntry; 014 import sale.Gate; 015 import sale.SaleProcess; 016 import sale.SalesPoint; 017 import sale.Transition; 018 import users.User; 019 import videoautomat.AutomatUser; 020 import videoautomat.DisplayMoneyStockError; 021 import videoautomat.SaleProcessRent; 022 import videoautomat.VideoCassette; 023 import videoautomat.VideoShop; 024 025 /** 026 *<code>Transition</code> that temporary adds the selected videos to the 027 *{@link AutomatUser#getVideoStock()}, the inserted money to the {@link VideoShop#getVideoStock()} 028 *and from there transacts the change money 029 * @author Tobias Ruch 030 */ 031 032 public class RentPayConfirmTransition implements Transition { 033 034 /** 035 * Performes the transition. 036 * @param sp - current process 037 * @param user - current user of this process 038 * 039 * @return the new <code>Gate</code> which should be shown after the transition 040 */ 041 042 public Gate perform(SaleProcess sp, User user) { 043 044 045 SaleProcessRent saleProcess = (SaleProcessRent) sp; 046 DataBasket dataBasket = saleProcess.getBasket(); 047 MoneyBag mb_temp = (MoneyBag) saleProcess.getContext().getProcessData(SaleProcessRent.MB_TEMP_KEY); 048 /* 049 * first add new rent-cassettes to the user`s stock 050 */ 051 052 053 dataBasket.setCurrentSubBasket(SaleProcessRent.SUB_USER_VIDEO); 054 StoringStock ss_user = 055 ((AutomatUser) ((SalesPoint) saleProcess.getContext()).getUser()) 056 .getVideoStock(); 057 058 Iterator i = 059 dataBasket.subBasketIterator( 060 SaleProcessRent.SUB_SHOP_VIDEO, 061 DataBasketConditionImpl.ALL_ENTRIES); 062 while (i.hasNext()) { 063 VideoCassette vc = 064 new VideoCassette( 065 ((CountingStockItemDBEntry) i.next()) 066 .getSecondaryKey()); 067 ss_user.add(vc, dataBasket); 068 } 069 /* 070 * calculate what is in the temporar moneybag 071 */ 072 073 dataBasket.setCurrentSubBasket(SaleProcessRent.SUB_TMP_MONEY); 074 NumberValue nv = (NumberValue)((NumberValue) mb_temp.sumStock(dataBasket, 075 new CatalogItemValue(), 076 new IntegerValue(0))). 077 subtract((NumberValue)saleProcess.getContext().getProcessData(SaleProcessRent.SUM_KEY)); 078 /* 079 * this prevents an exception that is caused by removing all items from the table 080 * while it is shown 081 */ 082 try { 083 saleProcess.getContext().setFormSheet(saleProcess, null); 084 } catch (InterruptedException e1) { 085 e1.printStackTrace(); 086 } 087 /* 088 * put the content of the temporar moneybag to the shop`s one and get the change 089 */ 090 VideoShop.getMoneyBag().addStock(mb_temp, dataBasket, true); 091 dataBasket.setCurrentSubBasket(SaleProcessRent.SUB_SHOP_MONEY); 092 try{ 093 VideoShop.getMoneyBag().transferMoney(mb_temp, dataBasket, nv); 094 }catch(NotEnoughMoneyException e){ 095 dataBasket.rollbackSubBasket(SaleProcessRent.SUB_USER_VIDEO); 096 dataBasket.rollbackSubBasket(SaleProcessRent.SUB_TMP_MONEY); 097 dataBasket.rollbackSubBasket(SaleProcessRent.SUB_SHOP_MONEY); 098 DisplayMoneyStockError dmse = new DisplayMoneyStockError(); 099 dataBasket.setCurrentSubBasket(SaleProcessRent.SUB_TMP_MONEY); 100 return saleProcess.getPayGate(); 101 } 102 103 return saleProcess.getConfirmGate(); 104 105 } 106 107 }