001 package data.stdforms.twotableformsheet;
002
003 import data.*;
004 import data.stdforms.*;
005
006 import sale.*;
007
008 import users.*;
009
010 /**
011 * MoveStrategy for a DataBasket 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 DBCSStrategy extends MoveStrategy {
018
019 /**
020 * Get the sub-process that will move items from the destination to the source.
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 dbSource the source DataBasket.
025 * @param csDest the destination CountingStock.
026 * @param ci the CatalogItem that is selected in the destination.
027 * @param nCount the number of items to be moved.
028 * @param ttfs the FormSheet that triggers the process.
029 *
030 * @override Never
031 */
032 public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, DataBasket dbSource,
033 CountingStock csDest, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) {
034 return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, dbSource, csDest, ci, nCount, ttfs));
035 }
036
037 /**
038 * Get the first gate of the sub-process that will move items from the destination to the source.
039 *
040 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
041 * performs it.</p>
042 *
043 * @param p the process into which the sub-process wil be embedded.
044 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
045 * @param dbSource the source DataBasket.
046 * @param csDest the destination CountingStock.
047 * @param ci the CatalogItem that is selected in the destination.
048 * @param nCount the number of items to be moved.
049 * @param ttfs the FormSheet that triggers the process.
050 *
051 * @override Never Instead, override {@link #checkMoveToSource} and/or {@link #moveToSource}.
052 */
053 protected Gate getCheckMoveToSourceGate(SaleProcess p, final SalesPoint sp, final DataBasket dbSource,
054 final CountingStock csDest, final CatalogItem ci, final int nCount, final TwoTableFormSheet ttfs) {
055 return new Gate() {
056 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
057 int nCheckResult = checkMoveToSource(p, sp, dbSource, csDest, ci, nCount);
058
059 if (nCheckResult == 0) {
060 return new Transition() {
061 public Gate perform(SaleProcess p, User u) {
062 moveToSource(p, sp, dbSource, csDest, ci, nCount);
063
064 return ttfs.getGate();
065 }
066 };
067 } else {
068 error(p, nCheckResult);
069
070 return new GateChangeTransition(ttfs.getGate());
071 }
072 }
073 };
074 }
075
076 /**
077 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value
078 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}.
079 *
080 * @param p the process into which the sub-process wil be embedded.
081 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
082 * @param dbSource the source DataBasket.
083 * @param csDest the destination CountingStock.
084 * @param ci the CatalogItem that is selected in the destination.
085 * @param nCount the number of items to be moved.
086 *
087 * @override Sometimes The default implementation returns 0.
088 */
089 protected int checkMoveToSource(SaleProcess p, SalesPoint sp, DataBasket dbSource, CountingStock csDest,
090 CatalogItem ci, int nCount) throws InterruptedException {
091 return 0;
092 }
093
094 /**
095 * Move the indicated number of items as indicated from the destination Stock. You can assume that you are
096 * in a {@link Transition}.
097 *
098 * @param p the process into which the sub-process wil be embedded.
099 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
100 * @param dbSource the source DataBasket.
101 * @param csDest the destination CountingStock.
102 * @param ci the CatalogItem that is selected in the destination.
103 * @param nCount the number of items to be moved.
104 *
105 * @override Sometimes
106 */
107 protected void moveToSource(SaleProcess p, SalesPoint sp, DataBasket dbSource, CountingStock csDest,
108 CatalogItem ci, int nCount) {
109 try {
110 csDest.remove(ci.getName(), nCount, dbSource);
111 }
112 catch (NotEnoughElementsException neee) {
113 error(p, NOT_ENOUGH_ELEMENTS_ERROR);
114 }
115 catch (data.events.VetoException ve) {
116 error(p, REMOVE_VETO_EXCEPTION);
117 }
118 }
119
120 /**
121 * Get the sub-process that will move items from the source to the destination.
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 dbSource the source DataBasket.
126 * @param csDest the destination CountingStock.
127 * @param dbe the DataBasketEntry that is selected in the source.
128 * @param nCount the number of items to be moved.
129 * @param ttfs the FormSheet that triggers the process.
130 *
131 * @override Never
132 */
133 public Transition getMoveToDestProcess(SaleProcess p, SalesPoint sp, DataBasket dbSource,
134 CountingStock csDest, DataBasketEntry dbe, int nCount, TwoTableFormSheet ttfs) {
135 return new GateChangeTransition(getCheckMoveToDestGate(p, sp, dbSource, csDest, dbe, nCount, ttfs));
136 }
137
138 /**
139 * Get the first gate of the sub-process that will move items from the source to the destination.
140 *
141 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that
142 * performs it.</p>
143 *
144 * @param p the process into which the sub-process wil be embedded.
145 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
146 * @param dbSource the source DataBasket.
147 * @param csDest the destination CountingStock.
148 * @param dbe the DataBasketEntry that is selected in the source.
149 * @param nCount the number of items to be moved.
150 * @param ttfs the FormSheet that triggers the process.
151 *
152 * @override Never Instead, override {@link #checkMoveToDest} and/or {@link #moveToDest}.
153 */
154 protected Gate getCheckMoveToDestGate(SaleProcess p, final SalesPoint sp, final DataBasket dbSource,
155 final CountingStock csDest, final DataBasketEntry dbe, final int nCount,
156 final TwoTableFormSheet ttfs) {
157 return new Gate() {
158 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException {
159 int nCheckResult = checkMoveToDest(p, sp, dbSource, csDest, dbe, nCount);
160
161 if (nCheckResult == 0) {
162 return new Transition() {
163 public Gate perform(SaleProcess p, User u) {
164 moveToDest(p, sp, dbSource, csDest, dbe, nCount);
165
166 return ttfs.getGate();
167 }
168 };
169 } else {
170 error(p, nCheckResult);
171
172 return new GateChangeTransition(ttfs.getGate());
173 }
174 }
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 dbSource the source DataBasket.
185 * @param csDest the destination CountingStock.
186 * @param dbe the DataBasketEntry that is selected in the source.
187 * @param nCount the number of items to be moved.
188 *
189 * @override Sometimes The default implementation returns
190 * {@link ProcessErrorCodes#NOT_ENOUGH_ELEMENTS_ERROR} if there are not enough elements in the
191 * DataBasketEntry.
192 */
193 protected int checkMoveToDest(SaleProcess p, SalesPoint sp, DataBasket dbSource, CountingStock csDest,
194 DataBasketEntry dbe, int nCount) {
195
196 if (nCount <= ((Number)dbe.getValue()).intValue()) {
197 return 0;
198 } else {
199 return NOT_ENOUGH_ELEMENTS_ERROR;
200 }
201 }
202
203 /**
204 * Move the indicated number of items as indicated into the destination Stock. You can assume that you are
205 * in a {@link Transition}.
206 *
207 * @param p the process into which the sub-process wil be embedded.
208 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed.
209 * @param dbSource the source DataBasket.
210 * @param csDest the destination CountingStock.
211 * @param dbe the DataBasketEntry that is selected in the source.
212 * @param nCount the number of items to be moved.
213 *
214 * @override Sometimes
215 */
216 protected void moveToDest(SaleProcess p, SalesPoint sp, DataBasket dbSource, CountingStock csDest,
217 DataBasketEntry dbe, int nCount) {
218 csDest.add(dbe.getSecondaryKey(), nCount, dbSource);
219 }
220 }