001    package data.stdforms.twotableformsheet;
002    
003    import sale.*;
004    
005    import data.*;
006    import data.stdforms.*;
007    
008    import users.*;
009    
010    /**
011     * MoveStrategy for a StoringStock source and destination.
012     *
013     * @author Steffen Zschaler
014     * @version 2.0 20/08/1999
015     * @since v2.0
016     */
017    public class SSSSStrategy extends MoveStrategy {
018    
019        /**
020             * ID for serialization.
021             */
022            private static final long serialVersionUID = 3240707067489768710L;
023    
024            /**
025         * Get the sub-process that will move items from the source to the destination.
026         *
027         * @param p the process into which the sub-process wil be embedded.
028         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
029         * @param ssSource the source StoringStock.
030         * @param ssDest the destination StoringStock.
031         * @param db the DataBasket relative to which to perform the operation.
032         * @param si the StockItem that is selected in the source.
033         * @param ttfs the FormSheet that triggers the process.
034         *
035         * @override Never
036         */
037        public Transition getMoveToDestProcess(SaleProcess p, SalesPoint sp, StoringStock ssSource,
038                StoringStock ssDest, DataBasket db, StockItem si, TwoTableFormSheet ttfs) {
039            return new GateChangeTransition(getCheckMoveToDestGate(p, sp, ssSource, ssDest, db, si, ttfs));
040        }
041    
042        /**
043         * Get the first gate of the sub-process that will move items from the source to the destination.
044         *
045         * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
046         * performs it.</p>
047         *
048         * @return {@link #getCheckMoveGate}.
049         *
050         * @param p the process into which the sub-process wil be embedded.
051         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
052         * @param ssSource the source StoringStock.
053         * @param ssDest the destination StoringStock.
054         * @param db the DataBasket relative to which to perform the operation.
055         * @param si the StockItem that is selected in the source.
056         * @param ttfs the FormSheet that triggers the process.
057         *
058         * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
059         */
060        protected Gate getCheckMoveToDestGate(SaleProcess p, SalesPoint sp, StoringStock ssSource,
061                StoringStock ssDest, DataBasket db, StockItem si, TwoTableFormSheet ttfs) {
062            return getCheckMoveGate(p, sp, ssSource, ssDest, db, si, ttfs);
063        }
064    
065        /**
066         * Get the sub-process that will move items from the destination to the source.
067         *
068         * @param p the process into which the sub-process wil be embedded.
069         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
070         * @param ssSource the source StoringStock.
071         * @param ssDest the destination StoringStock.
072         * @param db the DataBasket relative to which to perform the operation.
073         * @param si the StockItem that is selected in the destination.
074         * @param ttfs the FormSheet that triggers the process.
075         *
076         * @override Never
077         */
078        public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, StoringStock ssSource,
079                StoringStock ssDest, DataBasket db, StockItem si, TwoTableFormSheet ttfs) {
080            return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, ssSource, ssDest, db, si, ttfs));
081        }
082    
083        /**
084         * Get the first gate of the sub-process that will move items from the destination to the source.
085         *
086         * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
087         * performs it.</p>
088         *
089         * @return {@link #getCheckMoveGate}.
090         *
091         * @param p the process into which the sub-process wil be embedded.
092         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
093         * @param ssSource the source StoringStock.
094         * @param ssDest the destination StoringStock.
095         * @param db the DataBasket relative to which to perform the operation.
096         * @param si the StockItem that is selected in the destination.
097         * @param ttfs the FormSheet that triggers the process.
098         *
099         * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
100         */
101        protected Gate getCheckMoveToSourceGate(SaleProcess p, SalesPoint sp, StoringStock ssSource,
102                StoringStock ssDest, DataBasket db, StockItem si, TwoTableFormSheet ttfs) {
103            return getCheckMoveGate(p, sp, ssDest, ssSource, db, si, ttfs);
104        }
105    
106        /**
107         * Get the first gate of a sub-process that will move items from one Stock into another.
108         *
109         * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
110         * performs it.</p>
111         *
112         * @param p the process into which the sub-process wil be embedded.
113         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
114         * @param ssSource the source StoringStock.
115         * @param ssDest the destination StoringStock.
116         * @param db the DataBasket relative to which to perform the operation.
117         * @param si the StockItem which is to be moved from the source into the destination Stock.
118         * @param ttfs the FormSheet that triggers the process.
119         *
120         * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}.
121         */
122        protected Gate getCheckMoveGate(SaleProcess p, final SalesPoint sp, final StoringStock ssSource,
123                final StoringStock ssDest, final DataBasket db, final StockItem si, final TwoTableFormSheet ttfs) {
124            return new Gate() {
125                            private static final long serialVersionUID = 4828550322944653983L;
126    
127                            public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
128                    int nCheckReturn = checkMove(p, sp, ssSource, ssDest, db, si);
129    
130                    if (nCheckReturn == 0) {
131                        return new Transition() {
132                                                    private static final long serialVersionUID = -3257944253378108255L;
133    
134                                                    public Gate perform(SaleProcess p, User u) {
135                                moveImpl(p, sp, ssSource, ssDest, db, si);
136    
137                                return ttfs.getGate();
138                            }
139                        };
140                    } else {
141                        error(p, nCheckReturn);
142    
143                        return new GateChangeTransition(ttfs.getGate());
144                    }
145                }
146            };
147        }
148    
149        /**
150         * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value
151         * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}.
152         *
153         * @param p the process into which the sub-process wil be embedded.
154         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
155         * @param ssSource the source StoringStock.
156         * @param ssDest the destination StoringStock.
157         * @param db the DataBasket relative to which to perform the operation.
158         * @param si the StockItem which is to be moved.
159         *
160         * @override Sometimes The default implementation returns 0.
161         */
162        protected int checkMove(SaleProcess p, SalesPoint sp, StoringStock ssSource, StoringStock ssDest,
163                DataBasket db, StockItem si) throws InterruptedException {
164            return 0;
165        }
166    
167        /**
168         * Move the indicated item from the source StoringStock into the destination StoringStock. You
169         * can assume that you are in a {@link Transition}.
170         *
171         * @param p the process into which the sub-process wil be embedded.
172         * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
173         * @param ssSource the source StoringStock.
174         * @param ssDest the destination StoringStock.
175         * @param db the DataBasket relative to which to perform the operation.
176         * @param si the StockItem which is to be moved.
177         *
178         * @override Sometimes
179         */
180        protected void moveImpl(SaleProcess p, SalesPoint sp, StoringStock ssSource, StoringStock ssDest,
181                DataBasket db, StockItem si) {
182            try {
183                ssDest.add(ssSource.remove(si, db), db);
184            }
185            catch (data.events.VetoException ve) {
186                error(p, REMOVE_VETO_EXCEPTION);
187            }
188        }
189    }