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    }