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