001    package videoautomat;
002    
003    import java.util.Iterator;
004    
005    import sale.*;
006    import users.User;
007    import videoautomat.gui.HandBack;
008    import data.IntegerValue;
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 data.ooimpl.StoringStockImpl;
017    import data.stdforms.TwoTableFormSheet;
018    import data.stdforms.twotableformsheet.SSSSStrategy;
019    
020    /**
021     * This class implements a <code>SaleProcess</code> to hand back the videos.
022     *  
023     */
024    public class SaleProcessHandBack extends SaleProcess {
025    
026            /*
027             * The initial Gate of this process at which the user can choose from his/her rented videos.
028             */
029            private UIGate uig_video = new UIGate(null, null);
030    
031            /*
032             * The Gate where the user will get informed about his/her change money.
033             */
034            private UIGate uig_change = new UIGate(null, null);
035    
036            /*
037             * A Stock to store temporary videos.
038             */
039            private StoringStock ss_temp =
040                    new StoringStockImpl("temp", VideoShop.getVideoCatalog());
041    
042            /*
043             * A MoneyBag to store temporary the change money
044             */
045            private MoneyBagImpl mb_temp = new MoneyBagImpl("temp", VideoShop.getCurrency());
046    
047            /*
048             * A NumberValue representing the change money
049             */
050            private NumberValue nv_sum = new IntegerValue(0);
051    
052            /**
053             * Constructs a new <code>SaleProcessHandBack</code>
054             *  
055             */
056            public SaleProcessHandBack() {
057                    super("SaleProcessGiveback");
058            }
059    
060            /**
061             * Implementation of the inherited abstract method.
062             * 
063             * @return the <code>Gate</code> where the user will see his/her current rented videos.
064             * 
065             * @see sale.SaleProcess#getInitialGate()
066             */
067            protected Gate getInitialGate() {
068                    TwoTableFormSheet ttfs =
069                            HandBack.getRentedVideosFormSheet(
070                                    ((AutomatUser) ((SalesPoint) this.getContext()).getUser()).getVideoStock(),
071                                    ss_temp,
072                                    getBasket(),
073                                    uig_video,
074                                    null,
075                                    null,
076                                    new TEDVideoCassette(),
077                                    new TEDVideoCassette(),
078                                    new SSSSStrategy());
079    
080                    ttfs.addContentCreator(new FormSheetContentCreator() {
081                            public void createFormSheetContent(FormSheet fs) {
082                                    fs.getButton(HandBack.FB_GIVEBACK).setAction(new Action() {
083                                            public void doAction(SaleProcess p, SalesPoint sp) {
084                                                    uig_video.setNextTransition(getCalculateSumTransition());
085                                            }
086                                    });
087                                    fs.getButton(HandBack.FB_CANCEL).setAction(new Action() {
088                                            public void doAction(SaleProcess p, SalesPoint sp) {
089                                                    uig_video.setNextTransition(
090                                                            new GateChangeTransition(getRollbackGate()));
091                                            }
092                                    });
093                            }
094                    });
095    
096                    uig_video.setFormSheet(ttfs);
097                    return uig_video;
098            }
099    
100            /**
101             * @return the <code>Gate</code> where the user will see his/her change money.
102             *  
103             */
104            private Gate getChangeGate() {
105                    String s = VideoShop.getCurrency().toString(nv_sum);
106                    FormSheet fs = HandBack.getChangeFormSheet(mb_temp, uig_change, getBasket(), s);
107    
108                    fs.addContentCreator(new FormSheetContentCreator() {
109                            public void createFormSheetContent(FormSheet fs) {
110                                    fs.getButton(FormSheet.BTNID_OK).setAction(new Action() {
111                                            public void doAction(SaleProcess p, SalesPoint sp) {
112                                                    uig_change.setNextTransition(
113                                                            GateChangeTransition.CHANGE_TO_COMMIT_GATE);
114                                            }
115                                    });
116                            }
117                    });
118    
119                    uig_change.setFormSheet(fs);
120                    return uig_change;
121            }
122    
123            /**
124             * @return a <code>Transition</code> that calculates the money the user get back, temporary re-adds the handed
125             *              back videos to the {@link VideoShop}s stock and change to the
126             *              {@link SaleProcessHandBack#getChangeGate()}. If there is not enough change money in the shop, a
127             *              {@link DisplayMoneyStockError}opens and it returns the sale.SaleProcess#getRollbackGate()
128             *  
129             */
130            private Transition getCalculateSumTransition() {
131                    return new Transition() {
132                            public Gate perform(SaleProcess p, User u) {
133                                    if (ss_temp.size(getBasket()) == 0)
134                                            return getInitialGate();
135    
136                                    Iterator it = ss_temp.iterator(getBasket(), false);
137                                    while (it.hasNext()) {
138                                            StockItem ssi = (StockItem) it.next();
139                                            Value v = null;
140                                            v = ((QuoteValue) ssi.getAssociatedItem(null).getValue()).getOffer();
141                                            nv_sum =
142                                                    (NumberValue) nv_sum.add(
143                                                            v.subtract(((VideoCassette) ssi).getCost()));
144    
145                                            VideoShop.getVideoStock().add(ssi.getName(), 1, getBasket());
146                                    }
147                                    try{
148                                            VideoShop.getMoneyBag().transferMoney(mb_temp, getBasket(), nv_sum);
149                                    }catch(NotEnoughMoneyException e){
150                                            DisplayMoneyStockError dmse = new DisplayMoneyStockError();
151                                            return getRollbackGate();
152                                    }
153                                    
154                                    return getChangeGate();
155                            }
156                    };
157            }
158    }