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 }