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