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