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 Catalog source and a StoringStock destination. <i>Abstract</i> as creating StockItems is
012 * application dependant.
013 *
014 * @see #createStockItem
015 *
016 * @author Steffen Zschaler
017 * @version 2.0 20/08/1999
018 * @since v2.0
019 */
020 public abstract class CSSStrategy extends MoveStrategy {
021
022 /**
023 * Get the sub-process that will move items from the source to the destination.
024 *
025 * @param p the process into which the sub-process wil be embedded.
026 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
027 * @param cSource the source Catalog.
028 * @param ssDest the destination StoringStock.
029 * @param db the DataBasket relative to which to perform the operation.
030 * @param ci the CatalogItem that is selected in the source.
031 * @param ttfs the FormSheet that triggers the process.
032 *
033 * @override Never
034 */
035 public Transition getMoveToDestProcess(SaleProcess p, SalesPoint sp, Catalog cSource, StoringStock ssDest,
036 DataBasket db, CatalogItem ci, TwoTableFormSheet ttfs) {
037 return new GateChangeTransition(getCheckMoveToDestGate(p, sp, cSource, ssDest, db, ci, ttfs));
038 }
039
040 /**
041 * Get the first gate of the sub-process that will move items from the source to the destination.
042 *
043 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
044 * performs it.</p>
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 cSource the source Catalog.
049 * @param ssDest the destination StoringStock.
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 ttfs the FormSheet that triggers the process.
053 *
054 * @override Never Instead, override {@link #checkMoveToDest}, {@link #createStockItem} and/or
055 * {@link #moveToDest}.
056 */
057 protected Gate getCheckMoveToDestGate(SaleProcess p, final SalesPoint sp, final Catalog cSource,
058 final StoringStock ssDest, final DataBasket db, final CatalogItem ci,
059 final TwoTableFormSheet ttfs) {
060 return new Gate() {
061 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
062 int nCheckReturn = checkMoveToDest(p, sp, cSource, ssDest, db, ci);
063
064 if (nCheckReturn == 0) {
065 final StockItem si = createStockItem(p, sp, cSource, ssDest, db, ci);
066
067 if (si != null) {
068 return new Transition() {
069 public Gate perform(SaleProcess p, User u) {
070 moveToDest(p, sp, cSource, ssDest, db, si);
071
072 return ttfs.getGate();
073 }
074 };
075 }
076 } else {
077 error(p, nCheckReturn);
078 }
079
080 return new GateChangeTransition(ttfs.getGate());
081 }
082 };
083 }
084
085 /**
086 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value
087 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}.
088 *
089 * @param p the process into which the sub-process wil be embedded.
090 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
091 * @param cSource the source Catalog.
092 * @param ssDest the destination StoringStock.
093 * @param db the DataBasket relative to which to perform the operation.
094 * @param ci the CatalogItem that is selected in the source.
095 *
096 * @override Sometimes The default implementation returns 0.
097 */
098 protected int checkMoveToDest(SaleProcess p, SalesPoint sp, Catalog cSource, StoringStock ssDest,
099 DataBasket db, CatalogItem ci) throws InterruptedException {
100 return 0;
101 }
102
103 /**
104 * Create a fresh StockItem following the specifications given. You can assume that you are at a
105 * {@link Gate}.
106 *
107 * @param p the process into which the sub-process wil be embedded.
108 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
109 * @param cSource the source Catalog.
110 * @param ssDest the destination StoringStock.
111 * @param db the DataBasket relative to which to perform the operation.
112 * @param ci the CatalogItem that is selected in the source.
113 *
114 * @override Always This method is application dependant.
115 */
116 protected abstract StockItem createStockItem(SaleProcess p, SalesPoint sp, Catalog cSource,
117 StoringStock ssDest, DataBasket db, CatalogItem ci) throws InterruptedException;
118
119 /**
120 * Move the item as indicated into the destination Stock. You can assume that you are in a
121 * {@link Transition}.
122 *
123 * @param p the process into which the sub-process wil be embedded.
124 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
125 * @param cSource the source Catalog.
126 * @param ssDest the destination StoringStock.
127 * @param db the DataBasket relative to which to perform the operation.
128 * @param si the StockItem to be moved into the destination.
129 *
130 * @override Sometimes
131 */
132 protected void moveToDest(SaleProcess p, SalesPoint sp, Catalog cSource, StoringStock ssDest,
133 DataBasket db, StockItem si) {
134 ssDest.add(si, db);
135 }
136
137 /**
138 * Get the sub-process that will move items from the destination to the source.
139 *
140 * @param p the process into which the sub-process wil be embedded.
141 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
142 * @param cSource the source Catalog.
143 * @param ssDest the destination StoringStock.
144 * @param db the DataBasket relative to which to perform the operation.
145 * @param si the StockItem that is selected in the destination.
146 * @param ttfs the FormSheet that triggers the process.
147 *
148 * @override Never
149 */
150 public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, Catalog cSource,
151 StoringStock ssDest, DataBasket db, StockItem si, TwoTableFormSheet ttfs) {
152 return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, cSource, ssDest, db, si, ttfs));
153 }
154
155 /**
156 * Get the first gate of the sub-process that will move items from the destination to the source.
157 *
158 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
159 * performs it.</p>
160 *
161 * @param p the process into which the sub-process wil be embedded.
162 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
163 * @param cSource the source Catalog.
164 * @param ssDest the destination StoringStock.
165 * @param db the DataBasket relative to which to perform the operation.
166 * @param si the StockItem that is selected in the destination.
167 * @param ttfs the FormSheet that triggers the process.
168 *
169 * @override Never Instead, override {@link #checkMoveToSource} and/or {@link #moveToSource}.
170 */
171 protected Gate getCheckMoveToSourceGate(SaleProcess p, final SalesPoint sp, final Catalog cSource,
172 final StoringStock ssDest, final DataBasket db, final StockItem si, final TwoTableFormSheet ttfs) {
173 return new Gate() {
174 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
175 int nCheckReturn = checkMoveToSource(p, sp, cSource, ssDest, db, si);
176
177 if (nCheckReturn == 0) {
178 return new Transition() {
179 public Gate perform(SaleProcess p, User u) {
180 moveToSource(p, sp, cSource, ssDest, db, si);
181
182 return ttfs.getGate();
183 }
184 };
185 } else {
186 error(p, nCheckReturn);
187
188 return new GateChangeTransition(ttfs.getGate());
189 }
190 }
191 };
192 }
193
194 /**
195 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value
196 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}.
197 *
198 * @param p the process into which the sub-process wil be embedded.
199 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
200 * @param cSource the source Catalog.
201 * @param ssDest the destination StoringStock.
202 * @param db the DataBasket relative to which to perform the operation.
203 * @param si the StockItem that is selected in the destination.
204 *
205 * @override Sometimes The default implementation returns 0.
206 */
207 protected int checkMoveToSource(SaleProcess p, SalesPoint sp, Catalog cSource, StoringStock ssDest,
208 DataBasket db, StockItem si) throws InterruptedException {
209 return 0;
210 }
211
212 /**
213 * Move the indicated item as indicated from the destination Stock. You can assume that you are in a
214 * {@link Transition}.
215 *
216 * @param p the process into which the sub-process wil be embedded.
217 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
218 * @param cSource the source Catalog.
219 * @param ssDest the destination StoringStock.
220 * @param db the DataBasket relative to which to perform the operation.
221 * @param si the StockItem that is selected in the destination.
222 *
223 * @override Sometimes
224 */
225 protected void moveToSource(SaleProcess p, SalesPoint sp, Catalog cSource, StoringStock ssDest,
226 DataBasket db, StockItem si) {
227 try {
228 ssDest.remove(si, db);
229 }
230 catch (data.events.VetoException ve) {
231 error(p, REMOVE_VETO_EXCEPTION);
232 }
233 }
234 }