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