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 CountingStock source and destination. 012 * 013 * @author Steffen Zschaler 014 * @version 2.0 20/08/1999 015 * @since v2.0 016 */ 017 public class CSCSStrategy extends MoveStrategy { 018 019 /** 020 * ID for serialization. 021 */ 022 private static final long serialVersionUID = 4656404208314215041L; 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 csSource the source CountingStock. 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, CountingStock csSource, 039 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 040 return new GateChangeTransition(getCheckMoveToDestGate(p, sp, csSource, 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 * @return {@link #getCheckMoveGate}. 050 * 051 * @param p the process into which the sub-process wil be embedded. 052 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 053 * @param csSource the source CountingStock. 054 * @param csDest the destination CountingStock. 055 * @param db the DataBasket relative to which to perform the operation. 056 * @param ci the CatalogItem that is selected in the source. 057 * @param nCount the number of items to be moved. 058 * @param ttfs the FormSheet that triggers the process. 059 * 060 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}. 061 */ 062 protected Gate getCheckMoveToDestGate(SaleProcess p, SalesPoint sp, CountingStock csSource, 063 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 064 return getCheckMoveGate(p, sp, csSource, csDest, db, ci, nCount, ttfs); 065 } 066 067 /** 068 * Get the sub-process that will move items from the destination to the source. 069 * 070 * @param p the process into which the sub-process wil be embedded. 071 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 072 * @param csSource the source CountingStock. 073 * @param csDest the destination CountingStock. 074 * @param db the DataBasket relative to which to perform the operation. 075 * @param ci the CatalogItem that is selected in the destination. 076 * @param nCount the number of items to be moved. 077 * @param ttfs the FormSheet that triggers the process. 078 * 079 * @override Never 080 */ 081 public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, CountingStock csSource, 082 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 083 return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, csSource, csDest, db, ci, nCount, 084 ttfs)); 085 } 086 087 /** 088 * Get the first gate of the sub-process that will move items from the destination to the source. 089 * 090 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that 091 * performs it.</p> 092 * 093 * @return {@link #getCheckMoveGate}. 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 csSource the source CountingStock. 098 * @param csDest the destination CountingStock. 099 * @param db the DataBasket relative to which to perform the operation. 100 * @param ci the CatalogItem that is selected in the destination. 101 * @param nCount the number of items to be moved. 102 * @param ttfs the FormSheet that triggers the process. 103 * 104 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}. 105 */ 106 protected Gate getCheckMoveToSourceGate(SaleProcess p, SalesPoint sp, CountingStock csSource, 107 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 108 return getCheckMoveGate(p, sp, csDest, csSource, db, ci, nCount, ttfs); 109 } 110 111 /** 112 * Get the first gate of a sub-process that will move items from one Stock into another. 113 * 114 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that 115 * performs it.</p> 116 * 117 * @param p the process into which the sub-process wil be embedded. 118 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 119 * @param csSource the source CountingStock. 120 * @param csDest the destination CountingStock. 121 * @param db the DataBasket relative to which to perform the operation. 122 * @param ci the CatalogItem for which items are to be moved from the source into the destination 123 * CountingStock. 124 * @param nCount the number of items to be moved. 125 * @param ttfs the FormSheet that triggers the process. 126 * 127 * @override Never Instead, override {@link #checkMove} and/or {@link #moveImpl}. 128 */ 129 protected Gate getCheckMoveGate(SaleProcess p, final SalesPoint sp, final CountingStock csSource, 130 final CountingStock csDest, final DataBasket db, final CatalogItem ci, final int nCount, 131 final TwoTableFormSheet ttfs) { 132 return new Gate() { 133 private static final long serialVersionUID = 876828637700838230L; 134 135 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException { 136 int nCheckReturn = checkMove(p, sp, csSource, csDest, db, ci, nCount); 137 138 if (nCheckReturn == 0) { 139 return new Transition() { 140 private static final long serialVersionUID = 7711998513390430176L; 141 142 public Gate perform(SaleProcess p, User u) { 143 moveImpl(p, sp, csSource, csDest, db, ci, nCount); 144 145 return ttfs.getGate(); 146 } 147 }; 148 } else { 149 error(p, nCheckReturn); 150 151 return new GateChangeTransition(ttfs.getGate()); 152 } 153 } 154 }; 155 } 156 157 /** 158 * Move the indicated number of items from the source CountingStock into the destination CountingStock. You 159 * can assume that you are in a {@link Transition}. 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 csSource the source CountingStock. 164 * @param csDest the destination CountingStock. 165 * @param db the DataBasket relative to which to perform the operation. 166 * @param ci the CatalogItem for which items are to be moved. 167 * @param nCount the number of items to be moved. 168 * 169 * @override Sometimes 170 */ 171 protected void moveImpl(SaleProcess p, SalesPoint sp, CountingStock csSource, CountingStock csDest, 172 DataBasket db, CatalogItem ci, int nCount) { 173 try { 174 String sKey = ci.getName(); 175 176 csSource.remove(sKey, nCount, db); 177 csDest.add(sKey, nCount, db); 178 } 179 catch (NotEnoughElementsException neee) { 180 error(p, NOT_ENOUGH_ELEMENTS_ERROR); 181 } 182 catch (data.events.VetoException ve) { 183 error(p, REMOVE_VETO_EXCEPTION); 184 } 185 } 186 187 /** 188 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value 189 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}. 190 * 191 * @param p the process into which the sub-process wil be embedded. 192 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 193 * @param csSource the source CountingStock. 194 * @param csDest the destination CountingStock. 195 * @param db the DataBasket relative to which to perform the operation. 196 * @param ci the CatalogItem for which items are to be moved. 197 * @param nCount the number of items to be moved. 198 * 199 * @override Sometimes The default implementation returns 0. 200 */ 201 protected int checkMove(SaleProcess p, SalesPoint sp, CountingStock csSource, CountingStock csDest, 202 DataBasket db, CatalogItem ci, int nCount) throws InterruptedException { 203 return 0; 204 } 205 }