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