001 /*
002 * Created on 18.09.2005
003 *
004 */
005 package videoautomat.transition;
006
007 import java.util.Iterator;
008
009 import data.NotEnoughMoneyException;
010 import data.NumberValue;
011 import data.QuoteValue;
012 import data.StockItem;
013 import data.StoringStock;
014 import data.Value;
015 import data.ooimpl.MoneyBagImpl;
016 import sale.Gate;
017 import sale.SaleProcess;
018 import sale.Transition;
019 import users.User;
020 import videoautomat.DisplayMoneyStockError;
021 import videoautomat.SaleProcessHandBack;
022 import videoautomat.VideoCassette;
023 import videoautomat.VideoShop;
024
025 /**
026 * a <code>Transition</code> that calculates the money the user get back, temporary re-adds the handed
027 * back videos to the {@link VideoShop}s stock and change to the
028 * {@link SaleProcessHandBack#getChangeGate()}. If there is not enough change money in the shop, a
029 * {@link DisplayMoneyStockError}opens and it returns the sale.SaleProcess#getRollbackGate()
030 *
031 * @author Alexander Herrmann
032 *
033 */
034 public class HandBackCalculateSumTransition implements Transition {
035
036 /**
037 * Gate that performes the handback actions.
038 * @author Alexander Herrmann
039 */
040 public Gate perform(SaleProcess sp, User user) {
041
042 SaleProcessHandBack processHandback = (SaleProcessHandBack) sp;
043
044 if (((StoringStock) processHandback.getContext().getProcessData(SaleProcessHandBack.SS_TEMP_KEY)).size(processHandback.getBasket()) == 0)
045 return processHandback.restart();
046
047 Iterator it = ((StoringStock) processHandback.getContext().getProcessData(SaleProcessHandBack.SS_TEMP_KEY)).iterator(processHandback.getBasket(), false);
048 while (it.hasNext()) {
049 StockItem ssi = (StockItem) it.next();
050 Value v = null;
051 v = ((QuoteValue) ssi.getAssociatedItem(null).getValue()).getOffer();
052 NumberValue nv_sum = (NumberValue) processHandback.getContext().getProcessData(SaleProcessHandBack.CHG_MONEY_KEY);
053 nv_sum = (NumberValue) nv_sum.add(v.subtract(((VideoCassette) ssi).getCost()));
054 processHandback.getContext().setProcessData(SaleProcessHandBack.CHG_MONEY_KEY, nv_sum);
055
056 VideoShop.getVideoStock().add(ssi.getName(), 1, processHandback.getBasket());
057 }
058 try{
059 VideoShop.getMoneyBag().transferMoney(
060 (MoneyBagImpl) processHandback.getContext().getProcessData(SaleProcessHandBack.MB_TEMP_KEY),
061 processHandback.getBasket(),
062 (NumberValue) processHandback.getContext().getProcessData(SaleProcessHandBack.CHG_MONEY_KEY));
063 }catch(NotEnoughMoneyException e){
064 DisplayMoneyStockError dmse = new DisplayMoneyStockError();
065 return processHandback.getRollbackGate();
066 }
067
068 return processHandback.getChangeGate();
069 }
070
071 }